1 ;;;-*- Mode: Lisp; Package: LIFT -*-
5 See file COPYING for license
9 (in-package #:lift-test
)
11 (deftestsuite lift-test
() ())
13 ;;; ---------------------------------------------------------------------------
15 ;;; make sure that ensure and its friends work as expected
17 ;;; The strategy here is to pair "regular" tests with meta-tests. The
18 ;;; regular tests are normal tests written using LIFT. The meta-tests
19 ;;; use run-tests or run-tests to run the regular test and then grovel
20 ;;; over the returned test-result to make sure it contains what it is
23 ;;; Note that if we don't pass in :report-pathname nil, then we'll get a lot
24 ;;; of spurious extra report files...
25 ;;; ---------------------------------------------------------------------------
27 (deftestsuite lift-test-ensure
(lift-test) ())
29 (deftestsuite lift-test-ensure-helper
() ())
31 (addtest (lift-test-ensure-helper)
35 (addtest (lift-test-ensure)
37 (let ((tr (run-test :suite
'lift-test-ensure-helper
38 :name
'simple-ensure-test-1
)))
39 (ensure-same (length (tests-run tr
)) 1)
40 (ensure-null (failures tr
))
41 (ensure-null (errors tr
))
42 (ensure-same (test-mode tr
) :single
)
43 (ensure-same (mapcar #'second
(tests-run tr
))
44 '(lift-test::simple-ensure-test-1
))))
46 ;;; ---------------------------------------------------------------------------
48 (addtest (lift-test-ensure-helper)
52 (addtest (lift-test-ensure)
54 (let ((tr (run-test :suite
'lift-test-ensure-helper
55 :name
'simple-ensure-test-2
)))
56 (ensure-same (length (tests-run tr
)) 1 :report
"Number of tests-run")
57 (ensure-same (length (failures tr
)) 1 :report
"Number of failures")
58 (ensure-null (errors tr
) :report
"Number of errors")
59 (ensure-same (mapcar #'second
(tests-run tr
))
60 '(lift-test::simple-ensure-test-2
))))
62 ;;; ---------------------------------------------------------------------------
64 (addtest (lift-test-ensure-helper)
66 (ensure (let ((x 0)) (/ x
))))
68 (addtest (lift-test-ensure)
70 (let ((tr (run-test :suite
'lift-test-ensure-helper
71 :name
'simple-ensure-test-3
)))
72 (ensure-same (length (tests-run tr
)) 1)
73 (ensure-same (length (failures tr
)) 0)
74 (ensure-same (length (errors tr
)) 1)
75 (ensure-same (mapcar #'second
(tests-run tr
))
76 '(lift-test::simple-ensure-test-3
))))
79 ;;; ---------------------------------------------------------------------------
80 ;;; lift-test-setup-teardown
81 ;;; make sure that setup and teardown happen in the right order
82 ;;; ---------------------------------------------------------------------------
84 (deftestsuite lift-test-setup-teardown
(lift-test) ())
86 (deftestsuite lift-test-setup-teardown-1
(lift-test-setup-teardown) ()
87 (:setup
(push 1 *test-notepad
*))
88 (:teardown
(push :a
*test-notepad
*))
89 (:tests
(setup-teardown-1 (push 'test-1
*test-notepad
*))))
91 (addtest (lift-test-setup-teardown)
93 (setf *test-notepad
* nil
)
95 :name
'setup-teardown-1
96 :suite
'lift-test-setup-teardown-1
97 :result
(make-test-result 'lift-test-setup-teardown-1
:single
))
98 (ensure-same (reverse *test-notepad
*)
101 (addtest (lift-test-setup-teardown)
103 (setf *test-notepad
* nil
)
105 :suite
'lift-test-setup-teardown-1
106 :result
(make-test-result 'lift-test-setup-teardown-1
:multiple
)
107 :report-pathname nil
)
108 (ensure-same (reverse *test-notepad
*)
109 '(1 test-1
:a
1 2 test-2
:b
:a
1 2 3 test-3
:c
:b
:a
)))
111 (deftestsuite lift-test-setup-teardown-2
(lift-test-setup-teardown-1) ()
112 (:setup
(push 2 *test-notepad
*))
113 (:teardown
(push :b
*test-notepad
*))
114 (:tests
(setup-teardown-2 (push 'test-2
*test-notepad
*))))
116 (deftestsuite lift-test-setup-teardown-3
(lift-test-setup-teardown-2) ()
117 (:setup
(push 3 *test-notepad
*))
118 (:teardown
(push :c
*test-notepad
*))
119 (:tests
(setup-teardown-3 (push 'test-3
*test-notepad
*))))
121 (addtest (lift-test-setup-teardown)
123 (setf *test-notepad
* nil
)
125 :name
'setup-teardown-3
126 :suite
'lift-test-setup-teardown-3
127 :result
(make-test-result 'lift-test-setup-teardown-3
:single
))
128 (ensure-same (reverse *test-notepad
*)
129 '(1 2 3 test-3
:c
:b
:a
)))
131 (addtest (lift-test-setup-teardown)
133 (setf *test-notepad
* nil
)
135 :suite
'lift-test-setup-teardown-3
136 :result
(make-test-result 'lift-test-setup-teardown-3
:multiple
)
137 :report-pathname nil
)
138 (ensure-same (reverse *test-notepad
*)
139 '(1 2 3 test-3
:c
:b
:a
)))
141 ;;; ---------------------------------------------------------------------------
143 ;;; ---------------------------------------------------------------------------
145 (deftestsuite lift-test-ensure-same
(lift-test)
148 ;;?? Gary King 2004-06-21: not really a test yet, more of a syntax works check
149 (addtest (lift-test-ensure-same)
150 (ensure-same 2 2 :test
=)
151 (ensure-same 2 2 :test
'=)
152 (ensure-same 2 2 :test
#'=))
154 ;;; ---------------------------------------------------------------------------
155 ;;; test single setup
156 ;;; ---------------------------------------------------------------------------
158 (deftestsuite test-single-setup
(lift-test) ())
161 (deftestsuite test-single-setup-helper
() ())
163 (deftestsuite test-single-setup-child-a
(test-single-setup-helper) ()
164 (:setup
(push :a
*test-notepad
*))
165 (:test
(test-1 (ensure t
))))
167 (deftestsuite test-single-setup-child-a-1
(test-single-setup-child-a) ()
168 (:setup
(push :a-1
*test-notepad
*))
169 (:test
(test-1 (ensure t
)))
170 (:test
(test-2 (ensure t
))))
172 (deftestsuite test-single-setup-child-b
(test-single-setup-helper) ()
173 (:setup
(push :b
*test-notepad
*))
174 (:test
(test-1 (ensure t
))))
176 (deftestsuite test-single-setup-child-b-1-ss
(test-single-setup-child-b) ()
177 (:run-setup
:once-per-suite
)
178 (:setup
(push :b-1
*test-notepad
*))
179 (:test
(test-1 (ensure t
)))
180 (:test
(test-2 (ensure t
))))
182 (deftestsuite test-single-setup-child-b-1-a
(test-single-setup-child-b-1-ss) ()
183 (:setup
(push :b-1-a
*test-notepad
*))
184 (:test
(test-1 (ensure t
)))
185 (:test
(test-2 (ensure t
))))
187 (deftestsuite test-single-setup-child-b-1-b
(test-single-setup-child-b-1-ss) ()
188 (:setup
(push :b-1-b
*test-notepad
*))
189 (:test
(test-1 (ensure t
)))
190 (:test
(test-2 (ensure t
))))
192 (deftestsuite test-single-setup-child-c
(test-single-setup-helper) ()
193 (:setup
(push :c
*test-notepad
*))
194 (:test
(test-1 (ensure t
))))
196 (deftestsuite test-single-setup-child-c-1
(test-single-setup-child-c) ()
197 (:setup
(push :c-1
*test-notepad
*))
198 (:test
(test-1 (ensure t
))))
200 ;;; ---------------------------------------------------------------------------
202 (addtest (test-single-setup)
203 test-a-multiple-setup
204 (setf *test-notepad
* nil
)
205 (run-test :suite
'test-single-setup-child-a-1
:name
'test-1
)
206 (run-test :suite
'test-single-setup-child-a-1
:name
'test-2
)
207 (ensure-same *test-notepad
* '(:a-1
:a
:a-1
:a
)))
209 (addtest (test-single-setup)
210 test-b-single-setup-1
211 (setf *test-notepad
* nil
)
212 (run-test :suite
'test-single-setup-child-b-1-ss
:name
'test-1
)
213 (run-test :suite
'test-single-setup-child-b-1-ss
:name
'test-2
)
214 ;; single tests do all the setup so this should be exactly the same
215 (ensure-same *test-notepad
* '(:b-1
:b
:b-1
:b
)))
217 (addtest (test-single-setup)
218 test-a-single-setup-2
219 (setf *test-notepad
* nil
)
220 (run-tests :suite
'test-single-setup-child-a-1
:do-children? nil
221 :report-pathname nil
)
222 (ensure-same *test-notepad
* '(:a-1
:a
:a-1
:a
)))
224 (addtest (test-single-setup)
225 test-a-single-setup-3
226 (setf *test-notepad
* nil
)
227 (run-tests :suite
'test-single-setup-child-a-1
228 :run-setup
:once-per-suite
230 :report-pathname nil
)
231 (ensure-same *test-notepad
* '(:a-1
:a
:a-1
:a
)))
233 (addtest (test-single-setup)
234 test-b-single-setup-2
235 (setf *test-notepad
* nil
)
236 (run-tests :suite
'test-single-setup-child-b-1-ss
:do-children? nil
237 :report-pathname nil
)
238 (ensure-same *test-notepad
* '(:b-1
:b
)))
240 ;;; ---------------------------------------------------------------------------
242 ;;; ---------------------------------------------------------------------------
244 (deftestsuite test-ignore-warnings
(lift-test) ())
246 (deftestsuite test-ignore-warnings-helper
() ())
248 (deftestsuite test-ignore-warnings-helper-warning
(test-ignore-warnings-helper) ()
250 (push :a
*test-scratchpad
*)
252 (push :b
*test-scratchpad
*))))
254 (deftestsuite test-ignore-warnings-helper-no-warning
(test-ignore-warnings-helper) ()
256 (push :a
*test-scratchpad
*)
258 (push :b
*test-scratchpad
*))))
260 (addtest (test-ignore-warnings)
262 (run-test :suite
'test-ignore-warnings-helper-warning
:name
'do-it
)
263 (ensure-same *test-scratchpad
* '(:b
:a
)))
265 (addtest (test-ignore-warnings)
267 (run-test :suite
'test-ignore-warnings-helper-no-warning
:name
'do-it
)
268 (ensure-same *test-scratchpad
* '(:b
:a
)))
270 ;;; ---------------------------------------------------------------------------
271 ;;; test-environment stays clean
272 ;;; ---------------------------------------------------------------------------
274 (deftestsuite lift-test-environment-pristine
(lift-test) ()
275 (:setup
(setf *test-environment
* nil
)))
277 (deftestsuite lift-test-environment-pristine-helper
()
281 (addtest (lift-test-environment-pristine-helper)
283 (ensure-same (* a a
) b
))
285 (addtest (lift-test-environment-pristine
286 :expected-failure
"This is no longer guarenteed; I'm not sure yet whether or not this is a good thing.")
288 (run-test :suite
'lift-test-environment-pristine-helper
:name
'do-it
)
289 (ensure (null *test-environment
*)))
292 ;;; ---------------------------------------------------------------------------
293 ;;; test-creating-multiple-tests
294 ;;; ---------------------------------------------------------------------------
296 (deftestsuite test-creating-multiple-tests
(lift-test)
299 (deftestsuite test-creating-multiple-tests-helper
()
301 (:tests
((ensure-same 1 1)
303 ((ensure-same 3 3))))
305 (addtest (test-creating-multiple-tests)
307 (ensure-same (testsuite-test-count 'test-creating-multiple-tests-helper
) 2))
311 (defvar *dynamics-before-setup
* :dbs
)
313 (deftestsuite dynamics-before-setup
(lift-test)
315 :setup
(setf *test-notepad
* nil
))
317 (deftestsuite dynamics-before-setup-helper
()
318 ((slot (progn (push :slot
*test-notepad
*) :slot
)))
319 :dynamic-variables
(*dynamics-before-setup
*
320 (progn (push :dynamics
*test-notepad
*) :dynamics
))
321 :setup
(push :setup
*test-notepad
*))
323 (addtest (dynamics-before-setup-helper)
325 (push :test
*test-notepad
*)
326 (ensure-same *dynamics-before-setup
* :dynamics
))
328 (addtest (dynamics-before-setup)
330 (run-test :suite
'dynamics-before-setup-helper
332 (ensure-same (reverse *test-notepad
*)
333 '(:slot
:dynamics
:setup
:test
)))
337 ;;; inherited functions
339 (deftestsuite test-inherited-functions-helper
()
343 (ensure-same (+ a b
) c
:test
'=))))
345 (deftestsuite test-inherited-functions-pos
(test-inherited-functions-helper)
347 (:tests
((really?
1 2 3))
350 (deftestsuite test-inherited-functions-neg
(test-inherited-functions-helper)
352 (:tests
((really? -
4 -
2 -
6))
353 ((really? -
1 -
1 -
2))))
355 (deftestsuite test-inherited-functions
(lift-test)
358 (addtest (test-inherited-functions)
360 (let ((tr (run-tests :suite
'test-inherited-functions-helper
361 :report-pathname nil
)))
362 (ensure-same (length (tests-run tr
)) 4)
363 (ensure-null (failures tr
))
364 (ensure-null (errors tr
))))
368 ;;; slot initialization takes place with every setup
370 (deftestsuite test-initialize-slots-helper
()
371 ((slot (incf *test-notepad
*))))
373 (addtest (test-initialize-slots-helper)
377 (addtest (test-initialize-slots-helper)
381 (deftestsuite test-initialize-slots
(lift-test)
383 (:setup
(setf *test-notepad
* 0)))
385 (addtest (test-initialize-slots)
386 slot-initform-evaluated-every-time
387 (let ((tr (run-tests :suite
'test-initialize-slots-helper
388 :report-pathname nil
)))
389 (ensure-same (length (tests-run tr
)) 2)
390 (ensure-same *test-notepad
* 2 :test
'=)))
393 ;;; errors during tests are reported in the test result
395 (defun cause-an-error ()
396 (error "this is an error"))
398 (deftestsuite test-error-catching
(lift-test)
401 (deftestsuite test-error-catching-helper-slot-init
()
402 ((x (cause-an-error))))
404 (addtest (test-error-catching-helper-slot-init)
408 (addtest (test-error-catching)
410 (let ((result (run-test :suite
'test-error-catching-helper-slot-init
412 (ensure-same 1 (length (lift::suites-run result
)))
413 (ensure-same 1 (length (errors result
)))))
417 (deftestsuite test-error-catching-helper-body
()
420 (addtest (test-error-catching-helper-body)
424 (addtest (test-error-catching)
426 (let ((result (run-test :suite
'test-error-catching-helper-body
428 (ensure-same 1 (length (tests-run result
)))
429 (ensure-same 1 (length (errors result
)))))
433 (deftestsuite test-error-catching-helper-setup
()
438 (addtest (test-error-catching-helper-setup)
442 (addtest (test-error-catching)
444 (let ((result (run-test :suite
'test-error-catching-helper-setup
446 (ensure-same 1 (length (tests-run result
)))
447 (ensure-same 1 (length (errors result
)))))
451 (deftestsuite test-error-catching-helper-teardown
()
456 (addtest (test-error-catching-helper-teardown)
460 (addtest (test-error-catching)
462 (let ((result (run-test :suite
'test-error-catching-helper-teardown
464 (ensure-same 1 (length (tests-run result
)))
465 (ensure-same 1 (length (errors result
)))))
469 (defvar *test-error-catching-helper
*)
471 (deftestsuite test-error-catching-helper-dynamic-variables
()
474 (*test-error-catching-helper
* (cause-an-error))))
476 (addtest (test-error-catching-helper-dynamic-variables)
480 (addtest (test-error-catching)
481 helper-dynamic-variables
482 (let ((result (run-test :suite
'test-error-catching-helper-dynamic-variables
483 :name
'dynamic-variables
)))
484 (ensure-same 1 (length (lift::suites-run result
)))
485 (ensure-same 1 (length (errors result
)))))
489 (deftestsuite test-error-catching-helper-equality-test
()
494 (addtest (test-error-catching-helper-equality-test)
498 (addtest (test-error-catching)
500 (let ((result (run-test :suite
'test-error-catching-helper-equality-test
501 :name
'equality-test
)))
502 (ensure-same 0 (length (lift::suites-run result
))) ;hmmm
503 (ensure-same 1 (length (errors result
)))))
507 (deftestsuite test-interaction
(lift-test)
509 (:equality-test
#'string
=))
511 (addtest (test-interaction)
513 (run-test :suite
'lift-test-ensure-helper
:name
'simple-ensure-test-3
)
515 (symbol-name lift
::*current-test-case-name
*)
516 (symbol-name 'simple-ensure-test-3
))
518 (symbol-name lift
::*current-testsuite-name
*)
519 (symbol-name 'lift-test-ensure-helper
)))
521 (addtest (test-interaction)
522 run-tests-sets-values
523 (run-tests :suite
'lift-test-ensure-helper
524 :report-pathname nil
)
526 (symbol-name lift
::*current-testsuite-name
*)
527 (symbol-name 'lift-test-ensure-helper
))
529 (symbol-name lift
::*current-test-case-name
*)
530 (symbol-name 'simple-ensure-test-3
)))
532 (addtest (test-interaction)
533 run-test-sets-values-nested
534 (run-test :suite
'test-interaction
:test-case
'run-tests-sets-values
)
536 (symbol-name lift
::*current-testsuite-name
*)
537 (symbol-name 'test-interaction
))
539 (symbol-name lift
::*current-test-case-name
*)
540 (symbol-name 'run-tests-sets-values
)))
544 (deftestsuite test-expected-errors
(lift-test)
547 (deftestsuite test-expected-errors-helper
()
550 (addtest (test-expected-errors-helper
553 (error "this is an error"))
555 (addtest (test-expected-errors)
557 (let ((result (run-tests :suite
'test-expected-errors-helper
558 :report-pathname nil
)))
559 (ensure-same 1 (length (tests-run result
)))
560 (ensure-same 0 (length (errors result
)))
561 (ensure-same 1 (length (expected-errors result
)))
564 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
565 (defparameter *test-expected-errors-helper-2
* nil
))
567 (deftestsuite test-expected-errors-helper-2
()
570 (addtest (test-expected-errors-helper-2
571 :expected-error
*test-expected-errors-helper-2
*)
573 (error "this is an error"))
575 (addtest (test-expected-errors)
576 test-expected-error-helper-true
577 (let* ((*test-expected-errors-helper-2
* t
)
578 (result (run-tests :suite
'test-expected-errors-helper-2
579 :report-pathname nil
)))
580 (ensure-same 1 (length (tests-run result
)))
581 (ensure-same 0 (length (errors result
)))
582 (ensure-same 1 (length (expected-errors result
)))
585 (addtest (test-expected-errors)
586 test-expected-error-helper-false
587 (let* ((*test-expected-errors-helper-2
* nil
)
588 (result (run-tests :suite
'test-expected-errors-helper-2
589 :report-pathname nil
)))
590 (ensure-same 1 (length (tests-run result
)))
591 (ensure-same 1 (length (errors result
)))
592 (ensure-same 0 (length (expected-errors result
)))
595 (addtest (test-expected-errors)
596 donot-break-on-errors
598 ;; I wonder if it's worth trying to abstract "up"
599 (let ((*debugger-hook
* (lambda (condition hook
)
600 (declare (ignore hook
))
601 (when (find-restart 'entered-debugger
)
602 (invoke-restart 'entered-debugger condition
))
603 (invoke-debugger condition
))))
605 (let ((result (run-tests :suite
'test-expected-errors-helper
607 :break-on-errors? t
)))
608 (ensure-same 1 (length (tests-run result
)))
609 (ensure-same 0 (length (errors result
)))
610 (ensure-same 1 (length (expected-errors result
)))
612 (entered-debugger (c)
614 (ensure-null "We should not be here")))))
618 ;;?? these pass but the cliquep test did not seem to be working. Why?
619 (deftestsuite test-scratchpad-resets
(lift-test)
622 (deftestsuite test-scratchpad-resets-helper
()
625 (test-3 (push :test
*test-scratchpad
*)))
627 (test-4 (push :burt
*test-scratchpad
*))))
629 (addtest (test-scratchpad-resets)
631 (run-test :suite
'test-scratchpad-resets-helper
:test-case
'test-3
)
632 (ensure-same '(:test
) *test-scratchpad
*))
634 (addtest (test-scratchpad-resets)
636 (run-test :suite
'test-scratchpad-resets-helper
:test-case
'test-3
)
637 (run-test :suite
'test-scratchpad-resets-helper
:test-case
'test-3
)
638 (ensure-same '(:test
) *test-scratchpad
*))
640 (addtest (test-scratchpad-resets)
641 run-twice-have-one-run-tests
642 (run-tests :suite
'test-scratchpad-resets-helper
:report-pathname nil
)
643 (run-tests :suite
'test-scratchpad-resets-helper
:report-pathname nil
)
644 (ensure-same '(:burt
) *test-scratchpad
*))
648 (deftestsuite test-break-on-failure
(lift-test)
651 (deftestsuite test-break-on-failure-helper
()
653 ;; :categories (foo bar)
656 (addtest (test-break-on-failure-helper)
658 (ensure-null "this fails"))
660 (addtest (test-break-on-failure)
661 donot-break-on-failures
662 (let* ((*test-break-on-failures?
* nil
)
663 (result (run-tests :suite
'test-break-on-failure-helper
664 :report-pathname nil
)))
665 (ensure-same 1 (length (tests-run result
)))
666 (ensure-same 1 (length (failures result
)))))
668 (addtest (test-break-on-failure)
670 (let* ((*test-break-on-failures?
* t
)
671 (*debugger-hook
* (lambda (condition hook
)
672 (declare (ignore hook
))
673 (when (find-restart 'entered-debugger
)
674 (invoke-restart 'entered-debugger condition
))
675 (invoke-debugger condition
)))
678 (setf result
(run-tests :suite
'test-break-on-failure-helper
679 :report-pathname nil
))
680 (entered-debugger (c)
682 (setf *test-scratchpad
* t
)))
684 (ensure-same *test-scratchpad
* t
:test
'eq
)))
688 (deftestsuite ensure-no-warning
(lift-test)
691 (deftestsuite ensure-no-warning-helper
()
694 (addtest (ensure-no-warning-helper)
696 (ensure-no-warning (ensure-same (+ 2 2) 4)))
698 (addtest (ensure-no-warning-helper)
700 (ensure-no-warning (ensure-same (+ 2 2) 4)
701 (warn "I like math")))
703 (addtest (ensure-no-warning)
705 (let ((result (run-tests :suite
'ensure-no-warning-helper
706 :report-pathname nil
)))
707 (ensure-same (length (tests-run result
)) 2)
708 (ensure-same (length (failures result
)) 1)
709 (ensure-same (length (errors result
)) 0)))