1package exp_test
2
3import (
4	"testing"
5
6	"github.com/doug-martin/goqu/v9/exp"
7	"github.com/stretchr/testify/suite"
8)
9
10type exTestSuite struct {
11	suite.Suite
12}
13
14func TestExSuite(t *testing.T) {
15	suite.Run(t, new(exTestSuite))
16}
17
18func (ets *exTestSuite) TestExpression() {
19	ex := exp.Ex{"a": "b"}
20	ets.Equal(ex, ex.Expression())
21}
22
23func (ets *exTestSuite) TestClone() {
24	ex := exp.Ex{"a": "b"}
25	ets.Equal(ex, ex.Clone())
26}
27
28func (ets *exTestSuite) TestIsEmpty() {
29	ets.False(exp.Ex{"a": "b"}.IsEmpty())
30	ets.True(exp.Ex{}.IsEmpty())
31}
32
33func (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
166type exOrTestSuite struct {
167	suite.Suite
168}
169
170func TestExOrSuite(t *testing.T) {
171	suite.Run(t, new(exOrTestSuite))
172}
173
174func (ets *exOrTestSuite) TestExpression() {
175	ex := exp.ExOr{"a": "b"}
176	ets.Equal(ex, ex.Expression())
177}
178
179func (ets *exOrTestSuite) TestClone() {
180	ex := exp.ExOr{"a": "b"}
181	ets.Equal(ex, ex.Clone())
182}
183
184func (ets *exOrTestSuite) TestIsEmpty() {
185	ets.False(exp.ExOr{"a": "b"}.IsEmpty())
186	ets.True(exp.ExOr{}.IsEmpty())
187}
188
189func (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