(t *testing.T)
| 974 | } |
| 975 | |
| 976 | func TestMacroInterop(t *testing.T) { |
| 977 | existsOneMacro := NewReceiverMacro("exists_one", 2, |
| 978 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 979 | return ExistsOneMacroExpander(meh, iterRange, args) |
| 980 | }) |
| 981 | transformMacro := NewReceiverMacro("transform", 2, |
| 982 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 983 | return MapMacroExpander(meh, iterRange, args) |
| 984 | }) |
| 985 | filterMacro := NewReceiverMacro("filter", 2, |
| 986 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 987 | return FilterMacroExpander(meh, iterRange, args) |
| 988 | }) |
| 989 | pairMacro := NewGlobalMacro("pair", 2, |
| 990 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 991 | return meh.NewMap(meh.NewMapEntry(args[0], args[1], false)), nil |
| 992 | }) |
| 993 | getMacro := NewReceiverMacro("get", 2, |
| 994 | func(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 995 | return meh.GlobalCall( |
| 996 | operators.Conditional, |
| 997 | meh.PresenceTest(meh.Copy(target), args[0].GetIdentExpr().GetName()), |
| 998 | meh.Select(meh.Copy(target), args[0].GetIdentExpr().GetName()), |
| 999 | meh.Copy(args[1]), |
| 1000 | ), nil |
| 1001 | }) |
| 1002 | env := testEnv(t, Macros(existsOneMacro, transformMacro, filterMacro, pairMacro, getMacro)) |
| 1003 | tests := []struct { |
| 1004 | expr string |
| 1005 | out ref.Val |
| 1006 | }{ |
| 1007 | { |
| 1008 | expr: `['tr', 's', 'fri'].filter(i, i.size() > 1).transform(i, i + 'end').exists_one(i, i == 'friend')`, |
| 1009 | out: types.True, |
| 1010 | }, |
| 1011 | { |
| 1012 | expr: `pair('a', 'b')`, |
| 1013 | out: types.DefaultTypeAdapter.NativeToValue(map[string]string{"a": "b"}), |
| 1014 | }, |
| 1015 | { |
| 1016 | expr: `{}.get(a, 'default')`, |
| 1017 | out: types.String("default"), |
| 1018 | }, |
| 1019 | { |
| 1020 | expr: `{'a': 'b'}.get(a, 'default')`, |
| 1021 | out: types.String("b"), |
| 1022 | }, |
| 1023 | } |
| 1024 | |
| 1025 | for _, tst := range tests { |
| 1026 | ast, iss := env.Compile(tst.expr) |
| 1027 | if iss.Err() != nil { |
| 1028 | t.Fatal(iss.Err()) |
| 1029 | } |
| 1030 | prg, err := env.Program(ast, EvalOptions(OptExhaustiveEval)) |
| 1031 | if err != nil { |
| 1032 | t.Fatalf("program creation error: %s\n", err) |
| 1033 | } |
nothing calls this directly
no test coverage detected