From 90c56d31352a0eeccd382ef5921baf3af4971040 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 26 Jan 2018 20:20:12 -0800 Subject: Added a ton of tests for virtually all the functionality. Helped me find and fix a lot of latent problems. --- tests/control_flow.nom | 191 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 tests/control_flow.nom (limited to 'tests/control_flow.nom') diff --git a/tests/control_flow.nom b/tests/control_flow.nom new file mode 100644 index 0000000..f0fc092 --- /dev/null +++ b/tests/control_flow.nom @@ -0,0 +1,191 @@ +#.. + Tests for the stuff defined in lib/control_flow.nom + +use "lib/core.nom" +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 +error "go to failed." +--- %skip --- + +%tot <- 0 +for %x in [1,2,3] + %tot +<- %x +assume (%tot = 6) or barf "for-loop failed" + +%tot <- 0 +for all [1,2,3] + %tot +<- % +assume (%tot = 6) or barf "for-all-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 all [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 all [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 all [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 all [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 from 1 to 3: %x +<- %i +assume (%x = 6) or barf "Numeric for range failed" + +%x <- 0 +for %i from 3 to 1 via -1: %x +<- %i +assume (%x = 6) or barf "backwards numeric for range failed" + +%x <- 0 +for all 1 to 3: %x +<- % +assume (%x = 6) or barf "terse numeric for range failed" + +%result <- {} +for %key = %value in {x:1,y:2} + (%result's ("\%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,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 + +try: barf +..and if it succeeds: barf "try failed." + +%worked <- (no) +try: barf +..and if it barfs: %worked <- (yes) +assume %worked or barf "try/catch failed" + +%x <- 1 +do + %x <- 2 +assume (%x = 2) or barf "'do' is redefining locals" + +%x <- 1 +try + %x <- 2 + do + barf + ..then always + %x <- 1 +..and if it barfs: do nothing +assume (%x = 1) or barf "do/then always failed" -- cgit v1.2.3