-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathfilter_test.go
180 lines (170 loc) · 4.64 KB
/
filter_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package main
import (
"reflect"
"testing"
)
func TestTokenizeFilterQuery(t *testing.T) {
tests := []struct {
name string
input string
expected []string
}{
{
name: "No quotes, single tokens only",
input: "book physics !math",
expected: []string{"book", "physics", "!math"},
},
{
name: "Double-quoted phrase",
input: `"earth science" physics`,
expected: []string{"earth science", "physics"},
},
{
name: "Single-quoted phrase",
input: `book 'social science' biology`,
expected: []string{"book", "social science", "biology"},
},
{
name: "Mixed single and double quotes",
input: `"environmental science" 'earth science' math`,
expected: []string{"environmental science", "earth science", "math"},
},
{
name: "Unclosed quote (double)",
input: `"science math`,
// The entire remainder after the first quote goes into the same token
// This behavior depends on your parser design; you might decide to handle or error out.
expected: []string{"science math"},
},
{
name: "Unclosed quote (single)",
input: `'science math`,
expected: []string{"science math"},
},
{
name: "Multiple separate phrases with OR inside",
input: `"earth science"|chemistry !biology`,
// This gets tokenized into 3 tokens:
// 1. earth science|chemistry
// 2. !biology
//
// Because there's no space between "earth science"|chemistry,
// they remain in one token (the user might intend that).
expected: []string{"earth science|chemistry", "!biology"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := tokenizeFilterQuery(tt.input)
if !reflect.DeepEqual(got, tt.expected) {
t.Errorf("got %v, want %v", got, tt.expected)
}
})
}
}
func TestEvaluateFilterQuery(t *testing.T) {
tests := []struct {
name string
query string
input string
expectedMatch bool
}{
// ----------------------------------
// Basic AND (space)
{
name: "Simple AND matches",
query: "book chemistry",
input: "I found a physics book today",
expectedMatch: false,
},
{
name: "Simple AND true",
query: "book physics",
input: "I found a physics book today",
expectedMatch: true,
},
// ----------------------------------
// OR logic (|)
{
name: "OR logic - one term found",
query: "science|math",
input: "I enjoy reading about science topics",
expectedMatch: true,
},
{
name: "OR logic - no term found",
query: "apple|banana",
input: "I love oranges",
expectedMatch: false,
},
// ----------------------------------
// NOT logic (!)
{
name: "NOT logic - excluded term present => false",
query: "book !math",
input: "I have a math book",
expectedMatch: false,
},
{
name: "NOT logic - excluded term absent => true",
query: "book !math",
input: "I have a science book",
expectedMatch: true,
},
// ----------------------------------
// Phrase testing (quotes)
{
name: "Double-quoted phrase present",
query: `"earth science"`,
input: "My earth science teacher is great",
expectedMatch: true,
},
{
name: "Double-quoted phrase absent",
query: `"earth science"`,
input: "I love rocket science",
expectedMatch: false,
},
{
name: "Single-quoted phrase present",
query: `book 'social science'`,
input: "I have a social science book for class",
// We want both "book" AND "social science" => expect true
expectedMatch: true,
},
{
name: "Single-quoted phrase absent",
query: `book 'social science'`,
input: "I have a math book",
// Missing "social science"
expectedMatch: false,
},
// ----------------------------------
// Combined logic with OR + phrase
{
name: "Phrase + OR logic pass",
query: `"earth science"|biology`,
input: "I am studying biology this semester",
// OR logic => "earth science" or "biology"
expectedMatch: true,
},
{
name: "Phrase + OR logic fail",
query: `"earth science"|biology`,
input: "I am studying math and physics",
expectedMatch: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := evaluateFilterQuery(tt.query, tt.input)
if err != nil {
t.Errorf("evaluateFilterQuery returned error: %v", err)
}
if got != tt.expectedMatch {
t.Errorf("query=%q input=%q => got %v, want %v",
tt.query, tt.input, got, tt.expectedMatch)
}
})
}
}