terminal/new: more no reflow tests

This commit is contained in:
Mitchell Hashimoto
2024-03-01 13:44:13 -08:00
parent eb3323940d
commit 4632dd359d
2 changed files with 47 additions and 5 deletions

View File

@ -6313,6 +6313,7 @@ test "Screen: resize (no reflow) grapheme copy" {
} }
} }
// X
test "Screen: resize (no reflow) more rows with soft wrapping" { test "Screen: resize (no reflow) more rows with soft wrapping" {
const testing = std.testing; const testing = std.testing;
const alloc = testing.allocator; const alloc = testing.allocator;

View File

@ -863,18 +863,24 @@ fn testWriteString(self: *Screen, text: []const u8) !void {
if (c == '\n') { if (c == '\n') {
try self.cursorDownOrScroll(); try self.cursorDownOrScroll();
self.cursorHorizontalAbsolute(0); self.cursorHorizontalAbsolute(0);
self.cursor.pending_wrap = false;
continue; continue;
} }
if (self.cursor.x == self.pages.cols) {
@panic("wrap not implemented");
}
const width: usize = if (c <= 0xFF) 1 else @intCast(unicode.table.get(c).width); const width: usize = if (c <= 0xFF) 1 else @intCast(unicode.table.get(c).width);
if (width == 0) { if (width == 0) {
@panic("zero-width todo"); @panic("zero-width todo");
} }
if (self.cursor.pending_wrap) {
assert(self.cursor.x == self.pages.cols - 1);
self.cursor.pending_wrap = false;
self.cursor.page_row.wrap = true;
try self.cursorDownOrScroll();
self.cursorHorizontalAbsolute(0);
self.cursor.page_row.wrap_continuation = true;
}
assert(width == 1 or width == 2); assert(width == 1 or width == 2);
switch (width) { switch (width) {
1 => { 1 => {
@ -893,7 +899,7 @@ fn testWriteString(self: *Screen, text: []const u8) !void {
if (self.cursor.x + 1 < self.pages.cols) { if (self.cursor.x + 1 < self.pages.cols) {
self.cursorRight(1); self.cursorRight(1);
} else { } else {
@panic("wrap not implemented"); self.cursor.pending_wrap = true;
} }
}, },
@ -1996,3 +2002,38 @@ test "Screen: resize (no reflow) less rows with empty trailing" {
try testing.expectEqualStrings("A\nB", contents); try testing.expectEqualStrings("A\nB", contents);
} }
} }
test "Screen: resize (no reflow) more rows with soft wrapping" {
const testing = std.testing;
const alloc = testing.allocator;
var s = try init(alloc, 2, 3, 3);
defer s.deinit();
const str = "1A2B\n3C4E\n5F6G";
try s.testWriteString(str);
// Every second row should be wrapped
for (0..6) |y| {
const list_cell = s.pages.getCell(.{ .screen = .{ .x = 0, .y = y } }).?;
const row = list_cell.row;
const wrapped = (y % 2 == 0);
try testing.expectEqual(wrapped, row.wrap);
}
// Resize
try s.resizeWithoutReflow(2, 10);
{
const contents = try s.dumpStringAlloc(alloc, .{ .viewport = .{} });
defer alloc.free(contents);
const expected = "1A\n2B\n3C\n4E\n5F\n6G";
try testing.expectEqualStrings(expected, contents);
}
// Every second row should be wrapped
for (0..6) |y| {
const list_cell = s.pages.getCell(.{ .screen = .{ .x = 0, .y = y } }).?;
const row = list_cell.row;
const wrapped = (y % 2 == 0);
try testing.expectEqual(wrapped, row.wrap);
}
}