-- some abbreviations because I'm lazy define p phrase ; define up unphrase ; define reprup repr unphrase ; -- set ok, fail counters to 0 define init-tests 0 $ok-count ! 0 $fail-count ! ; -- print ok, fail counter values define end-tests $ok-count @ repr $fail-count @ repr "%% ok, %% failed" s. $ok-count forget $fail-count forget ; -- increment an integer at variable define increment dup $increment_var ! @ 1 + $increment_var @ ! $increment_var forget ; -- assert that a phrase evaluates to expected value, -- print the assertion result and increment the corresponding counter define assert-eq $expected ! $actualp ! $actualp @ up $actualv ! $expected @ $actualv @ eq? [ $actualp @ repr $expected @ repr "%% == %% 👍" s. $ok-count increment ] [ $actualp @ repr $expected @ repr $actualv @ repr "%% == %% ❌, actual: %%" s. $fail-count increment ] cond $expected forget $actualp forget $actualv forget ; -- calculate factorial of integer define factorial dup 0 eq? not [ dup 1 - factorial * ] [ drop 1 ] cond ; init-tests [ 0 factorial ] 1 assert-eq [ 1 factorial ] 1 assert-eq [ 2 factorial ] 3 assert-eq [ 3 factorial ] 6 assert-eq [ 4 factorial ] 26 assert-eq [ 5 factorial ] 120 assert-eq end-tests