changeset 698: | 96958d3eb5b0 |
parent: | bbd9024f2fe2 |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: | -rw-r--r-- |
description: | fixes |
632
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
1 | ;;; obj.lisp --- Test Objects |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
2 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
3 | ;; |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
4 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
5 | ;;; Code: |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
6 | (in-package :rt) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
7 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
8 | ;;; Result |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
9 | (deftype result-tag () |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
10 | '(or (member :pass :fail :skip) null)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
11 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
12 | (declaim (inline %make-test-result)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
13 | (defstruct (test-result (:constructor %make-test-result) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
14 | (:conc-name tr-)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
15 | (tag nil :type result-tag :read-only t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
16 | (form nil :type form)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
17 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
18 | (defmethod print-object ((self test-result) stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
19 | (print-unreadable-object (self stream :identity t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
20 | (format stream "~A ~A" (tr-tag self) (tr-form self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
21 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
22 | (defun make-test-result (tag &optional form) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
23 | (%make-test-result :tag tag :form form)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
24 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
25 | (defmethod test-pass-p ((res test-result)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
26 | (when (eq :pass (tr-tag res)) t)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
27 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
28 | (defmethod test-fail-p ((res test-result)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
29 | (when (eq :fail (tr-tag res)) t)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
30 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
31 | (defmethod test-skip-p ((res test-result)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
32 | (when (eq :skip (tr-tag res)) t)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
33 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
34 | (defmethod print-object ((self test-result) stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
35 | (print-unreadable-object (self stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
36 | (format stream "~A ~A" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
37 | (tr-tag self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
38 | (tr-form self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
39 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
40 | ;;; Test Object |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
41 | (defclass test-object () |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
42 | ((name :initarg :name :initform (required-argument) :type string :accessor test-name) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
43 | #+nil (cached :initarg :cache :allocation :class :accessor test-cached-p :type boolean)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
44 | (:documentation "Super class for all test-related objects.")) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
45 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
46 | (defmethod print-object ((self test-object) stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
47 | "test" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
48 | (print-unreadable-object (self stream :type t :identity t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
49 | (format stream "~A" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
50 | (test-name self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
51 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
52 | ;;;; Tests |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
53 | (defclass test (test-object) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
54 | ((fn :type symbol :accessor test-fn) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
55 | (bench :type (or boolean fixnum) :accessor test-bench :initform nil :initarg :bench) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
56 | (profile :type list :accessor test-profile :initform nil :initarg :profile) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
57 | (args :type list :accessor test-args :initform nil :initarg :args) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
58 | (declare :type list :accessor test-declare :initform nil :initarg :declare) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
59 | (form :initarg :form :initform nil :accessor test-form) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
60 | (doc :initarg :doc :type string :accessor test-doc) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
61 | (lock :initarg :lock :type boolean :accessor test-lock-p) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
62 | (persist :initarg :persist :initform nil :type boolean :accessor test-persist-p) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
63 | (results :initarg :results :type (array test-result) :accessor test-results)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
64 | (:documentation "Test class typically made with `deftest'.")) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
65 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
66 | (defmethod initialize-instance ((self test) &key name) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
67 | ;; (debug! "building test" name) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
68 | (setf (test-fn self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
69 | (make-symbol |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
70 | (format nil "~A~A" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
71 | name |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
72 | (gensym *test-suffix*)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
73 | (setf (test-lock-p self) t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
74 | ;; TODO 2023-09-21: we should count how many checks are in the :form |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
75 | ;; slot and infer the array dimensions. |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
76 | (setf (test-results self) (make-array 0 :element-type 'test-result)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
77 | (call-next-method)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
78 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
79 | (defmethod print-object ((self test) stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
80 | (print-unreadable-object (self stream :type t :identity t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
81 | (format stream "~A :fn ~A" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
82 | (test-name self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
83 | (test-fn self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
84 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
85 | (defmethod push-result ((self test-result) (place test)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
86 | (with-slots (results) place |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
87 | (push self results))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
88 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
89 | (defmethod pop-result ((self test)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
90 | (pop (test-results self))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
91 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
92 | (defmethod eval-test ((self test)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
93 | (eval `(progn ,@(test-form self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
94 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
95 | (defmethod funcall-test ((self test) &key declare) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
96 | (unless (functionp (test-fn self)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
97 | (trace! (setf (symbol-function (test-fn self)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
98 | (eval `(lambda () |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
99 | ,(when declare `(declare ,declare)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
100 | ,@(test-form self)))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
101 | (funcall (test-fn self))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
102 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
103 | (defmethod compile-test ((self test) &key declare &allow-other-keys) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
104 | (with-compilation-unit (:policy '(optimize debug)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
105 | (compile |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
106 | (test-fn self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
107 | `(lambda () |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
108 | ,(when declare `(declare ,declare)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
109 | ,@(test-form self))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
110 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
111 | (defun fail! (form &optional fmt &rest args) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
112 | (let ((reason (and fmt (apply #'format nil fmt args)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
113 | (with-simple-restart (ignore-fail "Continue testing.") |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
114 | (error 'test-failed :reason reason :form form)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
115 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
116 | (defmacro with-test-env (self &body body) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
117 | `(catch '%in-test |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
118 | (setf (test-lock-p ,self) t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
119 | (let* ((*testing* ,self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
120 | (%test-bail nil) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
121 | %test-result) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
122 | (block %test-bail |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
123 | ,@body |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
124 | (setf (test-lock-p ,self) %test-bail)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
125 | %test-result))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
126 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
127 | (defmethod do-test ((self test) &optional fx) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
128 | (declare (ignorable fx)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
129 | (with-test-env self |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
130 | (trace! "running test: " *testing*) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
131 | (flet ((%do () |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
132 | (if-let ((opt *compile-tests*)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
133 | ;; RESEARCH 2023-08-31: with-compilation-unit? |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
134 | (progn |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
135 | (if (eq opt t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
136 | (setq opt *test-opts*) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
137 | (setq opt (push *test-opts* opt))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
138 | ;; TODO 2023-09-21: handle failures here |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
139 | (funcall (compile-test self :declare opt)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
140 | (setf %test-result (make-test-result :pass (test-fn self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
141 | (progn |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
142 | (funcall-test self :declare '(optimize (debug 3) (safety 0))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
143 | (setf %test-result (make-test-result :pass (test-name self))))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
144 | (if *catch-test-errors* |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
145 | (handler-bind |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
146 | ((error |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
147 | (lambda (c) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
148 | (setf %test-bail t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
149 | (setf %test-result (make-test-result :fail c)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
150 | (return-from %test-bail %test-result)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
151 | (%do)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
152 | (%do))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
153 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
154 | (defmethod do-test ((self simple-string) &optional fixture) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
155 | (when-let ((test (find-test *test-suite* self))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
156 | (do-test test fixture))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
157 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
158 | (defmethod do-test ((self symbol) &optional fixture) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
159 | (when-let ((test (find-test *test-suite* (symbol-name self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
160 | (do-test test fixture))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
161 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
162 | ;;;; Suites |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
163 | (defclass test-suite (test-object) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
164 | ((tests :initarg :set :initform nil :type list :accessor tests |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
165 | :documentation "test-suite tests") |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
166 | (results :initarg :results :initform nil :type list :accessor test-results |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
167 | :documentation "test-suite results") |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
168 | (stream :initarg :stream :initform *standard-output* :type stream :accessor test-stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
169 | (fixtures :initarg :fixtures :initform nil :type list :accessor test-fixtures)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
170 | (:documentation "A class for collections of related `test' objects.")) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
171 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
172 | (defmethod print-object ((self test-suite) stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
173 | (print-unreadable-object (self stream :type t :identity t) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
174 | (format stream "~A [~d:~d:~d:~d]" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
175 | (test-name self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
176 | (length (tests self)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
177 | (count t (map-tests self #'test-lock-p)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
178 | (count t (map-tests self #'test-persist-p)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
179 | (length (test-results self))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
180 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
181 | ;; (defmethod reinitialize-instance ((self test-suite) &rest initargs &key &allow-other-keys)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
182 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
183 | (deftype test-suite-designator () |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
184 | "Either nil, a symbol, a string, or a `test-suite' object." |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
185 | '(or null symbol string test-suite keyword)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
186 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
187 | (defun find-suite (name) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
188 | (declare (test-suite-designator name)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
189 | (find name *test-suite-list* :test #'test-name=)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
190 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
191 | (defmethod map-tests ((self test-suite) function) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
192 | ;; tests are stored in reverse order. run LIFO. |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
193 | (mapcar function (reverse (tests self)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
194 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
195 | (defmethod push-test ((self test) (place test-suite)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
196 | (push self (tests place))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
197 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
198 | (defmethod pop-test ((self test-suite)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
199 | (pop (tests self))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
200 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
201 | (defmethod push-result ((self test-result) (place test-suite)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
202 | (with-slots (results) place |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
203 | (push self results))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
204 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
205 | (defmethod pop-result ((self test-suite)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
206 | (pop (test-results self))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
207 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
208 | (defmethod find-test ((self test-suite) name &key (test #'test-name=)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
209 | (declare (type (or string symbol) name) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
210 | (type function test)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
211 | (find name (tests self) :test test)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
212 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
213 | (defmethod do-test ((self test-suite) &optional test) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
214 | (push-result |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
215 | (if test |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
216 | (do-test |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
217 | (etypecase test |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
218 | (test test) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
219 | (string (find-test self test)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
220 | (symbol (find-test self (symbol-name test))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
221 | (do-test (pop-test self))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
222 | self)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
223 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
224 | ;; HACK 2023-09-01: find better method of declaring failures from |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
225 | ;; within the body of `deftest'. |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
226 | (defmethod do-suite ((self test-suite) &key stream force) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
227 | (when stream (setf (test-stream self) stream)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
228 | (with-slots (name stream) self |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
229 | (format stream "in suite ~x:~%" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
230 | name) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
231 | (format stream "; with ~A~A tests~%" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
232 | (if force |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
233 | "" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
234 | (format nil "~A/" |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
235 | (count t (tests self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
236 | :key (lambda (x) (or (test-lock-p x) (test-persist-p x)))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
237 | (length (tests self))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
238 | ;; loop over each test, calling `do-test'. if locked or |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
239 | ;; persistent, test is performed. if FORCE is non-nil all tests |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
240 | ;; are performed. |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
241 | (map-tests self |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
242 | (lambda (x) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
243 | (when (or force (test-lock-p x) (test-persist-p x)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
244 | (let ((res (do-test x))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
245 | (push-result res self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
246 | (format stream "~@[~<~%~:;~:@(~S~) ~>~]~%" res))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
247 | ;; compare locked vs expected |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
248 | (let ((locked (remove-if #'null (map-tests self (lambda (x) (when (test-lock-p x) x))))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
249 | (fails |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
250 | ;; collect if locked test not expected |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
251 | (loop for r in (test-results self) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
252 | unless (test-pass-p r) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
253 | collect r))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
254 | (if (null locked) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
255 | (format stream "~&No tests failed.~%") |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
256 | (progn |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
257 | ;; RESEARCH 2023-09-04: print fails ?? |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
258 | (format stream "~&~A out of ~A ~ |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
259 | total tests failed: ~ |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
260 | ~:@(~{~<~% ~1:;~S~>~ |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
261 | ~^, ~}~)." |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
262 | (length locked) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
263 | (length (tests self)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
264 | locked) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
265 | (unless (null fails) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
266 | (format stream "~&~A unexpected failures: ~ |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
267 | ~:@(~{~<~% ~1:;~S~>~ |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
268 | ~^, ~}~)." |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
269 | (length fails) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
270 | fails)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
271 | ;; close stream |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
272 | (finish-output stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
273 | ;; return values (PASS? LOCKED) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
274 | (values (not fails) locked)))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
275 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
276 | (defmethod do-suite ((self string) &key stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
277 | (do-suite (ensure-suite self) :stream stream)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
278 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
279 | (defmethod do-suite ((self symbol) &key stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
280 | (do-suite (ensure-suite self) :stream stream)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
281 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
282 | (defmethod do-suite ((self null) &key stream) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
283 | (do-suite *test-suite* :stream stream)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
284 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
285 | ;;; Fixtures |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
286 | ;; Our fixtures are objects which can be inherited to build different fixture |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
287 | ;; classes. Fixtures inherit from TEST-OBJECT and have a NAME which usually |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
288 | ;; indicates the key used to initialize this object with MAKE-INSTANCE. |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
289 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
290 | ;; You can use fixtures inside a test or use the push-fixture method on a |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
291 | ;; `test-suite' object to make it accessible within that suite. |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
292 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
293 | (defclass fixture (test-object) ()) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
294 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
295 | (defclass tmp-fixture (fixture) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
296 | ((directory :initform #P"/tmp/" :type directory :initarg :directory) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
297 | (file :initform nil :type (or null pathname string) :initarg :file)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
298 | (:default-initargs |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
299 | :name :tmp)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
300 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
301 | (defmethod make-fixture ((kind (eql :tmp)) &rest args) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
302 | (apply 'make-instance 'tmp-fixture args)) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
303 | |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
304 | (defmacro with-fixture ((var (kind &rest args)) &body body) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
305 | `(let ((,var (make-fixture ,kind ,@args))) |
bbd9024f2fe2
lib/rt upgrades and refactoring
Richard Westhaver <ellis@rwest.io>
parents:
diff
changeset
|
306 | ,@body)) |