From 76b9bdb1999398fa1b64d000f9a77088af232b62 Mon Sep 17 00:00:00 2001 From: Jon Parise Date: Mon, 1 Jun 2026 19:58:25 -0400 Subject: [PATCH] terminal: test Screen.select frees existing pins --- src/terminal/Screen.zig | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/terminal/Screen.zig b/src/terminal/Screen.zig index becda78b7..8ee700252 100644 --- a/src/terminal/Screen.zig +++ b/src/terminal/Screen.zig @@ -7652,6 +7652,32 @@ test "Screen: select untracked" { try testing.expectEqual(tracked, s.pages.countTrackedPins()); } +test "Screen: select replaces existing pins" { + const testing = std.testing; + const alloc = testing.allocator; + + var s = try init(alloc, .{ .cols = 10, .rows = 10, .max_scrollback = 0 }); + defer s.deinit(); + try s.testWriteString("ABC DEF\n 123\n456"); + + const tracked = s.pages.countTrackedPins(); + try s.select(Selection.init( + s.pages.pin(.{ .active = .{ .x = 0, .y = 0 } }).?, + s.pages.pin(.{ .active = .{ .x = 3, .y = 0 } }).?, + false, + )); + try testing.expectEqual(tracked + 2, s.pages.countTrackedPins()); + + // Replacing the selection must untrack the prior selection's pins + // rather than leak them. + try s.select(Selection.init( + s.pages.pin(.{ .active = .{ .x = 0, .y = 1 } }).?, + s.pages.pin(.{ .active = .{ .x = 2, .y = 1 } }).?, + false, + )); + try testing.expectEqual(tracked + 2, s.pages.countTrackedPins()); +} + test "Screen: selectAll" { const testing = std.testing; const alloc = testing.allocator;