X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Finterface.pure.lisp;h=7e43f9746104a2658337dc9e0db2010d3e9ce986;hb=9c9d6dbdc28a8bfe70be09f35263e9ec02411d0e;hp=156c535ae75ddd12ab8775fbd0ec8d528ee6e84d;hpb=881c3a215e3a82faf928265f8606f940f3e44e1e;p=sbcl.git diff --git a/tests/interface.pure.lisp b/tests/interface.pure.lisp index 156c535..7e43f97 100644 --- a/tests/interface.pure.lisp +++ b/tests/interface.pure.lisp @@ -12,6 +12,10 @@ ;;;; more information. (in-package :cl-user) + +(load "test-util.lisp") +(load "compiler-test-util.lisp") +(use-package :test-util) ;;;; properties of symbols, e.g. presence of doc strings for public symbols @@ -42,49 +46,6 @@ (describe #(1 2 3)) (describe #2a((1 2) (3 4))) -;;; support for DESCRIBE tests -(defstruct to-be-described a b) -(defclass forward-describe-class (forward-describe-ref) (a)) - -;;; DESCRIBE should run without signalling an error. -(describe (make-to-be-described)) -(describe 12) -(describe "a string") -(describe 'symbolism) -(describe (find-package :cl)) -(describe '(a list)) -(describe #(a vector)) - -;;; The DESCRIBE-OBJECT methods for built-in CL stuff should do -;;; FRESH-LINE and TERPRI neatly. -(dolist (i (list (make-to-be-described :a 14) 12 "a string" - #0a0 #(1 2 3) #2a((1 2) (3 4)) 'sym :keyword - (find-package :keyword) (list 1 2 3) - nil (cons 1 2) (make-hash-table) - (let ((h (make-hash-table))) - (setf (gethash 10 h) 100 - (gethash 11 h) 121) - h) - (make-condition 'simple-error) - (make-condition 'simple-error :format-control "fc") - #'car #'make-to-be-described (lambda (x) (+ x 11)) - (constantly 'foo) #'(setf to-be-described-a) - #'describe-object (find-class 'to-be-described) - (find-class 'forward-describe-class) - (find-class 'forward-describe-ref) (find-class 'cons))) - (let ((s (with-output-to-string (s) - (write-char #\x s) - (describe i s)))) - (unless (and (char= #\x (char s 0)) - ;; one leading #\NEWLINE from FRESH-LINE or the like, no more - (char= #\newline (char s 1)) - (char/= #\newline (char s 2)) - ;; one trailing #\NEWLINE from TERPRI or the like, no more - (let ((n (length s))) - (and (char= #\newline (char s (- n 1))) - (char/= #\newline (char s (- n 2)))))) - (error "misbehavior in DESCRIBE of ~S" i)))) - ;;; TYPEP, SUBTYPEP, UPGRADED-ARRAY-ELEMENT-TYPE and ;;; UPGRADED-COMPLEX-PART-TYPE should be able to deal with NIL as an ;;; environment argument @@ -100,15 +61,48 @@ (assert (not (special-operator-p 'declare))) ;;; WITH-TIMEOUT should accept more than one form in its body. -(handler-bind ((sb-ext:timeout #'continue)) - (sb-ext:with-timeout 3 - (sleep 2) - (sleep 2))) +(with-test (:name :with-timeout-forms) + (handler-bind ((sb-ext:timeout #'continue)) + (sb-ext:with-timeout 3 + (sleep 2) + (sleep 2)))) + +;;; SLEEP should not cons except on 32-bit platforms when +;;; (> (mod seconds 1) (* most-positive-fixnum 1e-9)) +(with-test (:name (sleep :non-consing) :fails-on :win32) + (handler-case (sb-ext:with-timeout 5 + (ctu:assert-no-consing (sleep 0.00001s0)) + (locally (declare (notinline sleep)) + (ctu:assert-no-consing (sleep 0.00001s0)) + (ctu:assert-no-consing (sleep 0.00001d0)) + (ctu:assert-no-consing (sleep 1/100000003)))) + (timeout ()))) + +;;; Changes to make SLEEP cons less led to SLEEP +;;; not sleeping at all on 32-bit platforms when +;;; (> (mod seconds 1) (* most-positive-fixnum 1e-9)). +(with-test (:name :bug-1194673) + (assert (eq :timeout + (handler-case + (with-timeout 0.01 + (sleep 0.6)) + (timeout () + :timeout))))) + +;;; SLEEP should work with large integers as well +(with-test (:name (sleep :pretty-much-forever)) + (assert (eq :timeout + (handler-case + (sb-ext:with-timeout 1 + (sleep (ash 1 (* 2 sb-vm:n-word-bits)))) + (sb-ext:timeout () + :timeout))))) ;;; DOCUMENTATION should return nil, not signal slot-unbound (documentation 'fixnum 'type) (documentation 'class 'type) (documentation (find-class 'class) 'type) +(documentation 'foo 'structure) ;;; DECODE-UNIVERSAL-TIME should accept second-resolution time-zones. (macrolet ((test (ut time-zone list) @@ -146,4 +140,31 @@ ;;; comprehensive test. (loop repeat 2 do (compile nil '(lambda (x) x)) - do (sb-ext:gc :full t)) \ No newline at end of file + do (sb-ext:gc :full t)) + +;;; On x86-64, the instruction definitions for CMP*[PS][SD] were broken +;;; so that the disassembler threw an error when they were used with +;;; one operand in memory. +(with-test (:name :bug-814702) + (disassemble (lambda (x) + (= #C(2.0f0 3.0f0) + (the (complex single-float) x)))) + (disassemble (lambda (x y) + (= (the (complex single-float) x) + (the (complex single-float) y))))) + +;;; Check that SLEEP called with ratios (with no common factors with +;;; 1000000000, and smaller than 1/1000000000) works more or less as +;;; expected. +(with-test (:name :sleep-ratios) + (let ((fun0a (compile nil '(lambda () (sleep 1/7)))) + (fun0b (compile nil '(lambda () (sleep 1/100000000000000000000000000)))) + (fun1 (compile nil '(lambda (x) (sleep x)))) + (start-time (get-universal-time))) + (sleep 1/7) + (sleep 1/100000000000000000000000000) + (funcall fun0a) + (funcall fun0b) + (funcall fun1 1/7) + (funcall fun1 1/100000000000000000000000000) + (assert (< (- (get-universal-time) start-time) 2))))