xgo/parser/parser_call_test.go
2019-01-08 23:17:42 -08:00

143 lines
3.1 KiB
Go

package parser_test
import (
"testing"
"github.com/d5/tengo/ast"
"github.com/d5/tengo/token"
)
func TestCall(t *testing.T) {
expect(t, "add(1, 2, 3)", func(p pfn) []ast.Stmt {
return stmts(
exprStmt(
callExpr(
ident("add", p(1, 1)),
p(1, 4), p(1, 12),
intLit(1, p(1, 5)),
intLit(2, p(1, 8)),
intLit(3, p(1, 11)))))
})
expect(t, "a = add(1, 2, 3)", func(p pfn) []ast.Stmt {
return stmts(
assignStmt(
exprs(
ident("a", p(1, 1))),
exprs(
callExpr(
ident("add", p(1, 5)),
p(1, 8), p(1, 16),
intLit(1, p(1, 9)),
intLit(2, p(1, 12)),
intLit(3, p(1, 15)))),
token.Assign,
p(1, 3)))
})
expect(t, "a, b = add(1, 2, 3)", func(p pfn) []ast.Stmt {
return stmts(
assignStmt(
exprs(
ident("a", p(1, 1)),
ident("b", p(1, 4))),
exprs(
callExpr(
ident("add", p(1, 8)),
p(1, 11), p(1, 19),
intLit(1, p(1, 12)),
intLit(2, p(1, 15)),
intLit(3, p(1, 18)))),
token.Assign,
p(1, 6)))
})
expect(t, "add(a + 1, 2 * 1, (b + c))", func(p pfn) []ast.Stmt {
return stmts(
exprStmt(
callExpr(
ident("add", p(1, 1)),
p(1, 4), p(1, 26),
binaryExpr(
ident("a", p(1, 5)),
intLit(1, p(1, 9)),
token.Add,
p(1, 7)),
binaryExpr(
intLit(2, p(1, 12)),
intLit(1, p(1, 16)),
token.Mul,
p(1, 14)),
parenExpr(
binaryExpr(
ident("b", p(1, 20)),
ident("c", p(1, 24)),
token.Add,
p(1, 22)),
p(1, 19), p(1, 25)))))
})
expectString(t, "a + add(b * c) + d", "((a + add((b * c))) + d)")
expectString(t, "add(a, b, 1, 2 * 3, 4 + 5, add(6, 7 * 8))", "add(a, b, 1, (2 * 3), (4 + 5), add(6, (7 * 8)))")
expectString(t, "f1(a) + f2(b) * f3(c)", "(f1(a) + (f2(b) * f3(c)))")
expectString(t, "(f1(a) + f2(b)) * f3(c)", "(((f1(a) + f2(b))) * f3(c))")
expect(t, "func(a, b) { a + b }(1, 2)", func(p pfn) []ast.Stmt {
return stmts(
exprStmt(
callExpr(
funcLit(
funcType(
identList(
p(1, 5), p(1, 10),
ident("a", p(1, 6)),
ident("b", p(1, 9))),
p(1, 1)),
blockStmt(
p(1, 12), p(1, 20),
exprStmt(
binaryExpr(
ident("a", p(1, 14)),
ident("b", p(1, 18)),
token.Add,
p(1, 16))))),
p(1, 21), p(1, 26),
intLit(1, p(1, 22)),
intLit(2, p(1, 25)))))
})
expect(t, `a.b()`, func(p pfn) []ast.Stmt {
return stmts(
exprStmt(
callExpr(
selectorExpr(
ident("a", p(1, 1)),
stringLit("b", p(1, 3))),
p(1, 4), p(1, 5))))
})
expect(t, `a.b.c()`, func(p pfn) []ast.Stmt {
return stmts(
exprStmt(
callExpr(
selectorExpr(
selectorExpr(
ident("a", p(1, 1)),
stringLit("b", p(1, 3))),
stringLit("c", p(1, 5))),
p(1, 6), p(1, 7))))
})
expect(t, `a["b"].c()`, func(p pfn) []ast.Stmt {
return stmts(
exprStmt(
callExpr(
selectorExpr(
indexExpr(
ident("a", p(1, 1)),
stringLit("b", p(1, 3)),
p(1, 2), p(1, 6)),
stringLit("c", p(1, 8))),
p(1, 9), p(1, 10))))
})
}