summaryrefslogtreecommitdiffstats
path: root/srfi-228-test.scm
blob: f07695f81871376c15fb1e28046b3b0edbdaeec0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(cond-expand
  (chibi
   (import (chibi test)
           (scheme base)
           (srfi 1)
           (srfi 128)
           (only (srfi 132) list-sort))))

(define-record-type Person
    (make-person first-name last-name)
    person?
  (first-name person-first-name)
  (last-name person-last-name))

(define person-name-comparator
  (make-product-comparator
   (make-wrapper-comparator person? person-last-name string-ci-comparator)
   (make-wrapper-comparator person? person-first-name string-ci-comparator)))

(test-group "simple"
  (test-equal eq?
    #t
    (<? person-name-comparator
        (make-person "John" "Cowan")
        (make-person "Daphne" "Preston-Kendal")))

  (test-equal eq?
    #t
    (>? person-name-comparator
        (make-person "Tom" "Smith")
        (make-person "John" "Smith"))))

(define-record-type Book
    (make-book author title)
    book?
  (author book-author)
  (title book-title))

(define book-comparator
  (make-product-comparator
   (make-wrapper-comparator book? book-author person-name-comparator)
   (make-wrapper-comparator book? book-title string-ci-comparator)))

(define-record-type CD
    (make-cd artist title)
    cd?
  (artist cd-artist)
  (title cd-title))

(define cd-comparator
  (make-product-comparator
   (make-wrapper-comparator cd? cd-artist person-name-comparator)
   (make-wrapper-comparator cd? cd-title string-ci-comparator)))

(define item-comparator
  (make-sum-comparator book-comparator cd-comparator))

(test-group "nested"
  (let* ((beatles (make-person "The" "Beatles"))
         (abbey-road (make-cd beatles "Abbey Road"))
         (deutsche-grammatik
          (make-book (make-person "Jacob" "Grimm") "Deutsche Grammatik"))
         (sonnets (make-book (make-person "William" "Shakespeare") "Sonnets"))
         (mnd (make-book (make-person "William" "Shakespeare")
                         "A Midsummer Night’s Dream"))
         (bob (make-cd (make-person "Bob" "Dylan") "Blonde on Blonde"))
         (revolver (make-cd (make-person "The" "Beatles") "Revolver")))
  (test-equal
      equal?
    (list-sort
     (lambda (a b) (<? item-comparator a b))
     (list abbey-road
           deutsche-grammatik
           sonnets
           mnd
           bob
           revolver))
    (list deutsche-grammatik
          mnd
          sonnets
          abbey-road
          revolver
          bob))))