From 9779476fe7e5ef2d47f7cd7a1777de7430120491 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 20 Feb 2025 15:06:22 +0100 Subject: [PATCH] Added more tests --- src/ast/ast_test.go | 64 ++++++++++++++++++++++++++++++++++++++ src/ast/eachInstruction.go | 9 +++++- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/ast/ast_test.go diff --git a/src/ast/ast_test.go b/src/ast/ast_test.go new file mode 100644 index 0000000..c7307a4 --- /dev/null +++ b/src/ast/ast_test.go @@ -0,0 +1,64 @@ +package ast_test + +import ( + "testing" + + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/fs" + "git.akyoto.dev/cli/q/src/token" + "git.akyoto.dev/go/assert" +) + +func TestAssign(t *testing.T) { + tree, err := parse("a := 0\na = 0") + assert.Nil(t, err) + assert.Equal(t, len(tree), 2) + + definition := tree[0].(*ast.Define) + assignment := tree[1].(*ast.Assign) + assert.NotNil(t, definition.Expression) + assert.NotNil(t, assignment.Expression) +} + +func TestReturn(t *testing.T) { + tree, err := parse("return") + assert.Nil(t, err) + assert.Equal(t, len(tree), 1) + + ret := tree[0].(*ast.Return) + assert.Nil(t, ret.Values) +} + +func TestReturnValues(t *testing.T) { + tree, err := parse("return 42") + assert.Nil(t, err) + assert.Equal(t, len(tree), 1) + + ret := tree[0].(*ast.Return) + assert.Equal(t, len(ret.Values), 1) + assert.Equal(t, ret.Values[0].Token.Kind, token.Number) +} + +func TestIfElse(t *testing.T) { + tree, err := parse("if x == 0 {} else {}") + assert.Nil(t, err) + assert.Equal(t, len(tree), 1) + + branch := tree[0].(*ast.If) + assert.NotNil(t, branch.Condition) + assert.NotNil(t, branch.Body) + assert.NotNil(t, branch.Else) +} + +func TestLoop(t *testing.T) { + tree, err := parse("loop{}") + assert.Nil(t, err) + assert.Equal(t, len(tree), 1) +} + +func parse(code string) (ast.AST, error) { + src := []byte(code) + tokens := token.Tokenize(src) + file := &fs.File{Bytes: src, Tokens: tokens} + return ast.Parse(tokens, file) +} diff --git a/src/ast/eachInstruction.go b/src/ast/eachInstruction.go index ceb653f..e4df0e2 100644 --- a/src/ast/eachInstruction.go +++ b/src/ast/eachInstruction.go @@ -51,10 +51,17 @@ func eachInstruction(tokens token.List, call func(token.List) error) error { } start = i + 1 + + case token.EOF: + if start < i { + return call(tokens[start:i]) + } + + return nil } } - if start != len(tokens) { + if start < len(tokens) { return call(tokens[start:]) }