summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-28 18:53:37 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:15 -0300
commitb8c5e8772e646fa21f6afdd2a875a1bd52848bd5 (patch)
tree70bca3d554501c49107b27396c7756e0e8ad62a3 /test
parentc4ab29bce30f427decf3e199eebecfd415714a96 (diff)
downloadpardes-b8c5e8772e646fa21f6afdd2a875a1bd52848bd5.tar.gz
pardes-b8c5e8772e646fa21f6afdd2a875a1bd52848bd5.zip
A column can be empty, as acme's can; new panes go where acme's makenewwindow puts them
Newcol makes an empty column; closing a column's last pane leaves it empty with the keyboard on its tag; Delcol and Joincol alone take a column away; the session's last pane closing quits. The +New stand-in and replaceStillborn / stillborn_joiner are gone. Every new pane goes through exec.placeNew, which follows acme's makenewwindow (active column, empty column whole, blank space, halving the biggest) or, with Placement pardes, the old rules. ColumnTags is gone: column tags are always shown. A grip drag shows acme's box cursor. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'test')
-rw-r--r--test/appearance_gallery.py4
-rw-r--r--test/column_drag.zig5
-rw-r--r--test/column_tags.py5
-rw-r--r--test/gui-goldens.txt13
-rw-r--r--test/gui_golden.py5
-rw-r--r--test/panes.zig1
-rw-r--r--test/pdf.zig2
-rw-r--r--test/snapshots/argv.snap2
-rw-r--r--test/snapshots/builtins.snap2
-rw-r--r--test/snapshots/chordcut.snap2
-rw-r--r--test/snapshots/cmdword.snap2
-rw-r--r--test/snapshots/delask.snap2
-rw-r--r--test/snapshots/doccol.snap2
-rw-r--r--test/snapshots/emptycol.golden14
-rw-r--r--test/snapshots/emptycol.snap22
-rw-r--r--test/snapshots/filewatch.snap2
-rw-r--r--test/snapshots/find.snap2
-rw-r--r--test/snapshots/fsearch.snap2
-rw-r--r--test/snapshots/grep.snap2
-rw-r--r--test/snapshots/jumps.snap2
-rw-r--r--test/snapshots/layout-close.golden5
-rw-r--r--test/snapshots/layout-close.snap8
-rw-r--r--test/snapshots/layout-open.snap2
-rw-r--r--test/snapshots/leader.snap2
-rw-r--r--test/snapshots/lookpanes.snap2
-rw-r--r--test/snapshots/lookrange.snap2
-rw-r--r--test/snapshots/lsp-client.snap2
-rw-r--r--test/snapshots/lsp.snap2
-rw-r--r--test/snapshots/lspcomplete.snap2
-rw-r--r--test/snapshots/lsprelpath.snap2
-rw-r--r--test/snapshots/mini.snap2
-rw-r--r--test/snapshots/nested.snap2
-rw-r--r--test/snapshots/psearch.snap2
-rw-r--r--test/snapshots/reflow.snap2
-rw-r--r--test/snapshots/rsearch.snap2
-rw-r--r--test/snapshots/savepane.snap2
-rw-r--r--test/snapshots/scrolloff.snap2
-rw-r--r--test/snapshots/splitparent.snap2
-rw-r--r--test/snapshots/stepgrain.snap2
-rw-r--r--test/snapshots/tagalign.snap2
-rw-r--r--test/snapshots/tagalign2col.snap2
-rw-r--r--test/snapshots/tagbottom.snap2
-rw-r--r--test/snapshots/tagnav.snap2
-rw-r--r--test/snapshots/themesel.snap2
-rw-r--r--test/snapshots/tinywin.snap2
-rw-r--r--test/snapshots/topbarexec.snap2
-rw-r--r--test/snapshots/ttyhelp.snap2
-rw-r--r--test/snapshots/ttylook.snap2
-rw-r--r--test/snapshots/ttyonly.snap2
-rw-r--r--test/snapshots/ttytaken.snap2
-rw-r--r--test/snapshots/windownav.snap2
51 files changed, 138 insertions, 26 deletions
diff --git a/test/appearance_gallery.py b/test/appearance_gallery.py
index 48c0ea1b..bc9a7570 100644
--- a/test/appearance_gallery.py
+++ b/test/appearance_gallery.py
@@ -78,8 +78,8 @@ def run(args):
launch=launch, inherited=inherited, terminal=handles) as (client, _):
source = next(serial for serial, tag in panes(client).items() if str(source_path) in tag)
before = set(panes(client))
- command(client, source, 'Newcol')
- right = require(wait_for(lambda: next((s for s in panes(client) if s not in before), None)), 'right column missing')
+ command(client, source, 'Newcol') # empty, its tag with the keyboard
+ right = int(client.read('/pane/new'))
client.write(f'/pane/{right}/name', f'{root / "Review"}\n'.encode())
client.write(f'/pane/{right}/body', PREFERENCE_NOTES if args.theme_selector else NOTES, truncate=True)
client.write(f'/pane/{right}/dirty', b'0\n')
diff --git a/test/column_drag.zig b/test/column_drag.zig
index 3aea4286..89508800 100644
--- a/test/column_drag.zig
+++ b/test/column_drag.zig
@@ -46,7 +46,6 @@ test "column grip drag moves only its interval and keeps tag caret with the colu
defer p.deinit();
_ = try p.setTestFile("body\n");
p.presentation.enabled = false;
- p.settings.column_tags = true;
p.row_metrics = .{ .body_w = 10, .body_h = 20, .tagline_w = 5, .tagline_h = 10 };
for (0..3) |_| {
try std.testing.expect(p.executeBuiltinLine(p.active, "New"));
@@ -127,7 +126,6 @@ test "column grip is separate from compact text and the resize seam" {
defer p.deinit();
_ = try p.setTestFile("body\n");
p.presentation.enabled = false;
- p.settings.column_tags = true;
p.row_metrics = .{ .body_w = 10, .body_h = 20, .tagline_w = 5, .tagline_h = 10 };
try std.testing.expect(p.executeBuiltinLine(0, "New"));
try std.testing.expect(layout.splitColumn(p, p.active, p.active, false));
@@ -181,7 +179,6 @@ test "column grips stay blank, and muted across focus and hover until grabbed" {
defer p.deinit();
_ = try p.setTestFile("left\n");
p.presentation.enabled = false;
- p.settings.column_tags = true;
p.row_metrics = .{ .body_w = 10, .body_h = 20, .tagline_w = 5, .tagline_h = 10 };
try std.testing.expect(p.executeBuiltinLine(0, "New"));
try std.testing.expect(layout.splitColumn(p, p.active, p.active, false));
@@ -219,7 +216,6 @@ test "column grip dropped in its own place moves the column's left edge" {
defer p.deinit();
_ = try p.setTestFile("body\n");
p.presentation.enabled = false;
- p.settings.column_tags = true;
try std.testing.expect(p.executeBuiltinLine(0, "New"));
try std.testing.expect(layout.splitColumn(p, p.active, p.active, false));
p.update(.tick);
@@ -284,7 +280,6 @@ test "column grip drag previews where the column lands, in the seam beside its r
defer p.deinit();
_ = try p.setTestFile("body\n");
p.presentation.enabled = false;
- p.settings.column_tags = true;
for (0..2) |_| {
try std.testing.expect(p.executeBuiltinLine(p.active, "New"));
try std.testing.expect(layout.splitColumn(p, p.active, p.active, false));
diff --git a/test/column_tags.py b/test/column_tags.py
index fe3a8699..ba638b7d 100644
--- a/test/column_tags.py
+++ b/test/column_tags.py
@@ -138,7 +138,10 @@ def run(args):
before = panes(client)
keys.click(*require(locate(client, 'Newcol', row=0), 'Newcol missing'), button=1)
- right = require(wait_for(lambda: new_serial(client, before)), 'Newcol did not create its pane')
+ # Newcol makes an empty column and gives its tag the keyboard; the
+ # pane made next fills it.
+ require(wait_for(lambda: client.read('/focus').strip() == b''), 'Newcol did not focus its empty column')
+ right = int(client.read('/pane/new'))
right_name = root / 'right.rs'
client.write(f'/pane/{right}/name', f'{right_name}\n'.encode())
right_body = b'// Column-local scratch\nfn main() {\n let ready = true;\n}\n'
diff --git a/test/gui-goldens.txt b/test/gui-goldens.txt
index 38ca89e5..8e859fdc 100644
--- a/test/gui-goldens.txt
+++ b/test/gui-goldens.txt
@@ -8,11 +8,10 @@
08-wide-glyph-edges 123a182b82a2a8c455291a5c89ccfa28e1f8ce9566172ca404c0b9c71dd33b48
09-collapsed-focus-tint ae66076fdfb0cab9a906b052df257deee5ba91a6274712d52a76d8a7adc5b415
10-tagbottom dd8ba0d3ecabf3420d000b0c9591a57278179cbd2a9060f849d283f3881d1847
-11-column-tags 6b1731d1611404597c96ad77f34c2d5cd5a81c1085ec68c6779388e07ce28614
-12-multiline-tag 1b9ccd331814dc76111470f18448b1ca192e1edc3d79ea6eee19a6a78a4b1831
-13-image a52e2cf9f238447d885692cba01e68ef7fdc6ae3fc7c8fe1e95c8463c85f519c
-14-theme-ink cc2ea256ddda24e1c97871f75b71ddf62fa825bd02f5d1432592d05e478c707a
-15-theme-acme-light 2bde8a2bdfada7f061217f52cb2272913fc0657dbfa1d7448e1852f321f8e3bf
+12-multiline-tag 0edffadbabef48e5a7422ef8433ccf2552b9c812a352e30b32bb000aacad607d
+13-image 91f9363493c9c1b9618426ef7362da469f5b051890a3128ef8c94cee6ae2bb06
+14-theme-ink 84440553176db695a9a8a82714e858c815ea31cd82a29760c4894b4675c3a2ed
+15-theme-acme-light cd216282f477512284372f330709d0cde93d1f2fb6d9c4616ebb642f3ef5c129
16-debug 129ad6f5f85b0e60e81bc6e8e78434629ee751f49731cf2eb28fd0553efd914a
-17-terminal 45a3d9f823ccf28a336ef6687c9c210f9fb05cc426c0fdee98bb0ebb2a957d42
-18-mid-transition 79f90fb247f75ab284fca147028ee18ea78e77a02a57203699fb423f4bcc02fb
+17-terminal d958ca0182ddf360abd266e29c3934c6e251ed25f258f687597372369899eaea
+18-mid-transition a35f460c8637c2183f37b3a5ac2e7bd34bdde708a52fa0f8dcdbf937627b125f
diff --git a/test/gui_golden.py b/test/gui_golden.py
index d97009c9..407b19cd 100644
--- a/test/gui_golden.py
+++ b/test/gui_golden.py
@@ -91,7 +91,7 @@ def run(args):
config.mkdir(parents=True)
# No linger: a dismissed message is gone, not caught part way, when a
# scene settles.
- (config / 'init').write_text('Shell /bin/sh\nTheme forge\nMessageLinger 0\n')
+ (config / 'init').write_text('Shell /bin/sh\nTheme forge\nMessageLinger 0\nPlacement pardes\n')
source = root / 'shapes.zig'
source.write_bytes(ZIG)
notes = root / 'notes.txt'
@@ -177,9 +177,6 @@ def run(args):
client.write('/ctl', b'Tagbottom\n')
scene('10-tagbottom')
client.write('/ctl', b'Tagbottom\n')
- client.write('/ctl', b'ColumnTags\n')
- scene('11-column-tags')
- client.write('/ctl', b'ColumnTags\n')
client.write(f'/pane/{first}/tag', b' Second\nthird line of the tag')
scene('12-multiline-tag')
client.write(f'/pane/{first}/look', f'{image}\n'.encode())
diff --git a/test/panes.zig b/test/panes.zig
index 40b4b6ba..9802432e 100644
--- a/test/panes.zig
+++ b/test/panes.zig
@@ -103,7 +103,6 @@ const TagLayerTests = struct {
defer p.deinit();
_ = try p.setTestFile("body\n");
p.presentation.enabled = false;
- p.settings.column_tags = true;
p.row_metrics = .{ .body_w = 10, .body_h = 20, .tagline_w = 5, .tagline_h = 10 };
try std.testing.expect(p.executeBuiltinLine(0, "New"));
const second = p.active;
diff --git a/test/pdf.zig b/test/pdf.zig
index 2699fe01..4cb8f3dd 100644
--- a/test/pdf.zig
+++ b/test/pdf.zig
@@ -343,7 +343,7 @@ test "PdfSections Look follows the exact owning PDF, not an equal path" {
const duplicate_id = p.freeSlot() orelse return error.NoDuplicatePdfSlot;
const duplicate = try panes.Pdf.openPane(p, duplicate_id, path, 0);
- pardes.exec.placeDoc(p, 0, duplicate_id, duplicate);
+ pardes.exec.placeNew(p, 0, 0, duplicate_id, .doc);
layout.compute(p);
panes.Pdf.openSections(p, duplicate_id);
const duplicate_output_id = duplicate.search_pane orelse return error.MissingDuplicatePdfSections;
diff --git a/test/snapshots/argv.snap b/test/snapshots/argv.snap
index 892f6b24..0d4c8f64 100644
--- a/test/snapshots/argv.snap
+++ b/test/snapshots/argv.snap
@@ -4,6 +4,8 @@
# argument becomes the cwd the shell spawns in
lines notes.txt 8
file zmarker.txt x
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100
wait 8000 $
stable 700 20000
diff --git a/test/snapshots/builtins.snap b/test/snapshots/builtins.snap
index 8bf70f36..7810ebda 100644
--- a/test/snapshots/builtins.snap
+++ b/test/snapshots/builtins.snap
@@ -1,4 +1,6 @@
lines notes.txt 6
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 67 120 notes.txt
wait 8000 notes.txt
stable 700 20000
diff --git a/test/snapshots/chordcut.snap b/test/snapshots/chordcut.snap
index 56170cce..01fee1f7 100644
--- a/test/snapshots/chordcut.snap
+++ b/test/snapshots/chordcut.snap
@@ -11,6 +11,8 @@ lines g.txt 2
# unrelated right column untouched. Give the caller enough cells that the selected
# `echo B''OO g.txt` remains one displayed row; this test is about chords, not
# soft-wrap traversal.
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 120 -n 3
wait 8000 f.txt
stable 700 20000
diff --git a/test/snapshots/cmdword.snap b/test/snapshots/cmdword.snap
index 631fab8b..438d3ed5 100644
--- a/test/snapshots/cmdword.snap
+++ b/test/snapshots/cmdword.snap
@@ -23,6 +23,8 @@ file zzmark.txt x
# the top of the body -- which would move every row this script clicks. The
# verbs are what is under test here, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 120 cmds.txt
wait 8000 Newcol Joincol
wait 8000 cmds.txt
diff --git a/test/snapshots/delask.snap b/test/snapshots/delask.snap
index 04bc850c..05f4b204 100644
--- a/test/snapshots/delask.snap
+++ b/test/snapshots/delask.snap
@@ -2,6 +2,8 @@
# pane's notice band, which one takes its rows: k above, j below, anything else
# keeps the pane. A click, and DelAbove/DelBelow (Del k / Del j), never ask.
file top.txt top-marker
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 36 100 top.txt
wait 8000 top-marker
stable 700 20000
diff --git a/test/snapshots/doccol.snap b/test/snapshots/doccol.snap
index 2135c533..7855453c 100644
--- a/test/snapshots/doccol.snap
+++ b/test/snapshots/doccol.snap
@@ -17,6 +17,8 @@ file c.txt CCC
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 a.txt
wait 8000 AAA
stable 700 20000
diff --git a/test/snapshots/emptycol.golden b/test/snapshots/emptycol.golden
new file mode 100644
index 00000000..bb41c028
--- /dev/null
+++ b/test/snapshots/emptycol.golden
@@ -0,0 +1,14 @@
+== snap newcol grid=100x24 cursor=53,1
+|Newcol Joincol Find Grep Help Changelog Tutor Dump NextColor Debug Exit
+| New Tty Find Grep Joincol Delcol New Tty Find Grep Joincol Delcol
+| /tmp/pardes-snap/emptycol/cwd/notes.txt Save Tt
+| 1 one
+| 2 two
+== snap filled grid=100x24 cursor=54,5
+|2: /tmp/pardes-snap/emptycol/cwd/notes.txt Save Tt /tmp/pardes-snap/emptycol/cwd Tty+bash Save Mod
+|3: 1 one ls
+|4: 2 two notes.txt
+== snap emptied grid=100x24 cursor=53,1
+|2: /tmp/pardes-snap/emptycol/cwd/notes.txt Save Tt
+|3: 1 one
+|4: 2 two
diff --git a/test/snapshots/emptycol.snap b/test/snapshots/emptycol.snap
new file mode 100644
index 00000000..edf61eed
--- /dev/null
+++ b/test/snapshots/emptycol.snap
@@ -0,0 +1,22 @@
+# A column can hold no pane, as acme's can (cols.c:186). Newcol makes one
+# empty, its tag over blank space and holding the keyboard; the next pane
+# made while it is the active column fills it whole (makenewwindow,
+# util.c:468-469); and a shell that exits there leaves it empty again, the
+# keyboard back on its tag.
+file notes.txt one\ntwo
+config Verbose off
+start 24 100 notes.txt
+wait 8000 notes.txt
+stable 700 20000
+key space c n
+stable 400 5000
+snap newcol
+key a-n
+stable 700 15000
+snap filled
+key c-b
+stable 400 5000
+text exit
+key enter
+stable 700 10000
+snap emptied
diff --git a/test/snapshots/filewatch.snap b/test/snapshots/filewatch.snap
index 38b6ac8e..1579ad40 100644
--- a/test/snapshots/filewatch.snap
+++ b/test/snapshots/filewatch.snap
@@ -22,6 +22,8 @@ lines sub/s.txt 8
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 210 -n 1
wait 8000 w.txt
stable 700 20000
diff --git a/test/snapshots/find.snap b/test/snapshots/find.snap
index fe1ecad3..82c68343 100644
--- a/test/snapshots/find.snap
+++ b/test/snapshots/find.snap
@@ -17,6 +17,8 @@ file sub/ZQMARK-beta.txt beta body
file sub/nest/zqmark-gamma.txt gamma body
file other.txt nothing to match here
file .git/zqmark-hidden.txt hidden body
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 41 120 here.txt
wait 8000 here.txt
stable 700 20000
diff --git a/test/snapshots/fsearch.snap b/test/snapshots/fsearch.snap
index b050f1db..aff3e37f 100644
--- a/test/snapshots/fsearch.snap
+++ b/test/snapshots/fsearch.snap
@@ -13,6 +13,8 @@ file g.txt l1\nMARK a\nl3\nl4\nl5\nMARK b\nl7\nl8\nl9\nMARK c\nl11\nl12
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 180 -n 3
wait 8000 g.txt
stable 700 20000
diff --git a/test/snapshots/grep.snap b/test/snapshots/grep.snap
index 07777e67..207aedc6 100644
--- a/test/snapshots/grep.snap
+++ b/test/snapshots/grep.snap
@@ -21,6 +21,8 @@ config Verbose off
# The stacked layout spends two rows on each hit, which puts the third one
# below the fold of this results pane; the claim here is which hits there are.
config LocationsConfig layout:inline
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 180 -n 3
wait 8000 a.txt
stable 700 20000
diff --git a/test/snapshots/jumps.snap b/test/snapshots/jumps.snap
index e4816f88..74dc5fd7 100644
--- a/test/snapshots/jumps.snap
+++ b/test/snapshots/jumps.snap
@@ -10,6 +10,8 @@
# Focus and position both show in the golden's `cursor=` header: that is the
# ACTIVE pane's cursor, so each snap is named by where it should land.
lines big.txt 200
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 150 big.txt
wait 8000 big.txt
stable 700 20000
diff --git a/test/snapshots/layout-close.golden b/test/snapshots/layout-close.golden
index a7d159b5..38985b40 100644
--- a/test/snapshots/layout-close.golden
+++ b/test/snapshots/layout-close.golden
@@ -43,6 +43,7 @@
|10:
|11:
|12:
-== snap colclose grid=140x41 cursor=42,3
-|3: ls 1 ls
+== snap colclose grid=140x41 cursor=38,1
+|2: /tmp/pardes-snap/layout-close/cw /tmp/pardes-snap/layout-close/cwd Tty+bash Save Mode Filter Collaps
+|3: ls ls
|4: marker.txt marker.txt
diff --git a/test/snapshots/layout-close.snap b/test/snapshots/layout-close.snap
index 4ae3e31f..b168eb2b 100644
--- a/test/snapshots/layout-close.snap
+++ b/test/snapshots/layout-close.snap
@@ -1,7 +1,9 @@
# every pane close hands its space to ONE sibling, the rest of the column
# keeps its sizes: Alt-c move-out, tag Del, and shell exit (pty EOF); an
-# emptied column hands its width to one neighbor
+# emptied column stays, as acme's does, its tag over blank space
file marker.txt x
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 41 140 -n 3
wait 8000 marker.txt
stable 700 20000
@@ -49,8 +51,8 @@ text exit
key enter
stable 700 10000
snap exit
-# exit the moved-out pane's shell: its column empties and returns its width to
-# the source column it was carved from; the untouched right column stays put
+# exit the moved-out pane's shell: its column stays where it was, empty, the
+# keyboard on its tag; the other columns keep their widths
press left 40 9
release left 40 9
stable 400 5000
diff --git a/test/snapshots/layout-open.snap b/test/snapshots/layout-open.snap
index 04770f27..c67dcfa5 100644
--- a/test/snapshots/layout-open.snap
+++ b/test/snapshots/layout-open.snap
@@ -5,6 +5,8 @@
# unrelated pane (including the ones above the source) at its exact rectangle.
dirmk sub
file sub/f.txt echo 'TTY'OK
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 -n 3
wait 8000 sub
stable 700 20000
diff --git a/test/snapshots/leader.snap b/test/snapshots/leader.snap
index 78594a47..e8f42331 100644
--- a/test/snapshots/leader.snap
+++ b/test/snapshots/leader.snap
@@ -1,4 +1,6 @@
file cmds.txt Help
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 41 100 cmds.txt
wait 8000 Newcol Joincol
wait 8000 cmds.txt
diff --git a/test/snapshots/lookpanes.snap b/test/snapshots/lookpanes.snap
index 8ada3f1b..296570f7 100644
--- a/test/snapshots/lookpanes.snap
+++ b/test/snapshots/lookpanes.snap
@@ -24,6 +24,8 @@ file beta/bmark.txt both.txt\nb-marker
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 51 130 beta/bmark.txt
wait 8000 b-marker
stable 700 20000
diff --git a/test/snapshots/lookrange.snap b/test/snapshots/lookrange.snap
index 50ef9ad3..ef04409e 100644
--- a/test/snapshots/lookrange.snap
+++ b/test/snapshots/lookrange.snap
@@ -18,6 +18,8 @@ file look.txt r.txt:3-5\nr.txt:7:4-9\nr.txt:3:2-5:3\nr.txt:8:6-99:9
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 150 look.txt
wait 8000 r.txt:3-5
stable 700 20000
diff --git a/test/snapshots/lsp-client.snap b/test/snapshots/lsp-client.snap
index 541e7c7f..7b255bd8 100644
--- a/test/snapshots/lsp-client.snap
+++ b/test/snapshots/lsp-client.snap
@@ -9,6 +9,8 @@
# gr -> sorted rows, selecting the next occurrence; n/N continue there.
file main.rs mod lib;\n\nfn main() {\n let x = add(1, 2);\n let y = add(3, 4);\n let _ = x + y;\n}\n
file lib.rs // mock fixture\npub fn add(a: i32, b: i32) -> i32 {\n a + b\n}\n
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 25 100 main.rs
wait 8000 add(1, 2)
stable 700 20000
diff --git a/test/snapshots/lsp.snap b/test/snapshots/lsp.snap
index b40484ee..68365527 100644
--- a/test/snapshots/lsp.snap
+++ b/test/snapshots/lsp.snap
@@ -11,6 +11,8 @@
# symbol from std — so these goldens do not encode this machine's stdlib
# version or its install path.
file a.zig const std = @import("std");\n\nfn helper(x: u32) u32 {\n return x + 1;\n}\n\npub fn main() void {\n _ = helper(41);\n}\n
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 41 120 a.zig
wait 8000 helper
stable 700 20000
diff --git a/test/snapshots/lspcomplete.snap b/test/snapshots/lspcomplete.snap
index 53ce7ef9..dcdec45c 100644
--- a/test/snapshots/lspcomplete.snap
+++ b/test/snapshots/lspcomplete.snap
@@ -18,6 +18,8 @@
# script the only end-to-end coverage the feature has.
file a.zig const Shade = enum {\n verdigris,\n cinnabar,\n};\n\nfn pick(s: Shade) u8 {\n return switch (s) {\n \n };\n}\n\n// note. see below\n
file notes.txt abc.def ghi\n
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 41 120 a.zig
wait 8000 verdigris
stable 700 20000
diff --git a/test/snapshots/lsprelpath.snap b/test/snapshots/lsprelpath.snap
index 247390fe..89b0e124 100644
--- a/test/snapshots/lsprelpath.snap
+++ b/test/snapshots/lsprelpath.snap
@@ -30,6 +30,8 @@ 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 ----
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 35 100 sub/parent.zig
wait 8000 fn pick
stable 700 20000
diff --git a/test/snapshots/mini.snap b/test/snapshots/mini.snap
index 4905c68d..ffa9d94e 100644
--- a/test/snapshots/mini.snap
+++ b/test/snapshots/mini.snap
@@ -1,5 +1,7 @@
file commands.txt @`Mini demo.zig`
file demo.zig const greeting = "café λ 界 é";\n\npub fn choose(ok: bool) u32 {\n if (ok) return 42;\n return 7;\n}\n\n// space and color survive compression\nconst answer = choose(true);\n
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 23 90 commands.txt
wait 8000 Mini demo.zig
stable 400 10000
diff --git a/test/snapshots/nested.snap b/test/snapshots/nested.snap
index c26b7cea..9c31fb00 100644
--- a/test/snapshots/nested.snap
+++ b/test/snapshots/nested.snap
@@ -1,6 +1,8 @@
dirmk nestdir
file nestdir/inside-nested.txt marker
file nested.txt hello-from-nested\nsecond-nested-line\n
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100
wait 8000 $
stable 700 20000
diff --git a/test/snapshots/psearch.snap b/test/snapshots/psearch.snap
index a46e2b9d..f32fdf75 100644
--- a/test/snapshots/psearch.snap
+++ b/test/snapshots/psearch.snap
@@ -12,6 +12,8 @@
# It splits BELOW the shell it came from: every snap below stays ONE column,
# the shell's tag and the +Search tag both starting at x=0, thirty rows split
# between them, and nothing shifts sideways.
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 140
wait 8000 Newcol Joincol
stable 700 20000
diff --git a/test/snapshots/reflow.snap b/test/snapshots/reflow.snap
index 7aac1e8c..4a2a5368 100644
--- a/test/snapshots/reflow.snap
+++ b/test/snapshots/reflow.snap
@@ -4,6 +4,8 @@
# integrity check panicked the whole app ("ViewportPinInsufficientRows").
# build.zig now pins the ghostty dependency at ReleaseSafe so those
# development-only checks are off — the app's own safety checks are unchanged.
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 25 40
wait 8000 $
text printf 'y%.0s' $(seq 1 3000); echo do''ne
diff --git a/test/snapshots/rsearch.snap b/test/snapshots/rsearch.snap
index 30459488..a83d27c4 100644
--- a/test/snapshots/rsearch.snap
+++ b/test/snapshots/rsearch.snap
@@ -11,6 +11,8 @@ file code.txt run count_x now\nopen sub/dep.txt:3 here\ncount_x again\npick two
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 210 -n 1
wait 8000 code.txt
stable 700 20000
diff --git a/test/snapshots/savepane.snap b/test/snapshots/savepane.snap
index 58df13ef..39129347 100644
--- a/test/snapshots/savepane.snap
+++ b/test/snapshots/savepane.snap
@@ -7,6 +7,8 @@
# scratch asks for a path in its inherited dir and makes it a file"); none of
# them can see it drawn, land on the tag rather than the message row, or show
# what the pane becomes afterwards. That is what this script is for.
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 -n 1
wait 8000 Newcol Joincol
stable 700 20000
diff --git a/test/snapshots/scrolloff.snap b/test/snapshots/scrolloff.snap
index caed9d47..f99c7341 100644
--- a/test/snapshots/scrolloff.snap
+++ b/test/snapshots/scrolloff.snap
@@ -1,6 +1,8 @@
# scrolloff: keyboard motion keeps 3 context rows above/below the cursor,
# clamped at file boundaries (cursor may reach the top/bottom body row there)
lines g.txt 40
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 12 210 -n 1
wait 8000 g.txt
stable 700 20000
diff --git a/test/snapshots/splitparent.snap b/test/snapshots/splitparent.snap
index 1fd4e935..e5595144 100644
--- a/test/snapshots/splitparent.snap
+++ b/test/snapshots/splitparent.snap
@@ -1,6 +1,8 @@
# a new pane never opens under a too-short parent: Alt-n from a tag-only pane
# splits the tall sibling in its column instead; when NO pane could leave the
# newcomer 2 body rows, the tallest one anywhere is split
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 -n 3
stable 700 20000
# shrink pane 0 (top-left) to just its tagline
diff --git a/test/snapshots/stepgrain.snap b/test/snapshots/stepgrain.snap
index 3c4d3e4c..323fda5c 100644
--- a/test/snapshots/stepgrain.snap
+++ b/test/snapshots/stepgrain.snap
@@ -21,6 +21,8 @@ dirmk sub
file a.txt hello ZQMARK one\nsee also sub/b.txt for ZQMARK two
file sub/b.txt ZQMARK inside sub
run touch 'two words.txt'
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 150 a.txt
wait 8000 hello ZQMARK
stable 700 20000
diff --git a/test/snapshots/tagalign.snap b/test/snapshots/tagalign.snap
index a77415d9..7a0c93ce 100644
--- a/test/snapshots/tagalign.snap
+++ b/test/snapshots/tagalign.snap
@@ -2,6 +2,8 @@
dirmk deep
dirmk deep/nested-project-directory
file deep/nested-project-directory/document.txt alpha\nbeta\ngamma
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 deep/nested-project-directory/document.txt
wait 8000 Newcol Joincol
wait 8000 document.txt
diff --git a/test/snapshots/tagalign2col.snap b/test/snapshots/tagalign2col.snap
index 0849ffae..353289d4 100644
--- a/test/snapshots/tagalign2col.snap
+++ b/test/snapshots/tagalign2col.snap
@@ -2,6 +2,8 @@
dirmk deep
dirmk deep/proj
file deep/proj/document.txt alpha\nbeta\ngamma
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 160 deep/proj/document.txt
wait 8000 Newcol Joincol
wait 8000 document.txt
diff --git a/test/snapshots/tagbottom.snap b/test/snapshots/tagbottom.snap
index 67bb2ead..c294a7b6 100644
--- a/test/snapshots/tagbottom.snap
+++ b/test/snapshots/tagbottom.snap
@@ -21,6 +21,8 @@ file bottom.txt ZZONE\nZZTWO
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 top.txt
wait 8000 Newcol Joincol
wait 8000 top.txt
diff --git a/test/snapshots/tagnav.snap b/test/snapshots/tagnav.snap
index f145480e..a0e06cd0 100644
--- a/test/snapshots/tagnav.snap
+++ b/test/snapshots/tagnav.snap
@@ -10,6 +10,8 @@
# carries its BODY mode as one character: ` ` normal, `^` insert, `$` tty. The
# tag has a mode of its own, so the box never changes while a tag is used.
file w.txt alpha\nbeta\ngamma
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 w.txt
wait 8000 Newcol Joincol
wait 8000 w.txt
diff --git a/test/snapshots/themesel.snap b/test/snapshots/themesel.snap
index 04a95d23..734b9fdd 100644
--- a/test/snapshots/themesel.snap
+++ b/test/snapshots/themesel.snap
@@ -16,6 +16,8 @@
# read with snapstyle, so this proves the generated themes are real data and
# not just names in a list.
lines t.txt 40
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 t.txt
wait 8000 t.txt
stable 700 20000
diff --git a/test/snapshots/tinywin.snap b/test/snapshots/tinywin.snap
index 3d22d583..388609e4 100644
--- a/test/snapshots/tinywin.snap
+++ b/test/snapshots/tinywin.snap
@@ -2,6 +2,8 @@
# every pane in a column at least one row, so `y` walked off the bottom and
# renderPane got a rect outside the surface (assert). Panes that no longer fit
# now get h = 0 and simply do not render until the window grows back.
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100
wait 8000 $
key a-n
diff --git a/test/snapshots/topbarexec.snap b/test/snapshots/topbarexec.snap
index 516a23b3..9f62af46 100644
--- a/test/snapshots/topbarexec.snap
+++ b/test/snapshots/topbarexec.snap
@@ -14,6 +14,8 @@
# So both halves are pinned here, against the same live selection: the no-arg
# builtin runs, and the arg-taking one still gets the word.
file zmarkfile.txt hay ZQNEEDLE stack
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 21 90 -n 3
wait 8000 zmarkfile.txt
stable 700 20000
diff --git a/test/snapshots/ttyhelp.snap b/test/snapshots/ttyhelp.snap
index 24399848..59e73af2 100644
--- a/test/snapshots/ttyhelp.snap
+++ b/test/snapshots/ttyhelp.snap
@@ -1,6 +1,8 @@
# bare boot = tty mode: SPC belongs to the shell, so the topbar Help word is
# the only route to the command list. Row 0 is not a pane, so a middle-click
# there is dispatched before any pane's mode is consulted.
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100
wait 8000 Newcol Joincol
stable 700 20000
diff --git a/test/snapshots/ttylook.snap b/test/snapshots/ttylook.snap
index 5b82bd89..6eecc419 100644
--- a/test/snapshots/ttylook.snap
+++ b/test/snapshots/ttylook.snap
@@ -9,6 +9,8 @@
lines big.txt 40
file plain.txt just text
dirmk sub
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 120 -n 3
wait 8000 big.txt
stable 700 20000
diff --git a/test/snapshots/ttyonly.snap b/test/snapshots/ttyonly.snap
index 1008e084..85180b40 100644
--- a/test/snapshots/ttyonly.snap
+++ b/test/snapshots/ttyonly.snap
@@ -1,5 +1,7 @@
# --tty: a single fullscreen shell already in raw tty mode, prompts visible
file t.txt x
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 --tty
wait 8000 $
stable 700 20000
diff --git a/test/snapshots/ttytaken.snap b/test/snapshots/ttytaken.snap
index a6ccb632..be0bad29 100644
--- a/test/snapshots/ttytaken.snap
+++ b/test/snapshots/ttytaken.snap
@@ -6,6 +6,8 @@
# the pager's screen changes. (From any pane but a terminal, an Exec always
# runs as a command pane: exec.snap and cmdword.snap.)
lines big.txt 40
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 210 -n 1
wait 8000 big.txt
stable 700 20000
diff --git a/test/snapshots/windownav.snap b/test/snapshots/windownav.snap
index 66509e11..fc26896f 100644
--- a/test/snapshots/windownav.snap
+++ b/test/snapshots/windownav.snap
@@ -8,6 +8,8 @@
# `cursor=` header: that is the
# ACTIVE pane's cursor, so each snap is named by the pane it should land in.
file w.txt alpha\nbeta\ngamma
+# its clicks and goldens were laid out by the pardes placement rule
+config Placement pardes
start 31 100 w.txt
wait 8000 Newcol Joincol
wait 8000 w.txt