@@ -472,6 +472,7 @@ func TestExpr_readme_example(t *testing.T) {
472472}
473473
474474func TestExpr (t * testing.T ) {
475+ date := time .Date (2017 , time .October , 23 , 18 , 30 , 0 , 0 , time .UTC )
475476 env := & mockEnv {
476477 Any : "any" ,
477478 Int : 0 ,
@@ -492,7 +493,7 @@ func TestExpr(t *testing.T) {
492493 {Origin : "MOW" , Destination : "LED" },
493494 {Origin : "LED" , Destination : "MOW" },
494495 },
495- BirthDay : time . Date ( 2017 , time . October , 23 , 18 , 30 , 0 , 0 , time . UTC ) ,
496+ BirthDay : date ,
496497 Now : time .Now (),
497498 One : 1 ,
498499 Two : 2 ,
@@ -505,8 +506,9 @@ func TestExpr(t *testing.T) {
505506 }
506507 return ret
507508 },
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 }},
510512 }
511513
512514 tests := []struct {
@@ -849,31 +851,35 @@ func TestExpr(t *testing.T) {
849851 `Float(0)` ,
850852 float64 (0 ),
851853 },
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+ },
852858 }
853859
854860 for _ , tt := range tests {
855861 program , err := expr .Compile (tt .code , expr .Env (& mockEnv {}))
856- require .NoError (t , err , tt . code )
862+ require .NoError (t , err , "compile error" )
857863
858864 got , err := expr .Run (program , env )
859- require .NoError (t , err , tt . code )
865+ require .NoError (t , err , "execution error" )
860866
861867 assert .Equal (t , tt .want , got , tt .code )
862868 }
863869
864870 for _ , tt := range tests {
865871 program , err := expr .Compile (tt .code , expr .Optimize (false ))
866- require .NoError (t , err , tt . code )
872+ require .NoError (t , err , "compile error" )
867873
868874 got , err := expr .Run (program , env )
869- require .NoError (t , err , tt . code )
875+ require .NoError (t , err , "execution error" )
870876
871877 assert .Equal (t , tt .want , got , "unoptimized: " + tt .code )
872878 }
873879
874880 for _ , tt := range tests {
875881 got , err := expr .Eval (tt .code , env )
876- require .NoError (t , err , tt . code )
882+ require .NoError (t , err , "eval error" )
877883
878884 assert .Equal (t , tt .want , got , "eval: " + tt .code )
879885 }
@@ -1079,6 +1085,7 @@ type mockEnv struct {
10791085 NilStruct * time.Time
10801086 NilInt * int
10811087 NilSlice []ticket
1088+ Tweets []tweet
10821089}
10831090
10841091func (e * mockEnv ) GetInt () int {
@@ -1144,6 +1151,8 @@ func (*mockEnv) Float(i interface{}) float64 {
11441151 }
11451152}
11461153
1154+ func (* mockEnv ) Format (t time.Time ) string { return t .Format (time .RFC822 ) }
1155+
11471156type ticket struct {
11481157 Price int
11491158}
@@ -1168,6 +1177,11 @@ type segment struct {
11681177 Date time.Time
11691178}
11701179
1180+ type tweet struct {
1181+ Text string
1182+ Date time.Time
1183+ }
1184+
11711185type mockMapStringStringEnv map [string ]string
11721186
11731187func (m mockMapStringStringEnv ) Split (s , sep string ) []string {
0 commit comments