(t *testing.T)
| 1042 | } |
| 1043 | |
| 1044 | func TestMacroModern(t *testing.T) { |
| 1045 | existsOneMacro := ReceiverMacro("exists_one", 2, parser.MakeExistsOne) |
| 1046 | transformMacro := ReceiverMacro("transform", 2, parser.MakeMap) |
| 1047 | filterMacro := ReceiverMacro("filter", 2, parser.MakeFilter) |
| 1048 | pairMacro := GlobalMacro("pair", 2, |
| 1049 | func(mef MacroExprFactory, iterRange celast.Expr, args []celast.Expr) (celast.Expr, *Error) { |
| 1050 | return mef.NewMap(mef.NewMapEntry(args[0], args[1], false)), nil |
| 1051 | }) |
| 1052 | getMacro := ReceiverMacro("get", 2, |
| 1053 | func(mef MacroExprFactory, target celast.Expr, args []celast.Expr) (celast.Expr, *Error) { |
| 1054 | return mef.NewCall( |
| 1055 | operators.Conditional, |
| 1056 | mef.NewPresenceTest(mef.Copy(target), args[0].AsIdent()), |
| 1057 | mef.NewSelect(mef.Copy(target), args[0].AsIdent()), |
| 1058 | mef.Copy(args[1]), |
| 1059 | ), nil |
| 1060 | }) |
| 1061 | env := testEnv(t, Macros(existsOneMacro, transformMacro, filterMacro, pairMacro, getMacro)) |
| 1062 | tests := []struct { |
| 1063 | expr string |
| 1064 | out ref.Val |
| 1065 | }{ |
| 1066 | { |
| 1067 | expr: `['tr', 's', 'fri'].filter(i, i.size() > 1).transform(i, i + 'end').exists_one(i, i == 'friend')`, |
| 1068 | out: types.True, |
| 1069 | }, |
| 1070 | { |
| 1071 | expr: `pair('a', 'b')`, |
| 1072 | out: types.DefaultTypeAdapter.NativeToValue(map[string]string{"a": "b"}), |
| 1073 | }, |
| 1074 | { |
| 1075 | expr: `{}.get(a, 'default')`, |
| 1076 | out: types.String("default"), |
| 1077 | }, |
| 1078 | { |
| 1079 | expr: `{'a': 'b'}.get(a, 'default')`, |
| 1080 | out: types.String("b"), |
| 1081 | }, |
| 1082 | } |
| 1083 | |
| 1084 | for _, tst := range tests { |
| 1085 | ast, iss := env.Compile(tst.expr) |
| 1086 | if iss.Err() != nil { |
| 1087 | t.Fatal(iss.Err()) |
| 1088 | } |
| 1089 | prg, err := env.Program(ast, EvalOptions(OptExhaustiveEval)) |
| 1090 | if err != nil { |
| 1091 | t.Fatalf("program creation error: %s\n", err) |
| 1092 | } |
| 1093 | out, _, err := prg.Eval(NoVars()) |
| 1094 | if err != nil { |
| 1095 | t.Fatal(err) |
| 1096 | } |
| 1097 | if out.Equal(tst.out) != types.True { |
| 1098 | t.Errorf("got %v, wanted %v", out, tst.out) |
| 1099 | } |
| 1100 | } |
| 1101 | } |
nothing calls this directly
no test coverage detected