[test] Remove debug print from MAPC test
[jscl.git] / tests / list.lisp
index 3ff5515..4e6fb0c 100644 (file)
@@ -1,7 +1,38 @@
 ;; Tests for list functions
 
-;; TODO: EQUAL doesn't compare lists correctly at the moment.
-;; Once it does the lists can be compared directly in many of these tests
+;; CONS
+(test (equal (cons 1 2) '(1 . 2)))
+(test (equal (cons 1 nil) '(1)))
+(test (equal (cons nil 2) '(NIL . 2)))
+(test (equal (cons nil nil) '(NIL)))
+(test (equal (cons 1 (cons 2 (cons 3 (cons 4 nil)))) '(1 2 3 4)))
+(test (equal (cons 'a 'b) '(A . B)))
+(test (equal (cons 'a (cons 'b (cons 'c '()))) '(A B C)))
+(test (equal (cons 'a '(b c d)) '(A B C D)))
+
+;; CONSP
+(test (not (consp 'nil)))
+(test (not (consp nil)))
+(test (not (consp ())))
+(test (not (consp '())))
+(test (consp (cons 1 2)))
+
+;; ATOM
+(test (atom 'sss))
+(test (not (atom (cons 1 2))))
+(test (atom nil))
+(test (atom '()))
+(test (atom 3))
+
+;; RPLACA
+(let ((some-list (list* 'one 'two 'three 'four)))
+  (test (equal (rplaca some-list 'uno) '(UNO TWO THREE . FOUR)))
+  (test (equal some-list '(UNO TWO THREE . FOUR))))
+
+;; RPLACD
+(let ((some-list (list* 'one 'two 'three 'four)))
+  (test (equal (rplacd (last some-list) (list 'IV)) '(THREE IV)))
+  (test (equal some-list '(ONE TWO THREE IV))))
 
 ; COPY-TREE
 (test (let* ((foo (list '(1 2) '(3 4)))
         (not (= (car (car foo))
                 (car (car bar))))))
 
+; TREE-EQUAL
+(test (tree-equal '(1 2 3) '(1 2 3)))
+(test (tree-equal '(1 (2 (3 4) 5) 6) '(1 (2 (3 4) 5) 6)))
+(test (tree-equal (cons 1 2) (cons 2 3)
+                  :test (lambda (a b) (not (= a b)))))
+
+; FIRST to TENTH
+(let ((nums '(1 2 3 4 5 6 7 8 9 10)))
+  (test (= (first   nums) 1))
+  (test (= (second  nums) 2))
+  (test (= (third   nums) 3))
+  (test (= (fourth  nums) 4))
+  (test (= (fifth   nums) 5))
+  (test (= (sixth   nums) 6))
+  (test (= (seventh nums) 7))
+  (test (= (eighth  nums) 8))
+  (test (= (ninth   nums) 9))
+  (test (= (tenth   nums) 10)))
+
+; TAILP
+(let* ((a (list 1 2 3))
+       (b (cdr a)))
+  (test (tailp b a))
+  (test (tailp a a)))
+(test (tailp 'a (cons 'b 'a)))
+
+; ACONS
+(test (equal '((1 . 2) (3 . 4))
+             (acons 1 2 '((3 . 4)))))
+(test (equal '((1 . 2)) (acons 1 2 ())))
+
+; PAIRLIS
+(test (equal '((1 . 3) (0 . 2))
+             (pairlis '(0 1) '(2 3))))
+(test (equal '((1 . 2) (a . b))
+             (pairlis '(1) '(2) '((a . b)))))
+
+; COPY-ALIST
+(let* ((alist '((1 . 2) (3 . 4)))
+       (copy (copy-alist alist)))
+  (test (not (eql alist copy)))
+  (test (not (eql (car alist) (car copy))))
+  (test (equal alist copy)))
+
+; ASSOC and RASSOC
+(let ((alist '((1 . 2) (3 . 4))))
+  (test (equal (assoc  1 alist) '(1 . 2)))
+  (test (equal (rassoc 2 alist) '(1 . 2)))
+  (test (not   (assoc  2 alist)))
+  (test (not   (rassoc 1 alist))))
+
+; MEMBER
+(test (equal (member 2 '(1 2 3)) '(2 3)))
+(test (not   (member 4 '(1 2 3))))
+(test (equal (member 4 '((1 . 2) (3 . 4)) :key #'cdr) '((3 . 4))))
+(test (member '(2) '((1) (2) (3)) :test #'equal))
+
+; ADJOIN
+(test (equal (adjoin 1 '(2 3))   '(1 2 3)))
+(test (equal (adjoin 1 '(1 2 3)) '(1 2 3)))
+(test (equal (adjoin '(1) '((1) (2)) :test #'equal) '((1) (2))))
+
+; INTERSECTION
+(test (equal (intersection '(1 2) '(2 3)) '(2)))
+(test (not (intersection '(1 2 3) '(4 5 6))))
+(test (equal (intersection '((1) (2)) '((2) (3)) :test #'equal) '((2))))
+
 ; SUBST
-; Can't really test this until EQUAL works properly on lists
 
 ; POP
 (test (let* ((foo '(1 2 3))
              (bar (pop foo)))
         (and (= bar 1)
              (= (car foo) 2))))
+
+;; MAPCAR
+(test (equal (mapcar #'+ '(1 2) '(3) '(4 5 6)) '(8)))
+
+;; MAPC
+(test (equal (mapc #'+ '(1 2) '(3) '(4 5 6)) '(1 2)))
+(test (let (foo)
+        (mapc (lambda (x y z) (push (+ x y z) foo)) '(1 2) '(3) '(4 5 6))
+        (equal foo '(8))))