From 23eb3e45df685fcd65d44787b590f1879e886041 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 30 Dec 2024 16:56:57 +1100 Subject: [PATCH] Keywords 'break' & 'continue' tested There were a couple bugs - I'm glad I'm so thorough with these tests. See #152 --- scripts/breakdancing.toy | 108 +++++++++++++----- source/toy_routine.c | 2 +- source/toy_vm.c | 1 + .../test_keyword_while_break_continue.toy | 100 ++++++++++++++++ 4 files changed, 182 insertions(+), 29 deletions(-) create mode 100644 tests/integrations/test_keyword_while_break_continue.toy diff --git a/scripts/breakdancing.toy b/scripts/breakdancing.toy index d1022a6..c4db44b 100644 --- a/scripts/breakdancing.toy +++ b/scripts/breakdancing.toy @@ -1,48 +1,100 @@ +//make sure it works with multiple repititions +//------------------------- + +//test break while (true) { - print "1"; break; - print "2"; + assert false, "break failed"; } -print "3"; +//test continue +var flag1: bool = true; +while (flag1) { + flag1 = false; + continue; + assert false, "continue failed"; +} +print "done"; +//------------------------- +//test break while (true) { - print 1; + break; + assert false, "break failed"; +} + +//test continue +var flag2: bool = true; +while (flag2) { + flag2 = false; + continue; + assert false, "continue failed"; +} + +print "done"; + +//------------------------- + +//test break +while (true) { + break; + assert false, "break failed"; +} + +//test continue +var flag3: bool = true; +while (flag3) { + flag3 = false; + continue; + assert false, "continue failed"; +} + +print "done"; + +//------------------------- + +{ + //test break while (true) { - print 2; - if (true) { - print 3; - while (true) { - print 4; - break; - print 5; - } - print 6; - } - print 7; + break; + assert false, "break failed"; } - print 8; + + //test continue + var flag4: bool = true; + while (flag4) { + flag4 = false; + continue; + assert false, "continue failed"; + } + + print "done"; } -print 9; +//------------------------- - - -while (true) { - print 1; +{ + //test break while (true) { - print 2; - if (true) { - print 3; + { break; - print 6; } - print 7; + assert false, "break failed"; } - print 8; + + //test continue + var flag5: bool = true; + while (flag5) { + flag5 = false; + { + continue; + } + assert false, "continue failed"; + } + + print "done"; } -print 9; \ No newline at end of file diff --git a/source/toy_routine.c b/source/toy_routine.c index 9542363..82d5eb3 100644 --- a/source/toy_routine.c +++ b/source/toy_routine.c @@ -508,7 +508,7 @@ static unsigned int writeInstructionWhileThen(Toy_Routine** rt, Toy_AstWhileThen unsigned int diff = depth - (*rt)->currentScopeDepth; - OVERWRITE_INT(rt, code, addr, addr - (CURRENT_ADDRESS(rt, code) + 8)); //tell continue to return to the start AFTER reading the instruction + OVERWRITE_INT(rt, code, addr, CURRENT_ADDRESS(rt, code) - (addr + 8)); //tell continue to return to the start AFTER reading the instruction OVERWRITE_INT(rt, code, addr, diff); //tick down diff --git a/source/toy_vm.c b/source/toy_vm.c index 0d4cf2e..a384f83 100644 --- a/source/toy_vm.c +++ b/source/toy_vm.c @@ -581,6 +581,7 @@ static void processEscape(Toy_VM* vm) { while (diff > 0 && vm->scope != NULL) { vm->scope = Toy_popScope(vm->scope); + diff--; } } diff --git a/tests/integrations/test_keyword_while_break_continue.toy b/tests/integrations/test_keyword_while_break_continue.toy new file mode 100644 index 0000000..c4db44b --- /dev/null +++ b/tests/integrations/test_keyword_while_break_continue.toy @@ -0,0 +1,100 @@ +//make sure it works with multiple repititions + +//------------------------- + +//test break +while (true) { + break; + assert false, "break failed"; +} + +//test continue +var flag1: bool = true; +while (flag1) { + flag1 = false; + continue; + assert false, "continue failed"; +} + +print "done"; + +//------------------------- + +//test break +while (true) { + break; + assert false, "break failed"; +} + +//test continue +var flag2: bool = true; +while (flag2) { + flag2 = false; + continue; + assert false, "continue failed"; +} + +print "done"; + +//------------------------- + +//test break +while (true) { + break; + assert false, "break failed"; +} + +//test continue +var flag3: bool = true; +while (flag3) { + flag3 = false; + continue; + assert false, "continue failed"; +} + +print "done"; + +//------------------------- + +{ + //test break + while (true) { + break; + assert false, "break failed"; + } + + //test continue + var flag4: bool = true; + while (flag4) { + flag4 = false; + continue; + assert false, "continue failed"; + } + + print "done"; +} + +//------------------------- + +{ + //test break + while (true) { + { + break; + } + assert false, "break failed"; + } + + //test continue + var flag5: bool = true; + while (flag5) { + flag5 = false; + { + continue; + } + assert false, "continue failed"; + } + + print "done"; +} +