Added more tests
This commit is contained in:
parent
b655950516
commit
9779476fe7
64
src/ast/ast_test.go
Normal file
64
src/ast/ast_test.go
Normal file
@ -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)
|
||||
}
|
@ -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:])
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user