(t *testing.T, expr string, vars []*decls.VariableDecl, ctx Activation, options []CostTrackerOption)
| 110 | } |
| 111 | |
| 112 | func computeCost(t *testing.T, expr string, vars []*decls.VariableDecl, ctx Activation, options []CostTrackerOption) (cost uint64, est checker.CostEstimate, err error) { |
| 113 | t.Helper() |
| 114 | |
| 115 | s := common.NewTextSource(expr) |
| 116 | p, err := parser.NewParser(parser.Macros(parser.AllMacros...)) |
| 117 | if err != nil { |
| 118 | t.Fatalf("Failed to initialize parser: %v", err) |
| 119 | } |
| 120 | parsed, errs := p.Parse(s) |
| 121 | if len(errs.GetErrors()) != 0 { |
| 122 | t.Fatalf(`Failed to Parse expression "%s", error: %v`, expr, errs.GetErrors()) |
| 123 | } |
| 124 | |
| 125 | cont := containers.DefaultContainer |
| 126 | reg := newTestRegistry(t, types.ProtoTypeDefs(&proto3pb.TestAllTypes{})) |
| 127 | attrs := NewAttributeFactory(cont, reg, reg) |
| 128 | env := newTestEnv(t, cont, reg) |
| 129 | err = env.AddIdents(vars...) |
| 130 | if err != nil { |
| 131 | t.Fatalf("Failed to initialize env: %v", err) |
| 132 | } |
| 133 | costTracker, err := NewCostTracker(&testRuntimeCostEstimator{}, options...) |
| 134 | if err != nil { |
| 135 | t.Fatalf("NewCostTracker() failed: %v", err) |
| 136 | } |
| 137 | costTracker, err = costTracker.Clone() |
| 138 | if err != nil { |
| 139 | t.Fatalf("checker.Clone() failed: %v", err) |
| 140 | } |
| 141 | checked, errs := checker.Check(parsed, s, env) |
| 142 | if len(errs.GetErrors()) != 0 { |
| 143 | t.Fatalf(`Failed to check expression "%s", error: %v`, expr, errs.GetErrors()) |
| 144 | } |
| 145 | est, err = checker.Cost(checked, testCostEstimator{}, checker.PresenceTestHasCost(costTracker.presenceTestHasCost)) |
| 146 | if err != nil { |
| 147 | t.Fatalf("checker.Cost() failed: %v", err) |
| 148 | } |
| 149 | interp := newStandardInterpreter(t, cont, reg, reg, attrs) |
| 150 | prg, err := interp.NewInterpretable(checked, |
| 151 | CostObserver(CostTrackerFactory(func() (*CostTracker, error) { |
| 152 | return costTracker, nil |
| 153 | }))) |
| 154 | if err != nil { |
| 155 | t.Fatalf(`Failed to check expression "%s", error: %v`, expr, errs.GetErrors()) |
| 156 | } |
| 157 | |
| 158 | defer func() { |
| 159 | if r := recover(); r != nil { |
| 160 | switch t := r.(type) { |
| 161 | case EvalCancelledError: |
| 162 | err = t |
| 163 | default: |
| 164 | err = fmt.Errorf("internal error: %v", r) |
| 165 | } |
| 166 | } |
| 167 | }() |
| 168 | frame := AsFrame(ctx) |
| 169 | prg.Exec(frame) |
no test coverage detected