From f03b9f95e08c0f19ee5110722e20fa98f24f8794 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 6 Mar 2024 17:20:26 -0800 Subject: [PATCH] terminal2: selectWord more tests --- src/terminal/Screen.zig | 1 + src/terminal2/Screen.zig | 78 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/src/terminal/Screen.zig b/src/terminal/Screen.zig index e8f548277..e0f5803e4 100644 --- a/src/terminal/Screen.zig +++ b/src/terminal/Screen.zig @@ -4740,6 +4740,7 @@ test "Screen: selectWord" { } } +// X test "Screen: selectWord across soft-wrap" { const testing = std.testing; const alloc = testing.allocator; diff --git a/src/terminal2/Screen.zig b/src/terminal2/Screen.zig index e08df0b9b..eb30a04d9 100644 --- a/src/terminal2/Screen.zig +++ b/src/terminal2/Screen.zig @@ -1068,12 +1068,6 @@ pub fn selectWord(self: *Screen, pin: Pin) ?Selection { const rac = p.rowAndCell(); const cell = rac.cell; - // If we are going to the next row and it isn't wrapped, we - // return the previous. - if (p.x == 0 and !rac.row.wrap) { - break :end prev; - } - // If we reached an empty cell its always a boundary if (!cell.hasText()) break :end prev; @@ -1085,6 +1079,12 @@ pub fn selectWord(self: *Screen, pin: Pin) ?Selection { ) != null; if (this_boundary != expect_boundary) break :end prev; + // If we are going to the next row and it isn't wrapped, we + // return the previous. + if (p.x == p.page.data.size.cols - 1 and !rac.row.wrap) { + break :end p; + } + prev = p; } @@ -4145,3 +4145,69 @@ test "Screen: selectWord" { } }, s.pages.pointFromPin(.screen, sel.end().*).?); } } + +test "Screen: selectWord across soft-wrap" { + const testing = std.testing; + const alloc = testing.allocator; + + var s = try init(alloc, 5, 10, 0); + defer s.deinit(); + try s.testWriteString(" 1234012\n 123"); + + { + const contents = try s.dumpStringAlloc(alloc, .{ .screen = .{} }); + defer alloc.free(contents); + try testing.expectEqualStrings(" 1234\n012\n 123", contents); + } + + // Going forward + { + var sel = s.selectWord(s.pages.pin(.{ .active = .{ + .x = 1, + .y = 0, + } }).?).?; + defer sel.deinit(&s); + try testing.expectEqual(point.Point{ .screen = .{ + .x = 1, + .y = 0, + } }, s.pages.pointFromPin(.screen, sel.start().*).?); + try testing.expectEqual(point.Point{ .screen = .{ + .x = 2, + .y = 1, + } }, s.pages.pointFromPin(.screen, sel.end().*).?); + } + + // Going backward + { + var sel = s.selectWord(s.pages.pin(.{ .active = .{ + .x = 1, + .y = 1, + } }).?).?; + defer sel.deinit(&s); + try testing.expectEqual(point.Point{ .screen = .{ + .x = 1, + .y = 0, + } }, s.pages.pointFromPin(.screen, sel.start().*).?); + try testing.expectEqual(point.Point{ .screen = .{ + .x = 2, + .y = 1, + } }, s.pages.pointFromPin(.screen, sel.end().*).?); + } + + // Going forward and backward + { + var sel = s.selectWord(s.pages.pin(.{ .active = .{ + .x = 3, + .y = 0, + } }).?).?; + defer sel.deinit(&s); + try testing.expectEqual(point.Point{ .screen = .{ + .x = 1, + .y = 0, + } }, s.pages.pointFromPin(.screen, sel.start().*).?); + try testing.expectEqual(point.Point{ .screen = .{ + .x = 2, + .y = 1, + } }, s.pages.pointFromPin(.screen, sel.end().*).?); + } +}