From 33aac534a00cd05499820bb1892c1c9226eb2acc Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 28 Apr 2016 03:24:44 -0400 Subject: add a bunch of tests --- tests/control.rs | 90 ++++++++++++++++ tests/csi.rs | 295 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/escape.rs | 135 ++++++++++++++++++++++++ tests/init.rs | 43 ++++++++ tests/mode.rs | 209 +++++++++++++++++++++++++++++++++++++ tests/osc.rs | 51 +++++++++ tests/processing.rs | 66 ++++++++++++ tests/scroll.rs | 30 ++++++ tests/text.rs | 94 +++++++++++++++++ 9 files changed, 1013 insertions(+) create mode 100644 tests/control.rs create mode 100644 tests/csi.rs create mode 100644 tests/escape.rs create mode 100644 tests/init.rs create mode 100644 tests/mode.rs create mode 100644 tests/osc.rs create mode 100644 tests/processing.rs create mode 100644 tests/scroll.rs create mode 100644 tests/text.rs diff --git a/tests/control.rs b/tests/control.rs new file mode 100644 index 0000000..837f83c --- /dev/null +++ b/tests/control.rs @@ -0,0 +1,90 @@ +extern crate vt100; + +mod support; +use support::TestHelpers; + +#[test] +fn bel() { + let mut screen = vt100::Screen::new(24, 80); + + assert!(!screen.check_audible_bell()); + + screen.assert_process(b"\x07"); + assert!(screen.check_audible_bell()); + assert!(!screen.check_audible_bell()); +} + +#[test] +fn bs() { + let mut screen = vt100::Screen::new(24, 80); + + screen.assert_process(b"foo\x08\x08aa"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "f"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), "a"); + assert_eq!(screen.cell(0, 2).unwrap().contents(), "a"); + assert_eq!(screen.cell(0, 3).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 0).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "faa\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.assert_process(b"\r\nquux\x08\x08\x08\x08\x08\x08bar"); + assert_eq!(screen.cell(1, 0).unwrap().contents(), "b"); + assert_eq!(screen.cell(1, 1).unwrap().contents(), "a"); + assert_eq!(screen.cell(1, 2).unwrap().contents(), "r"); + assert_eq!(screen.cell(1, 3).unwrap().contents(), "x"); + assert_eq!(screen.cell(1, 4).unwrap().contents(), ""); + assert_eq!(screen.cell(2, 0).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "faa\nbarx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn tab() { + let mut screen = vt100::Screen::new(24, 80); + + screen.assert_process(b"foo\tbar"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "f"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), "o"); + assert_eq!(screen.cell(0, 2).unwrap().contents(), "o"); + assert_eq!(screen.cell(0, 3).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 4).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 5).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 6).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 7).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 8).unwrap().contents(), "b"); + assert_eq!(screen.cell(0, 9).unwrap().contents(), "a"); + assert_eq!(screen.cell(0, 10).unwrap().contents(), "r"); + assert_eq!(screen.cell(0, 11).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foo bar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn lf() { + let mut screen = vt100::Screen::new(24, 80); + + screen.assert_process(b"foo\nbar"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "f"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), "o"); + assert_eq!(screen.cell(0, 2).unwrap().contents(), "o"); + assert_eq!(screen.cell(0, 3).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 0).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 1).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 2).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 3).unwrap().contents(), "b"); + assert_eq!(screen.cell(1, 4).unwrap().contents(), "a"); + assert_eq!(screen.cell(1, 5).unwrap().contents(), "r"); + assert_eq!(screen.cell(1, 6).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n bar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn cr() { + let mut screen = vt100::Screen::new(24, 80); + + screen.assert_process(b"fooo\rbar"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "b"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), "a"); + assert_eq!(screen.cell(0, 2).unwrap().contents(), "r"); + assert_eq!(screen.cell(0, 3).unwrap().contents(), "o"); + assert_eq!(screen.cell(0, 4).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 0).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "baro\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} diff --git a/tests/csi.rs b/tests/csi.rs new file mode 100644 index 0000000..d525262 --- /dev/null +++ b/tests/csi.rs @@ -0,0 +1,295 @@ +extern crate vt100; + +mod support; +use support::TestHelpers; + +#[test] +fn absolute_movement() { + let mut screen = vt100::Screen::new(24, 80); + assert_eq!(screen.cursor_position(), (0, 0)); + + screen.assert_process(b"\x1b[10;10H"); + assert_eq!(screen.cursor_position(), (9, 9)); + + screen.assert_process(b"\x1b[d"); + assert_eq!(screen.cursor_position(), (0, 9)); + + screen.assert_process(b"\x1b[15d"); + assert_eq!(screen.cursor_position(), (14, 9)); + + screen.assert_process(b"\x1b[H"); + assert_eq!(screen.cursor_position(), (0, 0)); + + screen.assert_process(b"\x1b[8H"); + assert_eq!(screen.cursor_position(), (7, 0)); + + screen.assert_process(b"\x1b[15G"); + assert_eq!(screen.cursor_position(), (7, 14)); + + screen.assert_process(b"\x1b[G"); + assert_eq!(screen.cursor_position(), (7, 0)); + + screen.assert_process(b"\x1b[0;0H"); + assert_eq!(screen.cursor_position(), (0, 0)); + + screen.assert_process(b"\x1b[1;1H"); + assert_eq!(screen.cursor_position(), (0, 0)); + + screen.assert_process(b"\x1b[500;500H"); + assert_eq!(screen.cursor_position(), (23, 79)); +} + +#[test] +fn relative_movement() { + let mut screen = vt100::Screen::new(24, 80); + assert_eq!(screen.cursor_position(), (0, 0)); + + screen.assert_process(b"\x1b[C"); + assert_eq!(screen.cursor_position(), (0, 1)); + + screen.assert_process(b"\x1b[C"); + assert_eq!(screen.cursor_position(), (0, 2)); + + screen.assert_process(b"\x1b[20C"); + assert_eq!(screen.cursor_position(), (0, 22)); + + screen.assert_process(b"\x1b[D"); + assert_eq!(screen.cursor_position(), (0, 21)); + + screen.assert_process(b"\x1b[D"); + assert_eq!(screen.cursor_position(), (0, 20)); + + screen.assert_process(b"\x1b[9D"); + assert_eq!(screen.cursor_position(), (0, 11)); + + screen.assert_process(b"\x1b[500C"); + assert_eq!(screen.cursor_position(), (0, 79)); + + screen.assert_process(b"\x1b[500D"); + assert_eq!(screen.cursor_position(), (0, 0)); + + screen.assert_process(b"\x1b[B"); + assert_eq!(screen.cursor_position(), (1, 0)); + + screen.assert_process(b"\x1b[B"); + assert_eq!(screen.cursor_position(), (2, 0)); + + screen.assert_process(b"\x1b[20B"); + assert_eq!(screen.cursor_position(), (22, 0)); + + screen.assert_process(b"\x1b[A"); + assert_eq!(screen.cursor_position(), (21, 0)); + + screen.assert_process(b"\x1b[A"); + assert_eq!(screen.cursor_position(), (20, 0)); + + screen.assert_process(b"\x1b[9A"); + assert_eq!(screen.cursor_position(), (11, 0)); + + screen.assert_process(b"\x1b[500B"); + assert_eq!(screen.cursor_position(), (23, 0)); + + screen.assert_process(b"\x1b[500A"); + assert_eq!(screen.cursor_position(), (0, 0)); +} + +#[test] +fn ed() { + let mut screen = vt100::Screen::new(24, 80); + 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.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux"); + 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.assert_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.assert_process(b"\x1b[5;7H\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"); + + screen.assert_process(b"\x1b[7;7H\x1b[2J"); + 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.assert_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.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux"); + 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.assert_process(b"\x1b[10;12H\x1b[J"); + 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.assert_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.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux"); + 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.assert_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.assert_process(b"\x1b[5;7H\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"); + + screen.assert_process(b"\x1b[7;7H\x1b[?2J"); + 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.assert_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.assert_process(b"foo\x1b[5;5Hbar\x1b[10;10Hbaz\x1b[20;20Hquux"); + 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.assert_process(b"\x1b[10;12H\x1b[?J"); + 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"); +} + +#[test] +fn el() { + let mut screen = vt100::Screen::new(24, 80); + 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.assert_process(b"foo\x1b[5;5Hbarbar\x1b[10;10Hbazbaz\x1b[20;20Hquux"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n barbar\n\n\n\n\n bazbaz\n\n\n\n\n\n\n\n\n\n quux\n\n\n\n\n"); + + screen.assert_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.assert_process(b"\x1b[10;13H\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.assert_process(b"\x1b[20;22H\x1b[2K"); + 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\n\n\n\n\n"); + + screen.assert_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.assert_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.assert_process(b"foo\x1b[5;5Hbarbar\x1b[10;10Hbazbaz\x1b[20;20Hquux"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n barbar\n\n\n\n\n bazbaz\n\n\n\n\n\n\n\n\n\n quux\n\n\n\n\n"); + + screen.assert_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.assert_process(b"\x1b[10;13H\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.assert_process(b"\x1b[20;22H\x1b[?2K"); + 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\n\n\n\n\n"); + + screen.assert_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"); +} + +#[test] +fn ich_dch_ech() { + let mut screen = vt100::Screen::new(24, 80); + 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.assert_process(b"\x1b[10;10Hfoobar"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + + screen.assert_process(b"\x1b[10;12H\x1b[3@"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n fo obar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 11)); + + screen.assert_process(b"\x1b[4P"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n fobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 11)); + + screen.assert_process(b"\x1b[100@"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n fo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 11)); + + screen.assert_process(b"obar"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 15)); + + screen.assert_process(b"\x1b[10;12H\x1b[100P"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n fo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 11)); + + screen.assert_process(b"obar"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 15)); + + screen.assert_process(b"\x1b[10;13H\x1b[X"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n foo ar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 12)); + + screen.assert_process(b"\x1b[10;11H\x1b[4X"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n f r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 10)); + + screen.assert_process(b"\x1b[10;11H\x1b[400X"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n f\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 10)); +} + +#[test] +fn il_dl() { + let mut screen = vt100::Screen::new(24, 80); + 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.assert_process(b"\x1b[10;10Hfoobar\x1b[3D"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 12)); + + screen.assert_process(b"\x1b[L"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 12)); + + screen.assert_process(b"\x1b[3L"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (9, 12)); + + screen.assert_process(b"\x1b[500L"); + 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"); + assert_eq!(screen.cursor_position(), (9, 12)); + + screen.assert_process(b"\x1b[10;10Hfoobar\x1b[3D\x1b[6A"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (3, 12)); + + screen.assert_process(b"\x1b[M"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (3, 12)); + + screen.assert_process(b"\x1b[3M"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n foobar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (3, 12)); + + screen.assert_process(b"\x1b[500M"); + 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"); + assert_eq!(screen.cursor_position(), (3, 12)); +} + +#[test] +fn scroll() { + let mut screen = vt100::Screen::new(24, 80); + 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.assert_process(b"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n"); + + screen.assert_process(b"\x1b[15;15H"); + assert_eq!(screen.cursor_position(), (14, 14)); + + screen.assert_process(b"\x1b[S"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n\n"); + assert_eq!(screen.cursor_position(), (14, 14)); + + screen.assert_process(b"\x1b[3S"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n\n\n\n\n"); + assert_eq!(screen.cursor_position(), (14, 14)); + + screen.assert_process(b"\x1b[T"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n\n\n\n"); + assert_eq!(screen.cursor_position(), (14, 14)); + + screen.assert_process(b"\x1b[5T"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "\n\n\n\n\n\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n"); + assert_eq!(screen.cursor_position(), (14, 14)); +} diff --git a/tests/escape.rs b/tests/escape.rs new file mode 100644 index 0000000..acbad5c --- /dev/null +++ b/tests/escape.rs @@ -0,0 +1,135 @@ +extern crate vt100; + +mod support; +use support::TestHelpers; + +#[test] +fn deckpam() { + let mut screen = vt100::Screen::new(24, 80); + assert!(!screen.application_keypad()); + screen.assert_process(b"\x1b="); + assert!(screen.application_keypad()); + screen.assert_process(b"\x1b>"); + assert!(!screen.application_keypad()); +} + +#[test] +fn ri() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"foo\nbar\x1bMbaz"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foo baz\n bar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn ris() { + let mut screen = vt100::Screen::new(24, 80); + assert_eq!(screen.cursor_position(), (0, 0)); + + let cell = screen.cell(0, 0).unwrap(); + assert_eq!(cell.contents(), ""); + + 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"); + assert_eq!(screen.window_contents_formatted(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"); + + assert_eq!(screen.title(), None); + assert_eq!(screen.icon_name(), None); + + assert_eq!(screen.fgcolor(), vt100::Color::ColorDefault); + assert_eq!(screen.bgcolor(), vt100::Color::ColorDefault); + + assert!(!screen.bold()); + assert!(!screen.italic()); + assert!(!screen.underline()); + assert!(!screen.inverse()); + + assert!(!screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + assert!(!screen.check_visual_bell()); + assert!(!screen.check_audible_bell()); + + screen.assert_process(b"f\x1b[31m\x1b[47;1;3;4moo\x1b[7m\x1b[21;21H\x1b]2;window title\x07\x1b]1;window icon name\x07\x1b[?25l\x1b[?1h\x1b=\x1b[?9h\x1b[?1000h\x1b[?1002h\x1b[?1006h\x1b[?2004h\x07\x1bg"); + + assert_eq!(screen.cursor_position(), (20, 20)); + + let cell = screen.cell(0, 0).unwrap(); + assert_eq!(cell.contents(), "f"); + + assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.window_contents_formatted(0, 0, 23, 79), "f\x1b[31;47;1;3;4moo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + + assert_eq!(screen.title().unwrap(), "window title"); + assert_eq!(screen.icon_name().unwrap(), "window icon name"); + + assert_eq!(screen.fgcolor(), vt100::Color::ColorIdx(1)); + assert_eq!(screen.bgcolor(), vt100::Color::ColorIdx(7)); + + assert!(screen.bold()); + assert!(screen.italic()); + assert!(screen.underline()); + assert!(screen.inverse()); + + assert!(screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + assert!(screen.check_visual_bell()); + assert!(screen.check_audible_bell()); + + screen.assert_process(b"\x1bc"); + assert_eq!(screen.cursor_position(), (0, 0)); + + let cell = screen.cell(0, 0).unwrap(); + assert_eq!(cell.contents(), ""); + + 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"); + assert_eq!(screen.window_contents_formatted(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"); + + // title and icon name don't change with reset + assert_eq!(screen.title().unwrap(), "window title"); + assert_eq!(screen.icon_name().unwrap(), "window icon name"); + + assert_eq!(screen.fgcolor(), vt100::Color::ColorDefault); + assert_eq!(screen.bgcolor(), vt100::Color::ColorDefault); + + assert!(!screen.bold()); + assert!(!screen.italic()); + assert!(!screen.underline()); + assert!(!screen.inverse()); + + assert!(!screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + assert!(!screen.check_visual_bell()); + assert!(!screen.check_audible_bell()); +} + +#[test] +fn vb() { + let mut screen = vt100::Screen::new(24, 80); + assert!(!screen.check_visual_bell()); + screen.assert_process(b"\x1bg"); + assert!(screen.check_visual_bell()); + assert!(!screen.check_visual_bell()); +} + +#[test] +fn decsc() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"foo\x1b7\r\n\r\n\r\n bar\x1b8baz"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foobaz\n\n\n bar\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} diff --git a/tests/init.rs b/tests/init.rs new file mode 100644 index 0000000..eb71a43 --- /dev/null +++ b/tests/init.rs @@ -0,0 +1,43 @@ +extern crate vt100; + +#[test] +fn init() { + let screen = vt100::Screen::new(24, 80); + assert_eq!(screen.rows(), 24); + assert_eq!(screen.cols(), 80); + assert_eq!(screen.cursor_position(), (0, 0)); + + let cell = screen.cell(0, 0); + assert_eq!(cell.unwrap().contents(), ""); + let cell = screen.cell(23, 79); + assert_eq!(cell.unwrap().contents(), ""); + let cell = screen.cell(24, 0); + assert!(cell.is_none()); + let cell = screen.cell(0, 80); + assert!(cell.is_none()); + + 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"); + assert_eq!(screen.window_contents_formatted(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"); + + assert_eq!(screen.title(), None); + assert_eq!(screen.icon_name(), None); + + assert_eq!(screen.fgcolor(), vt100::Color::ColorDefault); + assert_eq!(screen.bgcolor(), vt100::Color::ColorDefault); + + assert!(!screen.bold()); + assert!(!screen.italic()); + assert!(!screen.underline()); + assert!(!screen.inverse()); + + assert!(!screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + assert!(!screen.check_visual_bell()); + assert!(!screen.check_audible_bell()); +} diff --git a/tests/mode.rs b/tests/mode.rs new file mode 100644 index 0000000..19658b2 --- /dev/null +++ b/tests/mode.rs @@ -0,0 +1,209 @@ +extern crate vt100; + +mod support; +use support::TestHelpers; + +#[test] +fn modes() { + let mut screen = vt100::Screen::new(24, 80); + assert!(!screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1h"); + + assert!(!screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?9h"); + + assert!(!screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?25l"); + + assert!(screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1000h"); + + assert!(screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1002h"); + + assert!(screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1006h"); + + assert!(screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?2004h"); + + assert!(screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b="); + + assert!(screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1l"); + + assert!(screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?9l"); + + assert!(screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?25h"); + + assert!(!screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1000l"); + + assert!(!screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1002l"); + + assert!(!screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?1006l"); + + assert!(!screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(screen.bracketed_paste()); + + screen.assert_process(b"\x1b[?2004l"); + + assert!(!screen.hide_cursor()); + assert!(screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); + + screen.assert_process(b"\x1b>"); + + assert!(!screen.hide_cursor()); + assert!(!screen.application_keypad()); + assert!(!screen.application_cursor()); + assert!(!screen.mouse_reporting_press()); + assert!(!screen.mouse_reporting_press_release()); + assert!(!screen.mouse_reporting_button_motion()); + assert!(!screen.mouse_reporting_sgr_mode()); + assert!(!screen.bracketed_paste()); +} + +#[test] +fn alternate_buffer() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"\x1b[m\x1b[2J\x1b[H1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n"); + assert!(!screen.alternate_buffer_active()); + screen.assert_process(b"\x1b[?1049h"); + 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"); + assert!(screen.alternate_buffer_active()); + screen.assert_process(b"foobar"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foobar\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.assert_process(b"\x1b[?1049l"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n"); + assert!(!screen.alternate_buffer_active()); +} diff --git a/tests/osc.rs b/tests/osc.rs new file mode 100644 index 0000000..59ab943 --- /dev/null +++ b/tests/osc.rs @@ -0,0 +1,51 @@ +extern crate vt100; + +mod support; +use support::TestHelpers; + +#[test] +fn title() { + let mut screen = vt100::Screen::new(24, 80); + assert!(screen.title().is_none()); + assert!(screen.icon_name().is_none()); + screen.assert_process(b"\x1b]2;it's a title\x07"); + assert_eq!(screen.title().unwrap(), "it's a title"); + assert!(screen.icon_name().is_none()); + screen.assert_process(b"\x1b]2;\x07"); + assert_eq!(screen.title().unwrap(), ""); + assert!(screen.icon_name().is_none()); +} + +#[test] +fn icon_name() { + let mut screen = vt100::Screen::new(24, 80); + assert!(screen.title().is_none()); + assert!(screen.icon_name().is_none()); + screen.assert_process(b"\x1b]1;it's an icon name\x07"); + assert!(screen.title().is_none()); + assert_eq!(screen.icon_name().unwrap(), "it's an icon name"); + screen.assert_process(b"\x1b]1;\x07"); + assert!(screen.title().is_none()); + assert_eq!(screen.icon_name().unwrap(), ""); +} + +#[test] +fn title_icon_name() { + let mut screen = vt100::Screen::new(24, 80); + assert!(screen.title().is_none()); + assert!(screen.icon_name().is_none()); + screen.assert_process(b"\x1b]0;it's both\x07"); + assert_eq!(screen.title().unwrap(), "it's both"); + assert_eq!(screen.icon_name().unwrap(), "it's both"); + screen.assert_process(b"\x1b]0;\x07"); + assert_eq!(screen.title().unwrap(), ""); + assert_eq!(screen.icon_name().unwrap(), ""); +} + +#[test] +fn unknown_sequence() { + let mut screen = vt100::Screen::new(24, 80); + assert_eq!(screen.cell(0, 0).unwrap().contents(), ""); + screen.assert_process(b"\x1b]499;some long, long string?\x07"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), ""); +} diff --git a/tests/processing.rs b/tests/processing.rs new file mode 100644 index 0000000..02c2766 --- /dev/null +++ b/tests/processing.rs @@ -0,0 +1,66 @@ +extern crate vt100; + +#[test] +fn split_escape_sequences() { + let mut screen = vt100::Screen::new(24, 80); + assert_eq!(screen.process(b"abc"), 3); + assert_eq!(screen.process(b"abc\x1b[12;24Hdef"), 14); + + assert_eq!(screen.process(b"\x1b"), 0); + assert_eq!(screen.process(b"\x1b["), 0); + assert_eq!(screen.process(b"\x1b[1"), 0); + assert_eq!(screen.process(b"\x1b[12"), 0); + assert_eq!(screen.process(b"\x1b[12;"), 0); + assert_eq!(screen.process(b"\x1b[12;2"), 0); + assert_eq!(screen.process(b"\x1b[12;24"), 0); + assert_eq!(screen.process(b"\x1b[12;24H"), 8); + + assert_eq!(screen.process(b"abc\x1b"), 3); + assert_eq!(screen.process(b"abc\x1b["), 3); + assert_eq!(screen.process(b"abc\x1b[1"), 3); + assert_eq!(screen.process(b"abc\x1b[12"), 3); + assert_eq!(screen.process(b"abc\x1b[12;"), 3); + assert_eq!(screen.process(b"abc\x1b[12;2"), 3); + assert_eq!(screen.process(b"abc\x1b[12;24"), 3); + assert_eq!(screen.process(b"abc\x1b[12;24H"), 11); + + assert_eq!(screen.process(b"\x1b"), 0); + assert_eq!(screen.process(b"\x1b["), 0); + assert_eq!(screen.process(b"\x1b[?"), 0); + assert_eq!(screen.process(b"\x1b[?1"), 0); + assert_eq!(screen.process(b"\x1b[?10"), 0); + assert_eq!(screen.process(b"\x1b[?100"), 0); + assert_eq!(screen.process(b"\x1b[?1000"), 0); + assert_eq!(screen.process(b"\x1b[?1000h"), 8); + + assert_eq!(screen.process(b"\x1b]"), 0); + assert_eq!(screen.process(b"\x1b]4"), 0); + assert_eq!(screen.process(b"\x1b]49"), 0); + assert_eq!(screen.process(b"\x1b]499"), 0); + assert_eq!(screen.process(b"\x1b]499;"), 0); + assert_eq!(screen.process(b"\x1b]499;a"), 0); + assert_eq!(screen.process(b"\x1b]499;a "), 0); + assert_eq!(screen.process(b"\x1b]499;a '"), 0); + assert_eq!(screen.process(b"\x1b]499;a '["), 0); + assert_eq!(screen.process(b"\x1b]499;a '[]"), 0); + assert_eq!(screen.process(b"\x1b]499;a '[]_"), 0); + assert_eq!(screen.process(b"\x1b]499;a '[]_\x07"), 13); +} + +#[test] +fn split_utf8() { + let mut screen = vt100::Screen::new(24, 80); + assert_eq!(screen.process(b"a"), 1); + + assert_eq!(screen.process(b"\xc3"), 0); + assert_eq!(screen.process(b"\xc3\xa1"), 2); + + assert_eq!(screen.process(b"\xe3"), 0); + assert_eq!(screen.process(b"\xe3\x82"), 0); + assert_eq!(screen.process(b"\xe3\x82\xad"), 3); + + assert_eq!(screen.process(b"\xf0"), 0); + assert_eq!(screen.process(b"\xf0\x9f"), 0); + assert_eq!(screen.process(b"\xf0\x9f\x92"), 0); + assert_eq!(screen.process(b"\xf0\x9f\x92\xa9"), 4); +} diff --git a/tests/scroll.rs b/tests/scroll.rs new file mode 100644 index 0000000..b5a8891 --- /dev/null +++ b/tests/scroll.rs @@ -0,0 +1,30 @@ +extern crate vt100; + +mod support; +use support::TestHelpers; + +#[test] +fn scroll_regions() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"\x1b[m\x1b[2J\x1b[H1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n"); + + screen.assert_process(b"\x1b[24;50H\n"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n\n"); + + screen.assert_process(b"\x1b[m\x1b[2J\x1b[H1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24"); + screen.assert_process(b"\x1b[10;20r\x1b[20;50H\n"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n\n21\n22\n23\n24\n"); + assert_eq!(screen.cursor_position(), (19, 49)); + + screen.assert_process(b"\x1b[B"); + assert_eq!(screen.cursor_position(), (19, 49)); + + screen.assert_process(b"\x1b[20A"); + assert_eq!(screen.cursor_position(), (9, 49)); + screen.assert_process(b"\x1b[1;24r\x1b[m\x1b[2J\x1b[H1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24"); + screen.assert_process(b"\x1b[10;20r\x1b[15;50H\x1b[2L"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n\n\n15\n16\n17\n18\n21\n22\n23\n24\n"); + screen.assert_process(b"\x1b[10;50H\x1bM"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "1\n2\n3\n4\n5\n6\n7\n8\n9\n\n10\n11\n12\n13\n14\n\n\n15\n16\n17\n21\n22\n23\n24\n"); +} diff --git a/tests/text.rs b/tests/text.rs new file mode 100644 index 0000000..73a0398 --- /dev/null +++ b/tests/text.rs @@ -0,0 +1,94 @@ +extern crate vt100; + +mod support; +use support::TestHelpers; + +#[test] +fn ascii() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"foo"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "f"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), "o"); + assert_eq!(screen.cell(0, 2).unwrap().contents(), "o"); + assert_eq!(screen.cell(0, 3).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 0).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "foo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.window_contents(0, 0, 500, 500), "foo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn utf8() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process("café".as_bytes()); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "c"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), "a"); + assert_eq!(screen.cell(0, 2).unwrap().contents(), "f"); + assert_eq!(screen.cell(0, 3).unwrap().contents(), "é"); + assert_eq!(screen.cell(0, 4).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 0).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "café\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.window_contents(0, 0, 500, 500), "café\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn newlines() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"f\r\noo\r\nood"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "f"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 2).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 0).unwrap().contents(), "o"); + assert_eq!(screen.cell(1, 1).unwrap().contents(), "o"); + assert_eq!(screen.cell(1, 2).unwrap().contents(), ""); + assert_eq!(screen.cell(2, 0).unwrap().contents(), "o"); + assert_eq!(screen.cell(2, 1).unwrap().contents(), "o"); + assert_eq!(screen.cell(2, 2).unwrap().contents(), "d"); + assert_eq!(screen.cell(0, 3).unwrap().contents(), ""); + assert_eq!(screen.cell(3, 0).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "f\noo\nood\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.window_contents(0, 0, 500, 500), "f\noo\nood\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn wide() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process("aデbネ".as_bytes()); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "a"); + assert_eq!(screen.cell(0, 1).unwrap().contents(), "デ"); + assert_eq!(screen.cell(0, 2).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 3).unwrap().contents(), "b"); + assert_eq!(screen.cell(0, 4).unwrap().contents(), "ネ"); + assert_eq!(screen.cell(0, 5).unwrap().contents(), ""); + assert_eq!(screen.cell(0, 6).unwrap().contents(), ""); + assert_eq!(screen.cell(1, 0).unwrap().contents(), ""); + assert_eq!(screen.window_contents(0, 0, 23, 79), "aデbネ\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + assert_eq!(screen.window_contents(0, 0, 500, 500), "aデbネ\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} + +#[test] +fn combining() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"a"); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "a"); + screen.assert_process("\u{0301}".as_bytes()); + assert_eq!(screen.cell(0, 0).unwrap().contents(), "á"); + screen.assert_process(b"\x1b[20;20Habcdefg"); + assert_eq!(screen.window_contents(19, 19, 19, 26), "abcdefg"); + screen.assert_process("\x1b[20;25H\u{0301}".as_bytes()); + assert_eq!(screen.window_contents(19, 19, 19, 26), "abcdéfg"); + screen.assert_process(b"\x1b[10;78Haaa"); + assert_eq!(screen.cell(9, 79).unwrap().contents(), "a"); + screen.assert_process("\r\n\u{0301}".as_bytes()); + assert_eq!(screen.cell(9, 79).unwrap().contents(), "a"); + assert_eq!(screen.cell(10, 0).unwrap().contents(), ""); +} + +#[test] +fn wrap() { + let mut screen = vt100::Screen::new(24, 80); + screen.assert_process(b"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + screen.assert_process(b"\x1b[5H01234567890123456789012345678901234567890123456789012345678901234567890123456789"); + screen.assert_process(b"\x1b[6H01234567890123456789012345678901234567890123456789012345678901234567890123456789"); + assert_eq!(screen.window_contents(0, 0, 23, 79), "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n\n\n01234567890123456789012345678901234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789012345678901234567890123456789\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +} -- cgit v1.2.3