Files
hetty/pkg/search/lexer_test.go
2021-04-25 16:23:53 +02:00

92 lines
1.7 KiB
Go

package search
import "testing"
func TestNextToken(t *testing.T) {
t.Parallel()
tests := []struct {
name string
input string
expected []Token
}{
{
name: "unquoted string",
input: "foo bar",
expected: []Token{
{TokString, "foo"},
{TokString, "bar"},
{TokEOF, ""},
},
},
{
name: "quoted string",
input: `"foo bar" "baz"`,
expected: []Token{
{TokString, "foo bar"},
{TokString, "baz"},
{TokEOF, ""},
},
},
{
name: "boolean operator token types",
input: "NOT AND OR",
expected: []Token{
{TokOpNot, "NOT"},
{TokOpAnd, "AND"},
{TokOpOr, "OR"},
{TokEOF, ""},
},
},
{
name: "comparison operator token types",
input: `= != < > <= >= =~ !~`,
expected: []Token{
{TokOpEq, "="},
{TokOpNotEq, "!="},
{TokOpLt, "<"},
{TokOpGt, ">"},
{TokOpLtEq, "<="},
{TokOpGtEq, ">="},
{TokOpRe, "=~"},
{TokOpNotRe, "!~"},
{TokEOF, ""},
},
},
{
name: "with parentheses",
input: "(foo AND bar) OR baz",
expected: []Token{
{TokParenOpen, "("},
{TokString, "foo"},
{TokOpAnd, "AND"},
{TokString, "bar"},
{TokParenClose, ")"},
{TokOpOr, "OR"},
{TokString, "baz"},
{TokEOF, ""},
},
},
}
for i, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
l := NewLexer(tt.input)
for _, exp := range tt.expected {
got := l.Next()
if got.Type != exp.Type {
t.Errorf("invalid type (idx: %v, expected: %v, got: %v)",
i, exp.Type, got.Type)
}
if got.Literal != exp.Literal {
t.Errorf("invalid literal (idx: %v, expected: %v, got: %v)",
i, exp.Literal, got.Literal)
}
}
})
}
}