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