summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-07-31 03:15:28 -0300
committerGabriel Schneider <[email protected]>2026-08-01 15:02:08 -0300
commit6cd33661064df4163f3bd98db432526ad2165b7f (patch)
tree6d3cffe1f59eb6b5df8193ddd9c092f781f0979f /test
parentf2b8a25d0a25df778bce57efa4c2c7282c71893b (diff)
downloadpardes-6cd33661064df4163f3bd98db432526ad2165b7f.tar.gz
pardes-6cd33661064df4163f3bd98db432526ad2165b7f.zip
a mostly-vertical touchpad swipe stays vertical
The pad faithfully turns a two-finger scroll's sideways drift into wheel_left and wheel_right, so a plain scroll slid the view sideways underneath you. Every vertical tick now re-arms a guard and every horizontal tick spends one instead of scrolling, so horizontal has to EARN its way back by landing three ticks in a row with no vertical among them. Clock-free on purpose: the core is a state machine with no timestamp on a mouse event, and faking one by counting renders would be worse than the counter. The guard is only ever armed BY vertical scrolling, so a horizontal swipe from a still view still moves on its first tick — only horizontal that interrupts vertical has anything to prove. A tilt wheel gets the same treatment, where recent-vertical is a much weaker signal of accident. Deliberate: the only honest fix is a per-device flag out of the shell, and that layer costs more than the three clicks it would save. The rule is one pure function next to the number it reads, with an inline test written to hold for any tuning of that number. unit-test grew a fourth binary over the core module hxdiff already links. New golden wheeldrift; none moved.
Diffstat (limited to 'test')
-rw-r--r--test/snapshot.zig9
-rw-r--r--test/snapshots/wheeldrift.golden85
-rw-r--r--test/snapshots/wheeldrift.snap45
3 files changed, 137 insertions, 2 deletions
diff --git a/test/snapshot.zig b/test/snapshot.zig
index aeb01187..4344654c 100644
--- a/test/snapshot.zig
+++ b/test/snapshot.zig
@@ -26,7 +26,7 @@
//
// Script commands (line-oriented, # comments):
// file <name> <content> create file in the script's cwd (before start)
-// lines <name> <n> create file with n numbered lines
+// lines <name> <n> [tail] create file with n numbered lines, tail on each
// dirmk <name> create a subdirectory
// start <rows> <cols> [arg] fork the app in a pty (optional extra CLI arg)
// wait <ms> <needle...> pump until needle appears on the grid (fails hard)
@@ -346,8 +346,13 @@ fn runScript(arena: std.mem.Allocator, exe_z: [:0]const u8, script_path: []const
} else if (std.mem.eql(u8, cmd, "lines")) {
const name = tok.next() orelse return error.BadScript;
const n = try std.fmt.parseInt(usize, tok.next() orelse return error.BadScript, 10);
+ // anything after the count is glued onto every line (no separator:
+ // `rest` eats the delimiter, so spell one in the tail if you want
+ // one) — a file that is long AND wide, which is what a horizontal
+ // scroll test needs and `file` can only give as one huge script line
+ const tail = tok.rest();
var buf: std.ArrayList(u8) = .empty;
- for (1..n + 1) |i| try buf.appendSlice(arena, try std.fmt.allocPrint(arena, "line {d}\n", .{i}));
+ for (1..n + 1) |i| try buf.appendSlice(arena, try std.fmt.allocPrint(arena, "line {d}{s}\n", .{ i, tail }));
try eh.writeFile(try arena.dupeZ(u8, name), buf.items);
} else if (std.mem.eql(u8, cmd, "ppmdiag")) {
// The diagonal-split test PPM from the old e2e (white over blue),
diff --git a/test/snapshots/wheeldrift.golden b/test/snapshots/wheeldrift.golden
new file mode 100644
index 00000000..44d40eef
--- /dev/null
+++ b/test/snapshots/wheeldrift.golden
@@ -0,0 +1,85 @@
+== snap home grid=70x16 cursor=7,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/wheeldrift/c NOR /tmp/pardes-snap/wheeldrift/c
+| 1 line 1_0123456789_abcdefghij
+| 2 line 2_0123456789_abcdefghij drift.txt
+| 3 line 3_0123456789_abcdefghij
+| 4 line 4_0123456789_abcdefghij
+| 5 line 5_0123456789_abcdefghij
+| 6 line 6_0123456789_abcdefghij
+| 7 line 7_0123456789_abcdefghij
+| 8 line 8_0123456789_abcdefghij
+| 9 line 9_0123456789_abcdefghij
+| 10 line 10_0123456789_abcdefghi
+| 11 line 11_0123456789_abcdefghi
+| 12 line 12_0123456789_abcdefghi
+| 13 line 13_0123456789_abcdefghi
+| 14 line 14_0123456789_abcdefghi
+== snap drifted grid=70x16 cursor=7,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/wheeldrift/c NOR /tmp/pardes-snap/wheeldrift/c
+| 6 line 6_0123456789_abcdefghij
+| 7 line 7_0123456789_abcdefghij drift.txt
+| 8 line 8_0123456789_abcdefghij
+| 9 line 9_0123456789_abcdefghij
+| 10 line 10_0123456789_abcdefghi
+| 11 line 11_0123456789_abcdefghi
+| 12 line 12_0123456789_abcdefghi
+| 13 line 13_0123456789_abcdefghi
+| 14 line 14_0123456789_abcdefghi
+| 15 line 15_0123456789_abcdefghi
+| 16 line 16_0123456789_abcdefghi
+| 17 line 17_0123456789_abcdefghi
+| 18 line 18_0123456789_abcdefghi
+| 19 line 19_0123456789_abcdefghi
+== snap paying grid=70x16 cursor=7,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/wheeldrift/c NOR /tmp/pardes-snap/wheeldrift/c
+| 6 line 6_0123456789_abcdefghij
+| 7 line 7_0123456789_abcdefghij drift.txt
+| 8 line 8_0123456789_abcdefghij
+| 9 line 9_0123456789_abcdefghij
+| 10 line 10_0123456789_abcdefghi
+| 11 line 11_0123456789_abcdefghi
+| 12 line 12_0123456789_abcdefghi
+| 13 line 13_0123456789_abcdefghi
+| 14 line 14_0123456789_abcdefghi
+| 15 line 15_0123456789_abcdefghi
+| 16 line 16_0123456789_abcdefghi
+| 17 line 17_0123456789_abcdefghi
+| 18 line 18_0123456789_abcdefghi
+| 19 line 19_0123456789_abcdefghi
+== snap moved grid=70x16 cursor=7,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/wheeldrift/c NOR /tmp/pardes-snap/wheeldrift/c
+| 6 123456789_abcdefghij_ZEND
+| 7 123456789_abcdefghij_ZEND drift.txt
+| 8 123456789_abcdefghij_ZEND
+| 9 123456789_abcdefghij_ZEND
+| 10 0123456789_abcdefghij_ZEND
+| 11 0123456789_abcdefghij_ZEND
+| 12 0123456789_abcdefghij_ZEND
+| 13 0123456789_abcdefghij_ZEND
+| 14 0123456789_abcdefghij_ZEND
+| 15 0123456789_abcdefghij_ZEND
+| 16 0123456789_abcdefghij_ZEND
+| 17 0123456789_abcdefghij_ZEND
+| 18 0123456789_abcdefghij_ZEND
+| 19 0123456789_abcdefghij_ZEND
+== snap rearmed grid=70x16 cursor=7,2
+|Kill Newcol Tutor Debug NextColor Dump Find Grep Help
+| NOR /tmp/pardes-snap/wheeldrift/c NOR /tmp/pardes-snap/wheeldrift/c
+| 5 123456789_abcdefghij_ZEND
+| 6 123456789_abcdefghij_ZEND drift.txt
+| 7 123456789_abcdefghij_ZEND
+| 8 123456789_abcdefghij_ZEND
+| 9 123456789_abcdefghij_ZEND
+| 10 0123456789_abcdefghij_ZEND
+| 11 0123456789_abcdefghij_ZEND
+| 12 0123456789_abcdefghij_ZEND
+| 13 0123456789_abcdefghij_ZEND
+| 14 0123456789_abcdefghij_ZEND
+| 15 0123456789_abcdefghij_ZEND
+| 16 0123456789_abcdefghij_ZEND
+| 17 0123456789_abcdefghij_ZEND
+| 18 0123456789_abcdefghij_ZEND
diff --git a/test/snapshots/wheeldrift.snap b/test/snapshots/wheeldrift.snap
new file mode 100644
index 00000000..a546d2ff
--- /dev/null
+++ b/test/snapshots/wheeldrift.snap
@@ -0,0 +1,45 @@
+# the touchpad drift guard (config.wheel_guard_ticks). A two-finger swipe that
+# is MEANT to be vertical carries a little sideways drift and the pad turns it
+# into wheel_left/wheel_right, so the view used to slide sideways under a plain
+# scroll. Every vertical tick re-arms the guard; a horizontal tick spends one
+# instead of scrolling. SGR codes are vaxis's: 64/65 = wheel up/down (the
+# `wheel` command), 66/67 = wheel RIGHT/left, sent raw as hscroll.snap does.
+# The drift ticks here are all rightward on purpose: leftward drift at column 0
+# is clamped away and would prove nothing.
+lines drift.txt 20 _0123456789_abcdefghij_ZEND
+start 16 70 drift.txt
+wait 8000 drift.txt
+stable 700 20000
+snap home
+# a drifting swipe: five ticks down with three sideways ones mixed in. The
+# view scrolls DOWN five lines and does not move one column sideways.
+wheel down 10 5
+wheel down 10 5
+send \x1b[<66;10;5M
+wheel down 10 5
+send \x1b[<66;10;5M
+send \x1b[<66;10;5M
+wheel down 10 5
+wheel down 10 5
+stable 400 5000
+snap drifted
+# the guard is armed at 3 now, so a DELIBERATE horizontal swipe pays it off
+# first: these three ticks still move nothing (without the guard they would
+# have shifted the text 12 columns)
+send \x1b[<66;10;5M
+send \x1b[<66;10;5M
+send \x1b[<66;10;5M
+stable 400 5000
+snap paying
+# ...and from the fourth tick on it scrolls freely: two ticks, 8 columns
+send \x1b[<66;10;5M
+send \x1b[<66;10;5M
+stable 400 5000
+snap moved
+# vertical again re-arms the guard, so drift is swallowed once more even
+# though horizontal was just running
+wheel up 10 5
+send \x1b[<66;10;5M
+send \x1b[<66;10;5M
+stable 400 5000
+snap rearmed