| package toml |
| |
| import ( |
| "testing" |
| ) |
| |
| func testQLFlow(t *testing.T, input string, expectedFlow []token) { |
| ch := lexQuery(input) |
| for idx, expected := range expectedFlow { |
| token := <-ch |
| if token != expected { |
| t.Log("While testing #", idx, ":", input) |
| t.Log("compared", token, "to", expected) |
| t.Log(token.val, "<->", expected.val) |
| t.Log(token.typ, "<->", expected.typ) |
| t.Log(token.Line, "<->", expected.Line) |
| t.Log(token.Col, "<->", expected.Col) |
| t.FailNow() |
| } |
| } |
| |
| tok, ok := <-ch |
| if ok { |
| t.Log("channel is not closed!") |
| t.Log(len(ch)+1, "tokens remaining:") |
| |
| t.Log("token ->", tok) |
| for token := range ch { |
| t.Log("token ->", token) |
| } |
| t.FailNow() |
| } |
| } |
| |
| func TestLexSpecialChars(t *testing.T) { |
| testQLFlow(t, " .$[]..()?*", []token{ |
| token{Position{1, 2}, tokenDot, "."}, |
| token{Position{1, 3}, tokenDollar, "$"}, |
| token{Position{1, 4}, tokenLeftBracket, "["}, |
| token{Position{1, 5}, tokenRightBracket, "]"}, |
| token{Position{1, 6}, tokenDotDot, ".."}, |
| token{Position{1, 8}, tokenLeftParen, "("}, |
| token{Position{1, 9}, tokenRightParen, ")"}, |
| token{Position{1, 10}, tokenQuestion, "?"}, |
| token{Position{1, 11}, tokenStar, "*"}, |
| token{Position{1, 12}, tokenEOF, ""}, |
| }) |
| } |
| |
| func TestLexString(t *testing.T) { |
| testQLFlow(t, "'foo'", []token{ |
| token{Position{1, 2}, tokenString, "foo"}, |
| token{Position{1, 6}, tokenEOF, ""}, |
| }) |
| } |
| |
| func TestLexDoubleString(t *testing.T) { |
| testQLFlow(t, `"bar"`, []token{ |
| token{Position{1, 2}, tokenString, "bar"}, |
| token{Position{1, 6}, tokenEOF, ""}, |
| }) |
| } |
| |
| func TestLexKey(t *testing.T) { |
| testQLFlow(t, "foo", []token{ |
| token{Position{1, 1}, tokenKey, "foo"}, |
| token{Position{1, 4}, tokenEOF, ""}, |
| }) |
| } |
| |
| func TestLexRecurse(t *testing.T) { |
| testQLFlow(t, "$..*", []token{ |
| token{Position{1, 1}, tokenDollar, "$"}, |
| token{Position{1, 2}, tokenDotDot, ".."}, |
| token{Position{1, 4}, tokenStar, "*"}, |
| token{Position{1, 5}, tokenEOF, ""}, |
| }) |
| } |
| |
| func TestLexBracketKey(t *testing.T) { |
| testQLFlow(t, "$[foo]", []token{ |
| token{Position{1, 1}, tokenDollar, "$"}, |
| token{Position{1, 2}, tokenLeftBracket, "["}, |
| token{Position{1, 3}, tokenKey, "foo"}, |
| token{Position{1, 6}, tokenRightBracket, "]"}, |
| token{Position{1, 7}, tokenEOF, ""}, |
| }) |
| } |
| |
| func TestLexSpace(t *testing.T) { |
| testQLFlow(t, "foo bar baz", []token{ |
| token{Position{1, 1}, tokenKey, "foo"}, |
| token{Position{1, 5}, tokenKey, "bar"}, |
| token{Position{1, 9}, tokenKey, "baz"}, |
| token{Position{1, 12}, tokenEOF, ""}, |
| }) |
| } |