aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-04-28 03:24:44 -0400
committerJesse Luehrs <doy@tozt.net>2016-04-28 03:24:44 -0400
commit33aac534a00cd05499820bb1892c1c9226eb2acc (patch)
treed4104d890e0c88738ae44daaf3421bfa85ab0813
parenta753152bf92f365afa6976293dec0dc03717c091 (diff)
downloadvt100-rust-33aac534a00cd05499820bb1892c1c9226eb2acc.tar.gz
vt100-rust-33aac534a00cd05499820bb1892c1c9226eb2acc.zip
add a bunch of tests
-rw-r--r--tests/control.rs90
-rw-r--r--tests/csi.rs295
-rw-r--r--tests/escape.rs135
-rw-r--r--tests/init.rs43
-rw-r--r--tests/mode.rs209
-rw-r--r--tests/osc.rs51
-rw-r--r--tests/processing.rs66
-rw-r--r--tests/scroll.rs30
-rw-r--r--tests/text.rs94
9 files changed, 1013 insertions, 0 deletions
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");
+}