(t *testing.T)
| 226 | } |
| 227 | |
| 228 | func TestExceedsDepth(t *testing.T) { |
| 229 | // Depths below reflect NavigableExpr.Depth() of each expression's deepest node, matching the |
| 230 | // maxDepth column of TestNavigateAST. ExceedsDepth reports true once a node reaches maxDepth, |
| 231 | // so an expression of depth D is flagged for every maxDepth <= D. |
| 232 | tests := []struct { |
| 233 | name string |
| 234 | expr string |
| 235 | maxDepth int |
| 236 | want bool |
| 237 | }{ |
| 238 | {name: "shallow below limit", expr: `'a' == 'b'`, maxDepth: 2, want: false}, // depth 1 |
| 239 | {name: "shallow at limit", expr: `'a' == 'b'`, maxDepth: 1, want: true}, // depth 1 |
| 240 | {name: "medium below limit", expr: `[1, 2, 3][0]`, maxDepth: 3, want: false}, // depth 2 |
| 241 | {name: "medium at limit", expr: `[1, 2, 3][0]`, maxDepth: 2, want: true}, // depth 2 |
| 242 | {name: "medium under limit", expr: `[1, 2, 3][0]`, maxDepth: 1, want: true}, // depth 2 |
| 243 | {name: "deep under default", expr: `[true].exists(i, i)`, maxDepth: 250, want: false}, // depth 3 |
| 244 | {name: "deep at limit", expr: `[true].exists(i, i)`, maxDepth: 3, want: true}, // depth 3 |
| 245 | {name: "deep one above limit", expr: `[true].exists(i, i)`, maxDepth: 4, want: false}, // depth 3 |
| 246 | {name: "disabled with zero", expr: `[true].exists(i, i)`, maxDepth: 0, want: false}, |
| 247 | {name: "disabled with negative", expr: `[true].exists(i, i)`, maxDepth: -1, want: false}, |
| 248 | } |
| 249 | for _, tst := range tests { |
| 250 | tc := tst |
| 251 | t.Run(tc.name, func(t *testing.T) { |
| 252 | checked := mustTypeCheck(t, tc.expr) |
| 253 | if got := ast.ExceedsDepth(checked, tc.maxDepth); got != tc.want { |
| 254 | t.Errorf("ExceedsDepth(%q, %d) = %v, wanted %v", tc.expr, tc.maxDepth, got, tc.want) |
| 255 | } |
| 256 | }) |
| 257 | } |
| 258 | } |
| 259 | |
| 260 | func TestExceedsDepthNilSafety(t *testing.T) { |
| 261 | if ast.ExceedsDepth(nil, 250) { |
nothing calls this directly
no test coverage detected