clucumber 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. data/LICENSE +1 -1
  2. data/README.md +4 -9
  3. data/lib/clucumber/clucumber-bootstrap.lisp +32 -0
  4. data/lib/clucumber/vendor/cl-interpol/alias.lisp +55 -0
  5. data/lib/clucumber/vendor/cl-interpol/cl-interpol.asd +56 -0
  6. data/lib/clucumber/vendor/cl-interpol/load.lisp +53 -0
  7. data/lib/clucumber/vendor/cl-interpol/packages.lisp +40 -0
  8. data/lib/clucumber/vendor/cl-interpol/read.lisp +716 -0
  9. data/lib/clucumber/vendor/cl-interpol/specials.lisp +113 -0
  10. data/lib/clucumber/vendor/cl-interpol/test/packages.lisp +34 -0
  11. data/lib/clucumber/vendor/cl-interpol/test/tests.lisp +128 -0
  12. data/lib/clucumber/vendor/cl-interpol/test.lisp +177 -0
  13. data/lib/clucumber/vendor/cl-interpol/test2.lisp +6254 -0
  14. data/lib/clucumber/vendor/cl-interpol/unicode.lisp +13912 -0
  15. data/lib/clucumber/vendor/cl-interpol/util.lisp +122 -0
  16. data/lib/clucumber/vendor/cl-ppcre/api.lisp +1262 -0
  17. data/lib/clucumber/vendor/cl-ppcre/charmap.lisp +152 -0
  18. data/lib/clucumber/vendor/cl-ppcre/charset.lisp +242 -0
  19. data/lib/clucumber/vendor/cl-ppcre/chartest.lisp +98 -0
  20. data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-test.asd +34 -0
  21. data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode/packages.lisp +38 -0
  22. data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode/resolver.lisp +61 -0
  23. data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode.asd +58 -0
  24. data/lib/clucumber/vendor/cl-ppcre/cl-ppcre.asd +79 -0
  25. data/lib/clucumber/vendor/cl-ppcre/closures.lisp +471 -0
  26. data/lib/clucumber/vendor/cl-ppcre/convert.lisp +875 -0
  27. data/lib/clucumber/vendor/cl-ppcre/errors.lisp +84 -0
  28. data/lib/clucumber/vendor/cl-ppcre/lexer.lisp +737 -0
  29. data/lib/clucumber/vendor/cl-ppcre/lispworks-defsystem.lisp +57 -0
  30. data/lib/clucumber/vendor/cl-ppcre/load.lisp +67 -0
  31. data/lib/clucumber/vendor/cl-ppcre/optimize.lisp +578 -0
  32. data/lib/clucumber/vendor/cl-ppcre/packages.lisp +68 -0
  33. data/lib/clucumber/vendor/cl-ppcre/parser.lisp +319 -0
  34. data/lib/clucumber/vendor/cl-ppcre/ppcre-tests.lisp +269 -0
  35. data/lib/clucumber/vendor/cl-ppcre/regex-class-util.lisp +555 -0
  36. data/lib/clucumber/vendor/cl-ppcre/regex-class.lisp +259 -0
  37. data/lib/clucumber/vendor/cl-ppcre/repetition-closures.lisp +833 -0
  38. data/lib/clucumber/vendor/cl-ppcre/scanner.lisp +506 -0
  39. data/lib/clucumber/vendor/cl-ppcre/specials.lisp +172 -0
  40. data/lib/clucumber/vendor/cl-ppcre/test/packages.lisp +37 -0
  41. data/lib/clucumber/vendor/cl-ppcre/test/perl-tests.lisp +150 -0
  42. data/lib/clucumber/vendor/cl-ppcre/test/tests.lisp +159 -0
  43. data/lib/clucumber/vendor/cl-ppcre/test/unicode-tests.lisp +80 -0
  44. data/lib/clucumber/vendor/cl-ppcre/util.lisp +201 -0
  45. data/lib/clucumber/vendor/cl-unicode/alias.lisp +135 -0
  46. data/lib/clucumber/vendor/cl-unicode/api.lisp +412 -0
  47. data/lib/clucumber/vendor/cl-unicode/build/char-info.lisp +133 -0
  48. data/lib/clucumber/vendor/cl-unicode/build/dump.lisp +239 -0
  49. data/lib/clucumber/vendor/cl-unicode/build/read.lisp +280 -0
  50. data/lib/clucumber/vendor/cl-unicode/build/util.lisp +182 -0
  51. data/lib/clucumber/vendor/cl-unicode/cl-unicode.asd +90 -0
  52. data/lib/clucumber/vendor/cl-unicode/conditions.lisp +54 -0
  53. data/lib/clucumber/vendor/cl-unicode/derived.lisp +120 -0
  54. data/lib/clucumber/vendor/cl-unicode/hash-tables.lisp +20 -0
  55. data/lib/clucumber/vendor/cl-unicode/lists.lisp +10 -0
  56. data/lib/clucumber/vendor/cl-unicode/methods.lisp +15 -0
  57. data/lib/clucumber/vendor/cl-unicode/packages.lisp +76 -0
  58. data/lib/clucumber/vendor/cl-unicode/specials.lisp +135 -0
  59. data/lib/clucumber/vendor/cl-unicode/test/packages.lisp +34 -0
  60. data/lib/clucumber/vendor/cl-unicode/test/tests.lisp +150 -0
  61. data/lib/clucumber/vendor/cl-unicode/test-functions.lisp +94 -0
  62. data/lib/clucumber/vendor/cl-unicode/util.lisp +274 -0
  63. data/lib/clucumber/vendor/lift/compare/fiveam-tests.lisp +14 -0
  64. data/lib/clucumber/vendor/lift/compare/lift-tests.lisp +13 -0
  65. data/lib/clucumber/vendor/lift/compare/rt-tests.lisp +16 -0
  66. data/lib/clucumber/vendor/lift/compare/xlunit-tests.lisp +15 -0
  67. data/lib/clucumber/vendor/lift/dev/changes.lisp +61 -0
  68. data/lib/clucumber/vendor/lift/dev/config.lisp +354 -0
  69. data/lib/clucumber/vendor/lift/dev/copy-file.lisp +117 -0
  70. data/lib/clucumber/vendor/lift/dev/introspection.lisp +232 -0
  71. data/lib/clucumber/vendor/lift/dev/lift-interface.lisp +56 -0
  72. data/lib/clucumber/vendor/lift/dev/lift-notes.lisp +202 -0
  73. data/lib/clucumber/vendor/lift/dev/lift-randomized.lisp +45 -0
  74. data/lib/clucumber/vendor/lift/dev/lift.lisp +2383 -0
  75. data/lib/clucumber/vendor/lift/dev/macros.lisp +229 -0
  76. data/lib/clucumber/vendor/lift/dev/measuring.lisp +156 -0
  77. data/lib/clucumber/vendor/lift/dev/packages.lisp +161 -0
  78. data/lib/clucumber/vendor/lift/dev/port.lisp +151 -0
  79. data/lib/clucumber/vendor/lift/dev/prototypes.lisp +282 -0
  80. data/lib/clucumber/vendor/lift/dev/random-testing.lisp +124 -0
  81. data/lib/clucumber/vendor/lift/dev/report-locations.lisp +13 -0
  82. data/lib/clucumber/vendor/lift/dev/reports.lisp +916 -0
  83. data/lib/clucumber/vendor/lift/dev/utilities.lisp +242 -0
  84. data/lib/clucumber/vendor/lift/docs/package.lisp +6 -0
  85. data/lib/clucumber/vendor/lift/docs/setup.lisp +17 -0
  86. data/lib/clucumber/vendor/lift/examples/basic-examples.lisp +289 -0
  87. data/lib/clucumber/vendor/lift/examples/random-testing.lisp +32 -0
  88. data/lib/clucumber/vendor/lift/lift-documentation.asd +28 -0
  89. data/lib/clucumber/vendor/lift/lift-test.asd +35 -0
  90. data/lib/clucumber/vendor/lift/lift.asd +77 -0
  91. data/lib/clucumber/vendor/lift/test/equality-tests.lisp +40 -0
  92. data/lib/clucumber/vendor/lift/test/finding-tests.lisp +32 -0
  93. data/lib/clucumber/vendor/lift/test/lift-test.lisp +783 -0
  94. data/lib/clucumber/vendor/lift/test/order-of-operations.lisp +54 -0
  95. data/lib/clucumber/vendor/lift/test/packages.lisp +17 -0
  96. data/lib/clucumber/vendor/lift/test/test-config-files.lisp +20 -0
  97. data/lib/clucumber/vendor/lift/test/test-dynamic-variables.lisp +57 -0
  98. data/lib/clucumber/vendor/lift/test/test-maximum-problems.lisp +74 -0
  99. data/lib/clucumber/vendor/lift/test/test-prototypes.lisp +278 -0
  100. data/lib/clucumber/vendor/lift/test/test-timeout.lisp +37 -0
  101. data/lib/clucumber/vendor/lift/test/tests-in-progress.lisp +62 -0
  102. data/lib/clucumber/vendor/lift/test/testsuite-expects.lisp +60 -0
  103. data/lib/clucumber/vendor/lift/timeout/package.lisp +13 -0
  104. data/lib/clucumber/vendor/lift/timeout/with-timeout.lisp +123 -0
  105. data/lib/clucumber/vendor/lift/website/stuff/Temp.lisp +34 -0
  106. data/lib/clucumber/vendor/st-json/st-json.asd +3 -0
  107. data/lib/clucumber/vendor/st-json/st-json.lisp +310 -0
  108. data/lib/clucumber/vendor/trivial-backtrace/dev/backtrace.lisp +127 -0
  109. data/lib/clucumber/vendor/trivial-backtrace/dev/fallback.lisp +10 -0
  110. data/lib/clucumber/vendor/trivial-backtrace/dev/map-backtrace.lisp +103 -0
  111. data/lib/clucumber/vendor/trivial-backtrace/dev/mucking.lisp +75 -0
  112. data/lib/clucumber/vendor/trivial-backtrace/dev/packages.lisp +13 -0
  113. data/lib/clucumber/vendor/trivial-backtrace/dev/utilities.lisp +104 -0
  114. data/lib/clucumber/vendor/trivial-backtrace/test/packages.lisp +5 -0
  115. data/lib/clucumber/vendor/trivial-backtrace/test/test-setup.lisp +4 -0
  116. data/lib/clucumber/vendor/trivial-backtrace/test/tests.lisp +16 -0
  117. data/lib/clucumber/vendor/trivial-backtrace/trivial-backtrace-test.asd +22 -0
  118. data/lib/clucumber/vendor/trivial-backtrace/trivial-backtrace.asd +35 -0
  119. data/lib/clucumber/vendor/usocket/backend/allegro.lisp +199 -0
  120. data/lib/clucumber/vendor/usocket/backend/armedbear.lisp +491 -0
  121. data/lib/clucumber/vendor/usocket/backend/clisp.lisp +260 -0
  122. data/lib/clucumber/vendor/usocket/backend/cmucl.lisp +266 -0
  123. data/lib/clucumber/vendor/usocket/backend/lispworks.lisp +741 -0
  124. data/lib/clucumber/vendor/usocket/backend/mcl.lisp +369 -0
  125. data/lib/clucumber/vendor/usocket/backend/openmcl.lisp +206 -0
  126. data/lib/clucumber/vendor/usocket/backend/sbcl.lisp +424 -0
  127. data/lib/clucumber/vendor/usocket/backend/scl.lisp +261 -0
  128. data/lib/clucumber/vendor/usocket/condition.lisp +227 -0
  129. data/lib/clucumber/vendor/usocket/package.lisp +82 -0
  130. data/lib/clucumber/vendor/usocket/server.lisp +45 -0
  131. data/lib/clucumber/vendor/usocket/test/package.lisp +13 -0
  132. data/lib/clucumber/vendor/usocket/test/test-usocket.lisp +166 -0
  133. data/lib/clucumber/vendor/usocket/usocket-test.asd +26 -0
  134. data/lib/clucumber/vendor/usocket/usocket.asd +37 -0
  135. data/lib/clucumber/vendor/usocket/usocket.lisp +542 -0
  136. data/lib/clucumber/vendor/usocket/vendor/kqueue.lisp +1 -0
  137. data/lib/clucumber/vendor/usocket/vendor/split-sequence.lisp +245 -0
  138. data/lib/clucumber.rb +29 -7
  139. metadata +151 -5
