changelog shortlog graph tags branches changeset files file revisions raw help

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

changeset 577: 806c2b214df8
parent: da17bf652e48
child: 568c39371122
author: Richard Westhaver <ellis@rwest.io>
date: Sun, 04 Aug 2024 20:51:07 -0400
permissions: -rw-r--r--
description: refactored q/tests, added rt/fuzz, more sql query work
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; rt.lisp --- regression testing
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
3
 ;; Regression Testing framework. inspired by PCL, the original CMUCL
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
4
 ;; code, and the SBCL port.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
5
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
6
 ;;; Commentary:
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
7
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
8
 ;; - :rt https://www.merl.com/publications/docs/TR91-04.pdf Chapter 1
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
9
 ;; - :com.gigamonkeys.test https://github.com/gigamonkey/monkeylib-test-framework
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
10
 ;; - :sb-rt https://github.com/sbcl/sbcl/blob/master/contrib/sb-rt/rt.lisp
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
11
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
12
 ;; This package is intended to provide a modernized Lisp testing
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
13
 ;; library with features found in some of the test frameworks listed
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
14
 ;; below.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
15
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
16
 ;; - :it.bese.fiveam https://github.com/lispci/fiveam
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
17
 ;; - :try https://github.com/melisgl/try
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
18
 ;; - :rove https://github.com/fukamachi/rove
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
19
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
20
 ;;; TODO:
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
21
 #|
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
22
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
23
 - [ ] benchmark support: do-bench, test-count, 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
24
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
25
 - [ ] fixtures api
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
26
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
27
 - [ ] profiling 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
28
 |#
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
29
 ;;; Code:
449
7ca2e98f0847 x updates
Richard Westhaver <ellis@rwest.io>
parents: 448
diff changeset
30
 (in-package :std-user)
