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,229 @@
1
+ (in-package #:lift)
2
+
3
+ (defvar *measures* nil
4
+ "A list of defineded measures")
5
+
6
+ (defparameter *benchmark-log-path*
7
+ (asdf:system-relative-pathname
8
+ 'lift "benchmark-data/benchmarks.log"))
9
+
10
+ (defvar *count-calls-p* nil)
11
+
12
+ (defmacro undefmeasure (name)
13
+ (let ((gname (gensym "name-")))
14
+ `(let ((,gname ,(form-keyword name)))
15
+ (if (find ,gname *measures* :key #'first)
16
+ (setf *measures* (remove ,gname *measures* :key #'first))
17
+ (error "Measure ~a not found." ,gname))
18
+ ,gname)))
19
+
20
+ (defmacro defmeasure (name &key (value nil) (finally nil) (type nil)
21
+ (documentation nil))
22
+ (declare (ignore documentation))
23
+ (unless value
24
+ (error "A value must be specified to define a measure."))
25
+ (cond ((atom name)
26
+ ;; all is well
27
+ )
28
+ ((and (eq (first name) 'quote)
29
+ (eq (length name) 2))
30
+ (warn "Name does not need to be quoted.")
31
+ (setf name (second name)))
32
+ (t
33
+ (error "Name should be a symbol.")))
34
+ (cond ((eq (first finally) 'quote)
35
+ (setf finally (second finally))))
36
+ (let ((gname (gensym "name-")))
37
+ `(let ((,gname ,(form-keyword name)))
38
+ (setf *measures* (remove ,gname *measures* :key #'first))
39
+ (push (list ,gname
40
+ :value ,value
41
+ :finally ',finally
42
+ :type ',type)
43
+ *measures*)
44
+ ,gname)))
45
+
46
+ (defmacro while-measuring ((catch-errors-p &rest measures) &body body)
47
+ (let ((vars (loop for measure in measures collect
48
+ (gensym (format nil "~a-" measure))))
49
+ (gcondition (gensym "condition-"))
50
+ (gresult (gensym "result-"))
51
+ (gcatch-errors-p (gensym "catch-errors-p-")))
52
+ (labels ((measure-1 (vars measures)
53
+ (cond ((null measures) body)
54
+ (t
55
+ `((while-measuring-1 (,(first vars) ,(first measures))
56
+ ,@(measure-1 (rest vars) (rest measures))))))))
57
+ `(let ((,gcondition nil)
58
+ (,gresult nil)
59
+ (,gcatch-errors-p ,catch-errors-p)
60
+ ,@vars)
61
+ (setf ,gresult
62
+ (handler-case
63
+ ,@(measure-1 vars measures)
64
+ (error (c)
65
+ (setf ,gcondition c)
66
+ (unless ,gcatch-errors-p
67
+ (error c)))))
68
+ (values ,gresult (list ,@vars) ,gcondition)))))
69
+
70
+ #+notyet
71
+ ;; returns error as third value (and probably as first too!)
72
+ (defmacro while-measuring ((&rest measures) (&body error-body)
73
+ &body body)
74
+ (let ((vars (loop for measure in measures collect
75
+ (gensym (format nil "~a-" measure))))
76
+ (gcondition (gensym "condition-"))
77
+ (gresult (gensym "result-")))
78
+ (labels ((measure-1 (vars measures)
79
+ (cond ((null measures) body)
80
+ (t
81
+ `((while-measuring-1 (,(first vars) ,(first measures))
82
+ ,@(measure-1 (rest vars) (rest measures))))))))
83
+ `(let ((,gcondition nil)
84
+ (,gresult nil)
85
+ ,@vars)
86
+ (setf ,gresult
87
+ (handler-case
88
+ ,@(measure-1 vars measures)
89
+ (error (c)
90
+ ,@(if error-body
91
+ `((progn ,error-body
92
+ (error c)))
93
+ `((setf ,gcondition c))))))
94
+ (values ,gresult (list ,@vars) ,gcondition)))))
95
+
96
+ #+(or)
97
+ (while-measuring (space seconds)
98
+ nil
99
+ (sleep 1)
100
+ (signal "hi"))
101
+
102
+ #+(or)
103
+ (measure-time-and-conses
104
+ (sleep 1)
105
+ (signal "hi"))
106
+
107
+ (defmacro while-measuring-1 ((var measure) &body body)
108
+ (let ((ginitial (gensym "value-"))
109
+ (gresult (gensym "result-"))
110
+ (metadata (find (form-keyword measure) *measures* :key 'first)))
111
+ (unless metadata
112
+ (error "Measure `~a` not defined." measure))
113
+ (destructuring-bind (&key value finally type &allow-other-keys)
114
+ (rest metadata)
115
+ `(let ((,ginitial (,value))
116
+ (,gresult nil))
117
+ ,@(when type
118
+ `((declare (type ,type ,ginitial))))
119
+ (unwind-protect
120
+ (setf ,gresult (progn ,@body))
121
+ (setf ,var ,@(if finally
122
+ `((funcall (lambda (it) ,finally)
123
+ (- (,value) ,ginitial)))
124
+ `((- ,(if type `(the ,type (,value)) `(,value))
125
+ ,ginitial)))))
126
+ ,gresult))))
127
+
128
+ (defmacro with-profile-report
129
+ ((name style &key
130
+ (log-name *benchmark-log-path* ln-supplied?)
131
+ (count-calls-p *count-calls-p* ccp-supplied?)
132
+ (timeout nil timeout-supplied?))
133
+ &body body)
134
+ `(with-profile-report-fn
135
+ ,name ,style
136
+ (lambda () (progn ,@body))
137
+ ',body
138
+ ,@(when ccp-supplied?
139
+ `(:count-calls-p ,count-calls-p))
140
+ ,@(when ln-supplied?
141
+ `(:log-name ,log-name))
142
+ ,@(when (and timeout-supplied? timeout)
143
+ `(:timeout ,timeout))))
144
+
145
+ (defmacro while-counting-repetitions ((&optional (delay 1.0)) &body body)
146
+ "Execute `body` repeatedly for `delay` seconds. Returns the number
147
+ of times `body` is executed per second. Warning: assumes that `body` will not
148
+ be executed more than a fixnum number of times. The `delay` defaults to
149
+ 1.0."
150
+ (let ((gevent-count (gensym "count-"))
151
+ (gdelay (gensym "delay-"))
152
+ (gignore (gensym "ignore-"))
153
+ (gfn (gensym "fn-")))
154
+ `(let ((,gfn
155
+ (compile
156
+ nil
157
+ (lambda ()
158
+ (let ((,gevent-count 0)
159
+ (,gdelay ,delay))
160
+ (declare (type fixnum ,gevent-count))
161
+ (handler-case
162
+ (lift::with-timeout (,gdelay)
163
+ (loop
164
+ (progn ,@body)
165
+ (setf ,gevent-count (the fixnum (1+ ,gevent-count)))))
166
+ (lift::timeout-error (,gignore)
167
+ (declare (ignore ,gignore))
168
+ (if (plusp ,gevent-count)
169
+ (float (/ ,gevent-count ,gdelay))
170
+ ,gevent-count))))))))
171
+ (funcall ,gfn))))
172
+
173
+ (defmacro while-counting-events ((&optional (delay 1.0)) &body body)
174
+ "Returns the count of the number of times `did-event` was called during
175
+ `delay` seconds. See also: [while-counting-repetitions][]."
176
+ (let ((gevent-count (gensym "count")))
177
+ `(let ((,gevent-count 0))
178
+ (flet ((did-event ()
179
+ (incf ,gevent-count)))
180
+ (declare (type fixnum ,gevent-count)
181
+ (ignorable (function did-event)))
182
+ (handler-case
183
+ (with-timeout (,delay)
184
+ (loop
185
+ (progn ,@body)))
186
+ (timeout-error (c)
187
+ (declare (ignore c))
188
+ (float (/ ,gevent-count ,delay))))))))
189
+
190
+ ;; stolen from metatilities
191
+ (defmacro muffle-redefinition-warnings (&body body)
192
+ "Evaluate the body so that redefinition warnings will not be
193
+ signaled. (suppored in Allegro, Clozure CL, CLisp, and Lispworks)"
194
+ #+allegro
195
+ `(excl:without-redefinition-warnings
196
+ ,@body)
197
+ #+(or ccl mcl)
198
+ `(let ((ccl::*warn-if-redefine* nil)
199
+ ;;?? FIXME not sure if this should be here or not...
200
+ (ccl::*record-source-file* nil))
201
+ ,@body)
202
+ #+clisp
203
+ `(let ((custom:*suppress-check-redefinition* t))
204
+ ,@body)
205
+ #+lispworks
206
+ `(let ((lw:*handle-warn-on-redefinition* :quiet))
207
+ ,@body)
208
+ #+sbcl
209
+ ;; from http://www.sbcl.info/manual/Controlling-Verbosity.html
210
+ `(locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note
211
+ sb-ext::style-warning))
212
+ ,@body)
213
+ #-(or allegro ccl clisp mcl sbcl)
214
+ `(progn ,@body))
215
+
216
+
217
+ (defmacro defconfig-variable (name var &optional docstring)
218
+ (declare (ignore docstring))
219
+ `(defmethod handle-config-preference ((name (eql ,name)) args)
220
+ (setf ,var (first args))))
221
+
222
+ (defmacro defconfig (name &body body)
223
+ (let ((docstring nil))
224
+ (declare (ignorable docstring))
225
+ (when (stringp (first body))
226
+ (setf docstring (first body)
227
+ body (rest body)))
228
+ `(defmethod handle-config-preference ((name (eql ,name)) args)
229
+ ,@body)))
@@ -0,0 +1,156 @@
1
+ (in-package #:lift)
2
+
3
+ (eval-when (:compile-toplevel)
4
+ (declaim (optimize (speed 3) (safety 1))))
5
+
6
+ (eval-when (:compile-toplevel :load-toplevel :execute)
7
+
8
+ (defmeasure :measure-seconds
9
+ :value 'get-internal-real-time
10
+ :finally '(coerce (/ it internal-time-units-per-second)
11
+ 'double-float)
12
+ :type integer
13
+ :documentation
14
+ "Measure how long something takes using {hs get-internal-real-time}.
15
+
16
+ The accuracy can be no greater than {hs internal-time-units-per-second}.")
17
+
18
+ (defmeasure :measure-space
19
+ :value 'total-bytes-allocated
20
+ :type integer
21
+ :documentation
22
+ "Measure how many conses cells a computation generates.")
23
+
24
+ )
25
+
26
+ #+(or)
27
+ (while-measuring-1 (conses measure-space)
28
+ (while-measuring-1 (time measure-seconds)
29
+ blay))
30
+
31
+ #+(or)
32
+ (let ((time 0))
33
+ (while-measuring-1 (time measure-seconds)
34
+ (sleep 1))
35
+ time)
36
+
37
+ #+(or)
38
+ (let ((conses 0))
39
+ (while-measuring-1 (conses measure-space)
40
+ (sleep 1))
41
+ conses)
42
+
43
+ #+(or)
44
+ (while-measuring (measure-seconds)
45
+ (sleep 1))
46
+
47
+ (defmacro with-measuring ((var measure-fn) &body body)
48
+ (let ((ginitial (gensym "value-"))
49
+ (gcondition (gensym "condition-")))
50
+ `(let ((,ginitial (,measure-fn))
51
+ (,gcondition nil))
52
+ (prog1
53
+ (handler-case
54
+ (progn ,@body)
55
+ (error (c) (setf ,gcondition c)))
56
+ (setf ,var (- (,measure-fn) ,ginitial))
57
+ (when ,gcondition (error ,gcondition))))))
58
+
59
+
60
+ (defmacro measure-time ((var) &body body)
61
+ `(while-measuring-1 (,var measure-seconds) ,@body))
62
+
63
+ #+(or)
64
+ (let ((time 0))
65
+ (while-measuring-1 (time measure-seconds)
66
+ (sleep 1))
67
+ time)
68
+
69
+ (defmacro measure-conses ((var) &body body)
70
+ `(while-measuring-1 (,var measure-space) ,@body))
71
+
72
+ (defun measure-fn (fn &rest args)
73
+ (declare (dynamic-extent args))
74
+ (let ((bytes 0) (seconds 0) result)
75
+ (measure-time (seconds)
76
+ (measure-conses (bytes)
77
+ (setf result (apply fn args))))
78
+ (values seconds bytes result)))
79
+
80
+ (defmacro measure (seconds bytes &body body)
81
+ (let ((result (gensym)))
82
+ `(let (,result)
83
+ (measure-time (,seconds)
84
+ (measure-conses (,bytes)
85
+ (setf ,result (progn ,@body))))
86
+ (values ,result))))
87
+
88
+ (defmacro measure-time-and-conses (&body body)
89
+ (let ((seconds (gensym))
90
+ (conses (gensym))
91
+ (results (gensym)))
92
+ `(let ((,seconds 0) (,conses 0) ,results)
93
+ (setf ,results (multiple-value-list
94
+ (measure ,seconds ,conses ,@body)))
95
+ (values-list (nconc (list ,seconds ,conses)
96
+ ,results)))))
97
+
98
+ (defvar *functions-to-profile* nil)
99
+
100
+ (defvar *additional-markers* nil)
101
+
102
+ (defvar *profiling-threshold* nil)
103
+
104
+ (defun make-profiled-function (fn)
105
+ (lambda (style count-calls-p)
106
+ (declare (ignorable style count-calls-p))
107
+ #+allegro
108
+ (prof:with-profiling (:type style :count count-calls-p)
109
+ (funcall fn))
110
+ #-allegro
111
+ (funcall fn)))
112
+
113
+ (defun generate-profile-log-entry (log-name name seconds conses results error)
114
+ (ensure-directories-exist log-name)
115
+ ;;log
116
+ (with-open-file (output log-name
117
+ :direction :output
118
+ :if-does-not-exist :create
119
+ :if-exists :append)
120
+ (with-standard-io-syntax
121
+ (let ((*print-readably* nil))
122
+ (terpri output)
123
+ (format output "\(~11,d ~20,s ~10,s ~10,s ~{~s~^ ~} ~s ~s ~a\)"
124
+ (date-stamp :include-time? t) name
125
+ seconds conses *additional-markers*
126
+ results (current-profile-sample-count)
127
+ error)))))
128
+
129
+ (defun count-repetitions (fn delay &rest args)
130
+ (declare (dynamic-extent args))
131
+ (let ((event-count 0))
132
+ (handler-case
133
+ (with-timeout (delay)
134
+ (loop
135
+ (apply #'funcall fn args)
136
+ (incf event-count)))
137
+ (timeout-error (c)
138
+ (declare (ignore c))
139
+ (if (plusp event-count)
140
+ (/ event-count delay)
141
+ event-count)))))
142
+
143
+ #+test
144
+ (defun fibo (n)
145
+ (cond ((< n 2)
146
+ 1)
147
+ (t
148
+ (+ (fibo (- n 1)) (fibo (- n 2))))))
149
+
150
+ #+test
151
+ (with-profile-report ('test :time)
152
+ (loop for i from 1 to 10 do
153
+ (fibo i))
154
+ (loop for i from 10 downto 1 do
155
+ (fibo i)))
156
+
@@ -0,0 +1,161 @@
1
+ (in-package #:common-lisp-user)
2
+
3
+ (eval-when (:compile-toplevel :load-toplevel :execute)
4
+ (unless (find-package '#:lift)
5
+ (defpackage #:lift
6
+ (:use #:common-lisp #:com.metabang.trivial-timeout)
7
+ (:import-from
8
+ #+allegro #:mop
9
+ #+clisp #:clos
10
+ #+lispworks #:clos
11
+ #+(or mcl ccl) #:ccl
12
+ #+cmu #:clos-mop
13
+ #+sbcl #:sb-mop
14
+ #+scl #:clos
15
+ #:class-direct-subclasses
16
+ #:class-direct-superclasses
17
+ #:class-precedence-list)
18
+ (:export
19
+ #:*lift-report-detail-hook*
20
+ #:*lift-report-header-hook*
21
+ #:*lift-report-footer-hook*
22
+ #:describe-test-result
23
+ #:with-timeout
24
+
25
+ #:testsuite-ambiguous
26
+ #:testsuite-not-defined)
27
+ (:export
28
+ #:test-mixin
29
+ #:test-result
30
+ #:testsuite-p
31
+ #:*test-result*
32
+ #:*current-test*
33
+ #:last-test-status
34
+ #:suite-tested-p
35
+ #:failures
36
+ #:expected-failures
37
+ #:errors
38
+ #:expected-errors
39
+ #:ensure-cases
40
+ #:ensure-random-cases
41
+ #:deftestsuite
42
+ #:addtest
43
+ #:remove-test
44
+ #:run-test
45
+ #:run-tests
46
+
47
+ #:defmeasure
48
+ #:undefmeasure
49
+ #:measure-space
50
+ #:measure-seconds
51
+ #:while-measuring
52
+
53
+ #:measure-time
54
+ #:measure-conses
55
+
56
+ #:with-profile-report
57
+ #:write-profile-information
58
+ #:profiling-threshold*
59
+ #:*benchmark-log-path*
60
+ #:count-repetitions
61
+ #:while-counting-repetitions
62
+ #:while-counting-events
63
+
64
+ ;; Variables
65
+ #:*test-ignore-warnings?*
66
+ #:*test-break-on-errors?*
67
+ #:*test-break-on-failures?*
68
+ #:*test-print-length*
69
+ #:*test-print-level*
70
+ #:*test-print-when-defined?*
71
+ #:*test-evaluate-when-defined?*
72
+ #:*test-describe-if-not-successful?*
73
+ #:*test-maximum-time*
74
+ #:*test-print-testsuite-names*
75
+ #:*test-print-test-case-names*
76
+ #:*test-maximum-error-count*
77
+ #:*test-maximum-failure-count*
78
+ #:*lift-dribble-pathname*
79
+ #:*lift-report-pathname*
80
+ #:*current-asdf-system-name*
81
+ #:*test-scratchpad*
82
+ #:*test-notepad*
83
+ #:*lift-equality-test*
84
+ #:*lift-debug-output*
85
+ #:*test-show-expected-p*
86
+ #:*test-show-details-p*
87
+ #:*test-show-code-p*
88
+
89
+ ;; Other
90
+ #:ensure
91
+ #:ensure-null
92
+ #:ensure-same
93
+ #:ensure-different
94
+ #:ensure-condition
95
+ #:ensure-warning
96
+ #:ensure-error
97
+ #:ensure-no-warning
98
+
99
+ ;;?? Not yet
100
+ ;; with-test
101
+
102
+ #:list-tests
103
+ #:print-tests
104
+ #:map-testsuites
105
+ #:testsuites
106
+ #:testsuite-tests
107
+
108
+ #:suite
109
+ #:find-testsuite
110
+ #:find-test-case
111
+ #:ensure-random-cases-failure
112
+ #:random-instance-for-suite
113
+ #:defrandom-instance
114
+ #:ensure-random-cases
115
+ #:ensure-random-cases+
116
+ #:random-element
117
+ #:random-number
118
+ #:an-integer
119
+ #:a-double-float
120
+ #:a-single-float
121
+ #:a-symbol
122
+
123
+ #:lift-result
124
+ #:lift-property
125
+ #:liftpropos
126
+
127
+ #:handle-config-preference
128
+ ))))
129
+
130
+ (unless (and (find-package :asdf)
131
+ (find-symbol (symbol-name 'system-relative-pathname) :asdf)
132
+ (fboundp (find-symbol
133
+ (symbol-name 'system-relative-pathname) :asdf)))
134
+ (warn "LIFT uses asdf:system-relative-pathname which your version of ASDF
135
+ doesn't seem to include. LIFT will define these for now but you may want to consider updating to the most recent version of ASDF (see http://www.cliki.net/asdf for details).")
136
+ (intern (symbol-name 'system-source-file) :asdf)
137
+ (intern (symbol-name 'system-source-directory) :asdf)
138
+ (intern (symbol-name 'system-relative-pathname) :asdf)
139
+ (export 'asdf::system-relative-pathname :asdf)
140
+ (defun asdf::system-source-file (system-name)
141
+ (let ((system (asdf:find-system system-name)))
142
+ (make-pathname
143
+ :type "asd"
144
+ :name (asdf:component-name system)
145
+ :defaults (asdf:component-relative-pathname system))))
146
+
147
+ (defun asdf::system-source-directory (system-name)
148
+ (make-pathname :name nil
149
+ :type nil
150
+ :defaults (asdf::system-source-file system-name)))
151
+
152
+ (defun asdf::system-relative-pathname (system pathname &key name type)
153
+ (let ((directory (pathname-directory pathname)))
154
+ (when (eq (car directory) :absolute)
155
+ (setf (car directory) :relative))
156
+ (merge-pathnames
157
+ (make-pathname :name (or name (pathname-name pathname))
158
+ :type (or type (pathname-type pathname))
159
+ :directory directory)
160
+ (asdf::system-source-directory system)))))
161
+
@@ -0,0 +1,151 @@
1
+ (in-package #:lift)
2
+
3
+ (setf (documentation 'get-backtrace 'function)
4
+ "This is the function that is used internally by Hunchentoot to
5
+ show or log backtraces. It accepts a condition object ERROR and
6
+ returns a string with the corresponding backtrace.")
7
+
8
+ (defun ensure-directory (pathname)
9
+ (merge-pathnames #+clisp
10
+ (make-pathname :name "" :type "")
11
+ #-clisp
12
+ (make-pathname :name :unspecific :type :unspecific)
13
+ pathname))
14
+
15
+ (defun writable-directory-p (directory)
16
+ (let ((directory (ensure-directory directory)))
17
+ (and (probe-file directory)
18
+ #+allegro
19
+ (excl.osi:access directory excl.osi:*w-ok*))))
20
+
21
+ ;; Handle missing platforms gracefully?
22
+ (defun total-bytes-allocated ()
23
+ (if (fboundp '%total-bytes-allocated)
24
+ (funcall '%total-bytes-allocated)
25
+ 0))
26
+
27
+ #+allegro
28
+ (defun %total-bytes-allocated ()
29
+ (sys::gsgc-totalloc-bytes t))
30
+
31
+ #+(or digitool openmcl ccl)
32
+ (defun %total-bytes-allocated ()
33
+ (ccl::total-bytes-allocated))
34
+
35
+ #+sbcl
36
+ (defun %total-bytes-allocated ()
37
+ (cl-user::get-bytes-consed))
38
+
39
+ #+(or cmu scl)
40
+ (defun %total-bytes-allocated ()
41
+ (ext:get-bytes-consed))
42
+
43
+ #+lispworks
44
+ ;; thanks to Frank Schorr, via e-mail
45
+ (defun %total-bytes-allocated ()
46
+ (hcl:total-allocation))
47
+
48
+ #+(or mcl ccl)
49
+ (defun get-backtrace (error)
50
+ (with-output-to-string (s)
51
+ (let ((*debug-io* s))
52
+ (format *terminal-io* "~@<An unhandled error condition has been signalled:~3I ~a~I~:@>~%~%"
53
+ error)
54
+ (ccl:print-call-history :detailed-p nil))))
55
+
56
+ #+allegro
57
+ (defun get-backtrace (error)
58
+ (with-output-to-string (s)
59
+ (with-standard-io-syntax
60
+ (let ((*print-readably* nil)
61
+ (*print-miser-width* 40)
62
+ (*print-pretty* t)
63
+ (tpl:*zoom-print-circle* t)
64
+ (tpl:*zoom-print-level* nil)
65
+ (tpl:*zoom-print-length* nil))
66
+ (cl:ignore-errors
67
+ (format *terminal-io* "~&~@<An unhandled error condition has been signalled:~3I ~a~I~:@>~%~%"
68
+ error))
69
+ (cl:ignore-errors
70
+ (let ((*terminal-io* s)
71
+ (*standard-output* s))
72
+ (tpl:do-command "zoom"
73
+ :from-read-eval-print-loop nil
74
+ :count t
75
+ :all t)))))))
76
+
77
+ #+(or)
78
+ (defun zoom-to-stream (condition output)
79
+ (with-standard-io-syntax
80
+ (let ((*print-readably* nil)
81
+ (*print-miser-width* 40)
82
+ (*print-pretty* t)
83
+ (tpl:*zoom-print-circle* t)
84
+ (tpl:*zoom-print-level* nil)
85
+ (tpl:*zoom-print-length* nil))
86
+ (ignore-errors
87
+ (format *terminal-io* "Creating backtrace for ~a to ~a"
88
+ condition output))
89
+ (flet ((zoom (s)
90
+ (ignore-errors
91
+ (let ((*terminal-io* s)
92
+ (*standard-output* s))
93
+ (tpl:do-command "zoom"
94
+ :from-read-eval-print-loop nil
95
+ :count t :all t)))))
96
+ (cond ((streamp output)
97
+ (zoom output))
98
+ (t
99
+ (ensure-directories-exist output)
100
+ (with-open-file (s output :direction :output
101
+ :if-exists :supersede
102
+ :if-does-not-exist :create)
103
+ (zoom s))))))))
104
+
105
+ #+lispworks
106
+ (defun get-backtrace (error)
107
+ (declare (ignore error))
108
+ (with-output-to-string (s)
109
+ (let ((dbg::*debugger-stack* (dbg::grab-stack nil :how-many most-positive-fixnum))
110
+ (*debug-io* s)
111
+ (dbg:*debug-print-level* nil)
112
+ (dbg:*debug-print-length* nil))
113
+ (dbg:bug-backtrace nil))))
114
+
115
+ #+sbcl
116
+ ;; determine how we're going to access the backtrace in the next
117
+ ;; function
118
+ (eval-when (:compile-toplevel :load-toplevel :execute)
119
+ (when (find-symbol "*DEBUG-PRINT-VARIABLE-ALIST*" :sb-debug)
120
+ (pushnew :hunchentoot-sbcl-debug-print-variable-alist *features*)))
121
+
122
+ #+sbcl
123
+ (defun get-backtrace (error)
124
+ (declare (ignore error))
125
+ (with-output-to-string (s)
126
+ #+:hunchentoot-sbcl-debug-print-variable-alist
127
+ (let ((sb-debug:*debug-print-variable-alist*
128
+ (list* '(*print-level* . nil)
129
+ '(*print-length* . nil)
130
+ sb-debug:*debug-print-variable-alist*)))
131
+ (sb-debug:backtrace most-positive-fixnum s))
132
+ #-:hunchentoot-sbcl-debug-print-variable-alist
133
+ (let ((sb-debug:*debug-print-level* nil)
134
+ (sb-debug:*debug-print-length* nil))
135
+ (sb-debug:backtrace most-positive-fixnum s))))
136
+
137
+ #+clisp
138
+ (defun get-backtrace (error)
139
+ (declare (ignore error))
140
+ (with-output-to-string (s)
141
+ (system::print-backtrace :out s)))
142
+
143
+ #+(or cmucl scl)
144
+ (defun get-backtrace (error)
145
+ (declare (ignore error))
146
+ (with-output-to-string (s)
147
+ (let ((debug:*debug-print-level* nil)
148
+ (debug:*debug-print-length* nil))
149
+ (debug:backtrace most-positive-fixnum s))))
150
+
151
+