diff options
Diffstat (limited to 'awk/forth/test.forth')
-rw-r--r-- | awk/forth/test.forth | 191 |
1 files changed, 34 insertions, 157 deletions
diff --git a/awk/forth/test.forth b/awk/forth/test.forth index d746e66..daa6943 100644 --- a/awk/forth/test.forth +++ b/awk/forth/test.forth @@ -1,157 +1,34 @@ -( Basic Forth test suite ) - -testing "Basic stack operations" -5 dup . . test 5 test 5 - -testing "Addition" -3 4 + test 7 - -testing "Subtraction" -10 3 - test 7 - -testing "Multiplication" -6 7 * test 42 - -testing "Division" -20 4 / test 5 - -testing "Stack manipulation - rot" -1 2 3 rot test 1 - -testing "Stack manipulation - drop" -1 2 3 drop test 2 - -testing "Stack manipulation - nip" -1 2 3 nip test 3 - -testing "Stack manipulation - tuck" -1 2 tuck test 2 - -testing "Stack manipulation - over" -1 2 over test 1 - -testing "Variables" -variable x -5 x ! -x @ test 5 -10 x ! -x ? ( should print 10 ) - -testing "Negate" -5 negate test -5 - -testing "Absolute value" --7 abs test 7 - -testing "Maximum" -3 8 max test 8 - -testing "Minimum" -3 8 min test 3 - -testing "Modulo" -17 5 mod test 2 - -testing "Equality" -5 5 = test 1 -5 6 = test 0 - -testing "Word definition" -: square dup * ; -5 square test 25 - -testing "Complex word definition" -variable counter -: increment-counter counter @ 1 + counter ! ; -5 counter ! -increment-counter -counter @ test 6 - -testing "Basic conditional - if/then" -: test-if-1 ( n -- n ) dup 5 > if ." Greater than 5" then ; -6 test-if-1 test 6 ( should print "Greater than 5" and leave 6 ) -4 test-if-1 test 4 ( should print nothing and leave 4 ) - -testing "Basic conditional - if/else/then" -: test-if-2 ( n -- n ) dup 5 > if ." Greater" else ." Less=" then ; -6 test-if-2 test 6 ( should print "Greater" and leave 6 ) -4 test-if-2 test 4 ( should print "Less=" and leave 4 ) -5 test-if-2 test 5 ( should print "Less=" and leave 5 ) - -testing "Nested conditionals" -: test-if-3 ( n -- n ) - dup 10 > if - dup 20 > if - ." >20 " - then - ." >10 " - then ; -25 test-if-3 test 25 ( should print ">20 >10 " and leave 25 ) -15 test-if-3 test 15 ( should print ">10 " and leave 15 ) -5 test-if-3 test 5 ( should print nothing and leave 5 ) - -testing "Conditional with stack operations" -: test-if-4 ( n -- n n ) - dup 5 > if - dup - then ; -6 test-if-4 swap test 6 test 6 ( should leave 6 6 ) -4 test-if-4 test 4 ( should leave just 4 ) - -testing "Complex nested conditionals" -: test-if-5 ( n -- n ) - dup 0 < if - ." negative " - else - dup 100 > if - ." big " - else - dup 50 > if - ." medium " - else - ." small " - then - then - then ; --5 test-if-5 test -5 ( should print "negative " ) -150 test-if-5 test 150 ( should print "big " ) -75 test-if-5 test 75 ( should print "medium " ) -25 test-if-5 test 25 ( should print "small " ) - -testing "Conditionals in word definitions" -: abs-test ( n -- |n| ) dup 0 < if negate then ; --5 abs-test test 5 -5 abs-test test 5 - -testing "Complex conditional word" -: max-test ( n1 n2 -- max ) - 2dup > if - drop - else - nip - then ; -5 3 max-test test 5 -3 5 max-test test 5 - -( Try to use if outside of a definition - should error ) -testing "Compile-only words" -5 4 > if 42 then ( should print error about compile-only word ) - -testing "Comparison operators" -5 3 > test 1 ( 5 > 3 is true ) -3 5 > test 0 ( 3 > 5 is false ) -3 5 < test 1 ( 3 < 5 is true ) -5 3 < test 0 ( 5 < 3 is false ) -5 5 < test 0 ( 5 < 5 is false ) -5 5 > test 0 ( 5 > 5 is false ) - -testing "Comparison in conditionals" -: test-compare ( n -- ) -dup 5 > if ." Greater than 5" else -dup 5 < if ." Less than 5" else -." Equal to 5" then then ; -6 test-compare ( should print "Greater than 5" ) -4 test-compare ( should print "Less than 5" ) -5 test-compare ( should print "Equal to 5" ) - -bye \ No newline at end of file +\ Test arithmetic operations +10 5 + . \ Should print 15 +10 5 - . \ Should print 5 +10 5 * . \ Should print 50 +10 5 / . \ Should print 2 + +\ Test stack manipulation +1 2 3 .s \ Should show 3 values: 1 2 3 +dup . \ Should print 3 again +drop . \ Should print 2 +swap .s \ Should show 2 1 +over .s \ Should show 2 1 2 +rot .s \ Should show 1 2 3 + +\ Test comparisons +5 5 = . \ Should print -1 (true) +5 3 < . \ Should print 0 (false) +3 5 > . \ Should print 0 (false) + +\ Test conditionals within user-defined words +: test_if 10 20 if .s then ; \ Should print 1 2 (since the condition is true) +: test_else 10 5 if .s else 1 then ; \ Should print 1 (since the condition is false) + +\ Test user-defined words +: square dup * ; \ Define a word to square a number +4 square . \ Should print 16 + +: add_three 1 2 + + ; \ Define a word to add three numbers +1 2 add_three . \ Should print 6 + +\ List all words +words \ Should list all available words + +bye \ Exit the interpreter \ No newline at end of file |