#[macro_use]
#[path = "support/mod.rs"]
mod support;
use shpool_vterm::{term, ContentRegion};
frag! {
reverse_index_partial_screen { scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("11"), term::Crlf::default(),
term::Raw::from("22"),
term::ControlCodes::cursor_position(1, 1),
term::control_codes().reverse_index,
term::Raw::from("XX")
=> ContentRegion::All =>
reset_codes,
term::Raw::from("XX"),
term::Crlf::default(),
term::Raw::from("11"),
term::Crlf::default(),
term::Raw::from("22"),
term::ControlCodes::cursor_position(1, 3),
term::control_codes().clear_attrs
}
frag! {
insert_lines_partial_screen { scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("11"), term::Crlf::default(),
term::Raw::from("22"),
term::ControlCodes::cursor_position(1, 1),
term::ControlCodes::insert_lines(1),
term::Raw::from("XX")
=> ContentRegion::All =>
reset_codes,
term::Raw::from("XX"),
term::Crlf::default(),
term::Raw::from("11"),
term::Crlf::default(),
term::Raw::from("22"),
term::ControlCodes::cursor_position(1, 3),
term::control_codes().clear_attrs
}
frag! {
delete_lines_partial_screen { scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("11"), term::Crlf::default(),
term::Raw::from("22"), term::Crlf::default(),
term::Raw::from("33"),
term::ControlCodes::cursor_position(2, 1),
term::ControlCodes::delete_lines(1)
=> ContentRegion::All =>
reset_codes,
term::Raw::from("11"),
term::Crlf::default(),
term::Raw::from("33"),
term::Crlf::default(),
term::ControlCodes::cursor_position(2, 1),
term::control_codes().clear_attrs
}
frag! {
delete_character_at_end_of_line { scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("ab"),
term::ControlCodes::delete_character(3)
=> ContentRegion::All =>
reset_codes,
term::Raw::from("ab "),
term::ControlCodes::cursor_position(1, 3),
term::control_codes().clear_attrs
}
frag! {
delete_character_past_end_of_line_via_cursor_forward
{ scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("ab"),
term::ControlCodes::cursor_forward(2),
term::ControlCodes::delete_character(3)
=> ContentRegion::All =>
reset_codes,
term::Raw::from("ab "),
term::ControlCodes::cursor_position(1, 5),
term::control_codes().clear_attrs
}
frag! {
delete_character_past_end_of_line_via_horizontal_absolute
{ scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("ab"),
term::ControlCodes::cursor_horizontal_absolute(5),
term::ControlCodes::delete_character(3)
=> ContentRegion::All =>
reset_codes,
term::Raw::from("ab "),
term::ControlCodes::cursor_position(1, 5),
term::control_codes().clear_attrs
}
frag! {
delete_character_past_end_of_line_via_cursor_position
{ scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("ab"),
term::ControlCodes::cursor_position(1, 5),
term::ControlCodes::delete_character(3)
=> ContentRegion::All =>
reset_codes,
term::Raw::from("ab "),
term::ControlCodes::cursor_position(1, 5),
term::control_codes().clear_attrs
}
frag! {
delete_character_past_end_of_line_second_row
{ scrollback_lines: 100, width: 5, height: 10 }
<= term::Raw::from("ab"), term::Crlf::default(),
term::Raw::from("cd"),
term::ControlCodes::cursor_position(2, 5),
term::ControlCodes::delete_character(3)
=> ContentRegion::All =>
reset_codes,
term::Raw::from("ab"),
term::Crlf::default(),
term::Raw::from("cd "),
term::ControlCodes::cursor_position(2, 5),
term::control_codes().clear_attrs
}
frag! {
precomposed_char_needs_no_modifier { scrollback_lines: 100, width: 10, height: 10 }
<= term::Raw::from("\u{e9}")
=> ContentRegion::All =>
reset_codes,
term::Raw::from("\u{e9}"),
term::ControlCodes::cursor_position(1, 2),
term::control_codes().clear_attrs
}
frag! {
combining_mark_after_ascii { scrollback_lines: 100, width: 10, height: 10 }
<= term::Raw::from("e\u{301}")
=> ContentRegion::All =>
reset_codes,
term::Raw::from("e\u{301}"),
term::ControlCodes::cursor_position(1, 2),
term::control_codes().clear_attrs
}
frag! {
variation_selector_after_symbol { scrollback_lines: 100, width: 10, height: 10 }
<= term::Raw::from("\u{2714}\u{fe0f}")
=> ContentRegion::All =>
reset_codes,
term::Raw::from("\u{2714}\u{fe0f}"),
term::ControlCodes::cursor_position(1, 2),
term::control_codes().clear_attrs
}
frag! {
zwj_emoji_sequence { scrollback_lines: 100, width: 10, height: 10 }
<= term::Raw::from("\u{1f9d1}\u{200d}\u{1f4bb}")
=> ContentRegion::All =>
reset_codes,
term::Raw::from("\u{1f9d1}\u{200d}\u{1f4bb}"),
term::ControlCodes::cursor_position(1, 5),
term::control_codes().clear_attrs
}
frag! {
combining_mark_with_no_preceding_cell { scrollback_lines: 100, width: 10, height: 10 }
<= term::Raw::from("\u{301}")
=> ContentRegion::All =>
reset_codes,
term::ControlCodes::cursor_position(1, 1),
term::control_codes().clear_attrs
}
frag! {
combining_mark_at_start_of_line { scrollback_lines: 100, width: 10, height: 10 }
<= term::Raw::from("ab"), term::Crlf::default(),
term::Raw::from("\u{301}")
=> ContentRegion::All =>
reset_codes,
term::Raw::from("ab"),
term::ControlCodes::cursor_position(2, 1),
term::control_codes().clear_attrs
}
frag! {
scroll_region_bottom_at_last_row { scrollback_lines: 100, width: 5, height: 3 }
<= term::Raw::from("aa"), term::Crlf::default(),
term::Raw::from("bb"), term::Crlf::default(),
term::Raw::from("cc"), term::Crlf::default(),
term::Raw::from("dd"), term::Crlf::default(),
term::Raw::from("ee"),
term::ControlCodes::scroll_up(2),
term::ControlCodes::set_scroll_region(1, 3),
term::ControlCodes::cursor_position(3, 1),
term::Crlf::default(),
term::Crlf::default(),
term::control_codes().unset_scroll_region
=> ContentRegion::Screen =>
reset_codes,
term::Raw::from("cc"),
term::Crlf::default(),
term::Crlf::default(),
term::ControlCodes::cursor_position(3, 1),
term::control_codes().clear_attrs
}
frag! {
scroll_region_bottom_past_last_row { scrollback_lines: 100, width: 5, height: 3 }
<= term::Raw::from("aa"), term::Crlf::default(),
term::Raw::from("bb"), term::Crlf::default(),
term::Raw::from("cc"), term::Crlf::default(),
term::Raw::from("dd"), term::Crlf::default(),
term::Raw::from("ee"),
term::ControlCodes::scroll_up(2),
term::ControlCodes::set_scroll_region(1, 5),
term::ControlCodes::cursor_position(3, 1),
term::Crlf::default(),
term::Crlf::default(),
term::control_codes().unset_scroll_region
=> ContentRegion::Screen =>
reset_codes,
term::Raw::from("cc"),
term::Crlf::default(),
term::Crlf::default(),
term::ControlCodes::cursor_position(3, 1),
term::control_codes().clear_attrs
}
frag! {
insert_lines_with_cursor_past_last_row { scrollback_lines: 100, width: 5, height: 3 }
<= term::Raw::from("aa"), term::Crlf::default(),
term::Raw::from("bb"), term::Crlf::default(),
term::Raw::from("cc"), term::Crlf::default(),
term::Raw::from("dd"), term::Crlf::default(),
term::Raw::from("ee"),
term::ControlCodes::scroll_up(2),
term::ControlCodes::set_scroll_region(1, 5),
term::ControlCodes::cursor_position(3, 1),
term::Crlf::default(),
term::Crlf::default(),
term::control_codes().unset_scroll_region,
term::ControlCodes::insert_lines(1)
=> ContentRegion::Screen =>
reset_codes,
term::Raw::from("cc"),
term::Crlf::default(),
term::Crlf::default(),
term::ControlCodes::cursor_position(3, 1),
term::control_codes().clear_attrs
}
frag! {
delete_lines_with_cursor_past_last_row { scrollback_lines: 100, width: 5, height: 3 }
<= term::Raw::from("aa"), term::Crlf::default(),
term::Raw::from("bb"), term::Crlf::default(),
term::Raw::from("cc"), term::Crlf::default(),
term::Raw::from("dd"), term::Crlf::default(),
term::Raw::from("ee"),
term::ControlCodes::scroll_up(2),
term::ControlCodes::set_scroll_region(1, 5),
term::ControlCodes::cursor_position(3, 1),
term::Crlf::default(),
term::Crlf::default(),
term::control_codes().unset_scroll_region,
term::ControlCodes::delete_lines(1)
=> ContentRegion::Screen =>
reset_codes,
term::Raw::from("cc"),
term::Crlf::default(),
term::Crlf::default(),
term::ControlCodes::cursor_position(3, 1),
term::control_codes().clear_attrs
}
frag! {
alt_screen_scroll_region_past_last_row { scrollback_lines: 100, width: 5, height: 3 }
<= term::control_codes().enable_alt_screen,
term::Raw::from("aa"), term::Crlf::default(),
term::Raw::from("bb"), term::Crlf::default(),
term::Raw::from("cc"),
term::ControlCodes::set_scroll_region(1, 9),
term::ControlCodes::scroll_down(1)
=> ContentRegion::All =>
reset_codes,
empty_scrollback,
term::control_codes().enable_alt_screen,
term::Raw::from("bb"),
term::Crlf::default(),
term::Raw::from("cc"),
term::Crlf::default(),
term::ControlCodes::set_scroll_region(1, 3),
term::ControlCodes::cursor_position(3, 3),
term::control_codes().clear_attrs
}
frag! {
scroll_region_clamped_away { scrollback_lines: 100, width: 5, height: 3 }
<= term::ControlCodes::set_scroll_region(5, 9)
=> ContentRegion::All =>
reset_codes,
term::ControlCodes::cursor_position(1, 1),
term::control_codes().clear_attrs
}
#[test]
fn scroll_region_clamped_on_shrinking_resize() {
use shpool_vterm::term::AsTermInput;
let mut input = vec![];
term::ControlCodes::set_scroll_region(1, 6).term_input_into(&mut input);
let mut term = shpool_vterm::Term::new(100, shpool_vterm::Size { width: 5, height: 6 });
term.process(input.as_slice());
term.resize(shpool_vterm::Size { width: 5, height: 3 });
let mut expected = vec![];
crate::support::frag::reset_codes.term_input_into(&mut expected);
term::ControlCodes::set_scroll_region(1, 3).term_input_into(&mut expected);
term::ControlCodes::cursor_position(1, 1).term_input_into(&mut expected);
term::control_codes().clear_attrs.term_input_into(&mut expected);
assert_eq!(term.contents(ContentRegion::All), expected);
}
#[test]
fn alt_screen_scroll_region_clamped_on_shrinking_resize() {
use shpool_vterm::term::AsTermInput;
let mut input = vec![];
term::control_codes().enable_alt_screen.term_input_into(&mut input);
term::ControlCodes::set_scroll_region(1, 6).term_input_into(&mut input);
let mut term = shpool_vterm::Term::new(100, shpool_vterm::Size { width: 5, height: 6 });
term.process(input.as_slice());
term.resize(shpool_vterm::Size { width: 5, height: 3 });
let mut scroll = vec![];
term::ControlCodes::scroll_down(1).term_input_into(&mut scroll);
term.process(scroll.as_slice());
let mut expected = vec![];
crate::support::frag::reset_codes.term_input_into(&mut expected);
crate::support::frag::empty_scrollback.term_input_into(&mut expected);
term::control_codes().enable_alt_screen.term_input_into(&mut expected);
term::Crlf::default().term_input_into(&mut expected);
term::Crlf::default().term_input_into(&mut expected);
term::ControlCodes::set_scroll_region(1, 3).term_input_into(&mut expected);
term::ControlCodes::cursor_position(1, 1).term_input_into(&mut expected);
term::control_codes().clear_attrs.term_input_into(&mut expected);
assert_eq!(term.contents(ContentRegion::All), expected);
}
frag! {
origin_mode_restored_before_cursor { scrollback_lines: 100, width: 5, height: 5 }
<= term::Raw::from("11111"), term::Crlf::default(),
term::Raw::from("22222"), term::Crlf::default(),
term::Raw::from("33333"), term::Crlf::default(),
term::Raw::from("44444"), term::Crlf::default(),
term::Raw::from("55555"),
term::ControlCodes::set_scroll_region(2, 4),
term::control_codes().enable_scroll_region_origin_mode,
term::ControlCodes::cursor_position(2, 3)
=> ContentRegion::All =>
reset_codes,
term::Raw::from("11111"),
term::Crlf::default(),
term::Raw::from("22222"),
term::Crlf::default(),
term::Raw::from("33333"),
term::Crlf::default(),
term::Raw::from("44444"),
term::Crlf::default(),
term::Raw::from("55555"),
term::ControlCodes::set_scroll_region(2, 4),
term::control_codes().enable_scroll_region_origin_mode,
term::ControlCodes::cursor_position(2, 3),
term::control_codes().clear_attrs
}
#[test]
fn dump_prefix_clears_scroll_region_and_origin_mode() {
use shpool_vterm::term::AsTermInput;
let mut expected = vec![];
term::control_codes().end_link.term_input_into(&mut expected);
term::control_codes().clear_attrs.term_input_into(&mut expected);
term::control_codes().unset_scroll_region.term_input_into(&mut expected);
term::control_codes().disable_scroll_region_origin_mode.term_input_into(&mut expected);
term::ControlCodes::cursor_position(1, 1).term_input_into(&mut expected);
term::control_codes().clear_screen.term_input_into(&mut expected);
term::Raw::from("hi").term_input_into(&mut expected);
term::ControlCodes::cursor_position(1, 3).term_input_into(&mut expected);
term::control_codes().clear_attrs.term_input_into(&mut expected);
crate::support::frag::round_trip_frag(
b"hi",
expected.as_slice(),
100,
shpool_vterm::Size { width: 5, height: 3 },
ContentRegion::All,
);
}