Terminal: pass vttest 1 (#408)
* fix(compatibility): pass vttest 1 * fix(tests): move unit tests to a separate file * style(fmt): rustfmt * fix(grid): correct comment * style(fmt): rustfmt
This commit is contained in:
parent
03be8e309e
commit
cedd830a2e
14 changed files with 985 additions and 27 deletions
|
|
@ -161,6 +161,7 @@ pub struct Grid {
|
||||||
pending_styles: CharacterStyles,
|
pending_styles: CharacterStyles,
|
||||||
pub should_render: bool,
|
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. "[D")
|
pub cursor_key_mode: bool, // DECCKM - when set, cursor keys should send ANSI direction codes (eg. "OD") instead of the arrow keys (eg. "[D")
|
||||||
|
pub erasure_mode: bool, // ERM
|
||||||
pub clear_viewport_before_rendering: bool,
|
pub clear_viewport_before_rendering: bool,
|
||||||
pub width: usize,
|
pub width: usize,
|
||||||
pub height: usize,
|
pub height: usize,
|
||||||
|
|
@ -170,9 +171,9 @@ impl Debug for Grid {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
for (i, row) in self.viewport.iter().enumerate() {
|
for (i, row) in self.viewport.iter().enumerate() {
|
||||||
if row.is_canonical {
|
if row.is_canonical {
|
||||||
writeln!(f, "{:?} (C): {:?}", i, row)?;
|
writeln!(f, "{:02?} (C): {:?}", i, row)?;
|
||||||
} else {
|
} else {
|
||||||
writeln!(f, "{:?} (W): {:?}", i, row)?;
|
writeln!(f, "{:02?} (W): {:?}", i, row)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -192,20 +193,20 @@ impl Grid {
|
||||||
pending_styles: CharacterStyles::new(),
|
pending_styles: CharacterStyles::new(),
|
||||||
should_render: true,
|
should_render: true,
|
||||||
cursor_key_mode: false,
|
cursor_key_mode: false,
|
||||||
|
erasure_mode: false,
|
||||||
alternative_lines_above_viewport_and_cursor: None,
|
alternative_lines_above_viewport_and_cursor: None,
|
||||||
clear_viewport_before_rendering: false,
|
clear_viewport_before_rendering: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn advance_to_next_tabstop(&mut self, styles: CharacterStyles) {
|
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_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 =
|
let columns_to_advance =
|
||||||
std::cmp::min(columns_until_next_tabstop, columns_until_screen_end);
|
std::cmp::min(columns_until_next_tabstop, columns_until_screen_end);
|
||||||
let mut empty_character = EMPTY_TERMINAL_CHARACTER;
|
let mut empty_character = EMPTY_TERMINAL_CHARACTER;
|
||||||
empty_character.styles = styles;
|
empty_character.styles = styles;
|
||||||
for _ in 0..columns_to_advance {
|
self.cursor.x += columns_to_advance;
|
||||||
self.add_character(empty_character)
|
self.pad_current_line_until(self.cursor.x);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fn cursor_canonical_line_index(&self) -> usize {
|
fn cursor_canonical_line_index(&self) -> usize {
|
||||||
let mut cursor_canonical_line_index = 0;
|
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) {
|
pub fn add_canonical_line(&mut self) {
|
||||||
if let Some((scroll_region_top, scroll_region_bottom)) = self.scroll_region {
|
if let Some((scroll_region_top, scroll_region_bottom)) = self.scroll_region {
|
||||||
if self.cursor.y == scroll_region_bottom {
|
if self.cursor.y == scroll_region_bottom {
|
||||||
|
|
@ -490,8 +498,12 @@ impl Grid {
|
||||||
}
|
}
|
||||||
self.viewport.remove(scroll_region_top);
|
self.viewport.remove(scroll_region_top);
|
||||||
let columns = vec![EMPTY_TERMINAL_CHARACTER; self.width];
|
let columns = vec![EMPTY_TERMINAL_CHARACTER; self.width];
|
||||||
self.viewport
|
if self.viewport.len() >= scroll_region_bottom {
|
||||||
.insert(scroll_region_bottom, Row::from_columns(columns).canonical());
|
self.viewport
|
||||||
|
.insert(scroll_region_bottom, Row::from_columns(columns).canonical());
|
||||||
|
} else {
|
||||||
|
self.viewport.push(Row::from_columns(columns).canonical());
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -518,13 +530,6 @@ impl Grid {
|
||||||
pub fn move_cursor_to_beginning_of_line(&mut self) {
|
pub fn move_cursor_to_beginning_of_line(&mut self) {
|
||||||
self.cursor.x = 0;
|
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) {
|
pub fn insert_character_at_cursor_position(&mut self, terminal_character: TerminalCharacter) {
|
||||||
match self.viewport.get_mut(self.cursor.y) {
|
match self.viewport.get_mut(self.cursor.y) {
|
||||||
Some(row) => {
|
Some(row) => {
|
||||||
|
|
@ -601,17 +606,13 @@ impl Grid {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn replace_characters_in_line_before_cursor(&mut self, replace_with: TerminalCharacter) {
|
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();
|
let row = self.viewport.get_mut(self.cursor.y).unwrap();
|
||||||
row.replace_beginning_with(line_part);
|
row.replace_beginning_with(line_part);
|
||||||
}
|
}
|
||||||
pub fn clear_all_after_cursor(&mut self, replace_with: TerminalCharacter) {
|
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() {
|
if let Some(cursor_row) = self.viewport.get_mut(self.cursor.y).as_mut() {
|
||||||
cursor_row.truncate(self.cursor.x);
|
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];
|
let replace_with_columns = vec![replace_with; self.width];
|
||||||
self.replace_characters_in_line_after_cursor(replace_with);
|
self.replace_characters_in_line_after_cursor(replace_with);
|
||||||
for row in self.viewport.iter_mut().skip(self.cursor.y + 1) {
|
for row in self.viewport.iter_mut().skip(self.cursor.y + 1) {
|
||||||
|
|
@ -619,6 +620,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) {
|
pub fn clear_cursor_line(&mut self) {
|
||||||
self.viewport.get_mut(self.cursor.y).unwrap().truncate(0);
|
self.viewport.get_mut(self.cursor.y).unwrap().truncate(0);
|
||||||
}
|
}
|
||||||
|
|
@ -642,10 +652,25 @@ impl Grid {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn move_cursor_to(&mut self, x: usize, y: usize, pad_character: TerminalCharacter) {
|
pub fn move_cursor_to(&mut self, x: usize, y: usize, pad_character: TerminalCharacter) {
|
||||||
self.cursor.x = std::cmp::min(self.width - 1, x);
|
match self.scroll_region {
|
||||||
self.cursor.y = std::cmp::min(self.height - 1, y);
|
Some((scroll_region_top, scroll_region_bottom)) => {
|
||||||
self.pad_lines_until(self.cursor.y, pad_character);
|
self.cursor.x = std::cmp::min(self.width - 1, x);
|
||||||
self.pad_current_line_until(self.cursor.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) {
|
pub fn move_cursor_up(&mut self, count: usize) {
|
||||||
self.cursor.y = if self.cursor.y < count {
|
self.cursor.y = if self.cursor.y < count {
|
||||||
|
|
@ -690,6 +715,10 @@ impl Grid {
|
||||||
self.pad_lines_until(self.cursor.y, pad_character);
|
self.pad_lines_until(self.cursor.y, pad_character);
|
||||||
}
|
}
|
||||||
pub fn move_cursor_back(&mut self, count: usize) {
|
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 {
|
if self.cursor.x < count {
|
||||||
self.cursor.x = 0;
|
self.cursor.x = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -827,14 +856,15 @@ impl vte::Perform for Grid {
|
||||||
match byte {
|
match byte {
|
||||||
8 => {
|
8 => {
|
||||||
// backspace
|
// backspace
|
||||||
self.move_cursor_backwards(1);
|
self.move_cursor_back(1);
|
||||||
}
|
}
|
||||||
9 => {
|
9 => {
|
||||||
// tab
|
// tab
|
||||||
self.advance_to_next_tabstop(self.pending_styles);
|
self.advance_to_next_tabstop(self.pending_styles);
|
||||||
}
|
}
|
||||||
10 => {
|
10 | 11 => {
|
||||||
// 0a, newline
|
// 0a, newline
|
||||||
|
// 0b, form-feed
|
||||||
self.add_newline();
|
self.add_newline();
|
||||||
}
|
}
|
||||||
13 => {
|
13 => {
|
||||||
|
|
@ -891,11 +921,13 @@ impl vte::Perform for Grid {
|
||||||
char_to_replace.styles = self.pending_styles;
|
char_to_replace.styles = self.pending_styles;
|
||||||
if params[0] == 0 {
|
if params[0] == 0 {
|
||||||
self.clear_all_after_cursor(char_to_replace);
|
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 {
|
} else if params[0] == 2 {
|
||||||
self.clear_all(char_to_replace);
|
self.clear_all(char_to_replace);
|
||||||
}
|
}
|
||||||
// TODO: implement 1
|
// TODO: implement 1
|
||||||
} else if c == 'H' {
|
} else if c == 'H' || c == 'f' {
|
||||||
// goto row/col
|
// goto row/col
|
||||||
// we subtract 1 from the row/column because these are 1 indexed
|
// we subtract 1 from the row/column because these are 1 indexed
|
||||||
// (except when they are 0, in which case they should be 1
|
// (except when they are 0, in which case they should be 1
|
||||||
|
|
@ -963,6 +995,16 @@ impl vte::Perform for Grid {
|
||||||
Some(&1) => {
|
Some(&1) => {
|
||||||
self.cursor_key_mode = false;
|
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 +1035,16 @@ impl vte::Perform for Grid {
|
||||||
Some(&1) => {
|
Some(&1) => {
|
||||||
self.cursor_key_mode = true;
|
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 +1150,27 @@ impl vte::Perform for Grid {
|
||||||
|
|
||||||
fn esc_dispatch(&mut self, intermediates: &[u8], _ignore: bool, byte: u8) {
|
fn esc_dispatch(&mut self, intermediates: &[u8], _ignore: bool, byte: u8) {
|
||||||
match (byte, intermediates.get(0)) {
|
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) => {
|
(b'M', None) => {
|
||||||
self.move_cursor_up_with_scrolling(1);
|
self.move_cursor_up_with_scrolling(1);
|
||||||
}
|
}
|
||||||
(b'c', None) => {
|
(b'c', None) => {
|
||||||
self.reset_terminal_state();
|
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 +1321,7 @@ impl Cursor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[path = "./unit/grid_tests.rs"]
|
||||||
|
mod grid_tests;
|
||||||
|
|
|
||||||
85
src/client/panes/unit/grid_tests.rs
Normal file
85
src/client/panes/unit/grid_tests.rs
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
use super::super::Grid;
|
||||||
|
use ::insta::assert_snapshot;
|
||||||
|
|
||||||
|
fn read_fixture(fixture_name: &str) -> Vec<u8> {
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
@ -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 <RETURN> 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):
|
||||||
|
|
||||||
|
|
@ -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 <RETURN> 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):
|
||||||
|
|
||||||
|
|
@ -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 <RETURN>
|
||||||
|
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):
|
||||||
|
|
||||||
|
|
@ -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 <RETURN>
|
||||||
|
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):
|
||||||
|
|
||||||
|
|
@ -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 <RETURN>
|
||||||
|
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):
|
||||||
|
|
||||||
|
|
@ -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 <RETURN>
|
||||||
|
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):
|
||||||
|
|
||||||
34
src/tests/fixtures/vttest1-0
vendored
Normal file
34
src/tests/fixtures/vttest1-0
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
[2m⏎(B[m
⏎
[KWelcome to fish, the friendly interactive shell
|
||||||
|
[?2004h]0;fish /home/aram/code/zellij[30m(B[m[97m[46m⋊>(B[m [33m~/c/zellij(B[m on [32mvttest-1(B[m ⨯ [K[44C[38;2;85;85;85m11:25:27(B[m
[72C
[28C
[28Cv[J[73C[38;2;85;85;85m11:25:27(B[m
[102C
[29C[91mv[73C[30m(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[29C[38;2;85;85;85mttest[68C[30m(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[29C[91mt[38;2;85;85;85mtest[68C[30m(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[30C[91mt[38;2;85;85;85mest[68C[30m(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[31C[91me[38;2;85;85;85mst[68C[30m(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[32C[91ms[38;2;85;85;85mt[68C[30m(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[33C[91mt[68C[30m(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[34C[1mvttest[68C(B[m[38;2;85;85;85m11:25:27(B[m
[102C
[34C[68C[38;2;85;85;85m11:25:27(B[m
[102C
[34C
|
||||||
|
[30m(B[m[?2004l]0;vttest /home/aram/code/zellij[30m(B[m
[0c[?1l[?3l[?4l[?5l[?6l[?7h[?8l[?40h[?45l[r[0m[2J[3;10HVT100 test program, version 2.7 (20210210)[4;10HLine speed 38400bd [5;10HChoose test type:
|
||||||
|
[6;1H[0J
|
||||||
|
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
|
||||||
|
[2J[?3l#8[9;10H[1J[18;60H[0J[1K[9;71H[0K[10;10H[1K[10;71H[0K[11;10H[1K[11;71H[0K[12;10H[1K[12;71H[0K[13;10H[1K[13;71H[0K[14;10H[1K[14;71H[0K[15;10H[1K[15;71H[0K[16;10H[1K[16;71H[0K[17;30H[2K[24;1f*[1;1f*[24;2f*[1;2f*[24;3f*[1;3f*[24;4f*[1;4f*[24;5f*[1;5f*[24;6f*[1;6f*[24;7f*[1;7f*[24;8f*[1;8f*[24;9f*[1;9f*[24;10f*[1;10f*[24;11f*[1;11f*[24;12f*[1;12f*[24;13f*[1;13f*[24;14f*[1;14f*[24;15f*[1;15f*[24;16f*[1;16f*[24;17f*[1;17f*[24;18f*[1;18f*[24;19f*[1;19f*[24;20f*[1;20f*[24;21f*[1;21f*[24;22f*[1;22f*[24;23f*[1;23f*[24;24f*[1;24f*[24;25f*[1;25f*[24;26f*[1;26f*[24;27f*[1;27f*[24;28f*[1;28f*[24;29f*[1;29f*[24;30f*[1;30f*[24;31f*[1;31f*[24;32f*[1;32f*[24;33f*[1;33f*[24;34f*[1;34f*[24;35f*[1;35f*[24;36f*[1;36f*[24;37f*[1;37f*[24;38f*[1;38f*[24;39f*[1;39f*[24;40f*[1;40f*[24;41f*[1;41f*[24;42f*[1;42f*[24;43f*[1;43f*[24;44f*[1;44f*[24;45f*[1;45f*[24;46f*[1;46f*[24;47f*[1;47f*[24;48f*[1;48f*[24;49f*[1;49f*[24;50f*[1;50f*[24;51f*[1;51f*[24;52f*[1;52f*[24;53f*[1;53f*[24;54f*[1;54f*[24;55f*[1;55f*[24;56f*[1;56f*[24;57f*[1;57f*[24;58f*[1;58f*[24;59f*[1;59f*[24;60f*[1;60f*[24;61f*[1;61f*[24;62f*[1;62f*[24;63f*[1;63f*[24;64f*[1;64f*[24;65f*[1;65f*[24;66f*[1;66f*[24;67f*[1;67f*[24;68f*[1;68f*[24;69f*[1;69f*[24;70f*[1;70f*[24;71f*[1;71f*[24;72f*[1;72f*[24;73f*[1;73f*[24;74f*[1;74f*[24;75f*[1;75f*[24;76f*[1;76f*[24;77f*[1;77f*[24;78f*[1;78f*[24;79f*[1;79f*[24;80f*[1;80f*[2;2H+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD+[1DD[23;79H+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM+[1DM[2;1H*[2;80H*[10DE*[3;80H*[10DE*[4;80H*[10DE*[5;80H*[10DE*[6;80H*[10DE*[7;80H*[10DE*[8;80H*[10DE*[9;80H*[10DE*[10;80H*[10D
|
||||||
|
*[11;80H*[10D
|
||||||
|
*[12;80H*[10D
|
||||||
|
*[13;80H*[10D
|
||||||
|
*[14;80H*[10D
|
||||||
|
*[15;80H*[10D
|
||||||
|
*[16;80H*[10D
|
||||||
|
*[17;80H*[10D
|
||||||
|
*[18;80H*[10D
|
||||||
|
*[19;80H*[10D
|
||||||
|
*[20;80H*[10D
|
||||||
|
*[21;80H*[10D
|
||||||
|
*[22;80H*[10D
|
||||||
|
*[23;80H*[10D
|
||||||
|
[2;10H[42D[2C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C+[0C[2D[1C[23;70H[42C[2D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D+[1D[1C[0D[1;1H[10A[1A[0A[24;80H[10B[1B[0B[10;12H [1B[58D [1B[58D [1B[58D [1B[58D [1B[58D [1B[58D[5A[1CThe screen should be cleared, and have an unbroken bor-[12;13Hder of *'s and +'s around the edge, and exactly in the[13;13Hmiddle there should be a frame of E's around this text[14;13Hwith one (1) free position around it. Push <RETURN>
|
||||||
48
src/tests/fixtures/vttest1-1
vendored
Normal file
48
src/tests/fixtures/vttest1-1
vendored
Normal file
File diff suppressed because one or more lines are too long
76
src/tests/fixtures/vttest1-2
vendored
Normal file
76
src/tests/fixtures/vttest1-2
vendored
Normal file
File diff suppressed because one or more lines are too long
137
src/tests/fixtures/vttest1-3
vendored
Normal file
137
src/tests/fixtures/vttest1-3
vendored
Normal file
File diff suppressed because one or more lines are too long
112
src/tests/fixtures/vttest1-4
vendored
Normal file
112
src/tests/fixtures/vttest1-4
vendored
Normal file
File diff suppressed because one or more lines are too long
113
src/tests/fixtures/vttest1-5
vendored
Normal file
113
src/tests/fixtures/vttest1-5
vendored
Normal file
File diff suppressed because one or more lines are too long
Loading…
Add table
Reference in a new issue