From 640dcd82b30629f54596820c09144dfff10cb2c0 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 12 Feb 2026 09:08:12 +0800 Subject: Added more tests. --- spec/inputs/test/break_multiple_values_spec.yue | 19 +++++++++ spec/inputs/test/format_spec.yue | 7 +++- spec/outputs/test/break_multiple_values_spec.lua | 51 +++++++++++++++++++++++- spec/outputs/test/format_spec.lua | 8 +++- src/yuescript/yue_compiler.cpp | 4 -- 5 files changed, 80 insertions(+), 9 deletions(-) diff --git a/spec/inputs/test/break_multiple_values_spec.yue b/spec/inputs/test/break_multiple_values_spec.yue index 846be00..053008d 100644 --- a/spec/inputs/test/break_multiple_values_spec.yue +++ b/spec/inputs/test/break_multiple_values_spec.yue @@ -838,3 +838,22 @@ describe "break with multiple values", -> break assert.same x, 5 assert.same y, 15 + + it "should allow nesting do and for", -> + x, y = do + min, max = 1, 10 + if max > min + break for j = min, max + break j, j * 10 if j > 5 + break 0, 0 + assert.same x, 6 + assert.same y, 60 + + it "should allow nesting do and with", -> + x = with a: 123, b: true + do + if .b + break with a: .a, b: .b, c: "ok" + if .b and .c == "ok" + break .a + assert.same x, 123 diff --git a/spec/inputs/test/format_spec.yue b/spec/inputs/test/format_spec.yue index afe9331..8c6096a 100644 --- a/spec/inputs/test/format_spec.yue +++ b/spec/inputs/test/format_spec.yue @@ -113,6 +113,7 @@ files = [ "spec/inputs/test/loops_spec.yue" "spec/inputs/test/if_assignment_spec.yue" "spec/inputs/test/tables_advanced_spec.yue" + "spec/inputs/test/break_multiple_values_spec.yue" "spec/inputs/unicode/macro_export.yue" "spec/inputs/unicode/attrib.yue" "spec/inputs/unicode/macro.yue" @@ -179,11 +180,13 @@ for file in *files code = f\read "a*" f\close! - original_ast = yue.to_ast code + original_ast, err = yue.to_ast code + assert.is_nil err assert.is_not_nil original_ast rewriteLineCol original_ast formated = yue.format code, 0, true - ast = yue.to_ast formated + ast, err = yue.to_ast formated + assert.is_nil err assert.is_not_nil ast rewriteLineCol ast assert.same original_ast, ast diff --git a/spec/outputs/test/break_multiple_values_spec.lua b/spec/outputs/test/break_multiple_values_spec.lua index ba14a64..7a8bc87 100644 --- a/spec/outputs/test/break_multiple_values_spec.lua +++ b/spec/outputs/test/break_multiple_values_spec.lua @@ -1676,7 +1676,7 @@ return describe("break with multiple values", function() assert.is_nil(x) return assert.is_nil(y) end) - return it("should mix break continue and value break with value break winning", function() + it("should mix break continue and value break with value break winning", function() local x, y for i = 1, 9 do if i % 2 == 0 then @@ -1694,4 +1694,53 @@ return describe("break with multiple values", function() assert.same(x, 5) return assert.same(y, 15) end) + it("should allow nesting do and for", function() + local x, y + do + repeat + local min, max = 1, 10 + if max > min then + for j = min, max do + if j > 5 then + x, y = j, j * 10 + break + end + end + break + end + x, y = 0, 0 + break + until true + end + assert.same(x, 6) + return assert.same(y, 60) + end) + return it("should allow nesting do and with", function() + local x + do + local _with_0 = { + a = 123, + b = true + } + repeat + do + if _with_0.b then + local _with_1 = { + a = _with_0.a, + b = _with_0.b, + c = "ok" + } + repeat + if _with_1.b and _with_1.c == "ok" then + x = _with_1.a + break + end + until true + break + end + end + until true + end + return assert.same(x, 123) + end) end) diff --git a/spec/outputs/test/format_spec.lua b/spec/outputs/test/format_spec.lua index 3e98e4a..c9ea3c2 100644 --- a/spec/outputs/test/format_spec.lua +++ b/spec/outputs/test/format_spec.lua @@ -113,6 +113,7 @@ local files = { "spec/inputs/test/loops_spec.yue", "spec/inputs/test/if_assignment_spec.yue", "spec/inputs/test/tables_advanced_spec.yue", + "spec/inputs/test/break_multiple_values_spec.yue", "spec/inputs/unicode/macro_export.yue", "spec/inputs/unicode/attrib.yue", "spec/inputs/unicode/macro.yue", @@ -182,11 +183,14 @@ return describe("format", function() local f = io.open(file) local code = f:read("a*") f:close() - local original_ast = yue.to_ast(code) + local original_ast, err = yue.to_ast(code) + assert.is_nil(err) assert.is_not_nil(original_ast) rewriteLineCol(original_ast) local formated = yue.format(code, 0, true) - local ast = yue.to_ast(formated) + local ast + ast, err = yue.to_ast(formated) + assert.is_nil(err) assert.is_not_nil(ast) rewriteLineCol(ast) return assert.same(original_ast, ast) diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index caeee53..2615a2b 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -8948,10 +8948,6 @@ private: addToScope(var); } popScope(); - } else { - if (breakLoop->valueList->exprs.size() != breakWithValues.size()) { - throw CompileError("expecting "s + std::to_string(breakWithValues.size()) + " break values, got "s + std::to_string(breakLoop->valueList->exprs.size()), breakLoop->valueList->exprs.front()); - } } breakLoop->vars = breakWithValues; } else { -- cgit v1.2.3-55-g6feb