(t *testing.T)
| 2129 | } |
| 2130 | |
| 2131 | func TestResidualAstAttributeQualifiers(t *testing.T) { |
| 2132 | env := testEnv(t, |
| 2133 | Variable("x", MapType(StringType, DynType)), |
| 2134 | Variable("y", ListType(IntType)), |
| 2135 | Variable("u", IntType), |
| 2136 | ) |
| 2137 | 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`) |
| 2138 | if iss.Err() != nil { |
| 2139 | t.Fatalf("env.Parse() failed: %v", iss.Err()) |
| 2140 | } |
| 2141 | prg, err := env.Program(ast, |
| 2142 | EvalOptions(OptTrackState, OptPartialEval), |
| 2143 | ) |
| 2144 | if err != nil { |
| 2145 | t.Fatalf("env.Program() failed: %v", err) |
| 2146 | } |
| 2147 | vars, _ := PartialVars(map[string]any{ |
| 2148 | "x": map[string]any{ |
| 2149 | "zero": 0, |
| 2150 | "abc": 123, |
| 2151 | "string": "abc", |
| 2152 | }, |
| 2153 | "y": []int{123}, |
| 2154 | }, AttributePattern("u")) |
| 2155 | out, det, err := prg.ContextEval(context.TODO(), vars) |
| 2156 | if !types.IsUnknown(out) { |
| 2157 | t.Fatalf("got %v, expected unknown", out) |
| 2158 | } |
| 2159 | if err != nil { |
| 2160 | t.Fatal(err) |
| 2161 | } |
| 2162 | residual, err := env.ResidualAst(ast, det) |
| 2163 | if err != nil { |
| 2164 | t.Fatal(err) |
| 2165 | } |
| 2166 | expr, err := AstToString(residual) |
| 2167 | if err != nil { |
| 2168 | t.Fatal(err) |
| 2169 | } |
| 2170 | const want = "123 == u && 123 == u && 123 == u && 123 == u && 123 == u && 123 == u && 123 == u" |
| 2171 | if expr != want { |
| 2172 | t.Errorf("got expr: %s, wanted %s", expr, want) |
| 2173 | } |
| 2174 | } |
| 2175 | |
| 2176 | func TestPartialVarsEnv(t *testing.T) { |
| 2177 | env := testEnv(t, |
nothing calls this directly
no test coverage detected