1 package exp_test
2
3 import (
4 "testing"
5
6 "github.com/doug-martin/goqu/v9/exp"
7 "github.com/stretchr/testify/suite"
8 )
9
10 type exTestSuite struct {
11 suite.Suite
12 }
13
14 func TestExSuite(t *testing.T) {
15 suite.Run(t, new(exTestSuite))
16 }
17
18 func (ets *exTestSuite) TestExpression() {
19 ex := exp.Ex{"a": "b"}
20 ets.Equal(ex, ex.Expression())
21 }
22
23 func (ets *exTestSuite) TestClone() {
24 ex := exp.Ex{"a": "b"}
25 ets.Equal(ex, ex.Clone())
26 }
27
28 func (ets *exTestSuite) TestIsEmpty() {
29 ets.False(exp.Ex{"a": "b"}.IsEmpty())
30 ets.True(exp.Ex{}.IsEmpty())
31 }
32
33 func (ets *exTestSuite) TestToExpression() {
34 ident := exp.NewIdentifierExpression("", "", "a")
35 testCases := []struct {
36 ExMap exp.Ex
37 El exp.ExpressionList
38 Err string
39 }{
40 {
41 ExMap: exp.Ex{"a": "b"},
42 El: exp.NewExpressionList(exp.AndType, ident.Eq("b")),
43 },
44 {
45 ExMap: exp.Ex{"a": "b", "b": "c"},
46 El: exp.NewExpressionList(
47 exp.AndType,
48 ident.Eq("b"),
49 exp.NewIdentifierExpression("", "", "b").Eq("c"),
50 ),
51 },
52 {
53 ExMap: exp.Ex{"a": exp.Op{"eq": "b"}},
54 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Eq("b"))),
55 },
56 {
57 ExMap: exp.Ex{"a": exp.Op{"neq": "b"}},
58 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Neq("b"))),
59 },
60 {
61 ExMap: exp.Ex{"a": exp.Op{"is": nil}},
62 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Is(nil))),
63 },
64 {
65 ExMap: exp.Ex{"a": exp.Op{"isNot": nil}},
66 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.IsNot(nil))),
67 },
68 {
69 ExMap: exp.Ex{"a": exp.Op{"gt": "b"}},
70 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Gt("b"))),
71 },
72 {
73 ExMap: exp.Ex{"a": exp.Op{"gte": "b"}},
74 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Gte("b"))),
75 },
76 {
77 ExMap: exp.Ex{"a": exp.Op{"lt": "b"}},
78 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Lt("b"))),
79 },
80 {
81 ExMap: exp.Ex{"a": exp.Op{"lte": "b"}},
82 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Lte("b"))),
83 },
84 {
85 ExMap: exp.Ex{"a": exp.Op{"in": "b"}},
86 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.In("b"))),
87 },
88 {
89 ExMap: exp.Ex{"a": exp.Op{"notIn": "b"}},
90 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.NotIn("b"))),
91 },
92 {
93 ExMap: exp.Ex{"a": exp.Op{"like": "b"}},
94 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Like("b"))),
95 },
96 {
97 ExMap: exp.Ex{"a": exp.Op{"notLike": "b"}},
98 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.NotLike("b"))),
99 },
100 {
101 ExMap: exp.Ex{"a": exp.Op{"iLike": "b"}},
102 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.ILike("b"))),
103 },
104 {
105 ExMap: exp.Ex{"a": exp.Op{"notILike": "b"}},
106 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.NotILike("b"))),
107 },
108 {
109 ExMap: exp.Ex{"a": exp.Op{"regexpLike": "b"}},
110 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.RegexpLike("b"))),
111 },
112 {
113 ExMap: exp.Ex{"a": exp.Op{"regexpNotLike": "b"}},
114 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.RegexpNotLike("b"))),
115 },
116 {
117 ExMap: exp.Ex{"a": exp.Op{"regexpILike": "b"}},
118 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.RegexpILike("b"))),
119 },
120 {
121 ExMap: exp.Ex{"a": exp.Op{"regexpNotILike": "b"}},
122 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.RegexpNotILike("b"))),
123 },
124 {
125 ExMap: exp.Ex{"a": exp.Op{"between": exp.NewRangeVal("a", "z")}},
126 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Between(exp.NewRangeVal("a", "z")))),
127 },
128 {
129 ExMap: exp.Ex{"a": exp.Op{"notBetween": exp.NewRangeVal("a", "z")}},
130 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.NotBetween(exp.NewRangeVal("a", "z")))),
131 },
132 {
133 ExMap: exp.Ex{"a": exp.Op{"foo": "z"}},
134 Err: "goqu: unsupported expression type foo",
135 },
136 {
137 ExMap: exp.Ex{"a": exp.Op{"eq": "b", "neq": "c", "gt": "m"}},
138 El: exp.NewExpressionList(exp.AndType, exp.NewExpressionList(exp.OrType, ident.Eq("b"), ident.Gt("m"), ident.Neq("c"))),
139 },
140
141 {
142 ExMap: exp.Ex{
143 "a": "b",
144 "c": "d",
145 },
146 El: exp.NewExpressionList(
147 exp.AndType,
148 ident.Eq("b"),
149 exp.NewIdentifierExpression("", "", "c").Eq("d"),
150 ),
151 },
152 }
153
154 for _, tc := range testCases {
155 el, err := tc.ExMap.ToExpressions()
156
157 if tc.Err == "" {
158 ets.NoError(err)
159 ets.Equal(tc.El, el, "For Ex %v", tc.ExMap)
160 } else {
161 ets.EqualError(err, tc.Err)
162 }
163 }
164 }
165
166 type exOrTestSuite struct {
167 suite.Suite
168 }
169
170 func TestExOrSuite(t *testing.T) {
171 suite.Run(t, new(exOrTestSuite))
172 }
173
174 func (ets *exOrTestSuite) TestExpression() {
175 ex := exp.ExOr{"a": "b"}
176 ets.Equal(ex, ex.Expression())
177 }
178
179 func (ets *exOrTestSuite) TestClone() {
180 ex := exp.ExOr{"a": "b"}
181 ets.Equal(ex, ex.Clone())
182 }
183
184 func (ets *exOrTestSuite) TestIsEmpty() {
185 ets.False(exp.ExOr{"a": "b"}.IsEmpty())
186 ets.True(exp.ExOr{}.IsEmpty())
187 }
188
189 func (ets *exOrTestSuite) TestToExpression() {
190 ident := exp.NewIdentifierExpression("", "", "a")
191 testCases := []struct {
192 ExMap exp.ExOr
193 El exp.ExpressionList
194 Err string
195 }{
196 {
197 ExMap: exp.ExOr{"a": "b"},
198 El: exp.NewExpressionList(exp.OrType, ident.Eq("b")),
199 },
200 {
201 ExMap: exp.ExOr{"a": "b", "b": "c"},
202 El: exp.NewExpressionList(
203 exp.OrType,
204 ident.Eq("b"),
205 exp.NewIdentifierExpression("", "", "b").Eq("c"),
206 ),
207 },
208 {
209 ExMap: exp.ExOr{"a": exp.Op{"eq": "b"}},
210 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Eq("b"))),
211 },
212 {
213 ExMap: exp.ExOr{"a": exp.Op{"neq": "b"}},
214 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Neq("b"))),
215 },
216 {
217 ExMap: exp.ExOr{"a": exp.Op{"is": nil}},
218 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Is(nil))),
219 },
220 {
221 ExMap: exp.ExOr{"a": exp.Op{"isNot": nil}},
222 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.IsNot(nil))),
223 },
224 {
225 ExMap: exp.ExOr{"a": exp.Op{"gt": "b"}},
226 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Gt("b"))),
227 },
228 {
229 ExMap: exp.ExOr{"a": exp.Op{"gte": "b"}},
230 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Gte("b"))),
231 },
232 {
233 ExMap: exp.ExOr{"a": exp.Op{"lt": "b"}},
234 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Lt("b"))),
235 },
236 {
237 ExMap: exp.ExOr{"a": exp.Op{"lte": "b"}},
238 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Lte("b"))),
239 },
240 {
241 ExMap: exp.ExOr{"a": exp.Op{"in": "b"}},
242 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.In("b"))),
243 },
244 {
245 ExMap: exp.ExOr{"a": exp.Op{"notIn": "b"}},
246 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.NotIn("b"))),
247 },
248 {
249 ExMap: exp.ExOr{"a": exp.Op{"like": "b"}},
250 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Like("b"))),
251 },
252 {
253 ExMap: exp.ExOr{"a": exp.Op{"notLike": "b"}},
254 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.NotLike("b"))),
255 },
256 {
257 ExMap: exp.ExOr{"a": exp.Op{"iLike": "b"}},
258 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.ILike("b"))),
259 },
260 {
261 ExMap: exp.ExOr{"a": exp.Op{"notILike": "b"}},
262 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.NotILike("b"))),
263 },
264 {
265 ExMap: exp.ExOr{"a": exp.Op{"regexpLike": "b"}},
266 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.RegexpLike("b"))),
267 },
268 {
269 ExMap: exp.ExOr{"a": exp.Op{"regexpNotLike": "b"}},
270 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.RegexpNotLike("b"))),
271 },
272 {
273 ExMap: exp.ExOr{"a": exp.Op{"regexpILike": "b"}},
274 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.RegexpILike("b"))),
275 },
276 {
277 ExMap: exp.ExOr{"a": exp.Op{"regexpNotILike": "b"}},
278 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.RegexpNotILike("b"))),
279 },
280 {
281 ExMap: exp.ExOr{"a": exp.Op{"between": exp.NewRangeVal("a", "z")}},
282 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Between(exp.NewRangeVal("a", "z")))),
283 },
284 {
285 ExMap: exp.ExOr{"a": exp.Op{"notBetween": exp.NewRangeVal("a", "z")}},
286 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.NotBetween(exp.NewRangeVal("a", "z")))),
287 },
288 {
289 ExMap: exp.ExOr{"a": exp.Op{"foo": "z"}},
290 Err: "goqu: unsupported expression type foo",
291 },
292 {
293 ExMap: exp.ExOr{"a": exp.Op{"eq": "b", "neq": "c", "gt": "m"}},
294 El: exp.NewExpressionList(exp.OrType, exp.NewExpressionList(exp.OrType, ident.Eq("b"), ident.Gt("m"), ident.Neq("c"))),
295 },
296
297 {
298 ExMap: exp.ExOr{
299 "a": "b",
300 "c": "d",
301 },
302 El: exp.NewExpressionList(
303 exp.OrType,
304 ident.Eq("b"),
305 exp.NewIdentifierExpression("", "", "c").Eq("d"),
306 ),
307 },
308 }
309
310 for _, tc := range testCases {
311 el, err := tc.ExMap.ToExpressions()
312
313 if tc.Err == "" {
314 ets.NoError(err)
315 ets.Equal(tc.El, el, "For Ex %v", tc.ExMap)
316 } else {
317 ets.EqualError(err, tc.Err)
318 }
319 }
320 }
321
View as plain text