@@ -0,0 +1,282 @@
1
+ ;;;-*- Mode: Lisp; Package: LIFT -*-
2
+
3
+ (in-package #:lift)
4
+
5
+ (pushnew :cases *deftest-clauses*)
6
+
7
+ (add-code-block
8
+ :cases 2 :methods
9
+ (lambda () (def :cases))
10
+ '((setf (def :cases) (cleanup-parsed-parameter value)))
11
+ 'build-cases-method)
12
+
13
+ (defun build-cases-method ()
14
+ (when (atom (car (def :cases)))
15
+ (setf (def :cases) (list (def :cases))))
16
+ ;(spy (def :cases))
17
+ (let ((cases (standardize-cases-form (def :cases))))
18
+ `(defmethod initialize-prototypes :after ((test ,(def :testsuite-name)))
19
+ (setf (prototypes test)
20
+ (rest (process-cases-form
21
+ ,(first cases)
22
+ ,@(mapcar (lambda (a) `',a) (rest cases))))))))
23
+
24
+ ;; goal is spec := (<tag> <spec>+)
25
+ ;; spec := (<var value>+)
26
+ (defun standardize-cases-form (cases)
27
+ (cond ((atom (first cases))
28
+ (cond ((valid-tag-p (first cases))
29
+ `(,(first cases) ,@(mapcar #'standardize-cases-form (rest cases))))
30
+ (t
31
+ cases)))
32
+ ((and (length-1-list-p cases)
33
+ (consp (first cases))
34
+ (valid-tag-p (first (first cases))))
35
+ (standardize-cases-form (first cases)))
36
+ (t
37
+ `(:cross ,@(mapcar #'standardize-cases-form cases)))))
38
+
39
+ ;;; ---------------------------------------------------------------------------
40
+
41
+ (defun check-subcases (cases)
42
+ (cond ((not (valid-tag-p (first cases)))
43
+ `(,(default-cases-tag) ,@(mapcar #'standardize-cases-form cases)))
44
+ (t
45
+ (mapcar #'standardize-cases-form cases))))
46
+
47
+ ;;; ---------------------------------------------------------------------------
48
+
49
+ (defun default-cases-tag ()
50
+ :cross)
51
+
52
+ ;;; ---------------------------------------------------------------------------
53
+
54
+ (defun valid-tag-p (tag)
55
+ (member tag '(:map :cross)))
56
+
57
+ ;;; ---------------------------------------------------------------------------
58
+
59
+ (defmethod process-cases-form :around ((type t) &rest forms)
60
+ (apply #'call-next-method type (if (atom (car forms))
61
+ (list forms) forms)))
62
+
63
+ ;;; ---------------------------------------------------------------------------
64
+
65
+ (defmethod process-cases-form ((type t) &rest forms)
66
+ (cond ((atom (first type))
67
+ (apply #'process-cases-form (first type) (append (rest type) forms)))
68
+ (t (apply #'process-cases-form :cross (append type forms)))))
69
+
70
+ #+Old
71
+ (defmethod process-cases-form ((type (eql :map)) &rest forms)
72
+ (let ((vars (mapcar #'car forms))
73
+ (values (mapcar #'rest forms)))
74
+ `(let (,@(mapcar (lambda (var value) `(,var ,@value))
75
+ vars values))
76
+ (mapcar (lambda ,vars
77
+ (list ,@(mapcar (lambda (var) `(cons ',var ,var)) vars)))
78
+ ,@vars))))
79
+
80
+ ;;; ---------------------------------------------------------------------------
81
+
82
+ (defmethod process-cases-form ((type (eql :map)) &rest forms)
83
+ (let ((vars (ensure-list (flatten (vars-from-assignment forms))))
84
+ (values (values-from-assignment forms)))
85
+ `(:b ,@(apply #'mapcar
86
+ (lambda (&rest args)
87
+ (mapcar (lambda (var value)
88
+ (cons var value))
89
+ vars args))
90
+ values))))
91
+
92
+ ;;; ---------------------------------------------------------------------------
93
+
94
+ (defmethod process-cases-form ((type (eql :cross)) &rest forms)
95
+ (let ((vars (ensure-list (flatten (vars-from-assignment forms))))
96
+ (values (values-from-assignment forms))
97
+ (result nil))
98
+ (iterate-over-indexes
99
+ (mapcar #'length values)
100
+ (lambda (indexes)
101
+ (let ((datum nil))
102
+ (mapcar (lambda (name var index)
103
+ (push (cons name (elt var index)) datum))
104
+ vars
105
+ values
106
+ indexes)
107
+ (push (nreverse datum) result)))
108
+ :right)
109
+ `(:b ,@(nreverse result))))
110
+
111
+ ;;; ---------------------------------------------------------------------------
112
+
113
+ (defun vars-from-assignment (assignment)
114
+ (cond ((is-binding-p assignment)
115
+ (mapcar #'car (second assignment)))
116
+ ((metatilities:dotted-pair-p assignment)
117
+ (car assignment))
118
+ ((atom (car assignment))
119
+ (car assignment))
120
+ ((length-1-list-p assignment)
121
+ (vars-from-assignment (first assignment)))
122
+ (t (loop for assignment in assignment collect
123
+ (vars-from-assignment assignment)))))
124
+
125
+ ;;; ---------------------------------------------------------------------------
126
+
127
+ (defun values-from-assignment (assignment)
128
+ (cond ((is-binding-p assignment)
129
+ (apply #'mapcar (lambda (&rest bindings)
130
+ (mapcar (lambda (binding)
131
+ (cdr binding))
132
+ bindings))
133
+ (rest assignment)))
134
+ ((dotted-pair-p assignment)
135
+ (cdr assignment))
136
+ ((atom (car assignment))
137
+ (list (eval (first (rest assignment)))))
138
+ (t
139
+ (loop for assignment in assignment nconc
140
+ (ensure-list (values-from-assignment assignment))))))
141
+
142
+ ;;; ---------------------------------------------------------------------------
143
+
144
+ (defun is-binding-p (assignment)
145
+ (eq (first assignment) :b))
146
+
147
+
148
+ #|
149
+
150
+
151
+ (export '(map-prototypes-of
152
+ prototypes-of
153
+ prototype-of
154
+ prototype-exists-p))
155
+
156
+ ;;; ---------------------------------------------------------------------------
157
+ ;;; API
158
+ ;;; ---------------------------------------------------------------------------
159
+
160
+ (defgeneric map-prototypes-of (fn thing)
161
+ (:documentation ""))
162
+
163
+ ;;; ---------------------------------------------------------------------------
164
+
165
+ (defgeneric prototypes-of (thing)
166
+ (:documentation ""))
167
+
168
+ ;;; ---------------------------------------------------------------------------
169
+
170
+ (defgeneric prototype-of (thing)
171
+ (:documentation ""))
172
+
173
+ ;;; ---------------------------------------------------------------------------
174
+
175
+ (defgeneric prototype-exists-p (thing)
176
+ (:documentation ""))
177
+
178
+ ;;; ---------------------------------------------------------------------------
179
+ ;;; implementation
180
+ ;;; ---------------------------------------------------------------------------
181
+
182
+ (defmethod map-prototypes-of :around (fn thing)
183
+ (declare (ignore fn))
184
+ (when (prototype-exists-p thing)
185
+ (call-next-method)))
186
+
187
+ ;;; ---------------------------------------------------------------------------
188
+
189
+ (defmethod map-prototypes-of (fn (thing standard-class))
190
+ (map-subclass-prototypes fn thing))
191
+
192
+ ;;; ---------------------------------------------------------------------------
193
+
194
+ (defmethod map-prototypes-of (fn (thing built-in-class))
195
+ (map-subclass-prototypes fn thing))
196
+
197
+ ;;; ---------------------------------------------------------------------------
198
+
199
+ (defun map-subclass-prototypes (fn thing)
200
+ (mopu:map-subclasses thing
201
+ (lambda (subclass)
202
+ (when (prototype-exists-p subclass)
203
+ (funcall fn (prototype-of subclass)))))
204
+ (values))
205
+
206
+ ;;; ---------------------------------------------------------------------------
207
+
208
+ (defmethod prototypes-of (thing)
209
+ (containers:collect-using 'map-prototypes-of nil thing))
210
+
211
+ ;;; ---------------------------------------------------------------------------
212
+
213
+ (defmethod prototype-exists-p (thing)
214
+ ;; the expensive way to see if a prototype exists is to try and make one
215
+ ;; and see if it works...
216
+ (handler-case
217
+ (let ((creator-method (compute-applicable-methods #'prototype-of (list thing))))
218
+ (when creator-method
219
+ (let ((x (prototype-of thing)))
220
+ (declare (optimize (safety 3) (debug 3) (speed 0) (space 0)))
221
+ x
222
+ (values t))))
223
+ (error (c) (inspect c) nil)))
224
+
225
+ ;;; ---------------------------------------------------------------------------
226
+
227
+ (defmethod prototype-of ((thing standard-class))
228
+ (allocate-instance thing))
229
+
230
+ ;;; ---------------------------------------------------------------------------
231
+
232
+ (defmethod prototype-of ((thing (eql 'fixnum)))
233
+ (variates:integer-random variates:*random-generator* -10 10))
234
+
235
+
236
+ |#
237
+
238
+
239
+
240
+ (defmethod more-prototypes-p :before ((testsuite test-mixin))
241
+ (setf (current-step testsuite) 'more-prototypes-p))
242
+
243
+ ;;; ---------------------------------------------------------------------------
244
+
245
+ (defmethod initialize-prototypes :before ((testsuite test-mixin))
246
+ (setf (current-step testsuite) 'initialize-prototypes))
247
+
248
+ ;;; ---------------------------------------------------------------------------
249
+
250
+ (defmethod next-prototype :before ((testsuite test-mixin))
251
+ (setf (current-step testsuite) 'next-prototype))
252
+
253
+ ;;; ---------------------------------------------------------------------------
254
+
255
+ (defmethod testsuite-teardown :before ((testsuite test-mixin))
256
+ (setf (current-step testsuite) 'testsuite-teardown))
257
+
258
+ ;;; ---------------------------------------------------------------------------
259
+
260
+ (defmethod start-test :before
261
+ ((result test-result) (testsuite test-mixin) method-name)
262
+ (declare (ignore method-name))
263
+ (setf (current-step testsuite) 'start-test))
264
+
265
+ ;;; ---------------------------------------------------------------------------
266
+
267
+ (defmethod end-test :before
268
+ ((result test-result) (testsuite test-mixin) method-name)
269
+ (declare (ignore method-name))
270
+ (setf (current-step testsuite) 'end-test))
271
+
272
+ ;;; ---------------------------------------------------------------------------
273
+
274
+ (defmethod setup-test :before ((testsuite test-mixin))
275
+ (setf (current-step testsuite) 'setup-test))
276
+
277
+ ;;; ---------------------------------------------------------------------------
278
+
279
+ #+Ignore
280
+ (defmethod teardown-test :before ((testsuite test-mixin))
281
+ (setf (current-step testsuite) 'teardown-test))
282
+
@@ -0,0 +1,124 @@
1
+ (in-package #:lift)
2
+
3
+ ;; we redefine the class and possibly method each time, ick.
4
+
5
+ (define-condition ensure-random-cases-failure (test-condition)
6
+ ((total :initarg :total :initform 0)
7
+ (problems :initarg :problems :initform nil))
8
+ (:report (lambda (condition stream)
9
+ (format stream "Ensure-random-cases: ~d out of ~d failed. Failing values are: ~{~% ~s~^, ~}"
10
+ (length (slot-value condition 'problems))
11
+ (slot-value condition 'total)
12
+ (slot-value condition 'problems)))))
13
+
14
+ (defgeneric random-instance-for-suite (thing suite))
15
+
16
+ (defmacro defrandom-instance (instance-type suite &body body)
17
+ `(progn
18
+ (defclass ,instance-type () ())
19
+ (defvar ,(intern (format nil "+~a+" instance-type) :lift)
20
+ (make-instance ',instance-type))
21
+ (defmethod random-instance-for-suite
22
+ ((thing ,instance-type) (suite ,(if suite suite t)))
23
+ ,@body)))
24
+
25
+ (defmacro ensure-random-cases (count (&rest vars-and-types)
26
+ &body body)
27
+ (let ((problems (gensym)))
28
+ (flet ((intern-type (type)
29
+ (intern (format nil "+~a+" type) :lift)))
30
+ `(let ((,problems nil))
31
+ (loop repeat ,count do
32
+ (let (,@(mapcar
33
+ (lambda (var-and-type)
34
+ `(,(first var-and-type)
35
+ (random-instance-for-suite
36
+ ,(intern-type (second var-and-type))
37
+ *current-test*)))
38
+ vars-and-types))
39
+ (restart-case
40
+ (progn ,@body
41
+ (princ #\. *debug-io*))
42
+ (ensure-failed (cond)
43
+ (declare (ignorable cond))
44
+ (princ #\* *debug-io*)
45
+ (push (list ,@(mapcar
46
+ (lambda (var-and-type)
47
+ `(list ',(first var-and-type)
48
+ ,(first var-and-type)))
49
+ vars-and-types)) ,problems)))))
50
+ (when ,problems
51
+ (let ((condition (make-condition
52
+ 'ensure-random-cases-failure
53
+ :total ,count
54
+ :problems ,problems)))
55
+ (if (find-restart 'ensure-failed)
56
+ (invoke-restart 'ensure-failed condition)
57
+ (warn condition))))))))
58
+
59
+ (defmacro ensure-random-cases+ (count (&rest vars) (&rest case-form)
60
+ &body body)
61
+ (let ((total (gensym))
62
+ (problems (gensym)))
63
+ `(let ((,problems nil) (,total 0))
64
+ (loop repeat ,count do
65
+ (incf ,total)
66
+ (destructuring-bind ,vars ,case-form
67
+ (restart-case
68
+ (progn ,@body)
69
+ (ensure-failed (cond)
70
+ (declare (ignore cond))
71
+ (push (list ,@vars) ,problems)))))
72
+ (when ,problems
73
+ (let ((condition (make-condition
74
+ 'ensure-random-cases-failure
75
+ :total ,total
76
+ :problems ,problems)))
77
+ (if (find-restart 'ensure-failed)
78
+ (invoke-restart 'ensure-failed condition)
79
+ (warn condition)))))))
80
+
81
+ ;;; merge with deftestsuite macro
82
+ (pushnew :random-instance *deftest-clauses*)
83
+
84
+ (add-code-block
85
+ :random-instance 2 :methods
86
+ (lambda () (def :random-instances))
87
+ '((push (cleanup-parsed-parameter value) (def :random-instances)))
88
+ 'build-random-instances-method)
89
+
90
+ (defun build-random-instances-method ()
91
+ `(let (#+allegro
92
+ (excl:*redefinition-warnings* nil))
93
+ ,@(mapcar (lambda (instance)
94
+ (let ((atype (first instance))
95
+ (body (second instance)))
96
+ `(defrandom-instance ,atype test-mixin ,body)))
97
+ (def :random-instances))))
98
+
99
+ (defgeneric random-number (suite min max))
100
+
101
+ (defgeneric random-element (suite sequence))
102
+
103
+ (defmethod random-number (suite min max)
104
+ (declare (ignore suite))
105
+ (+ min (random (- max min))))
106
+
107
+ (defmethod random-element (suite sequence)
108
+ (elt sequence (random-number suite 0 (1- (length sequence)))))
109
+
110
+ (defrandom-instance an-integer test-mixin
111
+ (random-number suite -100 100))
112
+
113
+ (defrandom-instance a-single-float test-mixin
114
+ (random-number suite -100s0 100.0s0))
115
+
116
+ (defrandom-instance a-double-float test-mixin
117
+ (random-number suite -100d0 100.0d0))
118
+
119
+ (defrandom-instance a-symbol test-mixin
120
+ (random-element suite '(a hello a-c d_f |MiXeD|
121
+ -2<>#$%#)))
122
+
123
+
124
+
@@ -0,0 +1,13 @@
1
+ (in-package #:lift)
2
+
3
+ (defmethod generate-report-summary-pathname :around ()
4
+ (let ((basepath (call-next-method)))
5
+ (add-implementation-specific-directory-name basepath)))
6
+
7
+ (defun add-implementation-specific-directory-name (basepath)
8
+ (merge-pathnames
9
+ (make-pathname
10
+ :directory `(:relative
11
+ ,(asdf::implementation-specific-directory-name)))
12
+ basepath))
13
+