137 lines
5.6 KiB
Rust
137 lines
5.6 KiB
Rust
use ::nix::pty::Winsize;
|
|
use ::insta::assert_snapshot;
|
|
|
|
use crate::start;
|
|
use crate::tests::fakes::{FakeInputOutput};
|
|
use crate::tests::utils::get_output_frame_snapshots;
|
|
|
|
fn get_fake_os_input (fake_win_size: &Winsize) -> FakeInputOutput {
|
|
FakeInputOutput::new(fake_win_size.clone())
|
|
}
|
|
|
|
#[test]
|
|
pub fn starts_with_one_terminal () {
|
|
let fake_win_size = Winsize { // TODO: combine with above
|
|
ws_col: 121,
|
|
ws_row: 20,
|
|
ws_xpixel: 0,
|
|
ws_ypixel: 0,
|
|
};
|
|
let mut fake_input_output = get_fake_os_input(&fake_win_size);
|
|
fake_input_output.add_terminal_input(&[17]); // quit (ctrl-q)
|
|
start(Box::new(fake_input_output.clone()));
|
|
let output_frames = fake_input_output.stdout_writer.output_frames.lock().unwrap();
|
|
let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size);
|
|
for snapshot in snapshots {
|
|
assert_snapshot!(snapshot);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
pub fn split_terminals_vertically() {
|
|
let fake_win_size = Winsize { // TODO: combine with above
|
|
ws_col: 121,
|
|
ws_row: 20,
|
|
ws_xpixel: 0,
|
|
ws_ypixel: 0,
|
|
};
|
|
let mut fake_input_output = get_fake_os_input(&fake_win_size);
|
|
fake_input_output.add_terminal_input(&[14, 17]); // split-vertically and quit (ctrl-n + ctrl-q)
|
|
start(Box::new(fake_input_output.clone()));
|
|
let output_frames = fake_input_output.stdout_writer.output_frames.lock().unwrap();
|
|
let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size);
|
|
for snapshot in snapshots {
|
|
assert_snapshot!(snapshot);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
pub fn split_terminals_horizontally() {
|
|
let fake_win_size = Winsize { // TODO: combine with above
|
|
ws_col: 121,
|
|
ws_row: 20,
|
|
ws_xpixel: 0,
|
|
ws_ypixel: 0,
|
|
};
|
|
let mut fake_input_output = get_fake_os_input(&fake_win_size);
|
|
fake_input_output.add_terminal_input(&[2, 17]); // split-horizontally and quit (ctrl-b + ctrl-q)
|
|
start(Box::new(fake_input_output.clone()));
|
|
let output_frames = fake_input_output.stdout_writer.output_frames.lock().unwrap();
|
|
let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size);
|
|
for snapshot in snapshots {
|
|
assert_snapshot!(snapshot);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
pub fn split_largest_terminal () {
|
|
// this finds the largest pane and splits along its longest edge (vertically or horizontally)
|
|
let fake_win_size = Winsize { // TODO: combine with above
|
|
ws_col: 121,
|
|
ws_row: 20,
|
|
ws_xpixel: 0,
|
|
ws_ypixel: 0,
|
|
};
|
|
let mut fake_input_output = get_fake_os_input(&fake_win_size);
|
|
fake_input_output.add_terminal_input(&[13, 13, 13, 17]); // split-largest_terminal * 4 and quit (ctrl-m + ctrl-m + ctrl-m + ctrl-m + ctrl-q)
|
|
start(Box::new(fake_input_output.clone()));
|
|
let output_frames = fake_input_output.stdout_writer.output_frames.lock().unwrap();
|
|
let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size);
|
|
for snapshot in snapshots {
|
|
assert_snapshot!(snapshot);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
pub fn resize_right_and_up_on_the_same_axis() {
|
|
// this is a specific test to explicitly ensure that a tmux-like pane-container algorithm is not
|
|
// implemented (this test can never pass with such an algorithm)
|
|
//
|
|
// ┌─────┬─────┐ ┌─────┬─────┐
|
|
// │ │ │ │ │ │
|
|
// ├─────┼─────┤ ==resize=right==> ├─────┴─┬───┤ ==resize-left==>
|
|
// │█████│ │ │███████│ │
|
|
// └─────┴─────┘ └───────┴───┘
|
|
//
|
|
// ┌─────┬─────┐ ┌─────┬─────┐
|
|
// │ │ │ ├─────┤ │
|
|
// ├─────┼─────┤ ==resize=up==> │█████├─────┤
|
|
// │█████│ │ │█████│ │
|
|
// └─────┴─────┘ └─────┴─────┘
|
|
// █ == focused pane
|
|
let fake_win_size = Winsize { // TODO: combine with above
|
|
ws_col: 121,
|
|
ws_row: 40,
|
|
ws_xpixel: 0,
|
|
ws_ypixel: 0,
|
|
};
|
|
let mut fake_input_output = get_fake_os_input(&fake_win_size);
|
|
|
|
// (ctrl-b + ctrl-n + ctrl-p + ctrl-n + ctrl-p * 2 + ctrl-l + ctrl-h + ctrl-k + ctrl-q)
|
|
fake_input_output.add_terminal_input(&[2, 14, 16, 14, 16, 16, 12, 8, 11, 17]);
|
|
|
|
start(Box::new(fake_input_output.clone()));
|
|
let output_frames = fake_input_output.stdout_writer.output_frames.lock().unwrap();
|
|
let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size);
|
|
for snapshot in snapshots {
|
|
assert_snapshot!(snapshot);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
pub fn scrolling_inside_a_pane() {
|
|
let fake_win_size = Winsize { // TODO: combine with above
|
|
ws_col: 121,
|
|
ws_row: 20,
|
|
ws_xpixel: 0,
|
|
ws_ypixel: 0,
|
|
};
|
|
let mut fake_input_output = get_fake_os_input(&fake_win_size);
|
|
fake_input_output.add_terminal_input(&[2, 14, 27, 27, 29, 29, 17]); // split-horizontally, split-vertically, scroll up twice, scroll down twice and quit (ctrl-b + ctrl+[ * 2 + ctrl+] * 2, ctrl-q)
|
|
start(Box::new(fake_input_output.clone()));
|
|
let output_frames = fake_input_output.stdout_writer.output_frames.lock().unwrap();
|
|
let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size);
|
|
for snapshot in snapshots {
|
|
assert_snapshot!(snapshot);
|
|
}
|
|
}
|