Author: yamakenz
Date: Sun Jul  1 11:40:09 2007
New Revision: 4646

Modified:
   sigscheme-trunk/test/test-srfi1-another.scm

Log:
* test/test-srfi1-another.scm
  - Add tests for fold, reduce, unfold, filter-map, filter, remove, find,
    delete, alist-delete


Modified: sigscheme-trunk/test/test-srfi1-another.scm
==============================================================================
--- sigscheme-trunk/test/test-srfi1-another.scm (original)
+++ sigscheme-trunk/test/test-srfi1-another.scm Sun Jul  1 11:40:09 2007
@@ -35,6 +35,7 @@
 (load "./test/unittest.scm")
 
 (use srfi-1)
+(use srfi-6)
 
 (if (not (provided? "srfi-1"))
     (test-skip "SRFI-1 is not enabled"))
@@ -927,16 +928,363 @@
 ;; Fold, unfold & map
 ;;
 
+;; fold
+(tn "fold invalid forms")
+(assert-error  (tn) (lambda () (fold cons)))
+(assert-error  (tn) (lambda () (fold cons '())))
+(assert-error  (tn) (lambda () (fold cons '#())))
+(assert-error  (tn) (lambda () (fold cons '(1) '#(2))))
+(assert-error  (tn) (lambda () (fold #\a '())))
+(tn "fold single list")
+(assert-equal? (tn) '()      (fold cons '() '()))
+(assert-equal? (tn) '(1)     (fold cons '() '(1)))
+(assert-equal? (tn) '(2 1)   (fold cons '() '(1 2)))
+(assert-equal? (tn) '(3 2 1) (fold cons '() '(1 2 3)))
+(tn "fold 3 lists")
+(assert-equal? (tn)
+               "cCzbByaAxNIL"
+               (fold string-append
+                     "NIL"
+                     '("a" "b" "c") '("A" "B" "C") '("x" "y" "z")))
+;; unequal length
+(assert-equal? (tn)
+               "bByaAxNIL"
+               (fold string-append
+                     "NIL"
+                     '("a" "b" "c") '("A" "B") '("x" "y" "z")))
+(assert-equal? (tn)
+               "NIL"
+               (fold string-append
+                     "NIL"
+                     '("a" "b" "c") '() '("x" "y" "z")))
+(tn "fold SRFI-1 examples")
+;; Add up the elements of list.
+(assert-equal? (tn) 15 (fold + 0 '(1 2 3 4 5)))
+;; Reverse LST.
+(assert-equal? (tn)
+               (list elm9 elm8 elm7 elm6 elm5 elm4 elm3 elm2 elm1 elm0)
+               (fold cons '() lst))
+;; See APPEND-REVERSE.
+(assert-equal? (tn)
+               '(10 9 8 1 2 3)
+               (let ((tail '(1 2 3))
+                     (rev-head '(8 9 10)))
+                 (fold cons tail rev-head)))
+;; How many symbols in list?
+(assert-equal? (tn)
+               0
+               (fold (lambda (x count) (if (symbol? x) (+ count 1) count))
+                     0
+                     lst))
+(assert-equal? (tn)
+               3
+               (fold (lambda (x count) (if (symbol? x) (+ count 1) count))
+                     0
+                     '(0 #\a a "a" b (0) c)))
+;; Length of the longest string in list:
+(assert-equal? (tn)
+               17
+               (fold (lambda (s max-len) (max max-len (string-length s)))
+                     0
+                     '("" "string-append" "str" "SigScheme Project" "SRFI-1")))
+;; unequal length lists
+(assert-equal? (tn)
+               '(c 3 b 2 a 1)
+               (fold cons* '() '(a b c) '(1 2 3 4 5)))
+
+;; reduce
+(tn "reduce invalid forms")
+(assert-error  (tn) (lambda () (reduce cons)))
+(assert-error  (tn) (lambda () (reduce cons '())))
+(assert-error  (tn) (lambda () (reduce cons '#())))
+(assert-error  (tn) (lambda () (reduce cons '() '#(2))))
+(assert-error  (tn) (lambda () (reduce #\a '())))
+(tn "reduce")
+(assert-equal? (tn) 0        (reduce + 0 '()))
+(assert-equal? (tn) 1        (reduce + 0 '(1)))
+(assert-equal? (tn) 3        (reduce + 0 '(1 2)))
+(assert-equal? (tn) 6        (reduce + 0 '(1 2 3)))
+(assert-equal? (tn) ""       (reduce string-append "" '()))
+(assert-equal? (tn) "a"      (reduce string-append "" '("a")))
+(assert-equal? (tn) "ba"     (reduce string-append "" '("a" "b")))
+(assert-equal? (tn) "cba"    (reduce string-append "" '("a" "b" "c")))
+(assert-equal? (tn) '()      (reduce cons '() '()))
+(assert-equal? (tn) '(1)     (reduce cons '() '(() 1)))
+(assert-equal? (tn) '(2 1)   (reduce cons '() '(() 1 2)))
+(assert-equal? (tn) '(3 2 1) (reduce cons '() '(() 1 2 3)))
+(tn "reduce SRFI-1 examples")
+;; Take the max of a list of non-negative integers.
+(assert-equal? (tn) 43       (reduce max 0 '(0 7 8 8 43 -4)))
+
+;; unfold
+(tn "unfold invalid forms")
+(assert-error  (tn) (lambda () (unfold #\c  car cdr '(1 2 3))))
+(assert-error  (tn) (lambda () (unfold cons #\a cdr '(1 2 3))))
+(assert-error  (tn) (lambda () (unfold cons car #\d '(1 2 3))))
+(assert-error  (tn) (lambda () (unfold cons car cdr '#(1 2 3))))
+(assert-error  (tn) (lambda () (unfold cons car cdr '(1 2 3) '())))
+(assert-error  (tn) (lambda () (unfold cons car cdr '(1 2 3) values '())))
+(tn "unfold")
+(assert-equal? (tn) '()            (unfold null?     car cdr '()))
+(assert-error  (tn) (lambda ()     (unfold null?     car cdr 1)))
+(assert-equal? (tn) '()            (unfold not-pair? car cdr 1))
+(assert-equal? (tn) 1              (unfold not-pair? car cdr 1 values))
+(assert-equal? (tn) '(1 2 3 4)     (unfold null?     car cdr '(1 2 3 4)))
+(assert-error  (tn) (lambda ()     (unfold null?     car cdr '(1 2 3 4 . 5))))
+(assert-equal? (tn) '(1 2 3 4)     (unfold not-pair? car cdr '(1 2 3 4 . 5)))
+(assert-equal? (tn) '(1 2 3 4 . 5) (unfold not-pair? car cdr '(1 2 3 4 . 5) 
values))
+(tn "unfold SRFI-1 examples")
+;; List of squares: 1^2 ... 10^2
+(assert-equal? (tn)
+               '(1 4 9 16 25 36 49 64 81 100)
+               (unfold (lambda (x) (> x 10))
+                       (lambda (x) (* x x))
+                       (lambda (x) (+ x 1))
+                       1))
+;; Copy a proper list.
+(assert-true   (tn) (equal? lst (unfold null-list? car cdr lst)))
+(assert-false  (tn) (eq?    lst (unfold null-list? car cdr lst)))
+;; Read current input port into a list of values.
+(assert-equal? (tn)
+               '((equal? lst (unfold null-list? car cdr lst)))
+               (let ((p (open-input-string
+                         "(equal? lst (unfold null-list? car cdr lst))")))
+                 (unfold eof-object? values (lambda (x) (read p)) (read p))))
+;; Copy a possibly non-proper list:
+(assert-true   (tn) (equal? lst (unfold not-pair? car cdr lst values)))
+(assert-false  (tn) (eq?    lst (unfold not-pair? car cdr lst values)))
+(let ((dlst (cons elm0 (cons elm1 (cons elm2 elm3)))))
+  (assert-true   (tn) (equal? dlst (unfold not-pair? car cdr dlst values)))
+  (assert-false  (tn) (eq?    dlst (unfold not-pair? car cdr dlst values))))
+;; Append HEAD onto TAIL:
+(assert-equal? (tn)
+               '(1 2 3 4 5 6)
+               (let ((head '(1 2 3))
+                     (tail '(4 5 6)))
+                 (unfold null-list? car cdr head 
+                         (lambda (x) tail))))
+
+;; filter-map
+(tn "filter-map invalid forms")
+(assert-error  (tn) (lambda () (filter-map even?)))
+(assert-error  (tn) (lambda () (filter-map #\a '())))
+(assert-error  (tn) (lambda () (filter-map + '#(1))))
+(assert-error  (tn) (lambda () (filter-map + '(1) '#(2))))
+(tn "filter-map single list")
+(assert-equal? (tn) '()        (filter-map even? '()))
+(assert-equal? (tn) '(2 -8 12) (filter-map (lambda (x)
+                                             (and (even? x)
+                                                  x))
+                                           '(2 7 3 -8 5 -3 9 12)))
+(assert-equal? (tn) '()        (filter-map pair?
+                                           '(2 7 3 -8 5 -3 9 12)))
+(tn "filter-map 3 lists")
+(assert-equal? (tn)
+               '(112 320 72 27)
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '(2 8 7 3 5 -3 9)
+                           '(6 -2 38 -2 8 4 3)
+                           '(-1 -7 -5 2 8 -6 1)))
+(tn "filter-map 3 lists unequal length")
+(assert-equal? (tn)
+               '(112 320)
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '(2 8 7 3 5 -3 9)
+                           '(6 -2 38 -2 8)
+                           '(-1 -7 -5 2 8 -6)))
+(assert-equal? (tn)
+               '()
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '()
+                           '(6 -2 38 -2 8)
+                           '(-1 -7 -5 2 8 -6)))
+(assert-equal? (tn)
+               '()
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '(2 8 7 3 5 -3 9)
+                           '()
+                           '(-1 -7 -5 2 8 -6)))
+(assert-equal? (tn)
+               '()
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '(2 8 7 3 5 -3 9)
+                           '(6 -2 38 -2 8)
+                           '()))
+(tn "filter-map 3 lists unequal length with circular list")
+;; SRFI-1: At least one of the list arguments must be finite.
+(assert-equal? (tn)
+               '(24 40 36)
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '(2 8 7 3 5 -3 9)
+                           clst4
+                           '(-1 -7 -5 2 8 -6)))
+(assert-equal? (tn)
+               '()
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '()
+                           clst4
+                           '(-1 -7 -5 2 8 -6)))
+(assert-equal? (tn)
+               '()
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '(2 8 7 3 5 -3 9)
+                           '()
+                           clst4))
+(assert-equal? (tn)
+               '()
+               (filter-map (lambda args
+                             (let ((res (apply * args)))
+                               (and (positive? res)
+                                    res)))
+                           '(2 8 7 3 5 -3 9)
+                           clst4
+                           '()))
+(tn "filter-map SRFI-1 examples")
+(assert-equal? (tn)
+               '(1 9 49)
+               (filter-map (lambda (x)
+                             (and (number? x)
+                                  (* x x)))
+                           '(a 1 b 3 c 7)))
+
 
 ;;
 ;; Filtering & partitioning
 ;;
 
+;; filter
+(tn "filter invalid forms")
+(assert-error  (tn) (lambda ()     (filter #\a     '(1 2))))
+(assert-error  (tn) (lambda ()     (filter cons    '(1 2))))
+(assert-error  (tn) (lambda ()     (filter cons    '(1 2) '(3 4))))
+(assert-error  (tn) (lambda ()     (filter even?   '(1 2) '(3 4))))
+(tn "filter")
+(assert-equal? (tn) '()            (filter even?   '()))
+(assert-equal? (tn) '(2 4 6)       (filter even?   '(1 2 3 4 5 6)))
+(assert-equal? (tn) '(1 3 5)       (filter odd?    '(1 2 3 4 5 6)))
+(assert-equal? (tn) '(1 2 3 4 5 6) (filter number? '(1 2 3 4 5 6)))
+(assert-equal? (tn) '()            (filter pair?   '(1 2 3 4 5 6)))
+(tn "filter SRFI-1 examples")
+(assert-equal? (tn) '(0 8 8 -4)    (filter even? '(0 7 8 8 43 -4)))
+
+;; remove
+(tn "remove invalid forms")
+(assert-error  (tn) (lambda ()       (remove #\a     '(1 2))))
+(assert-error  (tn) (lambda ()       (remove cons    '(1 2))))
+(assert-error  (tn) (lambda ()       (remove cons    '(1 2) '(3 4))))
+(assert-error  (tn) (lambda ()       (remove even?   '(1 2) '(3 4))))
+(tn "remove")
+(assert-equal? (tn) '()              (remove even?   '()))
+(assert-equal? (tn) '(0 8 8 -4)      (remove odd?    '(0 7 8 8 43 -4)))
+(assert-equal? (tn) '()              (remove number? '(0 7 8 8 43 -4)))
+(assert-equal? (tn) '(0 7 8 8 43 -4) (remove pair?   '(0 7 8 8 43 -4)))
+(tn "remove SRFI-1 examples")
+(assert-equal? (tn) '(7 43)          (remove even?   '(0 7 8 8 43 -4)))
+
 
 ;;
 ;; Searching
 ;;
 
+;; find
+(tn "find invalid forms")
+(assert-error  (tn) (lambda ()   (find even? '#(1 2))))
+(assert-error  (tn) (lambda ()   (find 1 '(1 2))))
+(tn "find proper list")
+(assert-false  (tn)      (find even?                     '()))
+(assert-false  (tn)      (find (lambda (x) #f)           lst))
+(assert-eq?    (tn) elm0 (find (lambda (x) (eq? x elm0)) lst))
+(assert-eq?    (tn) elm1 (find (lambda (x) (eq? x elm1)) lst))
+(assert-eq?    (tn) elm2 (find (lambda (x) (eq? x elm2)) lst))
+(assert-eq?    (tn) elm8 (find (lambda (x) (eq? x elm8)) lst))
+(assert-eq?    (tn) elm9 (find (lambda (x) (eq? x elm9)) lst))
+(tn "find dotted list")
+(assert-error  (tn) (lambda ()   (find even? 1)))
+(assert-equal? (tn) 1            (find (lambda (x) (= x 1)) '(1 . 2)))
+(assert-equal? (tn) 2            (find (lambda (x) (= x 2)) '(1 2 . 3)))
+(assert-equal? (tn) 3            (find (lambda (x) (= x 3)) '(1 2 3 . 4)))
+(assert-error  (tn) (lambda ()   (find even? '(1 . 2))))
+(assert-equal? (tn) 2            (find even? '(1 2 . 3)))
+(assert-equal? (tn) 2            (find even? '(1 2 3 . 4)))
+(assert-equal? (tn) 1            (find odd?  '(1 . 2)))
+(assert-equal? (tn) 1            (find odd?  '(1 2 . 3)))
+(assert-equal? (tn) 1            (find odd?  '(1 2 3 . 4)))
+(tn "find circular list")
+;; Rotates the circular list as like as find-tail.
+(assert-eq?    (tn) 1 (find (lambda (x) (= x 1)) clst4))
+(assert-eq?    (tn) 2 (find (lambda (x) (= x 2)) clst4))
+(assert-eq?    (tn) 3 (find (lambda (x) (= x 3)) clst4))
+(assert-eq?    (tn) 4 (find (lambda (x) (= x 4)) clst4))
+(assert-eq?    (tn)
+               1
+               (let ((cnt 2))
+                 (find (lambda (x)
+                              (if (= x 1)
+                                  (set! cnt (- cnt 1)))
+                              (and (zero? cnt)
+                                   (= x 1)))
+                            clst4)))
+(assert-eq?    (tn)
+               2
+               (let ((cnt 2))
+                 (find (lambda (x)
+                              (if (= x 1)
+                                  (set! cnt (- cnt 1)))
+                              (and (zero? cnt)
+                                   (= x 2)))
+                            clst4)))
+(assert-eq?    (tn)
+               3
+               (let ((cnt 2))
+                 (find (lambda (x)
+                              (if (= x 1)
+                                  (set! cnt (- cnt 1)))
+                              (and (zero? cnt)
+                                   (= x 3)))
+                            clst4)))
+(assert-eq?    (tn)
+               1
+               (let ((cnt 3))
+                 (find (lambda (x)
+                              (if (= x 1)
+                                  (set! cnt (- cnt 1)))
+                              (and (zero? cnt)
+                                   (= x 1)))
+                            clst4)))
+(assert-eq?    (tn)
+               1
+               (let ((cnt 4))
+                 (find (lambda (x)
+                              (if (= x 1)
+                                  (set! cnt (- cnt 1)))
+                              (and (zero? cnt)
+                                   (= x 1)))
+                            clst4)))
+
 ;; find-tail
 (tn "find-tail invalid forms")
 (assert-error  (tn) (lambda ()   (find-tail even? '#(1 2))))
@@ -1024,10 +1372,73 @@
 ;; Deleting
 ;;
 
+;; delete
+(tn "delete invalid forms")
+(assert-error  (tn) (lambda ()       (delete 1)))
+(assert-error  (tn) (lambda ()       (delete 1 '#(1))))
+(assert-error  (tn) (lambda ()       (delete 1 '(1) #\a)))
+(assert-error  (tn) (lambda ()       (delete 1 '(1) = '())))
+(tn "delete")
+(assert-equal? (tn) '()              (delete 1    '()))
+(assert-equal? (tn) '()              (delete 1    '() eq?))
+(assert-equal? (tn) '()              (delete 1    '() equal?))
+(assert-equal? (tn) (list cdr0 cdr2) (delete cdr1 (list cdr0 cdr1 cdr2)))
+(assert-equal? (tn) (list cdr0 cdr2) (delete cdr1 (list cdr0 cdr1 cdr2) eq?))
+(assert-equal? (tn) (list cdr0 cdr2) (delete cdr1 (list cdr0 cdr1 cdr2) 
equal?))
+(assert-equal? (tn) (list cdr0 cdr2)      (delete (list-copy cdr1)
+                                                  (list cdr0 cdr1 cdr2)))
+(assert-equal? (tn) (list cdr0 cdr1 cdr2) (delete (list-copy cdr1)
+                                                  (list cdr0 cdr1 cdr2) eq?))
+(assert-equal? (tn) (list cdr0 cdr2)      (delete (list-copy cdr1)
+                                                  (list cdr0 cdr1 cdr2) 
equal?))
+(tn "delete SRFI-1 examples")
+(assert-equal? (tn) '(0 -4)          (delete 5 '(0 7 8 8 43 -4) <))
+
 
 ;;
 ;; Association lists
 ;;
+
+;; alist-delete
+(define alist-s '(("b" . 2) ("a" . 1) ("d" . 4) ("b" . 5) ("c" . 3)))
+(define alist-n '((1 . a) (5 . e) (6 . f) (2 . b) (4 . d) (3 . c)
+                  (4 . d) (3 . c) (7 . g) (6 . f) (5 . e) (7 . g)))
+(tn "alist-delete invalid forms")
+(assert-error  (tn) (lambda () (alist-delete "A" '#())))
+(assert-error  (tn) (lambda () (alist-delete "A" '(("a" . 1)) #\a)))
+(assert-error  (tn) (lambda () (alist-delete #\a '(("a" . 1)) string=?)))
+(tn "alist-delete")
+(assert-equal? (tn) '() (alist-delete "A" '()))
+(assert-equal? (tn) '() (alist-delete "A" '() string=?))
+(assert-equal? (tn)
+               '(("b" . 2) ("a" . 1) ("d" . 4) ("b" . 5) ("c" . 3))
+               (alist-delete "A" alist-s))
+(assert-equal? (tn)
+               '(("b" . 2) ("d" . 4) ("b" . 5) ("c" . 3))
+               (alist-delete "a" alist-s))
+(assert-equal? (tn)
+               '(("a" . 1) ("d" . 4) ("c" . 3))
+               (alist-delete "b" alist-s))
+(assert-equal? (tn)
+               '(("a" . 1) ("d" . 4) ("c" . 3))
+               (alist-delete "b" alist-s string=?))
+(assert-equal? (tn)
+               '((1 . a) (5 . e) (6 . f) (2 . b) (4 . d) (3 . c)
+                 (4 . d) (3 . c) (7 . g) (6 . f) (5 . e) (7 . g))
+               (alist-delete -1 alist-n))
+(assert-equal? (tn)
+               '((1 . a) (5 . e) (2 . b) (4 . d) (3 . c)
+                 (4 . d) (3 . c) (7 . g) (5 . e) (7 . g))
+               (alist-delete 6 alist-n))
+(assert-equal? (tn)
+               '((1 . a) (5 . e) (2 . b) (4 . d) (3 . c)
+                 (4 . d) (3 . c) (7 . g) (5 . e) (7 . g))
+               (alist-delete 6 alist-n =))
+(tn "alist-delete SRFI-1 examples")
+(assert-equal? (tn)
+               '((1 . a) (5 . e) (2 . b) (4 . d) (3 . c)
+                 (4 . d) (3 . c) (5 . e))
+               (alist-delete 5 alist-n <))
 
 
 ;;

Reply via email to