From 1d33fb3644b3483f7840e2eb9051a0c697326d63 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 3 Nov 2019 14:35:07 -0500 Subject: fix off-by-one in erase_row_backward fixes behavior of CSI 1 J and CSI 1 K (which are not particularly commonly used, which is why this was missed before) --- src/grid.rs | 2 +- tests/csi.rs | 32 ++++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/grid.rs b/src/grid.rs index 7e7b9ed..e6098a9 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -174,7 +174,7 @@ impl Grid { pub fn erase_row_backward(&mut self) { let pos = self.pos; let row = self.current_row_mut(); - for cell in row.cells_mut().take(pos.col as usize) { + for cell in row.cells_mut().take(pos.col as usize + 1) { *cell = crate::cell::Cell::default(); } } diff --git a/tests/csi.rs b/tests/csi.rs index 75e4741..5dcd88c 100644 --- a/tests/csi.rs +++ b/tests/csi.rs @@ -102,7 +102,7 @@ fn ed() { screen.process(b"\x1b[10;12H\x1b[0J"); assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n bar\n\n\n\n\n ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - screen.process(b"\x1b[5;7H\x1b[1J"); + screen.process(b"\x1b[5;6H\x1b[1J"); assert_eq!( screen.window_contents(0, 0, 23, 79), "\n\n\n\n r\n\n\n\n\n ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" @@ -138,7 +138,7 @@ fn ed() { screen.process(b"\x1b[10;12H\x1b[?0J"); assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n bar\n\n\n\n\n ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - screen.process(b"\x1b[5;7H\x1b[?1J"); + screen.process(b"\x1b[5;6H\x1b[?1J"); assert_eq!( screen.window_contents(0, 0, 23, 79), "\n\n\n\n r\n\n\n\n\n ba\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" @@ -177,7 +177,7 @@ fn el() { screen.process(b"\x1b[5;8H\x1b[0K"); assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n bar\n\n\n\n\n bazbaz\n\n\n\n\n\n\n\n\n\n quux\n\n\n\n\n"); - screen.process(b"\x1b[10;13H\x1b[1K"); + screen.process(b"\x1b[10;12H\x1b[1K"); assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n bar\n\n\n\n\n baz\n\n\n\n\n\n\n\n\n\n quux\n\n\n\n\n"); screen.process(b"\x1b[20;22H\x1b[2K"); @@ -198,7 +198,7 @@ fn el() { screen.process(b"\x1b[5;8H\x1b[?0K"); assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n bar\n\n\n\n\n bazbaz\n\n\n\n\n\n\n\n\n\n quux\n\n\n\n\n"); - screen.process(b"\x1b[10;13H\x1b[?1K"); + screen.process(b"\x1b[10;12H\x1b[?1K"); assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n bar\n\n\n\n\n baz\n\n\n\n\n\n\n\n\n\n quux\n\n\n\n\n"); screen.process(b"\x1b[20;22H\x1b[?2K"); @@ -206,6 +206,30 @@ fn el() { screen.process(b"\x1b[1;2H\x1b[?K"); assert_eq!(screen.window_contents(0, 0, 23, 79), "f\n\n\n\n bar\n\n\n\n\n baz\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + + screen.process(b"\x1b[2J\x1b[H"); + assert_eq!( + screen.window_contents(0, 0, 23, 79), + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + ); + + screen.process(b"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); + assert_eq!( + screen.window_contents(0, 0, 23, 79), + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + ); + + screen.process(b"\x1b[1;21H\x1b[K"); + assert_eq!( + screen.window_contents(0, 0, 23, 79), + "12345678901234567890\n12345678901234567890\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + ); + + screen.process(b"\x1b[1;10H\x1b[1K"); + assert_eq!( + screen.window_contents(0, 0, 23, 79), + " 1234567890\n12345678901234567890\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + ); } #[test] -- cgit v1.2.3-54-g00ecf