X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcheck.lisp;fp=src%2Fcheck.lisp;h=8d5f99fa971e2cc6b02f1cbbbc6328b63afdf63a;hb=7f0c63da7fc25ef601cf03c430c3f8d735e7ef29;hp=e91b46df8351bee8cfd3679aab6da056fd5673fb;hpb=b6937ebfdbd276ec7e332ceade0697184904e4e1;p=fiveam.git diff --git a/src/check.lisp b/src/check.lisp index e91b46d..8d5f99f 100644 --- a/src/check.lisp +++ b/src/check.lisp @@ -165,6 +165,25 @@ Wrapping the TEST form in a NOT simply preducse a negated reason string." (format *test-dribble* "s") (add-result 'test-skipped :reason (format nil ,@reason)))) +(defmacro is-equal (&rest args) + "Generates (is (equal (multiple-value-list ,expr) (multiple-value-list ,value))) for each pair of elements. +If the value is a (values a b * d *) form then the elements at * are not compared." + (with-unique-names (expr-result) + `(progn + ,@(loop for (expr value) on args by #'cddr + do (assert (and expr value)) + if (and (consp value) + (eq (car value) 'values)) + collect `(let ((,expr-result (multiple-value-list ,expr))) + ,@(loop for cell = (rest (copy-list value)) then (cdr cell) + for i from 0 + while cell + when (eq (car cell) '*) + collect `(setf (elt ,expr-result ,i) nil) + and do (setf (car cell) nil)) + (is (equal ,expr-result (multiple-value-list ,value)))) + else collect `(is (equal ,expr ,value)))))) + (defmacro is-true (condition &rest reason-args) "Like IS this check generates a pass if CONDITION returns true and a failure if CONDITION returns false. Unlike IS this check