Implemented string<
[jscl.git] / tests / list.lisp
1 ;; Tests for list functions
2
3 ;; CONS
4 (test (equal (cons 1 2) '(1 . 2)))
5 (test (equal (cons 1 nil) '(1)))
6 (test (equal (cons nil 2) '(NIL . 2)))
7 (test (equal (cons nil nil) '(NIL)))
8 (test (equal (cons 1 (cons 2 (cons 3 (cons 4 nil)))) '(1 2 3 4)))
9 (test (equal (cons 'a 'b) '(A . B)))
10 (test (equal (cons 'a (cons 'b (cons 'c '()))) '(A B C)))
11 (test (equal (cons 'a '(b c d)) '(A B C D)))
12
13 ;; CONSP
14 (test (not (consp 'nil)))
15 (test (not (consp nil)))
16 (test (not (consp ())))
17 (test (not (consp '())))
18 (test (consp (cons 1 2)))
19
20 ;; ATOM
21 (test (atom 'sss))
22 (test (not (atom (cons 1 2))))
23 (test (atom nil))
24 (test (atom '()))
25 (test (atom 3))
26
27 ;; RPLACA
28 (let ((some-list (list* 'one 'two 'three 'four)))
29   (test (equal (rplaca some-list 'uno) '(UNO TWO THREE . FOUR)))
30   (test (equal some-list '(UNO TWO THREE . FOUR))))
31
32 ;; RPLACD
33 (let ((some-list (list* 'one 'two 'three 'four)))
34   (test (equal (rplacd (last some-list) (list 'IV)) '(THREE IV)))
35   (test (equal some-list '(ONE TWO THREE IV))))
36
37 ;; CAR, CDR and variants
38 (test (equal (car nil) nil))
39 (test (equal (cdr '(1 . 2)) 2))
40 (test (equal (cdr '(1 2)) '(2)))
41 (test (equal (cadr '(1 2)) 2))
42 (test (equal (car '(a b c)) 'a))
43 (test (equal (cdr '(a b c)) '(b c)))
44 (test (equal (caar '((1 2) 3)) 1))
45 (test (equal (cadr '(1 2 3)) 2))
46 (test (equal (cdar '((1 2) 3)) '(2)))
47 (test (equal (cddr '(1 2 3)) '(3)))
48 (test (equal (caaar '(((1)))) 1))
49 (test (equal (caadr '(1 (2))) 2))
50 (test (equal (cadar '((1 2))) 2))
51 (test (equal (caddr '(1 2 3)) 3))
52 (test (equal (cdaar '(((1 2)))) '(2)))
53 (test (equal (cdadr '(1 (2 3))) '(3)))
54 (test (equal (cddar '((1 2 3))) '(3)))
55 (test (equal (cdddr '(1 2 3 4)) '(4)))
56 (test (equal (caaaar '((((1))))) 1))
57 (test (equal (caaadr '(1 ((2)))) 2))
58 (test (equal (caadar '((1 (2)))) 2))
59 (test (equal (caaddr '(1 2 (3))) 3))
60 (test (equal (cadaar '(((1 2)))) 2))
61 (test (equal (cadadr '(1 (2 3))) 3))
62 (test (equal (caddar '((1 2 3))) 3))
63 (test (equal (cadddr '(1 2 3 4)) 4))
64 (test (equal (cdaaar '((((1 2))))) '(2)))
65 (test (equal (cdaadr '(1 ((2 3)))) '(3)))
66 (test (equal (cdadar '((1 (2 3)))) '(3)))
67 (test (equal (cdaddr '(1 2 (3 4))) '(4)))
68 (test (equal (cddaar '(((1 2 3)))) '(3)))
69 (test (equal (cddadr '(1 (2 3 4))) '(4)))
70 (test (equal (cdddar '((1 2 3 4))) '(4)))
71 (test (equal (cddddr '(1 2 3 4 5)) '(5)))
72
73 ; COPY-TREE
74 (test (let* ((foo (list '(1 2) '(3 4)))
75              (bar (copy-tree foo)))
76         ;; (SETF (CAR (CAR FOO)) 0) doesn't work in the test for some reason,
77         ;; despite working fine in the REPL
78         (rplaca (car foo) 0)
79         (not (= (car (car foo))
80                 (car (car bar))))))
81
82 ; TREE-EQUAL
83 (test (tree-equal '(1 2 3) '(1 2 3)))
84 (test (tree-equal '(1 (2 (3 4) 5) 6) '(1 (2 (3 4) 5) 6)))
85 (test (tree-equal (cons 1 2) (cons 2 3)
86                   :test (lambda (a b) (not (= a b)))))
87
88 ; FIRST to TENTH
89 (let ((nums '(1 2 3 4 5 6 7 8 9 10)))
90   (test (= (first   nums) 1))
91   (test (= (second  nums) 2))
92   (test (= (third   nums) 3))
93   (test (= (fourth  nums) 4))
94   (test (= (fifth   nums) 5))
95   (test (= (sixth   nums) 6))
96   (test (= (seventh nums) 7))
97   (test (= (eighth  nums) 8))
98   (test (= (ninth   nums) 9))
99   (test (= (tenth   nums) 10)))
100
101 ; TAILP
102 (let* ((a (list 1 2 3))
103        (b (cdr a)))
104   (test (tailp b a))
105   (test (tailp a a)))
106 (test (tailp 'a (cons 'b 'a)))
107
108 ; ACONS
109 (test (equal '((1 . 2) (3 . 4))
110              (acons 1 2 '((3 . 4)))))
111 (test (equal '((1 . 2)) (acons 1 2 ())))
112
113 ; PAIRLIS
114 (test (equal '((1 . 3) (0 . 2))
115              (pairlis '(0 1) '(2 3))))
116 (test (equal '((1 . 2) (a . b))
117              (pairlis '(1) '(2) '((a . b)))))
118
119 ; COPY-ALIST
120 (let* ((alist '((1 . 2) (3 . 4)))
121        (copy (copy-alist alist)))
122   (test (not (eql alist copy)))
123   (test (not (eql (car alist) (car copy))))
124   (test (equal alist copy)))
125
126 ; ASSOC and RASSOC
127 (let ((alist '((1 . 2) (3 . 4))))
128   (test (equal (assoc  1 alist) '(1 . 2)))
129   (test (equal (rassoc 2 alist) '(1 . 2)))
130   (test (not   (assoc  2 alist)))
131   (test (not   (rassoc 1 alist))))
132
133 ; MEMBER
134 (test (equal (member 2 '(1 2 3)) '(2 3)))
135 (test (not   (member 4 '(1 2 3))))
136 (test (equal (member 4 '((1 . 2) (3 . 4)) :key #'cdr) '((3 . 4))))
137 (test (member '(2) '((1) (2) (3)) :test #'equal))
138
139 ; ADJOIN
140 (test (equal (adjoin 1 '(2 3))   '(1 2 3)))
141 (test (equal (adjoin 1 '(1 2 3)) '(1 2 3)))
142 (test (equal (adjoin '(1) '((1) (2)) :test #'equal) '((1) (2))))
143
144 ; INTERSECTION
145 (test (equal (intersection '(1 2) '(2 3)) '(2)))
146 (test (not (intersection '(1 2 3) '(4 5 6))))
147 (test (equal (intersection '((1) (2)) '((2) (3)) :test #'equal) '((2))))
148
149 ; SUBST
150
151 ; POP
152 (test (let* ((foo '(1 2 3))
153              (bar (pop foo)))
154         (and (= bar 1)
155              (= (car foo) 2))))
156
157 ;; MAPCAR
158 (test (equal (mapcar #'+ '(1 2) '(3) '(4 5 6)) '(8)))
159
160 ;; MAPC
161 (test (equal (mapc #'+ '(1 2) '(3) '(4 5 6)) '(1 2)))
162 (test (let (foo)
163         (mapc (lambda (x y z) (push (+ x y z) foo)) '(1 2) '(3) '(4 5 6))
164         (equal foo '(8))))