Thanks to Josh, I have some test cases to show some flaws in my logic. Here's another attempt:

diff -b -B -u ttester.fs ttesterOld.fs
--- ttester.fs  2008-03-01 11:12:16.000000000 -0700
+++ ttesterOld.fs       2008-03-01 11:11:12.000000000 -0700
@@ -67,8 +67,8 @@
 VARIABLE VERBOSE
    FALSE VERBOSE !

-CREATE ACTUAL-RESULTS 21 CELLS ALLOT
-CREATE EXPECT-RESULTS 21 CELLS ALLOT
+VARIABLE ACTUAL-DEPTH                  \ STACK RECORD
+CREATE ACTUAL-RESULTS 20 CELLS ALLOT
 VARIABLE START-DEPTH
 VARIABLE XCURSOR \ FOR ...}T
 VARIABLE ERROR-XT
@@ -155,8 +155,8 @@
 [THEN]

 HAS-FLOATING-STACK [IF]
-    CREATE ACTUAL-FRESULTS 21 FLOATS ALLOT
-    CREATE EXPECT-FRESULTS 21 FLOATS ALLOT
+    VARIABLE ACTUAL-FDEPTH
+    CREATE ACTUAL-FRESULTS 20 FLOATS ALLOT
     VARIABLE START-FDEPTH
     VARIABLE FCURSOR

@@ -168,56 +168,40 @@
             FDEPTH START-FDEPTH @ DO FDROP LOOP
         THEN ;

- : SAVE-FSTACK ( ... addr -- ... ) \ Save stack contents (up to 20 items) at addr.
-        DUP >R FDEPTH DUP S>D D>F R> F!      \ Record depth
-        DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
-        ?DUP IF                              \ If something is on stack
-            0 DO                             \ For each stack item
-                FLOAT+ DUP >R F! R>          \ Save them
-        LOOP THEN START-FDEPTH @
- ?DUP IF \ If something is left on stack
-           0 DO                              \ For each stack item
-              DUP >R F@ R> 1 FLOATS -        \ Restore them
-        LOOP THEN DROP ;
-
-    : SHOW-FSTACK ( addr -- ... ) \ Display saved stack contents.
-        ." -> " DUP @                        \ Get depth
-        DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
- ?DUP IF \ If something was on stack
-            SWAP OVER FLOATS +
-            SWAP 0 DO                        \ For each stack item
-                DUP F@ F. 1 FLOATS -         \ Display them
-        LOOP THEN DROP ." <- Top " CR ;
-
     : F{ ( -- )
         FDEPTH START-FDEPTH ! 0 FCURSOR ! ;

-    : F-> ( ... -- ... )   ACTUAL-FRESULTS SAVE-FSTACK ;
+    : F-> ( ... -- ... )
+        FDEPTH DUP ACTUAL-FDEPTH !
+        START-FDEPTH @ > IF
+ FDEPTH START-FDEPTH @ - 0 DO ACTUAL-FRESULTS I FLOATS + F! LOOP
+        THEN ;

     : F} ( ... -- ... )
-        EXPECT-FRESULTS FDEPTH >R SAVE-FSTACK
-        EXPECT-FRESULTS ACTUAL-FRESULTS
-        R> 0 ?DO
-            OVER I FLOATS + F@
-            OVER I FLOATS + F@ FCONF= INVERT IF  \ If not the same
-                S" INCORRECT FP RESULT: " ERROR
-                ." ACTUAL: " ACTUAL-FRESULTS SHOW-FSTACK
-                ." EXPECT: " EXPECT-FRESULTS SHOW-FSTACK
-                0 0 LEAVE
-        THEN LOOP 2DROP ;
+        FDEPTH ACTUAL-FDEPTH @ = IF
+            FDEPTH START-FDEPTH @ > IF
+                FDEPTH START-FDEPTH @ - 0 DO
+                    ACTUAL-FRESULTS I FLOATS + F@ FCONF= INVERT IF
+                        S" INCORRECT FP RESULT: " ERROR LEAVE
+                    THEN
+                LOOP
+            THEN
+        ELSE
+            S" WRONG NUMBER OF FP RESULTS: " ERROR
+        THEN ;

     : F...}T ( -- )
-        FCURSOR @ START-FDEPTH @ + ACTUAL-FRESULTS F@ F>D D>S <> IF
- S" NUMBER OF FLOAT RESULTS BEFORE '->' DOES NOT MATCH ...}T SPECIFICATION: " ERROR
+        FCURSOR @ START-FDEPTH @ + ACTUAL-FDEPTH @ <> IF
+ S" NUMBER OF FLOAT RESULTS BEFORE '->' DOES NOT MATCH ...}T SPRECIFICATION: " ERROR
         ELSE FDEPTH START-FDEPTH @ = 0= IF
S" NUMBER OF FLOAT RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR
         THEN THEN ;


     : FTESTER ( R -- )
