package query
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestTokenize(t *testing.T) {
var tests = []struct {
input string
tokens []token
}{
{"status:", nil},
{":value", nil},
{"status:open", []token{newTokenKV("status", "open")}},
{"status:closed", []token{newTokenKV("status", "closed")}},
{"author:rene", []token{newTokenKV("author", "rene")}},
{`author:"René Descartes"`, []token{newTokenKV("author", "René Descartes")}},
{
`status:open status:closed author:rene author:"René Descartes"`,
[]token{
newTokenKV("status", "open"),
newTokenKV("status", "closed"),
newTokenKV("author", "rene"),
newTokenKV("author", "René Descartes"),
},
},
// quotes
{`key:"value value"`, []token{newTokenKV("key", "value value")}},
{`key:'value value'`, []token{newTokenKV("key", "value value")}},
// unmatched quotes
{`key:'value value`, nil},
{`key:value value'`, nil},
// sub-qualifier positive testing
{`key:subkey:"value:value"`, []token{newTokenKVV("key", "subkey", "value:value")}},
// sub-qualifier negative testing
{`key:subkey:value:value`, nil},
{`key:subkey:`, nil},
{`key:subkey:"value`, nil},
// full text search
{"search", []token{newTokenSearch("search")}},
{"search more terms", []token{
newTokenSearch("search"),
newTokenSearch("more"),
newTokenSearch("terms"),
}},
{"search \"more terms\"", []token{
newTokenSearch("search"),
newTokenSearch("more terms"),
}},
}
for _, tc := range tests {
t.Run(tc.input, func(t *testing.T) {
tokens, err := tokenize(tc.input)
if tc.tokens == nil {
require.Error(t, err)
require.Nil(t, tokens)
} else {
require.NoError(t, err)
require.Equal(t, tc.tokens, tokens)
}
})
}
}