\ Fro m : John Hayes S1I
\ Sub j ect : tester . fr
\ Dat e : 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 .
\ VER S ION 1.2
\ 24/ 1 1 / 2015 Replaced Core Ext word < > with = 0 =
\ 31/ 3 / 2015 Variable # ERRORS added and incremented for each error report ed.
\ 22/ 1 / 09 The words { and } have been changed to T { and } T respectively to
\ agr e e with the Forth 200 X file ttester . fs . This avoids clashes with
\ loc a ls using { . . . } and the FSL use of }
HEX
\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT ; THIS MAY
\ ALL O W YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG .
VARIA B LE VERBOSE
\ F A LSE VERBOSE !
TR U E VERBOSE !
: EMP T Y - STACK \ ( . . . - - ) EMPTY STACK : HANDLES UNDERFLOWED STACK TOO .
DE P TH ? DUP IF DUP 0 < IF NEGATE 0 DO 0 LOOP ELSE 0 DO DROP LOOP THEN T HEN ;
VARIA B LE # ERRORS 0 # ERRORS !
: ERR O R \ ( C - ADDR U - - ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
\ THE LINE THAT HAD THE ERROR .
CR TYPE SOURCE TYPE \ DISPLAY LINE CORRESPONDING TO ERROR
EM P TY - STACK \ THROW AWAY EVERY THING ELSE
#E R RORS @ 1 + # ERRORS !
\ Q U IT \ ** * Uncomment this line to QUIT on an error
;
VARIA B LE ACTUAL - DEPTH \ STACK RECORD
CREATE ACTUAL-RESULTS 20 CELLS ALLOT
: T{ \ ( - - ) SYNTACTIC SUGAR .
;
: -> \ ( . . . - - ) RECORD DEPTH AND CONTENT OF STACK .
DE P TH DUP ACTUAL - DEPTH ! \ RECORD DEPTH
?D U P IF \ IF THERE IS SOMETHING ON STACK
0 DO ACTUAL - RESULTS I CELLS + ! LOOP \ SAVE THEM
TH E N ;
: }T \ ( . . . - - ) COMPARE STACK ( EXPECTED ) CONTENTS WITH SAVED
\ ( ACTUAL ) CONTENTS .
DE P TH ACTUAL - DEPTH @ = IF \ IF DEPTHS MATCH
DEPTH ? DUP IF \ IF THERE IS SOMETHING ON THE STACK
0 DO \ FOR EACH STACK ITEM
ACTUAL - RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
= 0 = IF S " INCORRECT RESULT: " ERROR LEAVE THEN
LOOP
THEN
EL S E \ DEPTH MISMATCH
S " WRONG NUMBER OF RESULTS: " ERROR
TH E N ;
: TES T ING \ ( - - ) TALKING COMMENT .
SOU R CE VERBOSE @
IF DUP > R TYPE CR R > > IN !
EL S E > IN ! DROP [CHAR] * EMIT
TH E N ;
\ Fro m : John Hayes S1I
\ Sub j ect : core . fr
\ Dat e : Mon , 27 Nov 95 13 : 10
\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS .
\ VER S ION 1.2
\ THI S PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM .
\ THE PROGRAM ASSUMES A TWO ' S COMPLEMENT IMPLEMENTATION WHERE
\ THE RANGE OF SIGNED NUMBERS IS - 2 ^ ( N - 1 ) . . . 2 ^ ( N - 1 ) - 1 AND
\ THE RANGE OF UNSIGNED NUMBERS IS 0 . . . 2 ^ ( N ) - 1.
\ I H A VEN ' T FIGURED OUT HOW TO TEST KEY , QUIT , ABORT , OR ABORT " . . .
\ I A L SO HAVEN ' T THOUGHT OF A WAY TO TEST ENVIRONMENT ? . . .
CR
TESTI N G CORE WORDS
HEX
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G BASIC ASSUMPTIONS
T{ -> } T \ START WITH CLEAN SLATE
( TES T IF ANY BITS ARE SET ; ANSWER IN BASE 1 )
T{ : B ITSSET ? IF 0 0 ELSE 0 THEN ; - > } T
T{ 0 BITSSET ? - > 0 } T ( ZERO IS ALL BITS CLEAR )
T{ 1 BITSSET ? - > 0 0 } T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
T{ -1 BITSSET ? - > 0 0 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G BOOLEANS : INVERT AND OR XOR
T{ 0 0 AND - > 0 } T
T{ 0 1 AND - > 0 } T
T{ 1 0 AND - > 0 } T
T{ 1 1 AND - > 1 } T
T{ 0 I NVERT 1 AND - > 1 } T
T{ 1 I NVERT 1 AND - > 0 } T
0 C ONSTANT 0 S
0 INV E RT CONSTANT 1 S
T{ 0S INVERT - > 1 S } T
T{ 1S INVERT - > 0 S } T
T{ 0S 0 S AND - > 0 S } T
T{ 0S 1 S AND - > 0 S } T
T{ 1S 0 S AND - > 0 S } T
T{ 1S 1 S AND - > 1 S } T
T{ 0S 0 S OR - > 0 S } T
T{ 0S 1 S OR - > 1 S } T
T{ 1S 0 S OR - > 1 S } T
T{ 1S 1 S OR - > 1 S } T
T{ 0S 0 S XOR - > 0 S } T
T{ 0S 1 S XOR - > 1 S } T
T{ 1S 0 S XOR - > 1 S } T
T{ 1S 1 S XOR - > 0 S } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G 2 * 2 / LSHIFT RSHIFT
( WE T RUST 1 S , INVERT , AND BITSSET ? ; WE WILL CONFIRM RSHIFT LATER )
1S 1 R SHIFT INVERT CONSTANT MSB
T{ MS B BITSSET ? - > 0 0 } T
T{ 0S 2 * - > 0 S } T
T{ 1 2 * - > 2 } T
T{ 40 0 0 2 * - > 8000 } T
T{ 1S 2 * 1 XOR - > 1 S } T
T{ MS B 2 * - > 0 S } T
T{ 0S 2 / - > 0 S } T
T{ 1 2 / - > 0 } T
T{ 40 0 0 2 / - > 2000 } T
T{ 1S 2 / - > 1 S } T \ MSB PROPOGATED
T{ 1S 1 XOR 2 / - > 1 S } T
T{ MS B 2 / MSB AND - > MSB } T
T{ 1 0 LSHIFT - > 1 } T
T{ 1 1 LSHIFT - > 2 } T
T{ 1 2 LSHIFT - > 4 } T
T{ 1 F LSHIFT - > 8000 } T \ BIGGEST GUARANTEED SHIFT
T{ 1S 1 LSHIFT 1 XOR - > 1 S } T
T{ MS B 1 LSHIFT - > 0 } T
T{ 1 0 RSHIFT - > 1 } T
T{ 1 1 RSHIFT - > 0 } T
T{ 2 1 RSHIFT - > 1 } T
T{ 4 2 RSHIFT - > 1 } T
T{ 80 0 0 F RSHIFT - > 1 } T \ BIGGEST
T{ MS B 1 RSHIFT MSB AND - > 0 } T \ RSHIFT ZERO FILLS MSBS
T{ MS B 1 RSHIFT 2 * - > MSB } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G COMPARISONS : 0 = = 0 < < > U < MIN MAX
0 INV E RT CONSTANT MAX - UINT
0 INV E RT 1 RSHIFT CONSTANT MAX - INT
0 INV E RT 1 RSHIFT INVERT CONSTANT MIN - INT
0 INV E RT 1 RSHIFT CONSTANT MID - UINT
0 INV E RT 1 RSHIFT INVERT CONSTANT MID - UINT + 1
0S CO N STANT < FALSE >
1S CO N STANT < TRUE >
T{ 0 0 = - > < TRUE > } T
T{ 1 0 = - > < FALSE > } T
T{ 2 0 = - > < FALSE > } T
T{ -1 0 = - > < FALSE > } T
T{ MA X - UINT 0 = - > < FALSE > } T
T{ MI N - INT 0 = - > < FALSE > } T
T{ MA X - INT 0 = - > < FALSE > } T
T{ 0 0 = - > < TRUE > } T
T{ 1 1 = - > < TRUE > } T
T{ -1 - 1 = - > < TRUE > } T
T{ 1 0 = - > < FALSE > } T
T{ -1 0 = - > < FALSE > } T
T{ 0 1 = - > < FALSE > } T
T{ 0 - 1 = - > < FALSE > } T
T{ 0 0 < - > < FALSE > } T
T{ -1 0 < - > < TRUE > } T
T{ MI N - INT 0 < - > < TRUE > } T
T{ 1 0 < - > < FALSE > } T
T{ MA X - INT 0 < - > < FALSE > } T
T{ 0 1 < - > < TRUE > } T
T{ 1 2 < - > < TRUE > } T
T{ -1 0 < - > < TRUE > } T
T{ -1 1 < - > < TRUE > } T
T{ MI N - INT 0 < - > < TRUE > } T
T{ MI N - INT MAX - INT < - > < TRUE > } T
T{ 0 M AX - INT < - > < TRUE > } T
T{ 0 0 < - > < FALSE > } T
T{ 1 1 < - > < FALSE > } T
T{ 1 0 < - > < FALSE > } T
T{ 2 1 < - > < FALSE > } T
T{ 0 - 1 < - > < FALSE > } T
T{ 1 - 1 < - > < FALSE > } T
T{ 0 M IN - INT < - > < FALSE > } T
T{ MA X - INT MIN - INT < - > < FALSE > } T
T{ MA X - INT 0 < - > < FALSE > } T
T{ 0 1 > - > < FALSE > } T
T{ 1 2 > - > < FALSE > } T
T{ -1 0 > - > < FALSE > } T
T{ -1 1 > - > < FALSE > } T
T{ MI N - INT 0 > - > < FALSE > } T
T{ MI N - INT MAX - INT > - > < FALSE > } T
T{ 0 M AX - INT > - > < FALSE > } T
T{ 0 0 > - > < FALSE > } T
T{ 1 1 > - > < FALSE > } T
T{ 1 0 > - > < TRUE > } T
T{ 2 1 > - > < TRUE > } T
T{ 0 - 1 > - > < TRUE > } T
T{ 1 - 1 > - > < TRUE > } T
T{ 0 M IN - INT > - > < TRUE > } T
T{ MA X - INT MIN - INT > - > < TRUE > } T
T{ MA X - INT 0 > - > < TRUE > } T
T{ 0 1 U < - > < TRUE > } T
T{ 1 2 U < - > < TRUE > } T
T{ 0 M ID - UINT U < - > < TRUE > } T
T{ 0 M AX - UINT U < - > < TRUE > } T
T{ MI D - UINT MAX - UINT U < - > < TRUE > } T
T{ 0 0 U < - > < FALSE > } T
T{ 1 1 U < - > < FALSE > } T
T{ 1 0 U < - > < FALSE > } T
T{ 2 1 U < - > < FALSE > } T
T{ MI D - UINT 0 U < - > < FALSE > } T
T{ MA X - UINT 0 U < - > < FALSE > } T
T{ MA X - UINT MID - UINT U < - > < FALSE > } T
T{ 0 1 MIN - > 0 } T
T{ 1 2 MIN - > 1 } T
T{ -1 0 MIN - > - 1 } T
T{ -1 1 MIN - > - 1 } T
T{ MI N - INT 0 MIN - > MIN - INT } T
T{ MI N - INT MAX - INT MIN - > MIN - INT } T
T{ 0 M AX - INT MIN - > 0 } T
T{ 0 0 MIN - > 0 } T
T{ 1 1 MIN - > 1 } T
T{ 1 0 MIN - > 0 } T
T{ 2 1 MIN - > 1 } T
T{ 0 - 1 MIN - > - 1 } T
T{ 1 - 1 MIN - > - 1 } T
T{ 0 M IN - INT MIN - > MIN - INT } T
T{ MA X - INT MIN - INT MIN - > MIN - INT } T
T{ MA X - INT 0 MIN - > 0 } T
T{ 0 1 MAX - > 1 } T
T{ 1 2 MAX - > 2 } T
T{ -1 0 MAX - > 0 } T
T{ -1 1 MAX - > 1 } T
T{ MI N - INT 0 MAX - > 0 } T
T{ MI N - INT MAX - INT MAX - > MAX - INT } T
T{ 0 M AX - INT MAX - > MAX - INT } T
T{ 0 0 MAX - > 0 } T
T{ 1 1 MAX - > 1 } T
T{ 1 0 MAX - > 1 } T
T{ 2 1 MAX - > 2 } T
T{ 0 - 1 MAX - > 0 } T
T{ 1 - 1 MAX - > 1 } T
T{ 0 M IN - INT MAX - > 0 } T
T{ MA X - INT MIN - INT MAX - > MAX - INT } T
T{ MA X - INT 0 MAX - > MAX - INT } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G STACK OPS : 2 DROP 2 DUP 2 OVER 2 SWAP ? DUP DEPTH DROP DUP OVER ROT S WAP
T{ 1 2 2 DROP - > } T
T{ 1 2 2 DUP - > 1 2 1 2 } T
T{ 1 2 3 4 2 OVER - > 1 2 3 4 1 2 } T
T{ 1 2 3 4 2 SWAP - > 3 4 1 2 } T
T{ 0 ? DUP - > 0 } T
T{ 1 ? DUP - > 1 1 } T
T{ -1 ? DUP - > - 1 - 1 } T
T{ DE P TH - > 0 } T
T{ 0 D EPTH - > 0 1 } T
T{ 0 1 DEPTH - > 0 1 2 } T
T{ 0 D ROP - > } T
T{ 1 2 DROP - > 1 } T
T{ 1 D UP - > 1 1 } T
T{ 1 2 OVER - > 1 2 1 } T
T{ 1 2 3 ROT - > 2 3 1 } T
T{ 1 2 SWAP - > 2 1 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G > R R > R @
T{ : G R1 > R R > ; - > } T
T{ : G R2 > R R @ R > DROP ; - > } T
T{ 12 3 GR1 - > 123 } T
T{ 12 3 GR2 - > 123 } T
T{ 1S GR1 - > 1 S } T ( RETURN STACK HOLDS CELLS )
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G ADD / SUBTRACT : + - 1 + 1 - ABS NEGATE
T{ 0 5 + - > 5 } T
T{ 5 0 + - > 5 } T
T{ 0 - 5 + - > - 5 } T
T{ -5 0 + - > - 5 } T
T{ 1 2 + - > 3 } T
T{ 1 - 2 + - > - 1 } T
T{ -1 2 + - > 1 } T
T{ -1 - 2 + - > - 3 } T
T{ -1 1 + - > 0 } T
T{ MI D - UINT 1 + - > MID - UINT + 1 } T
T{ 0 5 - - > - 5 } T
T{ 5 0 - - > 5 } T
T{ 0 - 5 - - > 5 } T
T{ -5 0 - - > - 5 } T
T{ 1 2 - - > - 1 } T
T{ 1 - 2 - - > 3 } T
T{ -1 2 - - > - 3 } T
T{ -1 - 2 - - > 1 } T
T{ 0 1 - - > - 1 } T
T{ MI D - UINT + 1 1 - - > MID - UINT } T
T{ 0 1 + - > 1 } T
T{ -1 1 + - > 0 } T
T{ 1 1 + - > 2 } T
T{ MI D - UINT 1 + - > MID - UINT + 1 } T
T{ 2 1 - - > 1 } T
T{ 1 1 - - > 0 } T
T{ 0 1 - - > - 1 } T
T{ MI D - UINT + 1 1 - - > MID - UINT } T
T{ 0 N EGATE - > 0 } T
T{ 1 N EGATE - > - 1 } T
T{ -1 NEGATE - > 1 } T
T{ 2 N EGATE - > - 2 } T
T{ -2 NEGATE - > 2 } T
T{ 0 A BS - > 0 } T
T{ 1 A BS - > 1 } T
T{ -1 ABS - > 1 } T
T{ MI N - INT ABS - > MID - UINT + 1 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G MULTIPLY : S > D * M * UM *
T{ 0 S > D - > 0 0 } T
T{ 1 S > D - > 1 0 } T
T{ 2 S > D - > 2 0 } T
T{ -1 S > D - > - 1 - 1 } T
T{ -2 S > D - > - 2 - 1 } T
T{ MI N - INT S > D - > MIN - INT - 1 } T
T{ MA X - INT S > D - > MAX - INT 0 } T
T{ 0 0 M * - > 0 S > D } T
T{ 0 1 M * - > 0 S > D } T
T{ 1 0 M * - > 0 S > D } T
T{ 1 2 M * - > 2 S > D } T
T{ 2 1 M * - > 2 S > D } T
T{ 3 3 M * - > 9 S > D } T
T{ -3 3 M * - > - 9 S > D } T
T{ 3 - 3 M * - > - 9 S > D } T
T{ -3 - 3 M * - > 9 S > D } T
T{ 0 M IN - INT M * - > 0 S > D } T
T{ 1 M IN - INT M * - > MIN - INT S > D } T
T{ 2 M IN - INT M * - > 0 1 S } T
T{ 0 M AX - INT M * - > 0 S > D } T
T{ 1 M AX - INT M * - > MAX - INT S > D } T
T{ 2 M AX - INT M * - > MAX - INT 1 LSHIFT 0 } T
T{ MI N - INT MIN - INT M * - > 0 MSB 1 RSHIFT } T
T{ MA X - INT MIN - INT M * - > MSB MSB 2 / } T
T{ MA X - INT MAX - INT M * - > 1 MSB 2 / INVERT } T
T{ 0 0 * - > 0 } T \ TEST IDENTITIES
T{ 0 1 * - > 0 } T
T{ 1 0 * - > 0 } T
T{ 1 2 * - > 2 } T
T{ 2 1 * - > 2 } T
T{ 3 3 * - > 9 } T
T{ -3 3 * - > - 9 } T
T{ 3 - 3 * - > - 9 } T
T{ -3 - 3 * - > 9 } T
T{ MI D - UINT + 1 1 RSHIFT 2 * - > MID - UINT + 1 } T
T{ MI D - UINT + 1 2 RSHIFT 4 * - > MID - UINT + 1 } T
T{ MI D - UINT + 1 1 RSHIFT MID - UINT + 1 OR 2 * - > MID - UINT + 1 } T
T{ 0 0 UM * - > 0 0 } T
T{ 0 1 UM * - > 0 0 } T
T{ 1 0 UM * - > 0 0 } T
T{ 1 2 UM * - > 2 0 } T
T{ 2 1 UM * - > 2 0 } T
T{ 3 3 UM * - > 9 0 } T
T{ MI D - UINT + 1 1 RSHIFT 2 UM * - > MID - UINT + 1 0 } T
T{ MI D - UINT + 1 2 UM * - > 0 1 } T
T{ MI D - UINT + 1 4 UM * - > 0 2 } T
T{ 1S 2 UM * - > 1 S 1 LSHIFT 1 } T
T{ MA X - UINT MAX - UINT UM * - > 1 1 INVERT } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G DIVIDE : FM / MOD SM / REM UM / MOD * / * / MOD / / MOD MOD
T{ 0 S > D 1 FM / MOD - > 0 0 } T
T{ 1 S > D 1 FM / MOD - > 0 1 } T
T{ 2 S > D 1 FM / MOD - > 0 2 } T
T{ -1 S > D 1 FM / MOD - > 0 - 1 } T
T{ -2 S > D 1 FM / MOD - > 0 - 2 } T
T{ 0 S > D - 1 FM / MOD - > 0 0 } T
T{ 1 S > D - 1 FM / MOD - > 0 - 1 } T
T{ 2 S > D - 1 FM / MOD - > 0 - 2 } T
T{ -1 S > D - 1 FM / MOD - > 0 1 } T
T{ -2 S > D - 1 FM / MOD - > 0 2 } T
T{ 2 S > D 2 FM / MOD - > 0 1 } T
T{ -1 S > D - 1 FM / MOD - > 0 1 } T
T{ -2 S > D - 2 FM / MOD - > 0 1 } T
T{ 7 S > D 3 FM / MOD - > 1 2 } T
T{ 7 S > D - 3 FM / MOD - > - 2 - 3 } T
T{ -7 S > D 3 FM / MOD - > 2 - 3 } T
T{ -7 S > D - 3 FM / MOD - > - 1 2 } T
T{ MA X - INT S > D 1 FM / MOD - > 0 MAX - INT } T
T{ MI N - INT S > D 1 FM / MOD - > 0 MIN - INT } T
T{ MA X - INT S > D MAX - INT FM / MOD - > 0 1 } T
T{ MI N - INT S > D MIN - INT FM / MOD - > 0 1 } T
T{ 1S 1 4 FM / MOD - > 3 MAX - INT } T
T{ 1 M IN - INT M * 1 FM / MOD - > 0 MIN - INT } T
T{ 1 M IN - INT M * MIN - INT FM / MOD - > 0 1 } T
T{ 2 M IN - INT M * 2 FM / MOD - > 0 MIN - INT } T
T{ 2 M IN - INT M * MIN - INT FM / MOD - > 0 2 } T
T{ 1 M AX - INT M * 1 FM / MOD - > 0 MAX - INT } T
T{ 1 M AX - INT M * MAX - INT FM / MOD - > 0 1 } T
T{ 2 M AX - INT M * 2 FM / MOD - > 0 MAX - INT } T
T{ 2 M AX - INT M * MAX - INT FM / MOD - > 0 2 } T
T{ MI N - INT MIN - INT M * MIN - INT FM / MOD - > 0 MIN - INT } T
T{ MI N - INT MAX - INT M * MIN - INT FM / MOD - > 0 MAX - INT } T
T{ MI N - INT MAX - INT M * MAX - INT FM / MOD - > 0 MIN - INT } T
T{ MA X - INT MAX - INT M * MAX - INT FM / MOD - > 0 MAX - INT } T
T{ 0 S > D 1 SM / REM - > 0 0 } T
T{ 1 S > D 1 SM / REM - > 0 1 } T
T{ 2 S > D 1 SM / REM - > 0 2 } T
T{ -1 S > D 1 SM / REM - > 0 - 1 } T
T{ -2 S > D 1 SM / REM - > 0 - 2 } T
T{ 0 S > D - 1 SM / REM - > 0 0 } T
T{ 1 S > D - 1 SM / REM - > 0 - 1 } T
T{ 2 S > D - 1 SM / REM - > 0 - 2 } T
T{ -1 S > D - 1 SM / REM - > 0 1 } T
T{ -2 S > D - 1 SM / REM - > 0 2 } T
T{ 2 S > D 2 SM / REM - > 0 1 } T
T{ -1 S > D - 1 SM / REM - > 0 1 } T
T{ -2 S > D - 2 SM / REM - > 0 1 } T
T{ 7 S > D 3 SM / REM - > 1 2 } T
T{ 7 S > D - 3 SM / REM - > 1 - 2 } T
T{ -7 S > D 3 SM / REM - > - 1 - 2 } T
T{ -7 S > D - 3 SM / REM - > - 1 2 } T
T{ MA X - INT S > D 1 SM / REM - > 0 MAX - INT } T
T{ MI N - INT S > D 1 SM / REM - > 0 MIN - INT } T
T{ MA X - INT S > D MAX - INT SM / REM - > 0 1 } T
T{ MI N - INT S > D MIN - INT SM / REM - > 0 1 } T
T{ 1S 1 4 SM / REM - > 3 MAX - INT } T
T{ 2 M IN - INT M * 2 SM / REM - > 0 MIN - INT } T
T{ 2 M IN - INT M * MIN - INT SM / REM - > 0 2 } T
T{ 2 M AX - INT M * 2 SM / REM - > 0 MAX - INT } T
T{ 2 M AX - INT M * MAX - INT SM / REM - > 0 2 } T
T{ MI N - INT MIN - INT M * MIN - INT SM / REM - > 0 MIN - INT } T
T{ MI N - INT MAX - INT M * MIN - INT SM / REM - > 0 MAX - INT } T
T{ MI N - INT MAX - INT M * MAX - INT SM / REM - > 0 MIN - INT } T
T{ MA X - INT MAX - INT M * MAX - INT SM / REM - > 0 MAX - INT } T
T{ 0 0 1 UM / MOD - > 0 0 } T
T{ 1 0 1 UM / MOD - > 0 1 } T
T{ 1 0 2 UM / MOD - > 1 0 } T
T{ 3 0 2 UM / MOD - > 1 1 } T
T{ MA X - UINT 2 UM * 2 UM / MOD - > 0 MAX - UINT } T
T{ MA X - UINT 2 UM * MAX - UINT UM / MOD - > 0 2 } T
T{ MA X - UINT MAX - UINT UM * MAX - UINT UM / MOD - > 0 MAX - UINT } T
: IFF L OORED
[ - 3 2 / - 2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
: IFS Y M
[ - 3 2 / - 1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION .
\ SIN C E WE HAVE ALREADY TESTED M * , FM / MOD , AND SM / REM WE CAN USE THEM IN TEST.
IFFLO O RED : T / MOD > R S > D R > FM / MOD ;
IFFLO O RED : T / T / MOD SWAP DROP ;
IFFLO O RED : TMOD T / MOD DROP ;
IFFLO O RED : T * / MOD > R M * R > FM / MOD ;
IFFLO O RED : T * / T * / MOD SWAP DROP ;
IFSYM : T / MOD > R S > D R > SM / REM ;
IFSYM : T / T / MOD SWAP DROP ;
IFSYM : TMOD T / MOD DROP ;
IFSYM : T * / MOD > R M * R > SM / REM ;
IFSYM : T * / T * / MOD SWAP DROP ;
T{ 0 1 / MOD - > 0 1 T / MOD } T
T{ 1 1 / MOD - > 1 1 T / MOD } T
T{ 2 1 / MOD - > 2 1 T / MOD } T
T{ -1 1 / MOD - > - 1 1 T / MOD } T
T{ -2 1 / MOD - > - 2 1 T / MOD } T
T{ 0 - 1 / MOD - > 0 - 1 T / MOD } T
T{ 1 - 1 / MOD - > 1 - 1 T / MOD } T
T{ 2 - 1 / MOD - > 2 - 1 T / MOD } T
T{ -1 - 1 / MOD - > - 1 - 1 T / MOD } T
T{ -2 - 1 / MOD - > - 2 - 1 T / MOD } T
T{ 2 2 / MOD - > 2 2 T / MOD } T
T{ -1 - 1 / MOD - > - 1 - 1 T / MOD } T
T{ -2 - 2 / MOD - > - 2 - 2 T / MOD } T
T{ 7 3 / MOD - > 7 3 T / MOD } T
T{ 7 - 3 / MOD - > 7 - 3 T / MOD } T
T{ -7 3 / MOD - > - 7 3 T / MOD } T
T{ -7 - 3 / MOD - > - 7 - 3 T / MOD } T
T{ MA X - INT 1 / MOD - > MAX - INT 1 T / MOD } T
T{ MI N - INT 1 / MOD - > MIN - INT 1 T / MOD } T
T{ MA X - INT MAX - INT / MOD - > MAX - INT MAX - INT T / MOD } T
T{ MI N - INT MIN - INT / MOD - > MIN - INT MIN - INT T / MOD } T
T{ 0 1 / - > 0 1 T / } T
T{ 1 1 / - > 1 1 T / } T
T{ 2 1 / - > 2 1 T / } T
T{ -1 1 / - > - 1 1 T / } T
T{ -2 1 / - > - 2 1 T / } T
T{ 0 - 1 / - > 0 - 1 T / } T
T{ 1 - 1 / - > 1 - 1 T / } T
T{ 2 - 1 / - > 2 - 1 T / } T
T{ -1 - 1 / - > - 1 - 1 T / } T
T{ -2 - 1 / - > - 2 - 1 T / } T
T{ 2 2 / - > 2 2 T / } T
T{ -1 - 1 / - > - 1 - 1 T / } T
T{ -2 - 2 / - > - 2 - 2 T / } T
T{ 7 3 / - > 7 3 T / } T
T{ 7 - 3 / - > 7 - 3 T / } T
T{ -7 3 / - > - 7 3 T / } T
T{ -7 - 3 / - > - 7 - 3 T / } T
T{ MA X - INT 1 / - > MAX - INT 1 T / } T
T{ MI N - INT 1 / - > MIN - INT 1 T / } T
T{ MA X - INT MAX - INT / - > MAX - INT MAX - INT T / } T
T{ MI N - INT MIN - INT / - > MIN - INT MIN - INT T / } T
T{ 0 1 MOD - > 0 1 TMOD } T
T{ 1 1 MOD - > 1 1 TMOD } T
T{ 2 1 MOD - > 2 1 TMOD } T
T{ -1 1 MOD - > - 1 1 TMOD } T
T{ -2 1 MOD - > - 2 1 TMOD } T
T{ 0 - 1 MOD - > 0 - 1 TMOD } T
T{ 1 - 1 MOD - > 1 - 1 TMOD } T
T{ 2 - 1 MOD - > 2 - 1 TMOD } T
T{ -1 - 1 MOD - > - 1 - 1 TMOD } T
T{ -2 - 1 MOD - > - 2 - 1 TMOD } T
T{ 2 2 MOD - > 2 2 TMOD } T
T{ -1 - 1 MOD - > - 1 - 1 TMOD } T
T{ -2 - 2 MOD - > - 2 - 2 TMOD } T
T{ 7 3 MOD - > 7 3 TMOD } T
T{ 7 - 3 MOD - > 7 - 3 TMOD } T
T{ -7 3 MOD - > - 7 3 TMOD } T
T{ -7 - 3 MOD - > - 7 - 3 TMOD } T
T{ MA X - INT 1 MOD - > MAX - INT 1 TMOD } T
T{ MI N - INT 1 MOD - > MIN - INT 1 TMOD } T
T{ MA X - INT MAX - INT MOD - > MAX - INT MAX - INT TMOD } T
T{ MI N - INT MIN - INT MOD - > MIN - INT MIN - INT TMOD } T
T{ 0 2 1 * / - > 0 2 1 T * / } T
T{ 1 2 1 * / - > 1 2 1 T * / } T
T{ 2 2 1 * / - > 2 2 1 T * / } T
T{ -1 2 1 * / - > - 1 2 1 T * / } T
T{ -2 2 1 * / - > - 2 2 1 T * / } T
T{ 0 2 - 1 * / - > 0 2 - 1 T * / } T
T{ 1 2 - 1 * / - > 1 2 - 1 T * / } T
T{ 2 2 - 1 * / - > 2 2 - 1 T * / } T
T{ -1 2 - 1 * / - > - 1 2 - 1 T * / } T
T{ -2 2 - 1 * / - > - 2 2 - 1 T * / } T
T{ 2 2 2 * / - > 2 2 2 T * / } T
T{ -1 2 - 1 * / - > - 1 2 - 1 T * / } T
T{ -2 2 - 2 * / - > - 2 2 - 2 T * / } T
T{ 7 2 3 * / - > 7 2 3 T * / } T
T{ 7 2 - 3 * / - > 7 2 - 3 T * / } T
T{ -7 2 3 * / - > - 7 2 3 T * / } T
T{ -7 2 - 3 * / - > - 7 2 - 3 T * / } T
T{ MA X - INT 2 MAX - INT * / - > MAX - INT 2 MAX - INT T * / } T
T{ MI N - INT 2 MIN - INT * / - > MIN - INT 2 MIN - INT T * / } T
T{ 0 2 1 * / MOD - > 0 2 1 T * / MOD } T
T{ 1 2 1 * / MOD - > 1 2 1 T * / MOD } T
T{ 2 2 1 * / MOD - > 2 2 1 T * / MOD } T
T{ -1 2 1 * / MOD - > - 1 2 1 T * / MOD } T
T{ -2 2 1 * / MOD - > - 2 2 1 T * / MOD } T
T{ 0 2 - 1 * / MOD - > 0 2 - 1 T * / MOD } T
T{ 1 2 - 1 * / MOD - > 1 2 - 1 T * / MOD } T
T{ 2 2 - 1 * / MOD - > 2 2 - 1 T * / MOD } T
T{ -1 2 - 1 * / MOD - > - 1 2 - 1 T * / MOD } T
T{ -2 2 - 1 * / MOD - > - 2 2 - 1 T * / MOD } T
T{ 2 2 2 * / MOD - > 2 2 2 T * / MOD } T
T{ -1 2 - 1 * / MOD - > - 1 2 - 1 T * / MOD } T
T{ -2 2 - 2 * / MOD - > - 2 2 - 2 T * / MOD } T
T{ 7 2 3 * / MOD - > 7 2 3 T * / MOD } T
T{ 7 2 - 3 * / MOD - > 7 2 - 3 T * / MOD } T
T{ -7 2 3 * / MOD - > - 7 2 3 T * / MOD } T
T{ -7 2 - 3 * / MOD - > - 7 2 - 3 T * / MOD } T
T{ MA X - INT 2 MAX - INT * / MOD - > MAX - INT 2 MAX - INT T * / MOD } T
T{ MI N - INT 2 MIN - INT * / MOD - > MIN - INT 2 MIN - INT T * / MOD } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G HERE , @ ! CELL + CELLS C , C @ C ! CHARS 2 @ 2 ! ALIGN ALIGNED + ! ALL OT
HERE 1 ALLOT
HERE
CONSTANT 2NDA
CONSTANT 1STA
T{ 1S T A 2 NDA U < - > < TRUE > } T \ HERE MUST GROW WITH ALLOT
T{ 1S T A 1 + - > 2 NDA } T \ . . . BY ONE ADDRESS UNIT
( MIS S ING TEST : NEGATIVE ALLOT )
\ Add e d by GWJ so that ALIGN can be used before , ( comma ) is tested
1 ALI G NED CONSTANT ALMNT \ - - 1 | 2 | 4 | 8 for 8 | 16 | 32 | 64 bit alignment
ALIGN
T{ HE R E 1 ALLOT ALIGN HERE SWAP - ALMNT = - > < TRUE > } T
\ End of extra test
HERE 1 ,
HERE 2 ,
CONSTANT 2ND
CONSTANT 1ST
T{ 1S T 2 ND U < - > < TRUE > } T \ HERE MUST GROW WITH ALLOT
T{ 1S T CELL + - > 2 ND } T \ . . . BY ONE CELL
T{ 1S T 1 CELLS + - > 2 ND } T
T{ 1S T @ 2 ND @ - > 1 2 } T
T{ 5 1 ST ! -> }T
T{ 1S T @ 2 ND @ - > 5 2 } T
T{ 6 2 ND ! -> }T
T{ 1S T @ 2 ND @ - > 5 6 } T
T{ 1S T 2 @ - > 6 5 } T
T{ 2 1 1 ST 2 ! -> }T
T{ 1S T 2 @ - > 2 1 } T
T{ 1S 1 ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
HERE 1 C ,
HERE 2 C ,
CONSTANT 2NDC
CONSTANT 1STC
T{ 1S T C 2 NDC U < - > < TRUE > } T \ HERE MUST GROW WITH ALLOT
T{ 1S T C CHAR + - > 2 NDC } T \ . . . BY ONE CHAR
T{ 1S T C 1 CHARS + - > 2 NDC } T
T{ 1S T C C @ 2 NDC C @ - > 1 2 } T
T{ 3 1 STC C ! -> }T
T{ 1S T C C @ 2 NDC C @ - > 3 2 } T
T{ 4 2 NDC C ! -> }T
T{ 1S T C C @ 2 NDC C @ - > 3 4 } T
ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
CONSTANT A-ADDR CONSTANT UA-ADDR
T{ UA - ADDR ALIGNED - > A - ADDR } T
T{ 1 A - ADDR C ! A-ADDR C@ -> 1 }T
T{ 12 3 4 A - ADDR ! A-ADDR @ -> 1234 }T
T{ 12 3 456 A - ADDR 2 ! A-ADDR 2@ -> 123 456 }T
T{ 2 A - ADDR CHAR + C ! A-ADDR CHAR+ C@ -> 2 }T
T{ 3 A - ADDR CELL + C ! A-ADDR CELL+ C@ -> 3 }T
T{ 12 3 4 A - ADDR CELL + ! A-ADDR CELL+ @ -> 1234 }T
T{ 12 3 456 A - ADDR CELL + 2 ! A-ADDR CELL+ 2@ -> 123 456 }T
: BIT S ( X - - U )
0 S WAP BEGIN DUP WHILE DUP MSB AND IF > R 1 + R > THEN 2 * REPEAT DROP ;
( CHA R ACTERS > = 1 AU , < = SIZE OF CELL , > = 8 BITS )
T{ 1 C HARS 1 < - > < FALSE > } T
T{ 1 C HARS 1 CELLS > - > < FALSE > } T
( TBD : HOW TO FIND NUMBER OF BITS ? )
( CEL L S > = 1 AU , INTEGRAL MULTIPLE OF CHAR SIZE , > = 16 BITS )
T{ 1 C ELLS 1 < - > < FALSE > } T
T{ 1 C ELLS 1 CHARS MOD - > 0 } T
T{ 1S BITS 10 < - > < FALSE > } T
T{ 0 1 ST ! -> }T
T{ 1 1 ST + ! -> }T
T{ 1S T @ - > 1 } T
T{ -1 1 ST + ! 1ST @ -> 0 }T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G CHAR [ CHAR ] [ ] BL S "
T{ BL - > 20 } T
T{ CH A R X - > 58 } T
T{ CH A R HELLO - > 48 } T
T{ : G C1 [ CHAR ] X ; - > } T
T{ : G C2 [ CHAR ] HELLO ; - > } T
T{ GC 1 - > 58 } T
T{ GC 2 - > 48 } T
T{ : G C3 [ GC1 ] LITERAL ; - > } T
T{ GC 3 - > 58 } T
T{ : G C4 S " XY" ; - > } T
T{ GC 4 SWAP DROP - > 2 } T
T{ GC 4 DROP DUP C @ SWAP CHAR + C @ - > 58 59 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G ' [' ] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
T{ : G T1 123 ; - > } T
T{ ' G T1 EXECUTE - > 123 } T
T{ : G T2 [ ' ] GT1 ; IMMEDIATE - > } T
T{ GT 2 EXECUTE - > 123 } T
HERE 3 C , CHAR G C , CHAR T C , CHAR 1 C , CONSTANT GT1STRING
HERE 3 C , CHAR G C , CHAR T C , CHAR 2 C , CONSTANT GT2STRING
T{ GT 1 STRING FIND - > ' GT1 - 1 } T
T{ GT 2 STRING FIND - > ' GT2 1 } T
( HOW TO SEARCH FOR NON - EXISTENT WORD ? )
T{ : G T3 GT2 LITERAL ; - > } T
T{ GT 3 - > ' GT1 } T
T{ GT 1 STRING COUNT - > GT1STRING CHAR + 3 } T
T{ : G T4 POSTPONE GT1 ; IMMEDIATE - > } T
T{ : G T5 GT4 ; - > } T
T{ GT 5 - > 123 } T
T{ : G T6 345 ; IMMEDIATE - > } T
T{ : G T7 POSTPONE GT6 ; - > } T
T{ GT 7 - > 345 } T
T{ : G T8 STATE @ ; IMMEDIATE - > } T
T{ GT 8 - > 0 } T
T{ : G T9 GT8 LITERAL ; - > } T
T{ GT 9 0 = - > < FALSE > } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
T{ : G I1 IF 123 THEN ; - > } T
T{ : G I2 IF 123 ELSE 234 THEN ; - > } T
T{ 0 G I1 - > } T
T{ 1 G I1 - > 123 } T
T{ -1 GI1 - > 123 } T
T{ 0 G I2 - > 234 } T
T{ 1 G I2 - > 123 } T
T{ -1 GI1 - > 123 } T
T{ : G I3 BEGIN DUP 5 < WHILE DUP 1 + REPEAT ; - > } T
T{ 0 G I3 - > 0 1 2 3 4 5 } T
T{ 4 G I3 - > 4 5 } T
T{ 5 G I3 - > 5 } T
T{ 6 G I3 - > 6 } T
T{ : G I4 BEGIN DUP 1 + DUP 5 > UNTIL ; - > } T
T{ 3 G I4 - > 3 4 5 6 } T
T{ 5 G I4 - > 5 6 } T
T{ 6 G I4 - > 6 7 } T
T{ : G I5 BEGIN DUP 2 >
WHILE DUP 5 < WHILE DUP 1 + REPEAT 123 ELSE 345 THEN ; - > } T
T{ 1 G I5 - > 1 345 } T
T{ 2 G I5 - > 2 345 } T
T{ 3 G I5 - > 3 4 5 123 } T
T{ 4 G I5 - > 4 5 123 } T
T{ 5 G I5 - > 5 123 } T
T{ : G I6 ( N - - 0 , 1 , . . N ) DUP IF DUP > R 1 - RECURSE R > THEN ; - > } T
T{ 0 G I6 - > 0 } T
T{ 1 G I6 - > 0 1 } T
T{ 2 G I6 - > 0 1 2 } T
T{ 3 G I6 - > 0 1 2 3 } T
T{ 4 G I6 - > 0 1 2 3 4 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G DO LOOP + LOOP I J UNLOOP LEAVE EXIT
T{ : G D1 DO I LOOP ; - > } T
T{ 4 1 GD1 - > 1 2 3 } T
T{ 2 - 1 GD1 - > - 1 0 1 } T
T{ MI D - UINT + 1 MID - UINT GD1 - > MID - UINT } T
T{ : G D2 DO I - 1 + LOOP ; - > } T
T{ 1 4 GD2 - > 4 3 2 1 } T
T{ -1 2 GD2 - > 2 1 0 - 1 } T
T{ MI D - UINT MID - UINT + 1 GD2 - > MID - UINT + 1 MID - UINT } T
T{ : G D3 DO 1 0 DO J LOOP LOOP ; - > } T
T{ 4 1 GD3 - > 1 2 3 } T
T{ 2 - 1 GD3 - > - 1 0 1 } T
T{ MI D - UINT + 1 MID - UINT GD3 - > MID - UINT } T
T{ : G D4 DO 1 0 DO J LOOP - 1 + LOOP ; - > } T
T{ 1 4 GD4 - > 4 3 2 1 } T
T{ -1 2 GD4 - > 2 1 0 - 1 } T
T{ MI D - UINT MID - UINT + 1 GD4 - > MID - UINT + 1 MID - UINT } T
T{ : G D5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; - > } T
T{ 1 G D5 - > 123 } T
T{ 5 G D5 - > 123 } T
T{ 6 G D5 - > 234 } T
T{ : G D6 ( PAT : T { 0 0 } , { 0 0 } { 1 0 } { 1 1 } , { 0 0 } { 1 0 } { 1 1 } { 2 0 } { 2 1 } { 2 2 } )
0 S WAP 0 DO
I 1 + 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1 + LOOP
L O OP ; - > } T
T{ 1 G D6 - > 1 } T
T{ 2 G D6 - > 3 } T
T{ 3 G D6 - > 4 1 2 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G DEFINING WORDS : : ; CONSTANT VARIABLE CREATE DOES > > BODY
T{ 12 3 CONSTANT X123 - > } T
T{ X1 2 3 - > 123 } T
T{ : E QU CONSTANT ; - > } T
T{ X1 2 3 EQU Y123 - > } T
T{ Y1 2 3 - > 123 } T
T{ VA R IABLE V1 - > } T
T{ 12 3 V1 ! -> }T
T{ V1 @ - > 123 } T
T{ : N OP : POSTPONE ; ; - > } T
T{ NO P NOP1 NOP NOP2 - > } T
T{ NO P 1 - > } T
T{ NO P 2 - > } T
T{ : D OES1 DOES > @ 1 + ; - > } T
T{ : D OES2 DOES > @ 2 + ; - > } T
T{ CR E ATE CR1 - > } T
T{ CR 1 - > HERE } T
T{ ' C R1 > BODY - > HERE } T
T{ 1 , - > } T
T{ CR 1 @ - > 1 } T
T{ DO E S1 - > } T
T{ CR 1 - > 2 } T
T{ DO E S2 - > } T
T{ CR 1 - > 3 } T
T{ : W EIRD : CREATE DOES > 1 + DOES > 2 + ; - > } T
T{ WE I RD : W1 - > } T
T{ ' W 1 > BODY - > HERE } T
T{ W1 - > HERE 1 + } T
T{ W1 - > HERE 2 + } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G EVALUATE
: GE1 S " 123" ; IMMEDIATE
: GE2 S " 123 1+" ; IMMEDIATE
: GE3 S " : GE4 345 ;" ;
: GE5 EVALUATE ; IMMEDIATE
T{ GE 1 EVALUATE - > 123 } T ( TEST EVALUATE IN INTERP . STATE )
T{ GE 2 EVALUATE - > 124 } T
T{ GE 3 EVALUATE - > } T
T{ GE 4 - > 345 } T
T{ : G E6 GE1 GE5 ; - > } T ( TEST EVALUATE IN COMPILE STATE )
T{ GE 6 - > 123 } T
T{ : G E7 GE2 GE5 ; - > } T
T{ GE 7 - > 124 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G SOURCE > IN WORD
: GS1 S " SOURCE" 2 DUP EVALUATE
> R SWAP > R = R > R > = ;
T{ GS 1 - > < TRUE > < TRUE > } T
VARIA B LE SCANS
: RES C AN ? - 1 SCANS + ! SCANS @ IF 0 >IN ! THEN ;
T{ 2 S CANS !
345 R E SCAN ?
-> 34 5 345 } T
: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
T{ GS 2 - > 123 123 123 123 123 } T
: GS3 WORD COUNT SWAP C @ ;
T{ BL GS3 HELLO - > 5 CHAR H } T
T{ CH A R " GS3 GOODBYE" - > 7 CHAR G } T
T{ BL GS3
DROP - > 0 } T \ BLANK LINE RETURN ZERO - LENGTH STRING
: GS4 SOURCE > IN ! DROP ;
T{ GS 4 123 456
-> }T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G < # # # S # > HOLD SIGN BASE > NUMBER HEX DECIMAL
: S= \ ( ADDR1 C1 ADDR2 C2 - - T / F ) COMPARE TWO STRINGS .
>R SWAP R @ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
R > ? DUP IF \ IF NON - EMPTY STRINGS
0 DO
OVER C @ OVER C @ - IF 2 DROP < FALSE > UNLOOP EXIT THEN
SWAP CHAR + SWAP CHAR +
LOOP
THEN
2 DROP < TRUE > \ IF WE GET HERE , STRINGS MATCH
EL S E
R > DROP 2 DROP < FALSE > \ LENGTHS MISMATCH
TH E N ;
: GP1 < # 41 HOLD 42 HOLD 0 0 # > S " BA" S = ;
T{ GP 1 - > < TRUE > } T
: GP2 < # - 1 SIGN 0 SIGN - 1 SIGN 0 0 # > S " --" S = ;
T{ GP 2 - > < TRUE > } T
: GP3 < # 1 0 # # # > S " 01" S = ;
T{ GP 3 - > < TRUE > } T
: GP4 < # 1 0 # S # > S " 1" S = ;
T{ GP 4 - > < TRUE > } T
24 CO N STANT MAX - BASE \ BASE 2 . . 36
: COU N T - BITS
0 0 INVERT BEGIN DUP WHILE > R 1 + R > 2 * REPEAT DROP ;
COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
: GP5
BA S E @ < TRUE >
MA X - BASE 1 + 2 DO \ FOR EACH POSSIBLE BASE
I BASE ! \ TBD: ASSUMES BASE WORKS
I 0 < # # S # > S " 10" S = AND
LO O P
SW A P BASE ! ;
T{ GP 5 - > < TRUE > } T
: GP6
BA S E @ > R 2 BASE !
MA X - UINT MAX - UINT < # # S # > \ MAXIMUM UD TO BINARY
R> BASE ! \ S: C-ADDR U
DU P # BITS - UD = SWAP
0 D O \ S : C - ADDR FLAG
OVER C @ [ CHAR ] 1 = AND \ ALL ONES
> R CHAR + R >
LO O P SWAP DROP ;
T{ GP 6 - > < TRUE > } T
: GP7
BA S E @ > R MAX - BASE BASE !
<T R UE >
A 0 DO
I 0 < # # S # >
1 = SWAP C @ I 30 + = AND AND
LO O P
MA X - BASE A DO
I 0 < # # S # >
1 = SWAP C @ 41 I A - + = AND AND
LO O P
R> BASE ! ;
T{ GP 7 - > < TRUE > } T
\ >NU M BER TESTS
CREATE GN-BUF 0 C,
: GN- S TRING GN - BUF 1 ;
: GN- C ONSUMED GN - BUF CHAR + 0 ;
: GN' [ CHAR ] ' WORD CHAR + C @ GN - BUF C ! GN-STRING ;
T{ 0 0 GN ' 0' > NUMBER - > 0 0 GN - CONSUMED } T
T{ 0 0 GN ' 1' > NUMBER - > 1 0 GN - CONSUMED } T
T{ 1 0 GN ' 1' > NUMBER - > BASE @ 1 + 0 GN - CONSUMED } T
T{ 0 0 GN ' -' > NUMBER - > 0 0 GN - STRING } T \ SHOULD FAIL TO CONVERT THE SE
T{ 0 0 GN ' +' > NUMBER - > 0 0 GN - STRING } T
T{ 0 0 GN ' .' > NUMBER - > 0 0 GN - STRING } T
: >NU M BER - BASED
BA S E @ > R BASE ! >NUMBER R> BASE ! ;
T{ 0 0 GN ' 2' 10 > NUMBER - BASED - > 2 0 GN - CONSUMED } T
T{ 0 0 GN ' 2' 2 > NUMBER - BASED - > 0 0 GN - STRING } T
T{ 0 0 GN ' F' 10 > NUMBER - BASED - > F 0 GN - CONSUMED } T
T{ 0 0 GN ' G' 10 > NUMBER - BASED - > 0 0 GN - STRING } T
T{ 0 0 GN ' G' MAX - BASE > NUMBER - BASED - > 10 0 GN - CONSUMED } T
T{ 0 0 GN ' Z' MAX - BASE > NUMBER - BASED - > 23 0 GN - CONSUMED } T
: GN1 \ ( UD BASE - - UD ' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE Z ERO.
BA S E @ > R BASE !
<# #S #>
0 0 2 SWAP > NUMBER SWAP DROP \ RETURN LENGTH ONLY
R> BASE ! ;
T{ 0 0 2 GN1 - > 0 0 0 } T
T{ MA X - UINT 0 2 GN1 - > MAX - UINT 0 0 } T
T{ MA X - UINT DUP 2 GN1 - > MAX - UINT DUP 0 } T
T{ 0 0 MAX - BASE GN1 - > 0 0 0 } T
T{ MA X - UINT 0 MAX - BASE GN1 - > MAX - UINT 0 0 } T
T{ MA X - UINT DUP MAX - BASE GN1 - > MAX - UINT DUP 0 } T
: GN2 \ ( - - 16 10 )
BA S E @ > R HEX BASE @ DECIMAL BASE @ R > BASE ! ;
T{ GN 2 - > 10 A } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G FILL MOVE
CREATE FBUF 00 C, 00 C, 00 C,
CREATE SBUF 12 C, 34 C, 56 C,
: SEE B UF FBUF C @ FBUF CHAR + C @ FBUF CHAR + CHAR + C @ ;
T{ FB U F 0 20 FILL - > } T
T{ SE E BUF - > 00 00 00 } T
T{ FB U F 1 20 FILL - > } T
T{ SE E BUF - > 20 00 00 } T
T{ FB U F 3 20 FILL - > } T
T{ SE E BUF - > 20 20 20 } T
T{ FB U F FBUF 3 CHARS MOVE - > } T \ BIZARRE SPECIAL CASE
T{ SE E BUF - > 20 20 20 } T
T{ SB U F FBUF 0 CHARS MOVE - > } T
T{ SE E BUF - > 20 20 20 } T
T{ SB U F FBUF 1 CHARS MOVE - > } T
T{ SE E BUF - > 12 20 20 } T
T{ SB U F FBUF 3 CHARS MOVE - > } T
T{ SE E BUF - > 12 34 56 } T
T{ FB U F FBUF CHAR + 2 CHARS MOVE - > } T
T{ SE E BUF - > 12 12 34 } T
T{ FB U F CHAR + FBUF 2 CHARS MOVE - > } T
T{ SE E BUF - > 12 34 34 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G OUTPUT : . . " CR EMIT SPACE SPACES TYPE U .
: OUT P UT - TEST
." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS : " CR
41 BL DO I EMIT LOOP CR
61 41 DO I EMIT LOOP CR
7F 61 DO I EMIT LOOP CR
." YOU SHOULD SEE 0 - 9 SEPARATED BY A SPACE : " CR
9 1 + 0 DO I . LOOP CR
." YOU SHOULD SEE 0 - 9 ( WITH NO SPACES ) : " CR
[C H AR ] 9 1 + [ CHAR ] 0 DO I 0 SPACES EMIT LOOP CR
." YOU SHOULD SEE A - G SEPARATED BY A SPACE : " CR
[C H AR ] G 1 + [ CHAR ] A DO I EMIT SPACE LOOP CR
." YOU SHOULD SEE 0 - 5 SEPARATED BY TWO SPACES : " CR
5 1 + 0 DO I [ CHAR ] 0 + EMIT 2 SPACES LOOP CR
." YOU SHOULD SEE TWO SEPARATE LINES : " CR
S" LINE 1 " TYPE CR S" LINE 2 " TYPE CR
." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS : " CR
." SIGNED : " MIN - INT . MAX - INT . CR
." UNSIGNED : " 0 U . MAX - UINT U . CR
;
T{ OU T PUT - TEST - > } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G INPUT : ACCEPT
CREATE ABUF 50 CHARS ALLOT
: ACC E PT - TEST
CR . " PLEASE TYPE UP TO 80 CHARACTERS:" CR
AB U F 50 ACCEPT
CR . " RECEIVED: " [ CHAR ] " EMIT
AB U F SWAP TYPE [ CHAR ] " EMIT CR
;
T{ AC C EPT - TEST - > } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
TESTI N G DICTIONARY SEARCH RULES
T{ : G DX 123 ; : GDX GDX 234 ; - > } T
T{ GD X - > 123 234 } T
CR .( End of Core word set tests) CR
\ To t est the ANS Forth Core Extension word set
\ Thi s program was written by Gerry Jackson in 2006 , with contributions from
\ oth e rs where indicated , and is in the public domain - it can be distri buted
\ and / or modified in any way but please retain this notice .
\ Thi s program is distributed in the hope that it will be useful ,
\ but WITHOUT ANY WARRANTY ; without even the implied warranty of
\ MER C HANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
\ The tests are not claimed to be comprehensive or correct
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --------
\ Ver s ion 0.13 28 October 2015
\ Replace < FALSE > and < TRUE > with FALSE and TRUE to avoid
\ dependence on Core tests
\ Moved SAVE - INPUT and RESTORE - INPUT tests in a file to fil etest.fth
\ Use of 2 VARIABLE ( from optional wordset ) replaced with CR EATE.
\ Minor lower to upper case conversions .
\ Calls to COMPARE replaced by S = ( in utilities . fth ) to avo id use
\ of a word from an optional word set .
\ UNUSED tests revised as UNUSED UNUSED = may return FALSE when an
\ implementation has the data stack sharing unused dataspac e.
\ Double number input dependency removed from the HOLDS tes ts.
\ Minor case sensitivities removed in definition names .
\ 0.11 25 April 2015
\ Added tests for PARSE - NAME HOLDS BUFFER :
\ S \ " tests added
\ DEFER IS ACTION - OF DEFER ! DEFER@ tests added
\ Empty CASE statement test added
\ [ COMPILE ] tests removed because it is obsolescent in Fort h 2012
\ 0.10 1 August 2014
\ Added tests contributed by James Bowman for :
\ < > U > 0 < > 0 > NIP TUCK ROLL PICK 2 > R 2 R @ 2 R >
\ HEX WITHIN UNUSED AGAIN MARKER
\ Added tests for :
\ . R U . R ERASE PAD REFILL SOURCE - ID
\ Removed ABORT from NeverExecuted to enable Win32
\ to continue after failure of RESTORE - INPUT .
\ Removed max - intx which is no longer used .
\ 0.7 6 June 2012 Extra CASE test added
\ 0.6 1 April 2012 Tests placed in the public domain .
\ SAVE - INPUT & RESTORE - INPUT tests , position
\ of T { moved so that tests work with ttester . fs
\ CONVERT test deleted - obsolete word removed from Forth 20 0X
\ IMMEDIATE VALUEs tested
\ RECURSE with : NONAME tested
\ PARSE and . ( tested
\ Parsing behaviour of C " added
\ 0.5 14 September 2011 Removed the double [ ELSE ] from the
\ initial SAVE - INPUT & RESTORE - INPUT test
\ 0.4 30 November 2009 max - int replaced with max - intx to
\ avoid redefinition warnings .
\ 0.3 6 March 2009 { and } replaced with T { and } T
\ CONVERT test now independent of cell size
\ 0.2 20 April 2007 ANS Forth words changed to upper case
\ Tests qd3 to qd6 by Reinhold Straub
\ 0.1 Oct 2006 First version released
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
\ The tests are based on John Hayes test program for the core word set
\ Wor d s tested in this file are :
\ . ( . R 0 < > 0 > 2 > R 2 R > 2 R @ : NONAME < > ? DO AGAIN C " CASE COMPILE , END CASE
\ ENDOF ERASE FALSE HEX MARKER NIP OF PAD PARSE PICK REFILL
\ RESTORE - INPUT ROLL SAVE - INPUT SOURCE - ID TO TRUE TUCK U . R U > UNUSED
\ VALUE WITHIN [ COMPILE ]
\ Wor d s not tested or partially tested :
\ \ because it has been extensively used already and is , hence , unne cessary
\ REFILL and SOURCE - ID from the user input device which are not poss ible
\ when testing from a file such as this one
\ UNUSED ( partially tested ) as the value returned is system dependen t
\ Obsolescent words # TIB CONVERT EXPECT QUERY SPAN TIB as they have been
\ removed from the Forth 2012 standard
\ Res u lts from words that output to the user output device have to visua lly
\ che c ked for correctness . These are . R U . R . (
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
\ Ass u mptions & dependencies :
\ - tester . fr ( or ttester . fs ) , errorreport . fth and utilities . fth hav e been
\ included prior to this file
\ - the Core word set available
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G Core Extension words
DECIM A L
TESTI N G TRUE FALSE
T{ TR U E - > 0 INVERT } T
T{ FA L SE - > 0 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G < > U > ( contributed by James Bowman )
T{ 0 0 < > - > FALSE } T
T{ 1 1 < > - > FALSE } T
T{ -1 - 1 < > - > FALSE } T
T{ 1 0 < > - > TRUE } T
T{ -1 0 < > - > TRUE } T
T{ 0 1 < > - > TRUE } T
T{ 0 - 1 < > - > TRUE } T
T{ 0 1 U > - > FALSE } T
T{ 1 2 U > - > FALSE } T
T{ 0 M ID - UINT U > - > FALSE } T
T{ 0 M AX - UINT U > - > FALSE } T
T{ MI D - UINT MAX - UINT U > - > FALSE } T
T{ 0 0 U > - > FALSE } T
T{ 1 1 U > - > FALSE } T
T{ 1 0 U > - > TRUE } T
T{ 2 1 U > - > TRUE } T
T{ MI D - UINT 0 U > - > TRUE } T
T{ MA X - UINT 0 U > - > TRUE } T
T{ MA X - UINT MID - UINT U > - > TRUE } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G 0 < > 0 > ( contributed by James Bowman )
T{ 0 0 < > - > FALSE } T
T{ 1 0 < > - > TRUE } T
T{ 2 0 < > - > TRUE } T
T{ -1 0 < > - > TRUE } T
T{ MA X - UINT 0 < > - > TRUE } T
T{ MI N - INT 0 < > - > TRUE } T
T{ MA X - INT 0 < > - > TRUE } T
T{ 0 0 > - > FALSE } T
T{ -1 0 > - > FALSE } T
T{ MI N - INT 0 > - > FALSE } T
T{ 1 0 > - > TRUE } T
T{ MA X - INT 0 > - > TRUE } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G NIP TUCK ROLL PICK ( contributed by James Bowman )
T{ 1 2 NIP - > 2 } T
T{ 1 2 3 NIP - > 1 3 } T
T{ 1 2 TUCK - > 2 1 2 } T
T{ 1 2 3 TUCK - > 1 3 2 3 } T
T{ : R O5 100 200 300 400 500 ; - > } T
T{ RO 5 3 ROLL - > 100 300 400 500 200 } T
T{ RO 5 2 ROLL - > RO5 ROT } T
T{ RO 5 1 ROLL - > RO5 SWAP } T
T{ RO 5 0 ROLL - > RO5 } T
T{ RO 5 2 PICK - > 100 200 300 400 500 300 } T
T{ RO 5 1 PICK - > RO5 OVER } T
T{ RO 5 0 PICK - > RO5 DUP } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G 2 > R 2 R @ 2 R > ( contributed by James Bowman )
T{ : R R0 2 > R 100 R > R > ; - > } T
T{ 30 0 400 RR0 - > 100 400 300 } T
T{ 20 0 300 400 RR0 - > 200 100 400 300 } T
T{ : R R1 2 > R 100 2 R @ R > R > ; - > } T
T{ 30 0 400 RR1 - > 100 300 400 400 300 } T
T{ 20 0 300 400 RR1 - > 200 100 300 400 400 300 } T
T{ : R R2 2 > R 100 2 R > ; - > } T
T{ 30 0 400 RR2 - > 100 300 400 } T
T{ 20 0 300 400 RR2 - > 200 100 300 400 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G HEX ( contributed by James Bowman )
T{ BA S E @ HEX BASE @ DECIMAL BASE @ - SWAP BASE ! -> 6 }T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G WITHIN ( contributed by James Bowman )
T{ 0 0 0 WITHIN - > FALSE } T
T{ 0 0 MID - UINT WITHIN - > TRUE } T
T{ 0 0 MID - UINT + 1 WITHIN - > TRUE } T
T{ 0 0 MAX - UINT WITHIN - > TRUE } T
T{ 0 M ID - UINT 0 WITHIN - > FALSE } T
T{ 0 M ID - UINT MID - UINT WITHIN - > FALSE } T
T{ 0 M ID - UINT MID - UINT + 1 WITHIN - > FALSE } T
T{ 0 M ID - UINT MAX - UINT WITHIN - > FALSE } T
T{ 0 M ID - UINT + 1 0 WITHIN - > FALSE } T
T{ 0 M ID - UINT + 1 MID - UINT WITHIN - > TRUE } T
T{ 0 M ID - UINT + 1 MID - UINT + 1 WITHIN - > FALSE } T
T{ 0 M ID - UINT + 1 MAX - UINT WITHIN - > FALSE } T
T{ 0 M AX - UINT 0 WITHIN - > FALSE } T
T{ 0 M AX - UINT MID - UINT WITHIN - > TRUE } T
T{ 0 M AX - UINT MID - UINT + 1 WITHIN - > TRUE } T
T{ 0 M AX - UINT MAX - UINT WITHIN - > FALSE } T
T{ MI D - UINT 0 0 WITHIN - > FALSE } T
T{ MI D - UINT 0 MID - UINT WITHIN - > FALSE } T
T{ MI D - UINT 0 MID - UINT + 1 WITHIN - > TRUE } T
T{ MI D - UINT 0 MAX - UINT WITHIN - > TRUE } T
T{ MI D - UINT MID - UINT 0 WITHIN - > TRUE } T
T{ MI D - UINT MID - UINT MID - UINT WITHIN - > FALSE } T
T{ MI D - UINT MID - UINT MID - UINT + 1 WITHIN - > TRUE } T
T{ MI D - UINT MID - UINT MAX - UINT WITHIN - > TRUE } T
T{ MI D - UINT MID - UINT + 1 0 WITHIN - > FALSE } T
T{ MI D - UINT MID - UINT + 1 MID - UINT WITHIN - > FALSE } T
T{ MI D - UINT MID - UINT + 1 MID - UINT + 1 WITHIN - > FALSE } T
T{ MI D - UINT MID - UINT + 1 MAX - UINT WITHIN - > FALSE } T
T{ MI D - UINT MAX - UINT 0 WITHIN - > FALSE } T
T{ MI D - UINT MAX - UINT MID - UINT WITHIN - > FALSE } T
T{ MI D - UINT MAX - UINT MID - UINT + 1 WITHIN - > TRUE } T
T{ MI D - UINT MAX - UINT MAX - UINT WITHIN - > FALSE } T
T{ MI D - UINT + 1 0 0 WITHIN - > FALSE } T
T{ MI D - UINT + 1 0 MID - UINT WITHIN - > FALSE } T
T{ MI D - UINT + 1 0 MID - UINT + 1 WITHIN - > FALSE } T
T{ MI D - UINT + 1 0 MAX - UINT WITHIN - > TRUE } T
T{ MI D - UINT + 1 MID - UINT 0 WITHIN - > TRUE } T
T{ MI D - UINT + 1 MID - UINT MID - UINT WITHIN - > FALSE } T
T{ MI D - UINT + 1 MID - UINT MID - UINT + 1 WITHIN - > FALSE } T
T{ MI D - UINT + 1 MID - UINT MAX - UINT WITHIN - > TRUE } T
T{ MI D - UINT + 1 MID - UINT + 1 0 WITHIN - > TRUE } T
T{ MI D - UINT + 1 MID - UINT + 1 MID - UINT WITHIN - > TRUE } T
T{ MI D - UINT + 1 MID - UINT + 1 MID - UINT + 1 WITHIN - > FALSE } T
T{ MI D - UINT + 1 MID - UINT + 1 MAX - UINT WITHIN - > TRUE } T
T{ MI D - UINT + 1 MAX - UINT 0 WITHIN - > FALSE } T
T{ MI D - UINT + 1 MAX - UINT MID - UINT WITHIN - > FALSE } T
T{ MI D - UINT + 1 MAX - UINT MID - UINT + 1 WITHIN - > FALSE } T
T{ MI D - UINT + 1 MAX - UINT MAX - UINT WITHIN - > FALSE } T
T{ MA X - UINT 0 0 WITHIN - > FALSE } T
T{ MA X - UINT 0 MID - UINT WITHIN - > FALSE } T
T{ MA X - UINT 0 MID - UINT + 1 WITHIN - > FALSE } T
T{ MA X - UINT 0 MAX - UINT WITHIN - > FALSE } T
T{ MA X - UINT MID - UINT 0 WITHIN - > TRUE } T
T{ MA X - UINT MID - UINT MID - UINT WITHIN - > FALSE } T
T{ MA X - UINT MID - UINT MID - UINT + 1 WITHIN - > FALSE } T
T{ MA X - UINT MID - UINT MAX - UINT WITHIN - > FALSE } T
T{ MA X - UINT MID - UINT + 1 0 WITHIN - > TRUE } T
T{ MA X - UINT MID - UINT + 1 MID - UINT WITHIN - > TRUE } T
T{ MA X - UINT MID - UINT + 1 MID - UINT + 1 WITHIN - > FALSE } T
T{ MA X - UINT MID - UINT + 1 MAX - UINT WITHIN - > FALSE } T
T{ MA X - UINT MAX - UINT 0 WITHIN - > TRUE } T
T{ MA X - UINT MAX - UINT MID - UINT WITHIN - > TRUE } T
T{ MA X - UINT MAX - UINT MID - UINT + 1 WITHIN - > TRUE } T
T{ MA X - UINT MAX - UINT MAX - UINT WITHIN - > FALSE } T
T{ MI N - INT MIN - INT MIN - INT WITHIN - > FALSE } T
T{ MI N - INT MIN - INT 0 WITHIN - > TRUE } T
T{ MI N - INT MIN - INT 1 WITHIN - > TRUE } T
T{ MI N - INT MIN - INT MAX - INT WITHIN - > TRUE } T
T{ MI N - INT 0 MIN - INT WITHIN - > FALSE } T
T{ MI N - INT 0 0 WITHIN - > FALSE } T
T{ MI N - INT 0 1 WITHIN - > FALSE } T
T{ MI N - INT 0 MAX - INT WITHIN - > FALSE } T
T{ MI N - INT 1 MIN - INT WITHIN - > FALSE } T
T{ MI N - INT 1 0 WITHIN - > TRUE } T
T{ MI N - INT 1 1 WITHIN - > FALSE } T
T{ MI N - INT 1 MAX - INT WITHIN - > FALSE } T
T{ MI N - INT MAX - INT MIN - INT WITHIN - > FALSE } T
T{ MI N - INT MAX - INT 0 WITHIN - > TRUE } T
T{ MI N - INT MAX - INT 1 WITHIN - > TRUE } T
T{ MI N - INT MAX - INT MAX - INT WITHIN - > FALSE } T
T{ 0 M IN - INT MIN - INT WITHIN - > FALSE } T
T{ 0 M IN - INT 0 WITHIN - > FALSE } T
T{ 0 M IN - INT 1 WITHIN - > TRUE } T
T{ 0 M IN - INT MAX - INT WITHIN - > TRUE } T
T{ 0 0 MIN - INT WITHIN - > TRUE } T
T{ 0 0 0 WITHIN - > FALSE } T
T{ 0 0 1 WITHIN - > TRUE } T
T{ 0 0 MAX - INT WITHIN - > TRUE } T
T{ 0 1 MIN - INT WITHIN - > FALSE } T
T{ 0 1 0 WITHIN - > FALSE } T
T{ 0 1 1 WITHIN - > FALSE } T
T{ 0 1 MAX - INT WITHIN - > FALSE } T
T{ 0 M AX - INT MIN - INT WITHIN - > FALSE } T
T{ 0 M AX - INT 0 WITHIN - > FALSE } T
T{ 0 M AX - INT 1 WITHIN - > TRUE } T
T{ 0 M AX - INT MAX - INT WITHIN - > FALSE } T
T{ 1 M IN - INT MIN - INT WITHIN - > FALSE } T
T{ 1 M IN - INT 0 WITHIN - > FALSE } T
T{ 1 M IN - INT 1 WITHIN - > FALSE } T
T{ 1 M IN - INT MAX - INT WITHIN - > TRUE } T
T{ 1 0 MIN - INT WITHIN - > TRUE } T
T{ 1 0 0 WITHIN - > FALSE } T
T{ 1 0 1 WITHIN - > FALSE } T
T{ 1 0 MAX - INT WITHIN - > TRUE } T
T{ 1 1 MIN - INT WITHIN - > TRUE } T
T{ 1 1 0 WITHIN - > TRUE } T
T{ 1 1 1 WITHIN - > FALSE } T
T{ 1 1 MAX - INT WITHIN - > TRUE } T
T{ 1 M AX - INT MIN - INT WITHIN - > FALSE } T
T{ 1 M AX - INT 0 WITHIN - > FALSE } T
T{ 1 M AX - INT 1 WITHIN - > FALSE } T
T{ 1 M AX - INT MAX - INT WITHIN - > FALSE } T
T{ MA X - INT MIN - INT MIN - INT WITHIN - > FALSE } T
T{ MA X - INT MIN - INT 0 WITHIN - > FALSE } T
T{ MA X - INT MIN - INT 1 WITHIN - > FALSE } T
T{ MA X - INT MIN - INT MAX - INT WITHIN - > FALSE } T
T{ MA X - INT 0 MIN - INT WITHIN - > TRUE } T
T{ MA X - INT 0 0 WITHIN - > FALSE } T
T{ MA X - INT 0 1 WITHIN - > FALSE } T
T{ MA X - INT 0 MAX - INT WITHIN - > FALSE } T
T{ MA X - INT 1 MIN - INT WITHIN - > TRUE } T
T{ MA X - INT 1 0 WITHIN - > TRUE } T
T{ MA X - INT 1 1 WITHIN - > FALSE } T
T{ MA X - INT 1 MAX - INT WITHIN - > FALSE } T
T{ MA X - INT MAX - INT MIN - INT WITHIN - > TRUE } T
T{ MA X - INT MAX - INT 0 WITHIN - > TRUE } T
T{ MA X - INT MAX - INT 1 WITHIN - > TRUE } T
T{ MA X - INT MAX - INT MAX - INT WITHIN - > FALSE } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G UNUSED ( contributed by James Bowman & Peter Knaggs )
VARIA B LE UNUSED0
T{ UN U SED DROP - > } T
T{ AL I GN UNUSED UNUSED0 ! 0 , UNUSED CELL+ UNUSED0 @ = -> TRUE }T
T{ UN U SED UNUSED0 ! 0 C, UNUSED CHAR+ UNUSED0 @ =
- > TRUE } T \ aligned - > unaligned
T{ UN U SED UNUSED0 ! 0 C , UNUSED CHAR + UNUSED0 @ = - > TRUE } T \ unaligne d -> ?
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G AGAIN ( contributed by James Bowman )
T{ : A G0 701 BEGIN DUP 7 MOD 0 = IF EXIT THEN 1 + AGAIN ; - > } T
T{ AG 0 - > 707 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G MARKER ( contributed by James Bowman )
T{ : M A ? BL WORD FIND NIP 0 < > ; - > } T
T{ MA R KER MA0 - > } T
T{ : M A1 111 ; - > } T
T{ MA R KER MA2 - > } T
T{ : M A1 222 ; - > } T
T{ MA ? MA0 MA ? MA1 MA ? MA2 - > TRUE TRUE TRUE } T
T{ MA 1 MA2 MA1 - > 222 111 } T
T{ MA ? MA0 MA ? MA1 MA ? MA2 - > TRUE TRUE FALSE } T
T{ MA 0 - > } T
T{ MA ? MA0 MA ? MA1 MA ? MA2 - > FALSE FALSE FALSE } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G ? DO
: QD ? DO I LOOP ;
T{ 78 9 789 QD - > } T
T{ -9 8 76 - 9876 QD - > } T
T{ 5 0 QD - > 0 1 2 3 4 } T
: QD1 ? DO I 10 + LOOP ;
T{ 50 1 QD1 - > 1 11 21 31 41 } T
T{ 50 0 QD1 - > 0 10 20 30 40 } T
: QD2 ? DO I 3 > IF LEAVE ELSE I THEN LOOP ;
T{ 5 - 1 QD2 - > - 1 0 1 2 3 } T
: QD3 ? DO I 1 + LOOP ;
T{ 4 4 QD3 - > } T
T{ 4 1 QD3 - > 1 2 3 } T
T{ 2 - 1 QD3 - > - 1 0 1 } T
: QD4 ? DO I - 1 + LOOP ;
T{ 4 4 QD4 - > } T
T{ 1 4 QD4 - > 4 3 2 1 } T
T{ -1 2 QD4 - > 2 1 0 - 1 } T
: QD5 ? DO I - 10 + LOOP ;
T{ 1 50 QD5 - > 50 40 30 20 10 } T
T{ 0 50 QD5 - > 50 40 30 20 10 0 } T
T{ -2 5 10 QD5 - > 10 0 - 10 - 20 } T
VARIA B LE ITERS
VARIA B LE INCRMNT
: QD6 ( limit start increment - - )
IN C RMNT !
0 I TERS !
?D O
1 ITERS + !
I
ITERS @ 6 = IF LEAVE THEN
INCRMNT @
+L O OP ITERS @
;
T{ 4 4 - 1 QD6 - > 0 } T
T{ 1 4 - 1 QD6 - > 4 3 2 1 4 } T
T{ 4 1 - 1 QD6 - > 1 0 - 1 - 2 - 3 - 4 6 } T
T{ 4 1 0 QD6 - > 1 1 1 1 1 1 6 } T
T{ 0 0 0 QD6 - > 0 } T
T{ 1 4 0 QD6 - > 4 4 4 4 4 4 6 } T
T{ 1 4 1 QD6 - > 4 5 6 7 8 9 6 } T
T{ 4 1 1 QD6 - > 1 2 3 3 } T
T{ 4 4 1 QD6 - > 0 } T
T{ 2 - 1 - 1 QD6 - > - 1 - 2 - 3 - 4 - 5 - 6 6 } T
T{ -1 2 - 1 QD6 - > 2 1 0 - 1 4 } T
T{ 2 - 1 0 QD6 - > - 1 - 1 - 1 - 1 - 1 - 1 6 } T
T{ -1 2 0 QD6 - > 2 2 2 2 2 2 6 } T
T{ -1 2 1 QD6 - > 2 3 4 5 6 7 6 } T
T{ 2 - 1 1 QD6 - > - 1 0 1 3 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G BUFFER :
T{ 8 B UFFER : BUF : TEST - > } T
T{ BU F : TEST DUP ALIGNED = - > TRUE } T
T{ 11 1 BUF : TEST ! 222 BUF:TEST CELL+ ! -> }T
T{ BU F : TEST @ BUF : TEST CELL + @ - > 111 222 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G VALUE TO
T{ 11 1 VALUE VAL1 - 999 VALUE VAL2 - > } T
T{ VA L 1 - > 111 } T
T{ VA L 2 - > - 999 } T
T{ 22 2 TO VAL1 - > } T
T{ VA L 1 - > 222 } T
T{ : V D1 VAL1 ; - > } T
T{ VD 1 - > 222 } T
T{ : V D2 TO VAL2 ; - > } T
T{ VA L 2 - > - 999 } T
T{ -3 3 3 VD2 - > } T
T{ VA L 2 - > - 333 } T
T{ VA L 1 - > 222 } T
T{ 12 3 VALUE VAL3 IMMEDIATE VAL3 - > 123 } T
T{ : V D3 VAL3 LITERAL ; VD3 - > 123 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G CASE OF ENDOF ENDCASE
: CS1 CASE 1 OF 111 ENDOF
2 OF 222 ENDOF
3 OF 333 ENDOF
> R 999 R >
ENDCASE
;
T{ 1 C S1 - > 111 } T
T{ 2 C S1 - > 222 } T
T{ 3 C S1 - > 333 } T
T{ 4 C S1 - > 999 } T
\ Nes t ed CASE ' s
: CS2 > R CASE - 1 OF CASE R @ 1 OF 100 ENDOF
2 OF 200 ENDOF
> R - 300 R >
ENDCASE
ENDOF
- 2 OF CASE R @ 1 OF - 99 ENDOF
> R - 199 R >
ENDCASE
ENDOF
> R 299 R >
ENDCASE R > DROP
;
T{ -1 1 CS2 - > 100 } T
T{ -1 2 CS2 - > 200 } T
T{ -1 3 CS2 - > - 300 } T
T{ -2 1 CS2 - > - 99 } T
T{ -2 2 CS2 - > - 199 } T
T{ 0 2 CS2 - > 299 } T
\ Boo l ean short circuiting using CASE
: CS3 ( N1 - - N2 )
CA S E 1 - FALSE OF 11 ENDOF
1 - FALSE OF 22 ENDOF
1 - FALSE OF 33 ENDOF
44 SWAP
EN D CASE
;
T{ 1 C S3 - > 11 } T
T{ 2 C S3 - > 22 } T
T{ 3 C S3 - > 33 } T
T{ 9 C S3 - > 44 } T
\ Emp t y CASE statements with / without default
T{ : C S4 CASE ENDCASE ; 1 CS4 - > } T
T{ : C S5 CASE 2 SWAP ENDCASE ; 1 CS5 - > 2 } T
T{ : C S6 CASE 1 OF ENDOF 2 ENDCASE ; 1 CS6 - > } T
T{ : C S7 CASE 3 OF ENDOF 2 ENDCASE ; 1 CS7 - > 1 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G : NONAME RECURSE
VARIA B LE NN1
VARIA B LE NN2
:NONA M E 1234 ; NN1 !
:NONA M E 9876 ; NN2 !
T{ NN 1 @ EXECUTE - > 1234 } T
T{ NN 2 @ EXECUTE - > 9876 } T
T{ :N O NAME ( n - - 0 , 1 , . . n ) DUP IF DUP > R 1 - RECURSE R > THEN ;
CO N STANT RN1 - > } T
T{ 0 R N1 EXECUTE - > 0 } T
T{ 4 R N1 EXECUTE - > 0 1 2 3 4 } T
:NONA M E ( n - - n1 ) \ Multiple RECURSEs in one definition
1- DUP
CA S E 0 OF EXIT ENDOF
1 OF 11 SWAP RECURSE ENDOF
2 OF 22 SWAP RECURSE ENDOF
3 OF 33 SWAP RECURSE ENDOF
DROP ABS RECURSE EXIT
EN D CASE
; CON S TANT RN2
T{ 1 RN2 EXECUTE - > 0 } T
T{ 2 RN2 EXECUTE - > 11 0 } T
T{ 4 RN2 EXECUTE - > 33 22 11 0 } T
T{ 25 RN2 EXECUTE - > 33 22 11 0 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G C "
T{ : C Q1 C " 123" ; - > } T
T{ CQ 1 COUNT EVALUATE - > 123 } T
T{ : C Q2 C " " ; - > } T
T{ CQ 2 COUNT EVALUATE - > } T
T{ : C Q3 C " 2345" COUNT EVALUATE ; CQ3 - > 2345 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G COMPILE ,
:NONA M E DUP + ; CONSTANT DUP +
T{ : Q DUP + COMPILE , ; - > } T
T{ : A S1 [ Q ] ; - > } T
T{ 12 3 AS1 - > 246 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
\ Can n ot automatically test SAVE - INPUT and RESTORE - INPUT from a console source
TESTI N G SAVE - INPUT and RESTORE - INPUT with a string source
VARIA B LE SI_INC 0 SI_INC !
: SI1
SI _ INC @ > IN + !
15 SI_INC !
;
: S$ S " SAVE-INPUT SI1 RESTORE-INPUT 12345" ;
T{ S$ EVALUATE SI_INC @ - > 0 2345 15 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G . (
CR CR .( Output from .()
T{ CR . ( You should see - 9876 : ) - 9876 . - > } T
T{ CR . ( and again : ) . ( - 9876 ) CR - > } T
CR CR .( On the next 2 lines you should see First then Second messages:)
T{ : D OTP CR . " Second message via ." [ CHAR ] " EMIT \ Check . ( is im mediate
[ CR ] . ( First message via . ( ) ; DOTP - > } T
CR CR
T{ : I MM ? BL WORD FIND NIP ; IMM ? . ( - > 1 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G . R and U . R - has to handle different cell sizes
\ Cre a te some large integers just below / above MAX and Min INTs
MAX-I N T 73 79 * / CONSTANT LI1
MIN-I N T 71 73 * / CONSTANT LI2
LI1 0 < # # S # > NIP CONSTANT LENLI1
: (.R & U . R ) ( u1 u2 - - ) \ u1 < = string length , u2 is required indentat ion
TU C K + > R
LI 1 OVER SPACES . CR R @ LI1 SWAP . R CR
LI 2 OVER SPACES . CR R @ 1 + LI2 SWAP . R CR
LI 1 OVER SPACES U . CR R @ LI1 SWAP U . R CR
LI 2 SWAP SPACES U . CR R > LI2 SWAP U . R CR
;
: .R& U . R ( - - )
CR . " You should see lines duplicated:" CR
." indented by 0 spaces " CR 0 0 ( . R & U . R ) CR
." indented by 0 spaces " CR LENLI1 0 ( . R & U . R ) CR \ Just fits required width
." indented by 5 spaces " CR LENLI1 5 ( . R & U . R ) CR
;
CR CR .( Output from .R and U.R)
T{ .R & U . R - > } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G PAD ERASE
\ Mus t handle different size characters i . e . 1 CHARS > = 1
84 CO N STANT CHARS / PAD \ Minimum size of PAD in chars
CHARS/PAD CHARS CONSTANT AUS/PAD
: CHE C KPAD ( caddr u ch - - f ) \ f = TRUE if u chars = ch
SW A P 0
?D O
OVER I CHARS + C @ OVER < >
IF 2 DROP UNLOOP FALSE EXIT THEN
LO O P
2D R OP TRUE
;
T{ PA D DROP - > } T
T{ 0 I NVERT PAD C ! -> }T
T{ PA D C @ CONSTANT MAXCHAR - > } T
T{ PA D CHARS / PAD 2 DUP MAXCHAR FILL MAXCHAR CHECKPAD - > TRUE } T
T{ PA D CHARS / PAD 2 DUP CHARS ERASE 0 CHECKPAD - > TRUE } T
T{ PA D CHARS / PAD 2 DUP MAXCHAR FILL PAD 0 ERASE MAXCHAR CHECKPAD - > TRUE }T
T{ PA D 43 CHARS + 9 CHARS ERASE - > } T
T{ PA D 43 MAXCHAR CHECKPAD - > TRUE } T
T{ PA D 43 CHARS + 9 0 CHECKPAD - > TRUE } T
T{ PA D 52 CHARS + CHARS / PAD 52 - MAXCHAR CHECKPAD - > TRUE } T
\ Che c k that use of WORD and pictured numeric output do not corrupt PAD
\ Min i mum size of buffers for these are 33 chars and ( 2 * n ) + 2 chars respe ctively
\ whe r e n is number of bits per cell
PAD C H ARS / PAD ERASE
2 BAS E !
MAX-U I NT MAX - UINT < # # S CHAR 1 DUP HOLD HOLD # > 2 DROP
DECIM A L
BL WO R D 12345678123456781234567812345678 DROP
T{ PA D CHARS / PAD 0 CHECKPAD - > TRUE } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G PARSE
T{ CH A R | PARSE 1234 | DUP ROT ROT EVALUATE - > 4 1234 } T
T{ CH A R ^ PARSE 23 45 ^ DUP ROT ROT EVALUATE - > 7 23 45 } T
: PA1 [ CHAR ] $ PARSE DUP > R PAD SWAP CHARS MOVE PAD R > ;
T{ PA 1 3456
DU P ROT ROT EVALUATE - > 4 3456 } T
T{ CH A R A PARSE A SWAP DROP - > 0 } T
T{ CH A R Z PARSE
SW A P DROP - > 0 } T
T{ CH A R " PARSE 4567 " DUP ROT ROT EVALUATE - > 5 4567 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G PARSE - NAME ( Forth 2012 )
\ Ada p ted from the PARSE - NAME RfD tests
\ XXX this was missing from the test suite , added !
: STR 1 S " abcd" ;
: STR 2 S " abcde" ;
T{ PA R SE - NAME abcd STR1 S = - > TRUE } T \ No leading spaces
T{ PA R SE - NAME abcde STR2 S = - > TRUE } T \ Leading spaces
\ Tes t empty parse area , new lines are necessary
T{ PA R SE - NAME
NIP - > 0 } T
\ Emp t y parse area with spaces after PARSE - NAME
T{ PA R SE - NAME
NIP - > 0 } T
T{ : P ARSE - NAME - TEST ( "name1" "name2" - - n )
P A RSE - NAME PARSE - NAME S = ; - > } T
T{ PA R SE - NAME - TEST abcd abcd - > TRUE } T
T{ PA R SE - NAME - TEST abcd abcd - > TRUE } T \ Leading spaces
T{ PA R SE - NAME - TEST abcde abcdf - > FALSE } T
T{ PA R SE - NAME - TEST abcdf abcde - > FALSE } T
T{ PA R SE - NAME - TEST abcde abcde
-> TRUE } T \ Parse to end of line
T{ PA R SE - NAME - TEST abcde abcde
-> TRUE } T \ Leading and trailing spaces
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G DEFER DEFER @ DEFER ! IS ACTION-OF (Forth 2012)
\ Ada p ted from the Forth 200 X RfD tests
T{ DE F ER DEFER1 - > } T
T{ : M Y - DEFER DEFER ; - > } T
T{ : I S - DEFER1 IS DEFER1 ; - > } T
T{ : A CTION - DEFER1 ACTION - OF DEFER1 ; - > } T
T{ : D EF ! DEFER! ; -> }T
T{ : D EF @ DEFER @ ; - > } T
T{ ' * ' DEFER1 DEFER ! -> }T
T{ 2 3 DEFER1 - > 6 } T
T{ ' D EFER1 DEFER @ - > ' * } T
T{ ' D EFER1 DEF @ - > ' * } T
T{ AC T ION - OF DEFER1 - > ' * } T
T{ AC T ION - DEFER1 - > ' * } T
T{ ' + IS DEFER1 - > } T
T{ 1 2 DEFER1 - > 3 } T
T{ ' D EFER1 DEFER @ - > ' + } T
T{ ' D EFER1 DEF @ - > ' + } T
T{ AC T ION - OF DEFER1 - > ' + } T
T{ AC T ION - DEFER1 - > ' + } T
T{ ' - IS - DEFER1 - > } T
T{ 1 2 DEFER1 - > - 1 } T
T{ ' D EFER1 DEFER @ - > ' - } T
T{ ' D EFER1 DEF @ - > ' - } T
T{ AC T ION - OF DEFER1 - > ' - } T
T{ AC T ION - DEFER1 - > ' - } T
T{ MY - DEFER DEFER2 - > } T
T{ ' D UP IS DEFER2 - > } T
T{ 1 D EFER2 - > 1 1 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G HOLDS ( Forth 2012 )
: HTE S T S " Testing HOLDS" ;
: HTE S T2 S " works" ;
: HTE S T3 S " Testing HOLDS works 123" ;
T{ 0 0 < # HTEST HOLDS # > HTEST S = - > TRUE } T
T{ 12 3 0 < # # S BL HOLD HTEST2 HOLDS BL HOLD HTEST HOLDS # >
HT E ST3 S = - > TRUE } T
T{ : H LD HOLDS ; - > } T
T{ 0 0 < # HTEST HLD # > HTEST S = - > TRUE } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
TESTI N G REFILL SOURCE - ID
\ REF I LL and SOURCE - ID from the user input device can ' t be tested from a file,
\ can only be tested from a string via EVALUATE
T{ : R F1 S " REFILL" EVALUATE ; RF1 - > FALSE } T
T{ : S ID1 S " SOURCE-ID" EVALUATE ; SID1 - > - 1 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --------
TESTI N G S \ " ( Forth 2012 compilation mode )
\ Ext e nded the Forth 200 X RfD tests
\ Not e this tests the Core Ext definition of S \ " which has unedfined
\ int e rpretation semantics . S \ " in interpretation mode is tested in the tests on
\ the File - Access word set
T{ : S SQ1 S \ " abc" S " abc" S = ; - > } T \ No escapes
T{ SS Q 1 - > TRUE } T
T{ : S SQ2 S \ " " ; SSQ2 SWAP DROP - > 0 } T \ Empty string
T{ : S SQ3 S \ " \a\b\e\f\l\m\q\r\t\v\x0F0\x1Fa\xaBx\z\"\\" ; - > } T
T{ SS Q 3 SWAP DROP - > 20 } T \ String length
T{ SS Q 3 DROP C @ - > 7 } T \ \ a BEL Bell
T{ SS Q 3 DROP 1 CHARS + C @ - > 8 } T \ \ b BS Backspace
T{ SS Q 3 DROP 2 CHARS + C @ - > 27 } T \ \ e ESC Escape
T{ SS Q 3 DROP 3 CHARS + C @ - > 12 } T \ \ f FF Form feed
T{ SS Q 3 DROP 4 CHARS + C @ - > 10 } T \ \ l LF Line feed
T{ SS Q 3 DROP 5 CHARS + C @ - > 13 } T \ \ m CR of CR / LF pair
T{ SS Q 3 DROP 6 CHARS + C @ - > 10 } T \ LF of CR / LF pair
T{ SS Q 3 DROP 7 CHARS + C @ - > 34 } T \ \ q " Double Quote
T{ SS Q 3 DROP 8 CHARS + C @ - > 13 } T \ \ r CR Carriage Return
T{ SS Q 3 DROP 9 CHARS + C @ - > 9 } T \ \ t TAB Horizontal Tab
T{ SS Q 3 DROP 10 CHARS + C @ - > 11 } T \ \ v VT Vertical Tab
T{ SS Q 3 DROP 11 CHARS + C @ - > 15 } T \ \ x0F Given Char
T{ SS Q 3 DROP 12 CHARS + C @ - > 48 } T \ 0 0 Digit follow on
T{ SS Q 3 DROP 13 CHARS + C @ - > 31 } T \ \ x1F Given Char
T{ SS Q 3 DROP 14 CHARS + C @ - > 97 } T \ a a Hex follow on
T{ SS Q 3 DROP 15 CHARS + C @ - > 171 } T \ \ xaB Insensitive Given Ch ar
T{ SS Q 3 DROP 16 CHARS + C @ - > 120 } T \ x x Non hex follow on
T{ SS Q 3 DROP 17 CHARS + C @ - > 0 } T \ \ z NUL No Character
T{ SS Q 3 DROP 18 CHARS + C @ - > 34 } T \ \ " " Double Quote
T{ SS Q 3 DROP 19 CHARS + C @ - > 92 } T \ \ \ \ Back Slash
\ The above does not test \ n as this is a system dependent value .
\ Che c k it displays a new line
CR .( The next test should display:)
CR .( One line...)
CR .( another line)
T{ : S SQ4 S \ " \nOne line...\nanother line\n" TYPE ; SSQ4 - > } T
\ Tes t bare escapable characters appear as themselves
T{ : S SQ5 S \ " abeflmnqrtvxz" S " abeflmnqrtvxz" S = ; SSQ5 - > TRUE } T
T{ : S SQ6 S \ " a\"" 2 DROP 1111 ; SSQ6 - > 1111 } T \ Parsing behaviour
T{ : S SQ7 S \ " 111 : SSQ8 S\\\" 222\" EVALUATE ; SSQ8 333" EVALUATE ; - > }T
T{ SS Q 7 - > 111 222 333 } T
T{ : S SQ9 S \ " 11 : SSQ10 S\\\" \\x32\\x32\" EVALUATE ; SSQ10 33" EVALUA TE ; -> }T
T{ SS Q 9 - > 11 22 33 } T
\ --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------
CORE-EXT-ERRORS SET-ERROR-COUNT
CR .( End of Core Extension word tests) CR