(t *testing.T)
| 938 | } |
| 939 | |
| 940 | func TestMacroModern(t *testing.T) { |
| 941 | existsOneMacro := ReceiverMacro("exists_one", 2, parser.MakeExistsOne) |
| 942 | transformMacro := ReceiverMacro("transform", 2, parser.MakeMap) |
| 943 | filterMacro := ReceiverMacro("filter", 2, parser.MakeFilter) |
| 944 | pairMacro := GlobalMacro("pair", 2, |
| 945 | func(mef MacroExprFactory, iterRange celast.Expr, args []celast.Expr) (celast.Expr, *Error) { |
| 946 | return mef.NewMap(mef.NewMapEntry(args[0], args[1], false)), nil |
| 947 | }) |
| 948 | getMacro := ReceiverMacro("get", 2, |
| 949 | func(mef MacroExprFactory, target celast.Expr, args []celast.Expr) (celast.Expr, *Error) { |
| 950 | return mef.NewCall( |
| 951 | operators.Conditional, |
| 952 | mef.NewPresenceTest(mef.Copy(target), args[0].AsIdent()), |
| 953 | mef.NewSelect(mef.Copy(target), args[0].AsIdent()), |
| 954 | mef.Copy(args[1]), |
| 955 | ), nil |
| 956 | }) |
| 957 | env := testEnv(t, Macros(existsOneMacro, transformMacro, filterMacro, pairMacro, getMacro)) |
| 958 | tests := []struct { |
| 959 | expr string |
| 960 | out ref.Val |
| 961 | }{ |
| 962 | { |
| 963 | expr: `['tr', 's', 'fri'].filter(i, i.size() > 1).transform(i, i + 'end').exists_one(i, i == 'friend')`, |
| 964 | out: types.True, |
| 965 | }, |
| 966 | { |
| 967 | expr: `pair('a', 'b')`, |
| 968 | out: types.DefaultTypeAdapter.NativeToValue(map[string]string{"a": "b"}), |
| 969 | }, |
| 970 | { |
| 971 | expr: `{}.get(a, 'default')`, |
| 972 | out: types.String("default"), |
| 973 | }, |
| 974 | { |
| 975 | expr: `{'a': 'b'}.get(a, 'default')`, |
| 976 | out: types.String("b"), |
| 977 | }, |
| 978 | } |
| 979 | |
| 980 | for _, tst := range tests { |
| 981 | ast, iss := env.Compile(tst.expr) |
| 982 | if iss.Err() != nil { |
| 983 | t.Fatal(iss.Err()) |
| 984 | } |
| 985 | prg, err := env.Program(ast, EvalOptions(OptExhaustiveEval)) |
| 986 | if err != nil { |
| 987 | t.Fatalf("program creation error: %s\n", err) |
| 988 | } |
| 989 | out, _, err := prg.Eval(NoVars()) |
| 990 | if err != nil { |
| 991 | t.Fatal(err) |
| 992 | } |
| 993 | if out.Equal(tst.out) != types.True { |
| 994 | t.Errorf("got %v, wanted %v", out, tst.out) |
| 995 | } |
| 996 | } |
| 997 | } |
nothing calls this directly
no test coverage detected