(t *testing.T)
| 2233 | } |
| 2234 | |
| 2235 | func TestResidualAstAttributeQualifiers(t *testing.T) { |
| 2236 | env := testEnv(t, |
| 2237 | Variable("x", MapType(StringType, DynType)), |
| 2238 | Variable("y", ListType(IntType)), |
| 2239 | Variable("u", IntType), |
| 2240 | ) |
| 2241 | ast, iss := env.Parse(`x.abc == u && x["abc"] == u && x[x.string] == u && y[0] == u && y[x.zero] == u && (true ? x : y).abc == u && (false ? y : x).abc == u`) |
| 2242 | if iss.Err() != nil { |
| 2243 | t.Fatalf("env.Parse() failed: %v", iss.Err()) |
| 2244 | } |
| 2245 | prg, err := env.Program(ast, |
| 2246 | EvalOptions(OptTrackState, OptPartialEval), |
| 2247 | ) |
| 2248 | if err != nil { |
| 2249 | t.Fatalf("env.Program() failed: %v", err) |
| 2250 | } |
| 2251 | vars, _ := PartialVars(map[string]any{ |
| 2252 | "x": map[string]any{ |
| 2253 | "zero": 0, |
| 2254 | "abc": 123, |
| 2255 | "string": "abc", |
| 2256 | }, |
| 2257 | "y": []int{123}, |
| 2258 | }, AttributePattern("u")) |
| 2259 | out, det, err := prg.ContextEval(context.TODO(), vars) |
| 2260 | if !types.IsUnknown(out) { |
| 2261 | t.Fatalf("got %v, expected unknown", out) |
| 2262 | } |
| 2263 | if err != nil { |
| 2264 | t.Fatal(err) |
| 2265 | } |
| 2266 | residual, err := env.ResidualAst(ast, det) |
| 2267 | if err != nil { |
| 2268 | t.Fatal(err) |
| 2269 | } |
| 2270 | expr, err := AstToString(residual) |
| 2271 | if err != nil { |
| 2272 | t.Fatal(err) |
| 2273 | } |
| 2274 | const want = "123 == u && 123 == u && 123 == u && 123 == u && 123 == u && 123 == u && 123 == u" |
| 2275 | if expr != want { |
| 2276 | t.Errorf("got expr: %s, wanted %s", expr, want) |
| 2277 | } |
| 2278 | } |
| 2279 | |
| 2280 | func TestPartialVarsEnv(t *testing.T) { |
| 2281 | env := testEnv(t, |
nothing calls this directly
no test coverage detected