mirror of
https://github.com/dstotijn/hetty.git
synced 2025-07-01 18:47:29 -04:00
92 lines
1.7 KiB
Go
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)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|