Skip to content

Commit 764742f

Browse files
committed
add tests
1 parent 7f5698a commit 764742f

File tree

5 files changed

+78
-37
lines changed

5 files changed

+78
-37
lines changed

querybuilder/operator/in.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ func init() {
1010
var In = &Operator{
1111
Name: "in",
1212
Evaluate: func(input, value interface{}) bool {
13-
rinput := reflect.ValueOf(input)
13+
rvalue := reflect.ValueOf(value)
1414

15-
if rinput.Kind() == reflect.Slice {
16-
for i := 0; i < rinput.Len(); i++ {
17-
if rinput.Index(i).Interface() == value {
15+
if rvalue.Kind() == reflect.Slice {
16+
for i := 0; i < rvalue.Len(); i++ {
17+
if rvalue.Index(i).Interface() == input {
1818
return true
1919
}
2020
}

querybuilder/operator/in_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ func TestIn(t *testing.T) {
99
input interface{}
1010
want bool
1111
}{
12-
{title: "in-1", value: 2, input: []int{1, 2, 3}, want: true},
13-
{title: "in-2", value: 2.5, input: []float64{2.0, 2.3, 2.5, 3}, want: true},
14-
{title: "in-3", value: "c", input: []string{"a", "b", "c"}, want: true},
15-
{title: "in-4", value: "d", input: []string{"a", "b", "c"}, want: false},
16-
{title: "in-5", value: "word to", input: "my word to match", want: false},
12+
{title: "in-1", value: []int{1, 2, 3}, input: 2, want: true},
13+
{title: "in-2", value: []float64{2.0, 2.3, 2.5, 3}, input: 2.5, want: true},
14+
{title: "in-3", value: []string{"a", "b", "c"}, input: "c", want: true},
15+
{title: "in-4", value: []string{"a", "b", "c"}, input: "d", want: false},
16+
{title: "in-5", value: "my word to match", input: "word to", want: false},
1717
}
1818

1919
for _, input := range inputs {

querybuilder/operator/not_in_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ func TestNotIn(t *testing.T) {
99
input interface{}
1010
want bool
1111
}{
12-
{title: "in-1", value: 2, input: []int{1, 2, 3}, want: false},
13-
{title: "in-2", value: 2.5, input: []float64{2.0, 2.3, 2.5, 3}, want: false},
14-
{title: "in-3", value: "c", input: []string{"a", "b", "c"}, want: false},
15-
{title: "in-4", value: "d", input: []string{"a", "b", "c"}, want: true},
16-
{title: "in-5", value: "word to", input: "my word to match", want: true},
12+
{title: "in-1", value: []int{1, 2, 3}, input: 2, want: false},
13+
{title: "in-2", value: []float64{2.0, 2.3, 2.5, 3}, input: 2.5, want: false},
14+
{title: "in-3", value: []string{"a", "b", "c"}, input: "c", want: false},
15+
{title: "in-4", value: []string{"a", "b", "c"}, input: "d", want: true},
16+
{title: "in-5", value: "my word to match", input: "word to", want: true},
1717
}
1818

1919
for _, input := range inputs {

querybuilder/rule.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,9 @@ func (r *Rule) parseValue(v interface{}) interface{} {
8686
if rv.Kind() == reflect.Slice {
8787
sv := make([]interface{}, rv.Len())
8888

89-
for i := 0; i < rv.Len(); i++ {
90-
sv = append(sv, r.castValue(rv.Index(i)))
89+
for i, vv := range v.([]interface{}) {
90+
sv[i] = r.castValue(vv)
9191
}
92-
9392
return sv
9493
}
9594

querybuilder/rule_test.go

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,73 @@
11
package querybuilder
22

3-
import "testing"
3+
import (
4+
"testing"
5+
)
46

5-
func TestRuleEvaluate(t *testing.T) {
6-
inputs := []struct {
7-
rule *Rule
8-
want bool
9-
}{
10-
{&Rule{ID: "float_equal", Field: "float_equal", Type: "double", Input: "text", Operator: "equal", Value: 1.2}, true},
11-
{&Rule{ID: "float_equal_f", Field: "float_equal", Type: "double", Input: "text", Operator: "equal", Value: 1.3}, false},
12-
{&Rule{ID: "float_field_equal", Field: "float_field.equal", Type: "double", Input: "text", Operator: "equal", Value: 3.7}, true},
13-
{&Rule{ID: "int_greater", Field: "int_greater", Type: "integer", Input: "text", Operator: "greater", Value: 1.0}, true},
14-
{&Rule{ID: "int_greater_f", Field: "int_greater", Type: "integer", Input: "text", Operator: "greater", Value: 3.0}, false},
15-
{&Rule{ID: "int_not_field", Field: "int_not_field", Type: "integer", Input: "text", Operator: "greater", Value: 2.0}, false},
16-
}
7+
var benchmarkRuleEvaluateResult bool
178

18-
dataset := map[string]interface{}{
19-
"float_equal": 1.2,
20-
"int_greater": 2.0,
21-
"float_field": map[string]interface{}{"equal": 3.7, "greater": 5.0},
22-
}
9+
var ruleInputs = []struct {
10+
rule *Rule
11+
want bool
12+
}{
13+
{&Rule{ID: "string01", Field: "string", Type: "string", Input: "text", Operator: "begins_with", Value: "my"}, true},
14+
{&Rule{ID: "string02", Field: "string", Type: "string", Input: "text", Operator: "begins_with", Value: "mytext"}, false},
15+
{&Rule{ID: "string03", Field: "string", Type: "string", Input: "text", Operator: "contains", Value: "text"}, true},
16+
{&Rule{ID: "string04", Field: "string", Type: "string", Input: "text", Operator: "ends_with", Value: "test"}, false},
17+
{&Rule{ID: "string05", Field: "string", Type: "string", Input: "text", Operator: "ends_with", Value: "tests"}, true},
18+
{&Rule{ID: "string06", Field: "string", Type: "string", Input: "text", Operator: "greater", Value: "my text for test"}, true},
19+
{&Rule{ID: "string07", Field: "string", Type: "string", Input: "text", Operator: "greater_or_equal", Value: "my text for tests"}, true},
20+
{&Rule{ID: "string08", Field: "string_empty", Type: "string", Input: "text", Operator: "is_empty", Value: "a"}, true},
21+
{&Rule{ID: "string09", Field: "string", Type: "string", Input: "text", Operator: "match_with", Value: `/text\sfor/`}, true},
22+
{&Rule{ID: "double01", Field: "double", Type: "double", Input: "text", Operator: "between", Value: []interface{}{1.0, 2.0}}, true},
23+
{&Rule{ID: "double02", Field: "double", Type: "double", Input: "text", Operator: "equal", Value: 1.2}, true},
24+
{&Rule{ID: "double03", Field: "double", Type: "double", Input: "text", Operator: "greater", Value: 1.3}, false},
25+
{&Rule{ID: "double04", Field: "double", Type: "double", Input: "text", Operator: "greater_or_equal", Value: 1.2}, true},
26+
{&Rule{ID: "integer01", Field: "integer", Type: "integer", Input: "text", Operator: "between", Value: []interface{}{1.0, 3.0}}, true},
27+
{&Rule{ID: "integer02", Field: "list_integer", Type: "integer", Input: "text", Operator: "contains", Value: 3.0}, true},
28+
{&Rule{ID: "integer03", Field: "fields.integer", Type: "integer", Input: "text", Operator: "equal", Value: 5.0}, true},
29+
{&Rule{ID: "integer04", Field: "integer", Type: "integer", Input: "text", Operator: "greater", Value: 1.0}, true},
30+
{&Rule{ID: "integer05", Field: "integer", Type: "integer", Input: "text", Operator: "greater_or_equal", Value: 1.0}, true},
31+
{&Rule{ID: "integer06", Field: "integer", Type: "integer", Input: "text", Operator: "in", Value: []interface{}{1.0, 2.0, 3.0}}, true},
32+
{&Rule{ID: "integer07", Field: "list_empty", Type: "integer", Input: "text", Operator: "is_empty", Value: []interface{}{1.0}}, true},
33+
{&Rule{ID: "date01", Field: "date", Type: "date", Input: "text", Operator: "between", Value: []interface{}{"2019-12-31", "2020-01-02"}}, true},
34+
{&Rule{ID: "date02", Field: "date", Type: "date", Input: "text", Operator: "greater", Value: "2019-12-31"}, true},
35+
{&Rule{ID: "date03", Field: "date", Type: "date", Input: "text", Operator: "greater_or_equal", Value: "2019-12-31"}, true},
36+
{&Rule{ID: "field_nil", Field: "field_nil", Type: "double", Input: "text", Operator: "is_nil", Value: 1}, true},
37+
}
38+
39+
var typeNil interface{}
40+
var ruleDataset = map[string]interface{}{
41+
"string": "my text for tests",
42+
"string_empty": "",
43+
"double": 1.2,
44+
"integer": 2.0,
45+
"date": "2020-01-01",
46+
"boolean": true,
47+
"list_integer": []interface{}{1.0, 2.0, 3.0, 4.0, 5.0, 6.0},
48+
"list_empty": []interface{}{},
49+
"field_nil": typeNil,
50+
"fields": map[string]interface{}{"double": 3.7, "integer": 5.0},
51+
}
2352

24-
for _, i := range inputs {
53+
func TestRuleEvaluate(t *testing.T) {
54+
for _, i := range ruleInputs {
2555
t.Run(i.rule.ID, func(t *testing.T) {
26-
if ok := i.rule.Evaluate(dataset); ok != i.want {
56+
if ok := i.rule.Evaluate(ruleDataset); ok != i.want {
2757
t.Errorf("Evaluate got %t, want: true", ok)
2858
}
2959
})
3060
}
3161
}
62+
63+
func BenchmarkRuleEvaluate(b *testing.B) {
64+
var ok bool
65+
66+
for i := 0; i < b.N; i++ {
67+
for _, j := range ruleInputs {
68+
ok = j.rule.Evaluate(ruleDataset)
69+
}
70+
}
71+
72+
benchmarkRuleEvaluateResult = ok
73+
}

0 commit comments

Comments
 (0)