changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/rt/obj.lisp

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))