7ca2e98f0847 x updates
Richard Westhaver <ellis@rwest.io>
parents: 448
diff changeset
31
 (require 'sb-cover)
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
32
 (defpackage :rt
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
33
   (:use 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
34
    :cl :std :sxp :log
286
237756e1358b enforcing log level (todo), rt finessing to get x to test instead of fail
Richard Westhaver <ellis@rwest.io>
parents: 284
diff changeset
35
    :sb-aprof)
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
36
   (:export
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 229
diff changeset
37
    :test-error
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
38
    :*test-opts*
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
39
    :*compile-tests*
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
40
    :*catch-test-errors*
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
41
    :*test-suffix*
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
42
    :*default-test-suite-name*
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
43
    :*test-suite*
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
44
    :*test-suite-list*
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
45
    ;;  TODO 2023-09-04: :*test-profiler-list* not yet
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
46
    :*testing*
513
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
47
    :random-elt
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
48
    :random-ref
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
49
    :random-char
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
50
    :random-chars
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
51
    :random-bytes
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
52
    :test-suite-designator
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
53
    :check-suite-designator
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
54
    :make-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
55
    :make-suite
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
56
    :test-name=
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
57
    :do-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
58
    :do-tests
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
59
    :reset-tests
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
60
    :continue-testing
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
61
    :with-test-env
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
62
    :%test-bail
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
63
    :%test-result
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
64
    :make-test-result
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
65
    :ensure-suite
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
66
    :test-fixture
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
67
    :fixture-prototype
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
68
    :make-fixture-prototype
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
69
    :make-fixture
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
70
    :with-fixture
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
71
    :test-result
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
72
    :test-fn
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
73
    :test-pass-p
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
74
    :test-fail-p
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
75
    :test-skip-p
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
76
    :test-failed
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
77
    :fail!
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
78
    :is
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
79
    :signals
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
80
    :deftest
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
81
    :defsuite
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
82
    :in-suite
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
83
    :eval-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
84
    :compile-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
85
    :locked-tests
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
86
    :push-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
87
    :pop-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
88
    :delete-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
89
    :find-test
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
90
    :find-suite
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
91
    :do-suite
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
92
    :test-object
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
93
    :test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
94
    :test-fixture
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
95
    :test-suite
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
96
    :test-name
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
97
    :tests
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
98
    :test-form
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
99
    :test-results))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
100
 
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
101
 (defpackage :rt/bench
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
102
   (:nicknames :bench)
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
103
   (:use :cl :std :log :rt)
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
104
   (:export
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
105
    :*bench-count*
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
106
    :defbench
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
107
    :do-bench))
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
108
 
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 229
diff changeset
109
 (uiop:define-package :rt/cover
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
110
   (:nicknames :cover)
448
a37b1d3371fc fasl tweaks
Richard Westhaver <ellis@rwest.io>
parents: 437
diff changeset
111
   (:use :cl :std :log :rt)
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
112
   (:export
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
113
    :with-coverage :start-coverage :stop-coverage
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
114
    :*coverage-directory*
286
237756e1358b enforcing log level (todo), rt finessing to get x to test instead of fail
Richard Westhaver <ellis@rwest.io>
parents: 284
diff changeset
115
    :coverage-report))
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
116
 
215
0d11384aae81 rt tests
Richard Westhaver <ellis@rwest.io>
parents: 211
diff changeset
117
 (defpackage :rt/tracing
0d11384aae81 rt tests
Richard Westhaver <ellis@rwest.io>
parents: 211
diff changeset
118
   (:nicknames :tracing)
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
119
   (:use :cl :std :log :rt)
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
120
   (:export
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
121
    :start-tracing
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
122
    :stop-tracing
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
123
    :with-tracing
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
124
    :save-report
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
125
    ;; Extra utility
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
126
    :package-symbols-except))
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
127
 
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
128
 (defpackage :rt/flamegraph
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
129
   (:nicknames :flamegraph)
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
130
   (:use :cl :std :log :rt :sb-sprof)
215
0d11384aae81 rt tests
Richard Westhaver <ellis@rwest.io>
parents: 211
diff changeset
131
   (:export :save-flamegraph))
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
132
 
577
806c2b214df8 refactored q/tests, added rt/fuzz, more sql query work
Richard Westhaver <ellis@rwest.io>
parents: 514
diff changeset
133
 (defpackage :rt/fuzz
806c2b214df8 refactored q/tests, added rt/fuzz, more sql query work
Richard Westhaver <ellis@rwest.io>
parents: 514
diff changeset
134
   (:nicknames :fuzz)
806c2b214df8 refactored q/tests, added rt/fuzz, more sql query work
Richard Westhaver <ellis@rwest.io>
parents: 514
diff changeset
135
   (:use :cl :std :log :rt)
806c2b214df8 refactored q/tests, added rt/fuzz, more sql query work
Richard Westhaver <ellis@rwest.io>
parents: 514
diff changeset
136
   (:export :fuzzer
806c2b214df8 refactored q/tests, added rt/fuzz, more sql query work
Richard Westhaver <ellis@rwest.io>
parents: 514
diff changeset
137
            :fuzz
806c2b214df8 refactored q/tests, added rt/fuzz, more sql query work
Richard Westhaver <ellis@rwest.io>
parents: 514
diff changeset
138
            :fuzz*))
806c2b214df8 refactored q/tests, added rt/fuzz, more sql query work
Richard Westhaver <ellis@rwest.io>
parents: 514
diff changeset
139
 
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
140
 (in-package :rt)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
141
 (in-readtable :std)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
142
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
143
 ;;; Vars
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
144
 (defvar *test-opts* '(optimize sb-c::instrument-consing))
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
145
 (defvar *compile-tests* nil
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
146
   "When nil do not compile tests. With a value of t, tests are compiled
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
147
 with default optimizations else the value is used to configure
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
148
 compiler optimizations.")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
149
 (defvar *catch-test-errors* t "When non-nil, cause errors in a test to be caught.")
284
597f34d43df7 x.lisp upgrades, skel upgrades, worked on shell reader macros
Richard Westhaver <ellis@rwest.io>
parents: 282
diff changeset
150
 (defvar *test-suffix* "-TEST" "A suffix to append to every `test' defined with `deftest'.")
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
151
 (defvar *test-suite-list* nil "List of available `test-suite' objects.")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
152
 (defvar *test-suite* nil "A 'test-suite-designator' which identifies the current `test-suite'.")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
153
 (eval-when (:compile-toplevel :load-toplevel :execute)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
154
   (defvar *default-test-suite-name* "default"))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
155
 (declaim (type (or stream boolean string) *test-input*))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
156
 (defvar *test-input* nil "When non-nil, specifies an input stream or buffer for `*testing*'.")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
157
 (defvar *testing* nil "Testing state var.")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
158
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
159
 ;;; Utils
513
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
160
 
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
161
 ;; random
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
162
 (defvar *simple-charset* "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
163
 
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
164
 (defun random-elt (seq)
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
165
   (elt seq (random (length seq))))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
166
 
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
167
 (defun random-ref (vec)
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
168
   (aref vec (random (length vec))))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
169
 
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
170
 (defun random-char ()
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
171
   (random-ref *simple-charset*))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
172
 
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
173
 (defun random-chars (dim)
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
174
   (let ((r (make-array dim :element-type 'character)))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
175
     (dotimes (i (array-total-size r) r)
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
176
       (setf (row-major-aref r i) (random-char)))))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
177
 
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
178
 (defun random-byte () (random 255))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
179
 
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
180
 (defun random-bytes (dim)
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
181
   (let ((r (make-array dim :element-type 'octet)))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
182
     (dotimes (i (array-total-size r) r)
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
183
       (setf (row-major-aref r i) (random-byte)))))
4cdf71621bae more tpc-h
Richard Westhaver <ellis@rwest.io>
parents: 503
diff changeset
184
 
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
185
 (eval-when (:compile-toplevel :load-toplevel :execute)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
186
   (defun make-test (&rest slots)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
187
     (apply #'make-instance 'test slots))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
188
   (defun make-suite (&rest slots)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
189
     (apply #'make-instance 'test-suite slots)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
190
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
191
 ;; TODO 2023-09-04: optimize
274
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
192
 ;;(declaim (inline do-tests))
229
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
193
 (defun do-tests (&optional (suite *test-suite*) force (output *standard-output*))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
194
   (if (pathnamep output)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
195
       (with-open-file (stream output :direction :output)
229
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
196
 	(do-suite (ensure-suite suite) :stream stream :force force))
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
197
       (do-suite (ensure-suite suite) :stream output :force force)))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
198
 
274
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
199
 (defvar *test-output-mutex* (sb-thread:make-mutex :name "tests-output"))
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
200
 
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
201
 ;; TODO
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
202
 (defun do-tests-concurrently (&optional (suite *test-suite*) force (output *standard-output*))
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
203
   (declare (ignore suite force))
274
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
204
   (sb-thread:with-mutex (*test-output-mutex*)
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
205
     (let ((stream (make-synonym-stream output)))
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
206
       (let ((*standard-output* stream)
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
207
             (*error-output* stream))
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
208
         (nyi!)))))
5f782d361e08 threads and db tweaks. fixed a tricky macro error caused by string-case, dat/html now works.
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
209
 
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
210
 (defun reset-tests ()
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
211
   (setq *testing* nil
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
212
         *test-suite* nil
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
213
         *test-suite-list* nil
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
214
         *test-input* nil))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
215
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
216
 ;; this assumes that *test-suite* is re-initialized correctly to the
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
217
 ;; correct test-suite object.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
218
 (defun continue-testing ()
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
219
   (if-let ((test *testing*))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
220
     (throw '%in-test test)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
221
     (do-suite *test-suite*)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
222
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
223
 ;; NOTE 2023-09-01: `pushnew' does not return an indication of whether
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
224
 ;; place is changed - it returns place. This is functionally sound but
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
225
 ;; means that if we want to do something else in the event that place
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
226
 ;; is unchanged, we run into some friction,
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
227
 ;; https://stackoverflow.com/questions/56228832/adapting-common-lisp-pushnew-to-return-success-failure
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
228
 (defun spush (item lst &key (test #'equal))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
229
   "Substituting `push'"
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
230
   (declare (type function test))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
231
   (cond
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
232
     ((null lst) (push item lst))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
233
     ((list lst)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
234
      (if-let ((found (member item lst
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
235
 			     :test test)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
236
        (progn
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
237
 	 (rplaca found item)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
238
 	 lst)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
239
        (push item lst)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
240
     #|(or nil '(t (cons item lst)))|#))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
241
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
242
 ;; FIX 2023-08-31: spush, replace with `add-test' method.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
243
 ;; (declaim (inline normalize-test-name))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
244
 (defun normalize-test-name (a)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
245
   "Return the normalized `test-suite-designator' of A."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
246
   (etypecase a
215
0d11384aae81 rt tests
Richard Westhaver <ellis@rwest.io>
parents: 211
diff changeset
247
     (string (string-upcase a))
0d11384aae81 rt tests
Richard Westhaver <ellis@rwest.io>
parents: 211
diff changeset
248
     (symbol (symbol-name a))
0d11384aae81 rt tests
Richard Westhaver <ellis@rwest.io>
parents: 211
diff changeset
249
     (test-object (normalize-test-name (test-name a)))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
250
     (t (format nil "~A" a))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
251
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
252
 (defun test-name= (a b)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
253
   "Return t if A and B are similar `test-suite-designator's."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
254
   (let ((a (normalize-test-name a))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
255
 	(b (normalize-test-name b)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
256
     (string= a b)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
257
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
258
 ;; (declaim (inline assert-suite ensure-suite))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
259
 (defun ensure-suite (name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
260
   (if-let ((ok (member name *test-suite-list* :test #'test-name=)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
261
     (car ok)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
262
     (when (or (eq name t) (null name)) (make-suite :name *default-test-suite-name*))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
263
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
264
 (defun check-suite-designator (suite) (check-type suite test-suite-designator))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
265
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
266
 (defun assert-suite (name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
267
   (check-suite-designator name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
268
   (assert (ensure-suite name)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
269
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
270
 (declaim (inline test-opt-key-p test-opt-valid-p))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
271
 (defun test-opt-key-p (k)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
272
   "Test if K is a `test-opt-key'."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
273
   (member k '(:profile :save :stream)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
274
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
275
 (defun test-opt-valid-p (f)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
276
   "Test if F is a valid `test-opt' form. If so, return F else nil."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
277
   (when (test-opt-key-p (car f))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
278
     f))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
279
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
280
 ;;; Conditions
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
281
 (define-condition test-failed (error)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
282
   ((reason :accessor fail-reason :initarg :reason :initform "unknown")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
283
    (name :accessor fail-name :initarg :name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
284
    (form :accessor fail-form :initarg :form))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
285
   (:documentation "Signaled when a test fails.")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
286
   (:report (lambda (c s)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
287
 	     (format s "The following expression failed: ~S~%~A."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
288
 		     (fail-form c)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
289
 		     (fail-reason c)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
290
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
291
 ;;; Protocol
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
292
 (defgeneric eval-test (self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
293
   (:documentation "Eval a `test'."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
294
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
295
 (defgeneric compile-test (self &key &allow-other-keys)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
296
   (:documentation "Compile a `test'."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
297
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
298
 (defgeneric locked-tests (self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
299
   (:documentation "Return a list of locked tests in `test-suite' object SELF."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
300
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
301
 (defgeneric push-test (self place)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
302
   (:documentation
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
303
    "Push `test' SELF to the value of slot ':tests' in `test-suite' object PLACE."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
304
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
305
 (defgeneric pop-test (self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
306
   (:documentation
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
307
    "Pop the first `test' from the slot-value of ':tests' in `test-suite' object SELF."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
308
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
309
 (defgeneric push-result (self place)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
310
   (:documentation
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
311
    "Push object SELF to the value of slot ':results' in object PLACE."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
312
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
313
 (defgeneric pop-result (self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
314
   (:documentation
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
315
    "Pop the first `test-result' from the slot-value of ':tests' from object SELF."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
316
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
317
 (defgeneric push-fixture (self place)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
318
   (:documentation
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
319
    "Push object SELF to the value of slot ':results' in object PLACE."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
320
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
321
 (defgeneric delete-test (self &key &allow-other-keys)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
322
   (:documentation "Delete `test' object specified by `test-object' SELF and optional keys."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
323
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
324
 (defgeneric find-test (self name &key &allow-other-keys)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
325
   (:documentation "Find `test' object specified by name and optional keys."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
326
 
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
327
 (defgeneric do-test (self &optional context)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
328
   (:documentation "Run test SELF, printing results to *standard-output*. The second
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
329
 argument is an optional fixture.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
330
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
331
 SELF can also be a `test-suite', in which case the TESTS slot is
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
332
 queried for the value of TEST. If TEST is not provided, pops the car
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
333
 from TESTS."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
334
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
335
 (defgeneric do-suite (self &key &allow-other-keys)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
336
   (:documentation
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
337
    "Perform actions on `test-suite' object SELF with optional keys."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
338
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
339
 ;;;; Results
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
340
 (deftype result-tag ()
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
341
   '(or (member :pass :fail :skip) null))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
342
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
343
 (declaim (inline %make-test-result))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
344
 (defstruct (test-result (:constructor %make-test-result)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
345
 			(:conc-name  tr-))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
346
   (tag nil :type result-tag :read-only t)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
347
   (form nil :type form))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
348
 
514
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
349
 (defmethod print-object ((self test-result) stream)
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
350
   (print-unreadable-object (self stream :identity t)
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
351
     (format stream "~A ~A" (tr-tag self) (tr-form self))))
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
352
 
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
353
 (defun make-test-result (tag &optional form)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
354
   (%make-test-result :tag tag :form form))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
355
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
356
 (defmethod test-pass-p ((res test-result))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
357
   (when (eq :pass (tr-tag res)) t))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
358
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
359
 (defmethod test-fail-p ((res test-result))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
360
   (when (eq :fail (tr-tag res)) t))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
361
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
362
 (defmethod test-skip-p ((res test-result))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
363
   (when (eq :skip (tr-tag res)) t))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
364
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
365
 (defmethod print-object ((self test-result) stream)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
366
   (print-unreadable-object (self stream)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
367
     (format stream "~A ~A"
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
368
 	    (tr-tag self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
369
 	    (tr-form self))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
370
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
371
 ;;; Objects
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
372
 (defclass test-object ()
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
373
   ((name :initarg :name :initform (required-argument) :type string :accessor test-name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
374
    #+nil (cached :initarg :cache :allocation :class :accessor test-cached-p :type boolean))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
375
   (:documentation "Super class for all test-related objects."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
376
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
377
 (defmethod print-object ((self test-object) stream)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
378
   "test"
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
379
   (print-unreadable-object (self stream :type t :identity t)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
380
     (format stream "~A"
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
381
 	    (test-name self))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
382
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
383
 ;;;; Tests
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
384
 ;; HACK 2023-08-31: inherit sxp?
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
385
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
386
 (defclass test (test-object)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
387
   ((fn :type symbol :accessor test-fn)
514
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
388
    (bench :type (or boolean fixnum) :accessor test-bench :initform nil :initarg :bench)
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
389
    (profile :type list :accessor test-profile :initform nil :initarg :profile)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
390
    (args :type list :accessor test-args :initform nil :initarg :args)
514
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
391
    (declare :type list :accessor test-declare :initform nil :initarg :declare)
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
392
    (form :initarg :form :initform nil :accessor test-form)
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
393
    (doc :initarg :doc :type string :accessor test-doc)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
394
    (lock :initarg :lock :type boolean :accessor test-lock-p)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
395
    (persist :initarg :persist :initform nil :type boolean :accessor test-persist-p)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
396
    (results :initarg :results :type (array test-result) :accessor test-results))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
397
   (:documentation "Test class typically made with `deftest'."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
398
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
399
 (defmethod initialize-instance ((self test) &key name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
400
   ;; (debug! "building test" name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
401
   (setf (test-fn self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
402
 	(make-symbol
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
403
 	 (format nil "~A~A"
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
404
 		 name
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
405
 		 (gensym *test-suffix*))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
406
   (setf (test-lock-p self) t)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
407
   ;; TODO 2023-09-21: we should count how many checks are in the :form
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
408
   ;; slot and infer the array dimensions.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
409
   (setf (test-results self) (make-array 0 :element-type 'test-result))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
410
   (call-next-method))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
411
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
412
 (defmethod print-object ((self test) stream)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
413
   (print-unreadable-object (self stream :type t :identity t)
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
414
     (format stream "~A :fn ~A"
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
415
 	    (test-name self)
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
416
 	    (test-fn self))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
417
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
418
 (defmethod push-result ((self test-result) (place test))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
419
   (with-slots (results) place
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
420
     (push self results)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
421
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
422
 (defmethod pop-result ((self test))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
423
   (pop (test-results self)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
424
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
425
 (defmethod eval-test ((self test))
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
426
   (eval `(progn ,@(test-form self))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
427
 
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
428
 (defmethod funcall-test ((self test) &key declare)
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
429
   (unless (functionp (test-fn self))
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
430
     (trace! (setf (symbol-function (test-fn self))
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
431
                   (eval `(lambda ()
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
432
                            ,(when declare `(declare ,declare))
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
433
                            ,@(test-form self))))))
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
434
   (funcall (test-fn self)))
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
435
 
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
436
 (defmethod compile-test ((self test) &key declare &allow-other-keys)
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
437
   (with-compilation-unit (:policy '(optimize debug))
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
438
     (compile
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
439
      (test-fn self)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
440
      `(lambda ()
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
441
         ,(when declare `(declare ,declare))
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
442
         ,@(test-form self)))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
443
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
444
 (defun fail! (form &optional fmt &rest args)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
445
   (let ((reason (and fmt (apply #'format nil fmt args))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
446
     (with-simple-restart (ignore-fail "Continue testing.")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
447
       (error 'test-failed :reason reason :form form))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
448
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
449
 (defmacro with-test-env (self &body body)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
450
   `(catch '%in-test
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
451
      (setf (test-lock-p ,self) t)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
452
      (let* ((*testing* ,self)
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
453
 	    (%test-bail nil)
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
454
 	    %test-result)
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
455
        (block %test-bail
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
456
 	 ,@body
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
457
 	 (setf (test-lock-p ,self) %test-bail))
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
458
        %test-result)))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
459
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
460
 (defmethod do-test ((self test) &optional fx)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
461
   (declare (ignorable fx))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
462
   (with-test-env self
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
463
     (trace! "running test: " *testing*)
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
464
     (flet ((%do ()
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
465
 	     (if-let ((opt *compile-tests*))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
466
 	       ;; RESEARCH 2023-08-31: with-compilation-unit?
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
467
 	       (progn
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
468
 		 (if (eq opt t)
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
469
                      (setq opt *test-opts*)
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
470
                      (setq opt (push *test-opts* opt)))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
471
 		 ;; TODO 2023-09-21: handle failures here
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
472
 		 (funcall (compile-test self :declare opt))
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
473
 		 (setf %test-result (make-test-result :pass (test-fn self))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
474
 	       (progn
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
475
                  (funcall-test self :declare '(optimize (debug 3) (safety 0)))
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
476
 		 (setf %test-result (make-test-result :pass (test-name self)))))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
477
       (if *catch-test-errors*
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
478
 	  (handler-bind
289
c4682fedd73d added krypt lib, will probably add homer too
Richard Westhaver <ellis@rwest.io>
parents: 286
diff changeset
479
 	      ((error 
365
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 364
diff changeset
480
 		 (lambda (c)
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 364
diff changeset
481
 		   (setf %test-bail t)
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 364
diff changeset
482
 		   (setf %test-result (make-test-result :fail c))
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 364
diff changeset
483
 		   (return-from %test-bail %test-result))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
484
 	    (%do))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
485
 	  (%do)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
486
 
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
487
 (defmethod do-test ((self simple-string) &optional fixture)
464
Richard Westhaver <ellis@rwest.io>
parents: 449
diff changeset
488
   (when-let ((test (find-test *test-suite* self)))
Richard Westhaver <ellis@rwest.io>
parents: 449
diff changeset
489
     (do-test test fixture)))
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
490
 
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
491
 (defmethod do-test ((self symbol) &optional fixture)
464
Richard Westhaver <ellis@rwest.io>
parents: 449
diff changeset
492
   (when-let ((test (find-test *test-suite* (symbol-name self))))
Richard Westhaver <ellis@rwest.io>
parents: 449
diff changeset
493
     (do-test test fixture)))
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
494
 
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
495
 ;;;; Fixtures
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
496
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
497
 ;; Our fixtures are just closures - with a pandoric environment. You
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
498
 ;; might call it a domain-specific object protocol.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
499
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
500
 ;; You can build fixtures inside a test or use the push-fixture
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
501
 ;; method on a `test-suite' object.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
502
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
503
 (deftype fixture () 'form)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
504
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
505
 (declaim (inline %make-fixture-prototype))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
506
 (defstruct (fixture-prototype (:constructor %make-fixture-prototype)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
507
 			      (:conc-name fxp))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
508
   (kind :empty :type keyword)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
509
   (form nil :type form))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
510
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
511
 (defun make-fixture-prototype (kind form)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
512
   (%make-fixture-prototype :kind kind :form form))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
513
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
514
 (defmacro make-fixture (letargs &body ds)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
515
   (let ((letargs (let-binding-transform letargs)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
516
     `(let (,@letargs)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
517
        (dlambda ,@ds))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
518
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
519
 (defmacro with-fixture ((var fx) &body body)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
520
   `(let ((,var ,fx))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
521
      ,@body))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
522
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
523
 ;;;; Suites
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
524
 (defclass test-suite (test-object)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
525
   ((tests :initarg :set :initform nil :type list :accessor tests
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
526
 	  :documentation "test-suite tests")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
527
    (results :initarg :results :initform nil :type list :accessor test-results
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
528
 	    :documentation "test-suite results")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
529
    (stream :initarg :stream :initform *standard-output* :type stream :accessor test-stream)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
530
    (fixtures :initarg :fixtures :initform nil :type list :accessor test-fixtures))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
531
   (:documentation "A class for collections of related `test' objects."))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
532
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
533
 (defmethod print-object ((self test-suite) stream)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
534
   (print-unreadable-object (self stream :type t :identity t)
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
535
     (format stream "~A [~d:~d:~d:~d]"
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
536
 	    (test-name self)
108
ac7ef5ddcaab rt/bench rt/flamegraph rt/trace
ellis <ellis@rwest.io>
parents: 96
diff changeset
537
 	    (length (tests self))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
538
 	    (count t (map-tests self #'test-lock-p))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
539
 	    (count t (map-tests self #'test-persist-p))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
540
 	    (length (test-results self)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
541
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
542
 ;; (defmethod reinitialize-instance ((self test-suite) &rest initargs &key &allow-other-keys))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
543
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
544
 (deftype test-suite-designator ()
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
545
   "Either nil, a symbol, a string, or a `test-suite' object."
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
546
   '(or null symbol string test-suite keyword))
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
547
 
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
548
 (defun find-suite (name)
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
549
   (declare (test-suite-designator name))
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
550
   (find name *test-suite-list* :test #'test-name=))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
551
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
552
 (defmethod map-tests ((self test-suite) function)
503
03c2017b1405 test stuff
Richard Westhaver <ellis@rwest.io>
parents: 464
diff changeset
553
   ;; tests are stored in reverse order. run LIFO.
03c2017b1405 test stuff
Richard Westhaver <ellis@rwest.io>
parents: 464
diff changeset
554
   (mapcar function (reverse (tests self))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
555
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
556
 (defmethod push-test ((self test) (place test-suite))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
557
   (push self (tests place)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
558
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
559
 (defmethod pop-test ((self test-suite))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
560
   (pop (tests self)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
561
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
562
 (defmethod push-result ((self test-result) (place test-suite))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
563
   (with-slots (results) place
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
564
     (push self results)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
565
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
566
 (defmethod pop-result ((self test-suite))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
567
   (pop (test-results self)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
568
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
569
 (defmethod find-test ((self test-suite) name &key (test #'test-name=))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
570
   (declare (type (or string symbol) name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
571
 	   (type function test))
464
Richard Westhaver <ellis@rwest.io>
parents: 449
diff changeset
572
   (find name (tests self) :test test))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
573
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
574
 (defmethod do-test ((self test-suite) &optional test)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
575
   (push-result 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
576
    (if test
282
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
577
        (do-test
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
578
            (etypecase test
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
579
              (test test)
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
580
              (string (find-test self test))
da580c7fe954 upgrades
Richard Westhaver <ellis@rwest.io>
parents: 274
diff changeset
581
              (symbol (find-test self (symbol-name test)))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
582
        (do-test (pop-test self)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
583
    self))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
584
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
585
 ;; HACK 2023-09-01: find better method of declaring failures from
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
586
 ;; within the body of `deftest'.
229
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
587
 (defmethod do-suite ((self test-suite) &key stream force)
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
588
   (when stream (setf (test-stream self) stream))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
589
   (with-slots (name stream) self
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
590
     (format stream "in suite ~x:~%"
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
591
 	    name)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
592
     (format stream "; with ~A~A tests~%"
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
593
             (if force
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
594
                 ""
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
595
                 (format nil "~A/"
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
596
                         (count t (tests self)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
597
                                :key (lambda (x) (or (test-lock-p x) (test-persist-p x))))))
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
598
             (length (tests self)))
229
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
599
     ;; loop over each test, calling `do-test'. if locked or
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
600
     ;; persistent, test is performed. if FORCE is non-nil all tests
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
601
     ;; are performed.
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
602
     (map-tests self 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
603
 	       (lambda (x)
229
7ca4cdbd52c2 bug fixes
Richard Westhaver <ellis@rwest.io>
parents: 215
diff changeset
604
 		 (when (or force (test-lock-p x) (test-persist-p x))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
605
 		   (let ((res (do-test x)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
606
 		     (push-result res self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
607
 		     (format stream "~@[~<~%~:;~:@(~S~) ~>~]~%" res)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
608
     ;; compare locked vs expected
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
609
     (let ((locked (remove-if #'null (map-tests self (lambda (x) (when (test-lock-p x) x)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
610
 	  (fails
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
611
 	    ;; collect if locked test not expected
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
612
 	    (loop for r in (test-results self)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
613
 		  unless (test-pass-p r)
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
614
 		  collect r)))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
615
       (if (null locked)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
616
 	  (format stream "~&No tests failed.~%")
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
617
 	  (progn
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
618
 	    ;;  RESEARCH 2023-09-04: print fails ??
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
619
 	    (format stream "~&~A out of ~A ~
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
620
                    total tests failed: ~
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
621
                    ~:@(~{~<~%   ~1:;~S~>~
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
622
                          ~^, ~}~)."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
623
 		    (length locked)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
624
 		    (length (tests self))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
625
 		    locked)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
626
 	    (unless (null fails)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
627
 	      (format stream "~&~A unexpected failures: ~
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
628
                    ~:@(~{~<~%   ~1:;~S~>~
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
629
                          ~^, ~}~)."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
630
 		      (length fails)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
631
 		      fails))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
632
       ;; close stream
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
633
       (finish-output stream)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
634
       ;; return values (PASS? LOCKED)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
635
       (values (not fails) locked))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
636
 
211
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
637
 (defmethod do-suite ((self string) &key stream)
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
638
   (do-suite (ensure-suite self) :stream stream))
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
639
 
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
640
 (defmethod do-suite ((self symbol) &key stream)
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
641
   (do-suite (ensure-suite self) :stream stream))
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
642
 
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
643
 (defmethod do-suite ((self null) &key stream)
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
644
   (do-suite *test-suite* :stream stream))
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
645
 
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
646
 ;;; Checks
377
49357f8b5e65 xdb fixes (one test still broken), fixed cli main test
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
647
 (eval-always
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
648
   (defun %test (val &optional form)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
649
     (let ((r
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
650
 	    (if val 
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
651
 	        (make-test-result :pass form)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
652
 	        (make-test-result :fail form))))
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
653
       ;; (print r *standard-output*)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
654
       r)))
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
655
 
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
656
 (defmacro is (test &rest args)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
657
   "The DWIM Check.
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
658
 
211
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
659
 (is (= 1 1)) ;=> #S(TEST-RESULT :TAG :PASS :FORM (= 1 1))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
660
 If TEST returns a truthy value, return a PASS test-result, else return
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
661
 a FAIL. The TEST is parameterized by ARGS which is a plist or nil.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
662
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
663
 If ARGS is nil, TEST is bound to to the RESULT slot of the test-result
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
664
 and evaluated 'as-is'.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
665
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
666
 (nyi!)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
667
 ARGS may contain the following keywords followed by a corresponding
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
668
 value:
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
669
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
670
 :EXPECTED
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
671
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
672
 :TIMEOUT
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
673
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
674
 :THEN
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
675
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
676
 All other values are treated as let bindings.
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
677
 "
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
678
     (with-gensyms (form)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
679
       `(if ,(null args)
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
680
 	   (if *testing*
514
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
681
 	       (push-result (trace! (funcall #'rt::%test ,test ',test)) *testing*)
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
682
 	       (trace! (funcall #'rt::%test ,test ',test)))
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
683
 	   (macrolet ((,form (test) `(let ,,(group args 2) ,test)))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
684
 	     ;; TODO 2023-09-21: does this work...
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
685
 	     (if *testing*
514
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
686
 		 (push-result (trace! (funcall #'rt::%test (,form ,test) ',test) *testing*))
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
687
 		 (trace! (funcall #'rt::%test (,form ,test) ',test)))))))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
688
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
689
 (defmacro signals (condition-spec &body body)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
690
   "Generates a passing TEST-RESULT if body signals a condition of type
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
691
 CONDITION-SPEC. BODY is evaluated in a block named NIL, CONDITION-SPEC
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
692
 is not evaluated."
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
693
   (let ((block-name (gensym)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
694
     (destructuring-bind (condition &optional reason-control &rest reason-args)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
695
         (ensure-list condition-spec)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
696
       `(block ,block-name
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
697
          (handler-bind ((,condition (lambda (c)
365
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 364
diff changeset
698
                                       (declare (ignore c))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
699
                                       ;; ok, body threw condition
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
700
 				      ;; TODO 2023-09-05: result collectors
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
701
                                       ;; (add-result 'test-passed
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
702
                                       ;;            :test-expr ',condition)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
703
                                       (return-from ,block-name (make-test-result :pass ',body)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
704
            (block nil
365
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 364
diff changeset
705
              (locally (declare (sb-ext:muffle-conditions warning))
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 364
diff changeset
706
                ,@body)))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
707
          (fail!
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
708
           ',condition
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
709
           ,@(if reason-control
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
710
                 `(,reason-control ,@reason-args)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
711
                 `("Failed to signal a ~S" ',condition)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
712
          (return-from ,block-name nil)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
713
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
714
 ;;; Macros
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
715
 (defmacro deftest (name props &body body)
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
716
   "Build a test with NAME, parameterized by PROPS and with a test form of BODY.
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
717
 
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
718
 PROPS is a plist which currently accepts the following parameters:
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
719
 
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
720
 :PERSIST - re-run this test even if it passes
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
721
 
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
722
 :ARGS - nyi
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
723
 
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
724
 :PROFILE - enable profiling of this test
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
725
 
437
83f8623a6ec3 std work, renamed :disabled in deftest to :skip
Richard Westhaver <ellis@rwest.io>
parents: 377
diff changeset
726
 :SKIP - don't push this test to the current *TEST-SUITE*
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
727
 
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
728
 :BENCH - enable benchmarking of this test
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
729
 
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
730
 BODY is parsed with SB-INT:PARSE-BODY and will fill in documentation
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
731
 and declarations for the test body.
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
732
 "
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
733
   (destructuring-bind (pr doc dec fn)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
734
       (multiple-value-bind (forms dec doc)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
735
 	  ;; parse body with docstring allowed
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
736
 	  (parse-body (or body) :documentation t :whole t)
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
737
 	`(,props ,doc ,dec ',forms))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
738
     ;; TODO 2023-09-21: parse plist
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
739
     `(let ((obj (make-test
211
f9e0d78b7458 refreshing memory on cli and rt
Richard Westhaver <ellis@rwest.io>
parents: 110
diff changeset
740
 		 :name ,(format nil "~A" name)
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
741
 		 :form ,fn
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
742
 		 ,@(when-let ((v (getf pr :persist))) `(:persist ,v))
514
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
743
 		 ,@(when-let ((v (getf pr :args))) `(:args ',v))
364
76c4c4c4a7c1 big rt fix
Richard Westhaver <ellis@rwest.io>
parents: 289
diff changeset
744
 		 ,@(when-let ((v (getf pr :bench))) `(:bench ,v))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
745
 		 ,@(when-let ((v (getf pr :profile))) `(:profile ,v))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
746
 		 ,@(when doc `(:doc ,doc))
514
da17bf652e48 tests and light feature annotations to support darwin (no uring, no mime types)
Richard Westhaver <ellis@rwest.io>
parents: 513
diff changeset
747
 		 ,@(when dec `(:declare ,dec)))))
437
83f8623a6ec3 std work, renamed :disabled in deftest to :skip
Richard Westhaver <ellis@rwest.io>
parents: 377
diff changeset
748
        ,(unless (getf pr :skip) '(push-test obj *test-suite*))
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
749
        obj)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
750
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
751
 (defmacro defsuite (suite-name &rest props)
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
752
   "Define a TEST-SUITE with provided keys. The object returned can be
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
753
 enabled using the IN-SUITE macro, similiar to the DEFPACKAGE API."
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
754
   (check-type suite-name (or symbol string))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
755
   `(eval-when (:compile-toplevel :load-toplevel :execute)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
756
      (let ((obj (make-suite
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
757
 		 :name (format nil "~A" ',suite-name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
758
 		 ,@(when-let ((v (getf props :stream))) `(:stream ,v)))))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
759
        (setq *test-suite-list* (spush obj *test-suite-list* :test #'test-name=))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
760
        obj)))
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
761
 
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
762
 (defmacro in-suite (name)
110
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
763
   "Set *TEST-SUITE* to the TEST-SUITE object referred to by symbol
cae8da4b1415 rocksdb macrofication, fixes for RDB (C Strings will be the death of me), removed PWN - quicklisp package conflict, smh.
ellis <ellis@rwest.io>
parents: 109
diff changeset
764
 NAME. Return the object."
96
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
765
   (assert-suite name)
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
766
   `(progn
301fd45bbe73 big refactor of lisp code
ellis <ellis@rwest.io>
parents:
diff changeset
767
      (setq *test-suite* (ensure-suite ,name))))