version 1.1, 2007/08/19 21:33:50
|
version 1.13, 2008/11/08 18:34:18
|
Line 1
|
Line 1
|
|
\ for the original tester |
\ From: John Hayes S1I |
\ From: John Hayes S1I |
\ Subject: tester.fr |
\ Subject: tester.fr |
\ Date: Mon, 27 Nov 95 13:10:09 PST |
\ Date: Mon, 27 Nov 95 13:10:09 PST |
|
|
\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY |
\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY |
\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS. |
\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS. |
\ VERSION 1.1 |
\ VERSION 1.1 |
|
|
\ revised by Anton Ertl 2007-08-12, 2007-08-19 |
\ for the FNEARLY= stuff: |
|
\ from ftester.fs written by David N. Williams, based on the idea of |
|
\ approximate equality in Dirk Zoller's float.4th |
|
\ public domain |
|
|
|
\ for the rest: |
|
\ revised by Anton Ertl |
|
\ public domain |
|
|
\ The original has the following shortcomings: |
\ The original has the following shortcomings: |
|
|
\ - It does not work as expected if the stack is non-empty before the {. |
\ - It does not work as expected if the stack is non-empty before the {. |
Line 21
|
Line 29
|
\ http://www.forth200x.org/tests/tester.fs |
\ http://www.forth200x.org/tests/tester.fs |
\ http://www.forth200x.org/tests/ttester.fs |
\ http://www.forth200x.org/tests/ttester.fs |
|
|
|
\ for history and possibly newer versions you can also look at |
|
\ http://www.complang.tuwien.ac.at/cvsweb/cgi-bin/cvsweb/gforth/test/ttester.fs |
|
|
\ tester.fs is intended to be a drop-in replacement of the original. |
\ tester.fs is intended to be a drop-in replacement of the original. |
\ ttester.fs is a version that uses T{ and }T instead of { and }. |
|
|
\ ttester.fs is a version that uses T{ and }T instead of { and } and |
|
\ keeps the BASE as it was before loading ttester.fs |
|
|
\ In spirit of the original, I have strived to avoid any potential |
\ In spirit of the original, I have strived to avoid any potential |
\ non-portabilities and stayed as much within the CORE words as |
\ non-portabilities and stayed as much within the CORE words as |
Line 31
|
Line 44
|
|
|
\ There are a few things to be noted: |
\ There are a few things to be noted: |
|
|
\ - Following the despicable practice of the original, this version |
\ - Loading ttester.fs does not change BASE. Loading tester.fs |
\ sets the base to HEX for everything that gets loaded later. |
\ changes BASE to HEX (like the original tester). Floating-point |
\ Floating-point input is ambiguous when the base is not decimal, so |
\ input is ambiguous when the base is not decimal, so you have to set |
\ you have to set it to decimal yourself when you want to deal with |
\ it to decimal yourself when you want to deal with decimal numbers. |
\ decimal numbers. |
|
|
|
\ - For FP it is often useful to use approximate equality for checking |
\ - For FP it is often useful to use approximate equality for checking |
\ the results. You can turn on approximate matching with SET-NEAR |
\ the results. You can turn on approximate matching with SET-NEAR |
Line 50
|
Line 62
|
\ system or if you need only exact matching, you can use the plain }T |
\ system or if you need only exact matching, you can use the plain }T |
\ instead. |
\ instead. |
|
|
|
BASE @ |
HEX |
HEX |
|
|
\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY |
\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY |
Line 90 HAS-FLOATING [IF]
|
Line 103 HAS-FLOATING [IF]
|
\ SET THE FOLLOWING TO THE RELATIVE AND ABSOLUTE TOLERANCES YOU |
\ SET THE FOLLOWING TO THE RELATIVE AND ABSOLUTE TOLERANCES YOU |
\ WANT FOR APPROXIMATE FLOAT EQUALITY, TO BE USED WITH F~ IN |
\ WANT FOR APPROXIMATE FLOAT EQUALITY, TO BE USED WITH F~ IN |
\ FNEARLY=. KEEP THE SIGNS, BECAUSE F~ NEEDS THEM. |
\ FNEARLY=. KEEP THE SIGNS, BECAUSE F~ NEEDS THEM. |
FVARIABLE FSENSITIVITY DECIMAL 1E-12 HEX FSENSITIVITY F! |
FVARIABLE REL-NEAR DECIMAL 1E-12 HEX REL-NEAR F! |
: REL-NEAR FSENSITIVITY ; |
|
FVARIABLE ABS-NEAR DECIMAL 0E HEX ABS-NEAR F! |
FVARIABLE ABS-NEAR DECIMAL 0E HEX ABS-NEAR F! |
|
|
\ WHEN EXACT? IS TRUE, }F USES FEXACTLY=, OTHERWISE FNEARLY=. |
\ WHEN EXACT? IS TRUE, }F USES FEXACTLY=, OTHERWISE FNEARLY=. |
Line 165 HAS-FLOATING-STACK [IF]
|
Line 177 HAS-FLOATING-STACK [IF]
|
: F-> ( ... -- ... ) |
: F-> ( ... -- ... ) |
FDEPTH DUP ACTUAL-FDEPTH ! |
FDEPTH DUP ACTUAL-FDEPTH ! |
START-FDEPTH @ > IF |
START-FDEPTH @ > IF |
FDEPTH START-FDEPTH @ DO ACTUAL-FRESULTS I FLOATS + F! LOOP |
FDEPTH START-FDEPTH @ - 0 DO ACTUAL-FRESULTS I FLOATS + F! LOOP |
THEN ; |
THEN ; |
|
|
: F} ( ... -- ... ) |
: F} ( ... -- ... ) |
FDEPTH ACTUAL-FDEPTH @ = IF |
FDEPTH ACTUAL-FDEPTH @ = IF |
FDEPTH START-FDEPTH @ > IF |
FDEPTH START-FDEPTH @ > IF |
FDEPTH START-FDEPTH @ DO |
FDEPTH START-FDEPTH @ - 0 DO |
ACTUAL-FRESULTS I FLOATS + F@ FCONF= INVERT IF |
ACTUAL-FRESULTS I FLOATS + F@ FCONF= INVERT IF |
S" INCORRECT FP RESULT: " ERROR LEAVE |
S" INCORRECT FP RESULT: " ERROR LEAVE |
THEN |
THEN |
Line 182 HAS-FLOATING-STACK [IF]
|
Line 194 HAS-FLOATING-STACK [IF]
|
THEN ; |
THEN ; |
|
|
: F...}T ( -- ) |
: F...}T ( -- ) |
FDEPTH START-FDEPTH @ = 0= IF |
FCURSOR @ START-FDEPTH @ + ACTUAL-FDEPTH @ <> IF |
S" WRONG NUMBER OF FP RESULTS" ERROR |
S" NUMBER OF FLOAT RESULTS BEFORE '->' DOES NOT MATCH ...}T SPECIFICATION: " ERROR |
THEN |
ELSE FDEPTH START-FDEPTH @ = 0= IF |
FCURSOR @ ACTUAL-FDEPTH @ <> IF |
S" NUMBER OF FLOAT RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR |
S" WRONG NUMBER OF FP RESULTS" ERROR |
THEN THEN ; |
THEN ; |
|
|
|
: FTESTER ( R -- ) |
: FTESTER ( R -- ) |
FDEPTH 0= ACTUAL-FDEPTH @ FCURSOR @ 1+ < OR IF |
FDEPTH 0= ACTUAL-FDEPTH @ FCURSOR @ START-FDEPTH @ + 1+ < OR IF |
S" WRONG NUMBER OF FP RESULTS: " ERROR EXIT |
S" NUMBER OF FLOAT RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR |
THEN |
ELSE ACTUAL-FRESULTS FCURSOR @ FLOATS + F@ FCONF= 0= IF |
ACTUAL-FRESULTS FCURSOR @ FLOATS + F@ FCONF= 0= IF |
|
S" INCORRECT FP RESULT: " ERROR |
S" INCORRECT FP RESULT: " ERROR |
THEN |
THEN THEN |
1 FCURSOR +! ; |
1 FCURSOR +! ; |
|
|
[ELSE] |
[ELSE] |
Line 205 HAS-FLOATING-STACK [IF]
|
Line 216 HAS-FLOATING-STACK [IF]
|
: F} ; |
: F} ; |
: F...}T ; |
: F...}T ; |
|
|
|
HAS-FLOATING [IF] |
|
DECIMAL |
: COMPUTE-CELLS-PER-FP ( -- U ) |
: COMPUTE-CELLS-PER-FP ( -- U ) |
DEPTH 0E DEPTH >R FDROP R> SWAP - ; |
DEPTH 0E DEPTH 1- >R FDROP R> SWAP - ; |
|
HEX |
|
|
COMPUTE-CELLS-PER-FP CONSTANT CELLS-PER-FP |
COMPUTE-CELLS-PER-FP CONSTANT CELLS-PER-FP |
|
|
: FTESTER ( R -- ) |
: FTESTER ( R -- ) |
DEPTH CELLS-PER-FP < ACTUAL-DEPTH @ XCURSOR @ CELLS-PER-FP + < OR IF |
DEPTH CELLS-PER-FP < ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + CELLS-PER-FP + < OR IF |
S" WRONG NUMBER OF RESULTS: " ERROR EXIT |
S" NUMBER OF RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT |
THEN |
ELSE ACTUAL-RESULTS XCURSOR @ CELLS + F@ FCONF= 0= IF |
ACTUAL-RESULTS XCURSOR @ CELLS + F@ FCONF= 0= IF |
|
S" INCORRECT FP RESULT: " ERROR |
S" INCORRECT FP RESULT: " ERROR |
THEN |
THEN THEN |
CELLS-PER-FP XCURSOR +! ; |
CELLS-PER-FP XCURSOR +! ; |
[THEN] |
[THEN] |
|
[THEN] |
|
|
: EMPTY-STACK \ ( ... -- ) EMPTY STACK: HANDLES UNDERFLOWED STACK TOO. |
: EMPTY-STACK \ ( ... -- ) EMPTY STACK: HANDLES UNDERFLOWED STACK TOO. |
DEPTH START-DEPTH @ < IF |
DEPTH START-DEPTH @ < IF |
Line 238 HAS-FLOATING-STACK [IF]
|
Line 252 HAS-FLOATING-STACK [IF]
|
' ERROR1 ERROR-XT ! |
' ERROR1 ERROR-XT ! |
|
|
: T{ \ ( -- ) SYNTACTIC SUGAR. |
: T{ \ ( -- ) SYNTACTIC SUGAR. |
DEPTH START-DEPTH ! F{ ; |
DEPTH START-DEPTH ! 0 XCURSOR ! F{ ; |
|
|
: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK. |
: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK. |
DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH |
DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH |
START-DEPTH @ > IF \ IF THERE IS SOMETHING ON STACK |
START-DEPTH @ > IF \ IF THERE IS SOMETHING ON STACK |
DEPTH START-DEPTH @ DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM |
DEPTH START-DEPTH @ - 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM |
THEN |
THEN |
F-> ; |
F-> ; |
|
|
Line 251 HAS-FLOATING-STACK [IF]
|
Line 265 HAS-FLOATING-STACK [IF]
|
\ (ACTUAL) CONTENTS. |
\ (ACTUAL) CONTENTS. |
DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH |
DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH |
DEPTH START-DEPTH @ > IF \ IF THERE IS SOMETHING ON THE STACK |
DEPTH START-DEPTH @ > IF \ IF THERE IS SOMETHING ON THE STACK |
DEPTH START-DEPTH @ DO \ FOR EACH STACK ITEM |
DEPTH START-DEPTH @ - 0 DO \ FOR EACH STACK ITEM |
ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED |
ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED |
<> IF S" INCORRECT RESULT: " ERROR LEAVE THEN |
<> IF S" INCORRECT RESULT: " ERROR LEAVE THEN |
LOOP |
LOOP |
Line 262 HAS-FLOATING-STACK [IF]
|
Line 276 HAS-FLOATING-STACK [IF]
|
F} ; |
F} ; |
|
|
: ...}T ( -- ) |
: ...}T ( -- ) |
DEPTH START-DEPTH @ = 0= IF |
XCURSOR @ START-DEPTH @ + ACTUAL-DEPTH @ <> IF |
S" WRONG NUMBER OF RESULTS" ERROR |
S" NUMBER OF CELL RESULTS BEFORE '->' DOES NOT MATCH ...}T SPECIFICATION: " ERROR |
THEN |
ELSE DEPTH START-DEPTH @ = 0= IF |
XCURSOR @ ACTUAL-DEPTH @ <> IF |
S" NUMBER OF CELL RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR |
S" WRONG NUMBER OF RESULTS" ERROR |
THEN THEN |
THEN |
|
F...}T ; |
F...}T ; |
|
|
: XTESTER ( X -- ) |
: XTESTER ( X -- ) |
DEPTH 0= ACTUAL-DEPTH @ XCURSOR @ 1+ < OR IF |
DEPTH 0= ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + 1+ < OR IF |
S" WRONG NUMBER OF RESULTS: " ERROR EXIT |
S" NUMBER OF CELL RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT |
THEN |
ELSE ACTUAL-RESULTS XCURSOR @ CELLS + @ <> IF |
ACTUAL-RESULTS XCURSOR @ CELLS + @ <> IF |
|
S" INCORRECT CELL RESULT: " ERROR |
S" INCORRECT CELL RESULT: " ERROR |
THEN |
THEN THEN |
1 XCURSOR +! ; |
1 XCURSOR +! ; |
|
|
: X}T XTESTER ...}T ; |
: X}T XTESTER ...}T ; |
: R}T FTESTER ...}T ; |
|
: XX}T XTESTER XTESTER ...}T ; |
: XX}T XTESTER XTESTER ...}T ; |
|
: XXX}T XTESTER XTESTER XTESTER ...}T ; |
|
: XXXX}T XTESTER XTESTER XTESTER XTESTER ...}T ; |
|
|
|
HAS-FLOATING [IF] |
|
: R}T FTESTER ...}T ; |
: XR}T FTESTER XTESTER ...}T ; |
: XR}T FTESTER XTESTER ...}T ; |
: RX}T XTESTER FTESTER ...}T ; |
: RX}T XTESTER FTESTER ...}T ; |
: RR}T FTESTER FTESTER ...}T ; |
: RR}T FTESTER FTESTER ...}T ; |
: XXX}T XTESTER XTESTER XTESTER ...}T ; |
|
: XXR}T FTESTER XTESTER XTESTER ...}T ; |
: XXR}T FTESTER XTESTER XTESTER ...}T ; |
: XRX}T XTESTER FTESTER XTESTER ...}T ; |
: XRX}T XTESTER FTESTER XTESTER ...}T ; |
: XRR}T FTESTER FTESTER XTESTER ...}T ; |
: XRR}T FTESTER FTESTER XTESTER ...}T ; |
Line 293 HAS-FLOATING-STACK [IF]
|
Line 308 HAS-FLOATING-STACK [IF]
|
: RXR}T FTESTER XTESTER FTESTER ...}T ; |
: RXR}T FTESTER XTESTER FTESTER ...}T ; |
: RRX}T XTESTER FTESTER FTESTER ...}T ; |
: RRX}T XTESTER FTESTER FTESTER ...}T ; |
: RRR}T FTESTER FTESTER FTESTER ...}T ; |
: RRR}T FTESTER FTESTER FTESTER ...}T ; |
: XXXX}T XTESTER XTESTER XTESTER XTESTER ...}T ; |
|
: XXXR}T FTESTER XTESTER XTESTER XTESTER ...}T ; |
: XXXR}T FTESTER XTESTER XTESTER XTESTER ...}T ; |
: XXRX}T XTESTER FTESTER XTESTER XTESTER ...}T ; |
: XXRX}T XTESTER FTESTER XTESTER XTESTER ...}T ; |
: XXRR}T FTESTER FTESTER XTESTER XTESTER ...}T ; |
: XXRR}T FTESTER FTESTER XTESTER XTESTER ...}T ; |
Line 309 HAS-FLOATING-STACK [IF]
|
Line 323 HAS-FLOATING-STACK [IF]
|
: RRXR}T FTESTER XTESTER FTESTER FTESTER ...}T ; |
: RRXR}T FTESTER XTESTER FTESTER FTESTER ...}T ; |
: RRRX}T XTESTER FTESTER FTESTER FTESTER ...}T ; |
: RRRX}T XTESTER FTESTER FTESTER FTESTER ...}T ; |
: RRRR}T FTESTER FTESTER FTESTER FTESTER ...}T ; |
: RRRR}T FTESTER FTESTER FTESTER FTESTER ...}T ; |
|
[THEN] |
|
|
: TESTING \ ( -- ) TALKING COMMENT. |
: TESTING \ ( -- ) TALKING COMMENT. |
SOURCE VERBOSE @ |
SOURCE VERBOSE @ |
IF DUP >R TYPE CR R> >IN ! |
IF DUP >R TYPE CR R> >IN ! |
ELSE >IN ! DROP |
ELSE >IN ! DROP |
THEN ; |
THEN ; |
|
|
|
BASE ! |