nomsu/tests/control_flow.nom
Bruce Hill be06fc096a Major changes to how versioning and parsing work. This should be a
better path going forward to handling upgrades. Old syntax files will
stick around for compatibility purposes. Old syntax can be parsed into
valid syntax trees via the old syntax (.peg) files, and then old syntax
trees should be valid and can be upgraded via the normal code path. This
change has lots of improvements to Nomsu codegen too.
2018-07-15 19:43:28 -07:00

193 lines
3.8 KiB
Plaintext

#!/usr/bin/env nomsu -V1
#
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"
<- {%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"
<- {%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"
<- {%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"
<- {%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"
when
* (no): barf "'when' fail"
* (no)
* (3 > 4): barf "'when' fail 2"
* (yes)
* (barfer): do nothing
* (99 > 1): barf "Fell through incorrectly"
%else_worked <- (no)
when
* (no): barf
* else: %else_worked <- (yes)
assume %else_worked or barf "when..else failed"
action [test when scope]
when
* (yes): %leaked <- (yes)
test when scope
assume (not %leaked) or barf "'when' is leaking locals"
%when_worked <- (no)
when 4 = ?
* 1
* 2: barf "'when = ?' fail"
* 3
* 4
* (barfer): %when_worked <- (yes)
assume %when_worked
%when_worked <- (no)
when 5 = ?
* 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
..or barf "'result of %' failed"
%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."