summaryrefslogtreecommitdiff
path: root/src/pdf_pane_integration_test.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdf_pane_integration_test.zig')
-rw-r--r--src/pdf_pane_integration_test.zig42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/pdf_pane_integration_test.zig b/src/pdf_pane_integration_test.zig
index 2e671f49..f0a8be8f 100644
--- a/src/pdf_pane_integration_test.zig
+++ b/src/pdf_pane_integration_test.zig
@@ -1775,3 +1775,45 @@ test "PDF native mouse selection, Look, and highlights share page geometry" {
try std.testing.expectEqual(@as(usize, 0), pv.selection_text.len);
try std.testing.expectEqualStrings(saved_query, pv.search_query);
}
+
+test "Esc back into a PDF keeps the offset within its page" {
+ if (!pdf_enabled or platform == .web) return;
+ const gpa = std.testing.allocator;
+ var tmp = std.testing.tmpDir(.{});
+ defer tmp.cleanup();
+ const fixture = try pdf_impl.makeOutlineTestPdf(gpa);
+ defer gpa.free(fixture);
+ try tmp.dir.writeFile(std.testing.io, .{ .sub_path = "outline.pdf", .data = fixture });
+ var path_buf: [256]u8 = undefined;
+ const path = try std.fmt.bufPrint(&path_buf, ".zig-cache/tmp/{s}/outline.pdf", .{tmp.sub_path});
+
+ const p = try Pardes.init(gpa, .{ .file = path, .cols = 80, .rows = 28 });
+ defer p.deinit();
+ p.update(.{ .resize = .{ .cols = 80, .rows = 28 } });
+ const doc = p.active;
+ const dp = p.panes[doc].?;
+ try std.testing.expect(dp.pdf != null);
+ pardes.pdf_test.sync(p);
+
+ // Read a little way DOWN the page you are on, then step away.
+ const pv = &dp.pdf.?;
+ pv.document_scroll_y += 137;
+ const mid = pv.document_scroll_y;
+ pv.scroll_to_page_pending = false;
+ p.update(.{ .key = .{ .cp = 'n', .alt = true } }); // a shell under the doc
+ pardes.pdf_test.sync(p);
+ const shell = p.active;
+ try std.testing.expect(shell != doc);
+
+ p.update(.{ .key = .{ .cp = Key.escape } }); // Esc: back into the PDF
+ pardes.pdf_test.sync(p);
+ try std.testing.expectEqual(doc, p.active);
+
+ // The jumps stack records a PDF as its PAGE, so returning revealed the page
+ // you were already on — and a reveal sets `document_scroll_y` to that page's
+ // start, throwing away where you had read to inside it.
+ try std.testing.expectEqual(mid, pv.document_scroll_y);
+ // Same reveal, the other half: with no valid layout yet it only ARMS the
+ // snap, so a test that watched the offset alone would not see it coming.
+ try std.testing.expect(!pv.scroll_to_page_pending);
+}