df22afe1ce5719339158655d3b9bc2770aff7504
[bpt/guile.git] / test-suite / tests / elisp-compiler.test
1 ;;;; elisp-compiler.test --- Test the compiler for Elisp. -*- scheme -*-
2 ;;;;
3 ;;;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
4 ;;;; Daniel Kraft
5 ;;;;
6 ;;;; This library is free software; you can redistribute it and/or
7 ;;;; modify it under the terms of the GNU Lesser General Public
8 ;;;; License as published by the Free Software Foundation; either
9 ;;;; version 3 of the License, or (at your option) any later version.
10 ;;;;
11 ;;;; This library is distributed in the hope that it will be useful,
12 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ;;;; Lesser General Public License for more details.
15 ;;;;
16 ;;;; You should have received a copy of the GNU Lesser General Public
17 ;;;; License along with this library; if not, write to the Free Software
18 ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
20 (define-module (test-elisp-compiler)
21 :use-module (test-suite lib)
22 :use-module (system base compile)
23 :use-module (language elisp runtime))
24
25
26 ; Macros to handle the compilation conveniently.
27
28 (define-syntax compile-test
29 (syntax-rules (pass-if pass-if-equal pass-if-exception)
30 ((_ (pass-if test-name exp))
31 (pass-if test-name (compile 'exp #:from 'elisp #:to 'value)))
32 ((_ (pass-if test-name exp #:opts opts))
33 (pass-if test-name (compile 'exp #:from 'elisp #:to 'value #:opts opts)))
34 ((_ (pass-if-equal test-name result exp))
35 (pass-if test-name (equal? result
36 (compile 'exp #:from 'elisp #:to 'value))))
37 ((_ (pass-if-exception test-name exc exp))
38 (pass-if-exception test-name exc
39 (compile 'exp #:from 'elisp #:to 'value)))))
40
41 (define-syntax with-test-prefix/compile
42 (syntax-rules ()
43 ((_ section-name exp ...)
44 (with-test-prefix section-name (compile-test exp) ...))))
45
46
47 ; Test control structures.
48 ; ========================
49
50 (with-test-prefix/compile "Sequencing"
51
52 (pass-if-equal "progn" 1
53 (progn (setq a 0)
54 (setq a (1+ a))
55 a))
56
57 (pass-if "prog1"
58 (progn (setq a 0)
59 (setq b (prog1 a (setq a (1+ a))))
60 (and (= a 1) (= b 0))))
61
62 (pass-if "prog2"
63 (progn (setq a 0)
64 (setq b (prog2 (setq a (1+ a))
65 (setq a (1+ a))
66 (setq a (1+ a))))
67 (and (= a 3) (= b 2)))))
68
69 (with-test-prefix/compile "Conditionals"
70
71 (pass-if-equal "succeeding if" 1
72 (if t 1 2))
73 (pass-if "failing if"
74 (and (= (if nil
75 1
76 (setq a 2) (setq a (1+ a)) a)
77 3)
78 (equal (if nil 1) nil)))
79
80 (pass-if-equal "failing when" nil-value
81 (when nil 1 2 3))
82 (pass-if-equal "succeeding when" 42
83 (progn (setq a 0)
84 (when t (setq a 42) a)))
85
86 (pass-if-equal "failing unless" nil-value
87 (unless t 1 2 3))
88 (pass-if-equal "succeeding unless" 42
89 (progn (setq a 0)
90 (unless nil (setq a 42) a)))
91
92 (pass-if-equal "empty cond" nil-value
93 (cond))
94 (pass-if-equal "all failing cond" nil-value
95 (cond (nil) (nil)))
96 (pass-if-equal "only condition" 5
97 (cond (nil) (5)))
98 (pass-if-equal "succeeding cond value" 42
99 (cond (nil) (t 42) (t 0)))
100 (pass-if-equal "succeeding cond side-effect" 42
101 (progn (setq a 0)
102 (cond (nil) (t (setq a 42) 1) (t (setq a 0)))
103 a)))
104
105 (with-test-prefix/compile "Combining Conditions"
106
107 (pass-if-equal "empty and" t-value (and))
108 (pass-if-equal "failing and" nil-value (and 1 2 nil 3))
109 (pass-if-equal "succeeding and" 3 (and 1 2 3))
110
111 (pass-if-equal "empty or" nil-value (or))
112 (pass-if-equal "failing or" nil-value (or nil nil nil))
113 (pass-if-equal "succeeding or" 1 (or nil 1 nil 2 nil 3))
114
115 (pass-if-equal "not true" nil-value (not 1))
116 (pass-if-equal "not false" t-value (not nil)))
117
118 (with-test-prefix/compile "Iteration"
119
120 (pass-if-equal "failing while" 0
121 (progn (setq a 0)
122 (while nil (setq a 1))
123 a))
124 (pass-if-equal "running while" 120
125 (progn (setq prod 1
126 i 1)
127 (while (<= i 5)
128 (setq prod (* i prod))
129 (setq i (1+ i)))
130 prod))
131
132 (pass-if "dotimes"
133 (progn (setq a 0)
134 (setq count 100)
135 (setq b (dotimes (i count)
136 (setq j (1+ i))
137 (setq a (+ a j))))
138 (setq c (dotimes (i 10 42) nil))
139 (and (= a 5050) (equal b nil) (= c 42))))
140
141 (pass-if "dolist"
142 (let ((mylist '(7 2 5)))
143 (setq sum 0)
144 (setq a (dolist (i mylist)
145 (setq sum (+ sum i))))
146 (setq b (dolist (i mylist 5) 0))
147 (and (= sum (+ 7 2 5))
148 (equal a nil)
149 (equal mylist '(7 2 5))
150 (equal b 5)))))
151
152 (with-test-prefix/compile "Exceptions"
153
154 (pass-if "catch without exception"
155 (and (setq a 0)
156 (= (catch 'foobar
157 (setq a (1+ a))
158 (setq a (1+ a))
159 a)
160 2)
161 (= (catch (+ 1 2) a) 2)))
162
163 ; FIXME: Figure out how to do this...
164 ;(pass-if-exception "uncaught exception" 'elisp-exception
165 ; (throw 'abc 1))
166
167 (pass-if "catch and throw"
168 (and (setq mylist '(1 2))
169 (= (catch 'abc (throw 'abc 2) 1) 2)
170 (= (catch 'abc (catch 'def (throw 'abc (1+ 0)) 2) 3) 1)
171 (= (catch 'abc (catch 'def (throw 'def 1) 2) 3) 3)
172 (= (catch mylist (catch '(1 2) (throw mylist 1) 2) 3) 1)))
173
174 (pass-if "unwind-protect"
175 (progn (setq a 0 b 1 c 1)
176 (catch 'exc
177 (unwind-protect (progn (setq a 1)
178 (throw 'exc 0))
179 (setq a 0)
180 (setq b 0)))
181 (unwind-protect nil (setq c 0))
182 (and (= a 0) (= b 0) (= c 0)
183 (= (unwind-protect 42 1 2 3) 42)))))
184
185 (with-test-prefix/compile "Eval"
186
187 (pass-if-equal "basic eval" 3
188 (progn (setq code '(+ 1 2))
189 (eval code)))
190
191 (pass-if "real dynamic code"
192 (and (setq a 1 b 1 c 1)
193 (defun set-code (var val)
194 (list 'setq var val))
195 (= a 1) (= b 1) (= c 1)
196 (eval (set-code 'a '(+ 2 3)))
197 (eval (set-code 'c 42))
198 (= a 5) (= b 1) (= c 42)))
199
200 ; Build code that recursively again and again calls eval. What we want is
201 ; something like:
202 ; (eval '(1+ (eval '(1+ (eval 1)))))
203 (pass-if "recursive eval"
204 (progn (setq depth 10 i depth)
205 (setq code '(eval 0))
206 (while (not (zerop i))
207 (setq code (#{`}# (eval (quote (1+ (#{,}# code))))))
208 (setq i (1- i)))
209 (= (eval code) depth))))
210
211
212 ; Test handling of variables.
213 ; ===========================
214
215 (with-test-prefix/compile "Variable Setting/Referencing"
216
217 ; TODO: Check for variable-void error
218
219 (pass-if-equal "setq and reference" 6
220 (progn (setq a 1 b 2 c 3)
221 (+ a b c)))
222 (pass-if-equal "setq evaluation order" 1
223 (progn (setq a 0 b 0)
224 (setq a 1 b a)))
225 (pass-if-equal "setq value" 2
226 (progn (setq a 1 b 2)))
227
228 (pass-if "set and symbol-value"
229 (progn (setq myvar 'a)
230 (and (= (set myvar 42) 42)
231 (= a 42)
232 (= (symbol-value myvar) 42))))
233 (pass-if "void variables"
234 (progn (setq a 1 b 2)
235 (and (eq (makunbound 'b) 'b)
236 (boundp 'a)
237 (not (boundp 'b)))))
238
239 (pass-if "disabled void check (all)"
240 (progn (makunbound 'a) a t)
241 #:opts '(#:disable-void-check all))
242 (pass-if "disabled void check (symbol list)"
243 (progn (makunbound 'a) a t)
244 #:opts '(#:disable-void-check (x y a b)))
245 (pass-if "without-void-checks"
246 (progn (makunbound 'a)
247 (= (without-void-checks (a) a 5) 5))))
248
249 (with-test-prefix/compile "Let and Let*"
250
251 (pass-if-equal "let without value" nil-value
252 (let (a (b 5)) a))
253 (pass-if-equal "basic let" 0
254 (progn (setq a 0)
255 (let ((a 1)
256 (b a))
257 b)))
258
259 (pass-if "let*"
260 (progn (setq a 0)
261 (and (let* ((a 1)
262 (b a))
263 (= b 1))
264 (let* (a b)
265 (setq a 1 b 2)
266 (and (= a 1) (= b 2)))
267 (= a 0)
268 (not (boundp 'b)))))
269
270 (pass-if "local scope"
271 (progn (setq a 0)
272 (setq b (let (a)
273 (setq a 1)
274 a))
275 (and (= a 0)
276 (= b 1)))))
277
278 (with-test-prefix/compile "Lexical Scoping"
279
280 (pass-if "basic let semantics"
281 (and (setq a 1)
282 (lexical-let ((a 2) (b a))
283 (and (= a 2) (= b 1)))
284 (lexical-let* ((a 2) (b a))
285 (and (= a 2) (= b 2) (setq a 42) (= a 42)))
286 (= a 1)))
287
288 (pass-if "lexical scope with lexical-let's"
289 (and (setq a 1)
290 (defun dyna () a)
291 (lexical-let (a)
292 (setq a 2)
293 (and (= a 2) (= (dyna) 1)))
294 (= a 1)
295 (lexical-let* (a)
296 (setq a 2)
297 (and (= a 2) (= (dyna) 1)))
298 (= a 1)))
299
300 (pass-if "lexical scoping vs. symbol-value / set"
301 (and (setq a 1)
302 (lexical-let ((a 2))
303 (and (= a 2)
304 (= (symbol-value 'a) 1)
305 (set 'a 3)
306 (= a 2)
307 (= (symbol-value 'a) 3)))
308 (= a 3)))
309
310 (pass-if "let inside lexical-let"
311 (and (setq a 1 b 1)
312 (defun dynvals () (cons a b))
313 (lexical-let ((a 2))
314 (and (= a 2) (equal (dynvals) '(1 . 1))
315 (let ((a 3) (b a))
316 (and (= a 3) (= b 2)
317 (equal (dynvals) '(1 . 2))))
318 (let* ((a 4) (b a))
319 (and (= a 4) (= b 4)
320 (equal (dynvals) '(1 . 4))))
321 (= a 2)))
322 (= a 1)))
323
324 (pass-if "lambda args inside lexical-let"
325 (and (setq a 1)
326 (defun dyna () a)
327 (lexical-let ((a 2) (b 42))
328 (and (= a 2) (= (dyna) 1)
329 ((lambda (a) (and (= a 3) (= b 42) (= (dyna) 3))) 3)
330 ((lambda () (let ((a 3))
331 (and (= a 3) (= (dyna) 1)))))
332 (= a 2) (= (dyna) 1)))
333 (= a 1)))
334
335 (pass-if "closures"
336 (and (defun make-counter ()
337 (lexical-let ((cnt 0))
338 (lambda ()
339 (setq cnt (1+ cnt)))))
340 (setq c1 (make-counter) c2 (make-counter))
341 (= (funcall c1) 1)
342 (= (funcall c1) 2)
343 (= (funcall c1) 3)
344 (= (funcall c2) 1)
345 (= (funcall c2) 2)
346 (= (funcall c1) 4)
347 (= (funcall c2) 3)))
348
349 (pass-if "always lexical option (all)"
350 (progn (setq a 0)
351 (defun dyna () a)
352 (let ((a 1))
353 (and (= a 1) (= (dyna) 0))))
354 #:opts '(#:always-lexical all))
355 (pass-if "always lexical option (list)"
356 (progn (setq a 0 b 0)
357 (defun dyna () a)
358 (defun dynb () b)
359 (let ((a 1)
360 (b 1))
361 (and (= a 1) (= (dyna) 0)
362 (= b 1) (= (dynb) 1))))
363 #:opts '(#:always-lexical (a)))
364 (pass-if "with-always-lexical"
365 (progn (setq a 0)
366 (defun dyna () a)
367 (with-always-lexical (a)
368 (let ((a 1))
369 (and (= a 1) (= (dyna) 0))))))
370
371 (pass-if "lexical lambda args"
372 (progn (setq a 1 b 1)
373 (defun dyna () a)
374 (defun dynb () b)
375 (with-always-lexical (a c)
376 ((lambda (a b &optional c)
377 (and (= a 3) (= (dyna) 1)
378 (= b 2) (= (dynb) 2)
379 (= c 1)))
380 3 2 1))))
381
382 ; Check if a lambda without dynamically bound arguments
383 ; is tail-optimized by doing a deep recursion that would otherwise overflow
384 ; the stack.
385 (pass-if "lexical lambda tail-recursion"
386 (with-always-lexical (i)
387 (setq to 1000000)
388 (defun iteration-1 (i)
389 (if (< i to)
390 (iteration-1 (1+ i))))
391 (iteration-1 0)
392 (setq x 0)
393 (defun iteration-2 ()
394 (if (< x to)
395 (setq x (1+ x))
396 (iteration-2)))
397 (iteration-2)
398 t)))
399
400
401 (with-test-prefix/compile "defconst and defvar"
402
403 (pass-if-equal "defconst without docstring" 3.141
404 (progn (setq pi 3)
405 (defconst pi 3.141)
406 pi))
407 (pass-if-equal "defconst value" 'pi
408 (defconst pi 3.141 "Pi"))
409
410 (pass-if-equal "defvar without value" 42
411 (progn (setq a 42)
412 (defvar a)
413 a))
414 (pass-if-equal "defvar on already defined variable" 42
415 (progn (setq a 42)
416 (defvar a 1 "Some docstring is also ok")
417 a))
418 (pass-if-equal "defvar on undefined variable" 1
419 (progn (makunbound 'a)
420 (defvar a 1)
421 a))
422 (pass-if-equal "defvar value" 'a
423 (defvar a)))
424
425
426 ; Functions and lambda expressions.
427 ; =================================
428
429 (with-test-prefix/compile "Lambda Expressions"
430
431 (pass-if-equal "required arguments" 3
432 ((lambda (a b c) c) 1 2 3))
433
434 (pass-if-equal "optional argument" 3
435 ((function (lambda (a &optional b c) c)) 1 2 3))
436 (pass-if-equal "optional missing" nil-value
437 ((lambda (&optional a) a)))
438
439 (pass-if-equal "rest argument" '(3 4 5)
440 ((lambda (a b &rest c) c) 1 2 3 4 5))
441 (pass-if-equal "rest missing" nil-value
442 ((lambda (a b &rest c) c) 1 2)))
443
444 (with-test-prefix/compile "Function Definitions"
445
446 (pass-if-equal "defun" 3
447 (progn (defun test (a b) (+ a b))
448 (test 1 2)))
449 (pass-if-equal "defun value" 'test
450 (defun test (a b) (+ a b)))
451
452 (pass-if "fset and symbol-function"
453 (progn (setq myfunc 'x x 5)
454 (and (= (fset myfunc 42) 42)
455 (= (symbol-function myfunc) 42)
456 (= x 5))))
457 (pass-if "void function values"
458 (progn (setq a 1)
459 (defun test (a b) (+ a b))
460 (fmakunbound 'a)
461 (fset 'b 5)
462 (and (fboundp 'b) (fboundp 'test)
463 (not (fboundp 'a))
464 (= a 1))))
465
466 (pass-if "flet and flet*"
467 (progn (defun foobar () 42)
468 (defun test () (foobar))
469 (and (= (test) 42)
470 (flet ((foobar (lambda () 0))
471 (myfoo (symbol-function 'foobar)))
472 (and (= (myfoo) 42)
473 (= (test) 0)))
474 (flet* ((foobar (lambda () 0))
475 (myfoo (symbol-function 'foobar)))
476 (= (myfoo) 0))
477 (flet (foobar)
478 (defun foobar () 0)
479 (= (test) 0))
480 (= (test) 42)))))
481
482 (with-test-prefix/compile "Calling Functions"
483
484 (pass-if-equal "recursion" 120
485 (progn (defun factorial (n prod)
486 (if (zerop n)
487 prod
488 (factorial (1- n) (* prod n))))
489 (factorial 5 1)))
490
491 (pass-if "dynamic scoping"
492 (progn (setq a 0)
493 (defun foo ()
494 (setq a (1+ a))
495 a)
496 (defun bar (a)
497 (foo))
498 (and (= 43 (bar 42))
499 (zerop a))))
500
501 (pass-if "funcall and apply argument handling"
502 (and (defun allid (&rest args) args)
503 (setq allid-var (symbol-function 'allid))
504 (equal (funcall allid-var 1 2 3) '(1 2 3))
505 (equal (funcall allid-var) nil)
506 (equal (funcall allid-var 1 2 '(3 4)) '(1 2 (3 4)))
507 (equal (funcall allid-var '()) '(()))
508 (equal (apply allid-var 1 2 '(3 4)) '(1 2 3 4))
509 (equal (apply allid-var '(1 2)) '(1 2))
510 (equal (apply allid-var '()) nil)))
511
512 (pass-if "raw functions with funcall"
513 (and (= (funcall '+ 1 2) 3)
514 (= (funcall (lambda (a b) (+ a b)) 1 2) 3)
515 (= (funcall '(lambda (a b) (+ a b)) 1 2) 3))))
516
517
518 ; Quoting and Backquotation.
519 ; ==========================
520
521 (with-test-prefix/compile "Quotation"
522
523 (pass-if "quote"
524 (and (equal '42 42) (equal '"abc" "abc")
525 (equal '(1 2 (3 (4) x)) '(1 2 (3 (4) x)))
526 (not (equal '(1 2 (3 4 (x))) '(1 2 3 4 x)))
527 (equal '(1 2 . 3) '(1 2 . 3))))
528
529 (pass-if "simple backquote"
530 (and (equal (#{`}# 42) 42)
531 (equal (#{`}# (1 (a))) '(1 (a)))
532 (equal (#{`}# (1 . 2)) '(1 . 2))))
533 (pass-if "unquote"
534 (progn (setq a 42 l '(18 12))
535 (and (equal (#{`}# (#{,}# a)) 42)
536 (equal (#{`}# (1 a ((#{,}# l)) . (#{,}# a))) '(1 a ((18 12)) . 42)))))
537 (pass-if "unquote splicing"
538 (progn (setq l '(18 12) empty '())
539 (and (equal (#{`}# (#{,@}# l)) '(18 12))
540 (equal (#{`}# (l 2 (3 (#{,@}# l)) ((#{,@}# l)) (#{,@}# l)))
541 '(l 2 (3 18 12) (18 12) 18 12))
542 (equal (#{`}# (1 2 (#{,@}# empty) 3)) '(1 2 3))))))
543
544
545
546 ; Macros.
547 ; =======
548
549 (with-test-prefix/compile "Macros"
550
551 (pass-if-equal "defmacro value" 'magic-number
552 (defmacro magic-number () 42))
553
554 (pass-if-equal "macro expansion" 1
555 (progn (defmacro take-first (a b) a)
556 (take-first 1 (/ 1 0)))))
557
558
559 ; Test the built-ins.
560 ; ===================
561
562 (with-test-prefix/compile "Equivalence Predicates"
563
564 (pass-if "equal"
565 (and (equal 2 2) (not (equal 1 2))
566 (equal "abc" "abc") (not (equal "abc" "ABC"))
567 (equal 'abc 'abc) (not (equal 'abc 'def))
568 (equal '(1 2 (3 4) 5) '(1 2 (3 4) 5))
569 (not (equal '(1 2 3 4 5) '(1 2 (3 4) 5)))))
570
571 (pass-if "eq"
572 (progn (setq some-list '(1 2))
573 (setq some-string "abc")
574 (and (eq 2 2) (not (eq 1 2))
575 (eq 'abc 'abc) (not (eq 'abc 'def))
576 (eq some-string some-string) (not (eq some-string "abc"))
577 (eq some-list some-list) (not (eq some-list '(1 2)))))))
578
579 (with-test-prefix/compile "Number Built-Ins"
580
581 (pass-if "floatp"
582 (and (floatp 1.0) (not (floatp 1)) (not (floatp 'a))))
583 (pass-if "integerp"
584 (and (integerp 42) (integerp -2) (not (integerp 1.0))))
585 (pass-if "numberp"
586 (and (numberp 1.0) (numberp -2) (not (numberp 'a))))
587 (pass-if "wholenump"
588 (and (wholenump 0) (not (wholenump -2)) (not (wholenump 1.0))))
589 (pass-if "zerop"
590 (and (zerop 0) (zerop 0.0) (not (zerop 1))))
591
592 (pass-if "comparisons"
593 (and (= 1 1.0) (/= 0 1)
594 (< 1 2) (> 2 1) (>= 1 1) (<= 1 1)
595 (not (< 1 1)) (not (<= 2 1))))
596
597 (pass-if "max and min"
598 (and (= (max -5 2 4.0 1) 4.0) (= (min -5 2 4.0 1) -5)
599 (= (max 1) 1) (= (min 1) 1)))
600 (pass-if "abs"
601 (and (= (abs 1.0) 1.0) (= (abs -5) 5)))
602
603 (pass-if "float"
604 (and (= (float 1) 1) (= (float 5.5) 5.5)
605 (floatp (float 1))))
606
607 (pass-if-equal "basic arithmetic operators" -8.5
608 (+ (1+ 0) (1- 0) (- 5.5) (* 2 -2) (- 2 1)))
609 (pass-if "modulo"
610 (= (% 5 3) 2))
611
612 (pass-if "floating point rounding"
613 (and (= (ffloor 1.7) 1.0) (= (ffloor -1.2) -2.0) (= (ffloor 1.0) 1.0)
614 (= (fceiling 1.2) 2.0) (= (fceiling -1.7) -1.0) (= (fceiling 1.0) 1.0)
615 (= (ftruncate 1.6) 1.0) (= (ftruncate -1.7) -1.0)
616 (= (fround 1.2) 1.0) (= (fround 1.7) 2.0) (= (fround -1.7) -2.0))))
617
618 (with-test-prefix/compile "List Built-Ins"
619
620 (pass-if "consp and atomp"
621 (and (consp '(1 2 3)) (consp '(1 2 . 3)) (consp '(a . b))
622 (not (consp '())) (not (consp 1)) (not (consp "abc"))
623 (atomp 'a) (atomp '()) (atomp -1.5) (atomp "abc")
624 (not (atomp '(1 . 2))) (not (atomp '(1)))))
625 (pass-if "listp and nlistp"
626 (and (listp '(1 2 3)) (listp '(1)) (listp '()) (listp '(1 . 2))
627 (not (listp 'a)) (not (listp 42)) (nlistp 42)
628 (not (nlistp '())) (not (nlistp '(1 2 3))) (not (nlistp '(1 . 2)))))
629 (pass-if "null"
630 (and (null '()) (not (null 1)) (not (null '(1 2))) (not (null '(1 . 2)))))
631
632 (pass-if "car and cdr"
633 (and (equal (car '(1 2 3)) 1) (equal (cdr '(1 2 3)) '(2 3))
634 (equal (car '()) nil) (equal (cdr '()) nil)
635 (equal (car '(1 . 2)) 1) (equal (cdr '(1 . 2)) 2)
636 (null (cdr '(1)))))
637 (pass-if "car-safe and cdr-safe"
638 (and (equal (car-safe '(1 2)) 1) (equal (cdr-safe '(1 2)) '(2))
639 (equal (car-safe 5) nil) (equal (cdr-safe 5) nil)))
640
641 (pass-if "pop"
642 (progn (setq mylist '(a b c))
643 (setq value (pop mylist))
644 (and (equal value 'a)
645 (equal mylist '(b c)))))
646 (pass-if-equal "push" '(a b c)
647 (progn (setq mylist '(b c))
648 (push 'a mylist)))
649
650 (pass-if "nth and nthcdr"
651 (and (equal (nth -5 '(1 2 3)) 1) (equal (nth 3 '(1 2 3)) nil)
652 (equal (nth 0 '(1 2 3)) 1) (equal (nth 2 '(1 2 3)) 3)
653 (equal (nthcdr -5 '(1 2 3)) '(1 2 3))
654 (equal (nthcdr 4 '(1 2 3)) nil)
655 (equal (nthcdr 1 '(1 2 3)) '(2 3))
656 (equal (nthcdr 2 '(1 2 3)) '(3))))
657
658 (pass-if "length"
659 (and (= (length '()) 0)
660 (= (length '(1 2 3 4 5)) 5)
661 (= (length '(1 2 (3 4 (5)) 6)) 4)))
662
663 (pass-if "cons, list and make-list"
664 (and (equal (cons 1 2) '(1 . 2)) (equal (cons 1 '(2 3)) '(1 2 3))
665 (equal (cons 1 '()) '(1))
666 (equal (list 'a) '(a)) (equal (list) '()) (equal (list 1 2) '(1 2))
667 (equal (make-list 3 42) '(42 42 42))
668 (equal (make-list 0 1) '())))
669 (pass-if "append"
670 (and (equal (append '(1 2) '(3 4) '(5)) '(1 2 3 4 5))
671 (equal (append '(1 2) 3) '(1 2 . 3))))
672 (pass-if "reverse"
673 (and (equal (reverse '(5 4 3 2 1)) '(1 2 3 4 5))
674 (equal (reverse '()) '())))
675 (pass-if "copy-tree"
676 (progn (setq mylist '(1 2 (3 4)))
677 (and (not (eq mylist (copy-tree mylist)))
678 (equal mylist (copy-tree mylist)))))
679
680 (pass-if "number-sequence"
681 (and (equal (number-sequence 5) '(5))
682 (equal (number-sequence 5 9) '(5 6 7 8 9))
683 (equal (number-sequence 5 9 3) '(5 8))
684 (equal (number-sequence 5 1 -2) '(5 3 1))
685 (equal (number-sequence 5 8 -1) '())
686 (equal (number-sequence 5 1) '())
687 (equal (number-sequence 5 5 0) '(5))))
688
689 (pass-if "setcar and setcdr"
690 (progn (setq pair '(1 . 2))
691 (setq copy pair)
692 (setq a (setcar copy 3))
693 (setq b (setcdr copy 4))
694 (and (= a 3) (= b 4)
695 (equal pair '(3 . 4))))))