159 lines
3.7 KiB
Plaintext
159 lines
3.7 KiB
Plaintext
#!/usr/bin/env nomsu -V2.4.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."
|