This module exports some macros and procedures which help in debugging and testing. Two interfaces are supplied. The old interface is a straight-forward port of Peter Seibel's test suite in "Practical Common Lisp" to Chicken Scheme.
Notice the special meaning of dots and colons in the documentation. Two dots: Repeat the form to the left zero or one times, three dots: zero or many times four dots: one or many times. Colons to the left of dots group forms: the dots refer to as many forms as are enclosed by colons.
- simple-tests ..procedure
documentation-procedure; returns the list of exported symbols if called with no symbol, otherwise the signature of that exported symbol sym.
- and? xpr #!rest xprsprocedure
non-short-circuated and, which executes all side-effects.
- writeln xpr #!rest xprsprocedure
like print, but writes expressions separated by a space in one line.
- pe macro-codeprocedure
pretty-prints expanded macro-code.
- (ppp xpr ...)syntax
print each xpr quoted in a headline and pretty-print its computed value.
- (ppp* xpr ypr . xpr-yprs)syntax
print each xpr quoted in a headline, and pretty-print xpr's computed as well as its expected value, ypr.
<macro>(ppp** ((var val) ...) xpr ypr . xpr-yprs)
wrap ppp* into a let.
- (xpr:val xpr ...)syntax
print each xpr quoted in a headline and pretty-print its computed value, alias to ppp.
- (xpr:val* xpr ypr . xpr-yprs)syntax
alias to ppp*
- == xprocedure
- == type? type-equal?procedure
generic procedure. The first resets the local database, the second returns the curried equality operator, corresponding to x, and the third adds a new pair to the local database. Using (== x) for comparison, you needn't supply a special comparison operator, (== x) will do it for you.
- (compound-test (name) test ...)syntax
This is the obligatory wrapper around each individual test predicate. Runs each test (usually created by define-test) in sequence and prints the results of each as well as a combined result. Exits with 0 or 1 depending on success or failure.
- (define-test (name . parameters) form . forms)syntax
creates a test predicate, (name . parameters), to be called within compound-test. That predicate will test and report the results of all of its form arguments.
global dynamic variable controlling location of possibly nested tests.
global variable collecting failure information
- (check ((var val) ...) xpr ypr . xpr-yprs)syntax
compares xpr and ypr .... with == in the environment defined by (var val)
- (define-checks (name? verbose? var val . var-vals) xpr ypr . xpr-yprs)syntax
defines a unary predicate, name?, with argument verbose?, which compares all pairs xpr ypr and prints a list of failures, if verbose? is #t or not given. Otherwise simply returns #t or #f, depending on the comparison of the pairs' items. If the verbose? argument in the generated predicate is missing, it's #t, so the output is verbose. Inside another check-predicate, it's usually #f, cf. arithmetic? below.
Comparison is done by the generic procedure ==. Each var val pair is translated into a let, supplying values to be used in test pairs.
- (do-checks (name? verbose? var val . var-vals) xpr ypr . xpr-yprs)syntax
alias to define-checks
- (check-all name check ...)syntax
tests each check in sequence and names it.
(import simple-tests) (define-test (+?) (= (+ 1 2) 3) (= (+ 1 2 3) 6)) (define-test (*?) (= (* 1 2) 2) (= (* 1 2 3) 6)) (define-test (arithmetic?) (+?) (*?)) (compound-test (simple-tests) (arithmetic?)) or, ALTERNATIVELY (check ((lst '(0 1 2 3))) lst '(0 1 2 3) (car lst) 0 (cadr lst) 1 (cddr lst) '(2 3) ) (define-checks (+? verbose?) (+ 1 2) 3 (+ 1 2 3) 6) (define-checks (*? verbose?) (* 1 2) 2 (* 1 2 3) 6) (define-checks (arithmetic? verbose?) (+? #f) #t (*? #f) #t) (check-all SIMPLE (+?) (*?) (arithmetic?))
Mai 16, 2020
Copyright (c) 2013-2020, Juergen Lorenz All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- check added
- ppp** added
- do-checks as an alias to define-checks added
- bugfix: protect state changing functions
- test-predicates without verbose? argument are verbose by default
- added a second testing interface
- ppp* added
- port with modifications from chicken-4, version 2.6, to chicken-5