X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fdefstruct.impure.lisp;h=bca97caf466a543bf6294096543763c56328a857;hb=19b57ee6640261133a179417c814ca38039e1ab1;hp=6c264665b3b93078346038ab69010b9096738571;hpb=4eb1a6d3ad2b7dcc19ac0ec979a1eb1eb049659a;p=sbcl.git diff --git a/tests/defstruct.impure.lisp b/tests/defstruct.impure.lisp index 6c26466..bca97ca 100644 --- a/tests/defstruct.impure.lisp +++ b/tests/defstruct.impure.lisp @@ -177,13 +177,26 @@ ;;; debugger is having a bad day (defvar *instance*) -(defmacro test-variant (defstructname &key colontype) +(defmacro test-variant (defstructname &key colontype boa-constructor-p) `(progn (format t "~&/beginning PROGN for COLONTYPE=~S~%" ',colontype) (defstruct (,defstructname - ,@(when colontype `((:type ,colontype)))) + ,@(when colontype `((:type ,colontype))) + ,@(when boa-constructor-p + `((:constructor ,(symbol+ "CREATE-" defstructname) + (id + &optional + (optional-test 2 optional-test-p) + &key + (home nil home-p) + (no-home-comment "Home package CL not provided.") + (comment (if home-p "" no-home-comment)) + (refcount (if optional-test-p optional-test nil)) + hash + weight))))) + ;; some ordinary tagged slots id (home nil :type package :read-only t) @@ -197,12 +210,19 @@ (format t "~&/done with DEFSTRUCT~%") (let* ((cn (string+ ',defstructname "-")) ; conc-name - (ctor (symbol-function (symbol+ "MAKE-" ',defstructname))) + (ctor (symbol-function ',(symbol+ (if boa-constructor-p + "CREATE-" + "MAKE-") + defstructname))) (*instance* (funcall ctor - :id "some id" + ,@(unless boa-constructor-p + `(:id)) "some id" + ,@(when boa-constructor-p + '(1)) :home (find-package :cl) :hash (+ 14 most-positive-fixnum) - :refcount 1))) + ,@(unless boa-constructor-p + `(:refcount 1))))) ;; Check that ctor set up slot values correctly. (format t "~&/checking constructed structure~%") @@ -273,6 +293,73 @@ (test-variant vanilla-struct) (test-variant vector-struct :colontype vector) (test-variant list-struct :colontype list) +(test-variant vanilla-struct :boa-constructor-p t) +(test-variant vector-struct :colontype vector :boa-constructor-p t) +(test-variant list-struct :colontype list :boa-constructor-p t) + + +;;;; testing raw slots harder +;;;; +;;;; The offsets of raw slots need to be rescaled during the punning +;;;; process which is used to access them. That seems like a good +;;;; place for errors to lurk, so we'll try hunting for them by +;;;; verifying that all the raw slot data gets written successfully +;;;; into the object, can be copied with the object, and can then be +;;;; read back out (with none of it ending up bogusly outside the +;;;; object, so that it couldn't be copied, or bogusly overwriting +;;;; some other raw slot). + +(defstruct manyraw + (a (expt 2 30) :type (unsigned-byte 32)) + (b 0.1 :type single-float) + (c 0.2d0 :type double-float) + (d #c(0.3 0.3) :type (complex single-float)) + unraw-slot-just-for-variety + (e #c(0.4d0 0.4d0) :type (complex double-float)) + (aa (expt 2 30) :type (unsigned-byte 32)) + (bb 0.1 :type single-float) + (cc 0.2d0 :type double-float) + (dd #c(0.3 0.3) :type (complex single-float)) + (ee #c(0.4d0 0.4d0) :type (complex double-float))) + +(defvar *manyraw* (make-manyraw)) + +(assert (eql (manyraw-a *manyraw*) (expt 2 30))) +(assert (eql (manyraw-b *manyraw*) 0.1)) +(assert (eql (manyraw-c *manyraw*) 0.2d0)) +(assert (eql (manyraw-d *manyraw*) #c(0.3 0.3))) +(assert (eql (manyraw-e *manyraw*) #c(0.4d0 0.4d0))) +(assert (eql (manyraw-aa *manyraw*) (expt 2 30))) +(assert (eql (manyraw-bb *manyraw*) 0.1)) +(assert (eql (manyraw-cc *manyraw*) 0.2d0)) +(assert (eql (manyraw-dd *manyraw*) #c(0.3 0.3))) +(assert (eql (manyraw-ee *manyraw*) #c(0.4d0 0.4d0))) + +(setf (manyraw-aa *manyraw*) (expt 2 31) + (manyraw-bb *manyraw*) 0.11 + (manyraw-cc *manyraw*) 0.22d0 + (manyraw-dd *manyraw*) #c(0.33 0.33) + (manyraw-ee *manyraw*) #c(0.44d0 0.44d0)) + +(let ((copy (copy-manyraw *manyraw*))) + (assert (eql (manyraw-a copy) (expt 2 30))) + (assert (eql (manyraw-b copy) 0.1)) + (assert (eql (manyraw-c copy) 0.2d0)) + (assert (eql (manyraw-d copy) #c(0.3 0.3))) + (assert (eql (manyraw-e copy) #c(0.4d0 0.4d0))) + (assert (eql (manyraw-aa copy) (expt 2 31))) + (assert (eql (manyraw-bb copy) 0.11)) + (assert (eql (manyraw-cc copy) 0.22d0)) + (assert (eql (manyraw-dd copy) #c(0.33 0.33))) + (assert (eql (manyraw-ee copy) #c(0.44d0 0.44d0)))) + +;;;; miscellaneous old bugs + +(defstruct ya-struct) +(when (ignore-errors (or (ya-struct-p) 12)) + (error "YA-STRUCT-P of no arguments should signal an error.")) +(when (ignore-errors (or (ya-struct-p 'too 'many 'arguments) 12)) + (error "YA-STRUCT-P of three arguments should signal an error.")) ;;; success (format t "~&/returning success~%")