nomsu/tests/control_flow.nom
2018-07-20 20:27:27 -07:00

180 lines
3.8 KiB
Plaintext

#!/usr/bin/env nomsu -V2.5.4.3
#
Tests for the stuff defined in core/control_flow.nom
use "core"
do nothing
action [test conditionals]:
if (yes): %loc1 = (yes)
if (no):
barf "entered if 'no' conditional"
unless (yes):
barf "entered unless 'yes' conditional"
if (yes): %loc2 = (yes)
..else:
barf "entered if 'yes' else conditional"
unless (no) (%loc3 = (yes)) else (barf "entered unless 'no' else conditional")
assume (all of [%loc1 == (nil), %loc2 == (nil), %loc3 == (nil)]) or barf ".."
conditionals leaking locals
assume ((5 if (yes) else 1) == 5)
assume ((5 if (no) else 1) == 1)
action [return nil] (return (nil))
assume (((return nil) if (yes) else 99) == (nil))
go to %skip
barf "go-to failed."
--- %skip ---
%tot = 0
for %x in [1, 2, 3]: %tot += %x
assume (%tot == 6) or barf "for-loop failed"
%x = 0
repeat:
%x += 1
if (%x == 3): stop repeating
if (%x > 3):
barf "Failed to stop repeat loop"
assume (%x == 3) or barf "Failed to repeat"
%x = 0
repeat 5 times: %x += 1
assume (%x == 5) or barf "Failed to repeat 5 times"
set {%x:0, %y:0}
for % in [1, 2, 3]:
repeat 5 times:
do next repeat
%x += 1
%y += 1
assume ([%x, %y] == [0, 3]) or barf "Failed to continue repeat"
set {%x:0, %y:0}
for % in [1, 2, 3]:
repeat 5 times:
do next %
%x += 1
%y += 1
assume ([%x, %y] == [0, 0]) or barf "Failed to continue for"
set {%x:0, %y:0}
for % in [1, 2, 3]:
repeat 5 times:
stop repeating
%x += 1
%y += 1
assume ([%x, %y] == [0, 3]) or barf "Failed to stop repeat"
set {%x:0, %y:0}
for % in [1, 2, 3]:
repeat 5 times:
stop %
%x += 1
%y += 1
assume ([%x, %y] == [0, 0]) or barf "Failed to stop for"
%x = 0
repeat while (%x < 10): %x += 1
assume (%x == 10) or barf "repeat-while failed"
%x = 0
repeat until (%x == 10): %x += 1
assume (%x == 10) or barf "repeat-until failed"
%x = 0
for %i in 1 to 3: %x += %i
assume (%x == 6) or barf "Numeric for range failed"
%x = 0
for %i in 3 to 1 via -1: %x += %i
assume (%x == 6) or barf "backwards numeric for range failed"
%result = {}
for %key = %value in {x:1, y:2}:
%result."\%key\%key" = (%value * 11)
assume (%result == {xx:11, yy:22}) or barf "key/value iteration failed"
for %key = %value in {x:1, y:2}:
stop %key
barf "stopping key failed"
for %key = %value in {x:1, y:2}:
stop %value
barf "stopping value failed"
for %key = %value in {x:1}:
stop %key
stop %value
do next %key
do next %value
for %key = %value in {x:1, y:2}:
do next %key
barf "skipping key failed"
for %key = %value in {x:1, y:2}:
do next %value
barf "skipping value failed"
action [barfer]:
barf "this should never be reached"
if:
(no): barf "'when' fail"
(no) (3 > 4):
barf "'when' fail 2"
(yes) (barfer): do nothing
(99 > 1):
barf "Fell through incorrectly"
%else_worked = (no)
if:
(no): barf
else:
%else_worked = (yes)
assume %else_worked or barf "when..else failed"
action [test when scope]:
if (yes): %leaked = (yes)
test when scope
assume (not %leaked) or barf "'when' is leaking locals"
%when_worked = (no)
if 4 is:
1 2:
barf "'when = ?' fail"
3 4 (barfer):
%when_worked = (yes)
assume %when_worked
%when_worked = (no)
if 5 is:
6: barf
else:
%when_worked = (yes)
assume %when_worked
%x = 1
do: %x = 2
assume (%x == 2) or barf "'do' is redefining locals"
assume (..)
(..)
result of:
%n = 0
for % in [1, 2, 3]: %n += %
return %n
..== 6
%t = [1, [2, [[3], 4], 5, [[[6]]]]]
%flat = []
for % in recursive %t:
if ((type of %) is "table"):
for %2 in %: recurse % on %2
..else: add % to %flat
assume ((sorted %flat) == [1, 2, 3, 4, 5, 6])
say "Control flow test passed."