Author: yamakenz
Date: Thu Jul 5 03:12:29 2007
New Revision: 4664
Modified:
sigscheme-trunk/test/test-srfi1-another.scm
Log:
* test/test-srfi1-another.scm
- Add tests for take, map, map-in-order
Modified: sigscheme-trunk/test/test-srfi1-another.scm
==============================================================================
--- sigscheme-trunk/test/test-srfi1-another.scm (original)
+++ sigscheme-trunk/test/test-srfi1-another.scm Thu Jul 5 03:12:29 2007
@@ -36,6 +36,7 @@
(use srfi-1)
(use srfi-6)
+(use srfi-38)
(if (not (provided? "srfi-1"))
(test-skip "SRFI-1 is not enabled"))
@@ -694,12 +695,231 @@
(eq? kdr elm1)))))
;; take
-(tn "take")
+;;
+;; SRFI-1: take returns the first i elements of list x.
+;; x may be any value -- a proper, circular, or dotted list.
+(tn "take proper list invalid forms")
+(assert-error (tn) (lambda () (take '() -1)))
+(assert-error (tn) (lambda () (take '(1 2) -1)))
+(tn "take proper list index 0")
+(assert-equal? (tn) '() (take '() 0))
+(assert-equal? (tn) '() (take '(1) 0))
+(assert-equal? (tn) '() (take '(1 2) 0))
+(assert-equal? (tn) '() (take '(1 2 3) 0))
+(assert-equal? (tn) '() (take '(1 2 3 4) 0))
+(assert-eq? (tn) '() (take lst 0))
+(assert-eq? (tn) '() (take cdr9 0))
+(tn "take proper list index 1")
+(assert-error (tn) (lambda () (take '() 1)))
+(assert-equal? (tn) '(1) (take '(1) 1))
+(assert-equal? (tn) '(1) (take '(1 2) 1))
+(assert-equal? (tn) '(1) (take '(1 2 3) 1))
+(assert-equal? (tn) '(1) (take '(1 2 3 4) 1))
+(assert-equal? (tn) (list elm0) (take lst 1))
+(assert-equal? (tn) (list elm8) (take cdr8 1))
+(assert-equal? (tn) (list elm9) (take cdr9 1))
+(tn "take proper list index 2")
+(assert-error (tn) (lambda () (take '() 2)))
+(assert-error (tn) (lambda () (take '(1) 2)))
+(assert-equal? (tn) '(1 2) (take '(1 2) 2))
+(assert-equal? (tn) '(1 2) (take '(1 2 3) 2))
+(assert-equal? (tn) '(1 2) (take '(1 2 3 4) 2))
+(assert-equal? (tn) (list elm0 elm1) (take lst 2))
+(assert-equal? (tn) (list elm7 elm8) (take cdr7 2))
+(assert-equal? (tn) (list elm8 elm9) (take cdr8 2))
+(assert-error (tn) (lambda () (take cdr9 2)))
+(tn "take proper list index 3")
+(assert-error (tn) (lambda () (take '() 3)))
+(assert-error (tn) (lambda () (take '(1) 3)))
+(assert-error (tn) (lambda () (take '(1 2) 3)))
+(assert-equal? (tn) '(1 2 3) (take '(1 2 3) 3))
+(assert-equal? (tn) '(1 2 3) (take '(1 2 3 4) 3))
+(assert-equal? (tn) (list elm0 elm1 elm2) (take lst 3))
+(assert-equal? (tn) (list elm6 elm7 elm8) (take cdr6 3))
+(assert-equal? (tn) (list elm7 elm8 elm9) (take cdr7 3))
+(assert-error (tn) (lambda () (take cdr8 3)))
+(assert-error (tn) (lambda () (take cdr9 3)))
+(tn "take proper list index 4")
+(assert-error (tn) (lambda () (take '() 4)))
+(assert-error (tn) (lambda () (take '(1) 4)))
+(assert-error (tn) (lambda () (take '(1 2) 4)))
+(assert-error (tn) (lambda () (take '(1 2 3) 4)))
+(assert-equal? (tn) '(1 2 3 4) (take '(1 2 3 4) 4))
+(assert-equal? (tn) (list elm0 elm1 elm2 elm3) (take lst 4))
+(assert-equal? (tn) (list elm5 elm6 elm7 elm8) (take cdr5 4))
+(assert-equal? (tn) (list elm6 elm7 elm8 elm9) (take cdr6 4))
+(assert-error (tn) (lambda () (take cdr7 4)))
+(assert-error (tn) (lambda () (take cdr8 4)))
+(assert-error (tn) (lambda () (take cdr9 4)))
+(tn "take proper list index 5")
+(assert-error (tn) (lambda () (take '() 5)))
+(assert-error (tn) (lambda () (take '(1) 5)))
+(assert-error (tn) (lambda () (take '(1 2) 5)))
+(assert-error (tn) (lambda () (take '(1 2 3) 5)))
+(assert-error (tn) (lambda () (take '(1 2 3 4) 5)))
+(assert-equal? (tn) (list elm0 elm1 elm2 elm3 elm4) (take lst 5))
+(assert-equal? (tn) (list elm4 elm5 elm6 elm7 elm8) (take cdr4 5))
+(assert-equal? (tn) (list elm5 elm6 elm7 elm8 elm9) (take cdr5 5))
+(assert-error (tn) (lambda () (take cdr6 5)))
+(assert-error (tn) (lambda () (take cdr7 5)))
+(assert-error (tn) (lambda () (take cdr8 5)))
+(assert-error (tn) (lambda () (take cdr9 5)))
+(tn "take proper list other indices")
+(assert-equal? (tn)
+ (list elm0 elm1 elm2 elm3 elm4 elm5)
+ (take lst 6))
+(assert-equal? (tn)
+ (list elm0 elm1 elm2 elm3 elm4 elm5 elm6)
+ (take lst 7))
+(assert-equal? (tn)
+ (list elm0 elm1 elm2 elm3 elm4 elm5 elm6 elm7)
+ (take lst 8))
+(assert-equal? (tn)
+ (list elm0 elm1 elm2 elm3 elm4 elm5 elm6 elm7 elm8)
+ (take lst 9))
+(assert-equal? (tn)
+ (list elm0 elm1 elm2 elm3 elm4 elm5 elm6 elm7 elm8 elm9)
+ (take lst 10))
+(assert-error (tn) (lambda () (take lst 11)))
+
+(tn "take dotted list invalid forms")
+(assert-error (tn) (lambda () (take 1 -1)))
+(assert-error (tn) (lambda () (take '(1 . 2) -1)))
+(tn "take dotted list index 0")
+(assert-equal? (tn) '() (take 1 0))
+(assert-equal? (tn) '() (take '(1 . 2) 0))
+(assert-equal? (tn) '() (take '(1 2 . 3) 0))
+(assert-equal? (tn) '() (take '(1 2 3 . 4) 0))
+(assert-equal? (tn) '() (take '(1 2 3 4 . 5) 0))
+(tn "take dotted list index 1")
+(assert-error (tn) (lambda () (take 1 1)))
+(assert-equal? (tn) '(1) (take '(1 . 2) 1))
+(assert-equal? (tn) '(1) (take '(1 2 . 3) 1))
+(assert-equal? (tn) '(1) (take '(1 2 3 . 4) 1))
+(assert-equal? (tn) '(1) (take '(1 2 3 4 . 5) 1))
+(tn "take dotted list index 2")
+(assert-error (tn) (lambda () (take 1 2)))
+(assert-error (tn) (lambda () (take '(1 . 2) 2)))
+(assert-equal? (tn) '(1 2) (take '(1 2 . 3) 2))
+(assert-equal? (tn) '(1 2) (take '(1 2 3 . 4) 2))
+(assert-equal? (tn) '(1 2) (take '(1 2 3 4 . 5) 2))
+(tn "take dotted list index 3")
+(assert-error (tn) (lambda () (take 1 3)))
+(assert-error (tn) (lambda () (take '(1 . 2) 3)))
+(assert-error (tn) (lambda () (take '(1 2 . 3) 3)))
+(assert-equal? (tn) '(1 2 3) (take '(1 2 3 . 4) 3))
+(assert-equal? (tn) '(1 2 3) (take '(1 2 3 4 . 5) 3))
+(tn "take dotted list index 4")
+(assert-error (tn) (lambda () (take 1 4)))
+(assert-error (tn) (lambda () (take '(1 . 2) 4)))
+(assert-error (tn) (lambda () (take '(1 2 . 3) 4)))
+(assert-error (tn) (lambda () (take '(1 2 3 . 4) 4)))
+(assert-equal? (tn) '(1 2 3 4) (take '(1 2 3 4 . 5) 4))
+(tn "take dotted list index 5")
+(assert-error (tn) (lambda () (take 1 5)))
+(assert-error (tn) (lambda () (take '(1 . 2) 5)))
+(assert-error (tn) (lambda () (take '(1 2 . 3) 5)))
+(assert-error (tn) (lambda () (take '(1 2 3 . 4) 5)))
+(assert-error (tn) (lambda () (take '(1 2 3 4 . 5) 5)))
+
+(tn "take circular list invalid forms")
+;; SigScheme's implementation does not detect negative index on circular list
+;; since it is an user error. It goes an infinite loop.
+;;(assert-error (tn) (lambda () (take clst1 -1)))
+;;(assert-error (tn) (lambda () (take clst2 -1)))
+(tn "take circular list index 0")
+(assert-eq? (tn) '() (take clst1 0))
+(assert-eq? (tn) '() (take clst2 0))
+(assert-eq? (tn) '() (take clst3 0))
+(assert-eq? (tn) '() (take clst4 0))
+(tn "take circular list index 1")
+(assert-equal? (tn) (list (list-ref clst1 0)) (take clst1 1))
+(assert-equal? (tn) (list (list-ref clst2 0)) (take clst2 1))
+(assert-equal? (tn) (list (list-ref clst3 0)) (take clst3 1))
+(assert-equal? (tn) (list (list-ref clst4 0)) (take clst4 1))
+(tn "take circular list index 2")
+(assert-equal? (tn) (list (list-ref clst1 0)
+ (list-ref clst1 0)) (take clst1 2))
+(assert-equal? (tn) (list (list-ref clst2 0)
+ (list-ref clst2 1)) (take clst2 2))
+(assert-equal? (tn) (list (list-ref clst3 0)
+ (list-ref clst3 1)) (take clst3 2))
+(assert-equal? (tn) (list (list-ref clst4 0)
+ (list-ref clst4 1)) (take clst4 2))
+(tn "take circular list index 3")
+(assert-equal? (tn) (list (list-ref clst1 0)
+ (list-ref clst1 0)
+ (list-ref clst1 0)) (take clst1 3))
+(assert-equal? (tn) (list (list-ref clst2 0)
+ (list-ref clst2 1)
+ (list-ref clst2 0)) (take clst2 3))
+(assert-equal? (tn) (list (list-ref clst3 0)
+ (list-ref clst3 1)
+ (list-ref clst3 2)) (take clst3 3))
+(assert-equal? (tn) (list (list-ref clst4 0)
+ (list-ref clst4 1)
+ (list-ref clst4 2)) (take clst4 3))
+(tn "take circular list index 4")
+(assert-equal? (tn) (list (list-ref clst1 0)
+ (list-ref clst1 0)
+ (list-ref clst1 0)
+ (list-ref clst1 0)) (take clst1 4))
+(assert-equal? (tn) (list (list-ref clst2 0)
+ (list-ref clst2 1)
+ (list-ref clst2 0)
+ (list-ref clst2 1)) (take clst2 4))
+(assert-equal? (tn) (list (list-ref clst3 0)
+ (list-ref clst3 1)
+ (list-ref clst3 2)
+ (list-ref clst3 0)) (take clst3 4))
+(assert-equal? (tn) (list (list-ref clst4 0)
+ (list-ref clst4 1)
+ (list-ref clst4 2)
+ (list-ref clst4 3)) (take clst4 4))
+(tn "take circular list index 5")
+(assert-equal? (tn) (list (list-ref clst1 0)
+ (list-ref clst1 0)
+ (list-ref clst1 0)
+ (list-ref clst1 0)
+ (list-ref clst1 0)) (take clst1 5))
+(assert-equal? (tn) (list (list-ref clst2 0)
+ (list-ref clst2 1)
+ (list-ref clst2 0)
+ (list-ref clst2 1)
+ (list-ref clst2 0)) (take clst2 5))
+(assert-equal? (tn) (list (list-ref clst3 0)
+ (list-ref clst3 1)
+ (list-ref clst3 2)
+ (list-ref clst3 0)
+ (list-ref clst3 1)) (take clst3 5))
+(assert-equal? (tn) (list (list-ref clst4 0)
+ (list-ref clst4 1)
+ (list-ref clst4 2)
+ (list-ref clst4 3)
+ (list-ref clst4 0)) (take clst4 5))
+(tn "take freshly-allocated entire list")
;; SRFI-1: If the argument is a list of non-zero length, take is guaranteed to
;; return a freshly-allocated list, even in the case where the entire list is
;; taken, e.g. (take lis (length lis)).
(assert-false (tn) (eq? lst (take lst (length lst))))
(assert-true (tn) (equal? lst (take lst (length lst))))
+(define find-pair
+ (lambda (x lst)
+ (let rec ((rest lst))
+ (if (null? rest)
+ #f
+ (or (eq? x rest)
+ (rec (cdr rest)))))))
+;; Check uniqueness for each pair in the new list.
+(assert-true (tn) (let rec ((rest (take lst (length lst))))
+ (if (null? rest)
+ #t
+ (and (not (find-pair rest lst))
+ (rec (cdr rest))))))
+(tn "take SRFI-1 examples")
+(assert-equal? (tn) '(a b) (take '(a b c d e) 2))
+(assert-equal? (tn) '(1 2) (take '(1 2 3 . d) 2))
+(assert-equal? (tn) '(1 2 3) (take '(1 2 3 . d) 3))
;; drop
;;
@@ -1223,7 +1443,105 @@
(lambda (x) tail))))
;; unfold-right
+
;; map
+(tn "map invalid forms")
+(assert-error (tn) (lambda () (map +)))
+(assert-error (tn) (lambda () (map + '#())))
+(assert-error (tn) (lambda () (map + '(1) '#(2))))
+(assert-error (tn) (lambda () (map #\a '(1))))
+(tn "map single list")
+(assert-equal? (tn) '() (map + '()))
+(assert-equal? (tn) '() (map even? '()))
+(assert-equal? (tn) '(2 4 6 8) (map + '(2 4 6 8)))
+(assert-equal? (tn) '(#t #t #t #t) (map even? '(2 4 6 8)))
+(assert-equal? (tn) '(#f #t #t #t #t) (map even? '(3 2 4 6 8)))
+(assert-equal? (tn) '(#t #t #f #t #t) (map even? '(2 4 3 6 8)))
+(assert-equal? (tn) '(#t #t #t #t #f) (map even? '(2 4 6 8 3)))
+(tn "map 3 lists")
+(assert-equal? (tn) '() (map + '() '() '()))
+(assert-equal? (tn) '(12 17 22 27) (map +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) '(12 #f 22 #f) (map (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) '(12 18 22 28) (map (lambda args
+ (let ((sum (apply + args)))
+ (and (even? sum)
+ sum)))
+ '(2 4 6 8)
+ '(1 4 5 8)
+ '(9 10 11 12)))
+(tn "map 3 lists unequal length")
+(assert-equal? (tn) '(12 17 22) (map +
+ '(2 4 6)
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) '(12 17 22) (map +
+ '(2 4 6 8)
+ '(1 3 5)
+ '(9 10 11 12)))
+(assert-equal? (tn) '(12 17 22) (map +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '(9 10 11)))
+(assert-equal? (tn) '() (map +
+ '()
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) '() (map +
+ '(2 4 6 8)
+ '()
+ '(9 10 11 12)))
+(assert-equal? (tn) '() (map +
+ '(2 4 6 8)
+ '(1 3 5 7)
+ '()))
+(tn "map 3 lists with circular list")
+(assert-equal? (tn) '(11 15 17 21) (map +
+ clst2
+ '(1 3 5 7)
+ '(9 10 11 12)))
+(assert-equal? (tn) '(11 15 17 21) (map +
+ '(1 3 5 7)
+ clst2
+ '(9 10 11 12)))
+(assert-equal? (tn) '(11 15 17 21) (map +
+ '(1 3 5 7)
+ '(9 10 11 12)
+ clst2))
+(tn "map SRFI-1 examples")
+(assert-equal? (tn)
+ '(b e h)
+ (map cadr '((a b) (d e) (g h))))
+(define expt
+ (lambda (x y)
+ (apply * (make-list y x))))
+(assert-equal? (tn)
+ '(1 4 27 256 3125)
+ (map (lambda (n) (expt n n))
+ '(1 2 3 4 5)))
+(assert-equal? (tn)
+ '(5 7 9)
+ (map + '(1 2 3) '(4 5 6)))
+(assert-true (tn)
+ (let ((result (let ((count 0))
+ (map (lambda (ignored)
+ (set! count (+ count 1))
+ count)
+ '(a b)))))
+ (or (equal? result '(1 2))
+ (equal? result '(2 1)))))
+(assert-equal? (tn)
+ '(4 1 5 1)
+ (map + '(3 1 4 1) (circular-list 1 0)))
+
;; for-each
;; append-map
@@ -1344,7 +1662,39 @@
(append-map! (lambda (x) (list x (- x))) '(1 3 8)))
;; map!
+
;; map-in-order
+(tn "map-in-order")
+;; derived from SRFI-1 example of map
+(assert-equal? (tn)
+ '()
+ (let ((count 0))
+ (map-in-order (lambda (ignored)
+ (set! count (+ count 1))
+ count)
+ '())))
+(assert-equal? (tn)
+ '(1 2)
+ (let ((count 0))
+ (map-in-order (lambda (ignored)
+ (set! count (+ count 1))
+ count)
+ '(a b))))
+(assert-equal? (tn)
+ '(1 2 3)
+ (let ((count 0))
+ (map-in-order (lambda (ignored)
+ (set! count (+ count 1))
+ count)
+ '(a b c))))
+(assert-equal? (tn)
+ '(1 2 3 4)
+ (let ((count 0))
+ (map-in-order (lambda (ignored)
+ (set! count (+ count 1))
+ count)
+ '(a b c d))))
+
;; pair-for-each
;; filter-map