summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-10-13 16:12:53 +0200
committerMarc Vertes <mvertes@free.fr>2023-10-13 16:12:53 +0200
commit40a03025bc1883051c921e6619d751cddcaedeeb (patch)
tree8176aa1bc90b1137866d1e0395de8d381c2d8d85 /parser
parentc519de65676c94eb21467e3947ac3a16d824f574 (diff)
parser: refactor tests
Diffstat (limited to 'parser')
-rw-r--r--parser/interpreter_test.go78
1 files changed, 47 insertions, 31 deletions
diff --git a/parser/interpreter_test.go b/parser/interpreter_test.go
index bd3d3f4..7daec1a 100644
--- a/parser/interpreter_test.go
+++ b/parser/interpreter_test.go
@@ -10,6 +10,8 @@ import (
"github.com/gnolang/parscan/scanner"
)
+type etest struct{ src, res, err string }
+
var GoScanner *scanner.Scanner
func init() {
@@ -17,8 +19,8 @@ func init() {
GoScanner = scanner.NewScanner(golang.GoSpec)
}
-func TestEval(t *testing.T) {
- for _, test := range goTests {
+func run(t *testing.T, tests []etest) {
+ for _, test := range tests {
test := test
t.Run("", func(t *testing.T) {
interp := parser.NewInterpreter(GoScanner)
@@ -38,33 +40,47 @@ func TestEval(t *testing.T) {
}
}
-var goTests = []struct {
- src, res, err string
-}{
- 0: {src: "", res: "<nil>"},
- 1: {src: "1+2", res: "3"},
- 2: {src: "1+", err: "block not terminated"},
- 3: {src: "a := 1 + 2; b := 0; a + 1", res: "4"},
- 4: {src: "1+(2+3)", res: "6"},
- 5: {src: "(1+2)+3", res: "6"},
- 6: {src: "(6+(1+2)+3)+5", res: "17"},
- 7: {src: "(6+(1+2+3)+5", err: "1:1: block not terminated"},
- 8: {src: "a := 2; a = 3; a", res: "3"},
- 9: {src: "a := 0; if a == 0 { a = 2 } else { a = 1 }; a", res: "2"},
- 10: {src: "a := 0; if a == 1 { a = 2 } else { a = 1 }; a", res: "1"},
- 11: {src: "a := 0; if a == 1 { a = 2 } else if a == 0 { a = 3 } else { a = 1 }; a", res: "3"},
- 12: {src: "a := 0; if a == 1 { a = 2 } else if a == 2 { a = 3 } else { a = 1 }; a", res: "1"},
- 13: {src: "func f() int {return 2}; a := f(); a", res: "2"},
- 14: {src: "func f() int {return 2}; f()", res: "2"},
- 15: {src: "func f(a int) int {return a+2}; f(3)", res: "5"},
- 16: {src: "func f(a int) int {if a < 4 {a = 5}; return a }; f(3)", res: "5"},
- 17: {src: "func f(a int) int {return a+2}; 7 - f(3)", res: "2"},
- 18: {src: "func f(a int) int {return a+2}; f(5) - f(3)", res: "2"},
- 19: {src: "func f(a int) int {return a+2}; f(3) - 2", res: "3"},
- 20: {src: "func f(a int, b int, c int) int {return a+b-c} ; f(7, 1, 3)", res: "5"},
- 21: {src: "func f(a, b, c int) int {return a+b-c} ; f(7, 1, 3)", res: "5"},
- 22: {src: "a := 0; for i := 0; i < 3; i = i+1 {a = a+i}; a", res: "3"},
- 23: {src: "func f() int {a := 0; for i := 0; i < 3; i = i+1 {a = a+i}; return a}; f()", res: "3"},
- 24: {src: "a := 0; for {a = a+1; if a == 3 {break}}; a", res: "3"},
- 25: {src: "func f() int {a := 0; for {a = a+1; if a == 3 {break}}; return a}; f()", res: "3"},
+func TestExpr(t *testing.T) {
+ run(t, []etest{
+ {src: "", res: "<nil>"},
+ {src: "1+2", res: "3"},
+ {src: "1+", err: "block not terminated"},
+ {src: "a := 1 + 2; b := 0; a + 1", res: "4"},
+ {src: "1+(2+3)", res: "6"},
+ {src: "(1+2)+3", res: "6"},
+ {src: "(6+(1+2)+3)+5", res: "17"},
+ {src: "(6+(1+2+3)+5", err: "1:1: block not terminated"},
+ {src: "a := 2; a = 3; a", res: "3"},
+ })
+}
+
+func TestFunc(t *testing.T) {
+ run(t, []etest{
+ {src: "func f() int {return 2}; a := f(); a", res: "2"},
+ {src: "func f() int {return 2}; f()", res: "2"},
+ {src: "func f(a int) int {return a+2}; f(3)", res: "5"},
+ {src: "func f(a int) int {if a < 4 {a = 5}; return a }; f(3)", res: "5"},
+ {src: "func f(a int) int {return a+2}; 7 - f(3)", res: "2"},
+ {src: "func f(a int) int {return a+2}; f(5) - f(3)", res: "2"},
+ {src: "func f(a int) int {return a+2}; f(3) - 2", res: "3"},
+ {src: "func f(a int, b int, c int) int {return a+b-c} ; f(7, 1, 3)", res: "5"},
+ })
+}
+
+func TestIf(t *testing.T) {
+ run(t, []etest{
+ {src: "a := 0; if a == 0 { a = 2 } else { a = 1 }; a", res: "2"},
+ {src: "a := 0; if a == 1 { a = 2 } else { a = 1 }; a", res: "1"},
+ {src: "a := 0; if a == 1 { a = 2 } else if a == 0 { a = 3 } else { a = 1 }; a", res: "3"},
+ {src: "a := 0; if a == 1 { a = 2 } else if a == 2 { a = 3 } else { a = 1 }; a", res: "1"},
+ })
+}
+
+func TestFor(t *testing.T) {
+ run(t, []etest{
+ {src: "a := 0; for i := 0; i < 3; i = i+1 {a = a+i}; a", res: "3"},
+ {src: "func f() int {a := 0; for i := 0; i < 3; i = i+1 {a = a+i}; return a}; f()", res: "3"},
+ {src: "a := 0; for {a = a+1; if a == 3 {break}}; a", res: "3"},
+ {src: "func f() int {a := 0; for {a = a+1; if a == 3 {break}}; return a}; f()", res: "3"},
+ })
}