Update of /project/ieeefp-tests/cvsroot/ieeefp-tests In directory common-lisp.net:/tmp/cvs-serv23125
Modified Files: ieeefp-tests.lisp package.lisp Log Message: Add machinery for testing exceptions (disabled by default, enable using IEEEFP-TESTS:*TEST-EXCEPTIONS*).
Include the original line in the generated test for slightly easier debugging.
Date: Thu Jun 17 10:32:17 2004 Author: crhodes
Index: ieeefp-tests/ieeefp-tests.lisp diff -u ieeefp-tests/ieeefp-tests.lisp:1.9 ieeefp-tests/ieeefp-tests.lisp:1.10 --- ieeefp-tests/ieeefp-tests.lisp:1.9 Wed Jun 16 03:35:54 2004 +++ ieeefp-tests/ieeefp-tests.lisp Thu Jun 17 10:32:17 2004 @@ -6,6 +6,8 @@ (defvar *rounding-modes* (list :nearest :zero :positive-infinity :negative-infinity))
+(defvar *test-exceptions* nil) + ;; So we can run log10 tests (defun log10 (x) (log x (float 10 x))) @@ -16,7 +18,8 @@ (abs (complex x y)))
(defclass test-vector () - ((fun-name :initarg :fun-name :accessor fun-name) + ((line :initarg :line :accessor line) + (fun-name :initarg :fun-name :accessor fun-name) (lisp-fun-name :accessor lisp-fun-name) (fun-arity :accessor fun-arity) (precision :initarg :precision :accessor precision) @@ -144,7 +147,7 @@ ;; until we start testing exceptions. I think it ;; means that the following exception may or may not ;; be present. - (#? (setf exceptions nil)))) + (#? (push 'maybe exceptions)))) (setf args-and-expected-answer (loop for x on (nthcdr 4 split) by (ecase precision @@ -162,11 +165,12 @@ (ash (parse-integer (caddr x) :radix 16) 32) (parse-integer (cadddr x) :radix 16))))))) (push (make-instance 'test-vector + :line line :fun-name function-name :precision precision :rounding-mode rounding-mode :test test - :exceptions exceptions + :exceptions (nreverse exceptions) :args-and-expected-answer args-and-expected-answer) tests))))))))
@@ -268,116 +272,122 @@ (set-floating-point-modes :accrued-exceptions nil :current-exceptions nil))
+(defun get-accrued-exceptions () + (getf (get-floating-point-modes) :accrued-exceptions)) + (defun emit-double-value-tests (vector stream) - #| (when (eq (rounding-mode vector) :nearest) .. |# (when (member (rounding-mode vector) *rounding-modes*) (pprint - `(rt:deftest ,(make-test-name vector 'value #|'eval-value|#) + `(rt:deftest ,(make-test-name vector 'value) (progn + ,(line vector) (set-up-fpcw-state ,(rounding-mode vector)) (let ((result - #|(eval '|#(,(lisp-fun-name vector) - ,@(mapcar (lambda (x) - `(prog1 - (make-double-float ,x) - (clear-fpcw-exceptions))) - (fun-args vector)))))#|)|# + (,(lisp-fun-name vector) + ,@(mapcar (lambda (x) + `(make-double-float ,x)) + (fun-args vector))))) ,(make-result-test-form vector))) t) stream)))
(defun emit-single-value-tests (vector stream) - #| (when (eq (rounding-mode vector) :nearest) .. |# (when (member (rounding-mode vector) *rounding-modes*) (pprint - `(rt:deftest ,(make-test-name vector 'value #|'eval-value|#) + `(rt:deftest ,(make-test-name vector 'value) (progn + ,(line vector) (set-up-fpcw-state ,(rounding-mode vector)) (let ((result - #|(eval '|#(,(lisp-fun-name vector) - ,@(mapcar (lambda (x) - `(prog1 - (make-single-float ,x) - (clear-fpcw-exceptions))) - (fun-args vector)))))#|)|# + (,(lisp-fun-name vector) + ,@(mapcar (lambda (x) + `(make-single-float ,x)) + (fun-args vector))))) ,(make-result-test-form vector))) t) - stream) - #+nil + stream))) + +(defun emit-double-exceptions-tests (vector stream) + (when (and (member (rounding-mode vector) *rounding-modes*) + *test-exceptions*) (pprint - `(rt:deftest ,(make-test-name vector 'compile-value) - (progn - ,(let ((arglist (mapcar (lambda (x) (declare (ignore x)) (gentemp)) - (fun-args vector)))) - `(let ((fn (compile nil '(lambda ,arglist - (,(lisp-fun-name vector) ,@arglist))))) - (set-up-fpcw-state ,(rounding-mode vector)) - (let ((result (funcall fn ,@(mapcar (lambda (x) - `(prog1 - (make-single-float ,x) - (clear-fpcw-exceptions))) - (fun-args vector))))) - ,(make-result-test-form vector))))) - t) - stream) - #+nil + (let* ((maybes (loop for x on (exceptions vector) + if (eq (car x) 'maybe) + collect (cadr x))) + (definites (sort + (set-difference (remove 'maybe (exceptions vector)) + maybes) + #'string<))) + `(rt:deftest ,(make-test-name vector 'exceptions) + (block nil + ,(line vector) + (set-up-fpcw-state ,(rounding-mode vector)) + (let ((answer + (,(lisp-fun-name vector) + ,@(mapcar (lambda (x) + `(make-double-float ,x)) + (fun-args vector)))) + (result + (sort + (remove-if-not + (lambda (x) + (member x + '(:invalid :underflow :overflow + :divide-by-zero :inexact))) + (set-difference (get-accrued-exceptions) + ',maybes)) + #'string<))) + (if (complexp answer) + ',definites + result))) + ,definites)) + stream))) + +(defun emit-single-exceptions-tests (vector stream) + (when (and (member (rounding-mode vector) *rounding-modes*) + *test-exceptions*) (pprint - `(rt:deftest ,(make-test-name vector 'compile-declared-value) - (progn - ,(let ((arglist (mapcar (lambda (x) (declare (ignore x)) (gentemp)) - (fun-args vector)))) - `(let ((fn (compile nil '(lambda ,arglist - (declare (type single-float ,@arglist)) - (,(lisp-fun-name vector) ,@arglist))))) - (set-up-fpcw-state ,(rounding-mode vector)) - (let ((result (funcall fn ,@(mapcar (lambda (x) - `(prog1 - (make-single-float ,x) - (clear-fpcw-exceptions))) - (fun-args vector))))) - ,(make-result-test-form vector))))) - t) + (let* ((maybes (loop for x on (exceptions vector) + if (eq (car x) 'maybe) + collect (cadr x))) + (definites (sort + (set-difference (remove 'maybe (exceptions vector)) + maybes) + #'string<))) + `(rt:deftest ,(make-test-name vector 'exceptions) + (block nil + ,(line vector) + (set-up-fpcw-state ,(rounding-mode vector)) + (let ((answer + (,(lisp-fun-name vector) + ,@(mapcar (lambda (x) + `(make-single-float ,x)) + (fun-args vector)))) + (result + (sort + (remove-if-not + (lambda (x) + (member x + '(:invalid :underflow :overflow + :divide-by-zero :inexact))) + (set-difference (get-accrued-exceptions) + ',maybes)) + #'string<))) + (if (complexp answer) + ',definites + result))) + ,definites)) stream)))
(defmethod emit-tests-from-one-vector ((vector test-vector) stream) (let ((*print-case* :downcase)) (ecase (precision vector) (:single - #+nil - (pprint - `(rt:deftest ,(intern - (format nil "~@:(~A~)-~@:(~A~)-EVAL-EXCEPTIONS.~D" - (precision vector) - (lisp-fun-name vector) - *test-counter*)) - (progn - (set-floating-point-modes - :traps nil - :accrued-exceptions nil - :current-exceptions nil - :rounding-mode ,(rounding-mode vector)) - (let ((result - (eval '(,(lisp-fun-name vector) ,@(mapcar - (lambda (x) - `(prog1 - (make-single-float ,x) - (set-floating-point-modes - :accrued-exceptions nil - :current-exceptions nil))) - (fun-args vector)))))) - (if (complexp result) - ;; FIXME - ',(exceptions vector) - (sort - (intersection - (getf (sb-int:get-floating-point-modes) :accrued-exceptions) - '(:inexact :invalid :overflow :underflow :divide-by-zero)) - #'string<)))) - ,(exceptions vector)) - stream) - (emit-single-value-tests vector stream)) + (emit-single-value-tests vector stream) + (emit-single-exceptions-tests vector stream)) (:double - (emit-double-value-tests vector stream)) + (emit-double-value-tests vector stream) + (emit-double-exceptions-tests vector stream)) )))
(defun make-one-test-file (fun-name precision) @@ -400,7 +410,7 @@ (dolist (type *float-types*) (pushnew (make-one-test-file fun type) *test-files* :test #'equal)))
-(defvar *revision* "$Revision: 1.9 $") +(defvar *revision* "$Revision: 1.10 $")
(defun format-date (stream arg colonp atp) (declare (ignore colonp atp))
Index: ieeefp-tests/package.lisp diff -u ieeefp-tests/package.lisp:1.3 ieeefp-tests/package.lisp:1.4 --- ieeefp-tests/package.lisp:1.3 Tue Jun 15 06:55:07 2004 +++ ieeefp-tests/package.lisp Thu Jun 17 10:32:17 2004 @@ -2,11 +2,11 @@ (:use "CL") (:export "MAKE-SINGLE-FLOAT" "MAKE-DOUBLE-FLOAT" "SINGLE-FLOAT-BITS" "DOUBLE-FLOAT-BITS" - "SET-FLOATING-POINT-MODES")) + "GET-FLOATING-POINT-MODES" "SET-FLOATING-POINT-MODES"))
(defpackage "IEEE754-INTERNALS" (:use "CL" "IEEE754"))
(defpackage "IEEEFP-TESTS" (:use "CL" "IEEE754" "SPLIT-SEQUENCE") - (:export "*FLOAT-TYPES*" "*ROUNDING-MODES*")) + (:export "*FLOAT-TYPES*" "*ROUNDING-MODES*" "*TEST-EXCEPTIONS*"))
ieeefp-tests-cvs@common-lisp.net