1package query
 2
 3import (
 4	"testing"
 5
 6	"github.com/stretchr/testify/require"
 7)
 8
 9func TestTokenize(t *testing.T) {
10	var tests = []struct {
11		input  string
12		tokens []token
13	}{
14		{"status:", nil},
15		{":value", nil},
16
17		{"status:open", []token{newTokenKV("status", "open")}},
18		{"status:closed", []token{newTokenKV("status", "closed")}},
19
20		{"author:rene", []token{newTokenKV("author", "rene")}},
21		{`author:"René Descartes"`, []token{newTokenKV("author", "René Descartes")}},
22
23		{
24			`status:open status:closed author:rene author:"René Descartes"`,
25			[]token{
26				newTokenKV("status", "open"),
27				newTokenKV("status", "closed"),
28				newTokenKV("author", "rene"),
29				newTokenKV("author", "René Descartes"),
30			},
31		},
32
33		// quotes
34		{`key:"value value"`, []token{newTokenKV("key", "value value")}},
35		{`key:'value value'`, []token{newTokenKV("key", "value value")}},
36		// unmatched quotes
37		{`key:'value value`, nil},
38		{`key:value value'`, nil},
39
40		// sub-qualifier positive testing
41		{`key:subkey:"value:value"`, []token{newTokenKVV("key", "subkey", "value:value")}},
42
43		// sub-qualifier negative testing
44		{`key:subkey:value:value`, nil},
45		{`key:subkey:`, nil},
46		{`key:subkey:"value`, nil},
47
48		// full text search
49		{"search", []token{newTokenSearch("search")}},
50		{"search more terms", []token{
51			newTokenSearch("search"),
52			newTokenSearch("more"),
53			newTokenSearch("terms"),
54		}},
55		{"search \"more terms\"", []token{
56			newTokenSearch("search"),
57			newTokenSearch("more terms"),
58		}},
59	}
60
61	for _, tc := range tests {
62		t.Run(tc.input, func(t *testing.T) {
63			tokens, err := tokenize(tc.input)
64			if tc.tokens == nil {
65				require.Error(t, err)
66				require.Nil(t, tokens)
67			} else {
68				require.NoError(t, err)
69				require.Equal(t, tc.tokens, tokens)
70			}
71		})
72	}
73}