diff options
-rw-r--r-- | src/screen.rs | 8 | ||||
-rw-r--r-- | tests/text.rs | 60 |
2 files changed, 63 insertions, 5 deletions
diff --git a/src/screen.rs b/src/screen.rs index 1a748e0..7224f6a 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -504,7 +504,13 @@ impl Screen { } } else { cell.set(c.to_string(), attrs); - self.grid_mut().col_inc(width); + self.grid_mut().col_inc(1); + if width > 1 { + let bgcolor = self.attrs.bgcolor; + let next_cell = self.current_cell_mut(); + next_cell.clear(bgcolor); + self.grid_mut().col_inc(1); + } } } diff --git a/tests/text.rs b/tests/text.rs index 24c700e..b23d892 100644 --- a/tests/text.rs +++ b/tests/text.rs @@ -46,9 +46,8 @@ fn newlines() { #[test] fn wide() { let mut parser = vt100::Parser::new(24, 80); - let screen1 = parser.screen().clone(); + let screen = parser.screen().clone(); parser.process("aデbネ".as_bytes()); - let screen2 = parser.screen().clone(); assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "a"); assert_eq!(parser.screen().cell(0, 1).unwrap().contents(), "デ"); assert_eq!(parser.screen().cell(0, 2).unwrap().contents(), ""); @@ -64,10 +63,11 @@ fn wide() { "\x1b[?25h\x1b[H\x1b[Jaデbネ".as_bytes() ); assert_eq!( - parser.screen().contents_diff(&screen1), + parser.screen().contents_diff(&screen), "\x1b[m\x1b[1;1Haデbネ".as_bytes() ); + let screen = parser.screen().clone(); parser.process(b"\x1b[1;1H\x1b[3Cc"); assert_eq!(parser.screen().contents(), "aデcネ"); assert_eq!(parser.screen().cursor_position(), (0, 4)); @@ -76,9 +76,61 @@ fn wide() { "\x1b[?25h\x1b[H\x1b[Jaデcネ\x1b[1;5H".as_bytes() ); assert_eq!( - parser.screen().contents_diff(&screen2), + parser.screen().contents_diff(&screen), "\x1b[m\x1b[1;1H\x1b[3Cc".as_bytes() ); + + let screen = parser.screen().clone(); + parser.process("\x1b[1;7Hfoobar".as_bytes()); + assert_eq!(parser.screen().contents(), "aデcネfoobar"); + assert_eq!(parser.screen().cursor_position(), (0, 12)); + assert_eq!( + parser.screen().contents_formatted(), + "\x1b[?25h\x1b[H\x1b[Jaデcネfoobar".as_bytes() + ); + assert_eq!( + parser.screen().contents_diff(&screen), + "\x1b[m\x1b[1;1H\x1b[6Cfoobar".as_bytes() + ); + + let screen = parser.screen().clone(); + parser.process("\x1b[1;1Hデcネfoobar\x1b[K".as_bytes()); + assert_eq!(parser.screen().contents(), "デcネfoobar"); + assert_eq!(parser.screen().cursor_position(), (0, 11)); + assert_eq!( + parser.screen().contents_formatted(), + "\x1b[?25h\x1b[H\x1b[Jデcネfoobar".as_bytes() + ); + assert_eq!( + parser.screen().contents_diff(&screen), + "\x1b[m\x1b[1;1Hデcネfo\x1b[1Cbar\x1b[X\x1b[C\x1b[1;12H".as_bytes() + ); + + let screen = parser.screen().clone(); + parser.process("\x1b[1;1Haデcネfoobar\x1b[K".as_bytes()); + assert_eq!(parser.screen().contents(), "aデcネfoobar"); + assert_eq!(parser.screen().cursor_position(), (0, 12)); + assert_eq!( + parser.screen().contents_formatted(), + "\x1b[?25h\x1b[H\x1b[Jaデcネfoobar".as_bytes() + ); + assert_eq!( + parser.screen().contents_diff(&screen), + "\x1b[m\x1b[1;1Haデcネf\x1b[1Cobar".as_bytes() + ); + + let screen = parser.screen().clone(); + parser.process("\x1b[1;1Hデcネfoobar\x1b[K".as_bytes()); + assert_eq!(parser.screen().contents(), "デcネfoobar"); + assert_eq!(parser.screen().cursor_position(), (0, 11)); + assert_eq!( + parser.screen().contents_formatted(), + "\x1b[?25h\x1b[H\x1b[Jデcネfoobar".as_bytes() + ); + assert_eq!( + parser.screen().contents_diff(&screen), + "\x1b[m\x1b[1;1Hデcネfo\x1b[1Cbar\x1b[X\x1b[C\x1b[1;12H".as_bytes() + ); } #[test] |