summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-08-09 09:43:51 -0300
committerGabriel Schneider <[email protected]>2026-08-10 09:17:07 -0300
commit218d8577cbffb45a6ee80cea52418864a044e452 (patch)
treeb0b31c1e8091d6dea6fb767883e8c78e48cc385e /test
parent599dd82f96b9d091aae78300aa6c3fbc81f9eb69 (diff)
downloadpardes-218d8577cbffb45a6ee80cea52418864a044e452.tar.gz
pardes-218d8577cbffb45a6ee80cea52418864a044e452.zip
lsp rows: paths relative to the asking file, and the completion text
Diffstat (limited to 'test')
-rw-r--r--test/lspbench.zig6
-rw-r--r--test/snapshots/lsp.golden18
-rw-r--r--test/snapshots/lspcomplete.golden20
-rw-r--r--test/snapshots/lsprelpath.golden245
-rw-r--r--test/snapshots/lsprelpath.snap87
5 files changed, 355 insertions, 21 deletions
diff --git a/test/lspbench.zig b/test/lspbench.zig
index b294e60c..329e5743 100644
--- a/test/lspbench.zig
+++ b/test/lspbench.zig
@@ -108,8 +108,10 @@ const anchors = [_]Anchor{
// keypress looks like: the file does not parse and the switch is not in
// the tree at all. `verdigris` appears only on the enum member's own
// line, so a row carrying it came from the DEFINITION and not from the
- // line the cursor sits on.
- .{ .file = "test/lspfixture/dotcomplete.zig", .needle = "return switch (s) {\n .", .at = 29, .kind = .completion, .expect = "verdigris" },
+ // line the cursor sits on — and it has to appear TWICE, because a
+ // completion row carries the candidate's own name (the word that would go
+ // after the dot) before the declaration line it was read off.
+ .{ .file = "test/lspfixture/dotcomplete.zig", .needle = "return switch (s) {\n .", .at = 29, .kind = .completion, .expect = "verdigris verdigris," },
// ...and the same dot on a line that is ALSO missing its terminator,
// which is one parse error repaired or not. This is the probe that
// catches a repair chosen by error count rather than by whether the dot
diff --git a/test/snapshots/lsp.golden b/test/snapshots/lsp.golden
index 48577a7f..759e6cad 100644
--- a/test/snapshots/lsp.golden
+++ b/test/snapshots/lsp.golden
@@ -197,9 +197,9 @@
|
|
| /tmp/pardes-snap/lsp/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lsp/cwd/a.zig:1:7-9 std
-| 2 /tmp/pardes-snap/lsp/cwd/a.zig:3:4-9 helper fn helper(x: u32) u32
-| 3 /tmp/pardes-snap/lsp/cwd/a.zig:7:8-11 main fn main() void
+| 1 a.zig:1:7-9 std
+| 2 a.zig:3:4-9 helper fn helper(x: u32) u32
+| 3 a.zig:7:8-11 main fn main() void
| /tmp/pardes-snap/lsp/cwd/+Hover New Del
| 1 fn helper(x: u32) u32
| 2 (fn (u32) u32)
@@ -238,9 +238,9 @@
|
|
| /tmp/pardes-snap/lsp/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lsp/cwd/a.zig:1:7-9 std
-| 2 /tmp/pardes-snap/lsp/cwd/a.zig:3:4-9 helper fn helper(x: u32) u32
-| 3 /tmp/pardes-snap/lsp/cwd/a.zig:7:8-11 main fn main() void
+| 1 a.zig:1:7-9 std
+| 2 a.zig:3:4-9 helper fn helper(x: u32) u32
+| 3 a.zig:7:8-11 main fn main() void
| /tmp/pardes-snap/lsp/cwd/+Hover New Del
| 1 fn helper(x: u32) u32
| 2 (fn (u32) u32)
@@ -279,9 +279,9 @@
|
|
| /tmp/pardes-snap/lsp/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lsp/cwd/a.zig:1:7-9 std
-| 2 /tmp/pardes-snap/lsp/cwd/a.zig:3:4-9 helper fn helper(x: u32) u32
-| 3 /tmp/pardes-snap/lsp/cwd/a.zig:7:8-11 main fn main() void
+| 1 a.zig:1:7-9 std
+| 2 a.zig:3:4-9 helper fn helper(x: u32) u32
+| 3 a.zig:7:8-11 main fn main() void
| /tmp/pardes-snap/lsp/cwd/+Hover New Del
| 1 fn helper(x: u32) u32
| 2 (fn (u32) u32)
diff --git a/test/snapshots/lspcomplete.golden b/test/snapshots/lspcomplete.golden
index 51c11c66..8a76f824 100644
--- a/test/snapshots/lspcomplete.golden
+++ b/test/snapshots/lspcomplete.golden
@@ -201,8 +201,8 @@
|
|
| /tmp/pardes-snap/lspcomplete/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lspcomplete/cwd/a.zig:2:5-13 verdigris,
-| 2 /tmp/pardes-snap/lspcomplete/cwd/a.zig:3:5-12 cinnabar,
+| 1 a.zig:2:5-13 verdigris verdigris,
+| 2 a.zig:3:5-12 cinnabar cinnabar,
== snap refill grid=120x40 cursor=16,9
|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
|^ /tmp/pardes-snap/lspcomplete/cwd/a.zig Save New Del
@@ -242,8 +242,8 @@
|
|
| /tmp/pardes-snap/lspcomplete/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lspcomplete/cwd/a.zig:2:5-13 verdigris,
-| 2 /tmp/pardes-snap/lspcomplete/cwd/a.zig:3:5-12 cinnabar,
+| 1 a.zig:2:5-13 verdigris verdigris,
+| 2 a.zig:3:5-12 cinnabar cinnabar,
== snap step grid=120x40 cursor=19,3
|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
| /tmp/pardes-snap/lspcomplete/cwd/a.zig Save New Del
@@ -283,8 +283,8 @@
|
|
| /tmp/pardes-snap/lspcomplete/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lspcomplete/cwd/a.zig:2:5-13 verdigris,
-| 2 /tmp/pardes-snap/lspcomplete/cwd/a.zig:3:5-12 cinnabar,
+| 1 a.zig:2:5-13 verdigris verdigris,
+| 2 a.zig:3:5-12 cinnabar cinnabar,
== snap txtindent grid=120x40 cursor=15,2
|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
|^ /tmp/pardes-snap/lspcomplete/cwd/notes.txt Save New Del
@@ -343,8 +343,8 @@
|
|
| /tmp/pardes-snap/lspcomplete/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lspcomplete/cwd/c.zig:2:5-13 verdigris,
-| 2 /tmp/pardes-snap/lspcomplete/cwd/c.zig:3:5-12 cinnabar,
+| 1 c.zig:2:5-13 verdigris verdigris,
+| 2 c.zig:3:5-12 cinnabar cinnabar,
== snap nobrace grid=100x18 cursor=16,9
|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
|^ /tmp/pardes-snap/lspcomplete/cwd/d.zig Save New Del
@@ -362,5 +362,5 @@
|
|
| /tmp/pardes-snap/lspcomplete/cwd/+Search New Del
-| 1 /tmp/pardes-snap/lspcomplete/cwd/d.zig:2:5-13 verdigris,
-| 2 /tmp/pardes-snap/lspcomplete/cwd/d.zig:3:5-12 cinnabar,
+| 1 d.zig:2:5-13 verdigris verdigris,
+| 2 d.zig:3:5-12 cinnabar cinnabar,
diff --git a/test/snapshots/lsprelpath.golden b/test/snapshots/lsprelpath.golden
new file mode 100644
index 00000000..885860b3
--- /dev/null
+++ b/test/snapshots/lsprelpath.golden
@@ -0,0 +1,245 @@
+== snap absrow grid=100x34 cursor=16,6
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+|^ /tmp/pardes-snap/lsprelpath/cwd/sub/parent.zig Save New Del
+| 1 const shade = @import("../shade.zig");
+| 2
+| 3 pub fn pick(s: shade.Shade) u8 {
+| 4 return switch (s) {
+| 5 .
+| 6 };
+| 7 }
+| 8
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/sub/+Search New Del
+| 1 /tmp/pardes-snap/lsprelpath/cwd/shade.zig:2:5-13 verdigris verdigris,
+| 2 /tmp/pardes-snap/lsprelpath/cwd/shade.zig:3:5-12 cinnabar cinnabar,
+== snap abslook grid=100x34 cursor=16,6
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/lsprelpath/cwd/sub/parent.zig Save New Del
+| 1 const shade = @import("../shade.zig");
+| 2
+| 3 pub fn pick(s: shade.Shade) u8 {
+| 4 return switch (s) {
+| 5 .
+| 6 };
+| 7 }
+| 8
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/shade.zig Save New Del
+| 1 pub const Shade = enum {
+| 2 verdigris,
+| 3 cinnabar,
+| 4 };
+| 5
+|
+|
+|
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/sub/+Search New Del
+| 1 /tmp/pardes-snap/lsprelpath/cwd/shade.zig:2:5-13 verdigris verdigris,
+| 2 /tmp/pardes-snap/lsprelpath/cwd/shade.zig:3:5-12 cinnabar cinnabar,
+== style abslook
+|0: 0-56 #949494,#121212, 57-99 d,#121212,
+|1: 0-1 #ffffff,#626262, 2-79 #949494,#121212, 80-99 d,#121212,
+|2: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-20 #bdbdbd,#080808, 21-27 #cf87e8,#080808,b 28-28 #bdbdbd,#080808, 29-42 #e3c78a,#080808, 43-44 #bdbdbd,#080808, 45-99 d,#080808,
+|3: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|4: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-12 #cf87e8,#080808,b 13-38 #bdbdbd,#080808, 39-99 d,#080808,
+|5: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-16 #cf87e8,#080808,b 17-17 #bdbdbd,#080808, 18-23 #cf87e8,#080808,b 24-29 #bdbdbd,#080808, 30-99 d,#080808,
+|6: 0-0 d,#444444, 1-1 d,#080808, 2-6 #949494,#121212, 7-15 #bdbdbd,#080808, 16-99 d,#080808,
+|7: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-99 d,#080808,
+|8: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #bdbdbd,#080808, 8-99 d,#080808,
+|9: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|10: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|11: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|12: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|13: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|14: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|15: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|16: 0-1 #ffffff,#262626, 2-79 #949494,#121212, 80-99 d,#121212,
+|17: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-24 #bdbdbd,#080808, 25-28 #cf87e8,#080808,b 29-30 #bdbdbd,#080808, 31-99 d,#080808,
+|18: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-19 #080808,#80a0ff, 20-20 #bdbdbd,#080808, 21-99 d,#080808,
+|19: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-19 #bdbdbd,#080808, 20-99 d,#080808,
+|20: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-8 #bdbdbd,#080808, 9-99 d,#080808,
+|21: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|22: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|23: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|24: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|25: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|26: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|27: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|28: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|29: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|30: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|31: 0-1 #ffffff,#262626, 2-79 #949494,#121212, 80-99 d,#121212,
+|32: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 #080808,#80a0ff,
+|33: 0-0 d,#121212, 1-1 d,#080808, 2-6 #626262,#080808, 7-74 #bdbdbd,#080808, 75-99 d,#080808,
+== snap subrow grid=100x34 cursor=16,6
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+|^ /tmp/pardes-snap/lsprelpath/cwd/sub/subdir.zig Save New Del
+| 1 const tint = @import("inner/tint.zig");
+| 2
+| 3 pub fn hue(t: tint.Tint) u8 {
+| 4 return switch (t) {
+| 5 .
+| 6 };
+| 7 }
+| 8
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/sub/+Search New Del
+| 1 inner/tint.zig:2:5-9 ochre ochre,
+| 2 inner/tint.zig:3:5-10 indigo indigo,
+== snap sublook grid=100x34 cursor=16,6
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/lsprelpath/cwd/sub/subdir.zig Save New Del
+| 1 const tint = @import("inner/tint.zig");
+| 2
+| 3 pub fn hue(t: tint.Tint) u8 {
+| 4 return switch (t) {
+| 5 .
+| 6 };
+| 7 }
+| 8
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/sub/inner/tint.zig Save New Del
+| 1 pub const Tint = enum {
+| 2 ochre,
+| 3 indigo,
+| 4 };
+| 5
+|
+|
+|
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/sub/+Search New Del
+| 1 inner/tint.zig:2:5-9 ochre ochre,
+| 2 inner/tint.zig:3:5-10 indigo indigo,
+== style sublook
+|0: 0-56 #949494,#121212, 57-99 d,#121212,
+|1: 0-1 #ffffff,#626262, 2-79 #949494,#121212, 80-99 d,#121212,
+|2: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-19 #bdbdbd,#080808, 20-26 #cf87e8,#080808,b 27-27 #bdbdbd,#080808, 28-43 #e3c78a,#080808, 44-45 #bdbdbd,#080808, 46-99 d,#080808,
+|3: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|4: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-12 #cf87e8,#080808,b 13-35 #bdbdbd,#080808, 36-99 d,#080808,
+|5: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-16 #cf87e8,#080808,b 17-17 #bdbdbd,#080808, 18-23 #cf87e8,#080808,b 24-29 #bdbdbd,#080808, 30-99 d,#080808,
+|6: 0-0 d,#444444, 1-1 d,#080808, 2-6 #949494,#121212, 7-15 #bdbdbd,#080808, 16-99 d,#080808,
+|7: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-12 #bdbdbd,#080808, 13-99 d,#080808,
+|8: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-7 #bdbdbd,#080808, 8-99 d,#080808,
+|9: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|10: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|11: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|12: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|13: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|14: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|15: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|16: 0-1 #ffffff,#262626, 2-79 #949494,#121212, 80-99 d,#121212,
+|17: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-23 #bdbdbd,#080808, 24-27 #cf87e8,#080808,b 28-29 #bdbdbd,#080808, 30-99 d,#080808,
+|18: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-10 #bdbdbd,#080808, 11-15 #080808,#80a0ff, 16-16 #bdbdbd,#080808, 17-99 d,#080808,
+|19: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-17 #bdbdbd,#080808, 18-99 d,#080808,
+|20: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-8 #bdbdbd,#080808, 9-99 d,#080808,
+|21: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|22: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|23: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|24: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|25: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|26: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|27: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|28: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|29: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|30: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 d,#080808,
+|31: 0-1 #ffffff,#262626, 2-79 #949494,#121212, 80-99 d,#121212,
+|32: 0-0 d,#444444, 1-1 d,#080808, 2-6 #626262,#080808, 7-99 #080808,#80a0ff,
+|33: 0-0 d,#121212, 1-1 d,#080808, 2-6 #626262,#080808, 7-43 #bdbdbd,#080808, 44-99 d,#080808,
+== snap clicked grid=100x34 cursor=16,19
+|New Newcol Find Grep Help Tutor Dump NextColor Debug Kill
+| /tmp/pardes-snap/lsprelpath/cwd/sub/subdir.zig Save New Del
+| 1 const tint = @import("inner/tint.zig");
+| 2
+| 3 pub fn hue(t: tint.Tint) u8 {
+| 4 return switch (t) {
+| 5 .
+| 6 };
+| 7 }
+| 8
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/sub/inner/tint.zig Save New Del
+| 1 pub const Tint = enum {
+| 2 ochre,
+| 3 indigo,
+| 4 };
+| 5
+|
+|
+|
+|
+|
+|
+|
+|
+|
+| /tmp/pardes-snap/lsprelpath/cwd/sub/+Search New Del
+| 1 inner/tint.zig:2:5-9 ochre ochre,
+| 2 inner/tint.zig:3:5-10 indigo indigo,
diff --git a/test/snapshots/lsprelpath.snap b/test/snapshots/lsprelpath.snap
new file mode 100644
index 00000000..dce26d1e
--- /dev/null
+++ b/test/snapshots/lsprelpath.snap
@@ -0,0 +1,87 @@
+# What a language row SPELLS its path as, and that both spellings still LOOK.
+#
+# A row is written relative to the directory of the file the query was asked
+# about (lsp.rel, fed from Req.root) when the answer lives UNDER that directory,
+# and keeps its full absolute path when it does not — a `gr` list was otherwise
+# the same forty-character prefix repeated down the pane with the part you came
+# to read pushed off the right edge, and a path outside the tree has nothing
+# short to be called.
+#
+# lspcomplete.snap already covers the easy middle case, a candidate in the SAME
+# directory, which shortens to a bare basename. The two that a prefix strip can
+# actually get wrong are here, one app each:
+#
+# PARENT the enum is one level UP from the asking file, so nothing is
+# stripped and the row carries `/tmp/.../cwd/shade.zig`. This is
+# the case that must NOT become `../shade.zig`.
+# SUBDIRECTORY the enum is one level DOWN, so the strip leaves a path with a
+# separator still in it — `inner/tint.zig`, not `tint.zig`. A
+# strip that took the basename instead would produce a row that
+# resolves to nothing.
+#
+# `n` is the assertion in both, not the row text: it looks row 1 and the right
+# file opens with the member SELECTED on its own line. The style capture is
+# where that selection shows, because focus goes back to the pane that asked,
+# so the opened pane's cursor is not in the snap header.
+dirmk sub
+dirmk sub/inner
+file shade.zig pub const Shade = enum {\n verdigris,\n cinnabar,\n};\n
+file sub/inner/tint.zig pub const Tint = enum {\n ochre,\n indigo,\n};\n
+file sub/parent.zig const shade = @import("../shade.zig");\n\npub fn pick(s: shade.Shade) u8 {\n return switch (s) {\n \n };\n}\n
+file sub/subdir.zig const tint = @import("inner/tint.zig");\n\npub fn hue(t: tint.Tint) u8 {\n return switch (t) {\n \n };\n}\n
+# ---- PARENT: outside the asking file's tree, so the row stays absolute ----
+start 34 100 sub/parent.zig
+wait 8000 fn pick
+stable 700 20000
+# file line 5 (grid row 6, 1-based click row 7) is the switch's empty body
+press left 8 7
+release left 8 7
+stable 400 5000
+key i
+key end
+text .
+stable 400 5000
+key tab
+wait 15000 cwd/shade.zig:2:
+stable 700 15000
+snap absrow
+key esc
+settle 100
+# An absolute row has to keep resolving — it is the spelling every row had
+# before this, and the one every hit outside the tree still has.
+key n
+stable 700 15000
+snap abslook
+snapstyle abslook
+# ---- SUBDIRECTORY: under it, so the strip leaves `inner/tint.zig` ----
+start 34 100 sub/subdir.zig
+wait 8000 fn hue
+stable 700 20000
+press left 8 7
+release left 8 7
+stable 400 5000
+key i
+key end
+text .
+stable 400 5000
+key tab
+wait 15000 inner/tint.zig:2:
+stable 700 15000
+snap subrow
+key esc
+settle 100
+key n
+stable 700 15000
+snap sublook
+snapstyle sublook
+# The mouse spelling, on the OTHER row (grid row 33, 1-based click row 34). A
+# right click expands to the file-ish word under the cursor
+# (config.wordBounds), which has to take `inner/tint.zig:3:5-10` WHOLE — the
+# separator inside a stripped path is a file char, so the scan runs back over
+# `inner/` and stops on the space of the line-number prefix. A look focuses
+# what it opens, so the header's cursor is the assertion: the end of `indigo`
+# on line 3 of tint.zig.
+press right 12 34
+release right 12 34
+stable 700 15000
+snap clicked