--- gforth/test/ttester.fs 2007/08/21 09:22:28 1.2 +++ gforth/test/ttester.fs 2007/10/26 12:47:41 1.6 @@ -1,77 +1,65 @@ -\ for the original tester -\ From: John Hayes S1I -\ Subject: tester.fr -\ Date: Mon, 27 Nov 95 13:10:09 PST +\ FOR THE ORIGINAL TESTER +\ FROM: JOHN HAYES S1I +\ SUBJECT: TESTER.FR +\ DATE: MON, 27 NOV 95 13:10:09 PST \ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY \ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS. \ VERSION 1.1 -\ for the FNEARLY= stuff: -\ from ftester.fs written by David N. Williams, based on the -\ approximate equality in Dirk Zoller's float.4th - -\ This library is free software; you can redistribute it and/or -\ modify it under the terms of the GNU Lesser General Public -\ License as published by the Free Software Foundation; either -\ version 2.1 of the License, or at your option any later version. - -\ This library is distributed in the hope that it will be useful, -\ but WITHOUT ANY WARRANTY; without even the implied warranty of -\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -\ Lesser General Public License for more details. - -\ You should have received a copy of the GNU Lesser General Public -\ License along with this library; if not, write to the Free -\ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -\ MA 02111-1307 USA. - -\ for the rest: -\ revised by Anton Ertl 2007-08-12, 2007-08-19 -\ public domain - -\ The original has the following shortcomings: - -\ - It does not work as expected if the stack is non-empty before the {. - -\ - It does not check FP results if the system has a separate FP stack. - -\ - There is a conflict with the use of } for FSL arrays and { for locals. - -\ I have revised it to address these shortcomings. You can find the -\ result at - -\ http://www.forth200x.org/tests/tester.fs -\ http://www.forth200x.org/tests/ttester.fs - -\ 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 }. - -\ In spirit of the original, I have strived to avoid any potential -\ non-portabilities and stayed as much within the CORE words as -\ possible; e.g., FLOATING words are used only if the FLOATING wordset -\ is present - -\ There are a few things to be noted: - -\ - Following the despicable practice of the original, this version -\ sets the base to HEX for everything that gets loaded later. -\ Floating-point input is ambiguous when the base is not decimal, so -\ you have to set it to decimal yourself when you want to deal with -\ decimal numbers. - -\ - For FP it is often useful to use approximate equality for checking -\ the results. You can turn on approximate matching with SET-NEAR -\ (and turn it off (default) with SET-EXACT, and you can tune it by -\ setting the variables REL-NEAR and ABS-NEAR. If you want your tests -\ to work with a shared stack, you have to specify the types of the -\ elements on the stack by using one of the closing words that specify -\ types, e.g. RRRX}T for checking the stack picture ( r r r x ). -\ There are such words for all combination of R and X with up to 4 -\ stack items, and defining more if you need them is straightforward -\ (see source). If your tests are only intended for a separate-stack -\ system or if you need only exact matching, you can use the plain }T -\ instead. +\ 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 2007-08-12, 2007-08-19, 2007-08-28 +\ PUBLIC DOMAIN + +\ THE ORIGINAL HAS THE FOLLOWING SHORTCOMINGS: + +\ - IT DOES NOT WORK AS EXPECTED IF THE STACK IS NON-EMPTY BEFORE THE {. + +\ - IT DOES NOT CHECK FP RESULTS IF THE SYSTEM HAS A SEPARATE FP STACK. + +\ - THERE IS A CONFLICT WITH THE USE OF } FOR FSL ARRAYS AND { FOR LOCALS. + +\ I HAVE REVISED IT TO ADDRESS THESE SHORTCOMINGS. YOU CAN FIND THE +\ RESULT AT + +\ HTTP://WWW.FORTH200X.ORG/TESTS/TESTER.FS +\ HTTP://WWW.FORTH200X.ORG/TESTS/TTESTER.FS + +\ 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 } AND +\ KEEPS THE BASE AS IT WAS BEFORE LOADING TTESTER.FS + +\ IN SPIRIT OF THE ORIGINAL, I HAVE STRIVED TO AVOID ANY POTENTIAL +\ NON-PORTABILITIES AND STAYED AS MUCH WITHIN THE CORE WORDS AS +\ POSSIBLE; E.G., FLOATING WORDS ARE USED ONLY IF THE FLOATING WORDSET +\ IS PRESENT + +\ THERE ARE A FEW THINGS TO BE NOTED: + +\ - LOADING TTESTER.FS DOES NOT CHANGE BASE. LOADING TESTER.FS +\ CHANGES BASE TO HEX (LIKE THE ORIGINAL TESTER). FLOATING-POINT +\ INPUT IS AMBIGUOUS WHEN THE BASE IS NOT DECIMAL, SO YOU HAVE TO SET +\ IT TO DECIMAL YOURSELF WHEN YOU WANT TO DEAL WITH DECIMAL NUMBERS. + +\ - FOR FP IT IS OFTEN USEFUL TO USE APPROXIMATE EQUALITY FOR CHECKING +\ THE RESULTS. YOU CAN TURN ON APPROXIMATE MATCHING WITH SET-NEAR +\ (AND TURN IT OFF (DEFAULT) WITH SET-EXACT, AND YOU CAN TUNE IT BY +\ SETTING THE VARIABLES REL-NEAR AND ABS-NEAR. IF YOU WANT YOUR TESTS +\ TO WORK WITH A SHARED STACK, YOU HAVE TO SPECIFY THE TYPES OF THE +\ ELEMENTS ON THE STACK BY USING ONE OF THE CLOSING WORDS THAT SPECIFY +\ TYPES, E.G. RRRX}T FOR CHECKING THE STACK PICTURE ( R R R X ). +\ THERE ARE SUCH WORDS FOR ALL COMBINATION OF R AND X WITH UP TO 4 +\ STACK ITEMS, AND DEFINING MORE IF YOU NEED THEM IS STRAIGHTFORWARD +\ (SEE SOURCE). IF YOUR TESTS ARE ONLY INTENDED FOR A SEPARATE-STACK +\ SYSTEM OR IF YOU NEED ONLY EXACT MATCHING, YOU CAN USE THE PLAIN }T +\ INSTEAD. + +BASE @ HEX \ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY @@ -112,8 +100,7 @@ HAS-FLOATING [IF] \ SET THE FOLLOWING TO THE RELATIVE AND ABSOLUTE TOLERANCES YOU \ WANT FOR APPROXIMATE FLOAT EQUALITY, TO BE USED WITH F~ IN \ FNEARLY=. KEEP THE SIGNS, BECAUSE F~ NEEDS THEM. - FVARIABLE FSENSITIVITY DECIMAL 1E-12 HEX FSENSITIVITY F! - : REL-NEAR FSENSITIVITY ; + FVARIABLE REL-NEAR DECIMAL 1E-12 HEX REL-NEAR F! FVARIABLE ABS-NEAR DECIMAL 0E HEX ABS-NEAR F! \ WHEN EXACT? IS TRUE, }F USES FEXACTLY=, OTHERWISE FNEARLY=. @@ -205,15 +192,15 @@ HAS-FLOATING-STACK [IF] : F...}T ( -- ) FDEPTH START-FDEPTH @ = 0= IF - S" WRONG NUMBER OF FP RESULTS" ERROR + S" NUMBER OF FLOAT RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR THEN - FCURSOR @ ACTUAL-FDEPTH @ <> IF - S" WRONG NUMBER OF FP RESULTS" ERROR + FCURSOR @ START-FDEPTH @ + ACTUAL-FDEPTH @ <> IF + S" NUMBER OF FLOAT RESULTS BEFORE '->' DOES NOT MATCH ...}T SPRECIFICATION: " ERROR THEN ; : FTESTER ( R -- ) - FDEPTH 0= ACTUAL-FDEPTH @ FCURSOR @ 1+ < OR IF - S" WRONG NUMBER OF FP RESULTS: " ERROR EXIT + FDEPTH 0= ACTUAL-FDEPTH @ FCURSOR @ START-FDEPTH @ + 1+ < OR IF + S" NUMBER OF FLOAT RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT THEN ACTUAL-FRESULTS FCURSOR @ FLOATS + F@ FCONF= 0= IF S" INCORRECT FP RESULT: " ERROR @@ -227,14 +214,16 @@ HAS-FLOATING-STACK [IF] : F} ; : F...}T ; + DECIMAL : 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 : FTESTER ( R -- ) - DEPTH CELLS-PER-FP < ACTUAL-DEPTH @ XCURSOR @ CELLS-PER-FP + < OR IF - S" WRONG NUMBER OF RESULTS: " ERROR EXIT + DEPTH CELLS-PER-FP < ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + CELLS-PER-FP + < OR IF + S" NUMBER OF RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT THEN ACTUAL-RESULTS XCURSOR @ CELLS + F@ FCONF= 0= IF S" INCORRECT FP RESULT: " ERROR @@ -260,7 +249,7 @@ HAS-FLOATING-STACK [IF] ' ERROR1 ERROR-XT ! : T{ \ ( -- ) SYNTACTIC SUGAR. - DEPTH START-DEPTH ! F{ ; + DEPTH START-DEPTH ! 0 XCURSOR ! F{ ; : -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK. DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH @@ -285,16 +274,16 @@ HAS-FLOATING-STACK [IF] : ...}T ( -- ) DEPTH START-DEPTH @ = 0= IF - S" WRONG NUMBER OF RESULTS" ERROR + S" NUMBER OF CELL RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR THEN - XCURSOR @ ACTUAL-DEPTH @ <> IF - S" WRONG NUMBER OF RESULTS" ERROR + XCURSOR @ START-DEPTH @ + ACTUAL-DEPTH @ <> IF + S" NUMBER OF CELL RESULTS BEFORE '->' DOES NOT MATCH ...}T SPRECIFICATION: " ERROR THEN F...}T ; : XTESTER ( X -- ) - DEPTH 0= ACTUAL-DEPTH @ XCURSOR @ 1+ < OR IF - S" WRONG NUMBER OF RESULTS: " ERROR EXIT + DEPTH 0= ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + 1+ < OR IF + S" NUMBER OF CELL RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT THEN ACTUAL-RESULTS XCURSOR @ CELLS + @ <> IF S" INCORRECT CELL RESULT: " ERROR @@ -337,3 +326,5 @@ HAS-FLOATING-STACK [IF] IF DUP >R TYPE CR R> >IN ! ELSE >IN ! DROP THEN ; + +BASE !