- FDEPTH 0= ACTUAL-FRESULTS F@ F>D D>S FCURSOR @ START-FDEPTH @ + 1+ < OR IF
+        FDEPTH 0= ACTUAL-FDEPTH @ FCURSOR @ START-FDEPTH @ + 1+ < OR IF
S" NUMBER OF FLOAT RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR
-        ELSE ACTUAL-FRESULTS FCURSOR @ 1+ FLOATS + F@ FCONF= 0= IF
+        ELSE ACTUAL-FRESULTS FCURSOR @ FLOATS + F@ FCONF= 0= IF
             S" INCORRECT FP RESULT: " ERROR
         THEN THEN
         1 FCURSOR +! ;
@@ -237,9 +221,9 @@
     COMPUTE-CELLS-PER-FP CONSTANT CELLS-PER-FP

     : FTESTER ( R -- )
- DEPTH CELLS-PER-FP < ACTUAL-RESULTS @ XCURSOR @ START-DEPTH @ + CELLS-PER-FP + < OR IF + DEPTH CELLS-PER-FP < ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + CELLS-PER-FP + < OR IF S" NUMBER OF RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT
-        ELSE ACTUAL-RESULTS XCURSOR @ 1+ CELLS + F@ FCONF= 0= IF
+        ELSE ACTUAL-RESULTS XCURSOR @ CELLS + F@ FCONF= 0= IF
             S" INCORRECT FP RESULT: " ERROR
         THEN THEN
         CELLS-PER-FP XCURSOR +! ;
@@ -254,27 +238,6 @@
     THEN
     EMPTY-FSTACK ;

-: SAVE-STACK ( ... addr -- ... ) \ Save stack contents (up to 20 items) at addr.
-   DEPTH 1- 2DUP SWAP !                 \ Record depth
-   DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
-   ?DUP IF                              \ If something is on stack
-      0 DO                              \ For each stack item
-         CELL+ TUCK !                   \ Save them
-   LOOP THEN START-DEPTH @
-   ?DUP IF                              \ If something is left on stack
-      0 DO                              \ For each stack item
-         DUP @ SWAP 1 CELLS -           \ Restore them
-   LOOP THEN DROP ;
-
-: SHOW-STACK ( addr -- ... ) \ Display saved stack contents.
-   ." -> " DUP @                        \ Get depth
-   DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
-   ?DUP IF                              \ If something was on stack
-      SWAP OVER CELLS +
-      SWAP 0 DO                         \ For each stack item
-         DUP ? 1 CELLS -                \ Display them
-   LOOP THEN DROP ." <- Top " CR ;
-
 : ERROR1       \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
                \ THE LINE THAT HAD THE ERROR.
TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
@@ -287,24 +250,28 @@
    DEPTH START-DEPTH ! 0 XCURSOR ! F{ ;

 : ->           \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
-   ACTUAL-RESULTS SAVE-STACK
+   DEPTH DUP ACTUAL-DEPTH !            \ RECORD DEPTH
+   START-DEPTH @ > IF          \ IF THERE IS SOMETHING ON STACK
+ DEPTH START-DEPTH @ - 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
+   THEN
    F-> ;

: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
-   EXPECT-RESULTS DEPTH >R SAVE-STACK
-   EXPECT-RESULTS ACTUAL-RESULTS
-   R> 0 DO
-      OVER I CELLS + @
-      OVER I CELLS + @ - IF             \ If not the same
-         S" INCORRECT RESULT: " ERROR
-         ." ACTUAL: " ACTUAL-RESULTS SHOW-STACK
-         ." EXPECT: " EXPECT-RESULTS SHOW-STACK
-         0 0 LEAVE
-   THEN LOOP 2DROP
+               \ (ACTUAL) CONTENTS.
+   DEPTH ACTUAL-DEPTH @ = IF           \ IF DEPTHS MATCH
+ DEPTH START-DEPTH @ > IF \ IF THERE IS SOMETHING ON THE STACK
+         DEPTH START-DEPTH @ - 0 DO    \ FOR EACH STACK ITEM
+           ACTUAL-RESULTS I CELLS + @  \ COMPARE ACTUAL WITH EXPECTED
+           <> IF S" INCORRECT RESULT: " ERROR LEAVE THEN
+        LOOP
+      THEN
+   ELSE                                        \ DEPTH MISMATCH
+      S" WRONG NUMBER OF RESULTS: " ERROR
+   THEN
    F} ;

 : ...}T ( -- )
-    XCURSOR @ START-DEPTH @ + ACTUAL-RESULTS @ <> IF
+    XCURSOR @ START-DEPTH @ + ACTUAL-DEPTH @ <> IF
S" NUMBER OF CELL RESULTS BEFORE '->' DOES NOT MATCH ...}T SPECIFICATION: " ERROR
     ELSE DEPTH START-DEPTH @ = 0= IF
S" NUMBER OF CELL RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR
@@ -312,9 +279,9 @@
     F...}T ;

 : XTESTER ( X -- )
-    DEPTH 0= ACTUAL-RESULTS @ XCURSOR @ START-DEPTH @ + 1+ < OR IF
+    DEPTH 0= ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + 1+ < OR IF
S" NUMBER OF CELL RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT
-    ELSE ACTUAL-RESULTS XCURSOR @ 1+ CELLS + @ <> IF
+    ELSE ACTUAL-RESULTS XCURSOR @ CELLS + @ <> IF
         S" INCORRECT CELL RESULT: " ERROR
     THEN THEN
     1 XCURSOR +! ;

DaR


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to