Author: yamakenz
Date: Mon Jul 2 03:09:47 2007
New Revision: 4647
Modified:
sigscheme-trunk/test/test-srfi1-another.scm
Log:
* test/test-srfi1-another.scm
- Add tests for append!, concatenate, concatenate!, append-reverse,
append-reverse!, zip, append-map, append-map!, any, every, list-index,
member, delete!, assoc, alist-cons, alist-copy, 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 Mon Jul 2 03:09:47 2007
@@ -53,16 +53,16 @@
(my-list-tail (cdr x) (- k 1)))))
;; unique objects
-(define elm0 (list #t))
-(define elm1 (list #t))
-(define elm2 (list #t))
-(define elm3 (list #t))
-(define elm4 (list #t))
-(define elm5 (list #t))
-(define elm6 (list #t))
-(define elm7 (list #t))
-(define elm8 (list #t))
-(define elm9 (list #t))
+(define elm0 (list 0))
+(define elm1 (list 1))
+(define elm2 (list 2))
+(define elm3 (list 3))
+(define elm4 (list 4))
+(define elm5 (list 5))
+(define elm6 (list 6))
+(define elm7 (list 7))
+(define elm8 (list 8))
+(define elm9 (list 9))
;; sublists
(define cdr9 (cons elm9 '()))
(define cdr8 (cons elm8 cdr9))
@@ -865,6 +865,13 @@
(assert-equal? (tn) '(3 . d) (drop '(1 2 3 . d) 2))
(assert-equal? (tn) 'd (drop '(1 2 3 . d) 3))
+;; take-right
+;; drop-right
+;; take!
+;; drop-right!
+;; split-at
+;; split-at!
+
;; last
;;
;; SRFI-1: last returns the last element of the non-empty, finite list pair.
@@ -923,6 +930,151 @@
(assert-eq? (tn) #f (length+ clst3))
(assert-eq? (tn) #f (length+ clst4))
+;; append!
+(tn "append!")
+(assert-equal? (tn) '() (append!))
+(assert-equal? (tn) '() (append! '()))
+(assert-equal? (tn) '() (append! '() '()))
+(assert-equal? (tn) '() (append! '() '() '()))
+(assert-equal? (tn) '(a) (append! (list 'a) '() '()))
+(assert-equal? (tn) '(a) (append! '() (list 'a) '()))
+(assert-equal? (tn) '(a) (append! '() '() '(a)))
+(assert-equal? (tn) 'a (append! 'a))
+(assert-equal? (tn) '(a . b) (append! '(a . b)))
+(assert-equal? (tn) '(a . b) (append! '() '() '(a . b)))
+(assert-equal? (tn) '(1 2 3 a . b) (append! (list 1) (list 2 3) '(a . b)))
+(assert-equal? (tn) 7 (append! (+ 3 4)))
+(assert-equal? (tn) '(+ 3 4) (append! '(+ 3 4)))
+(assert-equal? (tn) '(a b) (append! '(a b)))
+(assert-equal? (tn) '(c d e a b) (append! (list 'c) (list 'd 'e) '(a b)))
+;; The reference implementation does not cause error on non-tail dotted list.
+;;(assert-error (tn) (lambda () (append! 'a 'b)))
+;;(assert-error (tn) (lambda () (append! 'a '(b))))
+;;(assert-error (tn) (lambda () (append! 'a '())))
+;;(assert-error (tn) (lambda () (append! (cons 'a 'b) '())))
+;;(assert-error (tn) (lambda () (append! '() (cons 'a 'b) '())))
+(tn "append! shared tail")
+;; SRFI-1: The last argument is never altered; the result list shares structure
+;; with this parameter.
+(assert-equal? (tn)
+ (list 1 2 3 elm8 elm9)
+ (append! (list 1) (list 2 3) cdr8))
+(assert-eq? (tn)
+ cdr8
+ (my-list-tail (append! (list 1) (list 2 3) cdr8) 3))
+
+;; concatenate
+(tn "concatenate invalid forms")
+(assert-error (tn) (lambda () (concatenate)))
+(assert-error (tn) (lambda () (concatenate #t)))
+(tn "concatenate")
+(assert-equal? (tn) '() (concatenate '()))
+(assert-equal? (tn) '() (concatenate '(())))
+(assert-equal? (tn) '() (concatenate '(() ())))
+(assert-equal? (tn) '() (concatenate '(() () ())))
+(assert-equal? (tn) '(a) (concatenate '((a) () ())))
+(assert-equal? (tn) '(a) (concatenate '(() (a) ())))
+(assert-equal? (tn) '(a) (concatenate '(() () (a))))
+(assert-equal? (tn) 'a (concatenate '(a)))
+(assert-equal? (tn) '(a . b) (concatenate '((a . b))))
+(assert-equal? (tn) '(a . b) (concatenate '(() () (a . b))))
+(assert-equal? (tn) '(1 2 3 a . b) (concatenate '((1) (2 3) (a . b))))
+(assert-equal? (tn) 7 (concatenate (list (+ 3 4))))
+(assert-equal? (tn) '(+ 3 4) (concatenate '((+ 3 4))))
+(assert-equal? (tn) '(a b) (concatenate '((a b))))
+(assert-equal? (tn) '(c d e a b) (concatenate '((c) (d e) (a b))))
+
+;; concatenate!
+(tn "concatenate! invalid forms")
+(assert-error (tn) (lambda () (concatenate!)))
+(assert-error (tn) (lambda () (concatenate! #t)))
+(tn "concatenate!")
+(assert-equal? (tn) '() (concatenate! '()))
+(assert-equal? (tn) '() (concatenate! (list '())))
+(assert-equal? (tn) '() (concatenate! (list '() '())))
+(assert-equal? (tn) '() (concatenate! (list '() '() '())))
+(assert-equal? (tn) '(a) (concatenate! (list (list 'a) '() '())))
+(assert-equal? (tn) '(a) (concatenate! (list '() (list 'a) '())))
+(assert-equal? (tn) '(a) (concatenate! (list '() '() '(a))))
+(assert-equal? (tn) 'a (concatenate! '(a)))
+(assert-equal? (tn) '(a . b) (concatenate! '((a . b))))
+(assert-equal? (tn) '(a . b) (concatenate! (list '() '() '(a . b))))
+(assert-equal? (tn) '(1 2 3 a . b) (concatenate! (list (list 1) (list 2 3) '(a
. b))))
+(assert-equal? (tn) 7 (concatenate! (list (+ 3 4))))
+(assert-equal? (tn) '(+ 3 4) (concatenate! '((+ 3 4))))
+(assert-equal? (tn) '(a b) (concatenate! '((a b))))
+(assert-equal? (tn) '(c d e a b) (concatenate! (list (list 'c) (list 'd 'e)
'(a b))))
+
+;; reverse!
+
+;;append-reverse
+(tn "append-reverse invalid forms")
+(assert-error (tn) (lambda () (append-reverse #t '())))
+(tn "append-reverse")
+(assert-equal? (tn) '() (append-reverse '() '()))
+(assert-equal? (tn) '(3 2 1) (append-reverse '(1 2 3) '()))
+(assert-equal? (tn) '(3 2 1 4 5 6) (append-reverse '(1 2 3) '(4 5 6)))
+(assert-equal? (tn) '(4 5 6) (append-reverse '() '(4 5 6)))
+(assert-equal? (tn) '(3 2 1 . #t) (append-reverse '(1 2 3) #t))
+(assert-equal? (tn) #t (append-reverse '() #t))
+
+;; append-reverse!
+;;
+;; SRFI-1: it is allowed, but not required, to alter rev-head's cons cells to
+;; construct the result.
+(tn "append-reverse! invalid forms")
+(assert-error (tn) (lambda () (append-reverse! #t '())))
+(tn "append-reverse!")
+(assert-equal? (tn) '() (append-reverse! '() '()))
+(assert-equal? (tn) '(3 2 1) (append-reverse! (list 1 2 3) '()))
+(assert-equal? (tn) '(3 2 1 4 5 6) (append-reverse! (list 1 2 3) '(4 5 6)))
+(assert-equal? (tn) '(4 5 6) (append-reverse! '() '(4 5 6)))
+(assert-equal? (tn) '(3 2 1 . #t) (append-reverse! (list 1 2 3) #t))
+(assert-equal? (tn) #t (append-reverse! '() #t))
+
+;; zip
+(tn "zip invalid forms")
+(assert-error (tn) (lambda () (zip)))
+(tn "zip single list")
+(assert-equal? (tn) '() (zip '()))
+(assert-equal? (tn) '((1)) (zip '(1)))
+(assert-equal? (tn) '((1) (2)) (zip '(1 2)))
+(assert-equal? (tn) '((1) (2) (3)) (zip '(1 2 3)))
+(tn "zip 3 lists")
+(assert-equal? (tn) '() (zip '() '() '()))
+(assert-equal? (tn) '((1 4 7)) (zip '(1) '(4) '(7)))
+(assert-equal? (tn) '((1 4 7) (2 5 8)) (zip '(1 2) '(4 5) '(7 8)))
+(assert-equal? (tn) '((1 4 7) (2 5 8) (3 6 9)) (zip '(1 2 3) '(4 5 6) '(7 8
9)))
+(tn "zip 3 lists unequal length")
+(assert-equal? (tn) '() (zip '() '(4) '(7)))
+(assert-equal? (tn) '() (zip '(1) '() '(7)))
+(assert-equal? (tn) '() (zip '(1) '(4) '()))
+(assert-equal? (tn) '((1 4 7)) (zip '(1) '(4 5) '(7 8)))
+(assert-equal? (tn) '((1 4 7)) (zip '(1 2) '(4) '(7 8)))
+(assert-equal? (tn) '((1 4 7)) (zip '(1 2) '(4 5) '(7)))
+(assert-equal? (tn) '((1 4 7) (2 5 8)) (zip '(1 2) '(4 5 6) '(7 8 9)))
+(assert-equal? (tn) '((1 4 7) (2 5 8)) (zip '(1 2 3) '(4 5) '(7 8 9)))
+(assert-equal? (tn) '((1 4 7) (2 5 8)) (zip '(1 2 3) '(4 5 6) '(7 8)))
+(tn "zip SRFI-1 examples")
+(assert-equal? (tn)
+ '((one 1 odd) (two 2 even) (three 3 odd))
+ (zip '(one two three)
+ '(1 2 3)
+ '(odd even odd even odd even odd even)))
+(assert-equal? (tn)
+ '((1) (2) (3))
+ (zip '(1 2 3)))
+;; SRFI-1: At least one of the argument lists must be finite.
+(assert-equal? (tn)
+ '((3 #f) (1 #t) (4 #f) (1 #t))
+ (zip '(3 1 4 1) (circular-list #f #t)))
+
+;; unzip1
+;; unzip2
+;; unzip3
+;; unzip4
+;; unzip5
+;; count
;;
;; Fold, unfold & map
@@ -992,6 +1144,10 @@
'(c 3 b 2 a 1)
(fold cons* '() '(a b c) '(1 2 3 4 5)))
+;; fold-right
+;; pair-fold
+;; pair-fold-right
+
;; reduce
(tn "reduce invalid forms")
(assert-error (tn) (lambda () (reduce cons)))
@@ -1016,6 +1172,8 @@
;; Take the max of a list of non-negative integers.
(assert-equal? (tn) 43 (reduce max 0 '(0 7 8 8 43 -4)))
+;; reduce-right
+
;; unfold
(tn "unfold invalid forms")
(assert-error (tn) (lambda () (unfold #\c car cdr '(1 2 3))))
@@ -1064,6 +1222,131 @@
(unfold null-list? car cdr head
(lambda (x) tail))))
+;; unfold-right
+;; map
+;; for-each
+
+;; append-map
+(tn "append-map invalid forms")
+(assert-error (tn) (lambda () (append-map values)))
+(assert-error (tn) (lambda () (append-map #\a '())))
+(assert-error (tn) (lambda () (append-map values '#())))
+(assert-error (tn) (lambda () (append-map list '(1) '#(2))))
+(tn "append-map single list")
+(assert-equal? (tn)
+ '()
+ (append-map values '()))
+(assert-equal? (tn)
+ '(1 2 3 4 5 6 7)
+ (append-map values '((1) (2 3) (4) (5 6 7))))
+(assert-equal? (tn)
+ '(1 3 2 4 7 6 5)
+ (append-map reverse '((1) (2 3) (4) (5 6 7))))
+(tn "append-map 3 lists")
+(assert-equal? (tn)
+ '()
+ (append-map list '() '() '()))
+(assert-equal? (tn)
+ '(1 4 7 2 5 8 3 6 9)
+ (append-map list '(1 2 3) '(4 5 6) '(7 8 9)))
+(tn "append-map 3 lists unequal length")
+(assert-equal? (tn)
+ '(1 4 7 2 5 8)
+ (append-map list '(1 2) '(4 5 6) '(7 8 9)))
+(assert-equal? (tn)
+ '(1 4 7 2 5 8)
+ (append-map list '(1 2 3) '(4 5) '(7 8 9)))
+(assert-equal? (tn)
+ '(1 4 7 2 5 8)
+ (append-map list '(1 2 3) '(4 5 6) '(7 8)))
+(assert-equal? (tn)
+ '()
+ (append-map list '() '(4 5 6) '(7 8 9)))
+(assert-equal? (tn)
+ '()
+ (append-map list '(1 2 3) '() '(7 8 9)))
+(assert-equal? (tn)
+ '()
+ (append-map list '(1 2 3) '(4 5 6) '()))
+(tn "append-map 3 lists with circular list")
+;; SRFI-1: At least one of the list arguments must be finite.
+(assert-equal? (tn)
+ '(1 4 7 2 5 8 1 6 9)
+ (append-map list clst2 '(4 5 6) '(7 8 9)))
+(assert-equal? (tn)
+ '(1 1 7 2 2 8 3 1 9)
+ (append-map list '(1 2 3) clst2 '(7 8 9)))
+(assert-equal? (tn)
+ '(1 4 1 2 5 2 3 6 1)
+ (append-map list '(1 2 3) '(4 5 6) clst2))
+(tn "append-map SRFI-1 examples")
+(assert-equal? (tn)
+ '(1 -1 3 -3 8 -8)
+ (append-map (lambda (x) (list x (- x))) '(1 3 8)))
+
+;; append-map!
+(tn "append-map! invalid forms")
+(assert-error (tn) (lambda () (append-map! values)))
+(assert-error (tn) (lambda () (append-map! #\a '())))
+(assert-error (tn) (lambda () (append-map! values '#())))
+(assert-error (tn) (lambda () (append-map! list '(1) '#(2))))
+(tn "append-map! single list")
+(assert-equal? (tn)
+ '()
+ (append-map! values '()))
+(assert-equal? (tn)
+ '(1 2 3 4 5 6 7)
+ (append-map! values
+ (list (list 1) (list 2 3) (list 4) (list 5 6 7))))
+(assert-equal? (tn)
+ '(1 3 2 4 7 6 5)
+ (append-map! reverse '((1) (2 3) (4) (5 6 7))))
+(tn "append-map! 3 lists")
+(assert-equal? (tn)
+ '()
+ (append-map! list '() '() '()))
+(assert-equal? (tn)
+ '(1 4 7 2 5 8 3 6 9)
+ (append-map! list '(1 2 3) '(4 5 6) '(7 8 9)))
+(tn "append-map! 3 lists unequal length")
+(assert-equal? (tn)
+ '(1 4 7 2 5 8)
+ (append-map! list '(1 2) '(4 5 6) '(7 8 9)))
+(assert-equal? (tn)
+ '(1 4 7 2 5 8)
+ (append-map! list '(1 2 3) '(4 5) '(7 8 9)))
+(assert-equal? (tn)
+ '(1 4 7 2 5 8)
+ (append-map! list '(1 2 3) '(4 5 6) '(7 8)))
+(assert-equal? (tn)
+ '()
+ (append-map! list '() '(4 5 6) '(7 8 9)))
+(assert-equal? (tn)
+ '()
+ (append-map! list '(1 2 3) '() '(7 8 9)))
+(assert-equal? (tn)
+ '()
+ (append-map! list '(1 2 3) '(4 5 6) '()))
+(tn "append-map! 3 lists with circular list")
+;; SRFI-1: At least one of the list arguments must be finite.
+(assert-equal? (tn)
+ '(1 4 7 2 5 8 1 6 9)
+ (append-map! list clst2 '(4 5 6) '(7 8 9)))
+(assert-equal? (tn)
+ '(1 1 7 2 2 8 3 1 9)
+ (append-map! list '(1 2 3) clst2 '(7 8 9)))
+(assert-equal? (tn)
+ '(1 4 1 2 5 2 3 6 1)
+ (append-map! list '(1 2 3) '(4 5 6) clst2))
+(tn "append-map! SRFI-1 examples")
+(assert-equal? (tn)
+ '(1 -1 3 -3 8 -8)
+ (append-map! (lambda (x) (list x (- x))) '(1 3 8)))
+
+;; map!
+;; map-in-order
+;; pair-for-each
+
;; filter-map
(tn "filter-map invalid forms")
(assert-error (tn) (lambda () (filter-map even?)))
@@ -1191,6 +1474,8 @@
(tn "filter SRFI-1 examples")
(assert-equal? (tn) '(0 8 8 -4) (filter even? '(0 7 8 8 43 -4)))
+;; partition
+
;; remove
(tn "remove invalid forms")
(assert-error (tn) (lambda () (remove #\a '(1 2))))
@@ -1205,6 +1490,10 @@
(tn "remove SRFI-1 examples")
(assert-equal? (tn) '(7 43) (remove even? '(0 7 8 8 43 -4)))
+;; filter!
+;; partition!
+;; remove!
+
;;
;; Searching
@@ -1367,6 +1656,300 @@
(= x 1)))
clst4)))
+;; take-while
+;; take-while!
+;; drop-while
+;; span
+;; span!
+;; break
+;; break!
+
+;; any
+(tn "any invalid forms")
+(assert-error (tn) (lambda () (any +)))
+(assert-error (tn) (lambda () (any + '#())))
+(assert-error (tn) (lambda () (any + '(1) '#(2))))
+(assert-error (tn) (lambda () (any #\a '(1))))
+(tn "any single list")
+(assert-equal? (tn) #f (any + '()))
+(assert-equal? (tn) #f (any even? '()))
+(assert-equal? (tn) 2 (any + '(2 4 6 8)))
+(assert-equal? (tn) #f (any odd? '(2 4 6 8)))
+(assert-equal? (tn) #t (any odd? '(3 2 4 6 8)))
+(assert-equal? (tn) #t (any odd? '(2 4 3 6 8)))
+(assert-equal? (tn) #t (any odd? '(2 4 6 8 3)))
+(tn "any 3 lists")
+(assert-equal? (tn) #f (any + '() '() '()))
+(assert-equal? (tn) 12 (any +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) 17 (any (lambda args
+ (let ((sum (apply + args)))
+ (and (odd? sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (any (lambda args
+ (let ((sum (apply + args)))
+ (and (odd? sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 4 5 8)
+ '(9 10 11 12)))
+(tn "any 3 lists unequal length")
+(assert-equal? (tn) 22 (any (lambda args
+ (let ((sum (apply + args)))
+ (and (< 20 sum)
+ sum)))
+ '(2 4 6)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) 22 (any (lambda args
+ (let ((sum (apply + args)))
+ (and (< 20 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5)
+ '(9 10 11 12)))
+(assert-equal? (tn) 22 (any (lambda args
+ (let ((sum (apply + args)))
+ (and (< 20 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11)))
+(assert-equal? (tn) #f (any (lambda args
+ (let ((sum (apply + args)))
+ (and (< 25 sum)
+ sum)))
+ '(2 4 6)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (any (lambda args
+ (let ((sum (apply + args)))
+ (and (< 25 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (any (lambda args
+ (let ((sum (apply + args)))
+ (and (< 25 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11)))
+(assert-equal? (tn) #f (any +
+ '()
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (any +
+ '(2 4 6 8)
+ '()
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (any +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '()))
+(tn "any 3 lists with circular list")
+(assert-equal? (tn) 11 (any +
+ clst2
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) 21 (any (lambda args
+ (let ((sum (apply + args)))
+ (and (< 20 sum)
+ sum)))
+ clst2
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(tn "any 3 SRFI-1 examples")
+;;(assert-eq? (tn) #t (any integer? '(a 3 b 2.7)))
+(assert-eq? (tn) #t (any integer? '(a 3 b #\2)))
+;;(assert-eq? (tn) #f (any integer? '(a 3.1 b 2.7)))
+(assert-eq? (tn) #f (any integer? '(a #\3 b #\2)))
+(assert-eq? (tn) #t (any < '(3 1 4 1 5)
+ '(2 7 1 8 2)))
+
+;; every
+(tn "every invalid forms")
+(assert-error (tn) (lambda () (every +)))
+(assert-error (tn) (lambda () (every + '#())))
+(assert-error (tn) (lambda () (every + '(1) '#(2))))
+(assert-error (tn) (lambda () (every #\a '(1))))
+(tn "every single list")
+(assert-equal? (tn) #t (every + '()))
+(assert-equal? (tn) #t (every even? '()))
+(assert-equal? (tn) 8 (every + '(2 4 6 8)))
+(assert-equal? (tn) #t (every even? '(2 4 6 8)))
+(assert-equal? (tn) #f (every even? '(3 2 4 6 8)))
+(assert-equal? (tn) #f (every even? '(2 4 3 6 8)))
+(assert-equal? (tn) #f (every even? '(2 4 6 8 3)))
+(tn "every 3 lists")
+(assert-equal? (tn) #t (every + '() '() '()))
+(assert-equal? (tn) 27 (every +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (every (lambda args
+ (let ((sum (apply + args)))
+ (and (even? sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) 28 (every (lambda args
+ (let ((sum (apply + args)))
+ (and (even? sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 4 5 8)
+ '(9 10 11 12)))
+(tn "every 3 lists unequal length")
+(assert-equal? (tn) 22 (every +
+ '(2 4 6)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) 22 (every +
+ '(2 4 6 8)
+ '(1 3 5)
+ '(9 10 11 12)))
+(assert-equal? (tn) 22 (every +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11)))
+(assert-equal? (tn) #t (every +
+ '()
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #t (every +
+ '(2 4 6 8)
+ '()
+ '(9 10 11 12)))
+(assert-equal? (tn) #t (every +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '()))
+(tn "every 3 lists with circular list")
+(assert-equal? (tn) 21 (every +
+ clst2
+ '(1 3 5 7)
+ '(9 10 11 12)))
+
+;; list-index
+(tn "list-index invalid forms")
+(assert-error (tn) (lambda () (list-index even?)))
+(assert-error (tn) (lambda () (list-index even? '#())))
+(assert-error (tn) (lambda () (list-index #\a '(1))))
+(assert-error (tn) (lambda () (list-index + '(1) '#(2))))
+(tn "list-index single list")
+(assert-false (tn) (list-index even? '()))
+(assert-false (tn) (list-index even? '(1)))
+(assert-equal? (tn) 1 (list-index even? '(1 2)))
+(assert-equal? (tn) 1 (list-index even? '(1 2 3)))
+(assert-false (tn) (list-index odd? '(2 4 6 8)))
+(assert-equal? (tn) 0 (list-index odd? '(3 2 4 6 8)))
+(assert-equal? (tn) 2 (list-index odd? '(2 4 3 6 8)))
+(assert-equal? (tn) 4 (list-index odd? '(2 4 6 8 3)))
+(tn "list-index 3 lists")
+(assert-false (tn) (list-index + '() '() '()))
+(assert-equal? (tn) 0 (list-index +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) 1 (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (odd? sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (odd? sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 4 5 8)
+ '(9 10 11 12)))
+(tn "list-index 3 lists unequal length")
+(assert-equal? (tn) 2 (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (< 20 sum)
+ sum)))
+ '(2 4 6)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) 2 (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (< 20 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5)
+ '(9 10 11 12)))
+(assert-equal? (tn) 2 (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (< 20 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11)))
+(assert-equal? (tn) #f (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (< 25 sum)
+ sum)))
+ '(2 4 6)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (< 25 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (list-index (lambda args
+ (let ((sum (apply + args)))
+ (and (< 25 sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11)))
+(assert-equal? (tn) #f (list-index +
+ '()
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (list-index +
+ '(2 4 6 8)
+ '()
+ '(9 10 11 12)))
+(assert-equal? (tn) #f (list-index +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '()))
+(tn "list-index SRFI-1 examples")
+(assert-equal? (tn) 2 (list-index even? '(3 1 4 1 5 9)))
+(assert-equal? (tn) 1 (list-index < '(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
+(assert-equal? (tn) #f (list-index = '(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
+
+;; member
+(tn "member invalid forms")
+(assert-error (tn) (lambda () (member 1)))
+(assert-error (tn) (lambda () (member 1 '#(1))))
+(assert-error (tn) (lambda () (member 1 '(1) #\a)))
+(assert-error (tn) (lambda () (member 1 '(1) = '())))
+(tn "member")
+(assert-eq? (tn) #f (member 1 '()))
+(assert-eq? (tn) #f (member 1 '() eq?))
+(assert-eq? (tn) #f (member 1 '() equal?))
+(assert-eq? (tn) cdr3 (member elm3 lst))
+(assert-eq? (tn) cdr3 (member elm3 lst eq?))
+(assert-eq? (tn) cdr3 (member elm3 lst equal?))
+(assert-eq? (tn) cdr3 (member (list-copy elm3) lst))
+(assert-false (tn) (member (list-copy elm3) lst eq?))
+(assert-eq? (tn) cdr3 (member (list-copy elm3) lst equal?))
+
;;
;; Deleting
@@ -1394,15 +1977,86 @@
(tn "delete SRFI-1 examples")
(assert-equal? (tn) '(0 -4) (delete 5 '(0 7 8 8 43 -4) <))
+;; delete!
+(tn "delete! invalid forms")
+(assert-error (tn) (lambda () (delete! 1)))
+(assert-error (tn) (lambda () (delete! 1 (vector 1))))
+(assert-error (tn) (lambda () (delete! 1 (list 1) #\a)))
+(assert-error (tn) (lambda () (delete! 1 (list 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 (list 0 7 8 8 43 -4) <))
+
+;; delete-duplicates
+;; delete-duplicates!
+
;;
;; 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)))
+
+;; assoc
+(tn "assoc (SRFI-1 extended) invalid forms")
+(assert-error (tn) (lambda () (assoc "a" alist-s #\a)))
+(assert-error (tn) (lambda () (assoc "a" alist-s string=? values)))
+(tn "assoc (SRFI-1 extended)")
+(assert-equal? (tn) '("b" . 2) (assoc "b" alist-s))
+(assert-equal? (tn) '("a" . 1) (assoc "a" alist-s))
+(assert-equal? (tn) '("d" . 4) (assoc "d" alist-s))
+(assert-equal? (tn) '("c" . 3) (assoc "c" alist-s))
+(assert-false (tn) (assoc "A" alist-s))
+(assert-equal? (tn) '("b" . 2) (assoc "b" alist-s string=?))
+(assert-equal? (tn) '("a" . 1) (assoc "a" alist-s string=?))
+(assert-equal? (tn) '("d" . 4) (assoc "d" alist-s string=?))
+(assert-equal? (tn) '("c" . 3) (assoc "c" alist-s string=?))
+(assert-false (tn) (assoc "A" alist-s string=?))
+
+;; alist-cons
+(tn "alist-cons")
+(assert-equal? (tn) '(("A" . 1)) (alist-cons "A" 1 '()))
+(assert-equal? (tn) (cons '("A" . 1) alist-s) (alist-cons "A" 1 alist-s))
+(assert-eq? (tn) alist-s (cdr (alist-cons "A" 1 alist-s)))
+
+;; alist-copy
+(tn "alist-copy")
+(assert-equal? (tn) '() (alist-copy '()))
+(assert-equal? (tn) alist-s (alist-copy alist-s))
+(assert-false (tn) (eq? (list-ref alist-s 0)
+ (list-ref (alist-copy alist-s) 0)))
+(assert-true (tn) (eq? (car (list-ref alist-s 0))
+ (car (list-ref (alist-copy alist-s) 0))))
+(assert-true (tn) (eq? (cdr (list-ref alist-s 0))
+ (cdr (list-ref (alist-copy alist-s) 0))))
+(assert-false (tn) (eq? (list-ref alist-s 1)
+ (list-ref (alist-copy alist-s) 1)))
+(assert-true (tn) (eq? (car (list-ref alist-s 1))
+ (car (list-ref (alist-copy alist-s) 1))))
+(assert-true (tn) (eq? (cdr (list-ref alist-s 1))
+ (cdr (list-ref (alist-copy alist-s) 1))))
+(assert-false (tn) (eq? (list-ref alist-s 2)
+ (list-ref (alist-copy alist-s) 2)))
+(assert-true (tn) (eq? (car (list-ref alist-s 2))
+ (car (list-ref (alist-copy alist-s) 2))))
+(assert-true (tn) (eq? (cdr (list-ref alist-s 2))
+ (cdr (list-ref (alist-copy alist-s) 2))))
+
+;; alist-delete
(tn "alist-delete invalid forms")
(assert-error (tn) (lambda () (alist-delete "A" '#())))
(assert-error (tn) (lambda () (alist-delete "A" '(("a" . 1)) #\a)))
@@ -1440,10 +2094,62 @@
(4 . d) (3 . c) (5 . e))
(alist-delete 5 alist-n <))
+;; alist-delete!
+(tn "alist-delete! invalid forms")
+(assert-error (tn) (lambda () (alist-delete! "A" (vector))))
+(assert-error (tn) (lambda () (alist-delete! "A" (list (cons "a" 1)) #\a)))
+(assert-error (tn) (lambda () (alist-delete! #\a (list (cons "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-copy alist-s)))
+(assert-equal? (tn)
+ '(("b" . 2) ("d" . 4) ("b" . 5) ("c" . 3))
+ (alist-delete! "a" (alist-copy alist-s)))
+(assert-equal? (tn)
+ '(("a" . 1) ("d" . 4) ("c" . 3))
+ (alist-delete! "b" (alist-copy alist-s)))
+(assert-equal? (tn)
+ '(("a" . 1) ("d" . 4) ("c" . 3))
+ (alist-delete! "b" (alist-copy 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-copy 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-copy 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-copy 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-copy alist-n) <))
+
;;
;; Set operations on lists
;;
+
+;; lset<=
+;; lset=
+;; lset-adjoin
+;; lset-union
+;; lset-intersection
+;; lset-difference
+;; lset-xor
+;; lset-diff+intersection
+;; lset-union!
+;; lset-intersection!
+;; lset-difference!
+;; lset-xor!
+;; lset-diff+intersection!
(total-report)