Added simple rt compability layer (RT api backed by fiveam's explainers)
[fiveam.git] / src / rt.lisp
1 (defpackage :fiveam.rt
2   (:use :fiveam :common-lisp)
3   (:export #:deftest
4            #:*test*
5            #:do-test
6            #:*do-tests-when-defined*
7            #:get-test
8            #:rem-test
9            #:rem-all-tests
10            #:do-tests
11            #:pending-tests
12            #:continue-testing))
13
14 (in-package :fiveam.rt)
15
16 (fiveam:def-suite :rt
17   :description "Suite holding all tests defined via the RT compatability layer.")
18
19 (defvar *test* nil)
20
21 (defvar *tests* '())
22
23 (defvar *do-tests-when-defined* nil)
24
25 (defmacro deftest (name form &rest values)
26   `(progn
27      (push (list ',name ',form (list ,@values)) *tests*)
28      (def-test ,name ()
29        (is-true (every #'equal (multiple-value-list ,name) (list ,@values))))
30      (when *do-tests-when-defined*
31        (do-test ',name))
32      (setf *test* ',name)))
33
34 (defun do-test (&optional (name *test*))
35   (setf *test* name)
36   (let ((results (run name)))
37     (if (every #'fiveam::test-passed-p result)
38         name
39         (progn
40           (explain (make-instance 'fiveam::detailed-text-explainer) results)
41           nil))))
42
43 (defun get-test (&optional (name *test*))
44   (find name *tests* :test #'eql :key #'first))
45
46 (defun rem-test (&optional (name *test*))
47   (if (get-test name)
48       (progn
49         (setf *tests* (delete name *tests* :test #'eql :key #'first))
50         (remhash name (fiveam::tests (get-test :rt)))
51         name)
52       nil))
53
54 (defun rem-all-tests ()
55   (clrhash (fiveam::tests (get-test :rt)))
56   (setf *tests* '()))
57
58 (defun do-tests (&optional (out *standard-output*))
59   (loop
60     for test in *tests*
61     nconc (run (get-test (first test))) into results
62     finally (explain (make-instance 'fiveam::detailed-text-explainer) results)
63     finally (return (every #'fiveam::test-passed-p results))))