2016-07-23 17:06:26 +00:00
|
|
|
package expr
|
2016-07-22 20:38:20 +00:00
|
|
|
|
2016-08-05 17:48:42 +00:00
|
|
|
//import . "testing"
|
|
|
|
|
|
|
|
//func TestSliceEnclosedToks(t *T) {
|
|
|
|
// doAssert := func(in, expOut, expRem []lexer.Token) {
|
|
|
|
// out, rem, err := sliceEnclosedToks(in, openParen, closeParen)
|
|
|
|
// require.Nil(t, err)
|
|
|
|
// assert.Equal(t, expOut, out)
|
|
|
|
// assert.Equal(t, expRem, rem)
|
|
|
|
// }
|
|
|
|
// foo := lexer.Token{TokenType: lexer.Identifier, Val: "foo"}
|
|
|
|
// bar := lexer.Token{TokenType: lexer.Identifier, Val: "bar"}
|
|
|
|
//
|
|
|
|
// toks := []lexer.Token{openParen, closeParen}
|
|
|
|
// doAssert(toks, []lexer.Token{}, []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, closeParen, bar}
|
|
|
|
// doAssert(toks, []lexer.Token{foo}, []lexer.Token{bar})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, foo, closeParen, bar, bar}
|
|
|
|
// doAssert(toks, []lexer.Token{foo, foo}, []lexer.Token{bar, bar})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, openParen, bar, closeParen, closeParen}
|
|
|
|
// doAssert(toks, []lexer.Token{foo, openParen, bar, closeParen}, []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, openParen, bar, closeParen, bar, closeParen, foo}
|
|
|
|
// doAssert(toks, []lexer.Token{foo, openParen, bar, closeParen, bar}, []lexer.Token{foo})
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//func assertParse(t *T, in []lexer.Token, expExpr Expr, expOut []lexer.Token) {
|
|
|
|
// expr, out, err := parse(in)
|
|
|
|
// require.Nil(t, err)
|
|
|
|
// assert.True(t, expExpr.equal(expr), "expr:%+v expExpr:%+v", expr, expExpr)
|
|
|
|
// assert.Equal(t, expOut, out, "out:%v expOut:%v", out, expOut)
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//func TestParseSingle(t *T) {
|
|
|
|
// foo := lexer.Token{TokenType: lexer.Identifier, Val: "foo"}
|
|
|
|
// fooM := lexer.Token{TokenType: lexer.Identifier, Val: "%foo"}
|
|
|
|
// fooExpr := Expr{Actual: Identifier("foo")}
|
|
|
|
// fooMExpr := Expr{Actual: Macro("foo")}
|
|
|
|
//
|
|
|
|
// toks := []lexer.Token{foo}
|
|
|
|
// assertParse(t, toks, fooExpr, []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, foo}
|
|
|
|
// assertParse(t, toks, fooExpr, []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, closeParen, foo}
|
|
|
|
// assertParse(t, toks, fooExpr, []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, openParen, foo, closeParen, closeParen, foo}
|
|
|
|
// assertParse(t, toks, fooExpr, []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{fooM, foo}
|
|
|
|
// assertParse(t, toks, fooMExpr, []lexer.Token{foo})
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//func TestParseTuple(t *T) {
|
|
|
|
// tup := func(ee ...Expr) Expr {
|
|
|
|
// return Expr{Actual: Tuple(ee)}
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// foo := lexer.Token{TokenType: lexer.Identifier, Val: "foo"}
|
|
|
|
// fooExpr := Expr{Actual: Identifier("foo")}
|
|
|
|
//
|
|
|
|
// toks := []lexer.Token{foo, comma, foo}
|
|
|
|
// assertParse(t, toks, tup(fooExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, comma, foo, foo}
|
|
|
|
// assertParse(t, toks, tup(fooExpr, fooExpr), []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, comma, foo, comma, foo}
|
|
|
|
// assertParse(t, toks, tup(fooExpr, fooExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, comma, foo, comma, foo, comma, foo}
|
|
|
|
// assertParse(t, toks, tup(fooExpr, fooExpr, fooExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, comma, openParen, foo, comma, foo, closeParen, comma, foo}
|
|
|
|
// assertParse(t, toks, tup(fooExpr, tup(fooExpr, fooExpr), fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, comma, openParen, foo, comma, foo, closeParen, comma, foo, foo}
|
|
|
|
// assertParse(t, toks, tup(fooExpr, tup(fooExpr, fooExpr), fooExpr), []lexer.Token{foo})
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//func TestParseStatement(t *T) {
|
|
|
|
// stmt := func(in, to Expr) Expr {
|
|
|
|
// return Expr{Actual: Statement{In: in, To: to}}
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// foo := lexer.Token{TokenType: lexer.Identifier, Val: "foo"}
|
|
|
|
// fooExpr := Expr{Actual: Identifier("foo")}
|
|
|
|
//
|
|
|
|
// toks := []lexer.Token{foo, arrow, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, arrow, foo, closeParen}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, arrow, openParen, foo, closeParen}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, arrow, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, arrow, foo, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooExpr), []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, arrow, openParen, foo, closeParen, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooExpr), []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, closeParen, arrow, openParen, foo, closeParen, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooExpr), []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// fooTupExpr := Expr{Actual: Tuple{fooExpr, fooExpr}}
|
|
|
|
// toks = []lexer.Token{foo, arrow, openParen, foo, comma, foo, closeParen, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooExpr, fooTupExpr), []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{foo, comma, foo, arrow, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooTupExpr, fooExpr), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openParen, foo, comma, foo, closeParen, arrow, foo}
|
|
|
|
// assertParse(t, toks, stmt(fooTupExpr, fooExpr), []lexer.Token{})
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//func TestParseBlock(t *T) {
|
|
|
|
// stmt := func(in, to Expr) Expr {
|
|
|
|
// return Expr{Actual: Statement{In: in, To: to}}
|
|
|
|
// }
|
|
|
|
// block := func(stmts ...Expr) Expr {
|
|
|
|
// return Expr{Actual: Block(stmts)}
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// foo := lexer.Token{TokenType: lexer.Identifier, Val: "foo"}
|
|
|
|
// fooExpr := Expr{Actual: Identifier("foo")}
|
|
|
|
//
|
|
|
|
// toks := []lexer.Token{openCurly, foo, arrow, foo, closeCurly}
|
|
|
|
// assertParse(t, toks, block(stmt(fooExpr, fooExpr)), []lexer.Token{})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openCurly, foo, arrow, foo, closeCurly, foo}
|
|
|
|
// assertParse(t, toks, block(stmt(fooExpr, fooExpr)), []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openCurly, foo, arrow, foo, openParen, foo, arrow, foo, closeParen, closeCurly, foo}
|
|
|
|
// assertParse(t, toks, block(stmt(fooExpr, fooExpr), stmt(fooExpr, fooExpr)), []lexer.Token{foo})
|
|
|
|
//
|
|
|
|
// toks = []lexer.Token{openCurly, foo, arrow, foo, openParen, foo, arrow, foo, closeParen, closeCurly, foo}
|
|
|
|
// assertParse(t, toks, block(stmt(fooExpr, fooExpr), stmt(fooExpr, fooExpr)), []lexer.Token{foo})
|
|
|
|
//}
|