From cda1076f823f975048a00c94d1a4c5cb2bf40012 Mon Sep 17 00:00:00 2001 From: Glenn Jackman Date: Sun, 22 Feb 2026 20:16:11 -0500 Subject: [PATCH 1/2] Handle syntax errors more informatively --- bin/run.moon | 15 +++++++++- .../expected_results.json | 2 +- tests/failed-to-parse/.busted | 5 ++++ tests/failed-to-parse/expected_results.json | 1 + tests/failed-to-parse/failed_to_parse.moon | 4 +++ .../failed-to-parse/failed_to_parse_spec.moon | 29 +++++++++++++++++++ 6 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 tests/failed-to-parse/.busted create mode 100644 tests/failed-to-parse/expected_results.json create mode 100644 tests/failed-to-parse/failed_to_parse.moon create mode 100644 tests/failed-to-parse/failed_to_parse_spec.moon diff --git a/bin/run.moon b/bin/run.moon index f593b26..d64ee5a 100755 --- a/bin/run.moon +++ b/bin/run.moon @@ -68,11 +68,24 @@ run_tests = (slug, dir) -> data = json.decode json_output if not data + output = json_output + + if output\match "^Failed to encode test results to json" + -- This is a syntax error: moon can't compile it. + -- Busted cannot output JSON results. + -- Grab the output from vanilla busted. + fh = io.popen 'busted', 'r' + output = fh\read 'a' + fh\close! + -- trim off some non-determinant output + output = output\gsub " : [%d.]+ seconds", "" + return { status: 'error', - message: json_output + message: output } + if exit_status != 0 and #data.successes == 0 and #data.failures == 0 and #data.errors > 0 return { status: 'error', diff --git a/tests/example-syntax-error/expected_results.json b/tests/example-syntax-error/expected_results.json index be52766..fcd6c88 100644 --- a/tests/example-syntax-error/expected_results.json +++ b/tests/example-syntax-error/expected_results.json @@ -1 +1 @@ -{"tests":[],"version":2,"message":"Failed to encode test results to json: type 'function' is not supported by JSON.\n","status":"error"} +{"message":"*\n0 successes / 0 failures / 1 error / 0 pending\n\nError -> /opt/homebrew/share/lua/5.4/moonscript/base.lua @ 3\nsuite ./example_syntax_error_spec.moon\n/opt/homebrew/share/lua/5.4/moonscript/base.lua:81: ./example_syntax_error.moon: Failed to parse:\n [1] >> leap_year =\n","tests":[],"status":"error","version":2} diff --git a/tests/failed-to-parse/.busted b/tests/failed-to-parse/.busted new file mode 100644 index 0000000..86b84e7 --- /dev/null +++ b/tests/failed-to-parse/.busted @@ -0,0 +1,5 @@ +return { + default = { + ROOT = { '.' } + } +} diff --git a/tests/failed-to-parse/expected_results.json b/tests/failed-to-parse/expected_results.json new file mode 100644 index 0000000..ddc6aac --- /dev/null +++ b/tests/failed-to-parse/expected_results.json @@ -0,0 +1 @@ +{"version":2,"message":"*\n0 successes / 0 failures / 1 error / 0 pending\n\nError -> /opt/homebrew/share/lua/5.4/moonscript/base.lua @ 3\nsuite ./failed_to_parse_spec.moon\n/opt/homebrew/share/lua/5.4/moonscript/base.lua:81: ./failed_to_parse.moon: Failed to parse:\n [2] >> (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)\n","status":"error","tests":[]} diff --git a/tests/failed-to-parse/failed_to_parse.moon b/tests/failed-to-parse/failed_to_parse.moon new file mode 100644 index 0000000..390b190 --- /dev/null +++ b/tests/failed-to-parse/failed_to_parse.moon @@ -0,0 +1,4 @@ +leap_year = (year) -> + (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0) + +return leap_year diff --git a/tests/failed-to-parse/failed_to_parse_spec.moon b/tests/failed-to-parse/failed_to_parse_spec.moon new file mode 100644 index 0000000..ce2c5e9 --- /dev/null +++ b/tests/failed-to-parse/failed_to_parse_spec.moon @@ -0,0 +1,29 @@ +is_leap_year = require 'failed_to_parse' + +describe 'leap', -> + it 'year not divisible by 4 in common year', -> + assert.is_false is_leap_year 2015 + + it 'year divisible by 2, not divisible by 4 in common year', -> + assert.is_false is_leap_year 1970 + + it 'year divisible by 4, not divisible by 100 in leap year', -> + assert.is_true is_leap_year 1996 + + it 'year divisible by 4 and 5 is still a leap year', -> + assert.is_true is_leap_year 1960 + + it 'year divisible by 100, not divisible by 400 in common year', -> + assert.is_false is_leap_year 2100 + + it 'year divisible by 100 but not by 3 is still not a leap year', -> + assert.is_false is_leap_year 1900 + + it 'year divisible by 400 is leap year', -> + assert.is_true is_leap_year 2000 + + it 'year divisible by 400 but not by 125 is still a leap year', -> + assert.is_true is_leap_year 2400 + + it 'year divisible by 200, not divisible by 400 in common year', -> + assert.is_false is_leap_year 1800 From e497e8d058e0f6b51918f5bf5402ad60f4d9167a Mon Sep 17 00:00:00 2001 From: Glenn Jackman Date: Sun, 22 Feb 2026 20:23:54 -0500 Subject: [PATCH 2/2] Also need to strip off the path to "base.lua" --- bin/run.moon | 1 + tests/example-syntax-error/expected_results.json | 2 +- tests/failed-to-parse/expected_results.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/run.moon b/bin/run.moon index d64ee5a..9af0529 100755 --- a/bin/run.moon +++ b/bin/run.moon @@ -79,6 +79,7 @@ run_tests = (slug, dir) -> fh\close! -- trim off some non-determinant output output = output\gsub " : [%d.]+ seconds", "" + output = output\gsub "(%s)/[%w./-]-/(base.lua)", "%1%2" return { status: 'error', diff --git a/tests/example-syntax-error/expected_results.json b/tests/example-syntax-error/expected_results.json index fcd6c88..c9600d1 100644 --- a/tests/example-syntax-error/expected_results.json +++ b/tests/example-syntax-error/expected_results.json @@ -1 +1 @@ -{"message":"*\n0 successes / 0 failures / 1 error / 0 pending\n\nError -> /opt/homebrew/share/lua/5.4/moonscript/base.lua @ 3\nsuite ./example_syntax_error_spec.moon\n/opt/homebrew/share/lua/5.4/moonscript/base.lua:81: ./example_syntax_error.moon: Failed to parse:\n [1] >> leap_year =\n","tests":[],"status":"error","version":2} +{"message":"*\n0 successes / 0 failures / 1 error / 0 pending\n\nError -> base.lua @ 3\nsuite ./example_syntax_error_spec.moon\nbase.lua:81: ./example_syntax_error.moon: Failed to parse:\n [1] >> leap_year =\n","version":2,"status":"error","tests":[]} diff --git a/tests/failed-to-parse/expected_results.json b/tests/failed-to-parse/expected_results.json index ddc6aac..d73d52c 100644 --- a/tests/failed-to-parse/expected_results.json +++ b/tests/failed-to-parse/expected_results.json @@ -1 +1 @@ -{"version":2,"message":"*\n0 successes / 0 failures / 1 error / 0 pending\n\nError -> /opt/homebrew/share/lua/5.4/moonscript/base.lua @ 3\nsuite ./failed_to_parse_spec.moon\n/opt/homebrew/share/lua/5.4/moonscript/base.lua:81: ./failed_to_parse.moon: Failed to parse:\n [2] >> (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)\n","status":"error","tests":[]} +{"tests":[],"status":"error","message":"*\n0 successes / 0 failures / 1 error / 0 pending\n\nError -> base.lua @ 3\nsuite ./failed_to_parse_spec.moon\nbase.lua:81: ./failed_to_parse.moon: Failed to parse:\n [2] >> (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)\n","version":2}