(t *testing.T)
| 870 | } |
| 871 | |
| 872 | func TestMacroInterop(t *testing.T) { |
| 873 | existsOneMacro := NewReceiverMacro("exists_one", 2, |
| 874 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 875 | return ExistsOneMacroExpander(meh, iterRange, args) |
| 876 | }) |
| 877 | transformMacro := NewReceiverMacro("transform", 2, |
| 878 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 879 | return MapMacroExpander(meh, iterRange, args) |
| 880 | }) |
| 881 | filterMacro := NewReceiverMacro("filter", 2, |
| 882 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 883 | return FilterMacroExpander(meh, iterRange, args) |
| 884 | }) |
| 885 | pairMacro := NewGlobalMacro("pair", 2, |
| 886 | func(meh MacroExprHelper, iterRange *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 887 | return meh.NewMap(meh.NewMapEntry(args[0], args[1], false)), nil |
| 888 | }) |
| 889 | getMacro := NewReceiverMacro("get", 2, |
| 890 | func(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *Error) { |
| 891 | return meh.GlobalCall( |
| 892 | operators.Conditional, |
| 893 | meh.PresenceTest(meh.Copy(target), args[0].GetIdentExpr().GetName()), |
| 894 | meh.Select(meh.Copy(target), args[0].GetIdentExpr().GetName()), |
| 895 | meh.Copy(args[1]), |
| 896 | ), nil |
| 897 | }) |
| 898 | env := testEnv(t, Macros(existsOneMacro, transformMacro, filterMacro, pairMacro, getMacro)) |
| 899 | tests := []struct { |
| 900 | expr string |
| 901 | out ref.Val |
| 902 | }{ |
| 903 | { |
| 904 | expr: `['tr', 's', 'fri'].filter(i, i.size() > 1).transform(i, i + 'end').exists_one(i, i == 'friend')`, |
| 905 | out: types.True, |
| 906 | }, |
| 907 | { |
| 908 | expr: `pair('a', 'b')`, |
| 909 | out: types.DefaultTypeAdapter.NativeToValue(map[string]string{"a": "b"}), |
| 910 | }, |
| 911 | { |
| 912 | expr: `{}.get(a, 'default')`, |
| 913 | out: types.String("default"), |
| 914 | }, |
| 915 | { |
| 916 | expr: `{'a': 'b'}.get(a, 'default')`, |
| 917 | out: types.String("b"), |
| 918 | }, |
| 919 | } |
| 920 | |
| 921 | for _, tst := range tests { |
| 922 | ast, iss := env.Compile(tst.expr) |
| 923 | if iss.Err() != nil { |
| 924 | t.Fatal(iss.Err()) |
| 925 | } |
| 926 | prg, err := env.Program(ast, EvalOptions(OptExhaustiveEval)) |
| 927 | if err != nil { |
| 928 | t.Fatalf("program creation error: %s\n", err) |
| 929 | } |
nothing calls this directly
no test coverage detected