@@ -6,85 +6,91 @@ import (
6
6
7
7
"github.com/antonmedv/expr"
8
8
"github.com/stretchr/testify/assert"
9
+ "github.com/stretchr/testify/require"
9
10
)
10
11
11
- var tests = []struct {
12
- input string
13
- want interface {}
14
- }{
15
- {`len(1..10)` , 10 },
16
- {`len({foo: 1, bar: 2})` , 2 },
17
- {`len("hello")` , 5 },
18
- {`abs(-5)` , 5 },
19
- {`abs(.5)` , .5 },
20
- {`abs(-.5)` , .5 },
21
- {`int(5.5)` , 5 },
22
- {`int(5)` , 5 },
23
- {`int("5")` , 5 },
24
- {`float(5)` , 5.0 },
25
- {`float(5.5)` , 5.5 },
26
- {`float("5.5")` , 5.5 },
27
- {`string(5)` , "5" },
28
- {`string(5.5)` , "5.5" },
29
- {`string("5.5")` , "5.5" },
30
- {`trim(" foo ")` , "foo" },
31
- {`trim("__foo___", "_")` , "foo" },
32
- {`trimPrefix("prefix_foo", "prefix_")` , "foo" },
33
- {`trimSuffix("foo_suffix", "_suffix")` , "foo" },
34
- {`upper("foo")` , "FOO" },
35
- {`lower("FOO")` , "foo" },
36
- {`split("foo,bar,baz", ",")` , []string {"foo" , "bar" , "baz" }},
37
- {`splitN("foo,bar,baz", ",", 2)` , []string {"foo" , "bar,baz" }},
38
- {`splitAfter("foo,bar,baz", ",")` , []string {"foo," , "bar," , "baz" }},
39
- {`splitAfterN("foo,bar,baz", ",", 2)` , []string {"foo," , "bar,baz" }},
40
- {`replace("foo,bar,baz", ",", ";")` , "foo;bar;baz" },
41
- {`replace("foo,bar,baz,goo", ",", ";", 2)` , "foo;bar;baz,goo" },
42
- {`repeat("foo", 3)` , "foofoofoo" },
43
- {`join(ArrayOfString, ",")` , "foo,bar,baz" },
44
- {`join(ArrayOfString)` , "foobarbaz" },
45
- {`join(["foo", "bar", "baz"], ",")` , "foo,bar,baz" },
46
- {`join(["foo", "bar", "baz"])` , "foobarbaz" },
47
- {`indexOf("foo,bar,baz", ",")` , 3 },
48
- {`lastIndexOf("foo,bar,baz", ",")` , 7 },
49
- {`hasPrefix("foo,bar,baz", "foo")` , true },
50
- {`hasSuffix("foo,bar,baz", "baz")` , true },
51
- {`max(1, 2, 3)` , 3 },
52
- {`max(1.5, 2.5, 3.5)` , 3.5 },
53
- {`min(1, 2, 3)` , 1 },
54
- {`min(1.5, 2.5, 3.5)` , 1.5 },
55
- {`toJSON({foo: 1, bar: 2})` , "{\n \" bar\" : 2,\n \" foo\" : 1\n }" },
56
- {`fromJSON("[1, 2, 3]")` , []interface {}{1.0 , 2.0 , 3.0 }},
57
- {`toBase64("hello")` , "aGVsbG8=" },
58
- {`fromBase64("aGVsbG8=")` , "hello" },
59
- {`now().Format("2006-01-02T15:04:05Z")` , time .Now ().Format ("2006-01-02T15:04:05Z" )},
60
- {`duration("1h")` , time .Hour },
61
- {`date("2006-01-02T15:04:05Z")` , time .Date (2006 , 1 , 2 , 15 , 4 , 5 , 0 , time .UTC )},
62
- {`date("2006.01.02", "2006.01.02")` , time .Date (2006 , 1 , 2 , 0 , 0 , 0 , 0 , time .UTC )},
63
- {`first(ArrayOfString)` , "foo" },
64
- {`first(ArrayOfInt)` , 1 },
65
- {`first(ArrayOfAny)` , 1 },
66
- {`last(ArrayOfString)` , "baz" },
67
- {`last(ArrayOfInt)` , 3 },
68
- {`last(ArrayOfAny)` , true },
69
- {`get(ArrayOfString, 1)` , "bar" },
70
- {`get(ArrayOfString, 99)` , nil },
71
- {`get(ArrayOfInt, 1)` , 2 },
72
- {`get(ArrayOfInt, -1)` , 3 },
73
- {`get(ArrayOfAny, 1)` , "2" },
74
- {`get({foo: 1, bar: 2}, "foo")` , 1 },
75
- {`get({foo: 1, bar: 2}, "unknown")` , nil },
76
- }
77
-
78
12
func TestBuiltin (t * testing.T ) {
13
+ var tests = []struct {
14
+ input string
15
+ want interface {}
16
+ }{
17
+ {`len(1..10)` , 10 },
18
+ {`len({foo: 1, bar: 2})` , 2 },
19
+ {`len("hello")` , 5 },
20
+ {`abs(-5)` , 5 },
21
+ {`abs(.5)` , .5 },
22
+ {`abs(-.5)` , .5 },
23
+ {`int(5.5)` , 5 },
24
+ {`int(5)` , 5 },
25
+ {`int("5")` , 5 },
26
+ {`float(5)` , 5.0 },
27
+ {`float(5.5)` , 5.5 },
28
+ {`float("5.5")` , 5.5 },
29
+ {`string(5)` , "5" },
30
+ {`string(5.5)` , "5.5" },
31
+ {`string("5.5")` , "5.5" },
32
+ {`trim(" foo ")` , "foo" },
33
+ {`trim("__foo___", "_")` , "foo" },
34
+ {`trimPrefix("prefix_foo", "prefix_")` , "foo" },
35
+ {`trimSuffix("foo_suffix", "_suffix")` , "foo" },
36
+ {`upper("foo")` , "FOO" },
37
+ {`lower("FOO")` , "foo" },
38
+ {`split("foo,bar,baz", ",")` , []string {"foo" , "bar" , "baz" }},
39
+ {`splitN("foo,bar,baz", ",", 2)` , []string {"foo" , "bar,baz" }},
40
+ {`splitAfter("foo,bar,baz", ",")` , []string {"foo," , "bar," , "baz" }},
41
+ {`splitAfterN("foo,bar,baz", ",", 2)` , []string {"foo," , "bar,baz" }},
42
+ {`replace("foo,bar,baz", ",", ";")` , "foo;bar;baz" },
43
+ {`replace("foo,bar,baz,goo", ",", ";", 2)` , "foo;bar;baz,goo" },
44
+ {`repeat("foo", 3)` , "foofoofoo" },
45
+ {`join(ArrayOfString, ",")` , "foo,bar,baz" },
46
+ {`join(ArrayOfString)` , "foobarbaz" },
47
+ {`join(["foo", "bar", "baz"], ",")` , "foo,bar,baz" },
48
+ {`join(["foo", "bar", "baz"])` , "foobarbaz" },
49
+ {`indexOf("foo,bar,baz", ",")` , 3 },
50
+ {`lastIndexOf("foo,bar,baz", ",")` , 7 },
51
+ {`hasPrefix("foo,bar,baz", "foo")` , true },
52
+ {`hasSuffix("foo,bar,baz", "baz")` , true },
53
+ {`max(1, 2, 3)` , 3 },
54
+ {`max(1.5, 2.5, 3.5)` , 3.5 },
55
+ {`min(1, 2, 3)` , 1 },
56
+ {`min(1.5, 2.5, 3.5)` , 1.5 },
57
+ {`toJSON({foo: 1, bar: 2})` , "{\n \" bar\" : 2,\n \" foo\" : 1\n }" },
58
+ {`fromJSON("[1, 2, 3]")` , []interface {}{1.0 , 2.0 , 3.0 }},
59
+ {`toBase64("hello")` , "aGVsbG8=" },
60
+ {`fromBase64("aGVsbG8=")` , "hello" },
61
+ {`now().Format("2006-01-02T15:04:05Z")` , time .Now ().Format ("2006-01-02T15:04:05Z" )},
62
+ {`duration("1h")` , time .Hour },
63
+ {`date("2006-01-02T15:04:05Z")` , time .Date (2006 , 1 , 2 , 15 , 4 , 5 , 0 , time .UTC )},
64
+ {`date("2006.01.02", "2006.01.02")` , time .Date (2006 , 1 , 2 , 0 , 0 , 0 , 0 , time .UTC )},
65
+ {`first(ArrayOfString)` , "foo" },
66
+ {`first(ArrayOfInt)` , 1 },
67
+ {`first(ArrayOfAny)` , 1 },
68
+ {`first([])` , nil },
69
+ {`last(ArrayOfString)` , "baz" },
70
+ {`last(ArrayOfInt)` , 3 },
71
+ {`last(ArrayOfAny)` , true },
72
+ {`last([])` , nil },
73
+ {`get(ArrayOfString, 1)` , "bar" },
74
+ {`get(ArrayOfString, 99)` , nil },
75
+ {`get(ArrayOfInt, 1)` , 2 },
76
+ {`get(ArrayOfInt, -1)` , 3 },
77
+ {`get(ArrayOfAny, 1)` , "2" },
78
+ {`get({foo: 1, bar: 2}, "foo")` , 1 },
79
+ {`get({foo: 1, bar: 2}, "unknown")` , nil },
80
+ }
81
+
79
82
env := map [string ]interface {}{
80
83
"ArrayOfString" : []string {"foo" , "bar" , "baz" },
81
84
"ArrayOfInt" : []int {1 , 2 , 3 },
82
85
"ArrayOfAny" : []interface {}{1 , "2" , true },
83
86
}
84
87
for _ , test := range tests {
85
88
t .Run (test .input , func (t * testing.T ) {
86
- out , err := expr .Eval (test .input , env )
87
- assert .NoError (t , err )
89
+ program , err := expr .Compile (test .input , expr .Env (env ))
90
+ require .NoError (t , err )
91
+
92
+ out , err := expr .Run (program , env )
93
+ require .NoError (t , err )
88
94
assert .Equal (t , test .want , out )
89
95
})
90
96
}
0 commit comments