goon
goon
https://git.tonybtw.com/goon.git
git://git.tonybtw.com/goon.git
Added gnu style tests for make check.
Diff
diff --git a/Makefile b/Makefile
index 4d8540f..c80ae8c 100644
--- a/Makefile
+++ b/Makefile
@@ -22,8 +22,7 @@ uninstall:
clean:
rm -f goon $(OBJ)
-test: goon
- @echo "Running tests..."
+check: goon
@./tests/run_tests.sh
-.PHONY: all debug install uninstall clean test
+.PHONY: all debug install uninstall clean check
diff --git a/tests/fixtures/import_helper.goon b/tests/fixtures/import_helper.goon
new file mode 100644
index 0000000..0a17735
--- /dev/null
+++ b/tests/fixtures/import_helper.goon
@@ -0,0 +1 @@
+{ value = 99; }
\ No newline at end of file
diff --git a/tests/invalid/bad_field.expected b/tests/invalid/bad_field.expected
new file mode 100644
index 0000000..84f765e
--- /dev/null
+++ b/tests/invalid/bad_field.expected
@@ -0,0 +1 @@
+expected field name
\ No newline at end of file
diff --git a/tests/invalid/bad_field.goon b/tests/invalid/bad_field.goon
new file mode 100644
index 0000000..c86f622
--- /dev/null
+++ b/tests/invalid/bad_field.goon
@@ -0,0 +1 @@
+{ 123 = "bad"; }
\ No newline at end of file
diff --git a/tests/invalid/bad_import.expected b/tests/invalid/bad_import.expected
new file mode 100644
index 0000000..9aead73
--- /dev/null
+++ b/tests/invalid/bad_import.expected
@@ -0,0 +1 @@
+could not open import file
\ No newline at end of file
diff --git a/tests/invalid/bad_import.goon b/tests/invalid/bad_import.goon
new file mode 100644
index 0000000..a7b0897
--- /dev/null
+++ b/tests/invalid/bad_import.goon
@@ -0,0 +1,2 @@
+let x = import("./nonexistent.goon");
+{ value = x; }
\ No newline at end of file
diff --git a/tests/invalid/missing_brace.expected b/tests/invalid/missing_brace.expected
new file mode 100644
index 0000000..bc7d73c
--- /dev/null
+++ b/tests/invalid/missing_brace.expected
@@ -0,0 +1 @@
+expected }
\ No newline at end of file
diff --git a/tests/invalid/missing_brace.goon b/tests/invalid/missing_brace.goon
new file mode 100644
index 0000000..fb56dab
--- /dev/null
+++ b/tests/invalid/missing_brace.goon
@@ -0,0 +1 @@
+{ value = 1;
\ No newline at end of file
diff --git a/tests/invalid/missing_bracket.expected b/tests/invalid/missing_bracket.expected
new file mode 100644
index 0000000..2e19815
--- /dev/null
+++ b/tests/invalid/missing_bracket.expected
@@ -0,0 +1 @@
+expected ]
\ No newline at end of file
diff --git a/tests/invalid/missing_bracket.goon b/tests/invalid/missing_bracket.goon
new file mode 100644
index 0000000..20279e0
--- /dev/null
+++ b/tests/invalid/missing_bracket.goon
@@ -0,0 +1 @@
+{ items = [1, 2, 3
\ No newline at end of file
diff --git a/tests/invalid/missing_semicolon.expected b/tests/invalid/missing_semicolon.expected
new file mode 100644
index 0000000..4d9d6f5
--- /dev/null
+++ b/tests/invalid/missing_semicolon.expected
@@ -0,0 +1 @@
+expected ; after let binding
\ No newline at end of file
diff --git a/tests/invalid/missing_semicolon.goon b/tests/invalid/missing_semicolon.goon
new file mode 100644
index 0000000..9f01685
--- /dev/null
+++ b/tests/invalid/missing_semicolon.goon
@@ -0,0 +1,2 @@
+let x = 1
+{ value = x; }
\ No newline at end of file
diff --git a/tests/invalid/unexpected_char.expected b/tests/invalid/unexpected_char.expected
new file mode 100644
index 0000000..ecbd280
--- /dev/null
+++ b/tests/invalid/unexpected_char.expected
@@ -0,0 +1 @@
+unexpected character
\ No newline at end of file
diff --git a/tests/invalid/unexpected_char.goon b/tests/invalid/unexpected_char.goon
new file mode 100644
index 0000000..3db6c7d
--- /dev/null
+++ b/tests/invalid/unexpected_char.goon
@@ -0,0 +1 @@
+{ value = @bad; }
\ No newline at end of file
diff --git a/tests/invalid/unterminated_string.expected b/tests/invalid/unterminated_string.expected
new file mode 100644
index 0000000..489ca89
--- /dev/null
+++ b/tests/invalid/unterminated_string.expected
@@ -0,0 +1 @@
+unterminated string
\ No newline at end of file
diff --git a/tests/invalid/unterminated_string.goon b/tests/invalid/unterminated_string.goon
new file mode 100644
index 0000000..b002914
--- /dev/null
+++ b/tests/invalid/unterminated_string.goon
@@ -0,0 +1 @@
+{ value = "hello; }
\ No newline at end of file
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
new file mode 100755
index 0000000..4231ce5
--- /dev/null
+++ b/tests/run_tests.sh
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+
+cd "$(dirname "$0")/.."
+
+GOON="./goon"
+PASS=0
+FAIL=0
+
+red='\033[0;31m'
+green='\033[0;32m'
+reset='\033[0m'
+
+for test in tests/valid/*.goon; do
+ name=$(basename "$test" .goon)
+ expected="tests/valid/${name}.expected"
+
+ if [ ! -f "$expected" ]; then
+ echo -e "${red}SKIP${reset} $name (no .expected file)"
+ continue
+ fi
+
+ output=$("$GOON" eval "$test" 2>&1)
+ expected_content=$(cat "$expected")
+
+ if [ "$output" = "$expected_content" ]; then
+ echo -e "${green}PASS${reset} $name"
+ ((PASS++))
+ else
+ echo -e "${red}FAIL${reset} $name"
+ echo " expected: $expected_content"
+ echo " got: $output"
+ ((FAIL++))
+ fi
+done
+
+for test in tests/invalid/*.goon; do
+ name=$(basename "$test" .goon)
+ expected="tests/invalid/${name}.expected"
+
+ if [ ! -f "$expected" ]; then
+ echo -e "${red}SKIP${reset} $name (no .expected file)"
+ continue
+ fi
+
+ output=$("$GOON" check "$test" 2>&1)
+ exit_code=$?
+ expected_content=$(cat "$expected")
+
+ if [ $exit_code -eq 0 ]; then
+ echo -e "${red}FAIL${reset} $name (should have failed)"
+ ((FAIL++))
+ elif echo "$output" | grep -q "$expected_content"; then
+ echo -e "${green}PASS${reset} $name"
+ ((PASS++))
+ else
+ echo -e "${red}FAIL${reset} $name"
+ echo " expected error containing: $expected_content"
+ echo " got: $output"
+ ((FAIL++))
+ fi
+done
+
+echo ""
+echo "Results: $PASS passed, $FAIL failed"
+
+if [ $FAIL -gt 0 ]; then
+ exit 1
+fi
diff --git a/tests/valid/booleans.expected b/tests/valid/booleans.expected
new file mode 100644
index 0000000..1bd8724
--- /dev/null
+++ b/tests/valid/booleans.expected
@@ -0,0 +1 @@
+{"b":false,"a":true}
\ No newline at end of file
diff --git a/tests/valid/booleans.goon b/tests/valid/booleans.goon
new file mode 100644
index 0000000..5203a27
--- /dev/null
+++ b/tests/valid/booleans.goon
@@ -0,0 +1 @@
+{ a = true; b = false; }
\ No newline at end of file
diff --git a/tests/valid/comments.expected b/tests/valid/comments.expected
new file mode 100644
index 0000000..2a2d8fc
--- /dev/null
+++ b/tests/valid/comments.expected
@@ -0,0 +1 @@
+{"value":1}
\ No newline at end of file
diff --git a/tests/valid/comments.goon b/tests/valid/comments.goon
new file mode 100644
index 0000000..54af731
--- /dev/null
+++ b/tests/valid/comments.goon
@@ -0,0 +1,3 @@
+// line comment
+let x = 1; /* block comment */
+{ value = x; /* inline */ }
diff --git a/tests/valid/empty_record.expected b/tests/valid/empty_record.expected
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/tests/valid/empty_record.expected
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/tests/valid/empty_record.goon b/tests/valid/empty_record.goon
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/tests/valid/empty_record.goon
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/tests/valid/field_access.expected b/tests/valid/field_access.expected
new file mode 100644
index 0000000..861b99d
--- /dev/null
+++ b/tests/valid/field_access.expected
@@ -0,0 +1 @@
+{"value":42}
\ No newline at end of file
diff --git a/tests/valid/field_access.goon b/tests/valid/field_access.goon
new file mode 100644
index 0000000..ab7695d
--- /dev/null
+++ b/tests/valid/field_access.goon
@@ -0,0 +1,2 @@
+let r = { a = { b = 42; }; };
+{ value = r.a.b; }
\ No newline at end of file
diff --git a/tests/valid/function_multi_param.expected b/tests/valid/function_multi_param.expected
new file mode 100644
index 0000000..0178a91
--- /dev/null
+++ b/tests/valid/function_multi_param.expected
@@ -0,0 +1 @@
+{"result":{"z":3,"y":2,"x":1}}
\ No newline at end of file
diff --git a/tests/valid/function_multi_param.goon b/tests/valid/function_multi_param.goon
new file mode 100644
index 0000000..9d62be4
--- /dev/null
+++ b/tests/valid/function_multi_param.goon
@@ -0,0 +1,2 @@
+let f = (a, b, c) => { x = a; y = b; z = c; };
+{ result = f(1, 2, 3); }
\ No newline at end of file
diff --git a/tests/valid/function_simple.expected b/tests/valid/function_simple.expected
new file mode 100644
index 0000000..ad6bf24
--- /dev/null
+++ b/tests/valid/function_simple.expected
@@ -0,0 +1 @@
+{"result":{"value":42}}
\ No newline at end of file
diff --git a/tests/valid/function_simple.goon b/tests/valid/function_simple.goon
new file mode 100644
index 0000000..7f1afba
--- /dev/null
+++ b/tests/valid/function_simple.goon
@@ -0,0 +1,2 @@
+let f = (x) => { value = x; };
+{ result = f(42); }
\ No newline at end of file
diff --git a/tests/valid/if_then_else.expected b/tests/valid/if_then_else.expected
new file mode 100644
index 0000000..f17206a
--- /dev/null
+++ b/tests/valid/if_then_else.expected
@@ -0,0 +1 @@
+{"b":2,"a":1}
\ No newline at end of file
diff --git a/tests/valid/if_then_else.goon b/tests/valid/if_then_else.goon
new file mode 100644
index 0000000..e30fda2
--- /dev/null
+++ b/tests/valid/if_then_else.goon
@@ -0,0 +1 @@
+{ a = if true then 1 else 2; b = if false then 1 else 2; }
\ No newline at end of file
diff --git a/tests/valid/import.expected b/tests/valid/import.expected
new file mode 100644
index 0000000..0886e95
--- /dev/null
+++ b/tests/valid/import.expected
@@ -0,0 +1 @@
+{"imported":99}
\ No newline at end of file
diff --git a/tests/valid/import.goon b/tests/valid/import.goon
new file mode 100644
index 0000000..ed973d6
--- /dev/null
+++ b/tests/valid/import.goon
@@ -0,0 +1,2 @@
+let helper = import("../fixtures/import_helper.goon");
+{ imported = helper.value; }
\ No newline at end of file
diff --git a/tests/valid/let_binding.expected b/tests/valid/let_binding.expected
new file mode 100644
index 0000000..861b99d
--- /dev/null
+++ b/tests/valid/let_binding.expected
@@ -0,0 +1 @@
+{"value":42}
\ No newline at end of file
diff --git a/tests/valid/let_binding.goon b/tests/valid/let_binding.goon
new file mode 100644
index 0000000..8123974
--- /dev/null
+++ b/tests/valid/let_binding.goon
@@ -0,0 +1,2 @@
+let x = 42;
+{ value = x; }
\ No newline at end of file
diff --git a/tests/valid/list.expected b/tests/valid/list.expected
new file mode 100644
index 0000000..3196d33
--- /dev/null
+++ b/tests/valid/list.expected
@@ -0,0 +1 @@
+{"items":[1,2,3]}
\ No newline at end of file
diff --git a/tests/valid/list.goon b/tests/valid/list.goon
new file mode 100644
index 0000000..662690a
--- /dev/null
+++ b/tests/valid/list.goon
@@ -0,0 +1 @@
+{ items = [1, 2, 3]; }
\ No newline at end of file
diff --git a/tests/valid/map.expected b/tests/valid/map.expected
new file mode 100644
index 0000000..c811812
--- /dev/null
+++ b/tests/valid/map.expected
@@ -0,0 +1 @@
+{"items":[{"id":1},{"id":2},{"id":3}]}
\ No newline at end of file
diff --git a/tests/valid/map.goon b/tests/valid/map.goon
new file mode 100644
index 0000000..af3611d
--- /dev/null
+++ b/tests/valid/map.goon
@@ -0,0 +1,2 @@
+let f = (n) => { id = n; };
+{ items = map([1..3], f); }
\ No newline at end of file
diff --git a/tests/valid/negative_int.expected b/tests/valid/negative_int.expected
new file mode 100644
index 0000000..32d02f3
--- /dev/null
+++ b/tests/valid/negative_int.expected
@@ -0,0 +1 @@
+{"value":-42}
\ No newline at end of file
diff --git a/tests/valid/negative_int.goon b/tests/valid/negative_int.goon
new file mode 100644
index 0000000..061e9e3
--- /dev/null
+++ b/tests/valid/negative_int.goon
@@ -0,0 +1 @@
+{ value = -42; }
\ No newline at end of file
diff --git a/tests/valid/nested_record.expected b/tests/valid/nested_record.expected
new file mode 100644
index 0000000..70861fd
--- /dev/null
+++ b/tests/valid/nested_record.expected
@@ -0,0 +1 @@
+{"outer":{"inner":{"value":1}}}
\ No newline at end of file
diff --git a/tests/valid/nested_record.goon b/tests/valid/nested_record.goon
new file mode 100644
index 0000000..d2dc2f1
--- /dev/null
+++ b/tests/valid/nested_record.goon
@@ -0,0 +1,7 @@
+{
+ outer = {
+ inner = {
+ value = 1;
+ };
+ };
+}
\ No newline at end of file
diff --git a/tests/valid/range.expected b/tests/valid/range.expected
new file mode 100644
index 0000000..cb21642
--- /dev/null
+++ b/tests/valid/range.expected
@@ -0,0 +1 @@
+{"nums":[1,2,3,4,5]}
\ No newline at end of file
diff --git a/tests/valid/range.goon b/tests/valid/range.goon
new file mode 100644
index 0000000..cc9dbe0
--- /dev/null
+++ b/tests/valid/range.goon
@@ -0,0 +1 @@
+{ nums = [1..5]; }
\ No newline at end of file
diff --git a/tests/valid/spread_list.expected b/tests/valid/spread_list.expected
new file mode 100644
index 0000000..7fe34b0
--- /dev/null
+++ b/tests/valid/spread_list.expected
@@ -0,0 +1 @@
+{"items":[1,2,3,4]}
\ No newline at end of file
diff --git a/tests/valid/spread_list.goon b/tests/valid/spread_list.goon
new file mode 100644
index 0000000..3c6a43d
--- /dev/null
+++ b/tests/valid/spread_list.goon
@@ -0,0 +1,2 @@
+let a = [1, 2];
+{ items = [...a, 3, 4]; }
\ No newline at end of file
diff --git a/tests/valid/spread_record.expected b/tests/valid/spread_record.expected
new file mode 100644
index 0000000..89551c0
--- /dev/null
+++ b/tests/valid/spread_record.expected
@@ -0,0 +1 @@
+{"c":3,"a":1,"b":2}
\ No newline at end of file
diff --git a/tests/valid/spread_record.goon b/tests/valid/spread_record.goon
new file mode 100644
index 0000000..102bfb1
--- /dev/null
+++ b/tests/valid/spread_record.goon
@@ -0,0 +1,2 @@
+let base = { a = 1; b = 2; };
+{ ...base; c = 3; }
\ No newline at end of file
diff --git a/tests/valid/string_interpolation.expected b/tests/valid/string_interpolation.expected
new file mode 100644
index 0000000..d41320d
--- /dev/null
+++ b/tests/valid/string_interpolation.expected
@@ -0,0 +1 @@
+{"value":"n is 42","greeting":"hello world"}
\ No newline at end of file
diff --git a/tests/valid/string_interpolation.goon b/tests/valid/string_interpolation.goon
new file mode 100644
index 0000000..8f68185
--- /dev/null
+++ b/tests/valid/string_interpolation.goon
@@ -0,0 +1,3 @@
+let name = "world";
+let n = 42;
+{ greeting = "hello ${name}"; value = "n is ${n}"; }
\ No newline at end of file
diff --git a/tests/valid/strings.expected b/tests/valid/strings.expected
new file mode 100644
index 0000000..f5702cc
--- /dev/null
+++ b/tests/valid/strings.expected
@@ -0,0 +1 @@
+{"d":"quote\"test","c":"tab\there","b":"line\nbreak","a":"hello"}
\ No newline at end of file
diff --git a/tests/valid/strings.goon b/tests/valid/strings.goon
new file mode 100644
index 0000000..0065560
--- /dev/null
+++ b/tests/valid/strings.goon
@@ -0,0 +1 @@
+{ a = "hello"; b = "line\nbreak"; c = "tab\there"; d = "quote\"test"; }
\ No newline at end of file
diff --git a/tests/valid/ternary.expected b/tests/valid/ternary.expected
new file mode 100644
index 0000000..f17206a
--- /dev/null
+++ b/tests/valid/ternary.expected
@@ -0,0 +1 @@
+{"b":2,"a":1}
\ No newline at end of file
diff --git a/tests/valid/ternary.goon b/tests/valid/ternary.goon
new file mode 100644
index 0000000..87322ec
--- /dev/null
+++ b/tests/valid/ternary.goon
@@ -0,0 +1 @@
+{ a = true ? 1 : 2; b = false ? 1 : 2; }
\ No newline at end of file