From 6fb04262c69874a4ec8899da4ca10c6cd9aa4eab Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Thu, 29 Apr 2021 14:10:04 +0200 Subject: [PATCH 1/5] fix(compatibility): pass vttest 1 --- src/client/panes/grid.rs | 205 +++++++++++++++--- ...ellij__client__panes__grid__vttest1_0.snap | 47 ++++ ...ellij__client__panes__grid__vttest1_1.snap | 47 ++++ ...ellij__client__panes__grid__vttest1_2.snap | 47 ++++ ...ellij__client__panes__grid__vttest1_3.snap | 47 ++++ ...ellij__client__panes__grid__vttest1_4.snap | 47 ++++ ...ellij__client__panes__grid__vttest1_5.snap | 47 ++++ src/tests/fixtures/vttest1-0 | 34 +++ src/tests/fixtures/vttest1-1 | 48 ++++ src/tests/fixtures/vttest1-2 | 76 +++++++ src/tests/fixtures/vttest1-3 | 137 ++++++++++++ src/tests/fixtures/vttest1-4 | 112 ++++++++++ src/tests/fixtures/vttest1-5 | 113 ++++++++++ 13 files changed, 980 insertions(+), 27 deletions(-) create mode 100644 src/client/panes/snapshots/zellij__client__panes__grid__vttest1_0.snap create mode 100644 src/client/panes/snapshots/zellij__client__panes__grid__vttest1_1.snap create mode 100644 src/client/panes/snapshots/zellij__client__panes__grid__vttest1_2.snap create mode 100644 src/client/panes/snapshots/zellij__client__panes__grid__vttest1_3.snap create mode 100644 src/client/panes/snapshots/zellij__client__panes__grid__vttest1_4.snap create mode 100644 src/client/panes/snapshots/zellij__client__panes__grid__vttest1_5.snap create mode 100644 src/tests/fixtures/vttest1-0 create mode 100644 src/tests/fixtures/vttest1-1 create mode 100644 src/tests/fixtures/vttest1-2 create mode 100644 src/tests/fixtures/vttest1-3 create mode 100644 src/tests/fixtures/vttest1-4 create mode 100644 src/tests/fixtures/vttest1-5 diff --git a/src/client/panes/grid.rs b/src/client/panes/grid.rs index c6dd201e2f..d505915fe2 100644 --- a/src/client/panes/grid.rs +++ b/src/client/panes/grid.rs @@ -161,6 +161,7 @@ pub struct Grid { pending_styles: CharacterStyles, pub should_render: bool, pub cursor_key_mode: bool, // DECCKM - when set, cursor keys should send ANSI direction codes (eg. "OD") instead of the arrow keys (eg. "") + pub erasure_mode: bool, // ERM - when set, goto should not reach the last line of the scroll region pub clear_viewport_before_rendering: bool, pub width: usize, pub height: usize, @@ -170,9 +171,9 @@ impl Debug for Grid { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { for (i, row) in self.viewport.iter().enumerate() { if row.is_canonical { - writeln!(f, "{:?} (C): {:?}", i, row)?; + writeln!(f, "{:02?} (C): {:?}", i, row)?; } else { - writeln!(f, "{:?} (W): {:?}", i, row)?; + writeln!(f, "{:02?} (W): {:?}", i, row)?; } } Ok(()) @@ -192,20 +193,20 @@ impl Grid { pending_styles: CharacterStyles::new(), should_render: true, cursor_key_mode: false, + erasure_mode: false, alternative_lines_above_viewport_and_cursor: None, clear_viewport_before_rendering: false, } } pub fn advance_to_next_tabstop(&mut self, styles: CharacterStyles) { let columns_until_next_tabstop = TABSTOP_WIDTH - (self.cursor.x % TABSTOP_WIDTH); - let columns_until_screen_end = self.width - self.cursor.x; + let columns_until_screen_end = (self.width - self.cursor.x).saturating_sub(1); let columns_to_advance = std::cmp::min(columns_until_next_tabstop, columns_until_screen_end); let mut empty_character = EMPTY_TERMINAL_CHARACTER; empty_character.styles = styles; - for _ in 0..columns_to_advance { - self.add_character(empty_character) - } + self.cursor.x += columns_to_advance; + self.pad_current_line_until(self.cursor.x); } fn cursor_canonical_line_index(&self) -> usize { let mut cursor_canonical_line_index = 0; @@ -475,6 +476,13 @@ impl Grid { } } } + pub fn fill_viewport(&mut self, character: TerminalCharacter) { + self.viewport.clear(); + for _ in 0..self.height { + let columns = vec![character; self.width]; + self.viewport.push(Row::from_columns(columns).canonical()); + } + } pub fn add_canonical_line(&mut self) { if let Some((scroll_region_top, scroll_region_bottom)) = self.scroll_region { if self.cursor.y == scroll_region_bottom { @@ -490,8 +498,13 @@ impl Grid { } self.viewport.remove(scroll_region_top); let columns = vec![EMPTY_TERMINAL_CHARACTER; self.width]; - self.viewport - .insert(scroll_region_bottom, Row::from_columns(columns).canonical()); + if self.viewport.len() >= scroll_region_bottom { + self.viewport + .insert(scroll_region_bottom, Row::from_columns(columns).canonical()); + } else { + self.viewport + .push(Row::from_columns(columns).canonical()); + } return; } } @@ -518,13 +531,6 @@ impl Grid { pub fn move_cursor_to_beginning_of_line(&mut self) { self.cursor.x = 0; } - pub fn move_cursor_backwards(&mut self, count: usize) { - if self.cursor.x > count { - self.cursor.x -= count; - } else { - self.cursor.x = 0; - } - } pub fn insert_character_at_cursor_position(&mut self, terminal_character: TerminalCharacter) { match self.viewport.get_mut(self.cursor.y) { Some(row) => { @@ -601,17 +607,13 @@ impl Grid { } } pub fn replace_characters_in_line_before_cursor(&mut self, replace_with: TerminalCharacter) { - let line_part = vec![replace_with; self.cursor.x]; + let line_part = vec![replace_with; self.cursor.x + 1]; let row = self.viewport.get_mut(self.cursor.y).unwrap(); row.replace_beginning_with(line_part); } pub fn clear_all_after_cursor(&mut self, replace_with: TerminalCharacter) { if let Some(cursor_row) = self.viewport.get_mut(self.cursor.y).as_mut() { cursor_row.truncate(self.cursor.x); - let mut replace_with_columns_in_cursor_row = - vec![replace_with; self.width - self.cursor.x]; - cursor_row.append(&mut replace_with_columns_in_cursor_row); - let replace_with_columns = vec![replace_with; self.width]; self.replace_characters_in_line_after_cursor(replace_with); for row in self.viewport.iter_mut().skip(self.cursor.y + 1) { @@ -619,6 +621,15 @@ impl Grid { } } } + pub fn clear_all_before_cursor(&mut self, replace_with: TerminalCharacter) { + if let Some(cursor_row) = self.viewport.get_mut(self.cursor.y).as_mut() { + self.replace_characters_in_line_before_cursor(replace_with); + let replace_with_columns = vec![replace_with; self.width]; + for row in self.viewport.iter_mut().take(self.cursor.y) { + row.replace_columns(replace_with_columns.clone()); + } + } + } pub fn clear_cursor_line(&mut self) { self.viewport.get_mut(self.cursor.y).unwrap().truncate(0); } @@ -642,10 +653,21 @@ impl Grid { } } pub fn move_cursor_to(&mut self, x: usize, y: usize, pad_character: TerminalCharacter) { - self.cursor.x = std::cmp::min(self.width - 1, x); - self.cursor.y = std::cmp::min(self.height - 1, y); - self.pad_lines_until(self.cursor.y, pad_character); - self.pad_current_line_until(self.cursor.x); + match self.scroll_region { + Some((scroll_region_top, scroll_region_bottom)) => { + self.cursor.x = std::cmp::min(self.width - 1, x); + let y_offset = if self.erasure_mode { scroll_region_top } else { 0 }; + self.cursor.y = std::cmp::min(scroll_region_bottom, y + y_offset); + self.pad_lines_until(self.cursor.y, pad_character); + self.pad_current_line_until(self.cursor.x); + }, + None => { + self.cursor.x = std::cmp::min(self.width - 1, x); + self.cursor.y = std::cmp::min(self.height - 1, y); + self.pad_lines_until(self.cursor.y, pad_character); + self.pad_current_line_until(self.cursor.x); + } + } } pub fn move_cursor_up(&mut self, count: usize) { self.cursor.y = if self.cursor.y < count { @@ -690,6 +712,10 @@ impl Grid { self.pad_lines_until(self.cursor.y, pad_character); } pub fn move_cursor_back(&mut self, count: usize) { + if self.cursor.x == self.width { + // on the rightmost screen edge, backspace skips one character + self.cursor.x -= 1; + } if self.cursor.x < count { self.cursor.x = 0; } else { @@ -827,14 +853,15 @@ impl vte::Perform for Grid { match byte { 8 => { // backspace - self.move_cursor_backwards(1); + self.move_cursor_back(1); } 9 => { // tab self.advance_to_next_tabstop(self.pending_styles); } - 10 => { + 10 | 11 => { // 0a, newline + // 0b, form-feed self.add_newline(); } 13 => { @@ -891,11 +918,13 @@ impl vte::Perform for Grid { char_to_replace.styles = self.pending_styles; if params[0] == 0 { self.clear_all_after_cursor(char_to_replace); + } else if params[0] == 1 { + self.clear_all_before_cursor(char_to_replace); } else if params[0] == 2 { self.clear_all(char_to_replace); } // TODO: implement 1 - } else if c == 'H' { + } else if c == 'H' || c == 'f' { // goto row/col // we subtract 1 from the row/column because these are 1 indexed // (except when they are 0, in which case they should be 1 @@ -963,6 +992,16 @@ impl vte::Perform for Grid { Some(&1) => { self.cursor_key_mode = false; } + Some(&3) => { + // DECCOLM - only side effects + self.scroll_region = None; + self.clear_all(EMPTY_TERMINAL_CHARACTER); + self.cursor.x = 0; + self.cursor.y = 0; + } + Some(&6) => { + self.erasure_mode = false; + } _ => {} }; } @@ -993,6 +1032,16 @@ impl vte::Perform for Grid { Some(&1) => { self.cursor_key_mode = true; } + Some(&3) => { + // DECCOLM - only side effects + self.scroll_region = None; + self.clear_all(EMPTY_TERMINAL_CHARACTER); + self.cursor.x = 0; + self.cursor.y = 0; + } + Some(&6) => { + self.erasure_mode = true; + } _ => {} }; } @@ -1098,12 +1147,27 @@ impl vte::Perform for Grid { fn esc_dispatch(&mut self, intermediates: &[u8], _ignore: bool, byte: u8) { match (byte, intermediates.get(0)) { + (b'D', None) => { + self.add_newline(); + } + (b'E', None) => { + self.add_newline(); + self.move_cursor_to_beginning_of_line(); + } (b'M', None) => { self.move_cursor_up_with_scrolling(1); } (b'c', None) => { self.reset_terminal_state(); } + (b'H', None) => { + self.advance_to_next_tabstop(self.pending_styles); + } + (b'8', Some(b'#')) => { + let mut fill_character = EMPTY_TERMINAL_CHARACTER; + fill_character.character = 'E'; + self.fill_viewport(fill_character); + } _ => {} } } @@ -1254,3 +1318,90 @@ impl Cursor { } } } + +#[cfg(test)] +use ::insta::assert_snapshot; + +#[cfg(test)] +fn read_fixture(fixture_name: &str) -> Vec { + let mut path_to_file = std::path::PathBuf::new(); + path_to_file.push("src"); + path_to_file.push("tests"); + path_to_file.push("fixtures"); + path_to_file.push(fixture_name); + let content = std::fs::read(path_to_file) + .unwrap_or_else(|_| panic!("could not read fixture {:?}", &fixture_name)); + content +} + +#[test] +fn vttest1_0() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-0"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_1() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-1"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_2() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-2"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_3() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-3"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_4() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-4"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_5() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-5"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_0.snap b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_0.snap new file mode 100644 index 0000000000..8641098c45 --- /dev/null +++ b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_0.snap @@ -0,0 +1,47 @@ +--- +source: src/client/panes/grid.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): ******************************************************************************** +01 (C): *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* +02 (C): *+ +* +03 (C): *+ +* +04 (C): *+ +* +05 (C): *+ +* +06 (C): *+ +* +07 (C): *+ +* +08 (C): *+ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +* +09 (C): *+ E E +* +10 (C): *+ E The screen should be cleared, and have an unbroken bor- E +* +11 (C): *+ E der of *'s and +'s around the edge, and exactly in the E +* +12 (C): *+ E middle there should be a frame of E's around this text E +* +13 (C): *+ E with one (1) free position around it. Push E +* +14 (C): *+ E E +* +15 (C): *+ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +* +16 (C): *+ +* +17 (C): *+ +* +18 (C): *+ +* +19 (C): *+ +* +20 (C): *+ +* +21 (C): *+ +* +22 (C): *+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +23 (C): ******************************************************************************** +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): + diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_1.snap b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_1.snap new file mode 100644 index 0000000000..09663484d2 --- /dev/null +++ b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_1.snap @@ -0,0 +1,47 @@ +--- +source: src/client/panes/grid.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): ************************************************************************************************************** +01 (C): *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* +02 (C): *+ +* +03 (C): *+ +* +04 (C): *+ +* +05 (C): *+ +* +06 (C): *+ +* +07 (C): *+ +* +08 (C): *+ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +* +09 (C): *+ E E +* +10 (C): *+ E The screen should be cleared, and have an unbroken bor- E +* +11 (C): *+ E der of *'s and +'s around the edge, and exactly in the E +* +12 (C): *+ E middle there should be a frame of E's around this text E +* +13 (C): *+ E with one (1) free position around it. Push E +* +14 (C): *+ E E +* +15 (C): *+ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +* +16 (C): *+ +* +17 (C): *+ +* +18 (C): *+ +* +19 (C): *+ +* +20 (C): *+ +* +21 (C): *+ +* +22 (C): ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * +23 (C): ************************************************************************************************************** +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): + diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_2.snap b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_2.snap new file mode 100644 index 0000000000..05d80b1d61 --- /dev/null +++ b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_2.snap @@ -0,0 +1,47 @@ +--- +source: src/client/panes/grid.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Test of autowrap, mixing control and print characters. +01 (C): The left/right margins should have letters in order: +02 (C): I iJ +03 (C): j +04 (C): K K k +05 (C): L l +06 (C): M mN +07 (C): n +08 (C): O O o +09 (C): P p +10 (C): Q qR +11 (C): r +12 (C): S S s +13 (C): T t +14 (C): U uV +15 (C): v +16 (C): W W w +17 (C): X x +18 (C): Y yZ +19 (C): z +20 (C): +21 (C): Push +22 (C): +23 (C): +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): + diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_3.snap b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_3.snap new file mode 100644 index 0000000000..64c3e7b95c --- /dev/null +++ b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_3.snap @@ -0,0 +1,47 @@ +--- +source: src/client/panes/grid.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Test of autowrap, mixing control and print characters. +01 (C): The left/right margins should have letters in order: +02 (C): I i +03 (C): J j +04 (C): K k +05 (C): L l +06 (C): M m +07 (C): N n +08 (C): O o +09 (C): P p +10 (C): Q q +11 (C): R r +12 (C): S s +13 (C): T t +14 (C): U u +15 (C): V v +16 (C): W w +17 (C): X x +18 (C): Y y +19 (C): Z z +20 (C): +21 (C): Push +22 (C): +23 (C): +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): + diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_4.snap b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_4.snap new file mode 100644 index 0000000000..dcb417ae15 --- /dev/null +++ b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_4.snap @@ -0,0 +1,47 @@ +--- +source: src/client/panes/grid.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Test of cursor-control characters inside ESC sequences. +01 (C): Below should be four identical lines: +02 (C): +03 (C): A B C D E F G H I +04 (C): A B C D E F G H I +05 (C): A B C D E F G H I +06 (C): A B C D E F G H I +07 (C): +08 (C): Push +09 (C): +10 (C): +11 (C): +12 (C): +13 (C): +14 (C): +15 (C): +16 (C): +17 (C): +18 (C): +19 (C): +20 (C): +21 (C): +22 (C): +23 (C): +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): + diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_5.snap b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_5.snap new file mode 100644 index 0000000000..d044691ce7 --- /dev/null +++ b/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_5.snap @@ -0,0 +1,47 @@ +--- +source: src/client/panes/grid.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Test of leading zeros in ESC sequences. +01 (C): Two lines below you should see the sentence "This is a correct sentence". +02 (C): +03 (C): This is a correct sentence +04 (C): +05 (C): +06 (C): +07 (C): +08 (C): +09 (C): +10 (C): +11 (C): +12 (C): +13 (C): +14 (C): +15 (C): +16 (C): +17 (C): +18 (C): +19 (C): Push +20 (C): +21 (C): +22 (C): +23 (C): +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): + diff --git a/src/tests/fixtures/vttest1-0 b/src/tests/fixtures/vttest1-0 new file mode 100644 index 0000000000..985fb2a234 --- /dev/null +++ b/src/tests/fixtures/vttest1-0 @@ -0,0 +1,34 @@ +⏎(B ⏎ Welcome to fish, the friendly interactive shell +[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on vttest-1(B ⨯ 11:25:27(B   v11:25:27(B  v(B11:25:27(B  ttest(B11:25:27(B  ttest(B11:25:27(B  test(B11:25:27(B  est(B11:25:27(B  st(B11:25:27(B  t(B11:25:27(B  vttest(B11:25:27(B  11:25:27(B   +(B[?2004l]0;vttest /home/aram/code/zellij(B [?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45lVT100 test program, version 2.7 (20210210)Line speed 38400bd Choose test type: + + 0. Exit + 1. Test of cursor movements + 2. Test of screen features + 3. Test of character sets + 4. Test of double-sized characters + 5. Test of keyboard + 6. Test of terminal reports + 7. Test of VT52 mode + 8. Test of VT102 features (Insert/Delete Char/Line) + 9. Test of known bugs + 10. Test of reset and self-test + 11. Test non-VT100 (e.g., VT220, XTERM) terminals + 12. Modify test-parameters + + Enter choice number (0 - 12): 1 +[?3l#8****************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push \ No newline at end of file diff --git a/src/tests/fixtures/vttest1-1 b/src/tests/fixtures/vttest1-1 new file mode 100644 index 0000000000..4068a89b9e --- /dev/null +++ b/src/tests/fixtures/vttest1-1 @@ -0,0 +1,48 @@ +⏎(B ⏎ Welcome to fish, the friendly interactive shell +[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on vttest-1(B ⨯ 11:04:45(B   v11:04:45(B  v(B11:04:45(B  ttest(B11:04:45(B  ttest(B11:04:45(B  test(B11:04:45(B  est(B11:04:45(B  st(B11:04:45(B  t(B11:04:45(B  vttest(B11:04:45(B  11:04:45(B   +(B[?2004l]0;vttest /home/aram/code/zellij(B [?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45lVT100 test program, version 2.7 (20210210)Line speed 38400bd Choose test type: + + 0. Exit + 1. Test of cursor movements + 2. Test of screen features + 3. Test of character sets + 4. Test of double-sized characters + 5. Test of keyboard + 6. Test of terminal reports + 7. Test of VT52 mode + 8. Test of VT102 features (Insert/Delete Char/Line) + 9. Test of known bugs + 10. Test of reset and self-test + 11. Test non-VT100 (e.g., VT220, XTERM) terminals + 12. Modify test-parameters + + Enter choice number (0 - 12): 1 +[?3l#8****************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3h#8************************************************************************************************************************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push \ No newline at end of file diff --git a/src/tests/fixtures/vttest1-2 b/src/tests/fixtures/vttest1-2 new file mode 100644 index 0000000000..5f8b9e15fa --- /dev/null +++ b/src/tests/fixtures/vttest1-2 @@ -0,0 +1,76 @@ +⏎(B ⏎ Welcome to fish, the friendly interactive shell +[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on vttest-1(B ⨯ 11:23:05(B   v11:23:05(B  v(B11:23:05(B  ttest(B11:23:05(B  ttest(B11:23:05(B  test(B11:23:05(B  est(B11:23:05(B  st(B11:23:05(B  t(B11:23:05(B  vttest(B11:23:05(B  11:23:05(B   +(B[?2004l]0;vttest /home/aram/code/zellij(B [?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45lVT100 test program, version 2.7 (20210210)Line speed 38400bd Choose test type: + + 0. Exit + 1. Test of cursor movements + 2. Test of screen features + 3. Test of character sets + 4. Test of double-sized characters + 5. Test of keyboard + 6. Test of terminal reports + 7. Test of VT52 mode + 8. Test of VT102 features (Insert/Delete Char/Line) + 9. Test of known bugs + 10. Test of reset and self-test + 11. Test non-VT100 (e.g., VT220, XTERM) terminals + 12. Modify test-parameters + + Enter choice number (0 - 12): 1 +[?3l#8****************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3h#8************************************************************************************************************************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3l[?3lTest of autowrap, mixing control and print characters. +The left/right margins should have letters in order: +[?6hAa +aBB b +C cC + +DdEe +eFF f +G gG + +HhIi +iJJ j +K kK + +LlMm +mNN n +O oO + +PpQq +qRR r +S sS + +TtUu +uVV v +W wW + +XxYy +yZZ z +[?6lPush \ No newline at end of file diff --git a/src/tests/fixtures/vttest1-3 b/src/tests/fixtures/vttest1-3 new file mode 100644 index 0000000000..3b4842c140 --- /dev/null +++ b/src/tests/fixtures/vttest1-3 @@ -0,0 +1,137 @@ +⏎(B ⏎ Welcome to fish, the friendly interactive shell +[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on vttest-1(B ⨯ 11:25:27(B   v11:25:27(B  v(B11:25:27(B  ttest(B11:25:27(B  ttest(B11:25:27(B  test(B11:25:27(B  est(B11:25:27(B  st(B11:25:27(B  t(B11:25:27(B  vttest(B11:25:27(B  11:25:27(B   +(B[?2004l]0;vttest /home/aram/code/zellij(B [?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45lVT100 test program, version 2.7 (20210210)Line speed 38400bd Choose test type: + + 0. Exit + 1. Test of cursor movements + 2. Test of screen features + 3. Test of character sets + 4. Test of double-sized characters + 5. Test of keyboard + 6. Test of terminal reports + 7. Test of VT52 mode + 8. Test of VT102 features (Insert/Delete Char/Line) + 9. Test of known bugs + 10. Test of reset and self-test + 11. Test non-VT100 (e.g., VT220, XTERM) terminals + 12. Modify test-parameters + + Enter choice number (0 - 12): 1 +[?3l#8****************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push ⏎(B ⏎ Welcome to fish, the friendly interactive shell +[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on vttest-1(B ⨯ 11:27:18(B   v11:27:18(B  v(B11:27:18(B  ttest(B11:27:18(B  ttest(B11:27:18(B  test(B11:27:18(B  est(B11:27:18(B  st(B11:27:18(B  t(B11:27:18(B  vttest(B11:27:18(B  11:27:18(B   +(B[?2004l]0;vttest /home/aram/code/zellij(B [?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45lVT100 test program, version 2.7 (20210210)Line speed 38400bd Choose test type: + + 0. Exit + 1. Test of cursor movements + 2. Test of screen features + 3. Test of character sets + 4. Test of double-sized characters + 5. Test of keyboard + 6. Test of terminal reports + 7. Test of VT52 mode + 8. Test of VT102 features (Insert/Delete Char/Line) + 9. Test of known bugs + 10. Test of reset and self-test + 11. Test non-VT100 (e.g., VT220, XTERM) terminals + 12. Modify test-parameters + + Enter choice number (0 - 12): 1 +[?3l#8****************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3h#8************************************************************************************************************************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3l[?3lTest of autowrap, mixing control and print characters. +The left/right margins should have letters in order: +[?6hAa +aBB b +C cC + +DdEe +eFF f +G gG + +HhIi +iJJ j +K kK + +LlMm +mNN n +O oO + +PpQq +qRR r +S sS + +TtUu +uVV v +W wW + +XxYy +yZZ z +[?6lPush [?3hTest of autowrap, mixing control and print characters. +The left/right margins should have letters in order: +[?6hAa +aBB b +C cC + +DdEe +eFF f +G gG + +HhIi +iJJ j +K kK + +LlMm +mNN n +O oO + +PpQq +qRR r +S sS + +TtUu +uVV v +W wW + +XxYy +yZZ z +[?6lPush \ No newline at end of file diff --git a/src/tests/fixtures/vttest1-4 b/src/tests/fixtures/vttest1-4 new file mode 100644 index 0000000000..66e868912b --- /dev/null +++ b/src/tests/fixtures/vttest1-4 @@ -0,0 +1,112 @@ +⏎(B ⏎ Welcome to fish, the friendly interactive shell +[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on vttest-1(B ⨯ 11:29:05(B   v11:29:05(B  v(B11:29:05(B  ttest(B11:29:05(B  ttest(B11:29:05(B  test(B11:29:05(B  est(B11:29:05(B  st(B11:29:05(B  t(B11:29:05(B  vttest(B11:29:05(B  11:29:05(B   +(B[?2004l]0;vttest /home/aram/code/zellij(B [?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45lVT100 test program, version 2.7 (20210210)Line speed 38400bd Choose test type: + + 0. Exit + 1. Test of cursor movements + 2. Test of screen features + 3. Test of character sets + 4. Test of double-sized characters + 5. Test of keyboard + 6. Test of terminal reports + 7. Test of VT52 mode + 8. Test of VT102 features (Insert/Delete Char/Line) + 9. Test of known bugs + 10. Test of reset and self-test + 11. Test non-VT100 (e.g., VT220, XTERM) terminals + 12. Modify test-parameters + + Enter choice number (0 - 12): 1 +[?3l#8****************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3h#8************************************************************************************************************************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3l[?3lTest of autowrap, mixing control and print characters. +The left/right margins should have letters in order: +[?6hAa +aBB b +C cC + +DdEe +eFF f +G gG + +HhIi +iJJ j +K kK + +LlMm +mNN n +O oO + +PpQq +qRR r +S sS + +TtUu +uVV v +W wW + +XxYy +yZZ z +[?6lPush [?3hTest of autowrap, mixing control and print characters. +The left/right margins should have letters in order: +[?6hAa +aBB b +C cC + +DdEe +eFF f +G gG + +HhIi +iJJ j +K kK + +LlMm +mNN n +O oO + +PpQq +qRR r +S sS + +TtUu +uVV v +W wW + +XxYy +yZZ z +[?6lPush [?3lTest of cursor-control characters inside ESC sequences. +Below should be four identical lines: + +A B C D E F G H I +A[2CB[2CC[2CD[2CE[2CF[2CG[2CH[2CI[2C +A [ 2CB[ 4CC[ 6CD[ 8CE[ 10CF[ 12CG[ 14CH[ 16CI +A [1 AB [1 AC [1 AD [1 AE [1 AF [1 AG [1 AH [1 AI [1 A + +Push \ No newline at end of file diff --git a/src/tests/fixtures/vttest1-5 b/src/tests/fixtures/vttest1-5 new file mode 100644 index 0000000000..89b3993055 --- /dev/null +++ b/src/tests/fixtures/vttest1-5 @@ -0,0 +1,113 @@ +⏎(B ⏎ Welcome to fish, the friendly interactive shell +[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on vttest-1(B ⨯ 11:30:38(B   v11:30:38(B  v(B11:30:38(B  ttest(B11:30:38(B  ttest(B11:30:38(B  test(B11:30:38(B  est(B11:30:38(B  st(B11:30:38(B  t(B11:30:38(B  vttest(B11:30:38(B  11:30:38(B   +(B[?2004l]0;vttest /home/aram/code/zellij(B [?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45lVT100 test program, version 2.7 (20210210)Line speed 38400bd Choose test type: + + 0. Exit + 1. Test of cursor movements + 2. Test of screen features + 3. Test of character sets + 4. Test of double-sized characters + 5. Test of keyboard + 6. Test of terminal reports + 7. Test of VT52 mode + 8. Test of VT102 features (Insert/Delete Char/Line) + 9. Test of known bugs + 10. Test of reset and self-test + 11. Test non-VT100 (e.g., VT220, XTERM) terminals + 12. Modify test-parameters + + Enter choice number (0 - 12): 1 +[?3l#8****************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3h#8************************************************************************************************************************************************************************************************************************************************************************+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M+M**E**E**E**E**E**E**E**E** +** +** +** +** +** +** +** +** +** +** +** +** +** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      The screen should be cleared, and have an unbroken bor-der of *'s and +'s around the edge, and exactly in themiddle there should be a frame of E's around this textwith one (1) free position around it. Push [?3l[?3lTest of autowrap, mixing control and print characters. +The left/right margins should have letters in order: +[?6hAa +aBB b +C cC + +DdEe +eFF f +G gG + +HhIi +iJJ j +K kK + +LlMm +mNN n +O oO + +PpQq +qRR r +S sS + +TtUu +uVV v +W wW + +XxYy +yZZ z +[?6lPush [?3hTest of autowrap, mixing control and print characters. +The left/right margins should have letters in order: +[?6hAa +aBB b +C cC + +DdEe +eFF f +G gG + +HhIi +iJJ j +K kK + +LlMm +mNN n +O oO + +PpQq +qRR r +S sS + +TtUu +uVV v +W wW + +XxYy +yZZ z +[?6lPush [?3lTest of cursor-control characters inside ESC sequences. +Below should be four identical lines: + +A B C D E F G H I +A[2CB[2CC[2CD[2CE[2CF[2CG[2CH[2CI[2C +A [ 2CB[ 4CC[ 6CD[ 8CE[ 10CF[ 12CG[ 14CH[ 16CI +A [1 AB [1 AC [1 AD [1 AE [1 AF [1 AG [1 AH [1 AI [1 A + +Push Test of leading zeros in ESC sequences. +Two lines below you should see the sentence "This is a correct sentence".This is a correct sentencePush \ No newline at end of file From bee5f1457b9a819c3855b712328b45783abf1928 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Thu, 29 Apr 2021 14:21:05 +0200 Subject: [PATCH 2/5] fix(tests): move unit tests to a separate file --- src/client/panes/grid.rs | 87 +------------------ src/client/panes/unit/grid_tests.rs | 85 ++++++++++++++++++ ...__panes__grid__grid_tests__vttest1_0.snap} | 0 ...__panes__grid__grid_tests__vttest1_1.snap} | 0 ...__panes__grid__grid_tests__vttest1_2.snap} | 0 ...__panes__grid__grid_tests__vttest1_3.snap} | 0 ...__panes__grid__grid_tests__vttest1_4.snap} | 0 ...__panes__grid__grid_tests__vttest1_5.snap} | 0 8 files changed, 87 insertions(+), 85 deletions(-) create mode 100644 src/client/panes/unit/grid_tests.rs rename src/client/panes/{snapshots/zellij__client__panes__grid__vttest1_0.snap => unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_0.snap} (100%) rename src/client/panes/{snapshots/zellij__client__panes__grid__vttest1_1.snap => unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_1.snap} (100%) rename src/client/panes/{snapshots/zellij__client__panes__grid__vttest1_2.snap => unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_2.snap} (100%) rename src/client/panes/{snapshots/zellij__client__panes__grid__vttest1_3.snap => unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_3.snap} (100%) rename src/client/panes/{snapshots/zellij__client__panes__grid__vttest1_4.snap => unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_4.snap} (100%) rename src/client/panes/{snapshots/zellij__client__panes__grid__vttest1_5.snap => unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_5.snap} (100%) diff --git a/src/client/panes/grid.rs b/src/client/panes/grid.rs index d505915fe2..c5428815c0 100644 --- a/src/client/panes/grid.rs +++ b/src/client/panes/grid.rs @@ -1320,88 +1320,5 @@ impl Cursor { } #[cfg(test)] -use ::insta::assert_snapshot; - -#[cfg(test)] -fn read_fixture(fixture_name: &str) -> Vec { - let mut path_to_file = std::path::PathBuf::new(); - path_to_file.push("src"); - path_to_file.push("tests"); - path_to_file.push("fixtures"); - path_to_file.push(fixture_name); - let content = std::fs::read(path_to_file) - .unwrap_or_else(|_| panic!("could not read fixture {:?}", &fixture_name)); - content -} - -#[test] -fn vttest1_0() { - let mut vte_parser = vte::Parser::new(); - let mut grid = Grid::new(41, 110); - let fixture_name = "vttest1-0"; - let content = read_fixture(fixture_name); - for byte in content { - vte_parser.advance(&mut grid, byte); - } - assert_snapshot!(format!("{:?}", grid)); -} - -#[test] -fn vttest1_1() { - let mut vte_parser = vte::Parser::new(); - let mut grid = Grid::new(41, 110); - let fixture_name = "vttest1-1"; - let content = read_fixture(fixture_name); - for byte in content { - vte_parser.advance(&mut grid, byte); - } - assert_snapshot!(format!("{:?}", grid)); -} - -#[test] -fn vttest1_2() { - let mut vte_parser = vte::Parser::new(); - let mut grid = Grid::new(41, 110); - let fixture_name = "vttest1-2"; - let content = read_fixture(fixture_name); - for byte in content { - vte_parser.advance(&mut grid, byte); - } - assert_snapshot!(format!("{:?}", grid)); -} - -#[test] -fn vttest1_3() { - let mut vte_parser = vte::Parser::new(); - let mut grid = Grid::new(41, 110); - let fixture_name = "vttest1-3"; - let content = read_fixture(fixture_name); - for byte in content { - vte_parser.advance(&mut grid, byte); - } - assert_snapshot!(format!("{:?}", grid)); -} - -#[test] -fn vttest1_4() { - let mut vte_parser = vte::Parser::new(); - let mut grid = Grid::new(41, 110); - let fixture_name = "vttest1-4"; - let content = read_fixture(fixture_name); - for byte in content { - vte_parser.advance(&mut grid, byte); - } - assert_snapshot!(format!("{:?}", grid)); -} - -#[test] -fn vttest1_5() { - let mut vte_parser = vte::Parser::new(); - let mut grid = Grid::new(41, 110); - let fixture_name = "vttest1-5"; - let content = read_fixture(fixture_name); - for byte in content { - vte_parser.advance(&mut grid, byte); - } - assert_snapshot!(format!("{:?}", grid)); -} +#[path = "./unit/grid_tests.rs"] +mod grid_tests; diff --git a/src/client/panes/unit/grid_tests.rs b/src/client/panes/unit/grid_tests.rs new file mode 100644 index 0000000000..92f5fbdf40 --- /dev/null +++ b/src/client/panes/unit/grid_tests.rs @@ -0,0 +1,85 @@ +use super::super::Grid; +use ::insta::assert_snapshot; + +fn read_fixture(fixture_name: &str) -> Vec { + let mut path_to_file = std::path::PathBuf::new(); + path_to_file.push("src"); + path_to_file.push("tests"); + path_to_file.push("fixtures"); + path_to_file.push(fixture_name); + let content = std::fs::read(path_to_file) + .unwrap_or_else(|_| panic!("could not read fixture {:?}", &fixture_name)); + content +} + +#[test] +fn vttest1_0() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-0"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_1() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-1"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_2() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-2"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_3() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-3"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_4() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-4"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn vttest1_5() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(41, 110); + let fixture_name = "vttest1-5"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_0.snap b/src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_0.snap similarity index 100% rename from src/client/panes/snapshots/zellij__client__panes__grid__vttest1_0.snap rename to src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_0.snap diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_1.snap b/src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_1.snap similarity index 100% rename from src/client/panes/snapshots/zellij__client__panes__grid__vttest1_1.snap rename to src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_1.snap diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_2.snap b/src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_2.snap similarity index 100% rename from src/client/panes/snapshots/zellij__client__panes__grid__vttest1_2.snap rename to src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_2.snap diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_3.snap b/src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_3.snap similarity index 100% rename from src/client/panes/snapshots/zellij__client__panes__grid__vttest1_3.snap rename to src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_3.snap diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_4.snap b/src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_4.snap similarity index 100% rename from src/client/panes/snapshots/zellij__client__panes__grid__vttest1_4.snap rename to src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_4.snap diff --git a/src/client/panes/snapshots/zellij__client__panes__grid__vttest1_5.snap b/src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_5.snap similarity index 100% rename from src/client/panes/snapshots/zellij__client__panes__grid__vttest1_5.snap rename to src/client/panes/unit/snapshots/zellij__client__panes__grid__grid_tests__vttest1_5.snap From 02f548addf74487a35bdbc531842a4133c0475c0 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Thu, 29 Apr 2021 14:21:29 +0200 Subject: [PATCH 3/5] style(fmt): rustfmt --- src/client/panes/grid.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/client/panes/grid.rs b/src/client/panes/grid.rs index c5428815c0..93cbb6e872 100644 --- a/src/client/panes/grid.rs +++ b/src/client/panes/grid.rs @@ -502,8 +502,7 @@ impl Grid { self.viewport .insert(scroll_region_bottom, Row::from_columns(columns).canonical()); } else { - self.viewport - .push(Row::from_columns(columns).canonical()); + self.viewport.push(Row::from_columns(columns).canonical()); } return; } @@ -656,11 +655,15 @@ impl Grid { match self.scroll_region { Some((scroll_region_top, scroll_region_bottom)) => { self.cursor.x = std::cmp::min(self.width - 1, x); - let y_offset = if self.erasure_mode { scroll_region_top } else { 0 }; + let y_offset = if self.erasure_mode { + scroll_region_top + } else { + 0 + }; self.cursor.y = std::cmp::min(scroll_region_bottom, y + y_offset); self.pad_lines_until(self.cursor.y, pad_character); self.pad_current_line_until(self.cursor.x); - }, + } None => { self.cursor.x = std::cmp::min(self.width - 1, x); self.cursor.y = std::cmp::min(self.height - 1, y); From e05a352483202246e3a7c18cd2fba2f834c5a995 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Thu, 29 Apr 2021 15:05:25 +0200 Subject: [PATCH 4/5] fix(grid): correct comment --- src/client/panes/grid.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/panes/grid.rs b/src/client/panes/grid.rs index 93cbb6e872..6bf2eb89ec 100644 --- a/src/client/panes/grid.rs +++ b/src/client/panes/grid.rs @@ -161,7 +161,7 @@ pub struct Grid { pending_styles: CharacterStyles, pub should_render: bool, pub cursor_key_mode: bool, // DECCKM - when set, cursor keys should send ANSI direction codes (eg. "OD") instead of the arrow keys (eg. "") - pub erasure_mode: bool, // ERM - when set, goto should not reach the last line of the scroll region + pub erasure_mode: bool, // ERM pub clear_viewport_before_rendering: bool, pub width: usize, pub height: usize, From 600d2945ec9634db6aabe816f0b3f1de8e1157cf Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Thu, 29 Apr 2021 15:10:18 +0200 Subject: [PATCH 5/5] style(fmt): rustfmt --- src/client/panes/grid.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/panes/grid.rs b/src/client/panes/grid.rs index 6bf2eb89ec..f2bedbceb7 100644 --- a/src/client/panes/grid.rs +++ b/src/client/panes/grid.rs @@ -161,7 +161,7 @@ pub struct Grid { pending_styles: CharacterStyles, pub should_render: bool, pub cursor_key_mode: bool, // DECCKM - when set, cursor keys should send ANSI direction codes (eg. "OD") instead of the arrow keys (eg. "") - pub erasure_mode: bool, // ERM + pub erasure_mode: bool, // ERM pub clear_viewport_before_rendering: bool, pub width: usize, pub height: usize,