zellij/zellij-server/src/tab/unit/tab_tests.rs
Mike Lloyd 3ebaba9e9e
fix: styled underlines in editors (#2918)
* Add styled_underlines param to TerminalPane

* Add styled_underlines to Cursor::new

* Remove styled_underlines from render_first_run_banner
2023-11-08 11:35:26 +01:00

14426 lines
353 KiB
Rust

use super::Tab;
use crate::panes::sixel::SixelImageStore;
use crate::screen::CopyOptions;
use crate::{
os_input_output::{AsyncReader, Pid, ServerOsApi},
panes::PaneId,
thread_bus::ThreadSenders,
ClientId,
};
use std::path::PathBuf;
use zellij_utils::data::{Direction, Resize, ResizeStrategy};
use zellij_utils::errors::prelude::*;
use zellij_utils::input::layout::{SplitDirection, SplitSize, TiledPaneLayout};
use zellij_utils::ipc::IpcReceiverWithContext;
use zellij_utils::pane_size::{Size, SizeInPixels};
use std::cell::RefCell;
use std::collections::{HashMap, HashSet};
use std::os::unix::io::RawFd;
use std::rc::Rc;
use zellij_utils::{
data::{ModeInfo, Palette, Style},
input::command::{RunCommand, TerminalAction},
interprocess::local_socket::LocalSocketStream,
ipc::{ClientToServerMsg, ServerToClientMsg},
};
#[derive(Clone)]
struct FakeInputOutput {}
impl ServerOsApi for FakeInputOutput {
fn set_terminal_size_using_terminal_id(
&self,
_id: u32,
_cols: u16,
_rows: u16,
_width_in_pixels: Option<u16>,
_height_in_pixels: Option<u16>,
) -> Result<()> {
// noop
Ok(())
}
fn spawn_terminal(
&self,
_file_to_open: TerminalAction,
_quit_cb: Box<dyn Fn(PaneId, Option<i32>, RunCommand) + Send>,
_default_editor: Option<PathBuf>,
) -> Result<(u32, RawFd, RawFd)> {
unimplemented!()
}
fn read_from_tty_stdout(&self, _fd: RawFd, _buf: &mut [u8]) -> Result<usize> {
unimplemented!()
}
fn async_file_reader(&self, _fd: RawFd) -> Box<dyn AsyncReader> {
unimplemented!()
}
fn write_to_tty_stdin(&self, _id: u32, _buf: &[u8]) -> Result<usize> {
unimplemented!()
}
fn tcdrain(&self, _id: u32) -> Result<()> {
unimplemented!()
}
fn kill(&self, _pid: Pid) -> Result<()> {
unimplemented!()
}
fn force_kill(&self, _pid: Pid) -> Result<()> {
unimplemented!()
}
fn box_clone(&self) -> Box<dyn ServerOsApi> {
Box::new((*self).clone())
}
fn send_to_client(&self, _client_id: ClientId, _msg: ServerToClientMsg) -> Result<()> {
unimplemented!()
}
fn new_client(
&mut self,
_client_id: ClientId,
_stream: LocalSocketStream,
) -> Result<IpcReceiverWithContext<ClientToServerMsg>> {
unimplemented!()
}
fn remove_client(&mut self, _client_id: ClientId) -> Result<()> {
unimplemented!()
}
fn load_palette(&self) -> Palette {
unimplemented!()
}
fn get_cwd(&self, _pid: Pid) -> Option<PathBuf> {
unimplemented!()
}
fn write_to_file(&mut self, _buf: String, _name: Option<String>) -> Result<()> {
unimplemented!()
}
fn re_run_command_in_terminal(
&self,
_terminal_id: u32,
_run_command: RunCommand,
_quit_cb: Box<dyn Fn(PaneId, Option<i32>, RunCommand) + Send>, // u32 is the exit status
) -> Result<(RawFd, RawFd)> {
unimplemented!()
}
fn clear_terminal_id(&self, _terminal_id: u32) -> Result<()> {
unimplemented!()
}
}
fn tab_resize_increase(tab: &mut Tab, id: ClientId) {
tab.resize(id, ResizeStrategy::new(Resize::Increase, None))
.unwrap();
}
fn tab_resize_left(tab: &mut Tab, id: ClientId) {
tab.resize(
id,
ResizeStrategy::new(Resize::Increase, Some(Direction::Left)),
)
.unwrap();
}
fn tab_resize_down(tab: &mut Tab, id: ClientId) {
tab.resize(
id,
ResizeStrategy::new(Resize::Increase, Some(Direction::Down)),
)
.unwrap();
}
fn tab_resize_up(tab: &mut Tab, id: ClientId) {
tab.resize(
id,
ResizeStrategy::new(Resize::Increase, Some(Direction::Up)),
)
.unwrap();
}
fn tab_resize_right(tab: &mut Tab, id: ClientId) {
tab.resize(
id,
ResizeStrategy::new(Resize::Increase, Some(Direction::Right)),
)
.unwrap();
}
fn create_new_tab(size: Size) -> Tab {
let index = 0;
let position = 0;
let name = String::new();
let os_api = Box::new(FakeInputOutput {});
let senders = ThreadSenders::default().silently_fail_on_send();
let max_panes = None;
let mode_info = ModeInfo::default();
let style = Style::default();
let draw_pane_frames = true;
let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
let character_cell_info = Rc::new(RefCell::new(None));
connected_clients.insert(client_id);
let connected_clients = Rc::new(RefCell::new(connected_clients));
let terminal_emulator_colors = Rc::new(RefCell::new(Palette::default()));
let copy_options = CopyOptions::default();
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 tab = Tab::new(
index,
position,
name,
size,
character_cell_info,
sixel_image_store,
os_api,
senders,
max_panes,
style,
mode_info,
draw_pane_frames,
auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
(vec![], vec![]), // swap layouts
None,
debug,
arrow_fonts,
styled_underlines,
);
tab.apply_layout(
TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
HashMap::new(),
client_id,
)
.unwrap();
tab
}
fn create_new_tab_with_layout(size: Size, layout: TiledPaneLayout) -> Tab {
let index = 0;
let position = 0;
let name = String::new();
let os_api = Box::new(FakeInputOutput {});
let senders = ThreadSenders::default().silently_fail_on_send();
let max_panes = None;
let mode_info = ModeInfo::default();
let style = Style::default();
let draw_pane_frames = true;
let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
let character_cell_info = Rc::new(RefCell::new(None));
connected_clients.insert(client_id);
let connected_clients = Rc::new(RefCell::new(connected_clients));
let terminal_emulator_colors = Rc::new(RefCell::new(Palette::default()));
let copy_options = CopyOptions::default();
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 tab = Tab::new(
index,
position,
name,
size,
character_cell_info,
sixel_image_store,
os_api,
senders,
max_panes,
style,
mode_info,
draw_pane_frames,
auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
(vec![], vec![]), // swap layouts
None,
debug,
arrow_fonts,
styled_underlines,
);
let mut new_terminal_ids = vec![];
for i in 0..layout.extract_run_instructions().len() {
new_terminal_ids.push((i as u32, None));
}
tab.apply_layout(
layout,
vec![],
new_terminal_ids,
vec![],
HashMap::new(),
client_id,
)
.unwrap();
tab
}
fn create_new_tab_with_cell_size(
size: Size,
character_cell_size: Rc<RefCell<Option<SizeInPixels>>>,
) -> Tab {
let index = 0;
let position = 0;
let name = String::new();
let os_api = Box::new(FakeInputOutput {});
let senders = ThreadSenders::default().silently_fail_on_send();
let max_panes = None;
let mode_info = ModeInfo::default();
let style = Style::default();
let draw_pane_frames = true;
let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
connected_clients.insert(client_id);
let connected_clients = Rc::new(RefCell::new(connected_clients));
let terminal_emulator_colors = Rc::new(RefCell::new(Palette::default()));
let copy_options = CopyOptions::default();
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 tab = Tab::new(
index,
position,
name,
size,
character_cell_size,
sixel_image_store,
os_api,
senders,
max_panes,
style,
mode_info,
draw_pane_frames,
auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
(vec![], vec![]), // swap layouts
None,
debug,
arrow_fonts,
styled_underlines,
);
tab.apply_layout(
TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
HashMap::new(),
client_id,
)
.unwrap();
tab
}
#[test]
fn write_to_suppressed_pane() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
// Suppress pane 2 and remove it from active panes
tab.replace_active_pane_with_editor_pane(PaneId::Terminal(2), 1)
.unwrap();
tab.tiled_panes.remove_pane(PaneId::Terminal(2));
// Make sure it's suppressed now
tab.suppressed_panes.get(&PaneId::Terminal(2)).unwrap();
// Write content to it
tab.write_to_pane_id(vec![34, 127, 31, 82, 17, 182], PaneId::Terminal(2), None)
.unwrap();
}
#[test]
fn split_panes_vertically() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.vertical_split(new_pane_id, None, 1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "The tab has two panes");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"first pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"second pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"second pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"second pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"second pane row count"
);
}
#[test]
fn split_panes_horizontally() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "The tab has two panes");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"first pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"first pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"second pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
10,
"second pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"second pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"second pane row count"
);
}
#[test]
fn split_largest_pane() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
for i in 2..5 {
let new_pane_id = PaneId::Terminal(i);
tab.new_pane(new_pane_id, None, None, None, Some(1))
.unwrap();
}
assert_eq!(tab.tiled_panes.panes.len(), 4, "The tab has four panes");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"first pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"second pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"second pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"second pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"second pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"third pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"third pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"third pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"third pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"fourth pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
10,
"fourth pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"fourth pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"fourth pane row count"
);
}
#[test]
pub fn cannot_split_panes_vertically_when_active_pane_is_too_small() {
let size = Size { cols: 8, rows: 20 };
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
assert_eq!(
tab.tiled_panes.panes.len(),
1,
"Tab still has only one pane"
);
}
#[test]
pub fn cannot_split_panes_horizontally_when_active_pane_is_too_small() {
let size = Size { cols: 121, rows: 4 };
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
assert_eq!(
tab.tiled_panes.panes.len(),
1,
"Tab still has only one pane"
);
}
#[test]
pub fn cannot_split_largest_pane_when_there_is_no_room() {
let size = Size { cols: 8, rows: 4 };
let mut tab = create_new_tab(size);
tab.new_pane(PaneId::Terminal(2), None, None, None, Some(1))
.unwrap();
assert_eq!(
tab.tiled_panes.panes.len(),
1,
"Tab still has only one pane"
);
}
#[test]
pub fn cannot_split_panes_vertically_when_active_pane_has_fixed_columns() {
let size = Size { cols: 50, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(30));
initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Tab still has two panes");
}
#[test]
pub fn cannot_split_panes_horizontally_when_active_pane_has_fixed_rows() {
let size = Size { cols: 50, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(12));
initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Tab still has two panes");
}
#[test]
pub fn toggle_focused_pane_fullscreen() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
for i in 2..5 {
let new_pane_id = PaneId::Terminal(i);
tab.new_pane(new_pane_id, None, None, None, Some(1))
.unwrap();
}
tab.toggle_active_pane_fullscreen(1);
assert_eq!(
tab.tiled_panes.panes.get(&PaneId::Terminal(4)).unwrap().x(),
0,
"Pane x is on screen edge"
);
assert_eq!(
tab.tiled_panes.panes.get(&PaneId::Terminal(4)).unwrap().y(),
0,
"Pane y is on screen edge"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.cols(),
121,
"Pane cols match fullscreen cols"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.rows(),
20,
"Pane rows match fullscreen rows"
);
tab.toggle_active_pane_fullscreen(1);
assert_eq!(
tab.tiled_panes.panes.get(&PaneId::Terminal(4)).unwrap().x(),
61,
"Pane x is on screen edge"
);
assert_eq!(
tab.tiled_panes.panes.get(&PaneId::Terminal(4)).unwrap().y(),
10,
"Pane y is on screen edge"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.cols(),
60,
"Pane cols match fullscreen cols"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.rows(),
10,
"Pane rows match fullscreen rows"
);
// we don't test if all other panes are hidden because this logic is done in the render
// function and we already test that in the e2e tests
}
#[test]
fn switch_to_next_pane_fullscreen() {
let size = Size {
cols: 121,
rows: 20,
};
let mut active_tab = create_new_tab(size);
active_tab
.new_pane(PaneId::Terminal(1), None, None, None, Some(1))
.unwrap();
active_tab
.new_pane(PaneId::Terminal(2), None, None, None, Some(1))
.unwrap();
active_tab
.new_pane(PaneId::Terminal(3), None, None, None, Some(1))
.unwrap();
active_tab
.new_pane(PaneId::Terminal(4), None, None, None, Some(1))
.unwrap();
active_tab.toggle_active_pane_fullscreen(1);
// order is now 1 ->2 -> 3 -> 4 due to how new panes are inserted
active_tab.switch_next_pane_fullscreen(1);
active_tab.switch_next_pane_fullscreen(1);
active_tab.switch_next_pane_fullscreen(1);
active_tab.switch_next_pane_fullscreen(1);
// position should now be back in terminal 4.
assert_eq!(
active_tab.get_active_pane_id(1).unwrap(),
PaneId::Terminal(4),
"Active pane did not switch in fullscreen mode"
);
}
#[test]
fn switch_to_prev_pane_fullscreen() {
let size = Size {
cols: 121,
rows: 20,
};
let mut active_tab = create_new_tab(size);
//testing four consecutive switches in fullscreen mode
active_tab
.new_pane(PaneId::Terminal(1), None, None, None, Some(1))
.unwrap();
active_tab
.new_pane(PaneId::Terminal(2), None, None, None, Some(1))
.unwrap();
active_tab
.new_pane(PaneId::Terminal(3), None, None, None, Some(1))
.unwrap();
active_tab
.new_pane(PaneId::Terminal(4), None, None, None, Some(1))
.unwrap();
active_tab.toggle_active_pane_fullscreen(1);
// order is now 1 2 3 4
active_tab.switch_prev_pane_fullscreen(1);
active_tab.switch_prev_pane_fullscreen(1);
active_tab.switch_prev_pane_fullscreen(1);
active_tab.switch_prev_pane_fullscreen(1);
// the position should now be in Terminal 4.
assert_eq!(
active_tab.get_active_pane_id(1).unwrap(),
PaneId::Terminal(4),
"Active pane did not switch in fullscreen mode"
);
}
#[test]
pub fn close_pane_with_another_pane_above_it() {
// ┌───────────┐ ┌───────────┐
// │xxxxxxxxxxx│ │xxxxxxxxxxx│
// │xxxxxxxxxxx│ │xxxxxxxxxxx│
// ├───────────┤ ==close==> │xxxxxxxxxxx│
// │███████████│ │xxxxxxxxxxx│
// │███████████│ │xxxxxxxxxxx│
// └───────────┘ └───────────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 1, "One pane left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"remaining pane row count"
);
}
#[test]
pub fn close_pane_with_another_pane_below_it() {
// ┌───────────┐ ┌───────────┐
// │███████████│ │xxxxxxxxxxx│
// │███████████│ │xxxxxxxxxxx│
// ├───────────┤ ==close==> │xxxxxxxxxxx│
// │xxxxxxxxxxx│ │xxxxxxxxxxx│
// │xxxxxxxxxxx│ │xxxxxxxxxxx│
// └───────────┘ └───────────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 1, "One pane left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"remaining pane row count"
);
}
#[test]
pub fn close_pane_with_another_pane_to_the_left() {
// ┌─────┬─────┐ ┌──────────┐
// │xxxxx│█████│ │xxxxxxxxxx│
// │xxxxx│█████│ ==close==> │xxxxxxxxxx│
// │xxxxx│█████│ │xxxxxxxxxx│
// └─────┴─────┘ └──────────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.vertical_split(new_pane_id, None, 1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 1, "One pane left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"remaining pane row count"
);
}
#[test]
pub fn close_pane_with_another_pane_to_the_right() {
// ┌─────┬─────┐ ┌──────────┐
// │█████│xxxxx│ │xxxxxxxxxx│
// │█████│xxxxx│ ==close==> │xxxxxxxxxx│
// │█████│xxxxx│ │xxxxxxxxxx│
// └─────┴─────┘ └──────────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.vertical_split(new_pane_id, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 1, "One pane left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_above_it() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │xxxxx│xxxxx│ │xxxxx│xxxxx│
// │xxxxx│xxxxx│ │xxxxx│xxxxx│
// ├─────┴─────┤ ==close==> │xxxxx│xxxxx│
// │███████████│ │xxxxx│xxxxx│
// │███████████│ │xxxxx│xxxxx│
// └───────────┘ └─────┴─────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Two panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"second remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_below_it() {
// ┌───────────┐ ┌─────┬─────┐
// │███████████│ │xxxxx│xxxxx│
// │███████████│ │xxxxx│xxxxx│
// ├─────┬─────┤ ==close==> │xxxxx│xxxxx│
// │xxxxx│xxxxx│ │xxxxx│xxxxx│
// │xxxxx│xxxxx│ │xxxxx│xxxxx│
// └─────┴─────┘ └─────┴─────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Two panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"second remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_to_the_left() {
// ┌─────┬─────┐ ┌──────────┐
// │xxxxx│█████│ │xxxxxxxxxx│
// │xxxxx│█████│ │xxxxxxxxxx│
// ├─────┤█████│ ==close==> ├──────────┤
// │xxxxx│█████│ │xxxxxxxxxx│
// │xxxxx│█████│ │xxxxxxxxxx│
// └─────┴─────┘ └──────────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Two panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"second remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_to_the_right() {
// ┌─────┬─────┐ ┌──────────┐
// │█████│xxxxx│ │xxxxxxxxxx│
// │█████│xxxxx│ │xxxxxxxxxx│
// │█████├─────┤ ==close==> ├──────────┤
// │█████│xxxxx│ │xxxxxxxxxx│
// │█████│xxxxx│ │xxxxxxxxxx│
// └─────┴─────┘ └──────────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Two panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"second remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_above_it_away_from_screen_edges() {
// ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐
// │xxx│xxx│xxx│xxx│ │xxx│xxx│xxx│xxx│
// ├───┤xxx│xxx├───┤ ├───┤xxx│xxx├───┤
// │xxx├───┴───┤xxx│ ==close==> │xxx│xxx│xxx│xxx│
// │xxx│███████│xxx│ │xxx│xxx│xxx│xxx│
// │xxx│███████│xxx│ │xxx│xxx│xxx│xxx│
// └───┴───────┴───┘ └───┴───┴───┴───┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let new_pane_id_6 = PaneId::Terminal(7);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(new_pane_id_4, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(new_pane_id_5, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_down(&mut tab, 1);
tab.vertical_split(new_pane_id_6, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 6, "Six panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"second remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
91,
"third remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"third remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"third remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"third remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
0,
"fourth remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
10,
"fourth remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"fourth remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"fourth remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"sixths remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
10,
"sixths remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"sixths remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"sixths remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
76,
"seventh remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
0,
"seventh remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"seventh remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"seventh remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_below_it_away_from_screen_edges() {
// ┌───┬───────┬───┐ ┌───┬───┬───┬───┐
// │xxx│███████│xxx│ │xxx│xxx│xxx│xxx│
// │xxx│███████│xxx│ │xxx│xxx│xxx│xxx│
// │xxx├───┬───┤xxx│ ==close==> │xxx│xxx│xxx│xxx│
// ├───┤xxx│xxx├───┤ ├───┤xxx│xxx├───┤
// │xxx│xxx│xxx│xxx│ │xxx│xxx│xxx│xxx│
// └───┴───┴───┴───┘ └───┴───┴───┴───┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let new_pane_id_6 = PaneId::Terminal(7);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(new_pane_id_4, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(new_pane_id_5, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_up(&mut tab, 1);
tab.vertical_split(new_pane_id_6, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 6, "Six panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
91,
"third remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"third remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"third remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"third remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
0,
"fourth remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
10,
"fourth remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"fourth remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"fourth remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"second remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"sixths remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
10,
"sixths remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"sixths remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"sixths remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
76,
"seventh remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
0,
"seventh remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"seventh remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"seventh remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_to_the_left_away_from_screen_edges() {
// ┌────┬──────┐ ┌────┬──────┐
// │xxxx│xxxxxx│ │xxxx│xxxxxx│
// ├────┴┬─────┤ ├────┴──────┤
// │xxxxx│█████│ │xxxxxxxxxxx│
// ├─────┤█████│ ==close==> ├───────────┤
// │xxxxx│█████│ │xxxxxxxxxxx│
// ├────┬┴─────┤ ├────┬──────┤
// │xxxx│xxxxxx│ │xxxx│xxxxxx│
// └────┴──────┘ └────┴──────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let new_pane_id_6 = PaneId::Terminal(7);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(new_pane_id_4, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(new_pane_id_5, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_right(&mut tab, 1);
tab_resize_up(&mut tab, 1);
tab_resize_up(&mut tab, 1);
tab.horizontal_split(new_pane_id_6, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 6, "Six panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
12,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"third remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
12,
"third remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"third remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"third remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"fourth remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
22,
"fourth remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"fourth remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"fourth remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
12,
"second remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
61,
"sixths remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
22,
"sixths remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"sixths remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"sixths remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
0,
"seventh remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
17,
"seventh remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"seventh remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"seventh remaining pane row count"
);
}
#[test]
pub fn close_pane_with_multiple_panes_to_the_right_away_from_screen_edges() {
// ┌────┬──────┐ ┌────┬──────┐
// │xxxx│xxxxxx│ │xxxx│xxxxxx│
// ├────┴┬─────┤ ├────┴──────┤
// │█████│xxxxx│ │xxxxxxxxxxx│
// │█████├─────┤ ==close==> ├───────────┤
// │█████│xxxxx│ │xxxxxxxxxxx│
// ├────┬┴─────┤ ├────┬──────┤
// │xxxx│xxxxxx│ │xxxx│xxxxxx│
// └────┴──────┘ └────┴──────┘
// █ == pane being closed
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let new_pane_id_6 = PaneId::Terminal(7);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(new_pane_id_4, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(new_pane_id_5, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_left(&mut tab, 1);
tab_resize_up(&mut tab, 1);
tab_resize_up(&mut tab, 1);
tab.horizontal_split(new_pane_id_6, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.close_focused_pane(1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 6, "Six panes left in tab");
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"first remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"first remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"first remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"first remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"fourth remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
22,
"fourth remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"fourth remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"fourth remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"second remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"second remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"second remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"second remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
0,
"third remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
11,
"third remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"third remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
6,
"third remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
61,
"sixths remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
22,
"sixths remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"sixths remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"sixths remaining pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
0,
"seventh remaining pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
17,
"seventh remaining pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"seventh remaining pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"seventh remaining pane row count"
);
}
#[test]
pub fn move_focus_down() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_down(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
10,
"Active pane is the bottom one"
);
}
#[test]
pub fn move_focus_down_to_the_most_recently_used_pane() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.vertical_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_down(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
10,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
91,
"Active pane x position"
);
}
#[test]
pub fn move_focus_up() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
0,
"Active pane is the top one"
);
}
#[test]
pub fn move_focus_up_to_the_most_recently_used_pane() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.vertical_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.move_focus_up(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
0,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
91,
"Active pane x position"
);
}
#[test]
pub fn move_focus_left() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.vertical_split(new_pane_id, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
0,
"Active pane is the left one"
);
}
#[test]
pub fn move_focus_left_to_the_most_recently_used_pane() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.horizontal_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.move_focus_left(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
15,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
0,
"Active pane x position"
);
}
#[test]
pub fn move_focus_right() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.vertical_split(new_pane_id, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_right(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
61,
"Active pane is the right one"
);
}
#[test]
pub fn move_focus_right_to_the_most_recently_used_pane() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.horizontal_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_right(1).unwrap();
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
15,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
61,
"Active pane x position"
);
}
#[test]
pub fn move_active_pane_down() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_active_pane_down(1);
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
10,
"Active pane is the bottom one"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(1),
"Active pane is the bottom one"
);
}
#[test]
pub fn move_active_pane_down_to_the_most_recently_used_position() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.vertical_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_active_pane_down(1);
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
10,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
91,
"Active pane x position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(1),
"Active pane PaneId"
);
}
#[test]
pub fn move_active_pane_up() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab.move_active_pane_up(1);
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
0,
"Active pane is the top one"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(2),
"Active pane is the top one"
);
}
#[test]
pub fn move_active_pane_up_to_the_most_recently_used_position() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.vertical_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.move_active_pane_up(1);
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
0,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
91,
"Active pane x position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(2),
"Active pane PaneId"
);
}
#[test]
pub fn move_active_pane_left() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.vertical_split(new_pane_id, None, 1).unwrap();
tab.move_active_pane_left(1);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
0,
"Active pane is the left one"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(2),
"Active pane is the left one"
);
}
#[test]
pub fn move_active_pane_left_to_the_most_recently_used_position() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.horizontal_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.move_active_pane_left(1);
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
15,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
0,
"Active pane x position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(2),
"Active pane PaneId"
);
}
#[test]
pub fn move_active_pane_right() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.vertical_split(new_pane_id, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_active_pane_right(1);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
61,
"Active pane is the right one"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(1),
"Active pane is the right one"
);
}
#[test]
pub fn move_active_pane_right_to_the_most_recently_used_position() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
let new_pane_id_3 = PaneId::Terminal(4);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.horizontal_split(new_pane_id_3, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_active_pane_right(1);
assert_eq!(
tab.get_active_pane(1).unwrap().y(),
15,
"Active pane y position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().x(),
61,
"Active pane x position"
);
assert_eq!(
tab.get_active_pane(1).unwrap().pid(),
PaneId::Terminal(1),
"Active pane Paneid"
);
}
#[test]
pub fn resize_down_with_pane_above() {
// ┌───────────┐ ┌───────────┐
// │ │ │ │
// │ │ │ │
// ├───────────┤ ==resize=down==> │ │
// │███████████│ ├───────────┤
// │███████████│ │███████████│
// │███████████│ │███████████│
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.x,
0,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.y,
11,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.rows
.as_usize(),
9,
"focused pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane above x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane above y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane above column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"pane above row count"
);
}
#[test]
pub fn resize_down_with_pane_below() {
// ┌───────────┐ ┌───────────┐
// │███████████│ │███████████│
// │███████████│ │███████████│
// ├───────────┤ ==resize=down==> │███████████│
// │ │ ├───────────┤
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
let new_pane_id = PaneId::Terminal(2);
tab.horizontal_split(new_pane_id, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.x,
0,
"pane below x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.y,
11,
"pane below y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane below column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id)
.unwrap()
.position_and_size()
.rows
.as_usize(),
9,
"pane below row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"focused pane row count"
);
}
#[test]
pub fn resize_down_with_panes_above_and_below() {
// ┌───────────┐ ┌───────────┐
// │ │ │ │
// │ │ │ │
// ├───────────┤ ├───────────┤
// │███████████│ ==resize=down==> │███████████│
// │███████████│ │███████████│
// │███████████│ │███████████│
// ├───────────┤ │███████████│
// │ │ ├───────────┤
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let first_pane_id = PaneId::Terminal(1);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.horizontal_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.x,
0,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.y,
15,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.rows
.as_usize(),
9,
"focused pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.x,
0,
"pane below x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.y,
24,
"pane below y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane below column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.rows
.as_usize(),
6,
"pane below row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.x,
0,
"pane above x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.y,
0,
"pane above y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane above column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane above row count"
);
}
#[test]
pub fn resize_down_with_multiple_panes_above() {
//
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┴─────┤ ==resize=down==> │ │ │
// │███████████│ ├─────┴─────┤
// │███████████│ │███████████│
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let first_pane_id = PaneId::Terminal(1);
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
tab.horizontal_split(new_pane_id_1, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(new_pane_id_2, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.x,
0,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.y,
16,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_1)
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"focused pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.x,
61,
"first pane above x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.y,
0,
"first pane above y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"first pane above column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&new_pane_id_2)
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"first pane above row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.x,
0,
"second pane above x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.y,
0,
"second pane above y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"second pane above column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&first_pane_id)
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"second pane above row count"
);
}
#[test]
pub fn resize_down_with_panes_above_aligned_left_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// │ │ │ │ │ │
// ├─────┼─────┤ ==resize=down==> ├─────┤ │
// │ │█████│ │ ├─────┤
// │ │█████│ │ │█████│
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let pane_above_and_left = PaneId::Terminal(1);
let pane_to_the_left = PaneId::Terminal(2);
let focused_pane = PaneId::Terminal(3);
let pane_above = PaneId::Terminal(4);
tab.horizontal_split(pane_to_the_left, None, 1).unwrap();
tab.vertical_split(focused_pane, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(pane_above, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.x,
61,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.y,
16,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"focused pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_left)
.unwrap()
.position_and_size()
.x,
0,
"pane above and to the left x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_left)
.unwrap()
.position_and_size()
.y,
0,
"pane above and to the left y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_left)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane above and to the left column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_left)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane above and to the left row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.x,
61,
"pane above x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.y,
0,
"pane above y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane above column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane above row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.x,
0,
"pane to the left x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.y,
15,
"pane to the left y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane to the left column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane to the left row count"
);
}
#[test]
pub fn resize_down_with_panes_below_aligned_left_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │█████│ │ │█████│
// │ │█████│ │ │█████│
// ├─────┼─────┤ ==resize=down==> ├─────┤█████│
// │ │ │ │ ├─────┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let pane_to_the_left = PaneId::Terminal(1);
let pane_below_and_left = PaneId::Terminal(2);
let pane_below = PaneId::Terminal(3);
let focused_pane = PaneId::Terminal(4);
tab.horizontal_split(pane_below_and_left, None, 1).unwrap();
tab.vertical_split(pane_below, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(focused_pane, None, 1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.x,
61,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.y,
0,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"focused pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.x,
0,
"pane above and to the left x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.y,
0,
"pane above and to the left y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane above and to the left column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_left)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane above and to the left row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.x,
61,
"pane above x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.y,
16,
"pane above y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane above column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane above row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_left)
.unwrap()
.position_and_size()
.x,
0,
"pane to the left x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_left)
.unwrap()
.position_and_size()
.y,
15,
"pane to the left y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_left)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane to the left column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_left)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane to the left row count"
);
}
#[test]
pub fn resize_down_with_panes_above_aligned_right_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// │ │ │ │ │ │
// ├─────┼─────┤ ==resize=down==> │ ├─────┤
// │█████│ │ ├─────┤ │
// │█████│ │ │█████│ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let pane_above = PaneId::Terminal(1);
let focused_pane = PaneId::Terminal(2);
let pane_to_the_right = PaneId::Terminal(3);
let pane_above_and_right = PaneId::Terminal(4);
tab.horizontal_split(focused_pane, None, 1).unwrap();
tab.vertical_split(pane_to_the_right, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(pane_above_and_right, None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.x,
0,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.y,
16,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"focused pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.x,
0,
"pane above x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.y,
0,
"pane above y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane above column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above)
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane above row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.x,
61,
"pane to the right x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.y,
15,
"pane to the right y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane to the right column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane to the right row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_right)
.unwrap()
.position_and_size()
.x,
61,
"pane above and to the right x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_right)
.unwrap()
.position_and_size()
.y,
0,
"pane above and to the right y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_right)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane above and to the right column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_above_and_right)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane above and to the right row count"
);
}
#[test]
pub fn resize_down_with_panes_below_aligned_right_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │█████│ │ │█████│ │
// │█████│ │ │█████│ │
// ├─────┼─────┤ ==resize=down==> │█████├─────┤
// │ │ │ ├─────┤ │
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
let focused_pane = PaneId::Terminal(1);
let pane_below = PaneId::Terminal(2);
let pane_below_and_right = PaneId::Terminal(3);
let pane_to_the_right = PaneId::Terminal(4);
tab.horizontal_split(pane_below, None, 1).unwrap();
tab.vertical_split(pane_below_and_right, None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(pane_to_the_right, None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.x,
0,
"focused pane x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.y,
0,
"focused pane y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"focused pane column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&focused_pane)
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"focused pane row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.x,
0,
"pane below x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.y,
16,
"pane below y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane below column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below)
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane below row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_right)
.unwrap()
.position_and_size()
.x,
61,
"pane below and to the right x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_right)
.unwrap()
.position_and_size()
.y,
15,
"pane below and to the right y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_right)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane below and to the right column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_below_and_right)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane below and to the right row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.x,
61,
"pane to the right x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.y,
0,
"pane to the right y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane to the right column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&pane_to_the_right)
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane to the right row count"
);
}
#[test]
pub fn resize_down_with_panes_above_aligned_left_and_right_with_current_pane() {
// ┌───┬───┬───┐ ┌───┬───┬───┐
// │ │ │ │ │ │ │ │
// │ │ │ │ │ │ │ │
// ├───┼───┼───┤ ==resize=down==> ├───┤ ├───┤
// │ │███│ │ │ ├───┤ │
// │ │███│ │ │ │███│ │
// └───┴───┴───┘ └───┴───┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
16,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 6 row count"
);
}
#[test]
pub fn resize_down_with_panes_below_aligned_left_and_right_with_current_pane() {
// ┌───┬───┬───┐ ┌───┬───┬───┐
// │ │███│ │ │ │███│ │
// │ │███│ │ │ │███│ │
// ├───┼───┼───┤ ==resize=down==> ├───┤███├───┤
// │ │ │ │ │ ├───┤ │
// │ │ │ │ │ │ │ │
// └───┴───┴───┘ └───┴───┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
16,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 6 row count"
);
}
#[test]
pub fn resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right() {
// ┌─┬───────┬─┐ ┌─┬───────┬─┐
// │ │ │ │ │ │ │ │
// │ │ │ │ │ │ │ │
// ├─┼─┬───┬─┼─┤ ==resize=down==> ├─┤ ├─┤
// │ │ │███│ │ │ │ ├─┬───┬─┤ │
// │ │ │███│ │ │ │ │ │███│ │ │
// └─┴─┴───┴─┴─┘ └─┴─┴───┴─┴─┘
// █ == focused pane
let size = Size {
cols: 122,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.vertical_split(PaneId::Terminal(7), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
60,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
60,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
16,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
15,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
75,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
16,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
83,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
16,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 8 row count"
);
}
#[test]
pub fn resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_right() {
// ┌─┬─┬───┬─┬─┐ ┌─┬─┬───┬─┬─┐
// │ │ │███│ │ │ │ │ │███│ │ │
// │ │ │███│ │ │ │ │ │███│ │ │
// ├─┼─┴───┴─┼─┤ ==resize=down==> ├─┤ │███│ ├─┤
// │ │ │ │ │ ├─┴───┴─┤ │
// │ │ │ │ │ │ │ │
// └─┴───────┴─┘ └─┴───────┴─┘
// █ == focused pane
let size = Size {
cols: 122,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(7), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
60,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
75,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
83,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
60,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
16,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
91,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
15,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 8 row count"
);
}
#[test]
pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() {
// ┌───────────┐ ┌───────────┐
// │███████████│ │███████████│
// ├───────────┤ ==resize=down==> ├───────────┤
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 10,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 1 height stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 2 height stayed the same"
);
}
#[test]
pub fn cannot_resize_down_when_pane_has_fixed_rows() {
// ┌───────────┐ ┌───────────┐
// │███████████│ │███████████│
// ├───────────┤ ==resize=down==> ├───────────┤
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(10));
initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(0))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 height stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 height stayed the same"
);
}
#[test]
pub fn cannot_resize_down_when_pane_below_has_fixed_rows() {
// ┌───────────┐ ┌───────────┐
// │███████████│ │███████████│
// ├───────────┤ ==resize=down==> ├───────────┤
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(10));
initial_layout.children = vec![TiledPaneLayout::default(), fixed_child];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(0))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 height stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 height stayed the same"
);
}
#[test]
pub fn cannot_resize_up_when_pane_below_has_fixed_rows() {
// ┌───────────┐ ┌───────────┐
// │███████████│ │███████████│
// ├───────────┤ ==resize=down==> ├───────────┤
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(10));
initial_layout.children = vec![TiledPaneLayout::default(), fixed_child];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(0))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 height stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 height stayed the same"
);
}
#[test]
pub fn resize_left_with_pane_to_the_left() {
// ┌─────┬─────┐ ┌───┬───────┐
// │ │█████│ │ │███████│
// │ │█████│ ==resize=left==> │ │███████│
// │ │█████│ │ │███████│
// └─────┴─────┘ └───┴───────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
54,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
}
#[test]
pub fn resize_left_with_pane_to_the_right() {
// ┌─────┬─────┐ ┌───┬───────┐
// │█████│ │ │███│ │
// │█████│ │ ==resize=left==> │███│ │
// │█████│ │ │███│ │
// └─────┴─────┘ └───┴───────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
54,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_left_and_right() {
// ┌─────┬─────┬─────┐ ┌─────┬───┬───────┐
// │ │█████│ │ │ │███│ │
// │ │█████│ │ ==resize=left==> │ │███│ │
// │ │█████│ │ │ │███│ │
// └─────┴─────┴─────┘ └─────┴───┴───────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
54,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
36,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
90,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
}
#[test]
pub fn resize_left_with_multiple_panes_to_the_left() {
// ┌─────┬─────┐ ┌───┬───────┐
// │ │█████│ │ │███████│
// ├─────┤█████│ ==resize=left==> ├───┤███████│
// │ │█████│ │ │███████│
// └─────┴─────┘ └───┴───────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
54,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_left_aligned_top_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ==resize=left==> ├───┬─┴─────┤
// │ │█████│ │ │███████│
// └─────┴─────┘ └───┴───────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
54,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
15,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_right_aligned_top_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ==resize=left==> ├───┬─┴─────┤
// │█████│ │ │███│ │
// └─────┴─────┘ └───┴───────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
54,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
15,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌───┬───────┐
// │ │█████│ │ │███████│
// ├─────┼─────┤ ==resize=left==> ├───┴─┬─────┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
15,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
54,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌───┬───────┐
// │█████│ │ │███│ │
// ├─────┼─────┤ ==resize=left==> ├───┴─┬─────┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
15,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
54,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ├───┬─┴─────┤
// │ │█████│ ==resize=left==> │ │███████│
// ├─────┼─────┤ ├───┴─┬─────┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
14,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
22,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
22,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
54,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
14,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
61,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 6 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ├───┬─┴─────┤
// │█████│ │ ==resize=left==> │███│ │
// ├─────┼─────┤ ├───┴─┬─────┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
14,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
22,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
22,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
54,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
14,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
61,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 6 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below() {
// ┌─────┬─────┐ ┌─────┬─────┐
// ├─────┼─────┤ ├───┬─┴─────┤
// │ ├─────┤ │ ├───────┤
// │ │█████│ ==resize=left==> │ │███████│
// │ ├─────┤ │ ├───────┤
// ├─────┼─────┤ ├───┴─┬─────┤
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 70,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_down(&mut tab, 1);
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(7), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
35,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
35,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
21,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
56,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
56,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
35,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
54,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
35,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
54,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
46,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
54,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
51,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 8 row count"
);
}
#[test]
pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below() {
// ┌─────┬─────┐ ┌─────┬─────┐
// ├─────┼─────┤ ├───┬─┴─────┤
// ├─────┤ │ ├───┤ │
// │█████│ │ ==resize=left==> │███│ │
// ├─────┤ │ ├───┤ │
// ├─────┼─────┤ ├───┴─┬─────┤
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 70,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_down(&mut tab, 1);
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(7), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
35,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
35,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
56,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
56,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
35,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
54,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
35,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
21,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
0,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
46,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
0,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
51,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 8 row count"
);
}
#[test]
pub fn cannot_resize_left_when_pane_to_the_left_is_at_minimum_width() {
// ┌─┬─┐ ┌─┬─┐
// │ │█│ │ │█│
// │ │█│ ==resize=left==> │ │█│
// │ │█│ │ │█│
// └─┴─┘ └─┴─┘
// █ == focused pane
let size = Size { cols: 10, rows: 20 };
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab_resize_left(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
5,
"pane 1 columns stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
5,
"pane 2 columns stayed the same"
);
}
#[test]
pub fn resize_right_with_pane_to_the_left() {
// ┌─────┬─────┐ ┌───────┬───┐
// │ │█████│ │ │███│
// │ │█████│ ==resize=right==> │ │███│
// │ │█████│ │ │███│
// └─────┴─────┘ └───────┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
67,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
}
#[test]
pub fn resize_right_with_pane_to_the_right() {
// ┌─────┬─────┐ ┌───────┬───┐
// │█████│ │ │███████│ │
// │█████│ │ ==resize=right==> │███████│ │
// │█████│ │ │███████│ │
// └─────┴─────┘ └───────┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
67,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_left_and_right() {
// ┌─────┬─────┬─────┐ ┌─────┬───────┬───┐
// │ │█████│ │ │ │███████│ │
// │ │█████│ │ ==resize=right==> │ │███████│ │
// │ │█████│ │ │ │███████│ │
// └─────┴─────┴─────┘ └─────┴───────┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
36,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
97,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
24,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
}
#[test]
pub fn resize_right_with_multiple_panes_to_the_left() {
// ┌─────┬─────┐ ┌───────┬───┐
// │ │█████│ │ │███│
// ├─────┤█████│ ==resize=right==> ├───────┤███│
// │ │█████│ │ │███│
// └─────┴─────┘ └───────┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
67,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 3 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_left_aligned_top_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ==resize=right==> ├─────┴─┬───┤
// │ │█████│ │ │███│
// └─────┴─────┘ └───────┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(PaneId::Terminal(4), None, 1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
67,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
10,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 4 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_right_aligned_top_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ==resize=right==> ├─────┴─┬───┤
// │█████│ │ │███████│ │
// └─────┴─────┘ └───────┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
67,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
10,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 4 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌───────┬───┐
// │ │█████│ │ │███│
// ├─────┼─────┤ ==resize=right==> ├─────┬─┴───┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
67,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
10,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 4 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌───────┬───┐
// │█████│ │ │███████│ │
// ├─────┼─────┤ ==resize=right==> ├─────┬─┴───┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab.horizontal_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
67,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
10,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
10,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 4 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ├─────┴─┬───┤
// │ │█████│ ==resize=right==> │ │███│
// ├─────┼─────┤ ├─────┬─┴───┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
10,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
15,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
67,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
10,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
61,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 6 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// ├─────┼─────┤ ├─────┴─┬───┤
// │█████│ │ ==resize=right==> │███████│ │
// ├─────┼─────┤ ├─────┬─┴───┤
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
10,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
15,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
67,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
10,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
61,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
10,
"pane 6 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below() {
// ┌─────┬─────┐ ┌─────┬─────┐
// ├─────┼─────┤ ├─────┴─┬───┤
// │ ├─────┤ │ ├───┤
// │ │█████│ ==resize=right==> │ │███│
// │ ├─────┤ │ ├───┤
// ├─────┼─────┤ ├─────┬─┴───┤
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 70,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_up(&mut tab, 1);
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(7), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
31,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
31,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
21,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
52,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
18,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
52,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
18,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
31,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
67,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
31,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
67,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
42,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
67,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
47,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 8 row count"
);
}
#[test]
pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below() {
// ┌─────┬─────┐ ┌─────┬─────┐
// ├─────┼─────┤ ├─────┴─┬───┤
// ├─────┤ │ ├───────┤ │
// │█████│ │ ==resize=right==> │███████│ │
// ├─────┤ │ ├───────┤ │
// ├─────┼─────┤ ├─────┬─┴───┤
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 70,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_up(&mut tab, 1);
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(7), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
31,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
31,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
52,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
18,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
52,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
18,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
31,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
67,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
31,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
54,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
21,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
0,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
42,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
0,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
47,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 8 row count"
);
}
#[test]
pub fn cannot_resize_right_when_pane_to_the_left_is_at_minimum_width() {
// ┌─┬─┐ ┌─┬─┐
// │ │█│ │ │█│
// │ │█│ ==resize=right==> │ │█│
// │ │█│ │ │█│
// └─┴─┘ └─┴─┘
// █ == focused pane
let size = Size { cols: 10, rows: 20 };
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab_resize_right(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
5,
"pane 1 columns stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
5,
"pane 2 columns stayed the same"
);
}
#[test]
pub fn cannot_resize_right_when_pane_has_fixed_columns() {
// ┌──┬──┐ ┌──┬──┐
// │██│ │ │██│ │
// │██│ │ ==resize=right==> │██│ │
// │██│ │ │██│ │
// └──┴──┘ └──┴──┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(60));
initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(0))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 1 height stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 height stayed the same"
);
}
#[test]
pub fn resize_up_with_pane_above() {
// ┌───────────┐ ┌───────────┐
// │ │ │ │
// │ │ ├───────────┤
// ├───────────┤ ==resize=up==> │███████████│
// │███████████│ │███████████│
// │███████████│ │███████████│
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
9,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
9,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"pane 2 row count"
);
}
#[test]
pub fn resize_up_with_pane_below() {
// ┌───────────┐ ┌───────────┐
// │███████████│ │███████████│
// │███████████│ ├───────────┤
// ├───────────┤ ==resize=up==> │ │
// │ │ │ │
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
9,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
9,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"pane 2 row count"
);
}
#[test]
pub fn resize_up_with_panes_above_and_below() {
// ┌───────────┐ ┌───────────┐
// │ │ │ │
// │ │ ├───────────┤
// ├───────────┤ │███████████│
// │███████████│ ==resize=up==> │███████████│
// │███████████│ │███████████│
// ├───────────┤ ├───────────┤
// │ │ │ │
// │ │ │ │
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
13,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
13,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
9,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
22,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
8,
"pane 3 row count"
);
}
#[test]
pub fn resize_up_with_multiple_panes_above() {
//
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ ├─────┴─────┤
// ├─────┴─────┤ ==resize=up==> │███████████│
// │███████████│ │███████████│
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
14,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
121,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
}
#[test]
pub fn resize_up_with_panes_above_aligned_left_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ ├─────┤
// ├─────┼─────┤ ==resize=up==> ├─────┤█████│
// │ │█████│ │ │█████│
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
14,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 4 row count"
);
}
#[test]
pub fn resize_up_with_panes_below_aligned_left_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │█████│ │ │█████│
// │ │█████│ │ ├─────┤
// ├─────┼─────┤ ==resize=up==> ├─────┤ │
// │ │ │ │ │ │
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
14,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 4 row count"
);
}
#[test]
pub fn resize_up_with_panes_above_aligned_right_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │ │ │ │ │ │
// │ │ │ ├─────┤ │
// ├─────┼─────┤ ==resize=up==> │█████├─────┤
// │█████│ │ │█████│ │
// │█████│ │ │█████│ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
14,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
}
#[test]
pub fn resize_up_with_panes_below_aligned_right_with_current_pane() {
// ┌─────┬─────┐ ┌─────┬─────┐
// │█████│ │ │█████│ │
// │█████│ │ ├─────┤ │
// ├─────┼─────┤ ==resize=up==> │ ├─────┤
// │ │ │ │ │ │
// │ │ │ │ │ │
// └─────┴─────┘ └─────┴─────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
14,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
61,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
}
#[test]
pub fn resize_up_with_panes_above_aligned_left_and_right_with_current_pane() {
// ┌───┬───┬───┐ ┌───┬───┬───┐
// │ │ │ │ │ │ │ │
// │ │ │ │ │ ├───┤ │
// ├───┼───┼───┤ ==resize=up==> ├───┤███├───┤
// │ │███│ │ │ │███│ │
// │ │███│ │ │ │███│ │
// └───┴───┴───┘ └───┴───┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
14,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 6 row count"
);
}
#[test]
pub fn resize_up_with_panes_below_aligned_left_and_right_with_current_pane() {
// ┌───┬───┬───┐ ┌───┬───┬───┐
// │ │███│ │ │ │███│ │
// │ │███│ │ │ ├───┤ │
// ├───┼───┼───┤ ==resize=up==> ├───┤ ├───┤
// │ │ │ │ │ │ │ │
// │ │ │ │ │ │ │ │
// └───┴───┴───┘ └───┴───┴───┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.move_focus_up(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
61,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
61,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
14,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
15,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
61,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
0,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
0,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
30,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 6 row count"
);
}
#[test]
pub fn resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right() {
// ┌─┬───────┬─┐ ┌─┬───────┬─┐
// │ │ │ │ │ │ │ │
// │ │ │ │ │ ├─┬───┬─┤ │
// ├─┼─┬───┬─┼─┤ ==resize=up==> ├─┤ │███│ ├─┤
// │ │ │███│ │ │ │ │ │███│ │ │
// │ │ │███│ │ │ │ │ │███│ │ │
// └─┴─┴───┴─┴─┘ └─┴─┴───┴─┴─┘
// █ == focused pane
let size = Size {
cols: 122,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.vertical_split(PaneId::Terminal(7), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
60,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
60,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
14,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
15,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
75,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
14,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
83,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
14,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 8 row count"
);
}
#[test]
pub fn resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_right() {
// ┌─┬─┬───┬─┬─┐ ┌─┬─┬───┬─┬─┐
// │ │ │███│ │ │ │ │ │███│ │ │
// │ │ │███│ │ │ │ ├─┴───┴─┤ │
// ├─┼─┴───┴─┼─┤ ==resize=up==> ├─┤ ├─┤
// │ │ │ │ │ │ │ │
// │ │ │ │ │ │ │ │
// └─┴───────┴─┘ └─┴───────┴─┘
// █ == focused pane
let size = Size {
cols: 122,
rows: 30,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(4), None, 1).unwrap();
tab.move_focus_down(1).unwrap();
tab.vertical_split(PaneId::Terminal(5), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(6), None, 1).unwrap();
tab.move_focus_up(1).unwrap();
tab.move_focus_left(1).unwrap();
tab.vertical_split(PaneId::Terminal(7), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(8), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_up(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.x,
0,
"pane 1 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.y,
0,
"pane 1 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 1 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 1 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
0,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
15,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
60,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 2 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
60,
"pane 3 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
0,
"pane 3 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
15,
"pane 3 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.x,
91,
"pane 4 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.y,
0,
"pane 4 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 4 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(4))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 4 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.x,
60,
"pane 5 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.y,
14,
"pane 5 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 5 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(5))
.unwrap()
.position_and_size()
.rows
.as_usize(),
16,
"pane 5 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.x,
91,
"pane 6 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.y,
15,
"pane 6 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.cols
.as_usize(),
31,
"pane 6 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(6))
.unwrap()
.position_and_size()
.rows
.as_usize(),
15,
"pane 6 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.x,
75,
"pane 7 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.y,
0,
"pane 7 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 7 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(7))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 7 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.x,
83,
"pane 8 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.y,
0,
"pane 8 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.cols
.as_usize(),
8,
"pane 8 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(8))
.unwrap()
.position_and_size()
.rows
.as_usize(),
14,
"pane 8 row count"
);
}
#[test]
pub fn cannot_resize_up_when_pane_above_is_at_minimum_height() {
// ┌───────────┐ ┌───────────┐
// │ │ │ │
// ├───────────┤ ==resize=up==> ├───────────┤
// │███████████│ │███████████│
// └───────────┘ └───────────┘
// █ == focused pane
let size = Size {
cols: 121,
rows: 10,
};
let mut tab = create_new_tab(size);
tab.horizontal_split(PaneId::Terminal(2), None, 1).unwrap();
tab_resize_down(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(1))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 1 height stayed the same"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
5,
"pane 2 height stayed the same"
);
}
#[test]
pub fn nondirectional_resize_increase_with_1_pane() {
let size = Size {
cols: 121,
rows: 10,
};
let mut tab = create_new_tab(size);
tab_resize_increase(&mut tab, 1);
assert_eq!(
tab.get_active_pane(1).unwrap().position_and_size().y,
0,
"There is only 1 pane so both coordinates should be 0"
);
assert_eq!(
tab.get_active_pane(1).unwrap().position_and_size().x,
0,
"There is only 1 pane so both coordinates should be 0"
);
}
#[test]
pub fn nondirectional_resize_increase_with_1_pane_to_left() {
let size = Size {
cols: 121,
rows: 10,
};
let mut tab = create_new_tab(size);
let new_pane_id_1 = PaneId::Terminal(2);
tab.vertical_split(new_pane_id_1, None, 1).unwrap();
tab_resize_increase(&mut tab, 1);
// should behave like `resize_left_with_pane_to_the_left`
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
54,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
}
#[test]
pub fn nondirectional_resize_increase_with_2_panes_to_left() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_right(1).unwrap();
tab_resize_increase(&mut tab, 1);
// should behave like `resize_left_with_multiple_panes_to_the_left`
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
54,
"pane 2 x position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"pane 2 y position"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"pane 2 column count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"pane 2 row count"
);
}
#[test]
pub fn nondirectional_resize_increase_with_1_pane_to_right_1_pane_above() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
tab_resize_increase(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.y,
9,
"Pane 3 y coordinate"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.x,
0,
"Pane 3 x coordinate"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.rows
.as_usize(),
11,
"Pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(3))
.unwrap()
.position_and_size()
.cols
.as_usize(),
67,
"Pane 3 col count"
);
}
#[test]
pub fn nondirectional_resize_increase_with_1_pane_to_right_1_pane_to_left() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_increase(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"Pane 3 y coordinate"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"Pane 3 x coordinate"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"Pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
36,
"Pane 3 col count"
);
}
#[test]
pub fn nondirectional_resize_increase_with_pane_above_aligned_right_with_current_pane() {
let size = Size {
cols: 121,
rows: 20,
};
let mut tab = create_new_tab(size);
tab.vertical_split(PaneId::Terminal(2), None, 1).unwrap();
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
tab.move_focus_left(1).unwrap();
tab_resize_increase(&mut tab, 1);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.y,
0,
"Pane 3 y coordinate"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.x,
61,
"Pane 3 x coordinate"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.rows
.as_usize(),
20,
"Pane 3 row count"
);
assert_eq!(
tab.tiled_panes
.panes
.get(&PaneId::Terminal(2))
.unwrap()
.position_and_size()
.cols
.as_usize(),
36,
"Pane 3 col count"
);
}
#[test]
pub fn custom_cursor_height_width_ratio() {
let size = Size {
cols: 121,
rows: 20,
};
let character_cell_size = Rc::new(RefCell::new(None));
let tab = create_new_tab_with_cell_size(size, character_cell_size.clone());
let initial_cursor_height_width_ratio = tab.tiled_panes.cursor_height_width_ratio();
*character_cell_size.borrow_mut() = Some(SizeInPixels {
height: 10,
width: 4,
});
let cursor_height_width_ratio_after_update = tab.tiled_panes.cursor_height_width_ratio();
assert_eq!(
initial_cursor_height_width_ratio, None,
"initially no ratio "
);
assert_eq!(
cursor_height_width_ratio_after_update,
Some(3),
"ratio updated successfully"
); // 10 / 4 == 2.5, rounded: 3
}
#[test]
fn correctly_resize_frameless_panes_on_pane_close() {
// check that https://github.com/zellij-org/zellij/issues/1773 is fixed
let cols = 60;
let rows = 20;
let size = Size { cols, rows };
let mut tab = create_new_tab(size);
tab.set_pane_frames(false);
// a single frameless pane should take up all available space
let pane = tab.tiled_panes.panes.get(&PaneId::Terminal(1)).unwrap();
let content_size = (pane.get_content_columns(), pane.get_content_rows());
assert_eq!(content_size, (cols, rows));
tab.new_pane(PaneId::Terminal(2), None, None, None, Some(1))
.unwrap();
tab.close_pane(PaneId::Terminal(2), true, None);
// the size should be the same after adding and then removing a pane
let pane = tab.tiled_panes.panes.get(&PaneId::Terminal(1)).unwrap();
let content_size = (pane.get_content_columns(), pane.get_content_rows());
assert_eq!(content_size, (cols, rows));
}