1 ;; Tests for sb-aclrepl
3 (defpackage #:aclrepl-tests (:use #:sb-aclrepl #:cl))
4 (in-package #:aclrepl-tests)
6 (import '(sb-aclrepl::inspected-parts sb-aclrepl::inspected-description
7 sb-aclrepl::inspected-elements sb-aclrepl::parts-count
8 sb-aclrepl::parts-seq-type sb-aclrepl::find-part-id
9 sb-aclrepl::element-at sb-aclrepl::label-at
12 sb-aclrepl::display-inspect
13 sb-aclrepl::display-inspected-parts
14 sb-aclrepl::display-labeled-element
15 sb-aclrepl::*inspect-unbound-object-marker*
16 sb-aclrepl::*skip-address-display*
19 (eval-when (:compile-toplevel :load-toplevel :execute)
20 (unless (find-package 'regression-test)
21 (load (sb-aclrepl::compile-file-as-needed "rt.lisp"))))
22 (use-package :regression-test)
23 (setf regression-test::*catch-errors* nil)
27 (deftest hook.1 (boundp 'sb-impl::*inspect-fun*) t)
28 (deftest hook.2 (boundp 'sb-int:*repl-prompt-fun*) t)
29 (deftest hook.3 (boundp 'sb-int:*repl-read-form-fun*) t)
30 ;(deftest (boundp 'sb-debug::*invoke-debugger-fun*) t)
34 (defclass empty-class ()
36 (defparameter *empty-class* (make-instance 'empty-class))
38 (defclass empty-class ()
41 (defclass simple-class ()
44 (really-long-slot-name :initform "abc")))
46 (defstruct empty-struct
49 (defstruct tiny-struct
52 (defstruct simple-struct
55 (really-long-struct-slot-name "defg"))
57 (defparameter *empty-class* (make-instance 'empty-class))
58 (defparameter *simple-class* (make-instance 'simple-class))
59 (defparameter *empty-struct* (make-empty-struct))
60 (defparameter *tiny-struct* (make-tiny-struct))
61 (defparameter *simple-struct* (make-simple-struct))
62 (defparameter *normal-list* '(a b 3))
63 (defparameter *dotted-list* '(a b . 3))
64 (defparameter *cons-pair* '(#c(1 2) . a-symbol))
65 (defparameter *complex* #c(1 2))
66 (defparameter *ratio* 22/7)
67 (defparameter *double* 5.5d0)
68 (defparameter *array* (make-array '(3 3 2) :initial-element nil))
69 (defparameter *vector* (make-array '(20):initial-contents
71 10 11 12 13 14 15 16 17 18 19)))
73 (defun find-position (object id)
74 (nth-value 0 (find-part-id object id)))
76 (inspected-parts object))
77 (defun description (object)
78 (inspected-description object))
79 (defun elements (object &optional print (skip 0))
80 (nth-value 0 (inspected-elements object print skip )))
81 (defun elements-labels (object &optional print (skip 0))
82 (nth-value 1 (inspected-elements object print skip)))
83 (defun elements-count (object &optional print (skip 0))
84 (nth-value 2 (inspected-elements object print skip)))
86 (defun labeled-element (object pos &optional print (skip 0))
87 (with-output-to-string (strm)
88 (display-labeled-element
89 (aref (the simple-vector (elements object print skip)) pos)
90 (aref (the simple-vector (elements-labels object print skip)) pos)
93 (defun display (object &optional print (skip 0))
94 (with-output-to-string (strm)
95 (let ((*skip-address-display* t))
96 (display-inspect object strm print skip))))
98 (defun inspect (object)
99 (with-output-to-string (strm)
100 (let ((*skip-address-display* t))
101 (inspector `(quote ,object) nil strm))))
104 (with-output-to-string (strm)
105 (let ((*skip-address-display* t))
106 (sb-aclrepl::istep args strm))))
108 (deftest find.list.0 (find-position *normal-list* 0) 0)
109 (deftest find.list.1 (find-position *normal-list* 0) 0)
110 (deftest find.list.2 (find-position *normal-list* 1) 1)
111 (deftest find.list.3 (find-position *normal-list* 2) 2)
112 (deftest parts.list.1 (parts-count (parts *normal-list*)) 3)
113 (deftest parts.list.2 (element-at (parts *normal-list*) 0) a)
114 (deftest parts.list.3 (element-at (parts *normal-list*) 1) b)
115 (deftest parts.list.4 (element-at (parts *normal-list*) 2) 3)
116 (deftest parts.list.5 (label-at (parts *normal-list*) 0) 0)
117 (deftest parts.list.6 (label-at (parts *normal-list*) 1) 1)
118 (deftest parts.list.7 (label-at (parts *normal-list*) 2) 2)
119 (deftest parts.list.8 (parts-seq-type (parts *normal-list*)) :list)
121 (deftest elem.list.0 (elements-count *normal-list*) 3)
122 (deftest elem.list.1 (elements *normal-list*) #(a b 3))
123 (deftest elem.list.2 (elements-labels *normal-list*) #(0 1 2))
125 (deftest elem.dotted.0 (elements-count *dotted-list*) 3)
126 (deftest elem.dotted.1 (elements *dotted-list*) #(a b 3))
127 (deftest elem.dotted.2 (elements-labels *dotted-list*) #(0 1 :tail))
129 (deftest elem.consp.0 (elements-count *cons-pair*) 2)
130 (deftest elem.consp.1 (elements *cons-pair*) #(#c(1 2) a-symbol))
131 (deftest elem.consp.2 (elements-labels *cons-pair*)
132 #((0 . "car") (1 . "cdr")))
134 (deftest elem.complex.0 (elements-count *complex*) 2)
135 (deftest elem.complex.1 (elements *complex*) #(1 2))
136 (deftest elem.complex.2 (elements-labels *complex*)
137 #((0 . "real") (1 . "imag")))
139 (deftest elem.ratio.0 (elements-count *ratio*) 2)
140 (deftest elem.ratio.1 (elements *ratio*) #(22 7))
141 (deftest elem.ratio.2 (elements-labels *ratio*)
142 #((0 . "numerator") (1 . "denominator")))
144 (deftest elem.vector.0 (elements-count *vector*) 20)
145 (deftest elem.vector.1 (elements *vector*)
146 #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19))
147 (deftest elem.vector.2 (elements-labels *vector*)
148 #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19))
150 (deftest elem.vector.skip1.0 (elements-count *vector* nil 3) 18)
151 (deftest elem.vector.skip1.1 (elements *vector* nil 3)
152 #(nil 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19))
153 (deftest elem.vector.skip1.2 (elements-labels *vector* nil 3)
154 #(:ellipses 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19))
156 (deftest elem.vector.skip2.0 (elements-count *vector* 10 3) 13)
157 (deftest elem.vector.skip2.1 (elements *vector* 10 3)
158 #(nil 3 4 5 6 7 8 9 10 11 12 nil 19))
159 (deftest elem.vector.skip2.2 (elements-labels *vector* 10 3)
160 #(:ellipses 3 4 5 6 7 8 9 10 11 12 :ellipses 19))
162 (deftest elem.vector.skip3.0 (elements-count *vector* 5 16) 5)
163 (deftest elem.vector.skip3.1 (elements *vector* 5 16)
165 (deftest elem.vector.skip3.2 (elements-labels *vector* 5 16)
166 #(:ellipses 16 17 18 19))
168 (deftest elem.vector.skip4.0 (elements-count *vector* 2 16) 5)
169 (deftest elem.vector.skip4.1 (elements *vector* 2 16)
171 (deftest elem.vector.skip4.2 (elements-labels *vector* 2 16)
172 #(:ellipses 16 17 18 19))
174 (deftest elem.vector.skip5.0 (elements-count *vector* 2 15) 5)
175 (deftest elem.vector.skip5.1 (elements *vector* 2 15)
177 (deftest elem.vector.skip5.2 (elements-labels *vector* 2 15)
178 #(:ellipses 15 16 :ellipses 19))
180 (deftest elem.array.0 (elements-count *array*) 18)
181 (deftest elem.array.1 (elements *array*)
182 #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
184 (deftest elem.array.2 (elements-labels *array*)
185 #((0 . "[0,0,0]") (1 . "[0,0,1]") (2 . "[0,1,0]") (3 . "[0,1,1]")
186 (4 . "[0,2,0]") (5 . "[0,2,1]") (6 . "[1,0,0]") (7 . "[1,0,1]")
187 (8 . "[1,1,0]") (9 . "[1,1,1]") (10 . "[1,2,0]")
188 (11 . "[1,2,1]") (12 . "[2,0,0]") (13 . "[2,0,1]")
189 (14 . "[2,1,0]") (15 . "[2,1,1]") (16 . "[2,2,0]")
192 (deftest empty.class.0 (elements-count *empty-class*) 0)
193 (deftest empty.class.1 (elements *empty-class*) nil)
194 (deftest empty.class.2 (elements-labels *empty-class*) nil)
196 (deftest simple.class.0 (elements-count *simple-class*) 3)
197 (deftest simple.class.1 (elements *simple-class*)
198 #(#.*inspect-unbound-object-marker* 0 "abc"))
199 (deftest simple.class.2 (elements-labels *simple-class*)
200 #((0 . "A") (1 . "SECOND") (2 . "REALLY-LONG-SLOT-NAME")))
202 (deftest empty.struct.0 (elements-count *empty-struct*) 0)
203 (deftest empty.struct.1 (elements *empty-struct*) nil)
204 (deftest empty.struct.2 (elements-labels *empty-struct*) nil)
206 (deftest simple.struct.0 (elements-count *simple-struct*) 3)
207 (deftest simple.struct.1 (elements *simple-struct*)
208 #(nil a-value "defg"))
209 (deftest simple.struct.2 (elements-labels *simple-struct*)
210 #((0 . "FIRST") (1 . "SLOT-2")
211 (2 . "REALLY-LONG-STRUCT-SLOT-NAME")))
213 (deftest label.simple-struct.0 (labeled-element *simple-struct* 0)
214 " 0 FIRST ----------> the symbol NIL")
215 (deftest label.simple-struct.1 (labeled-element *simple-struct* 1)
216 " 1 SLOT-2 ---------> the symbol A-VALUE")
217 (deftest label.simple-struct.2 (labeled-element *simple-struct* 2)
218 " 2 REALLY-LONG-STRUCT-SLOT-NAME -> a simple-string (4) \"defg\"")
220 (deftest label.simple-class.0 (labeled-element *simple-class* 0)
221 " 0 A --------------> ..unbound..")
222 (deftest label.simple-class.1 (labeled-element *simple-class* 1)
223 " 1 SECOND ---------> fixnum 0")
224 (deftest label.simple-class.2 (labeled-element *simple-class* 2)
225 " 2 REALLY-LONG-SLOT-NAME -> a simple-string (3) \"abc\"")
227 (deftest label.complex.0 (labeled-element *complex* 0)
228 " 0 real -----------> fixnum 1")
229 (deftest label.complex.1 (labeled-element *complex* 1)
230 " 1 imag -----------> fixnum 2")
232 (deftest label.ratio.0 (labeled-element *ratio* 0)
233 " 0 numerator ------> fixnum 22")
234 (deftest label.ratio.1 (labeled-element *ratio* 1)
235 " 1 denominator ----> fixnum 7")
237 (deftest label.dotted-list.0 (labeled-element *dotted-list* 0)
239 (deftest label.dotted-list.1 (labeled-element *dotted-list* 1)
241 (deftest label.dotted-list.2 (labeled-element *dotted-list* 2)
244 (deftest label.normal-list.0
245 (labeled-element *normal-list* 0)
247 (deftest label.normal-list.1 (labeled-element *normal-list* 1)
249 (deftest label.normal-list.2 (labeled-element *normal-list* 2)
253 (deftest label.vector.0 (labeled-element *vector* 0)
255 (deftest label.vector.1 (labeled-element *vector* 1)
258 (deftest label.vector.skip1.0 (labeled-element *vector* 0 nil 2)
260 (deftest label.vector.skip1.1 (labeled-element *vector* 1 nil 2)
263 (deftest label.consp.0 (labeled-element *cons-pair* 0)
264 " 0 car ------------> complex number #C(1 2)")
265 (deftest label.consp.1 (labeled-element *cons-pair* 1)
266 " 1 cdr ------------> the symbol A-SYMBOL")
268 (deftest nil.parts.0 (elements-count nil) 5)
270 (deftest tiny.struct.0 (elements-count *tiny-struct*) 1)
271 (deftest tiny.struct.1 (elements *tiny-struct*) #(10))
272 (deftest tiny.struct.2 (elements-labels *tiny-struct*) #((0 . "FIRST")))
274 (deftest tiny.struct.skip1.0 (elements-count *tiny-struct* nil 1) 1)
275 (deftest tiny.struct.skip1.1 (elements *tiny-struct* nil 1)
277 (deftest tiny.struct.skip1.2 (elements-labels *tiny-struct* nil 1)
280 (deftest tiny.double.0 (elements-count *double*) 0)
282 (deftest tiny.double.skip1.0 (elements-count *double* nil 1) 0)
283 (deftest tiny.double.skip1.1 (elements *double* nil 0)
285 (deftest tiny.doubel.skip1.2 (elements-labels *double* nil 1)
288 (deftest display.consp.0 (display *cons-pair*)
290 0 car ------------> complex number #C(1 2)
291 1 cdr ------------> the symbol A-SYMBOL")
293 (deftest display.struct.0 (display *simple-struct*)
294 "#<STRUCTURE-CLASS SIMPLE-STRUCT>
295 0 FIRST ----------> the symbol NIL
296 1 SLOT-2 ---------> the symbol A-VALUE
297 2 REALLY-LONG-STRUCT-SLOT-NAME -> a simple-string (4) \"defg\"")
299 (deftest display.struct.1 (display *simple-struct* nil 2 )
300 "#<STRUCTURE-CLASS SIMPLE-STRUCT>
302 2 REALLY-LONG-STRUCT-SLOT-NAME -> a simple-string (4) \"defg\"")
304 (deftest display.vector.0 (display *vector* 5 6)
305 "a simple T vector (20)
316 (deftest inspect.0 (prog1 (inspect *simple-struct*))
317 "#<STRUCTURE-CLASS SIMPLE-STRUCT>
318 0 FIRST ----------> the symbol NIL
319 1 SLOT-2 ---------> the symbol A-VALUE
320 2 REALLY-LONG-STRUCT-SLOT-NAME -> a simple-string (4) \"defg\"")
322 (deftest istep.0 (prog1
323 (progn (inspect *simple-struct*) (istep '("=")))
325 "#<STRUCTURE-CLASS SIMPLE-STRUCT>
326 0 FIRST ----------> the symbol NIL
327 1 SLOT-2 ---------> the symbol A-VALUE
328 2 REALLY-LONG-STRUCT-SLOT-NAME -> a simple-string (4) \"defg\"")
330 (deftest istep.1 (prog1
331 (progn (inspect *simple-struct*) (istep '("first")))
334 0 NAME -----------> a simple-string (3) \"NIL\"
335 1 PACKAGE --------> the COMMON-LISP package
336 2 VALUE ----------> the symbol NIL
337 3 FUNCTION -------> ..unbound..
338 4 PLIST ----------> the symbol NIL")
340 (deftest istep.2 (prog1
341 (progn (inspect *simple-struct*) (istep '("first"))
345 0 NAME -----------> a simple-string (7) \"A-VALUE\"
346 1 PACKAGE --------> the ACLREPL-TESTS package
347 2 VALUE ----------> ..unbound..
348 3 FUNCTION -------> ..unbound..
349 4 PLIST ----------> the symbol NIL")
351 (deftest istep.3 (prog1
352 (progn (inspect *simple-struct*) (istep '("first"))
353 (istep '(">")) (istep '("<")))
356 0 NAME -----------> a simple-string (3) \"NIL\"
357 1 PACKAGE --------> the COMMON-LISP package
358 2 VALUE ----------> the symbol NIL
359 3 FUNCTION -------> ..unbound..
360 4 PLIST ----------> the symbol NIL")
362 (deftest istep.4 (prog1
363 (progn (inspect *simple-struct*) (istep '("first"))
364 (istep '(">")) (istep '("<")) (istep '("tree")))
366 "The current object is:
367 the symbol NIL, which was selected by FIRST
368 #<STRUCTURE-CLASS SIMPLE-STRUCT>, which was selected by (inspect ...)
371 (deftest istep.5 (prog1
372 (progn (inspect *simple-struct*) (istep '("first"))
373 (istep '(">")) (istep '("<")) (istep '("-")))
375 "#<STRUCTURE-CLASS SIMPLE-STRUCT>
376 0 FIRST ----------> the symbol NIL
377 1 SLOT-2 ---------> the symbol A-VALUE
378 2 REALLY-LONG-STRUCT-SLOT-NAME -> a simple-string (4) \"defg\"")
380 (deftest istep.6 (prog1
381 (progn (inspect *dotted-list*) (istep '("tail")))
385 (deftest istep.7 (prog1
386 (progn (inspect *dotted-list*) (istep '("2")))
392 (when (pending-tests)
393 (error "Some tests failed."))