@@ -472,6 +472,7 @@ func TestExpr_readme_example(t *testing.T) {
472
472
}
473
473
474
474
func TestExpr (t * testing.T ) {
475
+ date := time .Date (2017 , time .October , 23 , 18 , 30 , 0 , 0 , time .UTC )
475
476
env := & mockEnv {
476
477
Any : "any" ,
477
478
Int : 0 ,
@@ -492,7 +493,7 @@ func TestExpr(t *testing.T) {
492
493
{Origin : "MOW" , Destination : "LED" },
493
494
{Origin : "LED" , Destination : "MOW" },
494
495
},
495
- BirthDay : time . Date ( 2017 , time . October , 23 , 18 , 30 , 0 , 0 , time . UTC ) ,
496
+ BirthDay : date ,
496
497
Now : time .Now (),
497
498
One : 1 ,
498
499
Two : 2 ,
@@ -505,8 +506,9 @@ func TestExpr(t *testing.T) {
505
506
}
506
507
return ret
507
508
},
508
- Inc : func (a int ) int { return a + 1 },
509
- Nil : nil ,
509
+ Inc : func (a int ) int { return a + 1 },
510
+ Nil : nil ,
511
+ Tweets : []tweet {{"Oh My God!" , date }, {"How you doin?" , date }, {"Could I be wearing any more clothes?" , date }},
510
512
}
511
513
512
514
tests := []struct {
@@ -849,31 +851,35 @@ func TestExpr(t *testing.T) {
849
851
`Float(0)` ,
850
852
float64 (0 ),
851
853
},
854
+ {
855
+ `map(filter(Tweets, {len(.Text) > 10}), {Format(.Date)})` ,
856
+ []interface {}{"23 Oct 17 18:30 UTC" , "23 Oct 17 18:30 UTC" },
857
+ },
852
858
}
853
859
854
860
for _ , tt := range tests {
855
861
program , err := expr .Compile (tt .code , expr .Env (& mockEnv {}))
856
- require .NoError (t , err , tt . code )
862
+ require .NoError (t , err , "compile error" )
857
863
858
864
got , err := expr .Run (program , env )
859
- require .NoError (t , err , tt . code )
865
+ require .NoError (t , err , "execution error" )
860
866
861
867
assert .Equal (t , tt .want , got , tt .code )
862
868
}
863
869
864
870
for _ , tt := range tests {
865
871
program , err := expr .Compile (tt .code , expr .Optimize (false ))
866
- require .NoError (t , err , tt . code )
872
+ require .NoError (t , err , "compile error" )
867
873
868
874
got , err := expr .Run (program , env )
869
- require .NoError (t , err , tt . code )
875
+ require .NoError (t , err , "execution error" )
870
876
871
877
assert .Equal (t , tt .want , got , "unoptimized: " + tt .code )
872
878
}
873
879
874
880
for _ , tt := range tests {
875
881
got , err := expr .Eval (tt .code , env )
876
- require .NoError (t , err , tt . code )
882
+ require .NoError (t , err , "eval error" )
877
883
878
884
assert .Equal (t , tt .want , got , "eval: " + tt .code )
879
885
}
@@ -1079,6 +1085,7 @@ type mockEnv struct {
1079
1085
NilStruct * time.Time
1080
1086
NilInt * int
1081
1087
NilSlice []ticket
1088
+ Tweets []tweet
1082
1089
}
1083
1090
1084
1091
func (e * mockEnv ) GetInt () int {
@@ -1144,6 +1151,8 @@ func (*mockEnv) Float(i interface{}) float64 {
1144
1151
}
1145
1152
}
1146
1153
1154
+ func (* mockEnv ) Format (t time.Time ) string { return t .Format (time .RFC822 ) }
1155
+
1147
1156
type ticket struct {
1148
1157
Price int
1149
1158
}
@@ -1168,6 +1177,11 @@ type segment struct {
1168
1177
Date time.Time
1169
1178
}
1170
1179
1180
+ type tweet struct {
1181
+ Text string
1182
+ Date time.Time
1183
+ }
1184
+
1171
1185
type mockMapStringStringEnv map [string ]string
1172
1186
1173
1187
func (m mockMapStringStringEnv ) Split (s , sep string ) []string {
0 commit comments