Hex Artifact Content
Not logged in

Artifact 6170975af891cbbb5ad7ae791c01dfd76af5c25d:


0000: 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 28 63 29  ;; Copyright (c)
0010: 20 32 30 30 35 2c 20 32 30 30 36 20 50 65 72 20   2005, 2006 Per 
0020: 42 6f 74 68 6e 65 72 0a 3b 3b 0a 3b 3b 20 50 65  Bothner.;;.;; Pe
0030: 72 6d 69 73 73 69 6f 6e 20 69 73 20 68 65 72 65  rmission is here
0040: 62 79 20 67 72 61 6e 74 65 64 2c 20 66 72 65 65  by granted, free
0050: 20 6f 66 20 63 68 61 72 67 65 2c 20 74 6f 20 61   of charge, to a
0060: 6e 79 20 70 65 72 73 6f 6e 0a 3b 3b 20 6f 62 74  ny person.;; obt
0070: 61 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  aining a copy of
0080: 20 74 68 69 73 20 73 6f 66 74 77 61 72 65 20 61   this software a
0090: 6e 64 20 61 73 73 6f 63 69 61 74 65 64 20 64 6f  nd associated do
00a0: 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 3b 3b 20 66  cumentation.;; f
00b0: 69 6c 65 73 20 28 74 68 65 20 22 53 6f 66 74 77  iles (the "Softw
00c0: 61 72 65 22 29 2c 20 74 6f 20 64 65 61 6c 20 69  are"), to deal i
00d0: 6e 20 74 68 65 20 53 6f 66 74 77 61 72 65 20 77  n the Software w
00e0: 69 74 68 6f 75 74 0a 3b 3b 20 72 65 73 74 72 69  ithout.;; restri
00f0: 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67  ction, including
0100: 20 77 69 74 68 6f 75 74 20 6c 69 6d 69 74 61 74   without limitat
0110: 69 6f 6e 20 74 68 65 20 72 69 67 68 74 73 20 74  ion the rights t
0120: 6f 20 75 73 65 2c 20 63 6f 70 79 2c 0a 3b 3b 20  o use, copy,.;; 
0130: 6d 6f 64 69 66 79 2c 20 6d 65 72 67 65 2c 20 70  modify, merge, p
0140: 75 62 6c 69 73 68 2c 20 64 69 73 74 72 69 62 75  ublish, distribu
0150: 74 65 2c 20 73 75 62 6c 69 63 65 6e 73 65 2c 20  te, sublicense, 
0160: 61 6e 64 2f 6f 72 20 73 65 6c 6c 20 63 6f 70 69  and/or sell copi
0170: 65 73 0a 3b 3b 20 6f 66 20 74 68 65 20 53 6f 66  es.;; of the Sof
0180: 74 77 61 72 65 2c 20 61 6e 64 20 74 6f 20 70 65  tware, and to pe
0190: 72 6d 69 74 20 70 65 72 73 6f 6e 73 20 74 6f 20  rmit persons to 
01a0: 77 68 6f 6d 20 74 68 65 20 53 6f 66 74 77 61 72  whom the Softwar
01b0: 65 20 69 73 0a 3b 3b 20 66 75 72 6e 69 73 68 65  e is.;; furnishe
01c0: 64 20 74 6f 20 64 6f 20 73 6f 2c 20 73 75 62 6a  d to do so, subj
01d0: 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ect to the follo
01e0: 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 73 3a  wing conditions:
01f0: 0a 3b 3b 0a 3b 3b 20 54 68 65 20 61 62 6f 76 65  .;;.;; The above
0200: 20 63 6f 70 79 72 69 67 68 74 20 6e 6f 74 69 63   copyright notic
0210: 65 20 61 6e 64 20 74 68 69 73 20 70 65 72 6d 69  e and this permi
0220: 73 73 69 6f 6e 20 6e 6f 74 69 63 65 20 73 68 61  ssion notice sha
0230: 6c 6c 20 62 65 0a 3b 3b 20 69 6e 63 6c 75 64 65  ll be.;; include
0240: 64 20 69 6e 20 61 6c 6c 20 63 6f 70 69 65 73 20  d in all copies 
0250: 6f 72 20 73 75 62 73 74 61 6e 74 69 61 6c 20 70  or substantial p
0260: 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 53  ortions of the S
0270: 6f 66 74 77 61 72 65 2e 0a 3b 3b 0a 3b 3b 20 54  oftware..;;.;; T
0280: 48 45 20 53 4f 46 54 57 41 52 45 20 49 53 20 50  HE SOFTWARE IS P
0290: 52 4f 56 49 44 45 44 20 22 41 53 20 49 53 22 2c  ROVIDED "AS IS",
02a0: 20 57 49 54 48 4f 55 54 20 57 41 52 52 41 4e 54   WITHOUT WARRANT
02b0: 59 20 4f 46 20 41 4e 59 20 4b 49 4e 44 2c 0a 3b  Y OF ANY KIND,.;
02c0: 3b 20 45 58 50 52 45 53 53 20 4f 52 20 49 4d 50  ; EXPRESS OR IMP
02d0: 4c 49 45 44 2c 20 49 4e 43 4c 55 44 49 4e 47 20  LIED, INCLUDING 
02e0: 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20  BUT NOT LIMITED 
02f0: 54 4f 20 54 48 45 20 57 41 52 52 41 4e 54 49 45  TO THE WARRANTIE
0300: 53 20 4f 46 0a 3b 3b 20 4d 45 52 43 48 41 4e 54  S OF.;; MERCHANT
0310: 41 42 49 4c 49 54 59 2c 20 46 49 54 4e 45 53 53  ABILITY, FITNESS
0320: 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41   FOR A PARTICULA
0330: 52 20 50 55 52 50 4f 53 45 20 41 4e 44 0a 3b 3b  R PURPOSE AND.;;
0340: 20 4e 4f 4e 49 4e 46 52 49 4e 47 45 4d 45 4e 54   NONINFRINGEMENT
0350: 2e 20 49 4e 20 4e 4f 20 45 56 45 4e 54 20 53 48  . IN NO EVENT SH
0360: 41 4c 4c 20 54 48 45 20 41 55 54 48 4f 52 53 20  ALL THE AUTHORS 
0370: 4f 52 20 43 4f 50 59 52 49 47 48 54 20 48 4f 4c  OR COPYRIGHT HOL
0380: 44 45 52 53 0a 3b 3b 20 42 45 20 4c 49 41 42 4c  DERS.;; BE LIABL
0390: 45 20 46 4f 52 20 41 4e 59 20 43 4c 41 49 4d 2c  E FOR ANY CLAIM,
03a0: 20 44 41 4d 41 47 45 53 20 4f 52 20 4f 54 48 45   DAMAGES OR OTHE
03b0: 52 20 4c 49 41 42 49 4c 49 54 59 2c 20 57 48 45  R LIABILITY, WHE
03c0: 54 48 45 52 20 49 4e 20 41 4e 0a 3b 3b 20 41 43  THER IN AN.;; AC
03d0: 54 49 4f 4e 20 4f 46 20 43 4f 4e 54 52 41 43 54  TION OF CONTRACT
03e0: 2c 20 54 4f 52 54 20 4f 52 20 4f 54 48 45 52 57  , TORT OR OTHERW
03f0: 49 53 45 2c 20 41 52 49 53 49 4e 47 20 46 52 4f  ISE, ARISING FRO
0400: 4d 2c 20 4f 55 54 20 4f 46 20 4f 52 20 49 4e 0a  M, OUT OF OR IN.
0410: 3b 3b 20 43 4f 4e 4e 45 43 54 49 4f 4e 20 57 49  ;; CONNECTION WI
0420: 54 48 20 54 48 45 20 53 4f 46 54 57 41 52 45 20  TH THE SOFTWARE 
0430: 4f 52 20 54 48 45 20 55 53 45 20 4f 52 20 4f 54  OR THE USE OR OT
0440: 48 45 52 20 44 45 41 4c 49 4e 47 53 20 49 4e 20  HER DEALINGS IN 
0450: 54 48 45 0a 3b 3b 20 53 4f 46 54 57 41 52 45 2e  THE.;; SOFTWARE.
0460: 0a 0a 28 63 6f 6e 64 2d 65 78 70 61 6e 64 0a 20  ..(cond-expand. 
0470: 28 72 36 72 73 29 0a 20 28 63 68 69 63 6b 65 6e  (r6rs). (chicken
0480: 0a 20 20 28 72 65 71 75 69 72 65 2d 65 78 74 65  .  (require-exte
0490: 6e 73 69 6f 6e 20 73 79 6e 74 61 78 2d 63 61 73  nsion syntax-cas
04a0: 65 29 29 0a 20 28 67 75 69 6c 65 0a 20 20 28 75  e)). (guile.  (u
04b0: 73 65 2d 6d 6f 64 75 6c 65 73 20 28 69 63 65 2d  se-modules (ice-
04c0: 39 20 73 79 6e 63 61 73 65 29 20 28 73 72 66 69  9 syncase) (srfi
04d0: 20 73 72 66 69 2d 39 29 0a 09 20 20 20 20 20 20   srfi-9)..      
04e0: 20 3b 3b 28 73 72 66 69 20 73 72 66 69 2d 33 34   ;;(srfi srfi-34
04f0: 29 20 28 73 72 66 69 20 73 72 66 69 2d 33 35 29  ) (srfi srfi-35)
0500: 20 2d 20 6e 6f 74 20 69 6e 20 47 75 69 6c 65 20   - not in Guile 
0510: 31 2e 36 2e 37 0a 09 20 20 20 20 20 20 20 28 73  1.6.7..       (s
0520: 72 66 69 20 73 72 66 69 2d 33 39 29 29 29 0a 20  rfi srfi-39))). 
0530: 28 73 69 73 63 0a 20 20 28 72 65 71 75 69 72 65  (sisc.  (require
0540: 2d 65 78 74 65 6e 73 69 6f 6e 20 28 73 72 66 69  -extension (srfi
0550: 20 39 20 33 34 20 33 35 20 33 39 29 29 29 0a 20   9 34 35 39))). 
0560: 28 6b 61 77 61 0a 20 20 28 6d 6f 64 75 6c 65 2d  (kawa.  (module-
0570: 63 6f 6d 70 69 6c 65 2d 6f 70 74 69 6f 6e 73 20  compile-options 
0580: 77 61 72 6e 2d 75 6e 64 65 66 69 6e 65 64 2d 76  warn-undefined-v
0590: 61 72 69 61 62 6c 65 3a 20 23 74 0a 09 09 09 20  ariable: #t.... 
05a0: 20 77 61 72 6e 2d 69 6e 76 6f 6b 65 2d 75 6e 6b   warn-invoke-unk
05b0: 6e 6f 77 6e 2d 6d 65 74 68 6f 64 3a 20 23 74 29  nown-method: #t)
05c0: 0a 20 20 28 70 72 6f 76 69 64 65 20 27 73 72 66  .  (provide 'srf
05d0: 69 2d 36 34 29 0a 20 20 28 70 72 6f 76 69 64 65  i-64).  (provide
05e0: 20 27 74 65 73 74 69 6e 67 29 0a 20 20 28 72 65   'testing).  (re
05f0: 71 75 69 72 65 20 27 73 72 66 69 2d 33 34 29 0a  quire 'srfi-34).
0600: 20 20 28 72 65 71 75 69 72 65 20 27 73 72 66 69    (require 'srfi
0610: 2d 33 35 29 29 0a 20 28 65 6c 73 65 20 28 29 0a  -35)). (else ().
0620: 20 20 29 29 0a 0a 28 63 6f 6e 64 2d 65 78 70 61    ))..(cond-expa
0630: 6e 64 0a 20 28 72 36 72 73 0a 20 20 28 64 65 66  nd. (r6rs.  (def
0640: 69 6e 65 2d 73 79 6e 74 61 78 20 25 74 65 73 74  ine-syntax %test
0650: 2d 65 78 70 6f 72 74 0a 20 20 20 20 28 73 79 6e  -export.    (syn
0660: 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20  tax-rules ().   
0670: 20 20 20 28 28 25 74 65 73 74 2d 65 78 70 6f 72     ((%test-expor
0680: 74 20 2e 20 6e 61 6d 65 73 29 20 28 62 65 67 69  t . names) (begi
0690: 6e 29 29 29 29 29 0a 20 28 6b 61 77 61 0a 20 20  n))))). (kawa.  
06a0: 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 25  (define-syntax %
06b0: 74 65 73 74 2d 65 78 70 6f 72 74 0a 20 20 20 20  test-export.    
06c0: 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29  (syntax-rules ()
06d0: 0a 20 20 20 20 20 20 28 28 25 74 65 73 74 2d 65  .      ((%test-e
06e0: 78 70 6f 72 74 20 74 65 73 74 2d 62 65 67 69 6e  xport test-begin
06f0: 20 2e 20 6f 74 68 65 72 2d 6e 61 6d 65 73 29 0a   . other-names).
0700: 20 20 20 20 20 20 20 28 6d 6f 64 75 6c 65 2d 65         (module-e
0710: 78 70 6f 72 74 20 25 74 65 73 74 2d 62 65 67 69  xport %test-begi
0720: 6e 20 2e 20 6f 74 68 65 72 2d 6e 61 6d 65 73 29  n . other-names)
0730: 29 29 29 29 0a 20 28 65 6c 73 65 0a 20 20 28 64  )))). (else.  (d
0740: 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 25 74 65  efine-syntax %te
0750: 73 74 2d 65 78 70 6f 72 74 0a 20 20 20 20 28 73  st-export.    (s
0760: 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20  yntax-rules (). 
0770: 20 20 20 20 20 28 28 25 74 65 73 74 2d 65 78 70       ((%test-exp
0780: 6f 72 74 20 2e 20 6e 61 6d 65 73 29 20 28 69 66  ort . names) (if
0790: 20 23 66 20 23 66 29 29 29 29 29 29 0a 0a 3b 3b   #f #f))))))..;;
07a0: 20 4c 69 73 74 20 6f 66 20 65 78 70 6f 72 74 65   List of exporte
07b0: 64 20 6e 61 6d 65 73 0a 28 25 74 65 73 74 2d 65  d names.(%test-e
07c0: 78 70 6f 72 74 0a 20 74 65 73 74 2d 62 65 67 69  xport. test-begi
07d0: 6e 20 3b 3b 20 6d 75 73 74 20 62 65 20 6c 69 73  n ;; must be lis
07e0: 74 65 64 20 66 69 72 73 74 2c 20 73 69 6e 63 65  ted first, since
07f0: 20 69 6e 20 4b 61 77 61 20 28 61 74 20 6c 65 61   in Kawa (at lea
0800: 73 74 29 20 69 74 20 69 73 20 22 6d 61 67 69 63  st) it is "magic
0810: 22 2e 0a 20 74 65 73 74 2d 65 6e 64 20 74 65 73  ".. test-end tes
0820: 74 2d 61 73 73 65 72 74 20 74 65 73 74 2d 65 71  t-assert test-eq
0830: 76 20 74 65 73 74 2d 65 71 20 74 65 73 74 2d 65  v test-eq test-e
0840: 71 75 61 6c 0a 20 74 65 73 74 2d 61 70 70 72 6f  qual. test-appro
0850: 78 69 6d 61 74 65 20 74 65 73 74 2d 61 73 73 65  ximate test-asse
0860: 72 74 20 74 65 73 74 2d 65 72 72 6f 72 20 74 65  rt test-error te
0870: 73 74 2d 61 70 70 6c 79 20 74 65 73 74 2d 77 69  st-apply test-wi
0880: 74 68 2d 72 75 6e 6e 65 72 0a 20 74 65 73 74 2d  th-runner. test-
0890: 6d 61 74 63 68 2d 6e 74 68 20 74 65 73 74 2d 6d  match-nth test-m
08a0: 61 74 63 68 2d 61 6c 6c 20 74 65 73 74 2d 6d 61  atch-all test-ma
08b0: 74 63 68 2d 61 6e 79 20 74 65 73 74 2d 6d 61 74  tch-any test-mat
08c0: 63 68 2d 6e 61 6d 65 0a 20 74 65 73 74 2d 73 6b  ch-name. test-sk
08d0: 69 70 20 74 65 73 74 2d 65 78 70 65 63 74 2d 66  ip test-expect-f
08e0: 61 69 6c 20 74 65 73 74 2d 72 65 61 64 2d 65 76  ail test-read-ev
08f0: 61 6c 2d 73 74 72 69 6e 67 0a 20 74 65 73 74 2d  al-string. test-
0900: 72 75 6e 6e 65 72 2d 67 72 6f 75 70 2d 70 61 74  runner-group-pat
0910: 68 20 74 65 73 74 2d 67 72 6f 75 70 2d 77 69 74  h test-group-wit
0920: 68 2d 63 6c 65 61 6e 75 70 0a 20 74 65 73 74 2d  h-cleanup. test-
0930: 72 65 73 75 6c 74 2d 72 65 66 20 74 65 73 74 2d  result-ref test-
0940: 72 65 73 75 6c 74 2d 73 65 74 21 20 74 65 73 74  result-set! test
0950: 2d 72 65 73 75 6c 74 2d 63 6c 65 61 72 20 74 65  -result-clear te
0960: 73 74 2d 72 65 73 75 6c 74 2d 72 65 6d 6f 76 65  st-result-remove
0970: 0a 20 74 65 73 74 2d 72 65 73 75 6c 74 2d 6b 69  . test-result-ki
0980: 6e 64 20 74 65 73 74 2d 70 61 73 73 65 64 3f 0a  nd test-passed?.
0990: 20 74 65 73 74 2d 6c 6f 67 2d 74 6f 2d 66 69 6c   test-log-to-fil
09a0: 65 0a 20 3b 20 4d 69 73 63 20 74 65 73 74 2d 72  e. ; Misc test-r
09b0: 75 6e 6e 65 72 20 66 75 6e 63 74 69 6f 6e 73 0a  unner functions.
09c0: 20 74 65 73 74 2d 72 75 6e 6e 65 72 3f 20 74 65   test-runner? te
09d0: 73 74 2d 72 75 6e 6e 65 72 2d 72 65 73 65 74 20  st-runner-reset 
09e0: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6e 75 6c 6c  test-runner-null
09f0: 0a 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73 69  . test-runner-si
0a00: 6d 70 6c 65 20 74 65 73 74 2d 72 75 6e 6e 65 72  mple test-runner
0a10: 2d 63 75 72 72 65 6e 74 20 74 65 73 74 2d 72 75  -current test-ru
0a20: 6e 6e 65 72 2d 66 61 63 74 6f 72 79 20 74 65 73  nner-factory tes
0a30: 74 2d 72 75 6e 6e 65 72 2d 67 65 74 0a 20 74 65  t-runner-get. te
0a40: 73 74 2d 72 75 6e 6e 65 72 2d 63 72 65 61 74 65  st-runner-create
0a50: 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 74 65 73   test-runner-tes
0a60: 74 2d 6e 61 6d 65 0a 20 3b 3b 20 74 65 73 74 2d  t-name. ;; test-
0a70: 72 75 6e 6e 65 72 20 66 69 65 6c 64 20 73 65 74  runner field set
0a80: 74 65 72 20 61 6e 64 20 67 65 74 74 65 72 20 66  ter and getter f
0a90: 75 6e 63 74 69 6f 6e 73 20 2d 20 73 65 65 20 25  unctions - see %
0aa0: 74 65 73 74 2d 72 65 63 6f 72 64 2d 64 65 66 69  test-record-defi
0ab0: 6e 65 3a 0a 20 74 65 73 74 2d 72 75 6e 6e 65 72  ne:. test-runner
0ac0: 2d 70 61 73 73 2d 63 6f 75 6e 74 20 74 65 73 74  -pass-count test
0ad0: 2d 72 75 6e 6e 65 72 2d 70 61 73 73 2d 63 6f 75  -runner-pass-cou
0ae0: 6e 74 21 0a 20 74 65 73 74 2d 72 75 6e 6e 65 72  nt!. test-runner
0af0: 2d 66 61 69 6c 2d 63 6f 75 6e 74 20 74 65 73 74  -fail-count test
0b00: 2d 72 75 6e 6e 65 72 2d 66 61 69 6c 2d 63 6f 75  -runner-fail-cou
0b10: 6e 74 21 0a 20 74 65 73 74 2d 72 75 6e 6e 65 72  nt!. test-runner
0b20: 2d 78 70 61 73 73 2d 63 6f 75 6e 74 20 74 65 73  -xpass-count tes
0b30: 74 2d 72 75 6e 6e 65 72 2d 78 70 61 73 73 2d 63  t-runner-xpass-c
0b40: 6f 75 6e 74 21 0a 20 74 65 73 74 2d 72 75 6e 6e  ount!. test-runn
0b50: 65 72 2d 78 66 61 69 6c 2d 63 6f 75 6e 74 20 74  er-xfail-count t
0b60: 65 73 74 2d 72 75 6e 6e 65 72 2d 78 66 61 69 6c  est-runner-xfail
0b70: 2d 63 6f 75 6e 74 21 0a 20 74 65 73 74 2d 72 75  -count!. test-ru
0b80: 6e 6e 65 72 2d 73 6b 69 70 2d 63 6f 75 6e 74 20  nner-skip-count 
0b90: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69 70  test-runner-skip
0ba0: 2d 63 6f 75 6e 74 21 0a 20 74 65 73 74 2d 72 75  -count!. test-ru
0bb0: 6e 6e 65 72 2d 67 72 6f 75 70 2d 73 74 61 63 6b  nner-group-stack
0bc0: 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 67 72 6f   test-runner-gro
0bd0: 75 70 2d 73 74 61 63 6b 21 0a 20 74 65 73 74 2d  up-stack!. test-
0be0: 72 75 6e 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d 62  runner-on-test-b
0bf0: 65 67 69 6e 20 74 65 73 74 2d 72 75 6e 6e 65 72  egin test-runner
0c00: 2d 6f 6e 2d 74 65 73 74 2d 62 65 67 69 6e 21 0a  -on-test-begin!.
0c10: 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d   test-runner-on-
0c20: 74 65 73 74 2d 65 6e 64 20 74 65 73 74 2d 72 75  test-end test-ru
0c30: 6e 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d 65 6e 64  nner-on-test-end
0c40: 21 0a 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f  !. test-runner-o
0c50: 6e 2d 67 72 6f 75 70 2d 62 65 67 69 6e 20 74 65  n-group-begin te
0c60: 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 67 72 6f  st-runner-on-gro
0c70: 75 70 2d 62 65 67 69 6e 21 0a 20 74 65 73 74 2d  up-begin!. test-
0c80: 72 75 6e 6e 65 72 2d 6f 6e 2d 67 72 6f 75 70 2d  runner-on-group-
0c90: 65 6e 64 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d  end test-runner-
0ca0: 6f 6e 2d 67 72 6f 75 70 2d 65 6e 64 21 0a 20 74  on-group-end!. t
0cb0: 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 66 69  est-runner-on-fi
0cc0: 6e 61 6c 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d  nal test-runner-
0cd0: 6f 6e 2d 66 69 6e 61 6c 21 0a 20 74 65 73 74 2d  on-final!. test-
0ce0: 72 75 6e 6e 65 72 2d 6f 6e 2d 62 61 64 2d 63 6f  runner-on-bad-co
0cf0: 75 6e 74 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d  unt test-runner-
0d00: 6f 6e 2d 62 61 64 2d 63 6f 75 6e 74 21 0a 20 74  on-bad-count!. t
0d10: 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 62 61  est-runner-on-ba
0d20: 64 2d 65 6e 64 2d 6e 61 6d 65 20 74 65 73 74 2d  d-end-name test-
0d30: 72 75 6e 6e 65 72 2d 6f 6e 2d 62 61 64 2d 65 6e  runner-on-bad-en
0d40: 64 2d 6e 61 6d 65 21 0a 20 74 65 73 74 2d 72 65  d-name!. test-re
0d50: 73 75 6c 74 2d 61 6c 69 73 74 20 74 65 73 74 2d  sult-alist test-
0d60: 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 0a 20 74  result-alist!. t
0d70: 65 73 74 2d 72 75 6e 6e 65 72 2d 61 75 78 2d 76  est-runner-aux-v
0d80: 61 6c 75 65 20 74 65 73 74 2d 72 75 6e 6e 65 72  alue test-runner
0d90: 2d 61 75 78 2d 76 61 6c 75 65 21 0a 20 3b 3b 20  -aux-value!. ;; 
0da0: 64 65 66 61 75 6c 74 2f 73 69 6d 70 6c 65 20 63  default/simple c
0db0: 61 6c 6c 2d 62 61 63 6b 20 66 75 6e 63 74 69 6f  all-back functio
0dc0: 6e 73 2c 20 75 73 65 64 20 69 6e 20 64 65 66 61  ns, used in defa
0dd0: 75 6c 74 20 74 65 73 74 2d 72 75 6e 6e 65 72 2c  ult test-runner,
0de0: 0a 20 3b 3b 20 62 75 74 20 63 61 6e 20 62 65 20  . ;; but can be 
0df0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6e 73 74 72  called to constr
0e00: 75 63 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uct more complex
0e10: 20 6f 6e 65 73 2e 0a 20 74 65 73 74 2d 6f 6e 2d   ones.. test-on-
0e20: 67 72 6f 75 70 2d 62 65 67 69 6e 2d 73 69 6d 70  group-begin-simp
0e30: 6c 65 20 74 65 73 74 2d 6f 6e 2d 67 72 6f 75 70  le test-on-group
0e40: 2d 65 6e 64 2d 73 69 6d 70 6c 65 0a 20 74 65 73  -end-simple. tes
0e50: 74 2d 6f 6e 2d 62 61 64 2d 63 6f 75 6e 74 2d 73  t-on-bad-count-s
0e60: 69 6d 70 6c 65 20 74 65 73 74 2d 6f 6e 2d 62 61  imple test-on-ba
0e70: 64 2d 65 6e 64 2d 6e 61 6d 65 2d 73 69 6d 70 6c  d-end-name-simpl
0e80: 65 0a 20 74 65 73 74 2d 6f 6e 2d 66 69 6e 61 6c  e. test-on-final
0e90: 2d 73 69 6d 70 6c 65 20 74 65 73 74 2d 6f 6e 2d  -simple test-on-
0ea0: 74 65 73 74 2d 65 6e 64 2d 73 69 6d 70 6c 65 0a  test-end-simple.
0eb0: 20 74 65 73 74 2d 6f 6e 2d 66 69 6e 61 6c 2d 73   test-on-final-s
0ec0: 69 6d 70 6c 65 29 0a 0a 28 63 6f 6e 64 2d 65 78  imple)..(cond-ex
0ed0: 70 61 6e 64 0a 20 28 73 72 66 69 2d 39 0a 20 20  pand. (srfi-9.  
0ee0: 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 25  (define-syntax %
0ef0: 74 65 73 74 2d 72 65 63 6f 72 64 2d 64 65 66 69  test-record-defi
0f00: 6e 65 0a 20 20 20 20 28 73 79 6e 74 61 78 2d 72  ne.    (syntax-r
0f10: 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20 28 28  ules ().      ((
0f20: 25 74 65 73 74 2d 72 65 63 6f 72 64 2d 64 65 66  %test-record-def
0f30: 69 6e 65 20 61 6c 6c 6f 63 20 72 75 6e 6e 65 72  ine alloc runner
0f40: 3f 20 28 6e 61 6d 65 20 69 6e 64 65 78 20 67 65  ? (name index ge
0f50: 74 74 65 72 20 73 65 74 74 65 72 29 20 2e 2e 2e  tter setter) ...
0f60: 29 0a 20 20 20 20 20 20 20 28 64 65 66 69 6e 65  ).       (define
0f70: 2d 72 65 63 6f 72 64 2d 74 79 70 65 20 74 65 73  -record-type tes
0f80: 74 2d 72 75 6e 6e 65 72 0a 09 20 28 61 6c 6c 6f  t-runner.. (allo
0f90: 63 29 0a 09 20 72 75 6e 6e 65 72 3f 0a 09 20 28  c).. runner?.. (
0fa0: 6e 61 6d 65 20 67 65 74 74 65 72 20 73 65 74 74  name getter sett
0fb0: 65 72 29 20 2e 2e 2e 29 29 29 29 29 0a 20 28 65  er) ...))))). (e
0fc0: 6c 73 65 0a 20 20 28 64 65 66 69 6e 65 20 25 74  lse.  (define %t
0fd0: 65 73 74 2d 72 75 6e 6e 65 72 2d 63 6f 6f 6b 69  est-runner-cooki
0fe0: 65 20 28 6c 69 73 74 20 22 74 65 73 74 2d 72 75  e (list "test-ru
0ff0: 6e 6e 65 72 22 29 29 0a 20 20 28 64 65 66 69 6e  nner")).  (defin
1000: 65 2d 73 79 6e 74 61 78 20 25 74 65 73 74 2d 72  e-syntax %test-r
1010: 65 63 6f 72 64 2d 64 65 66 69 6e 65 0a 20 20 20  ecord-define.   
1020: 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28   (syntax-rules (
1030: 29 0a 20 20 20 20 20 20 28 28 25 74 65 73 74 2d  ).      ((%test-
1040: 72 65 63 6f 72 64 2d 64 65 66 69 6e 65 20 61 6c  record-define al
1050: 6c 6f 63 20 72 75 6e 6e 65 72 3f 20 28 6e 61 6d  loc runner? (nam
1060: 65 20 69 6e 64 65 78 20 67 65 74 74 65 72 20 73  e index getter s
1070: 65 74 74 65 72 29 20 2e 2e 2e 29 0a 20 20 20 20  etter) ...).    
1080: 20 20 20 28 62 65 67 69 6e 0a 09 20 28 64 65 66     (begin.. (def
1090: 69 6e 65 20 28 72 75 6e 6e 65 72 3f 20 6f 62 6a  ine (runner? obj
10a0: 29 0a 09 20 20 20 28 61 6e 64 20 28 76 65 63 74  )..   (and (vect
10b0: 6f 72 3f 20 6f 62 6a 29 0a 09 09 28 3e 20 28 76  or? obj)...(> (v
10c0: 65 63 74 6f 72 2d 6c 65 6e 67 74 68 20 6f 62 6a  ector-length obj
10d0: 29 20 31 29 0a 09 09 28 65 71 20 28 76 65 63 74  ) 1)...(eq (vect
10e0: 6f 72 2d 72 65 66 20 6f 62 6a 20 30 29 20 25 74  or-ref obj 0) %t
10f0: 65 73 74 2d 72 75 6e 6e 65 72 2d 63 6f 6f 6b 69  est-runner-cooki
1100: 65 29 29 29 0a 09 20 28 64 65 66 69 6e 65 20 28  e))).. (define (
1110: 61 6c 6c 6f 63 29 0a 09 20 20 20 28 6c 65 74 20  alloc)..   (let 
1120: 28 28 72 75 6e 6e 65 72 20 28 6d 61 6b 65 2d 76  ((runner (make-v
1130: 65 63 74 6f 72 20 32 32 29 29 29 0a 09 20 20 20  ector 22)))..   
1140: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
1150: 75 6e 6e 65 72 20 30 20 25 74 65 73 74 2d 72 75  unner 0 %test-ru
1160: 6e 6e 65 72 2d 63 6f 6f 6b 69 65 29 0a 09 20 20  nner-cookie)..  
1170: 20 20 20 72 75 6e 6e 65 72 29 29 0a 09 20 28 62     runner)).. (b
1180: 65 67 69 6e 0a 09 20 20 20 28 64 65 66 69 6e 65  egin..   (define
1190: 20 28 67 65 74 74 65 72 20 72 75 6e 6e 65 72 29   (getter runner)
11a0: 0a 09 20 20 20 20 20 28 76 65 63 74 6f 72 2d 72  ..     (vector-r
11b0: 65 66 20 72 75 6e 6e 65 72 20 69 6e 64 65 78 29  ef runner index)
11c0: 29 20 2e 2e 2e 29 0a 09 20 28 62 65 67 69 6e 0a  ) ...).. (begin.
11d0: 09 20 20 20 28 64 65 66 69 6e 65 20 28 73 65 74  .   (define (set
11e0: 74 65 72 20 72 75 6e 6e 65 72 20 76 61 6c 75 65  ter runner value
11f0: 29 0a 09 20 20 20 20 20 28 76 65 63 74 6f 72 2d  )..     (vector-
1200: 73 65 74 21 20 72 75 6e 6e 65 72 20 69 6e 64 65  set! runner inde
1210: 78 20 76 61 6c 75 65 29 29 20 2e 2e 2e 29 29 29  x value)) ...)))
1220: 29 29 29 29 0a 0a 28 25 74 65 73 74 2d 72 65 63  ))))..(%test-rec
1230: 6f 72 64 2d 64 65 66 69 6e 65 0a 20 25 74 65 73  ord-define. %tes
1240: 74 2d 72 75 6e 6e 65 72 2d 61 6c 6c 6f 63 20 74  t-runner-alloc t
1250: 65 73 74 2d 72 75 6e 6e 65 72 3f 0a 20 3b 3b 20  est-runner?. ;; 
1260: 43 75 6d 75 6c 61 74 65 20 63 6f 75 6e 74 20 6f  Cumulate count o
1270: 66 20 61 6c 6c 20 74 65 73 74 73 20 74 68 61 74  f all tests that
1280: 20 68 61 76 65 20 70 61 73 73 65 64 20 61 6e 64   have passed and
1290: 20 77 65 72 65 20 65 78 70 65 63 74 65 64 20 74   were expected t
12a0: 6f 2e 0a 20 28 70 61 73 73 2d 63 6f 75 6e 74 20  o.. (pass-count 
12b0: 31 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 70 61  1 test-runner-pa
12c0: 73 73 2d 63 6f 75 6e 74 20 74 65 73 74 2d 72 75  ss-count test-ru
12d0: 6e 6e 65 72 2d 70 61 73 73 2d 63 6f 75 6e 74 21  nner-pass-count!
12e0: 29 0a 20 28 66 61 69 6c 2d 63 6f 75 6e 74 20 32  ). (fail-count 2
12f0: 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 66 61 69   test-runner-fai
1300: 6c 2d 63 6f 75 6e 74 20 74 65 73 74 2d 72 75 6e  l-count test-run
1310: 6e 65 72 2d 66 61 69 6c 2d 63 6f 75 6e 74 21 29  ner-fail-count!)
1320: 0a 20 28 78 70 61 73 73 2d 63 6f 75 6e 74 20 33  . (xpass-count 3
1330: 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 78 70 61   test-runner-xpa
1340: 73 73 2d 63 6f 75 6e 74 20 74 65 73 74 2d 72 75  ss-count test-ru
1350: 6e 6e 65 72 2d 78 70 61 73 73 2d 63 6f 75 6e 74  nner-xpass-count
1360: 21 29 0a 20 28 78 66 61 69 6c 2d 63 6f 75 6e 74  !). (xfail-count
1370: 20 34 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 78   4 test-runner-x
1380: 66 61 69 6c 2d 63 6f 75 6e 74 20 74 65 73 74 2d  fail-count test-
1390: 72 75 6e 6e 65 72 2d 78 66 61 69 6c 2d 63 6f 75  runner-xfail-cou
13a0: 6e 74 21 29 0a 20 28 73 6b 69 70 2d 63 6f 75 6e  nt!). (skip-coun
13b0: 74 20 35 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d  t 5 test-runner-
13c0: 73 6b 69 70 2d 63 6f 75 6e 74 20 74 65 73 74 2d  skip-count test-
13d0: 72 75 6e 6e 65 72 2d 73 6b 69 70 2d 63 6f 75 6e  runner-skip-coun
13e0: 74 21 29 0a 20 28 73 6b 69 70 2d 6c 69 73 74 20  t!). (skip-list 
13f0: 36 20 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73  6 %test-runner-s
1400: 6b 69 70 2d 6c 69 73 74 20 25 74 65 73 74 2d 72  kip-list %test-r
1410: 75 6e 6e 65 72 2d 73 6b 69 70 2d 6c 69 73 74 21  unner-skip-list!
1420: 29 0a 20 28 66 61 69 6c 2d 6c 69 73 74 20 37 20  ). (fail-list 7 
1430: 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 66 61 69  %test-runner-fai
1440: 6c 2d 6c 69 73 74 20 25 74 65 73 74 2d 72 75 6e  l-list %test-run
1450: 6e 65 72 2d 66 61 69 6c 2d 6c 69 73 74 21 29 0a  ner-fail-list!).
1460: 20 3b 3b 20 4e 6f 72 6d 61 6c 6c 79 20 23 74 2c   ;; Normally #t,
1470: 20 65 78 63 65 70 74 20 77 68 65 6e 20 69 6e 20   except when in 
1480: 61 20 74 65 73 74 2d 61 70 70 6c 79 2e 0a 20 28  a test-apply.. (
1490: 72 75 6e 2d 6c 69 73 74 20 38 20 25 74 65 73 74  run-list 8 %test
14a0: 2d 72 75 6e 6e 65 72 2d 72 75 6e 2d 6c 69 73 74  -runner-run-list
14b0: 20 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 72 75   %test-runner-ru
14c0: 6e 2d 6c 69 73 74 21 29 0a 20 28 73 6b 69 70 2d  n-list!). (skip-
14d0: 73 61 76 65 20 39 20 25 74 65 73 74 2d 72 75 6e  save 9 %test-run
14e0: 6e 65 72 2d 73 6b 69 70 2d 73 61 76 65 20 25 74  ner-skip-save %t
14f0: 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d  est-runner-skip-
1500: 73 61 76 65 21 29 0a 20 28 66 61 69 6c 2d 73 61  save!). (fail-sa
1510: 76 65 20 31 30 20 25 74 65 73 74 2d 72 75 6e 6e  ve 10 %test-runn
1520: 65 72 2d 66 61 69 6c 2d 73 61 76 65 20 25 74 65  er-fail-save %te
1530: 73 74 2d 72 75 6e 6e 65 72 2d 66 61 69 6c 2d 73  st-runner-fail-s
1540: 61 76 65 21 29 0a 20 28 67 72 6f 75 70 2d 73 74  ave!). (group-st
1550: 61 63 6b 20 31 31 20 74 65 73 74 2d 72 75 6e 6e  ack 11 test-runn
1560: 65 72 2d 67 72 6f 75 70 2d 73 74 61 63 6b 20 74  er-group-stack t
1570: 65 73 74 2d 72 75 6e 6e 65 72 2d 67 72 6f 75 70  est-runner-group
1580: 2d 73 74 61 63 6b 21 29 0a 20 28 6f 6e 2d 74 65  -stack!). (on-te
1590: 73 74 2d 62 65 67 69 6e 20 31 32 20 74 65 73 74  st-begin 12 test
15a0: 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d  -runner-on-test-
15b0: 62 65 67 69 6e 20 74 65 73 74 2d 72 75 6e 6e 65  begin test-runne
15c0: 72 2d 6f 6e 2d 74 65 73 74 2d 62 65 67 69 6e 21  r-on-test-begin!
15d0: 29 0a 20 28 6f 6e 2d 74 65 73 74 2d 65 6e 64 20  ). (on-test-end 
15e0: 31 33 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f  13 test-runner-o
15f0: 6e 2d 74 65 73 74 2d 65 6e 64 20 74 65 73 74 2d  n-test-end test-
1600: 72 75 6e 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d 65  runner-on-test-e
1610: 6e 64 21 29 0a 20 3b 3b 20 43 61 6c 6c 2d 62 61  nd!). ;; Call-ba
1620: 63 6b 20 77 68 65 6e 20 65 6e 74 65 72 69 6e 67  ck when entering
1630: 20 61 20 67 72 6f 75 70 2e 20 54 61 6b 65 73 20   a group. Takes 
1640: 28 72 75 6e 6e 65 72 20 73 75 69 74 65 2d 6e 61  (runner suite-na
1650: 6d 65 20 63 6f 75 6e 74 29 2e 0a 20 28 6f 6e 2d  me count).. (on-
1660: 67 72 6f 75 70 2d 62 65 67 69 6e 20 31 34 20 74  group-begin 14 t
1670: 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 67 72  est-runner-on-gr
1680: 6f 75 70 2d 62 65 67 69 6e 20 74 65 73 74 2d 72  oup-begin test-r
1690: 75 6e 6e 65 72 2d 6f 6e 2d 67 72 6f 75 70 2d 62  unner-on-group-b
16a0: 65 67 69 6e 21 29 0a 20 3b 3b 20 43 61 6c 6c 2d  egin!). ;; Call-
16b0: 62 61 63 6b 20 77 68 65 6e 20 6c 65 61 76 69 6e  back when leavin
16c0: 67 20 61 20 67 72 6f 75 70 2e 0a 20 28 6f 6e 2d  g a group.. (on-
16d0: 67 72 6f 75 70 2d 65 6e 64 20 31 35 20 74 65 73  group-end 15 tes
16e0: 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 67 72 6f 75  t-runner-on-grou
16f0: 70 2d 65 6e 64 20 74 65 73 74 2d 72 75 6e 6e 65  p-end test-runne
1700: 72 2d 6f 6e 2d 67 72 6f 75 70 2d 65 6e 64 21 29  r-on-group-end!)
1710: 0a 20 3b 3b 20 43 61 6c 6c 2d 62 61 63 6b 20 77  . ;; Call-back w
1720: 68 65 6e 20 6c 65 61 76 69 6e 67 20 74 68 65 20  hen leaving the 
1730: 6f 75 74 65 72 6d 6f 73 74 20 67 72 6f 75 70 2e  outermost group.
1740: 0a 20 28 6f 6e 2d 66 69 6e 61 6c 20 31 36 20 74  . (on-final 16 t
1750: 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 66 69  est-runner-on-fi
1760: 6e 61 6c 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d  nal test-runner-
1770: 6f 6e 2d 66 69 6e 61 6c 21 29 0a 20 3b 3b 20 43  on-final!). ;; C
1780: 61 6c 6c 2d 62 61 63 6b 20 77 68 65 6e 20 65 78  all-back when ex
1790: 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
17a0: 20 74 65 73 74 73 20 77 61 73 20 77 72 6f 6e 67   tests was wrong
17b0: 2e 0a 20 28 6f 6e 2d 62 61 64 2d 63 6f 75 6e 74  .. (on-bad-count
17c0: 20 31 37 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d   17 test-runner-
17d0: 6f 6e 2d 62 61 64 2d 63 6f 75 6e 74 20 74 65 73  on-bad-count tes
17e0: 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 62 61 64 2d  t-runner-on-bad-
17f0: 63 6f 75 6e 74 21 29 0a 20 3b 3b 20 43 61 6c 6c  count!). ;; Call
1800: 2d 62 61 63 6b 20 77 68 65 6e 20 6e 61 6d 65 20  -back when name 
1810: 69 6e 20 74 65 73 74 3d 65 6e 64 20 64 6f 65 73  in test=end does
1820: 6e 27 74 20 6d 61 74 63 68 20 74 65 73 74 2d 62  n't match test-b
1830: 65 67 69 6e 2e 0a 20 28 6f 6e 2d 62 61 64 2d 65  egin.. (on-bad-e
1840: 6e 64 2d 6e 61 6d 65 20 31 38 20 74 65 73 74 2d  nd-name 18 test-
1850: 72 75 6e 6e 65 72 2d 6f 6e 2d 62 61 64 2d 65 6e  runner-on-bad-en
1860: 64 2d 6e 61 6d 65 20 74 65 73 74 2d 72 75 6e 6e  d-name test-runn
1870: 65 72 2d 6f 6e 2d 62 61 64 2d 65 6e 64 2d 6e 61  er-on-bad-end-na
1880: 6d 65 21 29 0a 20 3b 3b 20 43 75 6d 75 6c 61 74  me!). ;; Cumulat
1890: 65 20 63 6f 75 6e 74 20 6f 66 20 61 6c 6c 20 74  e count of all t
18a0: 65 73 74 73 20 74 68 61 74 20 68 61 76 65 20 62  ests that have b
18b0: 65 65 6e 20 64 6f 6e 65 2e 0a 20 28 74 6f 74 61  een done.. (tota
18c0: 6c 2d 63 6f 75 6e 74 20 31 39 20 25 74 65 73 74  l-count 19 %test
18d0: 2d 72 75 6e 6e 65 72 2d 74 6f 74 61 6c 2d 63 6f  -runner-total-co
18e0: 75 6e 74 20 25 74 65 73 74 2d 72 75 6e 6e 65 72  unt %test-runner
18f0: 2d 74 6f 74 61 6c 2d 63 6f 75 6e 74 21 29 0a 20  -total-count!). 
1900: 3b 3b 20 53 74 61 63 6b 20 28 6c 69 73 74 29 20  ;; Stack (list) 
1910: 6f 66 20 28 63 6f 75 6e 74 2d 61 74 2d 73 74 61  of (count-at-sta
1920: 72 74 20 2e 20 65 78 70 65 63 74 65 64 2d 63 6f  rt . expected-co
1930: 75 6e 74 29 3a 0a 20 28 63 6f 75 6e 74 2d 6c 69  unt):. (count-li
1940: 73 74 20 32 30 20 25 74 65 73 74 2d 72 75 6e 6e  st 20 %test-runn
1950: 65 72 2d 63 6f 75 6e 74 2d 6c 69 73 74 20 25 74  er-count-list %t
1960: 65 73 74 2d 72 75 6e 6e 65 72 2d 63 6f 75 6e 74  est-runner-count
1970: 2d 6c 69 73 74 21 29 0a 20 28 72 65 73 75 6c 74  -list!). (result
1980: 2d 61 6c 69 73 74 20 32 31 20 74 65 73 74 2d 72  -alist 21 test-r
1990: 65 73 75 6c 74 2d 61 6c 69 73 74 20 74 65 73 74  esult-alist test
19a0: 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 29 0a  -result-alist!).
19b0: 20 3b 3b 20 46 69 65 6c 64 20 63 61 6e 20 62 65   ;; Field can be
19c0: 20 75 73 65 64 20 62 79 20 74 65 73 74 2d 72 75   used by test-ru
19d0: 6e 6e 65 72 20 66 6f 72 20 61 6e 79 20 70 75 72  nner for any pur
19e0: 70 6f 73 65 2e 0a 20 3b 3b 20 74 65 73 74 2d 72  pose.. ;; test-r
19f0: 75 6e 6e 65 72 2d 73 69 6d 70 6c 65 20 75 73 65  unner-simple use
1a00: 73 20 69 74 20 66 6f 72 20 61 20 6c 6f 67 20 66  s it for a log f
1a10: 69 6c 65 2e 0a 20 28 61 75 78 2d 76 61 6c 75 65  ile.. (aux-value
1a20: 20 32 32 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d   22 test-runner-
1a30: 61 75 78 2d 76 61 6c 75 65 20 74 65 73 74 2d 72  aux-value test-r
1a40: 75 6e 6e 65 72 2d 61 75 78 2d 76 61 6c 75 65 21  unner-aux-value!
1a50: 29 0a 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 65  ).)..(define (te
1a60: 73 74 2d 72 75 6e 6e 65 72 2d 72 65 73 65 74 20  st-runner-reset 
1a70: 72 75 6e 6e 65 72 29 0a 20 20 20 20 28 74 65 73  runner).    (tes
1a80: 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 20  t-result-alist! 
1a90: 72 75 6e 6e 65 72 20 27 28 29 29 0a 20 20 20 20  runner '()).    
1aa0: 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 70 61 73  (test-runner-pas
1ab0: 73 2d 63 6f 75 6e 74 21 20 72 75 6e 6e 65 72 20  s-count! runner 
1ac0: 30 29 0a 20 20 20 20 28 74 65 73 74 2d 72 75 6e  0).    (test-run
1ad0: 6e 65 72 2d 66 61 69 6c 2d 63 6f 75 6e 74 21 20  ner-fail-count! 
1ae0: 72 75 6e 6e 65 72 20 30 29 0a 20 20 20 20 28 74  runner 0).    (t
1af0: 65 73 74 2d 72 75 6e 6e 65 72 2d 78 70 61 73 73  est-runner-xpass
1b00: 2d 63 6f 75 6e 74 21 20 72 75 6e 6e 65 72 20 30  -count! runner 0
1b10: 29 0a 20 20 20 20 28 74 65 73 74 2d 72 75 6e 6e  ).    (test-runn
1b20: 65 72 2d 78 66 61 69 6c 2d 63 6f 75 6e 74 21 20  er-xfail-count! 
1b30: 72 75 6e 6e 65 72 20 30 29 0a 20 20 20 20 28 74  runner 0).    (t
1b40: 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d  est-runner-skip-
1b50: 63 6f 75 6e 74 21 20 72 75 6e 6e 65 72 20 30 29  count! runner 0)
1b60: 0a 20 20 20 20 28 25 74 65 73 74 2d 72 75 6e 6e  .    (%test-runn
1b70: 65 72 2d 74 6f 74 61 6c 2d 63 6f 75 6e 74 21 20  er-total-count! 
1b80: 72 75 6e 6e 65 72 20 30 29 0a 20 20 20 20 28 25  runner 0).    (%
1b90: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63 6f 75 6e  test-runner-coun
1ba0: 74 2d 6c 69 73 74 21 20 72 75 6e 6e 65 72 20 27  t-list! runner '
1bb0: 28 29 29 0a 20 20 20 20 28 25 74 65 73 74 2d 72  ()).    (%test-r
1bc0: 75 6e 6e 65 72 2d 72 75 6e 2d 6c 69 73 74 21 20  unner-run-list! 
1bd0: 72 75 6e 6e 65 72 20 23 74 29 0a 20 20 20 20 28  runner #t).    (
1be0: 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69  %test-runner-ski
1bf0: 70 2d 6c 69 73 74 21 20 72 75 6e 6e 65 72 20 27  p-list! runner '
1c00: 28 29 29 0a 20 20 20 20 28 25 74 65 73 74 2d 72  ()).    (%test-r
1c10: 75 6e 6e 65 72 2d 66 61 69 6c 2d 6c 69 73 74 21  unner-fail-list!
1c20: 20 72 75 6e 6e 65 72 20 27 28 29 29 0a 20 20 20   runner '()).   
1c30: 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73   (%test-runner-s
1c40: 6b 69 70 2d 73 61 76 65 21 20 72 75 6e 6e 65 72  kip-save! runner
1c50: 20 27 28 29 29 0a 20 20 20 20 28 25 74 65 73 74   '()).    (%test
1c60: 2d 72 75 6e 6e 65 72 2d 66 61 69 6c 2d 73 61 76  -runner-fail-sav
1c70: 65 21 20 72 75 6e 6e 65 72 20 27 28 29 29 0a 20  e! runner '()). 
1c80: 20 20 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d     (test-runner-
1c90: 67 72 6f 75 70 2d 73 74 61 63 6b 21 20 72 75 6e  group-stack! run
1ca0: 6e 65 72 20 27 28 29 29 29 0a 0a 28 64 65 66 69  ner '()))..(defi
1cb0: 6e 65 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d  ne (test-runner-
1cc0: 67 72 6f 75 70 2d 70 61 74 68 20 72 75 6e 6e 65  group-path runne
1cd0: 72 29 0a 20 20 28 72 65 76 65 72 73 65 20 28 74  r).  (reverse (t
1ce0: 65 73 74 2d 72 75 6e 6e 65 72 2d 67 72 6f 75 70  est-runner-group
1cf0: 2d 73 74 61 63 6b 20 72 75 6e 6e 65 72 29 29 29  -stack runner)))
1d00: 0a 0a 28 64 65 66 69 6e 65 20 28 25 74 65 73 74  ..(define (%test
1d10: 2d 6e 75 6c 6c 2d 63 61 6c 6c 62 61 63 6b 20 72  -null-callback r
1d20: 75 6e 6e 65 72 29 20 23 66 29 0a 0a 28 64 65 66  unner) #f)..(def
1d30: 69 6e 65 20 28 74 65 73 74 2d 72 75 6e 6e 65 72  ine (test-runner
1d40: 2d 6e 75 6c 6c 29 0a 20 20 28 6c 65 74 20 28 28  -null).  (let ((
1d50: 72 75 6e 6e 65 72 20 28 25 74 65 73 74 2d 72 75  runner (%test-ru
1d60: 6e 6e 65 72 2d 61 6c 6c 6f 63 29 29 29 0a 20 20  nner-alloc))).  
1d70: 20 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 72    (test-runner-r
1d80: 65 73 65 74 20 72 75 6e 6e 65 72 29 0a 20 20 20  eset runner).   
1d90: 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e   (test-runner-on
1da0: 2d 67 72 6f 75 70 2d 62 65 67 69 6e 21 20 72 75  -group-begin! ru
1db0: 6e 6e 65 72 20 28 6c 61 6d 62 64 61 20 28 72 75  nner (lambda (ru
1dc0: 6e 6e 65 72 20 6e 61 6d 65 20 63 6f 75 6e 74 29  nner name count)
1dd0: 20 23 66 29 29 0a 20 20 20 20 28 74 65 73 74 2d   #f)).    (test-
1de0: 72 75 6e 6e 65 72 2d 6f 6e 2d 67 72 6f 75 70 2d  runner-on-group-
1df0: 65 6e 64 21 20 72 75 6e 6e 65 72 20 25 74 65 73  end! runner %tes
1e00: 74 2d 6e 75 6c 6c 2d 63 61 6c 6c 62 61 63 6b 29  t-null-callback)
1e10: 0a 20 20 20 20 28 74 65 73 74 2d 72 75 6e 6e 65  .    (test-runne
1e20: 72 2d 6f 6e 2d 66 69 6e 61 6c 21 20 72 75 6e 6e  r-on-final! runn
1e30: 65 72 20 25 74 65 73 74 2d 6e 75 6c 6c 2d 63 61  er %test-null-ca
1e40: 6c 6c 62 61 63 6b 29 0a 20 20 20 20 28 74 65 73  llback).    (tes
1e50: 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 74 65 73 74  t-runner-on-test
1e60: 2d 62 65 67 69 6e 21 20 72 75 6e 6e 65 72 20 25  -begin! runner %
1e70: 74 65 73 74 2d 6e 75 6c 6c 2d 63 61 6c 6c 62 61  test-null-callba
1e80: 63 6b 29 0a 20 20 20 20 28 74 65 73 74 2d 72 75  ck).    (test-ru
1e90: 6e 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d 65 6e 64  nner-on-test-end
1ea0: 21 20 72 75 6e 6e 65 72 20 25 74 65 73 74 2d 6e  ! runner %test-n
1eb0: 75 6c 6c 2d 63 61 6c 6c 62 61 63 6b 29 0a 20 20  ull-callback).  
1ec0: 20 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f    (test-runner-o
1ed0: 6e 2d 62 61 64 2d 63 6f 75 6e 74 21 20 72 75 6e  n-bad-count! run
1ee0: 6e 65 72 20 28 6c 61 6d 62 64 61 20 28 72 75 6e  ner (lambda (run
1ef0: 6e 65 72 20 63 6f 75 6e 74 20 65 78 70 65 63 74  ner count expect
1f00: 65 64 29 20 23 66 29 29 0a 20 20 20 20 28 74 65  ed) #f)).    (te
1f10: 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 62 61 64  st-runner-on-bad
1f20: 2d 65 6e 64 2d 6e 61 6d 65 21 20 72 75 6e 6e 65  -end-name! runne
1f30: 72 20 28 6c 61 6d 62 64 61 20 28 72 75 6e 6e 65  r (lambda (runne
1f40: 72 20 62 65 67 69 6e 20 65 6e 64 29 20 23 66 29  r begin end) #f)
1f50: 29 0a 20 20 20 20 72 75 6e 6e 65 72 29 29 0a 0a  ).    runner))..
1f60: 3b 3b 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 74  ;; Not part of t
1f70: 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  he specification
1f80: 2e 20 20 46 49 58 4d 45 0a 3b 3b 20 43 6f 6e 74  .  FIXME.;; Cont
1f90: 72 6f 6c 73 20 77 68 65 74 68 65 72 20 61 20 6c  rols whether a l
1fa0: 6f 67 20 66 69 6c 65 20 69 73 20 67 65 6e 65 72  og file is gener
1fb0: 61 74 65 64 2e 0a 28 64 65 66 69 6e 65 20 74 65  ated..(define te
1fc0: 73 74 2d 6c 6f 67 2d 74 6f 2d 66 69 6c 65 20 23  st-log-to-file #
1fd0: 46 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73  F)..(define (tes
1fe0: 74 2d 72 75 6e 6e 65 72 2d 73 69 6d 70 6c 65 29  t-runner-simple)
1ff0: 0a 20 20 28 6c 65 74 20 28 28 72 75 6e 6e 65 72  .  (let ((runner
2000: 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 61   (%test-runner-a
2010: 6c 6c 6f 63 29 29 29 0a 20 20 20 20 28 74 65 73  lloc))).    (tes
2020: 74 2d 72 75 6e 6e 65 72 2d 72 65 73 65 74 20 72  t-runner-reset r
2030: 75 6e 6e 65 72 29 0a 20 20 20 20 28 74 65 73 74  unner).    (test
2040: 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 67 72 6f 75 70  -runner-on-group
2050: 2d 62 65 67 69 6e 21 20 72 75 6e 6e 65 72 20 74  -begin! runner t
2060: 65 73 74 2d 6f 6e 2d 67 72 6f 75 70 2d 62 65 67  est-on-group-beg
2070: 69 6e 2d 73 69 6d 70 6c 65 29 0a 20 20 20 20 28  in-simple).    (
2080: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 67  test-runner-on-g
2090: 72 6f 75 70 2d 65 6e 64 21 20 72 75 6e 6e 65 72  roup-end! runner
20a0: 20 74 65 73 74 2d 6f 6e 2d 67 72 6f 75 70 2d 65   test-on-group-e
20b0: 6e 64 2d 73 69 6d 70 6c 65 29 0a 20 20 20 20 28  nd-simple).    (
20c0: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 66  test-runner-on-f
20d0: 69 6e 61 6c 21 20 72 75 6e 6e 65 72 20 74 65 73  inal! runner tes
20e0: 74 2d 6f 6e 2d 66 69 6e 61 6c 2d 73 69 6d 70 6c  t-on-final-simpl
20f0: 65 29 0a 20 20 20 20 28 74 65 73 74 2d 72 75 6e  e).    (test-run
2100: 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d 62 65 67 69  ner-on-test-begi
2110: 6e 21 20 72 75 6e 6e 65 72 20 74 65 73 74 2d 6f  n! runner test-o
2120: 6e 2d 74 65 73 74 2d 62 65 67 69 6e 2d 73 69 6d  n-test-begin-sim
2130: 70 6c 65 29 0a 20 20 20 20 28 74 65 73 74 2d 72  ple).    (test-r
2140: 75 6e 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d 65 6e  unner-on-test-en
2150: 64 21 20 72 75 6e 6e 65 72 20 74 65 73 74 2d 6f  d! runner test-o
2160: 6e 2d 74 65 73 74 2d 65 6e 64 2d 73 69 6d 70 6c  n-test-end-simpl
2170: 65 29 0a 20 20 20 20 28 74 65 73 74 2d 72 75 6e  e).    (test-run
2180: 6e 65 72 2d 6f 6e 2d 62 61 64 2d 63 6f 75 6e 74  ner-on-bad-count
2190: 21 20 72 75 6e 6e 65 72 20 74 65 73 74 2d 6f 6e  ! runner test-on
21a0: 2d 62 61 64 2d 63 6f 75 6e 74 2d 73 69 6d 70 6c  -bad-count-simpl
21b0: 65 29 0a 20 20 20 20 28 74 65 73 74 2d 72 75 6e  e).    (test-run
21c0: 6e 65 72 2d 6f 6e 2d 62 61 64 2d 65 6e 64 2d 6e  ner-on-bad-end-n
21d0: 61 6d 65 21 20 72 75 6e 6e 65 72 20 74 65 73 74  ame! runner test
21e0: 2d 6f 6e 2d 62 61 64 2d 65 6e 64 2d 6e 61 6d 65  -on-bad-end-name
21f0: 2d 73 69 6d 70 6c 65 29 0a 20 20 20 20 72 75 6e  -simple).    run
2200: 6e 65 72 29 29 0a 0a 28 63 6f 6e 64 2d 65 78 70  ner))..(cond-exp
2210: 61 6e 64 0a 20 28 73 72 66 69 2d 33 39 0a 20 20  and. (srfi-39.  
2220: 28 64 65 66 69 6e 65 20 74 65 73 74 2d 72 75 6e  (define test-run
2230: 6e 65 72 2d 63 75 72 72 65 6e 74 20 28 6d 61 6b  ner-current (mak
2240: 65 2d 70 61 72 61 6d 65 74 65 72 20 23 66 29 29  e-parameter #f))
2250: 0a 20 20 28 64 65 66 69 6e 65 20 74 65 73 74 2d  .  (define test-
2260: 72 75 6e 6e 65 72 2d 66 61 63 74 6f 72 79 20 28  runner-factory (
2270: 6d 61 6b 65 2d 70 61 72 61 6d 65 74 65 72 20 74  make-parameter t
2280: 65 73 74 2d 72 75 6e 6e 65 72 2d 73 69 6d 70 6c  est-runner-simpl
2290: 65 29 29 29 0a 20 28 65 6c 73 65 0a 20 20 28 64  e))). (else.  (d
22a0: 65 66 69 6e 65 20 25 74 65 73 74 2d 72 75 6e 6e  efine %test-runn
22b0: 65 72 2d 63 75 72 72 65 6e 74 20 23 66 29 0a 20  er-current #f). 
22c0: 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20   (define-syntax 
22d0: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63 75 72 72  test-runner-curr
22e0: 65 6e 74 0a 20 20 20 20 28 73 79 6e 74 61 78 2d  ent.    (syntax-
22f0: 72 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20 28  rules ().      (
2300: 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63 75 72  (test-runner-cur
2310: 72 65 6e 74 29 0a 20 20 20 20 20 20 20 25 74 65  rent).       %te
2320: 73 74 2d 72 75 6e 6e 65 72 2d 63 75 72 72 65 6e  st-runner-curren
2330: 74 29 0a 20 20 20 20 20 20 28 28 74 65 73 74 2d  t).      ((test-
2340: 72 75 6e 6e 65 72 2d 63 75 72 72 65 6e 74 20 72  runner-current r
2350: 75 6e 6e 65 72 29 0a 20 20 20 20 20 20 20 28 73  unner).       (s
2360: 65 74 21 20 25 74 65 73 74 2d 72 75 6e 6e 65 72  et! %test-runner
2370: 2d 63 75 72 72 65 6e 74 20 72 75 6e 6e 65 72 29  -current runner)
2380: 29 29 29 0a 20 20 28 64 65 66 69 6e 65 20 25 74  ))).  (define %t
2390: 65 73 74 2d 72 75 6e 6e 65 72 2d 66 61 63 74 6f  est-runner-facto
23a0: 72 79 20 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73  ry test-runner-s
23b0: 69 6d 70 6c 65 29 0a 20 20 28 64 65 66 69 6e 65  imple).  (define
23c0: 2d 73 79 6e 74 61 78 20 74 65 73 74 2d 72 75 6e  -syntax test-run
23d0: 6e 65 72 2d 66 61 63 74 6f 72 79 0a 20 20 20 20  ner-factory.    
23e0: 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29  (syntax-rules ()
23f0: 0a 20 20 20 20 20 20 28 28 74 65 73 74 2d 72 75  .      ((test-ru
2400: 6e 6e 65 72 2d 66 61 63 74 6f 72 79 29 0a 20 20  nner-factory).  
2410: 20 20 20 20 20 25 74 65 73 74 2d 72 75 6e 6e 65       %test-runne
2420: 72 2d 66 61 63 74 6f 72 79 29 0a 20 20 20 20 20  r-factory).     
2430: 20 28 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 66   ((test-runner-f
2440: 61 63 74 6f 72 79 20 72 75 6e 6e 65 72 29 0a 20  actory runner). 
2450: 20 20 20 20 20 20 28 73 65 74 21 20 25 74 65 73        (set! %tes
2460: 74 2d 72 75 6e 6e 65 72 2d 66 61 63 74 6f 72 79  t-runner-factory
2470: 20 72 75 6e 6e 65 72 29 29 29 29 29 29 0a 0a 3b   runner))))))..;
2480: 3b 20 41 20 73 61 66 65 72 20 77 72 61 70 70 65  ; A safer wrappe
2490: 72 20 74 6f 20 74 65 73 74 2d 72 75 6e 6e 65 72  r to test-runner
24a0: 2d 63 75 72 72 65 6e 74 2e 0a 28 64 65 66 69 6e  -current..(defin
24b0: 65 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 67  e (test-runner-g
24c0: 65 74 29 0a 20 20 28 6c 65 74 20 28 28 72 20 28  et).  (let ((r (
24d0: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63 75 72 72  test-runner-curr
24e0: 65 6e 74 29 29 29 0a 20 20 20 20 28 69 66 20 28  ent))).    (if (
24f0: 6e 6f 74 20 72 29 0a 09 28 63 6f 6e 64 2d 65 78  not r)..(cond-ex
2500: 70 61 6e 64 0a 09 20 28 73 72 66 69 2d 32 33 20  pand.. (srfi-23 
2510: 28 65 72 72 6f 72 20 22 74 65 73 74 2d 72 75 6e  (error "test-run
2520: 6e 65 72 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  ner not initiali
2530: 7a 65 64 20 2d 20 74 65 73 74 2d 62 65 67 69 6e  zed - test-begin
2540: 20 6d 69 73 73 69 6e 67 3f 22 29 29 0a 09 20 28   missing?")).. (
2550: 65 6c 73 65 20 23 74 29 29 29 0a 20 20 20 20 72  else #t))).    r
2560: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 25 74 65  ))..(define (%te
2570: 73 74 2d 73 70 65 63 69 66 69 63 69 65 72 2d 6d  st-specificier-m
2580: 61 74 63 68 65 73 20 73 70 65 63 20 72 75 6e 6e  atches spec runn
2590: 65 72 29 0a 20 20 28 73 70 65 63 20 72 75 6e 6e  er).  (spec runn
25a0: 65 72 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74  er))..(define (t
25b0: 65 73 74 2d 72 75 6e 6e 65 72 2d 63 72 65 61 74  est-runner-creat
25c0: 65 29 0a 20 20 28 28 74 65 73 74 2d 72 75 6e 6e  e).  ((test-runn
25d0: 65 72 2d 66 61 63 74 6f 72 79 29 29 29 0a 0a 28  er-factory)))..(
25e0: 64 65 66 69 6e 65 20 28 25 74 65 73 74 2d 61 6e  define (%test-an
25f0: 79 2d 73 70 65 63 69 66 69 65 72 2d 6d 61 74 63  y-specifier-matc
2600: 68 65 73 20 6c 69 73 74 20 72 75 6e 6e 65 72 29  hes list runner)
2610: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 75 6c 74  .  (let ((result
2620: 20 23 66 29 29 0a 20 20 20 20 28 6c 65 74 20 6c   #f)).    (let l
2630: 6f 6f 70 20 28 28 6c 20 6c 69 73 74 29 29 0a 20  oop ((l list)). 
2640: 20 20 20 20 20 28 63 6f 6e 64 20 28 28 6e 75 6c       (cond ((nul
2650: 6c 3f 20 6c 29 20 72 65 73 75 6c 74 29 0a 09 20  l? l) result).. 
2660: 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 28     (else..     (
2670: 69 66 20 28 25 74 65 73 74 2d 73 70 65 63 69 66  if (%test-specif
2680: 69 63 69 65 72 2d 6d 61 74 63 68 65 73 20 28 63  icier-matches (c
2690: 61 72 20 6c 29 20 72 75 6e 6e 65 72 29 0a 09 09  ar l) runner)...
26a0: 20 28 73 65 74 21 20 72 65 73 75 6c 74 20 23 74   (set! result #t
26b0: 29 29 0a 09 20 20 20 20 20 28 6c 6f 6f 70 20 28  ))..     (loop (
26c0: 63 64 72 20 6c 29 29 29 29 29 29 29 0a 0a 3b 3b  cdr l)))))))..;;
26d0: 20 52 65 74 75 72 6e 73 20 23 66 2c 20 23 74 2c   Returns #f, #t,
26e0: 20 6f 72 20 27 78 66 61 69 6c 2e 0a 28 64 65 66   or 'xfail..(def
26f0: 69 6e 65 20 28 25 74 65 73 74 2d 73 68 6f 75 6c  ine (%test-shoul
2700: 64 2d 65 78 65 63 75 74 65 20 72 75 6e 6e 65 72  d-execute runner
2710: 29 0a 20 20 28 6c 65 74 20 28 28 72 75 6e 20 28  ).  (let ((run (
2720: 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 72 75 6e  %test-runner-run
2730: 2d 6c 69 73 74 20 72 75 6e 6e 65 72 29 29 29 0a  -list runner))).
2740: 20 20 20 20 28 63 6f 6e 64 20 28 28 6f 72 0a 09      (cond ((or..
2750: 20 20 20 20 28 6e 6f 74 20 28 6f 72 20 28 65 71      (not (or (eq
2760: 76 3f 20 72 75 6e 20 23 74 29 0a 09 09 20 20 20  v? run #t)...   
2770: 20 20 28 25 74 65 73 74 2d 61 6e 79 2d 73 70 65    (%test-any-spe
2780: 63 69 66 69 65 72 2d 6d 61 74 63 68 65 73 20 72  cifier-matches r
2790: 75 6e 20 72 75 6e 6e 65 72 29 29 29 0a 09 20 20  un runner)))..  
27a0: 20 20 28 25 74 65 73 74 2d 61 6e 79 2d 73 70 65    (%test-any-spe
27b0: 63 69 66 69 65 72 2d 6d 61 74 63 68 65 73 0a 09  cifier-matches..
27c0: 20 20 20 20 20 28 25 74 65 73 74 2d 72 75 6e 6e       (%test-runn
27d0: 65 72 2d 73 6b 69 70 2d 6c 69 73 74 20 72 75 6e  er-skip-list run
27e0: 6e 65 72 29 0a 09 20 20 20 20 20 72 75 6e 6e 65  ner)..     runne
27f0: 72 29 29 0a 09 20 20 20 20 28 74 65 73 74 2d 72  r))..    (test-r
2800: 65 73 75 6c 74 2d 73 65 74 21 20 72 75 6e 6e 65  esult-set! runne
2810: 72 20 27 72 65 73 75 6c 74 2d 6b 69 6e 64 20 27  r 'result-kind '
2820: 73 6b 69 70 29 0a 09 20 20 20 20 23 66 29 0a 09  skip)..    #f)..
2830: 20 20 28 28 25 74 65 73 74 2d 61 6e 79 2d 73 70    ((%test-any-sp
2840: 65 63 69 66 69 65 72 2d 6d 61 74 63 68 65 73 0a  ecifier-matches.
2850: 09 20 20 20 20 28 25 74 65 73 74 2d 72 75 6e 6e  .    (%test-runn
2860: 65 72 2d 66 61 69 6c 2d 6c 69 73 74 20 72 75 6e  er-fail-list run
2870: 6e 65 72 29 0a 09 20 20 20 20 72 75 6e 6e 65 72  ner)..    runner
2880: 29 0a 09 20 20 20 28 74 65 73 74 2d 72 65 73 75  )..   (test-resu
2890: 6c 74 2d 73 65 74 21 20 72 75 6e 6e 65 72 20 27  lt-set! runner '
28a0: 72 65 73 75 6c 74 2d 6b 69 6e 64 20 27 78 66 61  result-kind 'xfa
28b0: 69 6c 29 0a 09 20 20 20 27 78 66 61 69 6c 29 0a  il)..   'xfail).
28c0: 09 20 20 28 65 6c 73 65 20 23 74 29 29 29 29 0a  .  (else #t)))).
28d0: 0a 28 64 65 66 69 6e 65 20 28 25 74 65 73 74 2d  .(define (%test-
28e0: 62 65 67 69 6e 20 73 75 69 74 65 2d 6e 61 6d 65  begin suite-name
28f0: 20 63 6f 75 6e 74 29 0a 20 20 28 69 66 20 28 6e   count).  (if (n
2900: 6f 74 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d  ot (test-runner-
2910: 63 75 72 72 65 6e 74 29 29 0a 20 20 20 20 20 20  current)).      
2920: 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63 75 72  (test-runner-cur
2930: 72 65 6e 74 20 28 74 65 73 74 2d 72 75 6e 6e 65  rent (test-runne
2940: 72 2d 63 72 65 61 74 65 29 29 29 0a 20 20 28 6c  r-create))).  (l
2950: 65 74 20 28 28 72 75 6e 6e 65 72 20 28 74 65 73  et ((runner (tes
2960: 74 2d 72 75 6e 6e 65 72 2d 63 75 72 72 65 6e 74  t-runner-current
2970: 29 29 29 0a 20 20 20 20 28 28 74 65 73 74 2d 72  ))).    ((test-r
2980: 75 6e 6e 65 72 2d 6f 6e 2d 67 72 6f 75 70 2d 62  unner-on-group-b
2990: 65 67 69 6e 20 72 75 6e 6e 65 72 29 20 72 75 6e  egin runner) run
29a0: 6e 65 72 20 73 75 69 74 65 2d 6e 61 6d 65 20 63  ner suite-name c
29b0: 6f 75 6e 74 29 0a 20 20 20 20 28 25 74 65 73 74  ount).    (%test
29c0: 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d 73 61 76  -runner-skip-sav
29d0: 65 21 20 72 75 6e 6e 65 72 0a 09 09 09 20 20 20  e! runner....   
29e0: 20 20 20 20 28 63 6f 6e 73 20 28 25 74 65 73 74      (cons (%test
29f0: 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d 6c 69 73  -runner-skip-lis
2a00: 74 20 72 75 6e 6e 65 72 29 0a 09 09 09 09 20 20  t runner).....  
2a10: 20 20 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72     (%test-runner
2a20: 2d 73 6b 69 70 2d 73 61 76 65 20 72 75 6e 6e 65  -skip-save runne
2a30: 72 29 29 29 0a 20 20 20 20 28 25 74 65 73 74 2d  r))).    (%test-
2a40: 72 75 6e 6e 65 72 2d 66 61 69 6c 2d 73 61 76 65  runner-fail-save
2a50: 21 20 72 75 6e 6e 65 72 0a 09 09 09 20 20 20 20  ! runner....    
2a60: 20 20 20 28 63 6f 6e 73 20 28 25 74 65 73 74 2d     (cons (%test-
2a70: 72 75 6e 6e 65 72 2d 66 61 69 6c 2d 6c 69 73 74  runner-fail-list
2a80: 20 72 75 6e 6e 65 72 29 0a 09 09 09 09 20 20 20   runner).....   
2a90: 20 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d    (%test-runner-
2aa0: 66 61 69 6c 2d 73 61 76 65 20 72 75 6e 6e 65 72  fail-save runner
2ab0: 29 29 29 0a 20 20 20 20 28 25 74 65 73 74 2d 72  ))).    (%test-r
2ac0: 75 6e 6e 65 72 2d 63 6f 75 6e 74 2d 6c 69 73 74  unner-count-list
2ad0: 21 20 72 75 6e 6e 65 72 0a 09 09 09 20 20 20 20  ! runner....    
2ae0: 20 28 63 6f 6e 73 20 28 63 6f 6e 73 20 28 25 74   (cons (cons (%t
2af0: 65 73 74 2d 72 75 6e 6e 65 72 2d 74 6f 74 61 6c  est-runner-total
2b00: 2d 63 6f 75 6e 74 20 72 75 6e 6e 65 72 29 0a 09  -count runner)..
2b10: 09 09 09 09 20 63 6f 75 6e 74 29 0a 09 09 09 09  .... count).....
2b20: 20 20 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72     (%test-runner
2b30: 2d 63 6f 75 6e 74 2d 6c 69 73 74 20 72 75 6e 6e  -count-list runn
2b40: 65 72 29 29 29 0a 20 20 20 20 28 74 65 73 74 2d  er))).    (test-
2b50: 72 75 6e 6e 65 72 2d 67 72 6f 75 70 2d 73 74 61  runner-group-sta
2b60: 63 6b 21 20 72 75 6e 6e 65 72 20 28 63 6f 6e 73  ck! runner (cons
2b70: 20 73 75 69 74 65 2d 6e 61 6d 65 0a 09 09 09 09   suite-name.....
2b80: 09 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 67 72  .(test-runner-gr
2b90: 6f 75 70 2d 73 74 61 63 6b 20 72 75 6e 6e 65 72  oup-stack runner
2ba0: 29 29 29 29 29 0a 28 63 6f 6e 64 2d 65 78 70 61  ))))).(cond-expa
2bb0: 6e 64 0a 20 28 28 61 6e 64 20 28 6e 6f 74 20 72  nd. ((and (not r
2bc0: 36 72 73 29 20 6b 61 77 61 29 0a 20 20 3b 3b 20  6rs) kawa).  ;; 
2bd0: 4b 61 77 61 20 68 61 73 20 74 65 73 74 2d 62 65  Kawa has test-be
2be0: 67 69 6e 20 62 75 69 6c 74 20 69 6e 2c 20 69 6d  gin built in, im
2bf0: 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20  plemented as:.  
2c00: 3b 3b 20 28 62 65 67 69 6e 0a 20 20 3b 3b 20 20  ;; (begin.  ;;  
2c10: 20 28 63 6f 6e 64 2d 65 78 70 61 6e 64 20 28 73   (cond-expand (s
2c20: 72 66 69 2d 36 34 20 23 21 76 6f 69 64 29 20 28  rfi-64 #!void) (
2c30: 65 6c 73 65 20 28 72 65 71 75 69 72 65 20 27 73  else (require 's
2c40: 72 66 69 2d 36 34 29 29 29 0a 20 20 3b 3b 20 20  rfi-64))).  ;;  
2c50: 20 28 25 74 65 73 74 2d 62 65 67 69 6e 20 73 75   (%test-begin su
2c60: 69 74 65 2d 6e 61 6d 65 20 5b 63 6f 75 6e 74 5d  ite-name [count]
2c70: 29 29 0a 20 20 3b 3b 20 54 68 69 73 20 70 75 74  )).  ;; This put
2c80: 73 20 74 65 73 74 2d 62 65 67 69 6e 20 62 75 74  s test-begin but
2c90: 20 6f 6e 6c 79 20 74 65 73 74 2d 62 65 67 69 6e   only test-begin
2ca0: 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20   in the default 
2cb0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 2e 2c 0a 20 20  environment.,.  
2cc0: 3b 3b 20 77 68 69 63 68 20 6d 61 6b 65 73 20 6e  ;; which makes n
2cd0: 6f 72 6d 61 6c 20 74 65 73 74 20 73 75 69 74 65  ormal test suite
2ce0: 73 20 6c 6f 61 64 61 62 6c 65 20 77 69 74 68 6f  s loadable witho
2cf0: 75 74 20 6e 6f 6e 2d 70 6f 72 74 61 62 6c 65 20  ut non-portable 
2d00: 63 6f 6d 6d 61 6e 64 73 2e 0a 20 20 29 0a 20 28  commands..  ). (
2d10: 65 6c 73 65 0a 20 20 28 64 65 66 69 6e 65 2d 73  else.  (define-s
2d20: 79 6e 74 61 78 20 74 65 73 74 2d 62 65 67 69 6e  yntax test-begin
2d30: 0a 20 20 20 20 28 73 79 6e 74 61 78 2d 72 75 6c  .    (syntax-rul
2d40: 65 73 20 28 29 0a 20 20 20 20 20 20 28 28 74 65  es ().      ((te
2d50: 73 74 2d 62 65 67 69 6e 20 73 75 69 74 65 2d 6e  st-begin suite-n
2d60: 61 6d 65 29 0a 20 20 20 20 20 20 20 28 25 74 65  ame).       (%te
2d70: 73 74 2d 62 65 67 69 6e 20 73 75 69 74 65 2d 6e  st-begin suite-n
2d80: 61 6d 65 20 23 66 29 29 0a 20 20 20 20 20 20 28  ame #f)).      (
2d90: 28 74 65 73 74 2d 62 65 67 69 6e 20 73 75 69 74  (test-begin suit
2da0: 65 2d 6e 61 6d 65 20 63 6f 75 6e 74 29 0a 20 20  e-name count).  
2db0: 20 20 20 20 20 28 25 74 65 73 74 2d 62 65 67 69       (%test-begi
2dc0: 6e 20 73 75 69 74 65 2d 6e 61 6d 65 20 63 6f 75  n suite-name cou
2dd0: 6e 74 29 29 29 29 29 29 0a 0a 28 64 65 66 69 6e  nt))))))..(defin
2de0: 65 20 28 74 65 73 74 2d 6f 6e 2d 67 72 6f 75 70  e (test-on-group
2df0: 2d 62 65 67 69 6e 2d 73 69 6d 70 6c 65 20 72 75  -begin-simple ru
2e00: 6e 6e 65 72 20 73 75 69 74 65 2d 6e 61 6d 65 20  nner suite-name 
2e10: 63 6f 75 6e 74 29 0a 20 20 28 69 66 20 28 6e 75  count).  (if (nu
2e20: 6c 6c 3f 20 28 74 65 73 74 2d 72 75 6e 6e 65 72  ll? (test-runner
2e30: 2d 67 72 6f 75 70 2d 73 74 61 63 6b 20 72 75 6e  -group-stack run
2e40: 6e 65 72 29 29 0a 20 20 20 20 20 20 28 62 65 67  ner)).      (beg
2e50: 69 6e 0a 09 28 64 69 73 70 6c 61 79 20 22 25 25  in..(display "%%
2e60: 25 25 20 53 74 61 72 74 69 6e 67 20 74 65 73 74  %% Starting test
2e70: 20 22 29 0a 09 28 64 69 73 70 6c 61 79 20 73 75   ")..(display su
2e80: 69 74 65 2d 6e 61 6d 65 29 0a 09 28 69 66 20 74  ite-name)..(if t
2e90: 65 73 74 2d 6c 6f 67 2d 74 6f 2d 66 69 6c 65 0a  est-log-to-file.
2ea0: 09 20 20 20 20 28 6c 65 74 2a 20 28 28 6c 6f 67  .    (let* ((log
2eb0: 2d 66 69 6c 65 2d 6e 61 6d 65 0a 09 09 20 20 20  -file-name...   
2ec0: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 74 65   (if (string? te
2ed0: 73 74 2d 6c 6f 67 2d 74 6f 2d 66 69 6c 65 29 20  st-log-to-file) 
2ee0: 74 65 73 74 2d 6c 6f 67 2d 74 6f 2d 66 69 6c 65  test-log-to-file
2ef0: 0a 09 09 09 28 73 74 72 69 6e 67 2d 61 70 70 65  ....(string-appe
2f00: 6e 64 20 73 75 69 74 65 2d 6e 61 6d 65 20 22 2e  nd suite-name ".
2f10: 6c 6f 67 22 29 29 29 0a 09 09 20 20 20 28 6c 6f  log")))...   (lo
2f20: 67 2d 66 69 6c 65 0a 09 09 20 20 20 20 28 63 6f  g-file...    (co
2f30: 6e 64 2d 65 78 70 61 6e 64 20 28 28 61 6e 64 20  nd-expand ((and 
2f40: 28 6e 6f 74 20 72 36 72 73 29 20 6d 7a 73 63 68  (not r6rs) mzsch
2f50: 65 6d 65 29 0a 09 09 09 09 20 20 28 6f 70 65 6e  eme).....  (open
2f60: 2d 6f 75 74 70 75 74 2d 66 69 6c 65 20 6c 6f 67  -output-file log
2f70: 2d 66 69 6c 65 2d 6e 61 6d 65 20 27 74 72 75 6e  -file-name 'trun
2f80: 63 61 74 65 2f 72 65 70 6c 61 63 65 29 29 0a 09  cate/replace))..
2f90: 09 09 09 20 28 65 6c 73 65 20 28 6f 70 65 6e 2d  ... (else (open-
2fa0: 6f 75 74 70 75 74 2d 66 69 6c 65 20 6c 6f 67 2d  output-file log-
2fb0: 66 69 6c 65 2d 6e 61 6d 65 29 29 29 29 29 0a 09  file-name)))))..
2fc0: 20 20 20 20 20 20 28 64 69 73 70 6c 61 79 20 22        (display "
2fd0: 25 25 25 25 20 53 74 61 72 74 69 6e 67 20 74 65  %%%% Starting te
2fe0: 73 74 20 22 20 6c 6f 67 2d 66 69 6c 65 29 0a 09  st " log-file)..
2ff0: 20 20 20 20 20 20 28 64 69 73 70 6c 61 79 20 73        (display s
3000: 75 69 74 65 2d 6e 61 6d 65 20 6c 6f 67 2d 66 69  uite-name log-fi
3010: 6c 65 29 0a 09 20 20 20 20 20 20 28 6e 65 77 6c  le)..      (newl
3020: 69 6e 65 20 6c 6f 67 2d 66 69 6c 65 29 0a 09 20  ine log-file).. 
3030: 20 20 20 20 20 28 74 65 73 74 2d 72 75 6e 6e 65       (test-runne
3040: 72 2d 61 75 78 2d 76 61 6c 75 65 21 20 72 75 6e  r-aux-value! run
3050: 6e 65 72 20 6c 6f 67 2d 66 69 6c 65 29 0a 09 20  ner log-file).. 
3060: 20 20 20 20 20 28 64 69 73 70 6c 61 79 20 22 20       (display " 
3070: 20 28 57 72 69 74 69 6e 67 20 66 75 6c 6c 20 6c   (Writing full l
3080: 6f 67 20 74 6f 20 5c 22 22 29 0a 09 20 20 20 20  og to \"")..    
3090: 20 20 28 64 69 73 70 6c 61 79 20 6c 6f 67 2d 66    (display log-f
30a0: 69 6c 65 2d 6e 61 6d 65 29 0a 09 20 20 20 20 20  ile-name)..     
30b0: 20 28 64 69 73 70 6c 61 79 20 22 5c 22 29 22 29   (display "\")")
30c0: 29 29 0a 09 28 6e 65 77 6c 69 6e 65 29 29 29 0a  ))..(newline))).
30d0: 20 20 28 6c 65 74 20 28 28 6c 6f 67 20 28 74 65    (let ((log (te
30e0: 73 74 2d 72 75 6e 6e 65 72 2d 61 75 78 2d 76 61  st-runner-aux-va
30f0: 6c 75 65 20 72 75 6e 6e 65 72 29 29 29 0a 20 20  lue runner))).  
3100: 20 20 28 69 66 20 28 6f 75 74 70 75 74 2d 70 6f    (if (output-po
3110: 72 74 3f 20 6c 6f 67 29 0a 09 28 62 65 67 69 6e  rt? log)..(begin
3120: 0a 09 20 20 28 64 69 73 70 6c 61 79 20 22 47 72  ..  (display "Gr
3130: 6f 75 70 20 62 65 67 69 6e 3a 20 22 20 6c 6f 67  oup begin: " log
3140: 29 0a 09 20 20 28 64 69 73 70 6c 61 79 20 73 75  )..  (display su
3150: 69 74 65 2d 6e 61 6d 65 20 6c 6f 67 29 0a 09 20  ite-name log).. 
3160: 20 28 6e 65 77 6c 69 6e 65 20 6c 6f 67 29 29 29   (newline log)))
3170: 29 0a 20 20 23 66 29 0a 0a 28 64 65 66 69 6e 65  ).  #f)..(define
3180: 20 28 74 65 73 74 2d 6f 6e 2d 67 72 6f 75 70 2d   (test-on-group-
3190: 65 6e 64 2d 73 69 6d 70 6c 65 20 72 75 6e 6e 65  end-simple runne
31a0: 72 29 0a 20 20 28 6c 65 74 20 28 28 6c 6f 67 20  r).  (let ((log 
31b0: 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 61 75 78  (test-runner-aux
31c0: 2d 76 61 6c 75 65 20 72 75 6e 6e 65 72 29 29 29  -value runner)))
31d0: 0a 20 20 20 20 28 69 66 20 28 6f 75 74 70 75 74  .    (if (output
31e0: 2d 70 6f 72 74 3f 20 6c 6f 67 29 0a 09 28 62 65  -port? log)..(be
31f0: 67 69 6e 0a 09 20 20 28 64 69 73 70 6c 61 79 20  gin..  (display 
3200: 22 47 72 6f 75 70 20 65 6e 64 3a 20 22 20 6c 6f  "Group end: " lo
3210: 67 29 0a 09 20 20 28 64 69 73 70 6c 61 79 20 28  g)..  (display (
3220: 63 61 72 20 28 74 65 73 74 2d 72 75 6e 6e 65 72  car (test-runner
3230: 2d 67 72 6f 75 70 2d 73 74 61 63 6b 20 72 75 6e  -group-stack run
3240: 6e 65 72 29 29 20 6c 6f 67 29 0a 09 20 20 28 6e  ner)) log)..  (n
3250: 65 77 6c 69 6e 65 20 6c 6f 67 29 29 29 29 0a 20  ewline log)))). 
3260: 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 25   #f)..(define (%
3270: 74 65 73 74 2d 6f 6e 2d 62 61 64 2d 63 6f 75 6e  test-on-bad-coun
3280: 74 2d 77 72 69 74 65 20 72 75 6e 6e 65 72 20 63  t-write runner c
3290: 6f 75 6e 74 20 65 78 70 65 63 74 65 64 2d 63 6f  ount expected-co
32a0: 75 6e 74 20 70 6f 72 74 29 0a 20 20 28 64 69 73  unt port).  (dis
32b0: 70 6c 61 79 20 22 2a 2a 2a 20 54 6f 74 61 6c 20  play "*** Total 
32c0: 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20  number of tests 
32d0: 77 61 73 20 22 20 70 6f 72 74 29 0a 20 20 28 64  was " port).  (d
32e0: 69 73 70 6c 61 79 20 63 6f 75 6e 74 20 70 6f 72  isplay count por
32f0: 74 29 0a 20 20 28 64 69 73 70 6c 61 79 20 22 20  t).  (display " 
3300: 62 75 74 20 73 68 6f 75 6c 64 20 62 65 20 22 20  but should be " 
3310: 70 6f 72 74 29 0a 20 20 28 64 69 73 70 6c 61 79  port).  (display
3320: 20 65 78 70 65 63 74 65 64 2d 63 6f 75 6e 74 20   expected-count 
3330: 70 6f 72 74 29 0a 20 20 28 64 69 73 70 6c 61 79  port).  (display
3340: 20 22 2e 20 2a 2a 2a 22 20 70 6f 72 74 29 0a 20   ". ***" port). 
3350: 20 28 6e 65 77 6c 69 6e 65 20 70 6f 72 74 29 0a   (newline port).
3360: 20 20 28 64 69 73 70 6c 61 79 20 22 2a 2a 2a 20    (display "*** 
3370: 44 69 73 63 72 65 70 61 6e 63 79 20 69 6e 64 69  Discrepancy indi
3380: 63 61 74 65 73 20 74 65 73 74 73 75 69 74 65 20  cates testsuite 
3390: 65 72 72 6f 72 20 6f 72 20 65 78 63 65 70 74 69  error or excepti
33a0: 6f 6e 73 2e 20 2a 2a 2a 22 20 70 6f 72 74 29 0a  ons. ***" port).
33b0: 20 20 28 6e 65 77 6c 69 6e 65 20 70 6f 72 74 29    (newline port)
33c0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73 74  )..(define (test
33d0: 2d 6f 6e 2d 62 61 64 2d 63 6f 75 6e 74 2d 73 69  -on-bad-count-si
33e0: 6d 70 6c 65 20 72 75 6e 6e 65 72 20 63 6f 75 6e  mple runner coun
33f0: 74 20 65 78 70 65 63 74 65 64 2d 63 6f 75 6e 74  t expected-count
3400: 29 0a 20 20 28 25 74 65 73 74 2d 6f 6e 2d 62 61  ).  (%test-on-ba
3410: 64 2d 63 6f 75 6e 74 2d 77 72 69 74 65 20 72 75  d-count-write ru
3420: 6e 6e 65 72 20 63 6f 75 6e 74 20 65 78 70 65 63  nner count expec
3430: 74 65 64 2d 63 6f 75 6e 74 20 28 63 75 72 72 65  ted-count (curre
3440: 6e 74 2d 6f 75 74 70 75 74 2d 70 6f 72 74 29 29  nt-output-port))
3450: 0a 20 20 28 6c 65 74 20 28 28 6c 6f 67 20 28 74  .  (let ((log (t
3460: 65 73 74 2d 72 75 6e 6e 65 72 2d 61 75 78 2d 76  est-runner-aux-v
3470: 61 6c 75 65 20 72 75 6e 6e 65 72 29 29 29 0a 20  alue runner))). 
3480: 20 20 20 28 69 66 20 28 6f 75 74 70 75 74 2d 70     (if (output-p
3490: 6f 72 74 3f 20 6c 6f 67 29 0a 09 28 25 74 65 73  ort? log)..(%tes
34a0: 74 2d 6f 6e 2d 62 61 64 2d 63 6f 75 6e 74 2d 77  t-on-bad-count-w
34b0: 72 69 74 65 20 72 75 6e 6e 65 72 20 63 6f 75 6e  rite runner coun
34c0: 74 20 65 78 70 65 63 74 65 64 2d 63 6f 75 6e 74  t expected-count
34d0: 20 6c 6f 67 29 29 29 29 0a 0a 28 64 65 66 69 6e   log))))..(defin
34e0: 65 20 28 74 65 73 74 2d 6f 6e 2d 62 61 64 2d 65  e (test-on-bad-e
34f0: 6e 64 2d 6e 61 6d 65 2d 73 69 6d 70 6c 65 20 72  nd-name-simple r
3500: 75 6e 6e 65 72 20 62 65 67 69 6e 2d 6e 61 6d 65  unner begin-name
3510: 20 65 6e 64 2d 6e 61 6d 65 29 0a 20 20 28 6c 65   end-name).  (le
3520: 74 20 28 28 6d 73 67 20 28 73 74 72 69 6e 67 2d  t ((msg (string-
3530: 61 70 70 65 6e 64 20 28 25 74 65 73 74 2d 66 6f  append (%test-fo
3540: 72 6d 61 74 2d 6c 69 6e 65 20 72 75 6e 6e 65 72  rmat-line runner
3550: 29 20 22 74 65 73 74 2d 65 6e 64 20 22 20 62 65  ) "test-end " be
3560: 67 69 6e 2d 6e 61 6d 65 0a 09 09 09 20 20 20 20  gin-name....    
3570: 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  " does not match
3580: 20 74 65 73 74 2d 62 65 67 69 6e 20 22 20 65 6e   test-begin " en
3590: 64 2d 6e 61 6d 65 29 29 29 0a 20 20 20 20 28 63  d-name))).    (c
35a0: 6f 6e 64 2d 65 78 70 61 6e 64 0a 20 20 20 20 20  ond-expand.     
35b0: 28 73 72 66 69 2d 32 33 20 28 65 72 72 6f 72 20  (srfi-23 (error 
35c0: 6d 73 67 29 29 0a 20 20 20 20 20 28 65 6c 73 65  msg)).     (else
35d0: 20 28 64 69 73 70 6c 61 79 20 6d 73 67 29 20 28   (display msg) (
35e0: 6e 65 77 6c 69 6e 65 29 29 29 29 29 0a 20 20 0a  newline))))).  .
35f0: 0a 28 64 65 66 69 6e 65 20 28 25 74 65 73 74 2d  .(define (%test-
3600: 66 69 6e 61 6c 2d 72 65 70 6f 72 74 31 20 76 61  final-report1 va
3610: 6c 75 65 20 6c 61 62 65 6c 20 70 6f 72 74 29 0a  lue label port).
3620: 20 20 28 69 66 20 28 3e 20 76 61 6c 75 65 20 30    (if (> value 0
3630: 29 0a 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09  ).      (begin..
3640: 28 64 69 73 70 6c 61 79 20 6c 61 62 65 6c 20 70  (display label p
3650: 6f 72 74 29 0a 09 28 64 69 73 70 6c 61 79 20 76  ort)..(display v
3660: 61 6c 75 65 20 70 6f 72 74 29 0a 09 28 6e 65 77  alue port)..(new
3670: 6c 69 6e 65 20 70 6f 72 74 29 29 29 29 0a 0a 28  line port))))..(
3680: 64 65 66 69 6e 65 20 28 25 74 65 73 74 2d 66 69  define (%test-fi
3690: 6e 61 6c 2d 72 65 70 6f 72 74 2d 73 69 6d 70 6c  nal-report-simpl
36a0: 65 20 72 75 6e 6e 65 72 20 70 6f 72 74 29 0a 20  e runner port). 
36b0: 20 28 25 74 65 73 74 2d 66 69 6e 61 6c 2d 72 65   (%test-final-re
36c0: 70 6f 72 74 31 20 28 74 65 73 74 2d 72 75 6e 6e  port1 (test-runn
36d0: 65 72 2d 70 61 73 73 2d 63 6f 75 6e 74 20 72 75  er-pass-count ru
36e0: 6e 6e 65 72 29 0a 09 09 20 20 20 20 20 20 22 23  nner)...      "#
36f0: 20 6f 66 20 65 78 70 65 63 74 65 64 20 70 61 73   of expected pas
3700: 73 65 73 20 20 20 20 20 20 22 20 70 6f 72 74 29  ses      " port)
3710: 0a 20 20 28 25 74 65 73 74 2d 66 69 6e 61 6c 2d  .  (%test-final-
3720: 72 65 70 6f 72 74 31 20 28 74 65 73 74 2d 72 75  report1 (test-ru
3730: 6e 6e 65 72 2d 78 66 61 69 6c 2d 63 6f 75 6e 74  nner-xfail-count
3740: 20 72 75 6e 6e 65 72 29 0a 09 09 20 20 20 20 20   runner)...     
3750: 20 22 23 20 6f 66 20 65 78 70 65 63 74 65 64 20   "# of expected 
3760: 66 61 69 6c 75 72 65 73 20 20 20 20 22 20 70 6f  failures    " po
3770: 72 74 29 0a 20 20 28 25 74 65 73 74 2d 66 69 6e  rt).  (%test-fin
3780: 61 6c 2d 72 65 70 6f 72 74 31 20 28 74 65 73 74  al-report1 (test
3790: 2d 72 75 6e 6e 65 72 2d 78 70 61 73 73 2d 63 6f  -runner-xpass-co
37a0: 75 6e 74 20 72 75 6e 6e 65 72 29 0a 09 09 20 20  unt runner)...  
37b0: 20 20 20 20 22 23 20 6f 66 20 75 6e 65 78 70 65      "# of unexpe
37c0: 63 74 65 64 20 73 75 63 63 65 73 73 65 73 20 22  cted successes "
37d0: 20 70 6f 72 74 29 0a 20 20 28 25 74 65 73 74 2d   port).  (%test-
37e0: 66 69 6e 61 6c 2d 72 65 70 6f 72 74 31 20 28 74  final-report1 (t
37f0: 65 73 74 2d 72 75 6e 6e 65 72 2d 66 61 69 6c 2d  est-runner-fail-
3800: 63 6f 75 6e 74 20 72 75 6e 6e 65 72 29 0a 09 09  count runner)...
3810: 20 20 20 20 20 20 22 23 20 6f 66 20 75 6e 65 78        "# of unex
3820: 70 65 63 74 65 64 20 66 61 69 6c 75 72 65 73 20  pected failures 
3830: 20 22 20 70 6f 72 74 29 0a 20 20 28 25 74 65 73   " port).  (%tes
3840: 74 2d 66 69 6e 61 6c 2d 72 65 70 6f 72 74 31 20  t-final-report1 
3850: 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69  (test-runner-ski
3860: 70 2d 63 6f 75 6e 74 20 72 75 6e 6e 65 72 29 0a  p-count runner).
3870: 09 09 20 20 20 20 20 20 22 23 20 6f 66 20 73 6b  ..      "# of sk
3880: 69 70 70 65 64 20 74 65 73 74 73 20 20 20 20 20  ipped tests     
3890: 20 20 20 22 20 70 6f 72 74 29 29 0a 0a 28 64 65     " port))..(de
38a0: 66 69 6e 65 20 28 74 65 73 74 2d 6f 6e 2d 66 69  fine (test-on-fi
38b0: 6e 61 6c 2d 73 69 6d 70 6c 65 20 72 75 6e 6e 65  nal-simple runne
38c0: 72 29 0a 20 20 28 25 74 65 73 74 2d 66 69 6e 61  r).  (%test-fina
38d0: 6c 2d 72 65 70 6f 72 74 2d 73 69 6d 70 6c 65 20  l-report-simple 
38e0: 72 75 6e 6e 65 72 20 28 63 75 72 72 65 6e 74 2d  runner (current-
38f0: 6f 75 74 70 75 74 2d 70 6f 72 74 29 29 0a 20 20  output-port)).  
3900: 28 6c 65 74 20 28 28 6c 6f 67 20 28 74 65 73 74  (let ((log (test
3910: 2d 72 75 6e 6e 65 72 2d 61 75 78 2d 76 61 6c 75  -runner-aux-valu
3920: 65 20 72 75 6e 6e 65 72 29 29 29 0a 20 20 20 20  e runner))).    
3930: 28 69 66 20 28 6f 75 74 70 75 74 2d 70 6f 72 74  (if (output-port
3940: 3f 20 6c 6f 67 29 0a 09 28 25 74 65 73 74 2d 66  ? log)..(%test-f
3950: 69 6e 61 6c 2d 72 65 70 6f 72 74 2d 73 69 6d 70  inal-report-simp
3960: 6c 65 20 72 75 6e 6e 65 72 20 6c 6f 67 29 29 29  le runner log)))
3970: 29 0a 0a 28 64 65 66 69 6e 65 20 28 25 74 65 73  )..(define (%tes
3980: 74 2d 66 6f 72 6d 61 74 2d 6c 69 6e 65 20 72 75  t-format-line ru
3990: 6e 6e 65 72 29 0a 20 20 20 28 6c 65 74 2a 20 28  nner).   (let* (
39a0: 28 6c 69 6e 65 2d 69 6e 66 6f 20 28 74 65 73 74  (line-info (test
39b0: 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 20 72 75  -result-alist ru
39c0: 6e 6e 65 72 29 29 0a 09 20 20 28 73 6f 75 72 63  nner))..  (sourc
39d0: 65 2d 66 69 6c 65 20 28 61 73 73 71 20 27 73 6f  e-file (assq 'so
39e0: 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 2d 69  urce-file line-i
39f0: 6e 66 6f 29 29 0a 09 20 20 28 73 6f 75 72 63 65  nfo))..  (source
3a00: 2d 6c 69 6e 65 20 28 61 73 73 71 20 27 73 6f 75  -line (assq 'sou
3a10: 72 63 65 2d 6c 69 6e 65 20 6c 69 6e 65 2d 69 6e  rce-line line-in
3a20: 66 6f 29 29 0a 09 20 20 28 66 69 6c 65 20 28 69  fo))..  (file (i
3a30: 66 20 73 6f 75 72 63 65 2d 66 69 6c 65 20 28 63  f source-file (c
3a40: 64 72 20 73 6f 75 72 63 65 2d 66 69 6c 65 29 20  dr source-file) 
3a50: 22 22 29 29 29 0a 20 20 20 20 20 28 69 66 20 73  ""))).     (if s
3a60: 6f 75 72 63 65 2d 6c 69 6e 65 0a 09 20 28 73 74  ource-line.. (st
3a70: 72 69 6e 67 2d 61 70 70 65 6e 64 20 66 69 6c 65  ring-append file
3a80: 20 22 3a 22 0a 09 09 09 28 6e 75 6d 62 65 72 2d   ":"....(number-
3a90: 3e 73 74 72 69 6e 67 20 28 63 64 72 20 73 6f 75  >string (cdr sou
3aa0: 72 63 65 2d 6c 69 6e 65 29 29 20 22 3a 20 22 29  rce-line)) ": ")
3ab0: 0a 09 20 22 22 29 29 29 0a 0a 28 64 65 66 69 6e  .. "")))..(defin
3ac0: 65 20 28 25 74 65 73 74 2d 65 6e 64 20 73 75 69  e (%test-end sui
3ad0: 74 65 2d 6e 61 6d 65 20 6c 69 6e 65 2d 69 6e 66  te-name line-inf
3ae0: 6f 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 20 28  o).  (let* ((r (
3af0: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 67 65 74 29  test-runner-get)
3b00: 29 0a 09 20 28 67 72 6f 75 70 73 20 28 74 65 73  ).. (groups (tes
3b10: 74 2d 72 75 6e 6e 65 72 2d 67 72 6f 75 70 2d 73  t-runner-group-s
3b20: 74 61 63 6b 20 72 29 29 0a 09 20 28 6c 69 6e 65  tack r)).. (line
3b30: 20 28 25 74 65 73 74 2d 66 6f 72 6d 61 74 2d 6c   (%test-format-l
3b40: 69 6e 65 20 72 29 29 29 0a 20 20 20 20 28 74 65  ine r))).    (te
3b50: 73 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21  st-result-alist!
3b60: 20 72 20 6c 69 6e 65 2d 69 6e 66 6f 29 0a 20 20   r line-info).  
3b70: 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 67 72 6f    (if (null? gro
3b80: 75 70 73 29 0a 09 28 6c 65 74 20 28 28 6d 73 67  ups)..(let ((msg
3b90: 20 28 73 74 72 69 6e 67 2d 61 70 70 65 6e 64 20   (string-append 
3ba0: 6c 69 6e 65 20 22 74 65 73 74 2d 65 6e 64 20 6e  line "test-end n
3bb0: 6f 74 20 69 6e 20 61 20 67 72 6f 75 70 22 29 29  ot in a group"))
3bc0: 29 0a 09 20 20 28 63 6f 6e 64 2d 65 78 70 61 6e  )..  (cond-expan
3bd0: 64 0a 09 20 20 20 28 73 72 66 69 2d 32 33 20 28  d..   (srfi-23 (
3be0: 65 72 72 6f 72 20 6d 73 67 29 29 0a 09 20 20 20  error msg))..   
3bf0: 28 65 6c 73 65 20 28 64 69 73 70 6c 61 79 20 6d  (else (display m
3c00: 73 67 29 20 28 6e 65 77 6c 69 6e 65 29 29 29 29  sg) (newline))))
3c10: 29 0a 20 20 20 20 28 69 66 20 28 61 6e 64 20 73  ).    (if (and s
3c20: 75 69 74 65 2d 6e 61 6d 65 20 28 6e 6f 74 20 28  uite-name (not (
3c30: 65 71 75 61 6c 3f 20 73 75 69 74 65 2d 6e 61 6d  equal? suite-nam
3c40: 65 20 28 63 61 72 20 67 72 6f 75 70 73 29 29 29  e (car groups)))
3c50: 29 0a 09 28 28 74 65 73 74 2d 72 75 6e 6e 65 72  )..((test-runner
3c60: 2d 6f 6e 2d 62 61 64 2d 65 6e 64 2d 6e 61 6d 65  -on-bad-end-name
3c70: 20 72 29 20 72 20 73 75 69 74 65 2d 6e 61 6d 65   r) r suite-name
3c80: 20 28 63 61 72 20 67 72 6f 75 70 73 29 29 29 0a   (car groups))).
3c90: 20 20 20 20 28 6c 65 74 2a 20 28 28 63 6f 75 6e      (let* ((coun
3ca0: 74 2d 6c 69 73 74 20 28 25 74 65 73 74 2d 72 75  t-list (%test-ru
3cb0: 6e 6e 65 72 2d 63 6f 75 6e 74 2d 6c 69 73 74 20  nner-count-list 
3cc0: 72 29 29 0a 09 20 20 20 28 65 78 70 65 63 74 65  r))..   (expecte
3cd0: 64 2d 63 6f 75 6e 74 20 28 63 64 61 72 20 63 6f  d-count (cdar co
3ce0: 75 6e 74 2d 6c 69 73 74 29 29 0a 09 20 20 20 28  unt-list))..   (
3cf0: 73 61 76 65 64 2d 63 6f 75 6e 74 20 28 63 61 61  saved-count (caa
3d00: 72 20 63 6f 75 6e 74 2d 6c 69 73 74 29 29 0a 09  r count-list))..
3d10: 20 20 20 28 67 72 6f 75 70 2d 63 6f 75 6e 74 20     (group-count 
3d20: 28 2d 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72  (- (%test-runner
3d30: 2d 74 6f 74 61 6c 2d 63 6f 75 6e 74 20 72 29 20  -total-count r) 
3d40: 73 61 76 65 64 2d 63 6f 75 6e 74 29 29 29 0a 20  saved-count))). 
3d50: 20 20 20 20 20 28 69 66 20 28 61 6e 64 20 65 78       (if (and ex
3d60: 70 65 63 74 65 64 2d 63 6f 75 6e 74 0a 09 20 20  pected-count..  
3d70: 20 20 20 20 20 28 6e 6f 74 20 28 3d 20 65 78 70       (not (= exp
3d80: 65 63 74 65 64 2d 63 6f 75 6e 74 20 67 72 6f 75  ected-count grou
3d90: 70 2d 63 6f 75 6e 74 29 29 29 0a 09 20 20 28 28  p-count)))..  ((
3da0: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f 6e 2d 62  test-runner-on-b
3db0: 61 64 2d 63 6f 75 6e 74 20 72 29 20 72 20 67 72  ad-count r) r gr
3dc0: 6f 75 70 2d 63 6f 75 6e 74 20 65 78 70 65 63 74  oup-count expect
3dd0: 65 64 2d 63 6f 75 6e 74 29 29 0a 20 20 20 20 20  ed-count)).     
3de0: 20 28 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 6f   ((test-runner-o
3df0: 6e 2d 67 72 6f 75 70 2d 65 6e 64 20 72 29 20 72  n-group-end r) r
3e00: 29 0a 20 20 20 20 20 20 28 74 65 73 74 2d 72 75  ).      (test-ru
3e10: 6e 6e 65 72 2d 67 72 6f 75 70 2d 73 74 61 63 6b  nner-group-stack
3e20: 21 20 72 20 28 63 64 72 20 28 74 65 73 74 2d 72  ! r (cdr (test-r
3e30: 75 6e 6e 65 72 2d 67 72 6f 75 70 2d 73 74 61 63  unner-group-stac
3e40: 6b 20 72 29 29 29 0a 20 20 20 20 20 20 28 25 74  k r))).      (%t
3e50: 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d  est-runner-skip-
3e60: 6c 69 73 74 21 20 72 20 28 63 61 72 20 28 25 74  list! r (car (%t
3e70: 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d  est-runner-skip-
3e80: 73 61 76 65 20 72 29 29 29 0a 20 20 20 20 20 20  save r))).      
3e90: 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b  (%test-runner-sk
3ea0: 69 70 2d 73 61 76 65 21 20 72 20 28 63 64 72 20  ip-save! r (cdr 
3eb0: 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b  (%test-runner-sk
3ec0: 69 70 2d 73 61 76 65 20 72 29 29 29 0a 20 20 20  ip-save r))).   
3ed0: 20 20 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72     (%test-runner
3ee0: 2d 66 61 69 6c 2d 6c 69 73 74 21 20 72 20 28 63  -fail-list! r (c
3ef0: 61 72 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72  ar (%test-runner
3f00: 2d 66 61 69 6c 2d 73 61 76 65 20 72 29 29 29 0a  -fail-save r))).
3f10: 20 20 20 20 20 20 28 25 74 65 73 74 2d 72 75 6e        (%test-run
3f20: 6e 65 72 2d 66 61 69 6c 2d 73 61 76 65 21 20 72  ner-fail-save! r
3f30: 20 28 63 64 72 20 28 25 74 65 73 74 2d 72 75 6e   (cdr (%test-run
3f40: 6e 65 72 2d 66 61 69 6c 2d 73 61 76 65 20 72 29  ner-fail-save r)
3f50: 29 29 0a 20 20 20 20 20 20 28 25 74 65 73 74 2d  )).      (%test-
3f60: 72 75 6e 6e 65 72 2d 63 6f 75 6e 74 2d 6c 69 73  runner-count-lis
3f70: 74 21 20 72 20 28 63 64 72 20 63 6f 75 6e 74 2d  t! r (cdr count-
3f80: 6c 69 73 74 29 29 0a 20 20 20 20 20 20 28 69 66  list)).      (if
3f90: 20 28 6e 75 6c 6c 3f 20 28 74 65 73 74 2d 72 75   (null? (test-ru
3fa0: 6e 6e 65 72 2d 67 72 6f 75 70 2d 73 74 61 63 6b  nner-group-stack
3fb0: 20 72 29 29 0a 09 20 20 28 28 74 65 73 74 2d 72   r))..  ((test-r
3fc0: 75 6e 6e 65 72 2d 6f 6e 2d 66 69 6e 61 6c 20 72  unner-on-final r
3fd0: 29 20 72 29 29 29 29 29 0a 0a 28 64 65 66 69 6e  ) r)))))..(defin
3fe0: 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d 67 72  e-syntax test-gr
3ff0: 6f 75 70 0a 20 20 28 73 79 6e 74 61 78 2d 72 75  oup.  (syntax-ru
4000: 6c 65 73 20 28 29 0a 20 20 20 20 28 28 74 65 73  les ().    ((tes
4010: 74 2d 67 72 6f 75 70 20 73 75 69 74 65 2d 6e 61  t-group suite-na
4020: 6d 65 20 2e 20 62 6f 64 79 29 0a 20 20 20 20 20  me . body).     
4030: 28 6c 65 74 20 28 28 72 20 28 74 65 73 74 2d 72  (let ((r (test-r
4040: 75 6e 6e 65 72 2d 63 75 72 72 65 6e 74 29 29 29  unner-current)))
4050: 0a 20 20 20 20 20 20 20 3b 3b 20 49 64 65 61 6c  .       ;; Ideal
4060: 6c 79 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 73  ly should also s
4070: 65 74 20 6c 69 6e 65 2d 6e 75 6d 62 65 72 2c 20  et line-number, 
4080: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  if available..  
4090: 20 20 20 20 20 28 74 65 73 74 2d 72 65 73 75 6c       (test-resul
40a0: 74 2d 61 6c 69 73 74 21 20 72 20 28 6c 69 73 74  t-alist! r (list
40b0: 20 28 63 6f 6e 73 20 27 74 65 73 74 2d 6e 61 6d   (cons 'test-nam
40c0: 65 20 73 75 69 74 65 2d 6e 61 6d 65 29 29 29 0a  e suite-name))).
40d0: 20 20 20 20 20 20 20 28 69 66 20 28 25 74 65 73         (if (%tes
40e0: 74 2d 73 68 6f 75 6c 64 2d 65 78 65 63 75 74 65  t-should-execute
40f0: 20 72 29 0a 09 20 20 20 28 64 79 6e 61 6d 69 63   r)..   (dynamic
4100: 2d 77 69 6e 64 0a 09 20 20 20 20 20 20 20 28 6c  -wind..       (l
4110: 61 6d 62 64 61 20 28 29 20 28 74 65 73 74 2d 62  ambda () (test-b
4120: 65 67 69 6e 20 73 75 69 74 65 2d 6e 61 6d 65 29  egin suite-name)
4130: 29 0a 09 20 20 20 20 20 20 20 28 6c 61 6d 62 64  )..       (lambd
4140: 61 20 28 29 20 2e 20 62 6f 64 79 29 0a 09 20 20  a () . body)..  
4150: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 29 20       (lambda () 
4160: 28 74 65 73 74 2d 65 6e 64 20 20 73 75 69 74 65  (test-end  suite
4170: 2d 6e 61 6d 65 29 29 29 29 29 29 29 29 0a 0a 28  -name))))))))..(
4180: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 74 65  define-syntax te
4190: 73 74 2d 67 72 6f 75 70 2d 77 69 74 68 2d 63 6c  st-group-with-cl
41a0: 65 61 6e 75 70 0a 20 20 28 73 79 6e 74 61 78 2d  eanup.  (syntax-
41b0: 72 75 6c 65 73 20 28 29 0a 20 20 20 20 28 28 74  rules ().    ((t
41c0: 65 73 74 2d 67 72 6f 75 70 2d 77 69 74 68 2d 63  est-group-with-c
41d0: 6c 65 61 6e 75 70 20 73 75 69 74 65 2d 6e 61 6d  leanup suite-nam
41e0: 65 20 66 6f 72 6d 20 63 6c 65 61 6e 75 70 2d 66  e form cleanup-f
41f0: 6f 72 6d 29 0a 20 20 20 20 20 28 74 65 73 74 2d  orm).     (test-
4200: 67 72 6f 75 70 20 73 75 69 74 65 2d 6e 61 6d 65  group suite-name
4210: 0a 09 09 20 20 20 20 28 64 79 6e 61 6d 69 63 2d  ...    (dynamic-
4220: 77 69 6e 64 0a 09 09 09 28 6c 61 6d 62 64 61 20  wind....(lambda 
4230: 28 29 20 23 66 29 0a 09 09 09 28 6c 61 6d 62 64  () #f)....(lambd
4240: 61 20 28 29 20 66 6f 72 6d 29 0a 09 09 09 28 6c  a () form)....(l
4250: 61 6d 62 64 61 20 28 29 20 63 6c 65 61 6e 75 70  ambda () cleanup
4260: 2d 66 6f 72 6d 29 29 29 29 0a 20 20 20 20 28 28  -form)))).    ((
4270: 74 65 73 74 2d 67 72 6f 75 70 2d 77 69 74 68 2d  test-group-with-
4280: 63 6c 65 61 6e 75 70 20 73 75 69 74 65 2d 6e 61  cleanup suite-na
4290: 6d 65 20 63 6c 65 61 6e 75 70 2d 66 6f 72 6d 29  me cleanup-form)
42a0: 0a 20 20 20 20 20 28 74 65 73 74 2d 67 72 6f 75  .     (test-grou
42b0: 70 2d 77 69 74 68 2d 63 6c 65 61 6e 75 70 20 73  p-with-cleanup s
42c0: 75 69 74 65 2d 6e 61 6d 65 20 23 66 20 63 6c 65  uite-name #f cle
42d0: 61 6e 75 70 2d 66 6f 72 6d 29 29 0a 20 20 20 20  anup-form)).    
42e0: 28 28 74 65 73 74 2d 67 72 6f 75 70 2d 77 69 74  ((test-group-wit
42f0: 68 2d 63 6c 65 61 6e 75 70 20 73 75 69 74 65 2d  h-cleanup suite-
4300: 6e 61 6d 65 20 66 6f 72 6d 31 20 66 6f 72 6d 32  name form1 form2
4310: 20 66 6f 72 6d 33 20 2e 20 72 65 73 74 29 0a 20   form3 . rest). 
4320: 20 20 20 20 28 74 65 73 74 2d 67 72 6f 75 70 2d      (test-group-
4330: 77 69 74 68 2d 63 6c 65 61 6e 75 70 20 73 75 69  with-cleanup sui
4340: 74 65 2d 6e 61 6d 65 20 28 62 65 67 69 6e 20 66  te-name (begin f
4350: 6f 72 6d 31 20 66 6f 72 6d 32 29 20 66 6f 72 6d  orm1 form2) form
4360: 33 20 2e 20 72 65 73 74 29 29 29 29 0a 0a 28 64  3 . rest))))..(d
4370: 65 66 69 6e 65 20 28 74 65 73 74 2d 6f 6e 2d 74  efine (test-on-t
4380: 65 73 74 2d 62 65 67 69 6e 2d 73 69 6d 70 6c 65  est-begin-simple
4390: 20 72 75 6e 6e 65 72 29 0a 20 28 6c 65 74 20 28   runner). (let (
43a0: 28 6c 6f 67 20 28 74 65 73 74 2d 72 75 6e 6e 65  (log (test-runne
43b0: 72 2d 61 75 78 2d 76 61 6c 75 65 20 72 75 6e 6e  r-aux-value runn
43c0: 65 72 29 29 29 0a 20 20 20 20 28 69 66 20 28 6f  er))).    (if (o
43d0: 75 74 70 75 74 2d 70 6f 72 74 3f 20 6c 6f 67 29  utput-port? log)
43e0: 0a 09 28 6c 65 74 2a 20 28 28 72 65 73 75 6c 74  ..(let* ((result
43f0: 73 20 28 74 65 73 74 2d 72 65 73 75 6c 74 2d 61  s (test-result-a
4400: 6c 69 73 74 20 72 75 6e 6e 65 72 29 29 0a 09 20  list runner)).. 
4410: 20 20 20 20 20 20 28 73 6f 75 72 63 65 2d 66 69        (source-fi
4420: 6c 65 20 28 61 73 73 71 20 27 73 6f 75 72 63 65  le (assq 'source
4430: 2d 66 69 6c 65 20 72 65 73 75 6c 74 73 29 29 0a  -file results)).
4440: 09 20 20 20 20 20 20 20 28 73 6f 75 72 63 65 2d  .       (source-
4450: 6c 69 6e 65 20 28 61 73 73 71 20 27 73 6f 75 72  line (assq 'sour
4460: 63 65 2d 6c 69 6e 65 20 72 65 73 75 6c 74 73 29  ce-line results)
4470: 29 0a 09 20 20 20 20 20 20 20 28 73 6f 75 72 63  )..       (sourc
4480: 65 2d 66 6f 72 6d 20 28 61 73 73 71 20 27 73 6f  e-form (assq 'so
4490: 75 72 63 65 2d 66 6f 72 6d 20 72 65 73 75 6c 74  urce-form result
44a0: 73 29 29 0a 09 20 20 20 20 20 20 20 28 74 65 73  s))..       (tes
44b0: 74 2d 6e 61 6d 65 20 28 61 73 73 71 20 27 74 65  t-name (assq 'te
44c0: 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 73 29  st-name results)
44d0: 29 29 0a 09 20 20 28 64 69 73 70 6c 61 79 20 22  ))..  (display "
44e0: 54 65 73 74 20 62 65 67 69 6e 3a 22 20 6c 6f 67  Test begin:" log
44f0: 29 0a 09 20 20 28 6e 65 77 6c 69 6e 65 20 6c 6f  )..  (newline lo
4500: 67 29 0a 09 20 20 28 69 66 20 74 65 73 74 2d 6e  g)..  (if test-n
4510: 61 6d 65 20 28 25 74 65 73 74 2d 77 72 69 74 65  ame (%test-write
4520: 2d 72 65 73 75 6c 74 31 20 74 65 73 74 2d 6e 61  -result1 test-na
4530: 6d 65 20 6c 6f 67 29 29 0a 09 20 20 28 69 66 20  me log))..  (if 
4540: 73 6f 75 72 63 65 2d 66 69 6c 65 20 28 25 74 65  source-file (%te
4550: 73 74 2d 77 72 69 74 65 2d 72 65 73 75 6c 74 31  st-write-result1
4560: 20 73 6f 75 72 63 65 2d 66 69 6c 65 20 6c 6f 67   source-file log
4570: 29 29 0a 09 20 20 28 69 66 20 73 6f 75 72 63 65  ))..  (if source
4580: 2d 6c 69 6e 65 20 28 25 74 65 73 74 2d 77 72 69  -line (%test-wri
4590: 74 65 2d 72 65 73 75 6c 74 31 20 73 6f 75 72 63  te-result1 sourc
45a0: 65 2d 6c 69 6e 65 20 6c 6f 67 29 29 0a 09 20 20  e-line log))..  
45b0: 28 69 66 20 73 6f 75 72 63 65 2d 66 6f 72 6d 20  (if source-form 
45c0: 28 25 74 65 73 74 2d 77 72 69 74 65 2d 72 65 73  (%test-write-res
45d0: 75 6c 74 31 20 73 6f 75 72 63 65 2d 66 6f 72 6d  ult1 source-form
45e0: 20 6c 6f 67 29 29 29 29 29 29 0a 0a 28 64 65 66   log))))))..(def
45f0: 69 6e 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d  ine-syntax test-
4600: 72 65 73 75 6c 74 2d 72 65 66 0a 20 20 28 73 79  result-ref.  (sy
4610: 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20  ntax-rules ().  
4620: 20 20 28 28 74 65 73 74 2d 72 65 73 75 6c 74 2d    ((test-result-
4630: 72 65 66 20 72 75 6e 6e 65 72 20 70 6e 61 6d 65  ref runner pname
4640: 29 0a 20 20 20 20 20 28 74 65 73 74 2d 72 65 73  ).     (test-res
4650: 75 6c 74 2d 72 65 66 20 72 75 6e 6e 65 72 20 70  ult-ref runner p
4660: 6e 61 6d 65 20 23 66 29 29 0a 20 20 20 20 28 28  name #f)).    ((
4670: 74 65 73 74 2d 72 65 73 75 6c 74 2d 72 65 66 20  test-result-ref 
4680: 72 75 6e 6e 65 72 20 70 6e 61 6d 65 20 64 65 66  runner pname def
4690: 61 75 6c 74 29 0a 20 20 20 20 20 28 6c 65 74 20  ault).     (let 
46a0: 28 28 70 20 28 61 73 73 71 20 70 6e 61 6d 65 20  ((p (assq pname 
46b0: 28 74 65 73 74 2d 72 65 73 75 6c 74 2d 61 6c 69  (test-result-ali
46c0: 73 74 20 72 75 6e 6e 65 72 29 29 29 29 0a 20 20  st runner)))).  
46d0: 20 20 20 20 20 28 69 66 20 70 20 28 63 64 72 20       (if p (cdr 
46e0: 70 29 20 64 65 66 61 75 6c 74 29 29 29 29 29 0a  p) default))))).
46f0: 0a 28 64 65 66 69 6e 65 20 28 74 65 73 74 2d 6f  .(define (test-o
4700: 6e 2d 74 65 73 74 2d 65 6e 64 2d 73 69 6d 70 6c  n-test-end-simpl
4710: 65 20 72 75 6e 6e 65 72 29 0a 20 20 28 6c 65 74  e runner).  (let
4720: 20 28 28 6c 6f 67 20 28 74 65 73 74 2d 72 75 6e   ((log (test-run
4730: 6e 65 72 2d 61 75 78 2d 76 61 6c 75 65 20 72 75  ner-aux-value ru
4740: 6e 6e 65 72 29 29 0a 09 28 6b 69 6e 64 20 28 74  nner))..(kind (t
4750: 65 73 74 2d 72 65 73 75 6c 74 2d 72 65 66 20 72  est-result-ref r
4760: 75 6e 6e 65 72 20 27 72 65 73 75 6c 74 2d 6b 69  unner 'result-ki
4770: 6e 64 29 29 29 0a 20 20 20 20 28 69 66 20 28 6d  nd))).    (if (m
4780: 65 6d 71 20 6b 69 6e 64 20 27 28 66 61 69 6c 20  emq kind '(fail 
4790: 78 70 61 73 73 29 29 0a 09 28 6c 65 74 2a 20 28  xpass))..(let* (
47a0: 28 72 65 73 75 6c 74 73 20 28 74 65 73 74 2d 72  (results (test-r
47b0: 65 73 75 6c 74 2d 61 6c 69 73 74 20 72 75 6e 6e  esult-alist runn
47c0: 65 72 29 29 0a 09 20 20 20 20 20 20 20 28 73 6f  er))..       (so
47d0: 75 72 63 65 2d 66 69 6c 65 20 28 61 73 73 71 20  urce-file (assq 
47e0: 27 73 6f 75 72 63 65 2d 66 69 6c 65 20 72 65 73  'source-file res
47f0: 75 6c 74 73 29 29 0a 09 20 20 20 20 20 20 20 28  ults))..       (
4800: 73 6f 75 72 63 65 2d 6c 69 6e 65 20 28 61 73 73  source-line (ass
4810: 71 20 27 73 6f 75 72 63 65 2d 6c 69 6e 65 20 72  q 'source-line r
4820: 65 73 75 6c 74 73 29 29 0a 09 20 20 20 20 20 20  esults))..      
4830: 20 28 74 65 73 74 2d 6e 61 6d 65 20 28 61 73 73   (test-name (ass
4840: 71 20 27 74 65 73 74 2d 6e 61 6d 65 20 72 65 73  q 'test-name res
4850: 75 6c 74 73 29 29 29 0a 09 20 20 28 69 66 20 28  ults)))..  (if (
4860: 6f 72 20 73 6f 75 72 63 65 2d 66 69 6c 65 20 73  or source-file s
4870: 6f 75 72 63 65 2d 6c 69 6e 65 29 0a 09 20 20 20  ource-line)..   
4880: 20 20 20 28 62 65 67 69 6e 0a 09 09 28 69 66 20     (begin...(if 
4890: 73 6f 75 72 63 65 2d 66 69 6c 65 20 28 64 69 73  source-file (dis
48a0: 70 6c 61 79 20 28 63 64 72 20 73 6f 75 72 63 65  play (cdr source
48b0: 2d 66 69 6c 65 29 29 29 0a 09 09 28 64 69 73 70  -file)))...(disp
48c0: 6c 61 79 20 22 3a 22 29 0a 09 09 28 69 66 20 73  lay ":")...(if s
48d0: 6f 75 72 63 65 2d 6c 69 6e 65 20 28 64 69 73 70  ource-line (disp
48e0: 6c 61 79 20 28 63 64 72 20 73 6f 75 72 63 65 2d  lay (cdr source-
48f0: 6c 69 6e 65 29 29 29 0a 09 09 28 64 69 73 70 6c  line)))...(displ
4900: 61 79 20 22 3a 20 22 29 29 29 0a 09 20 20 28 64  ay ": ")))..  (d
4910: 69 73 70 6c 61 79 20 28 69 66 20 28 65 71 3f 20  isplay (if (eq? 
4920: 6b 69 6e 64 20 27 78 70 61 73 73 29 20 22 58 50  kind 'xpass) "XP
4930: 41 53 53 22 20 22 46 41 49 4c 22 29 29 0a 09 20  ASS" "FAIL")).. 
4940: 20 28 69 66 20 74 65 73 74 2d 6e 61 6d 65 0a 09   (if test-name..
4950: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28        (begin...(
4960: 64 69 73 70 6c 61 79 20 22 20 22 29 0a 09 09 28  display " ")...(
4970: 64 69 73 70 6c 61 79 20 28 63 64 72 20 74 65 73  display (cdr tes
4980: 74 2d 6e 61 6d 65 29 29 29 29 0a 09 20 20 28 6e  t-name))))..  (n
4990: 65 77 6c 69 6e 65 29 29 29 0a 20 20 20 20 28 69  ewline))).    (i
49a0: 66 20 28 6f 75 74 70 75 74 2d 70 6f 72 74 3f 20  f (output-port? 
49b0: 6c 6f 67 29 0a 09 28 62 65 67 69 6e 0a 09 20 20  log)..(begin..  
49c0: 28 64 69 73 70 6c 61 79 20 22 54 65 73 74 20 65  (display "Test e
49d0: 6e 64 3a 22 20 6c 6f 67 29 0a 09 20 20 28 6e 65  nd:" log)..  (ne
49e0: 77 6c 69 6e 65 20 6c 6f 67 29 0a 09 20 20 28 6c  wline log)..  (l
49f0: 65 74 20 6c 6f 6f 70 20 28 28 6c 69 73 74 20 28  et loop ((list (
4a00: 74 65 73 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73  test-result-alis
4a10: 74 20 72 75 6e 6e 65 72 29 29 29 0a 09 20 20 20  t runner)))..   
4a20: 20 28 69 66 20 28 70 61 69 72 3f 20 6c 69 73 74   (if (pair? list
4a30: 29 0a 09 09 28 6c 65 74 20 28 28 70 61 69 72 20  )...(let ((pair 
4a40: 28 63 61 72 20 6c 69 73 74 29 29 29 0a 09 09 20  (car list)))... 
4a50: 20 3b 3b 20 57 72 69 74 65 20 6f 75 74 20 70 72   ;; Write out pr
4a60: 6f 70 65 72 74 69 65 73 20 6e 6f 74 20 77 72 69  operties not wri
4a70: 74 74 65 6e 20 6f 75 74 20 62 79 20 6f 6e 2d 74  tten out by on-t
4a80: 65 73 74 2d 62 65 67 69 6e 2e 0a 09 09 20 20 28  est-begin....  (
4a90: 69 66 20 28 6e 6f 74 20 28 6d 65 6d 71 20 28 63  if (not (memq (c
4aa0: 61 72 20 70 61 69 72 29 0a 09 09 09 09 20 27 28  ar pair)..... '(
4ab0: 74 65 73 74 2d 6e 61 6d 65 20 73 6f 75 72 63 65  test-name source
4ac0: 2d 66 69 6c 65 20 73 6f 75 72 63 65 2d 6c 69 6e  -file source-lin
4ad0: 65 20 73 6f 75 72 63 65 2d 66 6f 72 6d 29 29 29  e source-form)))
4ae0: 0a 09 09 20 20 20 20 20 20 28 25 74 65 73 74 2d  ...      (%test-
4af0: 77 72 69 74 65 2d 72 65 73 75 6c 74 31 20 70 61  write-result1 pa
4b00: 69 72 20 6c 6f 67 29 29 0a 09 09 20 20 28 6c 6f  ir log))...  (lo
4b10: 6f 70 20 28 63 64 72 20 6c 69 73 74 29 29 29 29  op (cdr list))))
4b20: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  )))))..(define (
4b30: 25 74 65 73 74 2d 77 72 69 74 65 2d 72 65 73 75  %test-write-resu
4b40: 6c 74 31 20 70 61 69 72 20 70 6f 72 74 29 0a 20  lt1 pair port). 
4b50: 20 28 64 69 73 70 6c 61 79 20 22 20 20 22 20 70   (display "  " p
4b60: 6f 72 74 29 0a 20 20 28 64 69 73 70 6c 61 79 20  ort).  (display 
4b70: 28 63 61 72 20 70 61 69 72 29 20 70 6f 72 74 29  (car pair) port)
4b80: 0a 20 20 28 64 69 73 70 6c 61 79 20 22 3a 20 22  .  (display ": "
4b90: 20 70 6f 72 74 29 0a 20 20 28 77 72 69 74 65 20   port).  (write 
4ba0: 28 63 64 72 20 70 61 69 72 29 20 70 6f 72 74 29  (cdr pair) port)
4bb0: 0a 20 20 28 6e 65 77 6c 69 6e 65 20 70 6f 72 74  .  (newline port
4bc0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73  ))..(define (tes
4bd0: 74 2d 72 65 73 75 6c 74 2d 73 65 74 21 20 72 75  t-result-set! ru
4be0: 6e 6e 65 72 20 70 6e 61 6d 65 20 76 61 6c 75 65  nner pname value
4bf0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 61 6c 69 73  ).  (let* ((alis
4c00: 74 20 28 74 65 73 74 2d 72 65 73 75 6c 74 2d 61  t (test-result-a
4c10: 6c 69 73 74 20 72 75 6e 6e 65 72 29 29 0a 09 20  list runner)).. 
4c20: 28 70 20 28 61 73 73 71 20 70 6e 61 6d 65 20 61  (p (assq pname a
4c30: 6c 69 73 74 29 29 29 0a 20 20 20 20 28 69 66 20  list))).    (if 
4c40: 70 0a 09 28 73 65 74 2d 63 64 72 21 20 70 20 76  p..(set-cdr! p v
4c50: 61 6c 75 65 29 0a 09 28 74 65 73 74 2d 72 65 73  alue)..(test-res
4c60: 75 6c 74 2d 61 6c 69 73 74 21 20 72 75 6e 6e 65  ult-alist! runne
4c70: 72 20 28 63 6f 6e 73 20 28 63 6f 6e 73 20 70 6e  r (cons (cons pn
4c80: 61 6d 65 20 76 61 6c 75 65 29 20 61 6c 69 73 74  ame value) alist
4c90: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  )))))..(define (
4ca0: 74 65 73 74 2d 72 65 73 75 6c 74 2d 63 6c 65 61  test-result-clea
4cb0: 72 20 72 75 6e 6e 65 72 29 0a 20 20 28 74 65 73  r runner).  (tes
4cc0: 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 20  t-result-alist! 
4cd0: 72 75 6e 6e 65 72 20 27 28 29 29 29 0a 0a 28 64  runner '()))..(d
4ce0: 65 66 69 6e 65 20 28 74 65 73 74 2d 72 65 73 75  efine (test-resu
4cf0: 6c 74 2d 72 65 6d 6f 76 65 20 72 75 6e 6e 65 72  lt-remove runner
4d00: 20 70 6e 61 6d 65 29 0a 20 20 28 6c 65 74 2a 20   pname).  (let* 
4d10: 28 28 61 6c 69 73 74 20 28 74 65 73 74 2d 72 65  ((alist (test-re
4d20: 73 75 6c 74 2d 61 6c 69 73 74 20 72 75 6e 6e 65  sult-alist runne
4d30: 72 29 29 0a 09 20 28 70 20 28 61 73 73 71 20 70  r)).. (p (assq p
4d40: 6e 61 6d 65 20 61 6c 69 73 74 29 29 29 0a 20 20  name alist))).  
4d50: 20 20 28 69 66 20 70 0a 09 28 74 65 73 74 2d 72    (if p..(test-r
4d60: 65 73 75 6c 74 2d 61 6c 69 73 74 21 20 72 75 6e  esult-alist! run
4d70: 6e 65 72 0a 09 09 09 09 20 20 20 28 6c 65 74 20  ner.....   (let 
4d80: 6c 6f 6f 70 20 28 28 72 20 61 6c 69 73 74 29 29  loop ((r alist))
4d90: 0a 09 09 09 09 20 20 20 20 20 28 69 66 20 28 65  .....     (if (e
4da0: 71 3f 20 72 20 70 29 20 28 63 64 72 20 72 29 0a  q? r p) (cdr r).
4db0: 09 09 09 09 09 20 28 63 6f 6e 73 20 28 63 61 72  ..... (cons (car
4dc0: 20 72 29 20 28 6c 6f 6f 70 20 28 63 64 72 20 72   r) (loop (cdr r
4dd0: 29 29 29 29 29 29 29 29 29 0a 0a 28 64 65 66 69  )))))))))..(defi
4de0: 6e 65 20 28 74 65 73 74 2d 72 65 73 75 6c 74 2d  ne (test-result-
4df0: 6b 69 6e 64 20 2e 20 72 65 73 74 29 0a 20 20 28  kind . rest).  (
4e00: 6c 65 74 20 28 28 72 75 6e 6e 65 72 20 28 69 66  let ((runner (if
4e10: 20 28 70 61 69 72 3f 20 72 65 73 74 29 20 28 63   (pair? rest) (c
4e20: 61 72 20 72 65 73 74 29 20 28 74 65 73 74 2d 72  ar rest) (test-r
4e30: 75 6e 6e 65 72 2d 63 75 72 72 65 6e 74 29 29 29  unner-current)))
4e40: 29 0a 20 20 20 20 28 74 65 73 74 2d 72 65 73 75  ).    (test-resu
4e50: 6c 74 2d 72 65 66 20 72 75 6e 6e 65 72 20 27 72  lt-ref runner 'r
4e60: 65 73 75 6c 74 2d 6b 69 6e 64 29 29 29 0a 0a 28  esult-kind)))..(
4e70: 64 65 66 69 6e 65 20 28 74 65 73 74 2d 70 61 73  define (test-pas
4e80: 73 65 64 3f 20 2e 20 72 65 73 74 29 0a 20 20 28  sed? . rest).  (
4e90: 6c 65 74 20 28 28 72 75 6e 6e 65 72 20 28 69 66  let ((runner (if
4ea0: 20 28 70 61 69 72 3f 20 72 65 73 74 29 20 28 63   (pair? rest) (c
4eb0: 61 72 20 72 65 73 74 29 20 28 74 65 73 74 2d 72  ar rest) (test-r
4ec0: 75 6e 6e 65 72 2d 67 65 74 29 29 29 29 0a 20 20  unner-get)))).  
4ed0: 20 20 28 6d 65 6d 71 20 28 74 65 73 74 2d 72 65    (memq (test-re
4ee0: 73 75 6c 74 2d 72 65 66 20 72 75 6e 6e 65 72 20  sult-ref runner 
4ef0: 27 72 65 73 75 6c 74 2d 6b 69 6e 64 29 20 27 28  'result-kind) '(
4f00: 70 61 73 73 20 78 70 61 73 73 29 29 29 29 0a 0a  pass xpass))))..
4f10: 28 64 65 66 69 6e 65 20 28 25 74 65 73 74 2d 72  (define (%test-r
4f20: 65 70 6f 72 74 2d 72 65 73 75 6c 74 29 0a 20 20  eport-result).  
4f30: 28 6c 65 74 2a 20 28 28 72 20 28 74 65 73 74 2d  (let* ((r (test-
4f40: 72 75 6e 6e 65 72 2d 67 65 74 29 29 0a 09 20 28  runner-get)).. (
4f50: 72 65 73 75 6c 74 2d 6b 69 6e 64 20 28 74 65 73  result-kind (tes
4f60: 74 2d 72 65 73 75 6c 74 2d 6b 69 6e 64 20 72 29  t-result-kind r)
4f70: 29 29 0a 20 20 20 20 28 63 61 73 65 20 72 65 73  )).    (case res
4f80: 75 6c 74 2d 6b 69 6e 64 0a 20 20 20 20 20 20 28  ult-kind.      (
4f90: 28 70 61 73 73 29 0a 20 20 20 20 20 20 20 28 74  (pass).       (t
4fa0: 65 73 74 2d 72 75 6e 6e 65 72 2d 70 61 73 73 2d  est-runner-pass-
4fb0: 63 6f 75 6e 74 21 20 72 20 28 2b 20 31 20 28 74  count! r (+ 1 (t
4fc0: 65 73 74 2d 72 75 6e 6e 65 72 2d 70 61 73 73 2d  est-runner-pass-
4fd0: 63 6f 75 6e 74 20 72 29 29 29 29 0a 20 20 20 20  count r)))).    
4fe0: 20 20 28 28 66 61 69 6c 29 0a 20 20 20 20 20 20    ((fail).      
4ff0: 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 66 61   (test-runner-fa
5000: 69 6c 2d 63 6f 75 6e 74 21 09 72 20 28 2b 20 31  il-count!.r (+ 1
5010: 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 66 61   (test-runner-fa
5020: 69 6c 2d 63 6f 75 6e 74 20 72 29 29 29 29 0a 20  il-count r)))). 
5030: 20 20 20 20 20 28 28 78 70 61 73 73 29 0a 20 20       ((xpass).  
5040: 20 20 20 20 20 28 74 65 73 74 2d 72 75 6e 6e 65       (test-runne
5050: 72 2d 78 70 61 73 73 2d 63 6f 75 6e 74 21 20 72  r-xpass-count! r
5060: 20 28 2b 20 31 20 28 74 65 73 74 2d 72 75 6e 6e   (+ 1 (test-runn
5070: 65 72 2d 78 70 61 73 73 2d 63 6f 75 6e 74 20 72  er-xpass-count r
5080: 29 29 29 29 0a 20 20 20 20 20 20 28 28 78 66 61  )))).      ((xfa
5090: 69 6c 29 0a 20 20 20 20 20 20 20 28 74 65 73 74  il).       (test
50a0: 2d 72 75 6e 6e 65 72 2d 78 66 61 69 6c 2d 63 6f  -runner-xfail-co
50b0: 75 6e 74 21 20 72 20 28 2b 20 31 20 28 74 65 73  unt! r (+ 1 (tes
50c0: 74 2d 72 75 6e 6e 65 72 2d 78 66 61 69 6c 2d 63  t-runner-xfail-c
50d0: 6f 75 6e 74 20 72 29 29 29 29 0a 20 20 20 20 20  ount r)))).     
50e0: 20 28 65 6c 73 65 0a 20 20 20 20 20 20 20 28 74   (else.       (t
50f0: 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d  est-runner-skip-
5100: 63 6f 75 6e 74 21 20 72 20 28 2b 20 31 20 28 74  count! r (+ 1 (t
5110: 65 73 74 2d 72 75 6e 6e 65 72 2d 73 6b 69 70 2d  est-runner-skip-
5120: 63 6f 75 6e 74 20 72 29 29 29 29 29 0a 20 20 20  count r))))).   
5130: 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 74   (%test-runner-t
5140: 6f 74 61 6c 2d 63 6f 75 6e 74 21 20 72 20 28 2b  otal-count! r (+
5150: 20 31 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72   1 (%test-runner
5160: 2d 74 6f 74 61 6c 2d 63 6f 75 6e 74 20 72 29 29  -total-count r))
5170: 29 0a 20 20 20 20 28 28 74 65 73 74 2d 72 75 6e  ).    ((test-run
5180: 6e 65 72 2d 6f 6e 2d 74 65 73 74 2d 65 6e 64 20  ner-on-test-end 
5190: 72 29 20 72 29 29 29 0a 0a 28 63 6f 6e 64 2d 65  r) r)))..(cond-e
51a0: 78 70 61 6e 64 0a 20 28 72 36 72 73 0a 20 20 28  xpand. (r6rs.  (
51b0: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 25 74  define-syntax %t
51c0: 65 73 74 2d 65 76 61 6c 75 61 74 65 2d 77 69 74  est-evaluate-wit
51d0: 68 2d 63 61 74 63 68 0a 20 20 20 20 28 73 79 6e  h-catch.    (syn
51e0: 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20  tax-rules ().   
51f0: 20 20 20 28 28 25 74 65 73 74 2d 65 76 61 6c 75     ((%test-evalu
5200: 61 74 65 2d 77 69 74 68 2d 63 61 74 63 68 20 74  ate-with-catch t
5210: 65 73 74 2d 65 78 70 72 65 73 73 69 6f 6e 29 0a  est-expression).
5220: 20 20 20 20 20 20 20 28 67 75 61 72 64 20 28 65         (guard (e
5230: 78 20 28 65 6c 73 65 20 23 46 29 29 20 74 65 73  x (else #F)) tes
5240: 74 2d 65 78 70 72 65 73 73 69 6f 6e 29 29 29 29  t-expression))))
5250: 29 0a 20 28 67 75 69 6c 65 0a 20 20 28 64 65 66  ). (guile.  (def
5260: 69 6e 65 2d 73 79 6e 74 61 78 20 25 74 65 73 74  ine-syntax %test
5270: 2d 65 76 61 6c 75 61 74 65 2d 77 69 74 68 2d 63  -evaluate-with-c
5280: 61 74 63 68 0a 20 20 20 20 28 73 79 6e 74 61 78  atch.    (syntax
5290: 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20  -rules ().      
52a0: 28 28 25 74 65 73 74 2d 65 76 61 6c 75 61 74 65  ((%test-evaluate
52b0: 2d 77 69 74 68 2d 63 61 74 63 68 20 74 65 73 74  -with-catch test
52c0: 2d 65 78 70 72 65 73 73 69 6f 6e 29 0a 20 20 20  -expression).   
52d0: 20 20 20 20 28 63 61 74 63 68 20 23 74 20 28 6c      (catch #t (l
52e0: 61 6d 62 64 61 20 28 29 20 74 65 73 74 2d 65 78  ambda () test-ex
52f0: 70 72 65 73 73 69 6f 6e 29 20 28 6c 61 6d 62 64  pression) (lambd
5300: 61 20 28 6b 65 79 20 2e 20 61 72 67 73 29 20 23  a (key . args) #
5310: 66 29 29 29 29 29 29 0a 20 28 6b 61 77 61 0a 20  f)))))). (kawa. 
5320: 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20   (define-syntax 
5330: 25 74 65 73 74 2d 65 76 61 6c 75 61 74 65 2d 77  %test-evaluate-w
5340: 69 74 68 2d 63 61 74 63 68 0a 20 20 20 20 28 73  ith-catch.    (s
5350: 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20  yntax-rules (). 
5360: 20 20 20 20 20 28 28 25 74 65 73 74 2d 65 76 61       ((%test-eva
5370: 6c 75 61 74 65 2d 77 69 74 68 2d 63 61 74 63 68  luate-with-catch
5380: 20 74 65 73 74 2d 65 78 70 72 65 73 73 69 6f 6e   test-expression
5390: 29 0a 20 20 20 20 20 20 20 28 74 72 79 2d 63 61  ).       (try-ca
53a0: 74 63 68 20 74 65 73 74 2d 65 78 70 72 65 73 73  tch test-express
53b0: 69 6f 6e 0a 09 09 20 20 28 65 78 20 3c 6a 61 76  ion...  (ex <jav
53c0: 61 2e 6c 61 6e 67 2e 54 68 72 6f 77 61 62 6c 65  a.lang.Throwable
53d0: 3e 0a 09 09 20 20 20 20 20 20 28 74 65 73 74 2d  >...      (test-
53e0: 72 65 73 75 6c 74 2d 73 65 74 21 20 28 74 65 73  result-set! (tes
53f0: 74 2d 72 75 6e 6e 65 72 2d 63 75 72 72 65 6e 74  t-runner-current
5400: 29 20 27 61 63 74 75 61 6c 2d 65 72 72 6f 72 20  ) 'actual-error 
5410: 65 78 29 0a 09 09 20 20 20 20 20 20 23 66 29 29  ex)...      #f))
5420: 29 29 29 29 0a 20 28 73 72 66 69 2d 33 34 0a 20  )))). (srfi-34. 
5430: 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20   (define-syntax 
5440: 25 74 65 73 74 2d 65 76 61 6c 75 61 74 65 2d 77  %test-evaluate-w
5450: 69 74 68 2d 63 61 74 63 68 0a 20 20 20 20 28 73  ith-catch.    (s
5460: 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20  yntax-rules (). 
5470: 20 20 20 20 20 28 28 25 74 65 73 74 2d 65 76 61       ((%test-eva
5480: 6c 75 61 74 65 2d 77 69 74 68 2d 63 61 74 63 68  luate-with-catch
5490: 20 74 65 73 74 2d 65 78 70 72 65 73 73 69 6f 6e   test-expression
54a0: 29 0a 20 20 20 20 20 20 20 28 67 75 61 72 64 20  ).       (guard 
54b0: 28 65 72 72 20 28 65 6c 73 65 20 23 66 29 29 20  (err (else #f)) 
54c0: 74 65 73 74 2d 65 78 70 72 65 73 73 69 6f 6e 29  test-expression)
54d0: 29 29 29 29 0a 20 28 63 68 69 63 6b 65 6e 0a 20  )))). (chicken. 
54e0: 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20   (define-syntax 
54f0: 25 74 65 73 74 2d 65 76 61 6c 75 61 74 65 2d 77  %test-evaluate-w
5500: 69 74 68 2d 63 61 74 63 68 0a 20 20 20 20 28 73  ith-catch.    (s
5510: 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20  yntax-rules (). 
5520: 20 20 20 20 20 28 28 25 74 65 73 74 2d 65 76 61       ((%test-eva
5530: 6c 75 61 74 65 2d 77 69 74 68 2d 63 61 74 63 68  luate-with-catch
5540: 20 74 65 73 74 2d 65 78 70 72 65 73 73 69 6f 6e   test-expression
5550: 29 0a 20 20 20 20 20 20 20 28 63 6f 6e 64 69 74  ).       (condit
5560: 69 6f 6e 2d 63 61 73 65 20 74 65 73 74 2d 65 78  ion-case test-ex
5570: 70 72 65 73 73 69 6f 6e 20 28 65 78 20 28 29 20  pression (ex () 
5580: 23 66 29 29 29 29 29 29 0a 20 28 65 6c 73 65 0a  #f)))))). (else.
5590: 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78    (define-syntax
55a0: 20 25 74 65 73 74 2d 65 76 61 6c 75 61 74 65 2d   %test-evaluate-
55b0: 77 69 74 68 2d 63 61 74 63 68 0a 20 20 20 20 28  with-catch.    (
55c0: 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a  syntax-rules ().
55d0: 20 20 20 20 20 20 28 28 25 74 65 73 74 2d 65 76        ((%test-ev
55e0: 61 6c 75 61 74 65 2d 77 69 74 68 2d 63 61 74 63  aluate-with-catc
55f0: 68 20 74 65 73 74 2d 65 78 70 72 65 73 73 69 6f  h test-expressio
5600: 6e 29 0a 20 20 20 20 20 20 20 74 65 73 74 2d 65  n).       test-e
5610: 78 70 72 65 73 73 69 6f 6e 29 29 29 29 29 0a 09  xpression)))))..
5620: 20 20 20 20 0a 28 63 6f 6e 64 2d 65 78 70 61 6e      .(cond-expan
5630: 64 0a 20 28 28 61 6e 64 20 28 6e 6f 74 20 72 36  d. ((and (not r6
5640: 72 73 29 20 28 6f 72 20 6b 61 77 61 20 6d 7a 73  rs) (or kawa mzs
5650: 63 68 65 6d 65 29 29 0a 20 20 28 63 6f 6e 64 2d  cheme)).  (cond-
5660: 65 78 70 61 6e 64 0a 20 20 20 28 6d 7a 73 63 68  expand.   (mzsch
5670: 65 6d 65 0a 20 20 20 20 28 64 65 66 69 6e 65 2d  eme.    (define-
5680: 66 6f 72 2d 73 79 6e 74 61 78 20 28 25 74 65 73  for-syntax (%tes
5690: 74 2d 73 79 6e 74 61 78 2d 66 69 6c 65 20 66 6f  t-syntax-file fo
56a0: 72 6d 29 0a 20 20 20 20 20 20 28 6c 65 74 20 28  rm).      (let (
56b0: 28 73 6f 75 72 63 65 20 28 73 79 6e 74 61 78 2d  (source (syntax-
56c0: 73 6f 75 72 63 65 20 66 6f 72 6d 29 29 29 0a 09  source form)))..
56d0: 28 63 6f 6e 64 20 28 28 73 74 72 69 6e 67 3f 20  (cond ((string? 
56e0: 73 6f 75 72 63 65 29 20 66 69 6c 65 29 0a 09 09  source) file)...
56f0: 09 09 28 28 70 61 74 68 3f 20 73 6f 75 72 63 65  ..((path? source
5700: 29 20 28 70 61 74 68 2d 3e 73 74 72 69 6e 67 20  ) (path->string 
5710: 73 6f 75 72 63 65 29 29 0a 09 09 09 09 28 65 6c  source)).....(el
5720: 73 65 20 23 66 29 29 29 29 29 0a 20 20 20 28 6b  se #f))))).   (k
5730: 61 77 61 0a 20 20 20 20 28 64 65 66 69 6e 65 20  awa.    (define 
5740: 28 25 74 65 73 74 2d 73 79 6e 74 61 78 2d 66 69  (%test-syntax-fi
5750: 6c 65 20 66 6f 72 6d 29 0a 20 20 20 20 20 20 28  le form).      (
5760: 73 79 6e 74 61 78 2d 73 6f 75 72 63 65 20 66 6f  syntax-source fo
5770: 72 6d 29 29 29 29 0a 20 20 28 64 65 66 69 6e 65  rm)))).  (define
5780: 2d 66 6f 72 2d 73 79 6e 74 61 78 20 28 25 74 65  -for-syntax (%te
5790: 73 74 2d 73 6f 75 72 63 65 2d 6c 69 6e 65 32 20  st-source-line2 
57a0: 66 6f 72 6d 29 0a 20 20 20 20 28 6c 65 74 2a 20  form).    (let* 
57b0: 28 28 6c 69 6e 65 20 28 73 79 6e 74 61 78 2d 6c  ((line (syntax-l
57c0: 69 6e 65 20 66 6f 72 6d 29 29 0a 09 20 20 20 28  ine form))..   (
57d0: 66 69 6c 65 20 28 25 74 65 73 74 2d 73 79 6e 74  file (%test-synt
57e0: 61 78 2d 66 69 6c 65 20 66 6f 72 6d 29 29 0a 09  ax-file form))..
57f0: 20 20 20 28 6c 69 6e 65 2d 70 61 69 72 20 28 69     (line-pair (i
5800: 66 20 6c 69 6e 65 20 28 6c 69 73 74 20 28 63 6f  f line (list (co
5810: 6e 73 20 27 73 6f 75 72 63 65 2d 6c 69 6e 65 20  ns 'source-line 
5820: 6c 69 6e 65 29 29 20 27 28 29 29 29 29 0a 20 20  line)) '()))).  
5830: 20 20 20 20 28 63 6f 6e 73 20 28 63 6f 6e 73 20      (cons (cons 
5840: 27 73 6f 75 72 63 65 2d 66 6f 72 6d 20 28 73 79  'source-form (sy
5850: 6e 74 61 78 2d 6f 62 6a 65 63 74 2d 3e 64 61 74  ntax-object->dat
5860: 75 6d 20 66 6f 72 6d 29 29 0a 09 20 20 20 20 28  um form))..    (
5870: 69 66 20 66 69 6c 65 20 28 63 6f 6e 73 20 28 63  if file (cons (c
5880: 6f 6e 73 20 27 73 6f 75 72 63 65 2d 66 69 6c 65  ons 'source-file
5890: 20 66 69 6c 65 29 20 6c 69 6e 65 2d 70 61 69 72   file) line-pair
58a0: 29 20 6c 69 6e 65 2d 70 61 69 72 29 29 29 29 29  ) line-pair)))))
58b0: 0a 20 28 65 6c 73 65 0a 20 20 28 64 65 66 69 6e  . (else.  (defin
58c0: 65 20 28 25 74 65 73 74 2d 73 6f 75 72 63 65 2d  e (%test-source-
58d0: 6c 69 6e 65 32 20 66 6f 72 6d 29 0a 20 20 20 20  line2 form).    
58e0: 27 28 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  '())))..(define 
58f0: 28 25 74 65 73 74 2d 6f 6e 2d 74 65 73 74 2d 62  (%test-on-test-b
5900: 65 67 69 6e 20 72 29 0a 20 20 28 25 74 65 73 74  egin r).  (%test
5910: 2d 73 68 6f 75 6c 64 2d 65 78 65 63 75 74 65 20  -should-execute 
5920: 72 29 0a 20 20 28 28 74 65 73 74 2d 72 75 6e 6e  r).  ((test-runn
5930: 65 72 2d 6f 6e 2d 74 65 73 74 2d 62 65 67 69 6e  er-on-test-begin
5940: 20 72 29 20 72 29 0a 20 20 28 6e 6f 74 20 28 65   r) r).  (not (e
5950: 71 3f 20 27 73 6b 69 70 20 28 74 65 73 74 2d 72  q? 'skip (test-r
5960: 65 73 75 6c 74 2d 72 65 66 20 72 20 27 72 65 73  esult-ref r 'res
5970: 75 6c 74 2d 6b 69 6e 64 29 29 29 29 0a 0a 28 64  ult-kind))))..(d
5980: 65 66 69 6e 65 20 28 25 74 65 73 74 2d 6f 6e 2d  efine (%test-on-
5990: 74 65 73 74 2d 65 6e 64 20 72 20 72 65 73 75 6c  test-end r resul
59a0: 74 29 0a 20 20 20 20 28 74 65 73 74 2d 72 65 73  t).    (test-res
59b0: 75 6c 74 2d 73 65 74 21 20 72 20 27 72 65 73 75  ult-set! r 'resu
59c0: 6c 74 2d 6b 69 6e 64 0a 09 09 20 20 20 20 20 20  lt-kind...      
59d0: 28 69 66 20 28 65 71 3f 20 28 74 65 73 74 2d 72  (if (eq? (test-r
59e0: 65 73 75 6c 74 2d 72 65 66 20 72 20 27 72 65 73  esult-ref r 'res
59f0: 75 6c 74 2d 6b 69 6e 64 29 20 27 78 66 61 69 6c  ult-kind) 'xfail
5a00: 29 0a 09 09 09 20 20 28 69 66 20 72 65 73 75 6c  )....  (if resul
5a10: 74 20 27 78 70 61 73 73 20 27 78 66 61 69 6c 29  t 'xpass 'xfail)
5a20: 0a 09 09 09 20 20 28 69 66 20 72 65 73 75 6c 74  ....  (if result
5a30: 20 27 70 61 73 73 20 27 66 61 69 6c 29 29 29 29   'pass 'fail))))
5a40: 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73 74 2d  ..(define (test-
5a50: 72 75 6e 6e 65 72 2d 74 65 73 74 2d 6e 61 6d 65  runner-test-name
5a60: 20 72 75 6e 6e 65 72 29 0a 20 20 28 74 65 73 74   runner).  (test
5a70: 2d 72 65 73 75 6c 74 2d 72 65 66 20 72 75 6e 6e  -result-ref runn
5a80: 65 72 20 27 74 65 73 74 2d 6e 61 6d 65 20 22 22  er 'test-name ""
5a90: 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74  ))..(define-synt
5aa0: 61 78 20 25 74 65 73 74 2d 63 6f 6d 70 32 62 6f  ax %test-comp2bo
5ab0: 64 79 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c  dy.  (syntax-rul
5ac0: 65 73 20 28 29 0a 09 09 28 28 25 74 65 73 74 2d  es ()...((%test-
5ad0: 63 6f 6d 70 32 62 6f 64 79 20 72 20 63 6f 6d 70  comp2body r comp
5ae0: 20 65 78 70 65 63 74 65 64 20 65 78 70 72 29 0a   expected expr).
5af0: 09 09 20 28 6c 65 74 20 28 29 0a 09 09 20 20 20  .. (let ()...   
5b00: 28 69 66 20 28 25 74 65 73 74 2d 6f 6e 2d 74 65  (if (%test-on-te
5b10: 73 74 2d 62 65 67 69 6e 20 72 29 0a 09 09 20 20  st-begin r)...  
5b20: 20 20 20 20 20 28 6c 65 74 20 28 28 65 78 70 20       (let ((exp 
5b30: 65 78 70 65 63 74 65 64 29 29 0a 09 09 09 20 28  expected)).... (
5b40: 74 65 73 74 2d 72 65 73 75 6c 74 2d 73 65 74 21  test-result-set!
5b50: 20 72 20 27 65 78 70 65 63 74 65 64 2d 76 61 6c   r 'expected-val
5b60: 75 65 20 65 78 70 29 0a 09 09 09 20 28 6c 65 74  ue exp).... (let
5b70: 20 28 28 72 65 73 20 28 25 74 65 73 74 2d 65 76   ((res (%test-ev
5b80: 61 6c 75 61 74 65 2d 77 69 74 68 2d 63 61 74 63  aluate-with-catc
5b90: 68 20 65 78 70 72 29 29 29 0a 09 09 09 20 20 20  h expr)))....   
5ba0: 28 74 65 73 74 2d 72 65 73 75 6c 74 2d 73 65 74  (test-result-set
5bb0: 21 20 72 20 27 61 63 74 75 61 6c 2d 76 61 6c 75  ! r 'actual-valu
5bc0: 65 20 72 65 73 29 0a 09 09 09 20 20 20 28 25 74  e res)....   (%t
5bd0: 65 73 74 2d 6f 6e 2d 74 65 73 74 2d 65 6e 64 20  est-on-test-end 
5be0: 72 20 28 63 6f 6d 70 20 65 78 70 20 72 65 73 29  r (comp exp res)
5bf0: 29 29 29 29 0a 09 09 20 20 20 28 25 74 65 73 74  ))))...   (%test
5c00: 2d 72 65 70 6f 72 74 2d 72 65 73 75 6c 74 29 29  -report-result))
5c10: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 25 74  )))..(define (%t
5c20: 65 73 74 2d 61 70 70 72 6f 78 69 6d 69 6d 61 74  est-approximimat
5c30: 65 3d 20 65 72 72 6f 72 29 0a 20 20 28 6c 61 6d  e= error).  (lam
5c40: 62 64 61 20 28 76 61 6c 75 65 20 65 78 70 65 63  bda (value expec
5c50: 74 65 64 29 0a 20 20 20 20 28 61 6e 64 20 28 3e  ted).    (and (>
5c60: 3d 20 76 61 6c 75 65 20 28 2d 20 65 78 70 65 63  = value (- expec
5c70: 74 65 64 20 65 72 72 6f 72 29 29 0a 20 20 20 20  ted error)).    
5c80: 20 20 20 20 20 28 3c 3d 20 76 61 6c 75 65 20 28       (<= value (
5c90: 2b 20 65 78 70 65 63 74 65 64 20 65 72 72 6f 72  + expected error
5ca0: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73  )))))..(define-s
5cb0: 79 6e 74 61 78 20 25 74 65 73 74 2d 63 6f 6d 70  yntax %test-comp
5cc0: 31 62 6f 64 79 0a 20 20 28 73 79 6e 74 61 78 2d  1body.  (syntax-
5cd0: 72 75 6c 65 73 20 28 29 0a 20 20 20 20 28 28 25  rules ().    ((%
5ce0: 74 65 73 74 2d 63 6f 6d 70 31 62 6f 64 79 20 72  test-comp1body r
5cf0: 20 65 78 70 72 29 0a 20 20 20 20 20 28 6c 65 74   expr).     (let
5d00: 20 28 29 0a 20 20 20 20 20 20 20 28 69 66 20 28   ().       (if (
5d10: 25 74 65 73 74 2d 6f 6e 2d 74 65 73 74 2d 62 65  %test-on-test-be
5d20: 67 69 6e 20 72 29 0a 09 20 20 20 28 6c 65 74 20  gin r)..   (let 
5d30: 28 29 0a 09 20 20 20 20 20 28 6c 65 74 20 28 28  ()..     (let ((
5d40: 72 65 73 20 28 25 74 65 73 74 2d 65 76 61 6c 75  res (%test-evalu
5d50: 61 74 65 2d 77 69 74 68 2d 63 61 74 63 68 20 65  ate-with-catch e
5d60: 78 70 72 29 29 29 0a 09 20 20 20 20 20 20 20 28  xpr)))..       (
5d70: 74 65 73 74 2d 72 65 73 75 6c 74 2d 73 65 74 21  test-result-set!
5d80: 20 72 20 27 61 63 74 75 61 6c 2d 76 61 6c 75 65   r 'actual-value
5d90: 20 72 65 73 29 0a 09 20 20 20 20 20 20 20 28 25   res)..       (%
5da0: 74 65 73 74 2d 6f 6e 2d 74 65 73 74 2d 65 6e 64  test-on-test-end
5db0: 20 72 20 72 65 73 29 29 29 29 0a 20 20 20 20 20   r res)))).     
5dc0: 20 20 28 25 74 65 73 74 2d 72 65 70 6f 72 74 2d    (%test-report-
5dd0: 72 65 73 75 6c 74 29 29 29 29 29 0a 0a 28 63 6f  result)))))..(co
5de0: 6e 64 2d 65 78 70 61 6e 64 0a 20 28 28 61 6e 64  nd-expand. ((and
5df0: 20 28 6e 6f 74 20 72 36 72 73 29 20 28 6f 72 20   (not r6rs) (or 
5e00: 6b 61 77 61 20 6d 7a 73 63 68 65 6d 65 29 29 0a  kawa mzscheme)).
5e10: 20 20 3b 3b 20 53 68 6f 75 6c 64 20 62 65 20 6d    ;; Should be m
5e20: 61 64 65 20 74 6f 20 77 6f 72 6b 20 66 6f 72 20  ade to work for 
5e30: 61 6e 79 20 53 63 68 65 6d 65 20 77 69 74 68 20  any Scheme with 
5e40: 73 79 6e 74 61 78 2d 63 61 73 65 0a 20 20 3b 3b  syntax-case.  ;;
5e50: 20 48 6f 77 65 76 65 72 2c 20 49 20 68 61 76 65   However, I have
5e60: 6e 27 74 20 67 6f 74 74 65 6e 20 74 68 65 20 71  n't gotten the q
5e70: 75 6f 74 69 6e 67 20 77 6f 72 6b 69 6e 67 2e 20  uoting working. 
5e80: 20 46 49 58 4d 45 2e 0a 20 20 28 64 65 66 69 6e   FIXME..  (defin
5e90: 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d 65 6e  e-syntax test-en
5ea0: 64 0a 20 20 20 20 28 6c 61 6d 62 64 61 20 28 78  d.    (lambda (x
5eb0: 29 0a 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d  ).      (syntax-
5ec0: 63 61 73 65 20 28 6c 69 73 74 20 78 20 28 6c 69  case (list x (li
5ed0: 73 74 20 27 71 75 6f 74 65 20 28 25 74 65 73 74  st 'quote (%test
5ee0: 2d 73 6f 75 72 63 65 2d 6c 69 6e 65 32 20 78 29  -source-line2 x)
5ef0: 29 29 20 28 29 0a 09 28 28 28 6d 61 63 20 73 75  )) ()..(((mac su
5f00: 69 74 65 2d 6e 61 6d 65 29 20 6c 69 6e 65 29 0a  ite-name) line).
5f10: 09 20 28 73 79 6e 74 61 78 0a 09 20 20 28 25 74  . (syntax..  (%t
5f20: 65 73 74 2d 65 6e 64 20 73 75 69 74 65 2d 6e 61  est-end suite-na
5f30: 6d 65 20 6c 69 6e 65 29 29 29 0a 09 28 28 28 6d  me line)))..(((m
5f40: 61 63 29 20 6c 69 6e 65 29 0a 09 20 28 73 79 6e  ac) line).. (syn
5f50: 74 61 78 0a 09 20 20 28 25 74 65 73 74 2d 65 6e  tax..  (%test-en
5f60: 64 20 23 66 20 6c 69 6e 65 29 29 29 29 29 29 0a  d #f line)))))).
5f70: 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78    (define-syntax
5f80: 20 74 65 73 74 2d 61 73 73 65 72 74 0a 20 20 20   test-assert.   
5f90: 20 28 6c 61 6d 62 64 61 20 28 78 29 0a 20 20 20   (lambda (x).   
5fa0: 20 20 20 28 73 79 6e 74 61 78 2d 63 61 73 65 20     (syntax-case 
5fb0: 28 6c 69 73 74 20 78 20 28 6c 69 73 74 20 27 71  (list x (list 'q
5fc0: 75 6f 74 65 20 28 25 74 65 73 74 2d 73 6f 75 72  uote (%test-sour
5fd0: 63 65 2d 6c 69 6e 65 32 20 78 29 29 29 20 28 29  ce-line2 x))) ()
5fe0: 0a 09 28 28 28 6d 61 63 20 74 6e 61 6d 65 20 65  ..(((mac tname e
5ff0: 78 70 72 29 20 6c 69 6e 65 29 0a 09 20 28 73 79  xpr) line).. (sy
6000: 6e 74 61 78 0a 09 20 20 28 6c 65 74 2a 20 28 28  ntax..  (let* ((
6010: 72 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 67  r (test-runner-g
6020: 65 74 29 29 0a 09 09 20 28 6e 61 6d 65 20 74 6e  et))... (name tn
6030: 61 6d 65 29 29 0a 09 20 20 20 20 28 74 65 73 74  ame))..    (test
6040: 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 20 72  -result-alist! r
6050: 20 28 63 6f 6e 73 20 28 63 6f 6e 73 20 27 74 65   (cons (cons 'te
6060: 73 74 2d 6e 61 6d 65 20 74 6e 61 6d 65 29 20 6c  st-name tname) l
6070: 69 6e 65 29 29 0a 09 20 20 20 20 28 25 74 65 73  ine))..    (%tes
6080: 74 2d 63 6f 6d 70 31 62 6f 64 79 20 72 20 65 78  t-comp1body r ex
6090: 70 72 29 29 29 29 0a 09 28 28 28 6d 61 63 20 65  pr))))..(((mac e
60a0: 78 70 72 29 20 6c 69 6e 65 29 0a 09 20 28 73 79  xpr) line).. (sy
60b0: 6e 74 61 78 0a 09 20 20 28 6c 65 74 2a 20 28 28  ntax..  (let* ((
60c0: 72 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 67  r (test-runner-g
60d0: 65 74 29 29 29 0a 09 20 20 20 20 28 74 65 73 74  et)))..    (test
60e0: 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 20 72  -result-alist! r
60f0: 20 6c 69 6e 65 29 0a 09 20 20 20 20 28 25 74 65   line)..    (%te
6100: 73 74 2d 63 6f 6d 70 31 62 6f 64 79 20 72 20 65  st-comp1body r e
6110: 78 70 72 29 29 29 29 29 29 29 0a 20 20 28 64 65  xpr))))))).  (de
6120: 66 69 6e 65 2d 66 6f 72 2d 73 79 6e 74 61 78 20  fine-for-syntax 
6130: 28 25 74 65 73 74 2d 63 6f 6d 70 32 20 63 6f 6d  (%test-comp2 com
6140: 70 20 78 29 0a 20 20 20 20 28 73 79 6e 74 61 78  p x).    (syntax
6150: 2d 63 61 73 65 20 28 6c 69 73 74 20 78 20 28 6c  -case (list x (l
6160: 69 73 74 20 27 71 75 6f 74 65 20 28 25 74 65 73  ist 'quote (%tes
6170: 74 2d 73 6f 75 72 63 65 2d 6c 69 6e 65 32 20 78  t-source-line2 x
6180: 29 29 20 63 6f 6d 70 29 20 28 29 0a 20 20 20 20  )) comp) ().    
6190: 20 20 28 28 28 6d 61 63 20 74 6e 61 6d 65 20 65    (((mac tname e
61a0: 78 70 65 63 74 65 64 20 65 78 70 72 29 20 6c 69  xpected expr) li
61b0: 6e 65 20 63 6f 6d 70 29 0a 20 20 20 20 20 20 20  ne comp).       
61c0: 28 73 79 6e 74 61 78 0a 09 28 6c 65 74 2a 20 28  (syntax..(let* (
61d0: 28 72 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d  (r (test-runner-
61e0: 67 65 74 29 29 0a 09 20 20 20 20 20 20 20 28 6e  get))..       (n
61f0: 61 6d 65 20 74 6e 61 6d 65 29 29 0a 09 20 20 28  ame tname))..  (
6200: 74 65 73 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73  test-result-alis
6210: 74 21 20 72 20 28 63 6f 6e 73 20 28 63 6f 6e 73  t! r (cons (cons
6220: 20 27 74 65 73 74 2d 6e 61 6d 65 20 74 6e 61 6d   'test-name tnam
6230: 65 29 20 6c 69 6e 65 29 29 0a 09 20 20 28 25 74  e) line))..  (%t
6240: 65 73 74 2d 63 6f 6d 70 32 62 6f 64 79 20 72 20  est-comp2body r 
6250: 63 6f 6d 70 20 65 78 70 65 63 74 65 64 20 65 78  comp expected ex
6260: 70 72 29 29 29 29 0a 20 20 20 20 20 20 28 28 28  pr)))).      (((
6270: 6d 61 63 20 65 78 70 65 63 74 65 64 20 65 78 70  mac expected exp
6280: 72 29 20 6c 69 6e 65 20 63 6f 6d 70 29 0a 20 20  r) line comp).  
6290: 20 20 20 20 20 28 73 79 6e 74 61 78 0a 09 28 6c       (syntax..(l
62a0: 65 74 2a 20 28 28 72 20 28 74 65 73 74 2d 72 75  et* ((r (test-ru
62b0: 6e 6e 65 72 2d 67 65 74 29 29 29 0a 09 20 20 28  nner-get)))..  (
62c0: 74 65 73 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73  test-result-alis
62d0: 74 21 20 72 20 6c 69 6e 65 29 0a 09 20 20 28 25  t! r line)..  (%
62e0: 74 65 73 74 2d 63 6f 6d 70 32 62 6f 64 79 20 72  test-comp2body r
62f0: 20 63 6f 6d 70 20 65 78 70 65 63 74 65 64 20 65   comp expected e
6300: 78 70 72 29 29 29 29 29 29 0a 20 20 28 64 65 66  xpr)))))).  (def
6310: 69 6e 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d  ine-syntax test-
6320: 65 71 76 0a 20 20 20 20 28 6c 61 6d 62 64 61 20  eqv.    (lambda 
6330: 28 78 29 20 28 25 74 65 73 74 2d 63 6f 6d 70 32  (x) (%test-comp2
6340: 20 28 73 79 6e 74 61 78 20 65 71 76 3f 29 20 78   (syntax eqv?) x
6350: 29 29 29 0a 20 20 28 64 65 66 69 6e 65 2d 73 79  ))).  (define-sy
6360: 6e 74 61 78 20 74 65 73 74 2d 65 71 0a 20 20 20  ntax test-eq.   
6370: 20 28 6c 61 6d 62 64 61 20 28 78 29 20 28 25 74   (lambda (x) (%t
6380: 65 73 74 2d 63 6f 6d 70 32 20 28 73 79 6e 74 61  est-comp2 (synta
6390: 78 20 65 71 3f 29 20 78 29 29 29 0a 20 20 28 64  x eq?) x))).  (d
63a0: 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 74 65 73  efine-syntax tes
63b0: 74 2d 65 71 75 61 6c 0a 20 20 20 20 28 6c 61 6d  t-equal.    (lam
63c0: 62 64 61 20 28 78 29 20 28 25 74 65 73 74 2d 63  bda (x) (%test-c
63d0: 6f 6d 70 32 20 28 73 79 6e 74 61 78 20 65 71 75  omp2 (syntax equ
63e0: 61 6c 3f 29 20 78 29 29 29 0a 20 20 28 64 65 66  al?) x))).  (def
63f0: 69 6e 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d  ine-syntax test-
6400: 61 70 70 72 6f 78 69 6d 61 74 65 20 3b 3b 20 46  approximate ;; F
6410: 49 58 4d 45 20 2d 20 6e 65 65 64 65 64 20 66 6f  IXME - needed fo
6420: 72 20 6e 6f 6e 2d 4b 61 77 61 0a 20 20 20 20 28  r non-Kawa.    (
6430: 6c 61 6d 62 64 61 20 28 78 29 0a 20 20 20 20 20  lambda (x).     
6440: 20 28 73 79 6e 74 61 78 2d 63 61 73 65 20 28 6c   (syntax-case (l
6450: 69 73 74 20 78 20 28 6c 69 73 74 20 27 71 75 6f  ist x (list 'quo
6460: 74 65 20 28 25 74 65 73 74 2d 73 6f 75 72 63 65  te (%test-source
6470: 2d 6c 69 6e 65 32 20 78 29 29 29 20 28 29 0a 20  -line2 x))) (). 
6480: 20 20 20 20 20 28 28 28 6d 61 63 20 74 6e 61 6d       (((mac tnam
6490: 65 20 65 78 70 65 63 74 65 64 20 65 78 70 72 20  e expected expr 
64a0: 65 72 72 6f 72 29 20 6c 69 6e 65 29 0a 20 20 20  error) line).   
64b0: 20 20 20 20 28 73 79 6e 74 61 78 0a 09 28 6c 65      (syntax..(le
64c0: 74 2a 20 28 28 72 20 28 74 65 73 74 2d 72 75 6e  t* ((r (test-run
64d0: 6e 65 72 2d 67 65 74 29 29 0a 09 20 20 20 20 20  ner-get))..     
64e0: 20 20 28 6e 61 6d 65 20 74 6e 61 6d 65 29 29 0a    (name tname)).
64f0: 09 20 20 28 74 65 73 74 2d 72 65 73 75 6c 74 2d  .  (test-result-
6500: 61 6c 69 73 74 21 20 72 20 28 63 6f 6e 73 20 28  alist! r (cons (
6510: 63 6f 6e 73 20 27 74 65 73 74 2d 6e 61 6d 65 20  cons 'test-name 
6520: 74 6e 61 6d 65 29 20 6c 69 6e 65 29 29 0a 09 20  tname) line)).. 
6530: 20 28 25 74 65 73 74 2d 63 6f 6d 70 32 62 6f 64   (%test-comp2bod
6540: 79 20 72 20 28 25 74 65 73 74 2d 61 70 70 72 6f  y r (%test-appro
6550: 78 69 6d 69 6d 61 74 65 3d 20 65 72 72 6f 72 29  ximimate= error)
6560: 20 65 78 70 65 63 74 65 64 20 65 78 70 72 29 29   expected expr))
6570: 29 29 0a 20 20 20 20 20 20 28 28 28 6d 61 63 20  )).      (((mac 
6580: 65 78 70 65 63 74 65 64 20 65 78 70 72 20 65 72  expected expr er
6590: 72 6f 72 29 20 6c 69 6e 65 29 0a 20 20 20 20 20  ror) line).     
65a0: 20 20 28 73 79 6e 74 61 78 0a 09 28 6c 65 74 2a    (syntax..(let*
65b0: 20 28 28 72 20 28 74 65 73 74 2d 72 75 6e 6e 65   ((r (test-runne
65c0: 72 2d 67 65 74 29 29 29 0a 09 20 20 28 74 65 73  r-get)))..  (tes
65d0: 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 20  t-result-alist! 
65e0: 72 20 6c 69 6e 65 29 0a 09 20 20 28 25 74 65 73  r line)..  (%tes
65f0: 74 2d 63 6f 6d 70 32 62 6f 64 79 20 72 20 28 25  t-comp2body r (%
6600: 74 65 73 74 2d 61 70 70 72 6f 78 69 6d 69 6d 61  test-approximima
6610: 74 65 3d 20 65 72 72 6f 72 29 20 65 78 70 65 63  te= error) expec
6620: 74 65 64 20 65 78 70 72 29 29 29 29 29 29 29 29  ted expr))))))))
6630: 0a 20 28 65 6c 73 65 0a 20 20 28 64 65 66 69 6e  . (else.  (defin
6640: 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d 65 6e  e-syntax test-en
6650: 64 0a 20 20 20 20 28 73 79 6e 74 61 78 2d 72 75  d.    (syntax-ru
6660: 6c 65 73 20 28 29 0a 20 20 20 20 20 20 28 28 74  les ().      ((t
6670: 65 73 74 2d 65 6e 64 29 0a 20 20 20 20 20 20 20  est-end).       
6680: 28 25 74 65 73 74 2d 65 6e 64 20 23 66 20 27 28  (%test-end #f '(
6690: 29 29 29 0a 20 20 20 20 20 20 28 28 74 65 73 74  ))).      ((test
66a0: 2d 65 6e 64 20 73 75 69 74 65 2d 6e 61 6d 65 29  -end suite-name)
66b0: 0a 20 20 20 20 20 20 20 28 25 74 65 73 74 2d 65  .       (%test-e
66c0: 6e 64 20 73 75 69 74 65 2d 6e 61 6d 65 20 27 28  nd suite-name '(
66d0: 29 29 29 29 29 0a 20 20 28 64 65 66 69 6e 65 2d  ))))).  (define-
66e0: 73 79 6e 74 61 78 20 74 65 73 74 2d 61 73 73 65  syntax test-asse
66f0: 72 74 0a 20 20 20 20 28 73 79 6e 74 61 78 2d 72  rt.    (syntax-r
6700: 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20 28 28  ules ().      ((
6710: 74 65 73 74 2d 61 73 73 65 72 74 20 74 6e 61 6d  test-assert tnam
6720: 65 20 74 65 73 74 2d 65 78 70 72 65 73 73 69 6f  e test-expressio
6730: 6e 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  n).       (let (
6740: 28 72 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d  (r (test-runner-
6750: 67 65 74 29 29 29 0a 09 20 28 74 65 73 74 2d 72  get))).. (test-r
6760: 65 73 75 6c 74 2d 61 6c 69 73 74 21 20 72 20 60  esult-alist! r `
6770: 28 28 74 65 73 74 2d 6e 61 6d 65 20 2e 20 2c 74  ((test-name . ,t
6780: 6e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  name).          
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67a0: 20 20 20 20 20 20 20 28 73 6f 75 72 63 65 2d 66         (source-f
67b0: 6f 72 6d 20 2e 20 74 65 73 74 2d 65 78 70 72 65  orm . test-expre
67c0: 73 73 69 6f 6e 29 29 29 0a 09 20 28 25 74 65 73  ssion))).. (%tes
67d0: 74 2d 63 6f 6d 70 31 62 6f 64 79 20 72 20 74 65  t-comp1body r te
67e0: 73 74 2d 65 78 70 72 65 73 73 69 6f 6e 29 29 29  st-expression)))
67f0: 0a 20 20 20 20 20 20 28 28 74 65 73 74 2d 61 73  .      ((test-as
6800: 73 65 72 74 20 74 65 73 74 2d 65 78 70 72 65 73  sert test-expres
6810: 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28 6c 65  sion).       (le
6820: 74 20 28 28 72 20 28 74 65 73 74 2d 72 75 6e 6e  t ((r (test-runn
6830: 65 72 2d 67 65 74 29 29 29 0a 09 20 28 74 65 73  er-get))).. (tes
6840: 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 20  t-result-alist! 
6850: 72 20 27 28 28 73 6f 75 72 63 65 2d 66 6f 72 6d  r '((source-form
6860: 20 2e 20 74 65 73 74 2d 65 78 70 72 65 73 73 69   . test-expressi
6870: 6f 6e 29 29 29 0a 09 20 28 25 74 65 73 74 2d 63  on))).. (%test-c
6880: 6f 6d 70 31 62 6f 64 79 20 72 20 74 65 73 74 2d  omp1body r test-
6890: 65 78 70 72 65 73 73 69 6f 6e 29 29 29 29 29 0a  expression))))).
68a0: 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78    (define-syntax
68b0: 20 25 74 65 73 74 2d 63 6f 6d 70 32 0a 20 20 20   %test-comp2.   
68c0: 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28   (syntax-rules (
68d0: 29 0a 20 20 20 20 20 20 28 28 25 74 65 73 74 2d  ).      ((%test-
68e0: 63 6f 6d 70 32 20 63 6f 6d 70 20 74 6e 61 6d 65  comp2 comp tname
68f0: 20 65 78 70 65 63 74 65 64 20 65 78 70 72 29 0a   expected expr).
6900: 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 72 20         (let ((r 
6910: 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 67 65 74  (test-runner-get
6920: 29 29 29 0a 09 20 28 74 65 73 74 2d 72 65 73 75  ))).. (test-resu
6930: 6c 74 2d 61 6c 69 73 74 21 20 72 20 60 28 28 74  lt-alist! r `((t
6940: 65 73 74 2d 6e 61 6d 65 20 2e 20 2c 74 6e 61 6d  est-name . ,tnam
6950: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e).             
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 20 20 20 20 28 73 6f 75 72 63 65 2d 66 6f 72 6d      (source-form
6980: 20 2e 20 65 78 70 72 29 29 29 0a 09 20 28 25 74   . expr))).. (%t
6990: 65 73 74 2d 63 6f 6d 70 32 62 6f 64 79 20 72 20  est-comp2body r 
69a0: 63 6f 6d 70 20 65 78 70 65 63 74 65 64 20 65 78  comp expected ex
69b0: 70 72 29 29 29 0a 20 20 20 20 20 20 28 28 25 74  pr))).      ((%t
69c0: 65 73 74 2d 63 6f 6d 70 32 20 63 6f 6d 70 20 65  est-comp2 comp e
69d0: 78 70 65 63 74 65 64 20 65 78 70 72 29 0a 20 20  xpected expr).  
69e0: 20 20 20 20 20 28 6c 65 74 20 28 28 72 20 28 74       (let ((r (t
69f0: 65 73 74 2d 72 75 6e 6e 65 72 2d 67 65 74 29 29  est-runner-get))
6a00: 29 0a 09 20 28 74 65 73 74 2d 72 65 73 75 6c 74  ).. (test-result
6a10: 2d 61 6c 69 73 74 21 20 72 20 27 28 28 73 6f 75  -alist! r '((sou
6a20: 72 63 65 2d 66 6f 72 6d 20 2e 20 65 78 70 72 29  rce-form . expr)
6a30: 29 29 0a 09 20 28 25 74 65 73 74 2d 63 6f 6d 70  )).. (%test-comp
6a40: 32 62 6f 64 79 20 72 20 63 6f 6d 70 20 65 78 70  2body r comp exp
6a50: 65 63 74 65 64 20 65 78 70 72 29 29 29 29 29 0a  ected expr))))).
6a60: 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78    (define-syntax
6a70: 20 74 65 73 74 2d 65 71 75 61 6c 0a 20 20 20 20   test-equal.    
6a80: 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29  (syntax-rules ()
6a90: 0a 20 20 20 20 20 20 28 28 74 65 73 74 2d 65 71  .      ((test-eq
6aa0: 75 61 6c 20 2e 20 72 65 73 74 29 0a 20 20 20 20  ual . rest).    
6ab0: 20 20 20 28 25 74 65 73 74 2d 63 6f 6d 70 32 20     (%test-comp2 
6ac0: 65 71 75 61 6c 3f 20 2e 20 72 65 73 74 29 29 29  equal? . rest)))
6ad0: 29 0a 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74  ).  (define-synt
6ae0: 61 78 20 74 65 73 74 2d 65 71 76 0a 20 20 20 20  ax test-eqv.    
6af0: 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29  (syntax-rules ()
6b00: 0a 20 20 20 20 20 20 28 28 74 65 73 74 2d 65 71  .      ((test-eq
6b10: 76 20 2e 20 72 65 73 74 29 0a 20 20 20 20 20 20  v . rest).      
6b20: 20 28 25 74 65 73 74 2d 63 6f 6d 70 32 20 65 71   (%test-comp2 eq
6b30: 76 3f 20 2e 20 72 65 73 74 29 29 29 29 0a 20 20  v? . rest)))).  
6b40: 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 74  (define-syntax t
6b50: 65 73 74 2d 65 71 0a 20 20 20 20 28 73 79 6e 74  est-eq.    (synt
6b60: 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20  ax-rules ().    
6b70: 20 20 28 28 74 65 73 74 2d 65 71 20 2e 20 72 65    ((test-eq . re
6b80: 73 74 29 0a 20 20 20 20 20 20 20 28 25 74 65 73  st).       (%tes
6b90: 74 2d 63 6f 6d 70 32 20 65 71 3f 20 2e 20 72 65  t-comp2 eq? . re
6ba0: 73 74 29 29 29 29 0a 20 20 28 64 65 66 69 6e 65  st)))).  (define
6bb0: 2d 73 79 6e 74 61 78 20 74 65 73 74 2d 61 70 70  -syntax test-app
6bc0: 72 6f 78 69 6d 61 74 65 0a 20 20 20 20 28 73 79  roximate.    (sy
6bd0: 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20  ntax-rules ().  
6be0: 20 20 20 20 28 28 74 65 73 74 2d 61 70 70 72 6f      ((test-appro
6bf0: 78 69 6d 61 74 65 20 74 6e 61 6d 65 20 65 78 70  ximate tname exp
6c00: 65 63 74 65 64 20 65 78 70 72 20 65 72 72 6f 72  ected expr error
6c10: 29 0a 20 20 20 20 20 20 20 28 25 74 65 73 74 2d  ).       (%test-
6c20: 63 6f 6d 70 32 20 28 25 74 65 73 74 2d 61 70 70  comp2 (%test-app
6c30: 72 6f 78 69 6d 69 6d 61 74 65 3d 20 65 72 72 6f  roximimate= erro
6c40: 72 29 20 74 6e 61 6d 65 20 65 78 70 65 63 74 65  r) tname expecte
6c50: 64 20 65 78 70 72 29 29 0a 20 20 20 20 20 20 28  d expr)).      (
6c60: 28 74 65 73 74 2d 61 70 70 72 6f 78 69 6d 61 74  (test-approximat
6c70: 65 20 65 78 70 65 63 74 65 64 20 65 78 70 72 20  e expected expr 
6c80: 65 72 72 6f 72 29 0a 20 20 20 20 20 20 20 28 25  error).       (%
6c90: 74 65 73 74 2d 63 6f 6d 70 32 20 28 25 74 65 73  test-comp2 (%tes
6ca0: 74 2d 61 70 70 72 6f 78 69 6d 69 6d 61 74 65 3d  t-approximimate=
6cb0: 20 65 72 72 6f 72 29 20 65 78 70 65 63 74 65 64   error) expected
6cc0: 20 65 78 70 72 29 29 29 29 29 29 0a 0a 28 63 6f   expr))))))..(co
6cd0: 6e 64 2d 65 78 70 61 6e 64 0a 20 28 72 36 72 73  nd-expand. (r6rs
6ce0: 0a 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61  .  (define-synta
6cf0: 78 20 25 74 65 73 74 2d 65 72 72 6f 72 0a 20 20  x %test-error.  
6d00: 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20    (syntax-rules 
6d10: 28 29 0a 20 20 20 20 20 20 28 28 25 74 65 73 74  ().      ((%test
6d20: 2d 65 72 72 6f 72 20 65 74 79 70 65 20 65 78 70  -error etype exp
6d30: 72 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  r).       (let (
6d40: 28 74 20 65 74 79 70 65 29 29 0a 20 20 20 20 20  (t etype)).     
6d50: 20 20 20 20 28 77 68 65 6e 20 28 70 72 6f 63 65      (when (proce
6d60: 64 75 72 65 3f 20 74 29 0a 20 20 20 20 20 20 20  dure? t).       
6d70: 20 20 20 20 28 74 65 73 74 2d 72 65 73 75 6c 74      (test-result
6d80: 2d 73 65 74 21 20 28 74 65 73 74 2d 72 75 6e 6e  -set! (test-runn
6d90: 65 72 2d 67 65 74 29 20 27 65 78 70 65 63 74 65  er-get) 'expecte
6da0: 64 2d 65 72 72 6f 72 20 74 29 29 0a 20 20 20 20  d-error t)).    
6db0: 20 20 20 20 20 28 67 75 61 72 64 20 28 65 78 20       (guard (ex 
6dc0: 28 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  (else.          
6dd0: 20 20 20 20 20 20 20 20 20 20 20 28 74 65 73 74             (test
6de0: 2d 72 65 73 75 6c 74 2d 73 65 74 21 20 28 74 65  -result-set! (te
6df0: 73 74 2d 72 75 6e 6e 65 72 2d 67 65 74 29 20 27  st-runner-get) '
6e00: 61 63 74 75 61 6c 2d 65 72 72 6f 72 20 65 78 29  actual-error ex)
6e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e20: 20 20 20 20 20 20 28 69 66 20 28 70 72 6f 63 65        (if (proce
6e30: 64 75 72 65 3f 20 74 29 20 28 74 20 65 78 29 20  dure? t) (t ex) 
6e40: 23 54 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  #T))).          
6e50: 20 65 78 70 72 0a 20 20 20 20 20 20 20 20 20 20   expr.          
6e60: 20 23 46 29 29 29 29 29 29 0a 20 28 67 75 69 6c   #F)))))). (guil
6e70: 65 0a 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74  e.  (define-synt
6e80: 61 78 20 25 74 65 73 74 2d 65 72 72 6f 72 0a 20  ax %test-error. 
6e90: 20 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73     (syntax-rules
6ea0: 20 28 29 0a 20 20 20 20 20 20 28 28 25 74 65 73   ().      ((%tes
6eb0: 74 2d 65 72 72 6f 72 20 72 20 65 74 79 70 65 20  t-error r etype 
6ec0: 65 78 70 72 29 0a 20 20 20 20 20 20 20 28 25 74  expr).       (%t
6ed0: 65 73 74 2d 63 6f 6d 70 31 62 6f 64 79 20 72 20  est-comp1body r 
6ee0: 28 63 61 74 63 68 20 23 74 20 28 6c 61 6d 62 64  (catch #t (lambd
6ef0: 61 20 28 29 20 65 78 70 72 29 20 28 6c 61 6d 62  a () expr) (lamb
6f00: 64 61 20 28 6b 65 79 20 2e 20 61 72 67 73 29 20  da (key . args) 
6f10: 23 74 29 29 29 29 29 29 29 0a 20 28 6d 7a 73 63  #t))))))). (mzsc
6f20: 68 65 6d 65 0a 20 20 28 64 65 66 69 6e 65 2d 73  heme.  (define-s
6f30: 79 6e 74 61 78 20 25 74 65 73 74 2d 65 72 72 6f  yntax %test-erro
6f40: 72 0a 20 20 20 20 28 73 79 6e 74 61 78 2d 72 75  r.    (syntax-ru
6f50: 6c 65 73 20 28 29 0a 20 20 20 20 20 20 28 28 25  les ().      ((%
6f60: 74 65 73 74 2d 65 72 72 6f 72 20 72 20 65 74 79  test-error r ety
6f70: 70 65 20 65 78 70 72 29 0a 20 20 20 20 20 20 20  pe expr).       
6f80: 28 25 74 65 73 74 2d 63 6f 6d 70 31 62 6f 64 79  (%test-comp1body
6f90: 20 72 20 28 77 69 74 68 2d 68 61 6e 64 6c 65 72   r (with-handler
6fa0: 73 20 28 28 28 6c 61 6d 62 64 61 20 28 68 29 20  s (((lambda (h) 
6fb0: 23 74 29 20 28 6c 61 6d 62 64 61 20 28 68 29 20  #t) (lambda (h) 
6fc0: 23 74 29 29 29 0a 09 09 09 09 09 20 28 6c 65 74  #t)))...... (let
6fd0: 20 28 29 0a 09 09 09 09 09 20 20 20 28 74 65 73   ()......   (tes
6fe0: 74 2d 72 65 73 75 6c 74 2d 73 65 74 21 20 72 20  t-result-set! r 
6ff0: 27 61 63 74 75 61 6c 2d 76 61 6c 75 65 20 65 78  'actual-value ex
7000: 70 72 29 0a 09 09 09 09 09 20 20 20 23 66 29 29  pr)......   #f))
7010: 29 29 29 29 29 0a 20 28 63 68 69 63 6b 65 6e 0a  ))))). (chicken.
7020: 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78    (define-syntax
7030: 20 25 74 65 73 74 2d 65 72 72 6f 72 0a 20 20 20   %test-error.   
7040: 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28   (syntax-rules (
7050: 29 0a 20 20 20 20 20 20 28 28 25 74 65 73 74 2d  ).      ((%test-
7060: 65 72 72 6f 72 20 72 20 65 74 79 70 65 20 65 78  error r etype ex
7070: 70 72 29 0a 20 20 20 20 20 20 20 20 28 25 74 65  pr).        (%te
7080: 73 74 2d 63 6f 6d 70 31 62 6f 64 79 20 72 20 28  st-comp1body r (
7090: 63 6f 6e 64 69 74 69 6f 6e 2d 63 61 73 65 20 65  condition-case e
70a0: 78 70 72 20 28 65 78 20 28 29 20 23 74 29 29 29  xpr (ex () #t)))
70b0: 29 29 29 29 0a 20 28 6b 61 77 61 0a 20 20 28 64  )))). (kawa.  (d
70c0: 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 25 74 65  efine-syntax %te
70d0: 73 74 2d 65 72 72 6f 72 0a 20 20 20 20 28 73 79  st-error.    (sy
70e0: 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20  ntax-rules ().  
70f0: 20 20 20 20 28 28 25 74 65 73 74 2d 65 72 72 6f      ((%test-erro
7100: 72 20 72 20 65 74 79 70 65 20 65 78 70 72 29 0a  r r etype expr).
7110: 20 20 20 20 20 20 20 28 6c 65 74 20 28 29 0a 09         (let ()..
7120: 20 28 69 66 20 28 25 74 65 73 74 2d 6f 6e 2d 74   (if (%test-on-t
7130: 65 73 74 2d 62 65 67 69 6e 20 72 29 0a 09 20 20  est-begin r)..  
7140: 20 20 20 28 6c 65 74 20 28 28 65 74 20 65 74 79     (let ((et ety
7150: 70 65 29 29 0a 09 20 20 20 20 20 20 20 28 74 65  pe))..       (te
7160: 73 74 2d 72 65 73 75 6c 74 2d 73 65 74 21 20 72  st-result-set! r
7170: 20 27 65 78 70 65 63 74 65 64 2d 65 72 72 6f 72   'expected-error
7180: 20 65 74 29 0a 09 20 20 20 20 20 20 20 28 25 74   et)..       (%t
7190: 65 73 74 2d 6f 6e 2d 74 65 73 74 2d 65 6e 64 20  est-on-test-end 
71a0: 72 0a 09 09 09 09 20 20 28 74 72 79 2d 63 61 74  r.....  (try-cat
71b0: 63 68 0a 09 09 09 09 20 20 20 28 6c 65 74 20 28  ch.....   (let (
71c0: 29 0a 09 09 09 09 20 20 20 20 20 28 74 65 73 74  ).....     (test
71d0: 2d 72 65 73 75 6c 74 2d 73 65 74 21 20 72 20 27  -result-set! r '
71e0: 61 63 74 75 61 6c 2d 76 61 6c 75 65 20 65 78 70  actual-value exp
71f0: 72 29 0a 09 09 09 09 20 20 20 20 20 23 66 29 0a  r).....     #f).
7200: 09 09 09 09 20 20 20 28 65 78 20 3c 6a 61 76 61  ....   (ex <java
7210: 2e 6c 61 6e 67 2e 54 68 72 6f 77 61 62 6c 65 3e  .lang.Throwable>
7220: 0a 09 09 09 09 20 20 20 20 20 20 20 28 74 65 73  .....       (tes
7230: 74 2d 72 65 73 75 6c 74 2d 73 65 74 21 20 72 20  t-result-set! r 
7240: 27 61 63 74 75 61 6c 2d 65 72 72 6f 72 20 65 78  'actual-error ex
7250: 29 0a 09 09 09 09 20 20 20 20 20 20 20 28 63 6f  ).....       (co
7260: 6e 64 20 28 28 61 6e 64 20 28 69 6e 73 74 61 6e  nd ((and (instan
7270: 63 65 3f 20 65 74 20 3c 67 6e 75 2e 62 79 74 65  ce? et <gnu.byte
7280: 63 6f 64 65 2e 43 6c 61 73 73 54 79 70 65 3e 29  code.ClassType>)
7290: 0a 09 09 09 09 09 09 20 20 20 28 67 6e 75 2e 62  .......   (gnu.b
72a0: 79 74 65 63 6f 64 65 2e 43 6c 61 73 73 54 79 70  ytecode.ClassTyp
72b0: 65 3a 69 73 53 75 62 63 6c 61 73 73 20 65 74 20  e:isSubclass et 
72c0: 3c 6a 61 76 61 2e 6c 61 6e 67 2e 54 68 72 6f 77  <java.lang.Throw
72d0: 61 62 6c 65 3e 29 29 0a 09 09 09 09 09 20 20 20  able>))......   
72e0: 20 20 20 28 69 6e 73 74 61 6e 63 65 3f 20 65 78     (instance? ex
72f0: 20 65 74 29 29 0a 09 09 09 09 09 20 20 20 20 20   et))......     
7300: 28 65 6c 73 65 20 23 74 29 29 29 29 29 0a 09 20  (else #t))))).. 
7310: 20 20 20 20 20 20 28 25 74 65 73 74 2d 72 65 70        (%test-rep
7320: 6f 72 74 2d 72 65 73 75 6c 74 29 29 29 29 29 29  ort-result))))))
7330: 29 29 0a 20 28 28 61 6e 64 20 73 72 66 69 2d 33  )). ((and srfi-3
7340: 34 20 73 72 66 69 2d 33 35 29 0a 20 20 28 64 65  4 srfi-35).  (de
7350: 66 69 6e 65 2d 73 79 6e 74 61 78 20 25 74 65 73  fine-syntax %tes
7360: 74 2d 65 72 72 6f 72 0a 20 20 20 20 28 73 79 6e  t-error.    (syn
7370: 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20  tax-rules ().   
7380: 20 20 20 28 28 25 74 65 73 74 2d 65 72 72 6f 72     ((%test-error
7390: 20 72 20 65 74 79 70 65 20 65 78 70 72 29 0a 20   r etype expr). 
73a0: 20 20 20 20 20 20 28 25 74 65 73 74 2d 63 6f 6d        (%test-com
73b0: 70 31 62 6f 64 79 20 72 20 28 67 75 61 72 64 20  p1body r (guard 
73c0: 28 65 78 20 28 28 63 6f 6e 64 69 74 69 6f 6e 2d  (ex ((condition-
73d0: 74 79 70 65 3f 20 65 74 79 70 65 29 0a 09 09 20  type? etype)... 
73e0: 20 20 28 61 6e 64 20 28 63 6f 6e 64 69 74 69 6f    (and (conditio
73f0: 6e 3f 20 65 78 29 20 28 63 6f 6e 64 69 74 69 6f  n? ex) (conditio
7400: 6e 2d 68 61 73 2d 74 79 70 65 3f 20 65 78 20 65  n-has-type? ex e
7410: 74 79 70 65 29 29 29 0a 09 09 20 20 28 28 70 72  type)))...  ((pr
7420: 6f 63 65 64 75 72 65 3f 20 65 74 79 70 65 29 0a  ocedure? etype).
7430: 09 09 20 20 20 28 65 74 79 70 65 20 65 78 29 29  ..   (etype ex))
7440: 0a 09 09 20 20 28 28 65 71 75 61 6c 3f 20 74 79  ...  ((equal? ty
7450: 70 65 20 23 74 29 0a 09 09 20 20 20 23 74 29 0a  pe #t)...   #t).
7460: 09 09 20 20 28 65 6c 73 65 20 23 74 29 29 0a 09  ..  (else #t))..
7470: 20 20 20 20 20 20 65 78 70 72 29 29 29 29 29 29        expr))))))
7480: 0a 20 28 73 72 66 69 2d 33 34 0a 20 20 28 64 65  . (srfi-34.  (de
7490: 66 69 6e 65 2d 73 79 6e 74 61 78 20 25 74 65 73  fine-syntax %tes
74a0: 74 2d 65 72 72 6f 72 0a 20 20 20 20 28 73 79 6e  t-error.    (syn
74b0: 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20  tax-rules ().   
74c0: 20 20 20 28 28 25 74 65 73 74 2d 65 72 72 6f 72     ((%test-error
74d0: 20 72 20 65 74 79 70 65 20 65 78 70 72 29 0a 20   r etype expr). 
74e0: 20 20 20 20 20 20 28 25 74 65 73 74 2d 63 6f 6d        (%test-com
74f0: 70 31 62 6f 64 79 20 72 20 28 67 75 61 72 64 20  p1body r (guard 
7500: 28 65 78 20 28 65 6c 73 65 20 23 74 29 29 20 65  (ex (else #t)) e
7510: 78 70 72 29 29 29 29 29 29 0a 20 28 65 6c 73 65  xpr)))))). (else
7520: 0a 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61  .  (define-synta
7530: 78 20 25 74 65 73 74 2d 65 72 72 6f 72 0a 20 20  x %test-error.  
7540: 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20    (syntax-rules 
7550: 28 29 0a 20 20 20 20 20 20 28 28 25 74 65 73 74  ().      ((%test
7560: 2d 65 72 72 6f 72 20 72 20 65 74 79 70 65 20 65  -error r etype e
7570: 78 70 72 29 0a 20 20 20 20 20 20 20 28 62 65 67  xpr).       (beg
7580: 69 6e 0a 09 20 28 28 74 65 73 74 2d 72 75 6e 6e  in.. ((test-runn
7590: 65 72 2d 6f 6e 2d 74 65 73 74 2d 62 65 67 69 6e  er-on-test-begin
75a0: 20 72 29 20 72 29 0a 09 20 28 74 65 73 74 2d 72   r) r).. (test-r
75b0: 65 73 75 6c 74 2d 73 65 74 21 20 72 20 27 72 65  esult-set! r 're
75c0: 73 75 6c 74 2d 6b 69 6e 64 20 27 73 6b 69 70 29  sult-kind 'skip)
75d0: 0a 09 20 28 25 74 65 73 74 2d 72 65 70 6f 72 74  .. (%test-report
75e0: 2d 72 65 73 75 6c 74 29 29 29 29 29 29 29 0a 0a  -result)))))))..
75f0: 28 63 6f 6e 64 2d 65 78 70 61 6e 64 0a 20 28 28  (cond-expand. ((
7600: 61 6e 64 20 28 6e 6f 74 20 72 36 72 73 29 20 28  and (not r6rs) (
7610: 6f 72 20 6b 61 77 61 20 6d 7a 73 63 68 65 6d 65  or kawa mzscheme
7620: 29 29 0a 0a 20 20 28 64 65 66 69 6e 65 2d 73 79  ))..  (define-sy
7630: 6e 74 61 78 20 74 65 73 74 2d 65 72 72 6f 72 0a  ntax test-error.
7640: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 78 29 0a      (lambda (x).
7650: 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d 63 61        (syntax-ca
7660: 73 65 20 28 6c 69 73 74 20 78 20 28 6c 69 73 74  se (list x (list
7670: 20 27 71 75 6f 74 65 20 28 25 74 65 73 74 2d 73   'quote (%test-s
7680: 6f 75 72 63 65 2d 6c 69 6e 65 32 20 78 29 29 29  ource-line2 x)))
7690: 20 28 29 0a 09 28 28 28 6d 61 63 20 74 6e 61 6d   ()..(((mac tnam
76a0: 65 20 65 74 79 70 65 20 65 78 70 72 29 20 6c 69  e etype expr) li
76b0: 6e 65 29 0a 09 20 28 73 79 6e 74 61 78 0a 09 20  ne).. (syntax.. 
76c0: 20 28 6c 65 74 2a 20 28 28 72 20 28 74 65 73 74   (let* ((r (test
76d0: 2d 72 75 6e 6e 65 72 2d 67 65 74 29 29 0a 09 09  -runner-get))...
76e0: 20 28 6e 61 6d 65 20 74 6e 61 6d 65 29 29 0a 09   (name tname))..
76f0: 20 20 20 20 28 74 65 73 74 2d 72 65 73 75 6c 74      (test-result
7700: 2d 61 6c 69 73 74 21 20 72 20 28 63 6f 6e 73 20  -alist! r (cons 
7710: 28 63 6f 6e 73 20 27 74 65 73 74 2d 6e 61 6d 65  (cons 'test-name
7720: 20 74 6e 61 6d 65 29 20 6c 69 6e 65 29 29 0a 09   tname) line))..
7730: 20 20 20 20 28 25 74 65 73 74 2d 65 72 72 6f 72      (%test-error
7740: 20 72 20 65 74 79 70 65 20 65 78 70 72 29 29 29   r etype expr)))
7750: 29 0a 09 28 28 28 6d 61 63 20 65 74 79 70 65 20  )..(((mac etype 
7760: 65 78 70 72 29 20 6c 69 6e 65 29 0a 09 20 28 73  expr) line).. (s
7770: 79 6e 74 61 78 0a 09 20 20 28 6c 65 74 2a 20 28  yntax..  (let* (
7780: 28 72 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d  (r (test-runner-
7790: 67 65 74 29 29 29 0a 09 20 20 20 20 28 74 65 73  get)))..    (tes
77a0: 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73 74 21 20  t-result-alist! 
77b0: 72 20 6c 69 6e 65 29 0a 09 20 20 20 20 28 25 74  r line)..    (%t
77c0: 65 73 74 2d 65 72 72 6f 72 20 72 20 65 74 79 70  est-error r etyp
77d0: 65 20 65 78 70 72 29 29 29 29 0a 09 28 28 28 6d  e expr))))..(((m
77e0: 61 63 20 65 78 70 72 29 20 6c 69 6e 65 29 0a 09  ac expr) line)..
77f0: 20 28 73 79 6e 74 61 78 0a 09 20 20 28 6c 65 74   (syntax..  (let
7800: 2a 20 28 28 72 20 28 74 65 73 74 2d 72 75 6e 6e  * ((r (test-runn
7810: 65 72 2d 67 65 74 29 29 29 0a 09 20 20 20 20 28  er-get)))..    (
7820: 74 65 73 74 2d 72 65 73 75 6c 74 2d 61 6c 69 73  test-result-alis
7830: 74 21 20 72 20 6c 69 6e 65 29 0a 09 20 20 20 20  t! r line)..    
7840: 28 25 74 65 73 74 2d 65 72 72 6f 72 20 72 20 23  (%test-error r #
7850: 74 20 65 78 70 72 29 29 29 29 29 29 29 29 0a 20  t expr)))))))). 
7860: 28 65 6c 73 65 0a 20 20 28 64 65 66 69 6e 65 2d  (else.  (define-
7870: 73 79 6e 74 61 78 20 74 65 73 74 2d 65 72 72 6f  syntax test-erro
7880: 72 0a 20 20 20 20 28 73 79 6e 74 61 78 2d 72 75  r.    (syntax-ru
7890: 6c 65 73 20 28 29 0a 20 20 20 20 20 20 28 28 74  les ().      ((t
78a0: 65 73 74 2d 65 72 72 6f 72 20 6e 61 6d 65 20 65  est-error name e
78b0: 74 79 70 65 20 65 78 70 72 29 0a 20 20 20 20 20  type expr).     
78c0: 20 20 28 74 65 73 74 2d 61 73 73 65 72 74 20 6e    (test-assert n
78d0: 61 6d 65 20 28 25 74 65 73 74 2d 65 72 72 6f 72  ame (%test-error
78e0: 20 65 74 79 70 65 20 65 78 70 72 29 29 29 0a 20   etype expr))). 
78f0: 20 20 20 20 20 28 28 74 65 73 74 2d 65 72 72 6f       ((test-erro
7900: 72 20 65 74 79 70 65 20 65 78 70 72 29 0a 20 20  r etype expr).  
7910: 20 20 20 20 20 28 74 65 73 74 2d 61 73 73 65 72       (test-asser
7920: 74 20 28 25 74 65 73 74 2d 65 72 72 6f 72 20 65  t (%test-error e
7930: 74 79 70 65 20 65 78 70 72 29 29 29 0a 20 20 20  type expr))).   
7940: 20 20 20 28 28 74 65 73 74 2d 65 72 72 6f 72 20     ((test-error 
7950: 65 78 70 72 29 0a 20 20 20 20 20 20 20 28 74 65  expr).       (te
7960: 73 74 2d 61 73 73 65 72 74 20 28 25 74 65 73 74  st-assert (%test
7970: 2d 65 72 72 6f 72 20 23 74 20 65 78 70 72 29 29  -error #t expr))
7980: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  )))))..(define (
7990: 74 65 73 74 2d 61 70 70 6c 79 20 66 69 72 73 74  test-apply first
79a0: 20 2e 20 72 65 73 74 29 0a 20 20 28 69 66 20 28   . rest).  (if (
79b0: 74 65 73 74 2d 72 75 6e 6e 65 72 3f 20 66 69 72  test-runner? fir
79c0: 73 74 29 0a 20 20 20 20 20 20 28 74 65 73 74 2d  st).      (test-
79d0: 77 69 74 68 2d 72 75 6e 6e 65 72 20 66 69 72 73  with-runner firs
79e0: 74 20 28 61 70 70 6c 79 20 74 65 73 74 2d 61 70  t (apply test-ap
79f0: 70 6c 79 20 72 65 73 74 29 29 0a 20 20 20 20 20  ply rest)).     
7a00: 20 28 6c 65 74 20 28 28 72 20 28 74 65 73 74 2d   (let ((r (test-
7a10: 72 75 6e 6e 65 72 2d 63 75 72 72 65 6e 74 29 29  runner-current))
7a20: 29 0a 09 28 69 66 20 72 0a 09 20 20 20 20 28 6c  )..(if r..    (l
7a30: 65 74 20 28 28 72 75 6e 2d 6c 69 73 74 20 28 25  et ((run-list (%
7a40: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 72 75 6e 2d  test-runner-run-
7a50: 6c 69 73 74 20 72 29 29 29 0a 09 20 20 20 20 20  list r)))..     
7a60: 20 28 63 6f 6e 64 20 28 28 6e 75 6c 6c 3f 20 72   (cond ((null? r
7a70: 65 73 74 29 0a 09 09 20 20 20 20 20 28 25 74 65  est)...     (%te
7a80: 73 74 2d 72 75 6e 6e 65 72 2d 72 75 6e 2d 6c 69  st-runner-run-li
7a90: 73 74 21 20 72 20 28 72 65 76 65 72 73 65 21 20  st! r (reverse! 
7aa0: 72 75 6e 2d 6c 69 73 74 29 29 0a 09 09 20 20 20  run-list))...   
7ab0: 20 20 28 66 69 72 73 74 29 29 20 3b 3b 20 61 63    (first)) ;; ac
7ac0: 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 70 72 6f  tually apply pro
7ad0: 63 65 64 75 72 65 20 74 68 75 6e 6b 0a 09 09 20  cedure thunk... 
7ae0: 20 20 20 28 65 6c 73 65 0a 09 09 20 20 20 20 20     (else...     
7af0: 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d 72 75  (%test-runner-ru
7b00: 6e 2d 6c 69 73 74 21 0a 09 09 20 20 20 20 20 20  n-list!...      
7b10: 72 0a 09 09 20 20 20 20 20 20 28 69 66 20 28 65  r...      (if (e
7b20: 71 3f 20 72 75 6e 2d 6c 69 73 74 20 23 74 29 20  q? run-list #t) 
7b30: 28 6c 69 73 74 20 66 69 72 73 74 29 20 28 63 6f  (list first) (co
7b40: 6e 73 20 66 69 72 73 74 20 72 75 6e 2d 6c 69 73  ns first run-lis
7b50: 74 29 29 29 0a 09 09 20 20 20 20 20 28 61 70 70  t)))...     (app
7b60: 6c 79 20 74 65 73 74 2d 61 70 70 6c 79 20 72 65  ly test-apply re
7b70: 73 74 29 0a 09 09 20 20 20 20 20 28 25 74 65 73  st)...     (%tes
7b80: 74 2d 72 75 6e 6e 65 72 2d 72 75 6e 2d 6c 69 73  t-runner-run-lis
7b90: 74 21 20 72 20 72 75 6e 2d 6c 69 73 74 29 29 29  t! r run-list)))
7ba0: 29 0a 09 20 20 20 20 28 6c 65 74 20 28 28 72 20  )..    (let ((r 
7bb0: 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63 72 65  (test-runner-cre
7bc0: 61 74 65 29 29 29 0a 09 20 20 20 20 20 20 28 74  ate)))..      (t
7bd0: 65 73 74 2d 77 69 74 68 2d 72 75 6e 6e 65 72 20  est-with-runner 
7be0: 72 20 28 61 70 70 6c 79 20 74 65 73 74 2d 61 70  r (apply test-ap
7bf0: 70 6c 79 20 66 69 72 73 74 20 72 65 73 74 29 29  ply first rest))
7c00: 0a 09 20 20 20 20 20 20 28 28 74 65 73 74 2d 72  ..      ((test-r
7c10: 75 6e 6e 65 72 2d 6f 6e 2d 66 69 6e 61 6c 20 72  unner-on-final r
7c20: 29 20 72 29 29 29 29 29 29 0a 0a 28 64 65 66 69  ) r))))))..(defi
7c30: 6e 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d 77  ne-syntax test-w
7c40: 69 74 68 2d 72 75 6e 6e 65 72 0a 20 20 28 73 79  ith-runner.  (sy
7c50: 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20  ntax-rules ().  
7c60: 20 20 28 28 74 65 73 74 2d 77 69 74 68 2d 72 75    ((test-with-ru
7c70: 6e 6e 65 72 20 72 75 6e 6e 65 72 20 66 6f 72 6d  nner runner form
7c80: 20 2e 2e 2e 29 0a 20 20 20 20 20 28 6c 65 74 20   ...).     (let 
7c90: 28 28 73 61 76 65 64 2d 72 75 6e 6e 65 72 20 28  ((saved-runner (
7ca0: 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63 75 72 72  test-runner-curr
7cb0: 65 6e 74 29 29 29 0a 20 20 20 20 20 20 20 28 64  ent))).       (d
7cc0: 79 6e 61 6d 69 63 2d 77 69 6e 64 0a 20 20 20 20  ynamic-wind.    
7cd0: 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28         (lambda (
7ce0: 29 20 28 74 65 73 74 2d 72 75 6e 6e 65 72 2d 63  ) (test-runner-c
7cf0: 75 72 72 65 6e 74 20 72 75 6e 6e 65 72 29 29 0a  urrent runner)).
7d00: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62             (lamb
7d10: 64 61 20 28 29 20 66 6f 72 6d 20 2e 2e 2e 29 0a  da () form ...).
7d20: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62             (lamb
7d30: 64 61 20 28 29 20 28 74 65 73 74 2d 72 75 6e 6e  da () (test-runn
7d40: 65 72 2d 63 75 72 72 65 6e 74 20 73 61 76 65 64  er-current saved
7d50: 2d 72 75 6e 6e 65 72 29 29 29 29 29 29 29 0a 0a  -runner)))))))..
7d60: 3b 3b 3b 20 50 72 65 64 69 63 61 74 65 73 0a 0a  ;;; Predicates..
7d70: 28 64 65 66 69 6e 65 20 28 25 74 65 73 74 2d 6d  (define (%test-m
7d80: 61 74 63 68 2d 6e 74 68 20 6e 20 63 6f 75 6e 74  atch-nth n count
7d90: 29 0a 20 20 28 6c 65 74 20 28 28 69 20 30 29 29  ).  (let ((i 0))
7da0: 0a 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75  .    (lambda (ru
7db0: 6e 6e 65 72 29 0a 20 20 20 20 20 20 28 73 65 74  nner).      (set
7dc0: 21 20 69 20 28 2b 20 69 20 31 29 29 0a 20 20 20  ! i (+ i 1)).   
7dd0: 20 20 20 28 61 6e 64 20 28 3e 3d 20 69 20 6e 29     (and (>= i n)
7de0: 20 28 3c 20 69 20 28 2b 20 6e 20 63 6f 75 6e 74   (< i (+ n count
7df0: 29 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 2d  ))))))..(define-
7e00: 73 79 6e 74 61 78 20 74 65 73 74 2d 6d 61 74 63  syntax test-matc
7e10: 68 2d 6e 74 68 0a 20 20 28 73 79 6e 74 61 78 2d  h-nth.  (syntax-
7e20: 72 75 6c 65 73 20 28 29 0a 20 20 20 20 28 28 74  rules ().    ((t
7e30: 65 73 74 2d 6d 61 74 63 68 2d 6e 74 68 20 6e 29  est-match-nth n)
7e40: 0a 20 20 20 20 20 28 74 65 73 74 2d 6d 61 74 63  .     (test-matc
7e50: 68 2d 6e 74 68 20 6e 20 31 29 29 0a 20 20 20 20  h-nth n 1)).    
7e60: 28 28 74 65 73 74 2d 6d 61 74 63 68 2d 6e 74 68  ((test-match-nth
7e70: 20 6e 20 63 6f 75 6e 74 29 0a 20 20 20 20 20 28   n count).     (
7e80: 25 74 65 73 74 2d 6d 61 74 63 68 2d 6e 74 68 20  %test-match-nth 
7e90: 6e 20 63 6f 75 6e 74 29 29 29 29 0a 0a 28 64 65  n count))))..(de
7ea0: 66 69 6e 65 20 28 25 74 65 73 74 2d 6d 61 74 63  fine (%test-matc
7eb0: 68 2d 61 6c 6c 20 2e 20 70 72 65 64 2d 6c 69 73  h-all . pred-lis
7ec0: 74 29 0a 20 20 28 6c 61 6d 62 64 61 20 28 72 75  t).  (lambda (ru
7ed0: 6e 6e 65 72 29 0a 20 20 20 20 28 6c 65 74 20 28  nner).    (let (
7ee0: 28 72 65 73 75 6c 74 20 23 74 29 29 0a 20 20 20  (result #t)).   
7ef0: 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c     (let loop ((l
7f00: 20 70 72 65 64 2d 6c 69 73 74 29 29 0a 09 28 69   pred-list))..(i
7f10: 66 20 28 6e 75 6c 6c 3f 20 6c 29 0a 09 20 20 20  f (null? l)..   
7f20: 20 72 65 73 75 6c 74 0a 09 20 20 20 20 28 62 65   result..    (be
7f30: 67 69 6e 0a 09 20 20 20 20 20 20 28 69 66 20 28  gin..      (if (
7f40: 6e 6f 74 20 28 28 63 61 72 20 6c 29 20 72 75 6e  not ((car l) run
7f50: 6e 65 72 29 29 0a 09 09 20 20 28 73 65 74 21 20  ner))...  (set! 
7f60: 72 65 73 75 6c 74 20 23 66 29 29 0a 09 20 20 20  result #f))..   
7f70: 20 20 20 28 6c 6f 6f 70 20 28 63 64 72 20 6c 29     (loop (cdr l)
7f80: 29 29 29 29 29 29 29 0a 20 20 0a 28 64 65 66 69  ))))))).  .(defi
7f90: 6e 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d 6d  ne-syntax test-m
7fa0: 61 74 63 68 2d 61 6c 6c 0a 20 20 28 73 79 6e 74  atch-all.  (synt
7fb0: 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20  ax-rules ().    
7fc0: 28 28 74 65 73 74 2d 6d 61 74 63 68 2d 61 6c 6c  ((test-match-all
7fd0: 20 70 72 65 64 20 2e 2e 2e 29 0a 20 20 20 20 20   pred ...).     
7fe0: 28 25 74 65 73 74 2d 6d 61 74 63 68 2d 61 6c 6c  (%test-match-all
7ff0: 20 28 25 74 65 73 74 2d 61 73 2d 73 70 65 63 69   (%test-as-speci
8000: 66 69 65 72 20 70 72 65 64 29 20 2e 2e 2e 29 29  fier pred) ...))
8010: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 25 74 65  ))..(define (%te
8020: 73 74 2d 6d 61 74 63 68 2d 61 6e 79 20 2e 20 70  st-match-any . p
8030: 72 65 64 2d 6c 69 73 74 29 0a 20 20 28 6c 61 6d  red-list).  (lam
8040: 62 64 61 20 28 72 75 6e 6e 65 72 29 0a 20 20 20  bda (runner).   
8050: 20 28 6c 65 74 20 28 28 72 65 73 75 6c 74 20 23   (let ((result #
8060: 66 29 29 0a 20 20 20 20 20 20 28 6c 65 74 20 6c  f)).      (let l
8070: 6f 6f 70 20 28 28 6c 20 70 72 65 64 2d 6c 69 73  oop ((l pred-lis
8080: 74 29 29 0a 09 28 69 66 20 28 6e 75 6c 6c 3f 20  t))..(if (null? 
8090: 6c 29 0a 09 20 20 20 20 72 65 73 75 6c 74 0a 09  l)..    result..
80a0: 20 20 20 20 28 62 65 67 69 6e 0a 09 20 20 20 20      (begin..    
80b0: 20 20 28 69 66 20 28 28 63 61 72 20 6c 29 20 72    (if ((car l) r
80c0: 75 6e 6e 65 72 29 0a 09 09 20 20 28 73 65 74 21  unner)...  (set!
80d0: 20 72 65 73 75 6c 74 20 23 74 29 29 0a 09 20 20   result #t))..  
80e0: 20 20 20 20 28 6c 6f 6f 70 20 28 63 64 72 20 6c      (loop (cdr l
80f0: 29 29 29 29 29 29 29 29 0a 20 20 0a 28 64 65 66  )))))))).  .(def
8100: 69 6e 65 2d 73 79 6e 74 61 78 20 74 65 73 74 2d  ine-syntax test-
8110: 6d 61 74 63 68 2d 61 6e 79 0a 20 20 28 73 79 6e  match-any.  (syn
8120: 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20  tax-rules ().   
8130: 20 28 28 74 65 73 74 2d 6d 61 74 63 68 2d 61 6e   ((test-match-an
8140: 79 20 70 72 65 64 20 2e 2e 2e 29 0a 20 20 20 20  y pred ...).    
8150: 20 28 25 74 65 73 74 2d 6d 61 74 63 68 2d 61 6e   (%test-match-an
8160: 79 20 28 25 74 65 73 74 2d 61 73 2d 73 70 65 63  y (%test-as-spec
8170: 69 66 69 65 72 20 70 72 65 64 29 20 2e 2e 2e 29  ifier pred) ...)
8180: 29 29 29 0a 0a 3b 3b 20 43 6f 65 72 63 65 20 74  )))..;; Coerce t
8190: 6f 20 61 20 70 72 65 64 69 63 61 74 65 20 66 75  o a predicate fu
81a0: 6e 63 74 69 6f 6e 3a 0a 28 64 65 66 69 6e 65 20  nction:.(define 
81b0: 28 25 74 65 73 74 2d 61 73 2d 73 70 65 63 69 66  (%test-as-specif
81c0: 69 65 72 20 73 70 65 63 69 66 69 65 72 29 0a 20  ier specifier). 
81d0: 20 28 63 6f 6e 64 20 28 28 70 72 6f 63 65 64 75   (cond ((procedu
81e0: 72 65 3f 20 73 70 65 63 69 66 69 65 72 29 20 73  re? specifier) s
81f0: 70 65 63 69 66 69 65 72 29 0a 09 28 28 69 6e 74  pecifier)..((int
8200: 65 67 65 72 3f 20 73 70 65 63 69 66 69 65 72 29  eger? specifier)
8210: 20 28 74 65 73 74 2d 6d 61 74 63 68 2d 6e 74 68   (test-match-nth
8220: 20 31 20 73 70 65 63 69 66 69 65 72 29 29 0a 09   1 specifier))..
8230: 28 28 73 74 72 69 6e 67 3f 20 73 70 65 63 69 66  ((string? specif
8240: 69 65 72 29 20 28 74 65 73 74 2d 6d 61 74 63 68  ier) (test-match
8250: 2d 6e 61 6d 65 20 73 70 65 63 69 66 69 65 72 29  -name specifier)
8260: 29 0a 09 28 65 6c 73 65 0a 09 20 28 65 72 72 6f  )..(else.. (erro
8270: 72 20 22 6e 6f 74 20 61 20 76 61 6c 69 64 20 74  r "not a valid t
8280: 65 73 74 20 73 70 65 63 69 66 69 65 72 22 29 29  est specifier"))
8290: 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74  ))..(define-synt
82a0: 61 78 20 74 65 73 74 2d 73 6b 69 70 0a 20 20 28  ax test-skip.  (
82b0: 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a  syntax-rules ().
82c0: 20 20 20 20 28 28 74 65 73 74 2d 73 6b 69 70 20      ((test-skip 
82d0: 70 72 65 64 20 2e 2e 2e 29 0a 20 20 20 20 20 28  pred ...).     (
82e0: 6c 65 74 20 28 28 72 75 6e 6e 65 72 20 28 74 65  let ((runner (te
82f0: 73 74 2d 72 75 6e 6e 65 72 2d 67 65 74 29 29 29  st-runner-get)))
8300: 0a 20 20 20 20 20 20 20 28 25 74 65 73 74 2d 72  .       (%test-r
8310: 75 6e 6e 65 72 2d 73 6b 69 70 2d 6c 69 73 74 21  unner-skip-list!
8320: 20 72 75 6e 6e 65 72 0a 09 09 09 09 20 20 28 63   runner.....  (c
8330: 6f 6e 73 20 28 74 65 73 74 2d 6d 61 74 63 68 2d  ons (test-match-
8340: 61 6c 6c 20 28 25 74 65 73 74 2d 61 73 2d 73 70  all (%test-as-sp
8350: 65 63 69 66 69 65 72 20 70 72 65 64 29 20 20 2e  ecifier pred)  .
8360: 2e 2e 29 0a 09 09 09 09 09 28 25 74 65 73 74 2d  ..)......(%test-
8370: 72 75 6e 6e 65 72 2d 73 6b 69 70 2d 6c 69 73 74  runner-skip-list
8380: 20 72 75 6e 6e 65 72 29 29 29 29 29 29 29 0a 0a   runner)))))))..
8390: 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 74  (define-syntax t
83a0: 65 73 74 2d 65 78 70 65 63 74 2d 66 61 69 6c 0a  est-expect-fail.
83b0: 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20    (syntax-rules 
83c0: 28 29 0a 20 20 20 20 28 28 74 65 73 74 2d 65 78  ().    ((test-ex
83d0: 70 65 63 74 2d 66 61 69 6c 20 70 72 65 64 20 2e  pect-fail pred .
83e0: 2e 2e 29 0a 20 20 20 20 20 28 6c 65 74 20 28 28  ..).     (let ((
83f0: 72 75 6e 6e 65 72 20 28 74 65 73 74 2d 72 75 6e  runner (test-run
8400: 6e 65 72 2d 67 65 74 29 29 29 0a 20 20 20 20 20  ner-get))).     
8410: 20 20 28 25 74 65 73 74 2d 72 75 6e 6e 65 72 2d    (%test-runner-
8420: 66 61 69 6c 2d 6c 69 73 74 21 20 72 75 6e 6e 65  fail-list! runne
8430: 72 0a 09 09 09 09 20 20 28 63 6f 6e 73 20 28 74  r.....  (cons (t
8440: 65 73 74 2d 6d 61 74 63 68 2d 61 6c 6c 20 28 25  est-match-all (%
8450: 74 65 73 74 2d 61 73 2d 73 70 65 63 69 66 69 65  test-as-specifie
8460: 72 20 70 72 65 64 29 20 20 2e 2e 2e 29 0a 09 09  r pred)  ...)...
8470: 09 09 09 28 25 74 65 73 74 2d 72 75 6e 6e 65 72  ...(%test-runner
8480: 2d 66 61 69 6c 2d 6c 69 73 74 20 72 75 6e 6e 65  -fail-list runne
8490: 72 29 29 29 29 29 29 29 0a 0a 28 64 65 66 69 6e  r)))))))..(defin
84a0: 65 20 28 74 65 73 74 2d 6d 61 74 63 68 2d 6e 61  e (test-match-na
84b0: 6d 65 20 6e 61 6d 65 29 0a 20 20 28 6c 61 6d 62  me name).  (lamb
84c0: 64 61 20 28 72 75 6e 6e 65 72 29 0a 20 20 20 20  da (runner).    
84d0: 28 65 71 75 61 6c 3f 20 6e 61 6d 65 20 28 74 65  (equal? name (te
84e0: 73 74 2d 72 75 6e 6e 65 72 2d 74 65 73 74 2d 6e  st-runner-test-n
84f0: 61 6d 65 20 72 75 6e 6e 65 72 29 29 29 29 0a 0a  ame runner))))..
8500: 28 64 65 66 69 6e 65 20 28 74 65 73 74 2d 72 65  (define (test-re
8510: 61 64 2d 65 76 61 6c 2d 73 74 72 69 6e 67 20 73  ad-eval-string s
8520: 74 72 69 6e 67 29 0a 20 20 28 6c 65 74 2a 20 28  tring).  (let* (
8530: 28 70 6f 72 74 20 28 6f 70 65 6e 2d 69 6e 70 75  (port (open-inpu
8540: 74 2d 73 74 72 69 6e 67 20 73 74 72 69 6e 67 29  t-string string)
8550: 29 0a 09 20 28 66 6f 72 6d 20 28 72 65 61 64 20  ).. (form (read 
8560: 70 6f 72 74 29 29 29 0a 20 20 20 20 28 69 66 20  port))).    (if 
8570: 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20 28 72 65  (eof-object? (re
8580: 61 64 2d 63 68 61 72 20 70 6f 72 74 29 29 0a 09  ad-char port))..
8590: 28 65 76 61 6c 20 66 6f 72 6d 29 0a 09 28 63 6f  (eval form)..(co
85a0: 6e 64 2d 65 78 70 61 6e 64 0a 09 20 28 73 72 66  nd-expand.. (srf
85b0: 69 2d 32 33 20 28 65 72 72 6f 72 20 22 28 6e 6f  i-23 (error "(no
85c0: 74 20 61 74 20 65 6f 66 29 22 29 29 0a 09 20 28  t at eof)")).. (
85d0: 65 6c 73 65 20 22 65 72 72 6f 72 22 29 29 29 29  else "error"))))
85e0: 29 0a 0a                                         )..