* refactor: Simplify transfer_rows_from_viewport_to_lines_above next_lines is always consolidated to a single Row, which immediately gets removed - we can remove some dead code as a result * perf: Batch remove rows from the viewport for performance Given a 1MB line catted into the terminal, a toggle-fullscreen + toggle-fullscreen + close-pane + `run true` goes from ~9s to ~3s * perf: Optimize Row::drain_until by splitting chars in one step Given a 10MB line catted into the terminal, a toggle-fullscreen + toggle-fullscreen + close-pane + `run true` goes from ~23s to ~20s * refactor: Simplify `if let` into a `.map` * refactor: There are only new saved coordinates when there were old ones * refactor: Unify viewport transfer: use common variable names * fix: Use same saved cursor logic in height resize as width See #2182 for original introduction that only added it in one branch, this fixes an issue where the saved cursor was incorrectly reset when the real cursor was * fix: Correct saved+real cursor calculations when reflowing long lines * fix: Don't create canonical lines if cursor ends on EOL after resize Previously if a 20 character line were split into two 10 character lines, the cursor would be placed on the line after the two lines. New characters would then be treated as a new canonical line. This commit fixes this by biasing cursors to the end of the previous line. * fix: for cursor index calculation in lines that are already wrapped * chore: test for real/saved cursor position being handled separately * chore: Apply cargo format * chore(repo): update issue templates * Bump rust version to 1.75.0 (#3039) * rust-toolchain: Bump toolchain version to 1.69.0 which, compared to the previous 1.67.0, has the following impacts on `zellij`: - [Turn off debuginfo for build deps][2]: Increases build time (on my machine) from ~230 s in 1.67.0 to ~250 s now, *which is unexpected* This version also changes [handling of the `default-features` flag][3] when specifying dependencies in `Cargo.toml`. If a dependent crate requires `default-features = true` on a crate that is required as `default-features = false` further up the dependency tree, the `true` setting "wins". We only specify `default-features = false` for three crates total: - `names`: This is used only by us - `surf`: This is used only by us - `vte`: This is also required by `strip-ansi-escapes`, but that has `default-features = false` as well How this affects our transitive dependencies is unknown at this point. [2]: https://github.com/rust-lang/cargo/pull/11252/ [3]: https://github.com/rust-lang/cargo/pull/11409/ * rust-toolchain: Bump toolchain version to 1.70.0 which, compared to the previous 1.69.0, as the following impacts on `zellij`: 1. [Enable sparse registry checkout for crates.io by default][1] This drastically increases the time to first build on a fresh rust installation/a rust installation with a clean cargo registry cache. Previously it took about 75s to populate the deps/cache (with `cargo fetch --locked` and ~100 MBit/s network), whereas now the same process takes ~10 s. 2. [The `OnceCell` type is now part of std][2] In theory, this would allow us to cut a dependency from `zellij-utils`, but the `once_cell` crate is pulled in by another 16 deps, so there's no point in attempting it right now. Build times and binary sizes are unaffected by this change compared to the previous 1.69.0 toolchain. [1]: https://github.com/rust-lang/cargo/pull/11791/ [2]: https://doc.rust-lang.org/stable/std/cell/struct.OnceCell.html * rust-toolchain: Bump toolchain version to 1.75.0 which, compared to the previous 1.70.0, has the following impacts on `zellij`: 1. [cross-crate inlining][8] This should increase application performance, as functions can now be inlined across crates. 2. [`async fn` in traits][9] This would allow us to drop the `async_trait` dependency, but it is currently still required by 3 other dependencies. Build time in debug mode (on my own PC) is cut down from 256s to 189s (for a clean build). Build time in release mode is cut down from 473s to 391s (for a clean build). Binary sizes only change minimally (825 MB -> 807 MB in debug, 29 MB -> 30 MB in release). [8]: https://github.com/rust-lang/rust/pull/116505 [9]: https://github.com/rust-lang/rust/pull/115822/ * chore: Apply rustfmt. * CHANGELOG: Add PR #3039. * feat(plugins): introduce 'pipes', allowing users to pipe data to and control plugins from the command line (#3066) * prototype - working with message from the cli * prototype - pipe from the CLI to plugins * prototype - pipe from the CLI to plugins and back again * prototype - working with better cli interface * prototype - working after removing unused stuff * prototype - working with launching plugin if it is not launched, also fixed event ordering * refactor: change message to cli-message * prototype - allow plugins to send messages to each other * fix: allow cli messages to send plugin parameters (and implement backpressure) * fix: use input_pipe_id to identify cli pipes instead of their message name * fix: come cleanups and add skip_cache parameter * fix: pipe/client-server communication robustness * fix: leaking messages between plugins while loading * feat: allow plugins to specify how a new plugin instance is launched when sending messages * fix: add permissions * refactor: adjust cli api * fix: improve cli plugin loading error messages * docs: cli pipe * fix: take plugin configuration into account when messaging between plugins * refactor: pipe message protobuf interface * refactor: update(event) -> pipe * refactor - rename CliMessage to CliPipe * fix: add is_private to pipes and change some naming * refactor - cli client * refactor: various cleanups * style(fmt): rustfmt * fix(pipes): backpressure across multiple plugins * style: some cleanups * style(fmt): rustfmt * style: fix merge conflict mistake * style(wording): clarify pipe permission * docs(changelog): introduce pipes * fix: add some robustness and future proofing * fix e2e tests --------- Co-authored-by: Aram Drevekenin <aram@poor.dev> Co-authored-by: har7an <99636919+har7an@users.noreply.github.com>
3638 lines
113 KiB
Rust
3638 lines
113 KiB
Rust
use super::super::Grid;
|
|
use crate::panes::grid::SixelImageStore;
|
|
use crate::panes::link_handler::LinkHandler;
|
|
use ::insta::assert_snapshot;
|
|
use std::cell::RefCell;
|
|
use std::collections::HashMap;
|
|
use std::rc::Rc;
|
|
use zellij_utils::{
|
|
data::{Palette, Style},
|
|
pane_size::SizeInPixels,
|
|
position::Position,
|
|
vte,
|
|
};
|
|
|
|
use std::fmt::Write;
|
|
|
|
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);
|
|
std::fs::read(path_to_file)
|
|
.unwrap_or_else(|_| panic!("could not read fixture {:?}", &fixture_name))
|
|
}
|
|
|
|
#[test]
|
|
fn vttest1_0() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
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 sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
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 sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
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 sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
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 sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
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 sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
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));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_0() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-0";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_1() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-1";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_2() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-2";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_3() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-3";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_4() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-4";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_5() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-5";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_6() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-6";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_7() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-7";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_8() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-8";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_9() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-9";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_10() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-10";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_11() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-11";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_12() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-12";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_13() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-13";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest2_14() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest2-14";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest3_0() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest3-0";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest8_0() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest8-0";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest8_1() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest8-1";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest8_2() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest8-2";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest8_3() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest8-3";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest8_4() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest8-4";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn vttest8_5() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vttest8-5";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn csi_b() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "csi-b";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn csi_capital_i() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "csi-capital-i";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn csi_capital_z() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "csi-capital-z";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn terminal_reports() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "terminal_reports";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid.pending_messages_to_pty));
|
|
}
|
|
|
|
#[test]
|
|
fn wide_characters() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn wide_characters_line_wrap() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters_line_wrap";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn insert_character_in_line_with_wide_character() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters_middle_line_insert";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn delete_char_in_middle_of_line_with_widechar() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide-chars-delete-middle";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn delete_char_in_middle_of_line_with_multiple_widechars() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide-chars-delete-middle-after-multi";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn fish_wide_characters_override_clock() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "fish_wide_characters_override_clock";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn bash_delete_wide_characters() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "bash_delete_wide_characters";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn delete_wide_characters_before_cursor() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "delete_wide_characters_before_cursor";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn delete_wide_characters_before_cursor_when_cursor_is_on_wide_character() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "delete_wide_characters_before_cursor_when_cursor_is_on_wide_character";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn delete_wide_character_under_cursor() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "delete_wide_character_under_cursor";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn replace_wide_character_under_cursor() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
104,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "replace_wide_character_under_cursor";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn wrap_wide_characters() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
90,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters_full";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn wrap_wide_characters_on_size_change() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
93,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters_full";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.change_size(21, 90);
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn unwrap_wide_characters_on_size_change() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
93,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters_full";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.change_size(21, 90);
|
|
grid.change_size(21, 93);
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn wrap_wide_characters_in_the_middle_of_the_line() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
91,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters_line_middle";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn wrap_wide_characters_at_the_end_of_the_line() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
90,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "wide_characters_line_end";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn copy_selected_text_from_viewport() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
27,
|
|
125,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "grid_copy";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
|
|
grid.start_selection(&Position::new(23, 6));
|
|
// check for widechar, 📦 occupies columns 34, 35, and gets selected even if only the first column is selected
|
|
grid.end_selection(&Position::new(25, 35));
|
|
let text = grid.get_selected_text();
|
|
assert_eq!(
|
|
text.unwrap(),
|
|
"mauris in aliquam sem fringilla.\n\nzellij on mouse-support [?] is 📦"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn copy_wrapped_selected_text_from_viewport() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
22,
|
|
73,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "grid_copy_wrapped";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
|
|
grid.start_selection(&Position::new(5, 0));
|
|
grid.end_selection(&Position::new(8, 42));
|
|
let text = grid.get_selected_text();
|
|
assert_eq!(
|
|
text.unwrap(),
|
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn copy_selected_text_from_lines_above() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
27,
|
|
125,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "grid_copy";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
|
|
grid.start_selection(&Position::new(-2, 10));
|
|
// check for widechar, 📦 occupies columns 34, 35, and gets selected even if only the first column is selected
|
|
grid.end_selection(&Position::new(2, 8));
|
|
let text = grid.get_selected_text();
|
|
assert_eq!(
|
|
text.unwrap(),
|
|
"eu scelerisque felis imperdiet proin fermentum leo.\nCursus risus at ultrices mi tempus.\nLaoreet id donec ultrices tincidunt arcu non sodales.\nAmet dictum sit amet justo donec enim.\nHac habi"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn copy_selected_text_from_lines_below() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
27,
|
|
125,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "grid_copy";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
|
|
grid.move_viewport_up(40);
|
|
|
|
grid.start_selection(&Position::new(63, 6));
|
|
// check for widechar, 📦 occupies columns 34, 35, and gets selected even if only the first column is selected
|
|
grid.end_selection(&Position::new(65, 35));
|
|
let text = grid.get_selected_text();
|
|
assert_eq!(
|
|
text.unwrap(),
|
|
"mauris in aliquam sem fringilla.\n\nzellij on mouse-support [?] is 📦"
|
|
);
|
|
}
|
|
|
|
/*
|
|
* These tests below are general compatibility tests for non-trivial scenarios running in the terminal.
|
|
* They use fake TTY input replicated from these scenarios.
|
|
*
|
|
*/
|
|
|
|
#[test]
|
|
fn run_bandwhich_from_fish_shell() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "fish_and_bandwhich";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn fish_tab_completion_options() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "fish_tab_completion_options";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn fish_select_tab_completion_options() {
|
|
// the difference between this and the previous test is that here we press <TAB>
|
|
// twice, meaning the selection moves between the options and the command line
|
|
// changes.
|
|
// this is not clearly seen in the snapshot because it does not include styles,
|
|
// but we can see the command line change and the cursor staying in place
|
|
// terminal_emulator_color_codes,
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "fish_select_tab_completion_options";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn vim_scroll_region_down() {
|
|
// here we test a case where vim defines the scroll region as lesser than the screen row count
|
|
// and then scrolls down
|
|
// the region is defined here by vim as 1-26 (there are 28 rows)
|
|
// then the cursor is moved to line 26 and a new line is added
|
|
// what should happen is that the first line in the scroll region (1) is deleted
|
|
// terminal_emulator_color_codes,
|
|
// and an empty line is inserted in the last scroll region line (26)
|
|
// this tests also has other steps afterwards that fills the line with the next line in the
|
|
// sixel_image_store,
|
|
// file
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vim_scroll_region_down";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn vim_ctrl_d() {
|
|
// in vim ctrl-d moves down half a page
|
|
// in this case, it sends the terminal the csi 'M' directive, which tells it to delete X (13 in
|
|
// this case) lines inside the scroll region and push the other lines up
|
|
// what happens here is that 13 lines are deleted and instead 13 empty lines are added at the
|
|
// end of the scroll region
|
|
// terminal_emulator_color_codes,
|
|
// vim makes sure to fill these empty lines with the rest of the file
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vim_ctrl_d";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn vim_ctrl_u() {
|
|
// in vim ctrl-u moves up half a page
|
|
// in this case, it sends the terminal the csi 'L' directive, which tells it to insert X (13 in
|
|
// this case) lines at the cursor, pushing away (deleting) the last line in the scroll region
|
|
// this causes the effect of scrolling up X lines (vim replaces the lines with the ones in the
|
|
// file above the current content)
|
|
// terminal_emulator_color_codes,
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vim_ctrl_u";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn htop() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "htop";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn htop_scrolling() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "htop_scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn htop_right_scrolling() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "htop_right_scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn vim_overwrite() {
|
|
// this tests the vim overwrite message
|
|
// to recreate:
|
|
// * open a file in vim
|
|
// * open the same file in another window
|
|
// * change the file in the other window and save
|
|
// terminal_emulator_color_codes,
|
|
// * change the file in the original vim window and save
|
|
// * confirm you would like to change the file by pressing 'y' and then ENTER
|
|
// sixel_image_store,
|
|
// * if everything looks fine, this test passed :)
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "vim_overwrite";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn clear_scroll_region() {
|
|
// this is actually a test of 1049h/l (alternative buffer)
|
|
// @imsnif - the name is a monument to the time I didn't fully understand this mechanism :)
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "clear_scroll_region";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn display_tab_characters_properly() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "tab_characters";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn neovim_insert_mode() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "nvim_insert";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn bash_cursor_linewrap() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
116,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "bash_cursor_linewrap";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn fish_paste_multiline() {
|
|
// here we paste a multiline command in fish shell, making sure we support it
|
|
// going up and changing the colors of our line-wrapped pasted text
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
149,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "fish_paste_multiline";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn git_log() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
149,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "git_log";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn git_diff_scrollup() {
|
|
// this tests makes sure that when we have a git diff that exceeds the screen size
|
|
// we are able to scroll up
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
28,
|
|
149,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "git_diff_scrollup";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn emacs_longbuf() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
60,
|
|
284,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "emacs_longbuf_tutorial";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn top_and_quit() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
56,
|
|
235,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "top_and_quit";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn exa_plus_omf_theme() {
|
|
// this tests that we handle a tab delimited table properly
|
|
// without overriding the previous content
|
|
// this is a potential bug because the \t character is a goto
|
|
// if we forwarded it as is to the terminal, we would be skipping
|
|
// over existing on-screen content without deleting it, so we must
|
|
// terminal_emulator_color_codes,
|
|
// convert it to spaces
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
56,
|
|
235,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "exa_plus_omf_theme";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn scroll_up() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
10,
|
|
50,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.scroll_up_one_line();
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn scroll_down() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
10,
|
|
50,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.scroll_up_one_line();
|
|
grid.scroll_down_one_line();
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn scroll_up_with_line_wraps() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
10,
|
|
25,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.scroll_up_one_line();
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn scroll_down_with_line_wraps() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
10,
|
|
25,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.scroll_up_one_line();
|
|
grid.scroll_down_one_line();
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn scroll_up_decrease_width_and_scroll_down() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
10,
|
|
50,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
for _ in 0..10 {
|
|
grid.scroll_up_one_line();
|
|
}
|
|
grid.change_size(10, 25);
|
|
for _ in 0..10 {
|
|
grid.scroll_down_one_line();
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn scroll_up_increase_width_and_scroll_down() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
10,
|
|
25,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scrolling";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
for _ in 0..10 {
|
|
grid.scroll_up_one_line();
|
|
}
|
|
grid.change_size(10, 50);
|
|
for _ in 0..10 {
|
|
grid.scroll_down_one_line();
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn saved_cursor_across_resize() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
4,
|
|
20,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let mut parse = |s, grid: &mut Grid| {
|
|
for b in Vec::from(s) {
|
|
vte_parser.advance(&mut *grid, b)
|
|
}
|
|
};
|
|
let content = "
|
|
\rLine 1 >fill to 20_<
|
|
\rLine 2 >fill to 20_<
|
|
\rLine 3 >fill to 20_<
|
|
\rL\u{1b}[sine 4 >fill to 20_<";
|
|
parse(content, &mut grid);
|
|
// Move real cursor position up three lines
|
|
let content = "\u{1b}[3A";
|
|
parse(content, &mut grid);
|
|
// Truncate top of terminal, resetting cursor (but not saved cursor)
|
|
grid.change_size(3, 20);
|
|
// Wrap, resetting cursor again (but not saved cursor)
|
|
grid.change_size(3, 10);
|
|
// Restore saved cursor position and write ZZZ
|
|
let content = "\u{1b}[uZZZ";
|
|
parse(content, &mut grid);
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn saved_cursor_across_resize_longline() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
4,
|
|
20,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let mut parse = |s, grid: &mut Grid| {
|
|
for b in Vec::from(s) {
|
|
vte_parser.advance(&mut *grid, b)
|
|
}
|
|
};
|
|
let content = "
|
|
\rLine 1 >fill \u{1b}[sto 20_<";
|
|
parse(content, &mut grid);
|
|
// Wrap each line precisely halfway
|
|
grid.change_size(4, 10);
|
|
// Write 'YY' at the end (ends up on a new wrapped line), restore to the saved cursor
|
|
// and overwrite 'to' with 'ZZ'
|
|
let content = "YY\u{1b}[uZZ";
|
|
parse(content, &mut grid);
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn saved_cursor_across_resize_rewrap() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
4,
|
|
4 * 8,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let mut parse = |s, grid: &mut Grid| {
|
|
for b in Vec::from(s) {
|
|
vte_parser.advance(&mut *grid, b)
|
|
}
|
|
};
|
|
let content = "
|
|
\r12345678123456781234567\u{1b}[s812345678"; // 4*8 chars
|
|
parse(content, &mut grid);
|
|
// Wrap each line precisely halfway, then rewrap to halve them again
|
|
grid.change_size(4, 16);
|
|
grid.change_size(4, 8);
|
|
// Write 'Z' at the end of line 3
|
|
let content = "\u{1b}[uZ";
|
|
parse(content, &mut grid);
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn move_cursor_below_scroll_region() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
34,
|
|
114,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "move_cursor_below_scroll_region";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn insert_wide_characters_in_existing_line() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
21,
|
|
86,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "chinese_characters_line_middle";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn full_screen_scroll_region_and_scroll_up() {
|
|
// this test is a regression test for a bug
|
|
// where the scroll region would be set to the
|
|
// full viewport and then scrolling up would cause
|
|
// lines to get deleted from the viewport rather
|
|
// than moving to "lines_above"
|
|
// terminal_emulator_color_codes,
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
54,
|
|
80,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scroll_region_full_screen";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.scroll_up_one_line();
|
|
grid.scroll_up_one_line();
|
|
grid.scroll_up_one_line();
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn ring_bell() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
134,
|
|
64,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "ring_bell";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert!(grid.ring_bell);
|
|
}
|
|
|
|
#[test]
|
|
pub fn alternate_screen_change_size() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
20,
|
|
20,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "alternate_screen_change_size";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
// no scrollback in alternate screen
|
|
assert_eq!(grid.scrollback_position_and_length(), (0, 0));
|
|
grid.change_size(10, 10);
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
assert_eq!(grid.scrollback_position_and_length(), (0, 0))
|
|
}
|
|
|
|
#[test]
|
|
pub fn fzf_fullscreen() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "fzf_fullscreen";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn replace_multiple_wide_characters_under_cursor() {
|
|
// this test makes sure that if we replace a wide character with a non-wide character, it
|
|
// properly pads the excess width in the proper place (either before the replaced non-wide
|
|
// character if the cursor was "in the middle" of the wide character, or after the character if
|
|
// it was "in the beginning" of the wide character)
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "replace_multiple_wide_characters";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn replace_non_wide_characters_with_wide_characters() {
|
|
// this test makes sure that if we replace a wide character with a non-wide character, it
|
|
// properly pads the excess width in the proper place (either before the replaced non-wide
|
|
// character if the cursor was "in the middle" of the wide character, or after the character if
|
|
// it was "in the beginning" of the wide character)
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "replace_non_wide_characters_with_wide_characters";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn scroll_down_ansi() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "scroll_down";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn ansi_capital_t() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "foo\u{1b}[14Tbar".as_bytes();
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn ansi_capital_s() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfoo\u{1b}[14Sbar".as_bytes();
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn terminal_pixel_size_reports() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(Some(SizeInPixels {
|
|
height: 21,
|
|
width: 8,
|
|
}))),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "terminal_pixel_size_reports";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_eq!(
|
|
grid.pending_messages_to_pty
|
|
.iter()
|
|
.map(|bytes| String::from_utf8(bytes.clone()).unwrap())
|
|
.collect::<Vec<String>>(),
|
|
vec!["\x1b[4;1071;776t", "\x1b[6;21;8t"]
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn terminal_pixel_size_reports_in_unsupported_terminals() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)), // in an unsupported terminal, we don't have this info
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "terminal_pixel_size_reports";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
let expected: Vec<String> = vec![];
|
|
assert_eq!(
|
|
grid.pending_messages_to_pty
|
|
.iter()
|
|
.map(|bytes| String::from_utf8(bytes.clone()).unwrap())
|
|
.collect::<Vec<String>>(),
|
|
expected,
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
pub fn ansi_csi_at_sign() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "foo\u{1b}[2D\u{1b}[2@".as_bytes();
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn sixel_images_are_reaped_when_scrolled_off() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let character_cell_size = Rc::new(RefCell::new(Some(SizeInPixels {
|
|
width: 8,
|
|
height: 21,
|
|
})));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
character_cell_size,
|
|
sixel_image_store.clone(),
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let pane_content = read_fixture("sixel-image-500px.six");
|
|
for byte in pane_content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
for _ in 0..10_051 {
|
|
// scrollbuffer limit + viewport height
|
|
grid.add_canonical_line();
|
|
}
|
|
let _ = grid.read_changes(0, 0); // we do this because this is where the images are reaped
|
|
assert_eq!(
|
|
sixel_image_store.borrow().image_count(),
|
|
0,
|
|
"all images were deleted from the store"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
pub fn sixel_images_are_reaped_when_resetting() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let character_cell_size = Rc::new(RefCell::new(Some(SizeInPixels {
|
|
width: 8,
|
|
height: 21,
|
|
})));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
character_cell_size,
|
|
sixel_image_store.clone(),
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let pane_content = read_fixture("sixel-image-500px.six");
|
|
for byte in pane_content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
grid.reset_terminal_state();
|
|
let _ = grid.read_changes(0, 0); // we do this because this is where the images are reaped
|
|
assert_eq!(
|
|
sixel_image_store.borrow().image_count(),
|
|
0,
|
|
"all images were deleted from the store"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
pub fn sixel_image_in_alternate_buffer() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let character_cell_size = Rc::new(RefCell::new(Some(SizeInPixels {
|
|
width: 8,
|
|
height: 21,
|
|
})));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
30,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
character_cell_size,
|
|
sixel_image_store.clone(),
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
|
|
let move_to_alternate_screen = "\u{1b}[?1049h";
|
|
for byte in move_to_alternate_screen.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
|
|
let pane_content = read_fixture("sixel-image-500px.six");
|
|
for byte in pane_content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid)); // should include the image
|
|
//
|
|
let move_away_from_alternate_screen = "\u{1b}[?1049l";
|
|
for byte in move_away_from_alternate_screen.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid)); // should note include the image
|
|
assert_eq!(
|
|
sixel_image_store.borrow().image_count(),
|
|
0,
|
|
"all images were deleted from the store when we moved back from alternate screen"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
pub fn sixel_with_image_scrolling_decsdm() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let character_cell_size = Rc::new(RefCell::new(Some(SizeInPixels {
|
|
width: 8,
|
|
height: 21,
|
|
})));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
30,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
character_cell_size,
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
|
|
// enter DECSDM
|
|
let move_to_decsdm = "\u{1b}[?80h";
|
|
for byte in move_to_decsdm.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
|
|
// write some text
|
|
let mut text_to_fill_pane = String::new();
|
|
for i in 0..10 {
|
|
writeln!(&mut text_to_fill_pane, "\rline {}", i + 1).unwrap();
|
|
}
|
|
for byte in text_to_fill_pane.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
|
|
// render a sixel image (will appear on the top left and partially cover the text)
|
|
let pane_content = read_fixture("sixel-image-100px.six");
|
|
for byte in pane_content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
// image should be on the top left corner of the grid
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
|
|
// leave DECSDM
|
|
let move_away_from_decsdm = "\u{1b}[?80l";
|
|
for byte in move_away_from_decsdm.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
|
|
// Go down to the beginning of the next line
|
|
let mut go_down_once = String::new();
|
|
writeln!(&mut go_down_once, "\n\r").unwrap();
|
|
for byte in go_down_once.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
|
|
// render another sixel image, should appear under the cursor
|
|
let pane_content = read_fixture("sixel-image-100px.six");
|
|
for byte in pane_content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
|
|
// image should appear in cursor position
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
pub fn osc_4_background_query() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "\u{1b}]10;?\u{1b}\\";
|
|
for byte in content.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
let message_string = grid
|
|
.pending_messages_to_pty
|
|
.iter()
|
|
.map(|m| String::from_utf8_lossy(m))
|
|
.fold(String::new(), |mut acc, s| {
|
|
acc.push_str(&s);
|
|
acc
|
|
});
|
|
assert_eq!(message_string, "\u{1b}]10;rgb:0000/0000/0000\u{1b}\\");
|
|
}
|
|
|
|
#[test]
|
|
pub fn osc_4_foreground_query() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "\u{1b}]11;?\u{1b}\\";
|
|
for byte in content.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
let message_string = grid
|
|
.pending_messages_to_pty
|
|
.iter()
|
|
.map(|m| String::from_utf8_lossy(m))
|
|
.fold(String::new(), |mut acc, s| {
|
|
acc.push_str(&s);
|
|
acc
|
|
});
|
|
assert_eq!(message_string, "\u{1b}]11;rgb:0000/0000/0000\u{1b}\\");
|
|
}
|
|
|
|
#[test]
|
|
pub fn osc_4_color_query() {
|
|
let mut color_codes = HashMap::new();
|
|
color_codes.insert(222, String::from("rgb:ffff/d7d7/8787"));
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(color_codes));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "\u{1b}]4;222;?\u{1b}\\";
|
|
for byte in content.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
let message_string = grid
|
|
.pending_messages_to_pty
|
|
.iter()
|
|
.map(|m| String::from_utf8_lossy(m))
|
|
.fold(String::new(), |mut acc, s| {
|
|
acc.push_str(&s);
|
|
acc
|
|
});
|
|
assert_eq!(message_string, "\u{1b}]4;222;rgb:ffff/d7d7/8787\u{1b}\\");
|
|
}
|
|
|
|
#[test]
|
|
pub fn xtsmgraphics_color_register_count() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "\u{1b}[?1;1;S\u{1b}\\";
|
|
for byte in content.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
let message_string = grid
|
|
.pending_messages_to_pty
|
|
.iter()
|
|
.map(|m| String::from_utf8_lossy(m))
|
|
.fold(String::new(), |mut acc, s| {
|
|
acc.push_str(&s);
|
|
acc
|
|
});
|
|
assert_eq!(message_string, "\u{1b}[?1;0;65536S");
|
|
}
|
|
|
|
#[test]
|
|
pub fn xtsmgraphics_pixel_graphics_geometry() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let character_cell_size = Rc::new(RefCell::new(Some(SizeInPixels {
|
|
width: 8,
|
|
height: 21,
|
|
})));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
51,
|
|
97,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
character_cell_size,
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let content = "\u{1b}[?2;1;S\u{1b}\\";
|
|
for byte in content.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
let message_string = grid
|
|
.pending_messages_to_pty
|
|
.iter()
|
|
.map(|m| String::from_utf8_lossy(m))
|
|
.fold(String::new(), |mut acc, s| {
|
|
acc.push_str(&s);
|
|
acc
|
|
});
|
|
assert_eq!(message_string, "\u{1b}[?2;0;776;1071S");
|
|
}
|
|
|
|
#[test]
|
|
pub fn cursor_hide_persists_through_alternate_screen() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let character_cell_size = Rc::new(RefCell::new(Some(SizeInPixels {
|
|
width: 8,
|
|
height: 21,
|
|
})));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
30,
|
|
112,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
character_cell_size,
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
|
|
let hide_cursor = "\u{1b}[?25l";
|
|
for byte in hide_cursor.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert_eq!(grid.cursor_coordinates(), None, "Cursor hidden properly");
|
|
|
|
let move_to_alternate_screen = "\u{1b}[?1049h";
|
|
for byte in move_to_alternate_screen.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert_eq!(
|
|
grid.cursor_coordinates(),
|
|
None,
|
|
"Cursor still hidden in alternate screen"
|
|
);
|
|
|
|
let show_cursor = "\u{1b}[?25h";
|
|
for byte in show_cursor.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert!(grid.cursor_coordinates().is_some(), "Cursor shown");
|
|
|
|
let move_away_from_alternate_screen = "\u{1b}[?1049l";
|
|
for byte in move_away_from_alternate_screen.as_bytes() {
|
|
vte_parser.advance(&mut grid, *byte);
|
|
}
|
|
assert!(
|
|
grid.cursor_coordinates().is_some(),
|
|
"Cursor still shown away from alternate screen"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn table_ui_component() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "table-ui-component";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn table_ui_component_with_coordinates() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "table-ui-component-with-coordinates";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn ribbon_ui_component() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "ribbon-ui-component";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn ribbon_ui_component_with_coordinates() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
110,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "ribbon-ui-component-with-coordinates";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn nested_list_ui_component() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
120,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "nested-list-ui-component";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn nested_list_ui_component_with_coordinates() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
120,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "nested-list-ui-component-with-coordinates";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn text_ui_component() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
120,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "text-ui-component";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|
|
|
|
#[test]
|
|
fn text_ui_component_with_coordinates() {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
|
|
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
|
|
let debug = false;
|
|
let arrow_fonts = true;
|
|
let styled_underlines = true;
|
|
let mut grid = Grid::new(
|
|
41,
|
|
120,
|
|
Rc::new(RefCell::new(Palette::default())),
|
|
terminal_emulator_color_codes,
|
|
Rc::new(RefCell::new(LinkHandler::new())),
|
|
Rc::new(RefCell::new(None)),
|
|
sixel_image_store,
|
|
Style::default(),
|
|
debug,
|
|
arrow_fonts,
|
|
styled_underlines,
|
|
);
|
|
let fixture_name = "text-ui-component-with-coordinates";
|
|
let content = read_fixture(fixture_name);
|
|
for byte in content {
|
|
vte_parser.advance(&mut grid, byte);
|
|
}
|
|
assert_snapshot!(format!("{:?}", grid));
|
|
}
|