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
|
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:])
|
return call(tokens[start:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user