1 package gval
2
3 import (
4 "fmt"
5 "reflect"
6 "strings"
7 "testing"
8
9 "github.com/shopspring/decimal"
10 )
11
12 type evaluationTest struct {
13 name string
14 expression string
15 extension Language
16 parameter interface{}
17 want interface{}
18 equalityFunc func(x, y interface{}) bool
19 wantErr string
20 }
21
22 func testEvaluate(tests []evaluationTest, t *testing.T) {
23 for _, tt := range tests {
24 t.Run(tt.name, func(t *testing.T) {
25 got, err := Evaluate(tt.expression, tt.parameter, tt.extension)
26
27 if tt.wantErr != "" {
28 if err == nil {
29 t.Fatalf("Evaluate(%s) expected error but got %v", tt.expression, got)
30 }
31 if !strings.Contains(err.Error(), tt.wantErr) {
32 t.Fatalf("Evaluate(%s) expected error %s but got error %v", tt.expression, tt.wantErr, err)
33 }
34 return
35 }
36 if err != nil {
37 t.Errorf("Evaluate() error = %v", err)
38 return
39 }
40 if ef := tt.equalityFunc; ef != nil {
41 if !ef(got, tt.want) {
42 t.Errorf("Evaluate(%s) = %v, want %v", tt.expression, got, tt.want)
43 }
44 } else if !reflect.DeepEqual(got, tt.want) {
45 t.Errorf("Evaluate(%s) = %v, want %v", tt.expression, got, tt.want)
46 }
47 })
48 }
49 }
50
51
52 type dummyParameter struct {
53 String string
54 Int int
55 BoolFalse bool
56 Nil interface{}
57 Nested dummyNestedParameter
58 }
59
60 func (d dummyParameter) Func() string {
61 return "funk"
62 }
63
64 func (d dummyParameter) Func2() (string, error) {
65 return "frink", nil
66 }
67
68 func (d *dummyParameter) PointerFunc() (string, error) {
69 return "point", nil
70 }
71
72 func (d dummyParameter) FuncErr() (string, error) {
73 return "", fmt.Errorf("fumps")
74 }
75
76 func (d dummyParameter) FuncArgStr(arg1 string) string {
77 return arg1
78 }
79
80 func (d dummyParameter) AlwaysFail() (interface{}, error) {
81 return nil, fmt.Errorf("function should always fail")
82 }
83
84 type dummyNestedParameter struct {
85 Funk string
86 Map map[string]int
87 Slice []int
88 }
89
90 func (d dummyNestedParameter) Dunk(arg1 string) string {
91 return arg1 + "dunk"
92 }
93
94 var foo = dummyParameter{
95 String: "string!",
96 Int: 101,
97 BoolFalse: false,
98 Nil: nil,
99 Nested: dummyNestedParameter{
100 Funk: "funkalicious",
101 Map: map[string]int{"a": 1, "b": 2, "c": 3},
102 Slice: []int{1, 2, 3},
103 },
104 }
105
106 var fooFailureParameters = map[string]interface{}{
107 "foo": foo,
108 "fooptr": &foo,
109 }
110
111 var decimalEqualityFunc = func(x, y interface{}) bool {
112 v1, ok1 := x.(decimal.Decimal)
113 v2, ok2 := y.(decimal.Decimal)
114
115 if !ok1 || !ok2 {
116 return false
117 }
118
119 return v1.Equal(v2)
120 }
121
View as plain text