Add break continue

This commit is contained in:
2026-01-16 00:01:23 +08:00
parent df84159ed8
commit 9c5a3397d9
9 changed files with 137 additions and 4 deletions

View File

@@ -148,3 +148,72 @@ TEST_CASE("interpreter performance: simple loop", "[perf][script]") {
REQUIRE(r_num->value == 499500.0);
};
}
TEST_CASE("loop break", "[script][loop]") {
State state;
const char* script = R"(
number sum = 0;
for (number i = 0; i < 10; i = i + 1) {
if (i == 5) {
break;
}
sum = sum + i;
}
)";
REQUIRE(state.do_string(script));
auto sum_val = state.get_global("sum");
REQUIRE(sum_val);
auto sum_num = std::dynamic_pointer_cast<NumberValue>(sum_val);
REQUIRE(sum_num->value == 10.0); // 0+1+2+3+4 = 10
}
TEST_CASE("loop continue", "[script][loop]") {
State state;
const char* script = R"(
number sum = 0;
for (number i = 0; i < 5; i = i + 1) {
if (i == 2) {
continue;
}
sum = sum + i;
}
)";
REQUIRE(state.do_string(script));
auto sum_val = state.get_global("sum");
REQUIRE(sum_val);
auto sum_num = std::dynamic_pointer_cast<NumberValue>(sum_val);
REQUIRE(sum_num->value == 8.0); // 0+1+3+4 = 8
}
TEST_CASE("while break and continue", "[script][loop]") {
State state;
const char* script = R"(
number i = 0;
number sum = 0;
while (i < 10) {
i = i + 1;
if (i == 3) {
continue;
}
if (i == 6) {
break;
}
sum = sum + i;
}
)";
REQUIRE(state.do_string(script));
auto sum_val = state.get_global("sum");
REQUIRE(sum_val);
auto sum_num = std::dynamic_pointer_cast<NumberValue>(sum_val);
REQUIRE(sum_num->value == 12.0);
// 1st iter: i=1, sum=1
// 2nd iter: i=2, sum=1+2=3
// 3rd iter: i=3, continue
// 4th iter: i=4, sum=3+4=7
// 5th iter: i=5, sum=7+5=12
// 6th iter: i=6, break
// Result should be 12.0
}