From da415657df44a3e1ffbf82c9c313a8a287d8f7a1 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Tue, 29 Jun 2021 23:19:23 +0200 Subject: [PATCH 01/23] Add new dependencies to `CONTRIBUTING.md` --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d34367f3..4b9455b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,6 +44,8 @@ cargo make manpage To run `install` or `publish`, you'll need the package `binaryen` in the version `wasm-opt --version` > 97, for it's command `wasm-opt`. +To run `test`, you will need the package `pkg-config` and a version of `openssl`. + ## Running the end-to-end tests Zellij includes some end to end tests which test the whole application as a black-box from the outside. These tests work by running a docker container which contains the Zellij binary, connecting to it via ssh, sending some commands and comparing the output received against predefined snapshots. From ed4fd2a8e77df304539ca7f445a78039028eaa8a Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Wed, 30 Jun 2021 11:27:35 +0200 Subject: [PATCH 02/23] chore(tests): move all integration tests to be either unit or e2e tests - remove old testing infra (#589) * tests(integration): move basic integration tests to be unit tests * fix(tests): silently fail threadbus for tests * tests(unit): move compatibility tests to become unit tests for grid * tests(unit): move close_pane tests to become unit tests for grid * tests(e2e): move basic layout test to e2e * tests(unit): move move_focus tests to be unit tests * tests(unit): move resize_down tests to be unit tests * tests(unit): move resize_left tests to be unit tests * tests(unit): move resize_right tests to be unit tests * tests(unit): move resize_up tests to be unit tests * tests(infra): remove unused infra * style(fmt): make rustfmt happy * debug * debug * debug * debug * chore(test): shift volume mounting around because github actions is a special child --- .github/workflows/e2e.yml | 5 + Cargo.lock | 1 + docker-compose.yml | 3 + src/tests/e2e/cases.rs | 83 +- src/tests/e2e/remote_runner.rs | 107 +- ...sts__e2e__cases__accepts_basic_layout.snap | 29 + src/tests/fakes.rs | 329 - src/tests/integration/basic.rs | 498 - src/tests/integration/close_pane.rs | 674 - src/tests/integration/compatibility.rs | 681 - src/tests/integration/layouts.rs | 67 - src/tests/integration/mod.rs | 15 - src/tests/integration/move_focus_down.rs | 91 - src/tests/integration/move_focus_left.rs | 131 - src/tests/integration/move_focus_right.rs | 131 - src/tests/integration/move_focus_up.rs | 91 - src/tests/integration/resize_down.rs | 725 - src/tests/integration/resize_left.rs | 702 - src/tests/integration/resize_right.rs | 701 - src/tests/integration/resize_up.rs | 719 - ...__integration__basic__bracketed_paste.snap | 25 - ...argest_terminal_when_there_is_no_room.snap | 9 - ...lly_when_active_terminal_is_too_small.snap | 9 - ...lly_when_active_terminal_is_too_small.snap | 25 - ..._tests__integration__basic__max_panes.snap | 25 - ...__basic__scrolling_down_inside_a_pane.snap | 25 - ...ic__scrolling_page_down_inside_a_pane.snap | 25 - ...asic__scrolling_page_up_inside_a_pane.snap | 25 - ...on__basic__scrolling_up_inside_a_pane.snap | 25 - ...ration__basic__split_largest_terminal.snap | 25 - ...__basic__split_terminals_horizontally.snap | 25 - ...on__basic__split_terminals_vertically.snap | 25 - ...tion__basic__starts_with_one_terminal.snap | 25 - ...basic__toggle_focused_pane_fullscreen.snap | 25 - ...close_pane_with_another_pane_above_it.snap | 25 - ...close_pane_with_another_pane_below_it.snap | 25 - ...se_pane_with_another_pane_to_the_left.snap | 25 - ...e_pane_with_another_pane_to_the_right.snap | 25 - ...ose_pane_with_multiple_panes_above_it.snap | 25 - ...panes_above_it_away_from_screen_edges.snap | 25 - ...ose_pane_with_multiple_panes_below_it.snap | 25 - ...panes_below_it_away_from_screen_edges.snap | 25 - ..._pane_with_multiple_panes_to_the_left.snap | 25 - ...es_to_the_left_away_from_screen_edges.snap | 35 - ...pane_with_multiple_panes_to_the_right.snap | 25 - ...s_to_the_right_away_from_screen_edges.snap | 35 - ...ose_pane__closing_last_pane_exits_app.snap | 25 - ...__compatibility__bash_cursor_linewrap.snap | 33 - ...n__compatibility__clear_scroll_region.snap | 33 - ...lity__display_tab_characters_properly.snap | 33 - ...gration__compatibility__emacs_longbuf.snap | 65 - ...on__compatibility__exa_plus_omf_theme.snap | 61 - ...__compatibility__fish_paste_multiline.snap | 33 - ...y__fish_select_tab_completion_options.snap | 33 - ...tibility__fish_tab_completion_options.snap | 33 - ...ion__compatibility__git_diff_scrollup.snap | 33 - ...__integration__compatibility__git_log.snap | 33 - ...sts__integration__compatibility__htop.snap | 33 - ...__compatibility__htop_right_scrolling.snap | 33 - ...ration__compatibility__htop_scrolling.snap | 33 - ...on__compatibility__neovim_insert_mode.snap | 33 - ...bility__run_bandwhich_from_fish_shell.snap | 33 - ...egration__compatibility__top_and_quit.snap | 61 - ...ntegration__compatibility__vim_ctrl_d.snap | 33 - ...ntegration__compatibility__vim_ctrl_u.snap | 33 - ...gration__compatibility__vim_overwrite.snap | 33 - ...compatibility__vim_scroll_region_down.snap | 33 - ...tion__layouts__accepts_basic_layout-2.snap | 25 - ...tion__layouts__accepts_basic_layout-3.snap | 25 - ...ration__layouts__accepts_basic_layout.snap | 25 - ...ion__move_focus_down__move_focus_down.snap | 25 - ...ove_focus_down_to_the_largest_overlap.snap | 25 - ...s_down_to_the_most_recently_used_pane.snap | 25 - ...ion__move_focus_left__move_focus_left.snap | 25 - ...cus_left__move_focus_left_changes_tab.snap | 25 - ...ove_focus_left_to_the_largest_overlap.snap | 25 - ...s_left_to_the_most_recently_used_pane.snap | 25 - ...n__move_focus_right__move_focus_right.snap | 25 - ...s_right__move_focus_right_changes_tab.snap | 25 - ...ve_focus_right_to_the_largest_overlap.snap | 25 - ..._right_to_the_most_recently_used_pane.snap | 25 - ...gration__move_focus_up__move_focus_up.snap | 25 - ..._move_focus_up_to_the_largest_overlap.snap | 25 - ...cus_up_to_the_most_recently_used_pane.snap | 25 - ..._when_pane_below_is_at_minimum_height.snap | 12 - ...resize_down_with_multiple_panes_above.snap | 25 - ...ize_down__resize_down_with_pane_above.snap | 25 - ...ize_down__resize_down_with_pane_below.snap | 25 - ...gned_left_and_right_with_current_pane.snap | 25 - ...ight_with_panes_to_the_left_and_right.snap | 45 - ..._above_aligned_left_with_current_pane.snap | 25 - ...above_aligned_right_with_current_pane.snap | 25 - ...esize_down_with_panes_above_and_below.snap | 30 - ...gned_left_and_right_with_current_pane.snap | 25 - ..._and_right_with_to_the_left_and_right.snap | 45 - ..._below_aligned_left_with_current_pane.snap | 25 - ...below_aligned_right_with_current_pane.snap | 25 - ..._pane_to_the_left_is_at_minimum_width.snap | 25 - ..._left_with_multiple_panes_to_the_left.snap | 25 - ...ft__resize_left_with_pane_to_the_left.snap | 25 - ...t__resize_left_with_pane_to_the_right.snap | 25 - ...left_aligned_bottom_with_current_pane.snap | 25 - ...gned_top_and_bottom_with_current_pane.snap | 25 - ...and_bottom_with_panes_above_and_below.snap | 45 - ...he_left_aligned_top_with_current_pane.snap | 25 - ...left_with_panes_to_the_left_and_right.snap | 25 - ...ight_aligned_bottom_with_current_pane.snap | 25 - ...gned_top_and_bottom_with_current_pane.snap | 25 - ...and_bottom_with_panes_above_and_below.snap | 45 - ...e_right_aligned_top_with_current_pane.snap | 25 - ..._pane_to_the_left_is_at_minimum_width.snap | 25 - ...right_with_multiple_panes_to_the_left.snap | 25 - ...t__resize_right_with_pane_to_the_left.snap | 25 - ...__resize_right_with_pane_to_the_right.snap | 25 - ...left_aligned_bottom_with_current_pane.snap | 25 - ...gned_top_and_bottom_with_current_pane.snap | 25 - ...and_bottom_with_panes_above_and_below.snap | 45 - ...he_left_aligned_top_with_current_pane.snap | 25 - ...ight_with_panes_to_the_left_and_right.snap | 25 - ...ight_aligned_bottom_with_current_pane.snap | 25 - ...gned_top_and_bottom_with_current_pane.snap | 25 - ...and_bottom_with_panes_above_and_below.snap | 45 - ...e_right_aligned_top_with_current_pane.snap | 25 - ..._when_pane_above_is_at_minimum_height.snap | 12 - ...__resize_up_with_multiple_panes_above.snap | 25 - ..._resize_up__resize_up_with_pane_above.snap | 25 - ..._resize_up__resize_up_with_pane_below.snap | 25 - ...gned_left_and_right_with_current_pane.snap | 25 - ...ight_with_panes_to_the_left_and_right.snap | 45 - ..._above_aligned_left_with_current_pane.snap | 25 - ...above_aligned_right_with_current_pane.snap | 25 - ..._resize_up_with_panes_above_and_below.snap | 25 - ...gned_left_and_right_with_current_pane.snap | 25 - ..._and_right_with_to_the_left_and_right.snap | 45 - ..._below_aligned_left_with_current_pane.snap | 25 - ...below_aligned_right_with_current_pane.snap | 25 - ...ation__tabs__close_last_pane_in_a_tab.snap | 25 - ...__tests__integration__tabs__close_tab.snap | 25 - ...tegration__tabs__close_the_middle_tab.snap | 25 - ...the_tab_that_has_a_pane_in_fullscreen.snap | 25 - ..._tabs__closing_last_tab_exits_the_app.snap | 25 - ...ests__integration__tabs__open_new_tab.snap | 25 - ...integration__tabs__switch_to_next_tab.snap | 25 - ...integration__tabs__switch_to_prev_tab.snap | 25 - ..._window_height_increase_with_one_pane.snap | 25 - ...dth_and_height_decrease_with_one_pane.snap | 25 - ...__window_width_decrease_with_one_pane.snap | 25 - ...__window_width_increase_with_one_pane.snap | 25 - ...en__adding_new_terminal_in_fullscreen.snap | 25 - ..._move_focus_is_disabled_in_fullscreen.snap | 25 - src/tests/integration/tabs.rs | 326 - .../integration/terminal_window_resize.rs | 161 - src/tests/integration/toggle_fullscreen.rs | 89 - src/tests/mod.rs | 36 - src/tests/possible_tty_inputs.rs | 103 - src/tests/tty_inputs.rs | 550 - src/tests/utils.rs | 95 - zellij-client/Cargo.toml | 3 + zellij-client/src/input_handler.rs | 4 + zellij-client/src/unit/input_handler_tests.rs | 260 + zellij-server/src/lib.rs | 1 + zellij-server/src/panes/terminal_pane.rs | 4 + zellij-server/src/panes/unit/grid_tests.rs | 290 + ...rid__grid_tests__bash_cursor_linewrap.snap | 10 + ...grid__grid_tests__clear_scroll_region.snap | 9 + ...ests__display_tab_characters_properly.snap | 21 + ...anes__grid__grid_tests__emacs_longbuf.snap | 10 + ..._grid__grid_tests__exa_plus_omf_theme.snap | 62 + ...rid__grid_tests__fish_paste_multiline.snap | 27 + ...s__fish_select_tab_completion_options.snap | 11 + ...id_tests__fish_tab_completion_options.snap | 11 + ...__grid__grid_tests__git_diff_scrollup.snap | 34 + ...ver__panes__grid__grid_tests__git_log.snap | 34 + ...server__panes__grid__grid_tests__htop.snap | 34 + ...rid__grid_tests__htop_right_scrolling.snap | 34 + ...nes__grid__grid_tests__htop_scrolling.snap | 34 + ..._grid__grid_tests__neovim_insert_mode.snap | 34 + ..._tests__run_bandwhich_from_fish_shell.snap | 34 + ...panes__grid__grid_tests__top_and_quit.snap | 62 + ...__panes__grid__grid_tests__vim_ctrl_d.snap | 34 + ...__panes__grid__grid_tests__vim_ctrl_u.snap | 34 + ...anes__grid__grid_tests__vim_overwrite.snap | 34 + ...d__grid_tests__vim_scroll_region_down.snap | 34 + ...grid_tests__scrolling_inside_a_pane-2.snap | 26 + ...grid_tests__scrolling_inside_a_pane-3.snap | 26 + ...__grid_tests__scrolling_inside_a_pane.snap | 26 + .../src/panes/unit/terminal_pane_tests.rs | 30 + zellij-server/src/screen.rs | 22 +- zellij-server/src/tab.rs | 4 + zellij-server/src/thread_bus.rs | 72 +- zellij-server/src/unit/screen_tests.rs | 255 + zellij-server/src/unit/tab_tests.rs | 11840 ++++++++++++++++ zellij-utils/src/input/actions.rs | 4 +- zellij-utils/src/ipc.rs | 2 +- 194 files changed, 13669 insertions(+), 10565 deletions(-) create mode 100644 src/tests/e2e/snapshots/zellij__tests__e2e__cases__accepts_basic_layout.snap delete mode 100644 src/tests/fakes.rs delete mode 100644 src/tests/integration/basic.rs delete mode 100644 src/tests/integration/close_pane.rs delete mode 100644 src/tests/integration/compatibility.rs delete mode 100644 src/tests/integration/layouts.rs delete mode 100644 src/tests/integration/mod.rs delete mode 100644 src/tests/integration/move_focus_down.rs delete mode 100644 src/tests/integration/move_focus_left.rs delete mode 100644 src/tests/integration/move_focus_right.rs delete mode 100644 src/tests/integration/move_focus_up.rs delete mode 100644 src/tests/integration/resize_down.rs delete mode 100644 src/tests/integration/resize_left.rs delete mode 100644 src/tests/integration/resize_right.rs delete mode 100644 src/tests/integration/resize_up.rs delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__bracketed_paste.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_largest_terminal_when_there_is_no_room.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_horizontally_when_active_terminal_is_too_small.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_vertically_when_active_terminal_is_too_small.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__max_panes.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_down_inside_a_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_down_inside_a_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_up_inside_a_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_up_inside_a_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__split_largest_terminal.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_horizontally.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_vertically.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__starts_with_one_terminal.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__basic__toggle_focused_pane_fullscreen.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_above_it.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_below_it.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_left.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it_away_from_screen_edges.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it_away_from_screen_edges.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left_away_from_screen_edges.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right_away_from_screen_edges.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__close_pane__closing_last_pane_exits_app.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__bash_cursor_linewrap.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__clear_scroll_region.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__display_tab_characters_properly.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__emacs_longbuf.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__exa_plus_omf_theme.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_paste_multiline.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_select_tab_completion_options.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_tab_completion_options.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_diff_scrollup.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_log.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_right_scrolling.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_scrolling.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__neovim_insert_mode.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__run_bandwhich_from_fish_shell.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__top_and_quit.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_d.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_u.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_overwrite.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_scroll_region_down.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-2.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-3.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_largest_overlap.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_most_recently_used_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_changes_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_largest_overlap.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_most_recently_used_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_changes_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_largest_overlap.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_most_recently_used_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_largest_overlap.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_most_recently_used_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__cannot_resize_down_when_pane_below_is_at_minimum_height.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_multiple_panes_above.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_above.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_and_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__cannot_resize_left_when_pane_to_the_left_is_at_minimum_width.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_multiple_panes_to_the_left.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_left.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_and_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__cannot_resize_right_when_pane_to_the_left_is_at_minimum_width.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_multiple_panes_to_the_left.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_left.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_and_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__cannot_resize_up_when_pane_above_is_at_minimum_height.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_multiple_panes_above.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_above.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_and_below.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_right_with_current_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__close_last_pane_in_a_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__close_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_middle_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_tab_that_has_a_pane_in_fullscreen.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__closing_last_tab_exits_the_app.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__open_new_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_next_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_prev_tab.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_height_increase_with_one_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_and_height_decrease_with_one_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_decrease_with_one_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_increase_with_one_pane.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__adding_new_terminal_in_fullscreen.snap delete mode 100644 src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__move_focus_is_disabled_in_fullscreen.snap delete mode 100644 src/tests/integration/tabs.rs delete mode 100644 src/tests/integration/terminal_window_resize.rs delete mode 100644 src/tests/integration/toggle_fullscreen.rs delete mode 100644 src/tests/possible_tty_inputs.rs delete mode 100644 src/tests/tty_inputs.rs delete mode 100644 src/tests/utils.rs create mode 100644 zellij-client/src/unit/input_handler_tests.rs create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__bash_cursor_linewrap.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__clear_scroll_region.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__display_tab_characters_properly.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__emacs_longbuf.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__exa_plus_omf_theme.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_paste_multiline.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_select_tab_completion_options.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_tab_completion_options.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_diff_scrollup.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_log.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_right_scrolling.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_scrolling.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__neovim_insert_mode.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__run_bandwhich_from_fish_shell.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__top_and_quit.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_d.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_u.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_overwrite.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_scroll_region_down.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-2.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-3.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane.snap create mode 100644 zellij-server/src/panes/unit/terminal_pane_tests.rs create mode 100644 zellij-server/src/unit/screen_tests.rs create mode 100644 zellij-server/src/unit/tab_tests.rs diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index a81d4ae6..640244a1 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -39,6 +39,11 @@ jobs: run: cargo install --debug cargo-make - name: Build asset run: cargo make build-e2e + # we copy this manually into the target folder instead of mounting it because + # github actions creates the service first, and if it has a mount that is part + # of your yet unchecked out code, you cannot checkout the code after the mount + - name: Copy fixtures folder to target + run: cp -r ${{ github.workspace }}/src/tests/fixtures ${{ github.workspace }}/target - name: Restart ssh container # we need to do this because otherwise the volume will not be mounted # on the docker container, since it was created before the folder existed diff --git a/Cargo.lock b/Cargo.lock index a2c525d6..264fb743 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2456,6 +2456,7 @@ dependencies = [ name = "zellij-client" version = "0.14.0" dependencies = [ + "insta", "termbg", "zellij-utils", ] diff --git a/docker-compose.yml b/docker-compose.yml index ec52486e..7130f460 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,9 @@ services: - type: bind source: ./target target: /usr/src/zellij + - type: bind + source: ./src/tests/fixtures + target: /usr/src/zellij/fixtures ports: - 2222:2222 restart: unless-stopped diff --git a/src/tests/e2e/cases.rs b/src/tests/e2e/cases.rs index 5af67074..69233f25 100644 --- a/src/tests/e2e/cases.rs +++ b/src/tests/e2e/cases.rs @@ -1,15 +1,58 @@ +#![allow(unused)] + use ::insta::assert_snapshot; use zellij_utils::pane_size::PositionAndSize; use rand::Rng; +use std::path::Path; + use super::remote_runner::{RemoteRunner, RemoteTerminal, Step}; -use crate::tests::utils::commands::{ - CLOSE_PANE_IN_PANE_MODE, DETACH_IN_SESSION_MODE, ENTER, LOCK_MODE, NEW_TAB_IN_TAB_MODE, - PANE_MODE, QUIT, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, SCROLL_MODE, - SCROLL_UP_IN_SCROLL_MODE, SESSION_MODE, SPLIT_RIGHT_IN_PANE_MODE, TAB_MODE, - TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, -}; + +pub const QUIT: [u8; 1] = [17]; // ctrl-q +pub const ESC: [u8; 1] = [27]; +pub const ENTER: [u8; 1] = [10]; // char '\n' +pub const LOCK_MODE: [u8; 1] = [7]; // ctrl-g + +pub const MOVE_FOCUS_LEFT_IN_NORMAL_MODE: [u8; 2] = [27, 104]; // alt-h +pub const MOVE_FOCUS_RIGHT_IN_NORMAL_MODE: [u8; 2] = [27, 108]; // alt-l + +pub const PANE_MODE: [u8; 1] = [16]; // ctrl-p +pub const SPAWN_TERMINAL_IN_PANE_MODE: [u8; 1] = [110]; // n +pub const MOVE_FOCUS_IN_PANE_MODE: [u8; 1] = [112]; // p +pub const SPLIT_DOWN_IN_PANE_MODE: [u8; 1] = [100]; // d +pub const SPLIT_RIGHT_IN_PANE_MODE: [u8; 1] = [114]; // r +pub const TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE: [u8; 1] = [102]; // f +pub const CLOSE_PANE_IN_PANE_MODE: [u8; 1] = [120]; // x +pub const MOVE_FOCUS_DOWN_IN_PANE_MODE: [u8; 1] = [106]; // j +pub const MOVE_FOCUS_UP_IN_PANE_MODE: [u8; 1] = [107]; // k +pub const MOVE_FOCUS_LEFT_IN_PANE_MODE: [u8; 1] = [104]; // h +pub const MOVE_FOCUS_RIGHT_IN_PANE_MODE: [u8; 1] = [108]; // l + +pub const SCROLL_MODE: [u8; 1] = [19]; // ctrl-s +pub const SCROLL_UP_IN_SCROLL_MODE: [u8; 1] = [107]; // k +pub const SCROLL_DOWN_IN_SCROLL_MODE: [u8; 1] = [106]; // j +pub const SCROLL_PAGE_UP_IN_SCROLL_MODE: [u8; 1] = [2]; // ctrl-b +pub const SCROLL_PAGE_DOWN_IN_SCROLL_MODE: [u8; 1] = [6]; // ctrl-f + +pub const RESIZE_MODE: [u8; 1] = [18]; // ctrl-r +pub const RESIZE_DOWN_IN_RESIZE_MODE: [u8; 1] = [106]; // j +pub const RESIZE_UP_IN_RESIZE_MODE: [u8; 1] = [107]; // k +pub const RESIZE_LEFT_IN_RESIZE_MODE: [u8; 1] = [104]; // h +pub const RESIZE_RIGHT_IN_RESIZE_MODE: [u8; 1] = [108]; // l + +pub const TAB_MODE: [u8; 1] = [20]; // ctrl-t +pub const NEW_TAB_IN_TAB_MODE: [u8; 1] = [110]; // n +pub const SWITCH_NEXT_TAB_IN_TAB_MODE: [u8; 1] = [108]; // l +pub const SWITCH_PREV_TAB_IN_TAB_MODE: [u8; 1] = [104]; // h +pub const CLOSE_TAB_IN_TAB_MODE: [u8; 1] = [120]; // x + +pub const SESSION_MODE: [u8; 1] = [15]; // ctrl-o +pub const DETACH_IN_SESSION_MODE: [u8; 1] = [100]; // d + +pub const BRACKETED_PASTE_START: [u8; 6] = [27, 91, 50, 48, 48, 126]; // \u{1b}[200~ +pub const BRACKETED_PASTE_END: [u8; 6] = [27, 91, 50, 48, 49, 126]; // \u{1b}[201 +pub const SLEEP: [u8; 0] = []; // All the E2E tests are marked as "ignored" so that they can be run separately from the normal // tests @@ -714,3 +757,31 @@ pub fn detach_and_attach_session() { .run_all_steps(); assert_snapshot!(last_snapshot); } + +#[test] +#[ignore] +pub fn accepts_basic_layout() { + let fake_win_size = PositionAndSize { + cols: 120, + rows: 24, + x: 0, + y: 0, + ..Default::default() + }; + let layout_file_name = "three-panes-with-nesting.yaml"; + let last_snapshot = RemoteRunner::new_with_layout("accepts_basic_layout", fake_win_size, layout_file_name, None) + .add_step(Step { + name: "Wait for app to load", + instruction: |remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.cursor_position_is(2, 0) + && remote_terminal.snapshot_contains("$ █ │$") + && remote_terminal.snapshot_contains("$ ") { + step_is_complete = true; + } + step_is_complete + }, + }) + .run_all_steps(); + assert_snapshot!(last_snapshot); +} diff --git a/src/tests/e2e/remote_runner.rs b/src/tests/e2e/remote_runner.rs index b53c3129..053df477 100644 --- a/src/tests/e2e/remote_runner.rs +++ b/src/tests/e2e/remote_runner.rs @@ -8,7 +8,10 @@ use ssh2::Session; use std::io::prelude::*; use std::net::TcpStream; +use std::path::Path; + const ZELLIJ_EXECUTABLE_LOCATION: &str = "/usr/src/zellij/x86_64-unknown-linux-musl/debug/zellij"; +const ZELLIJ_LAYOUT_PATH: &str = "/usr/src/zellij/fixtures/layouts"; const CONNECTION_STRING: &str = "127.0.0.1:2222"; const CONNECTION_USERNAME: &str = "test"; const CONNECTION_PASSWORD: &str = "test"; @@ -54,6 +57,38 @@ fn start_zellij(channel: &mut ssh2::Channel, session_name: Option<&String>) { channel.flush().unwrap(); } +fn start_zellij_with_layout( + channel: &mut ssh2::Channel, + layout_path: &str, + session_name: Option<&String>, +) { + match session_name.as_ref() { + Some(name) => { + channel + .write_all( + format!( + "{} --layout-path {} --session {}\n", + ZELLIJ_EXECUTABLE_LOCATION, layout_path, name + ) + .as_bytes(), + ) + .unwrap(); + } + None => { + channel + .write_all( + format!( + "{} --layout-path {}\n", + ZELLIJ_EXECUTABLE_LOCATION, layout_path + ) + .as_bytes(), + ) + .unwrap(); + } + }; + channel.flush().unwrap(); +} + pub fn take_snapshot(terminal_output: &mut TerminalPane) -> String { let output_lines = terminal_output.read_buffer_as_lines(); let cursor_coordinates = terminal_output.cursor_coordinates(); @@ -107,6 +142,20 @@ impl<'a> RemoteTerminal<'a> { pub fn snapshot_contains(&self, text: &str) -> bool { self.current_snapshot.contains(text) } + #[allow(unused)] + pub fn current_snapshot(&self) -> String { + // convenience method for writing tests, + // this should only be used when developing, + // please prefer "snapsht_contains" instead + self.current_snapshot.clone() + } + #[allow(unused)] + pub fn current_cursor_position(&self) -> String { + // convenience method for writing tests, + // this should only be used when developing, + // please prefer "cursor_position_is" instead + format!("x: {}, y: {}", self.cursor_x, self.cursor_y) + } pub fn send_key(&mut self, key: &[u8]) { self.channel.write(key).unwrap(); self.channel.flush().unwrap(); @@ -148,6 +197,7 @@ pub struct RemoteRunner { currently_running_step: Option, retries_left: usize, win_size: PositionAndSize, + layout_file_name: Option<&'static str>, } impl RemoteRunner { @@ -173,6 +223,39 @@ impl RemoteRunner { current_step_index: 0, retries_left: 3, win_size, + layout_file_name: None, + } + } + pub fn new_with_layout( + test_name: &'static str, + win_size: PositionAndSize, + layout_file_name: &'static str, + session_name: Option, + ) -> Self { + // let layout_file_name = local_layout_path.file_name().unwrap(); + let remote_path = Path::new(ZELLIJ_LAYOUT_PATH).join(layout_file_name); // TODO: not hardcoded + let sess = ssh_connect(); + let mut channel = sess.channel_session().unwrap(); + let vte_parser = vte::Parser::new(); + let terminal_output = TerminalPane::new(0, win_size, Palette::default()); + setup_remote_environment(&mut channel, win_size); + start_zellij_with_layout( + &mut channel, + &remote_path.to_string_lossy(), + session_name.as_ref(), + ); + RemoteRunner { + steps: vec![], + channel, + terminal_output, + vte_parser, + session_name, + test_name, + currently_running_step: None, + current_step_index: 0, + retries_left: 3, + win_size, + layout_file_name: Some(layout_file_name), } } pub fn add_step(mut self, step: Step) -> Self { @@ -220,11 +303,25 @@ impl RemoteRunner { // inside the container format!("{}_{}", name, self.retries_left) }); - let mut new_runner = RemoteRunner::new(self.test_name, self.win_size, session_name); - new_runner.retries_left = self.retries_left - 1; - new_runner.replace_steps(self.steps.clone()); - drop(std::mem::replace(self, new_runner)); - self.run_all_steps() + if let Some(layout_file_name) = self.layout_file_name.as_ref() { + // let mut new_runner = RemoteRunner::new_with_layout(self.test_name, self.win_size, Path::new(&local_layout_path), session_name); + let mut new_runner = RemoteRunner::new_with_layout( + self.test_name, + self.win_size, + layout_file_name, + session_name, + ); + new_runner.retries_left = self.retries_left - 1; + new_runner.replace_steps(self.steps.clone()); + drop(std::mem::replace(self, new_runner)); + self.run_all_steps() + } else { + let mut new_runner = RemoteRunner::new(self.test_name, self.win_size, session_name); + new_runner.retries_left = self.retries_left - 1; + new_runner.replace_steps(self.steps.clone()); + drop(std::mem::replace(self, new_runner)); + self.run_all_steps() + } } fn display_informative_error(&mut self) { let test_name = self.test_name; diff --git a/src/tests/e2e/snapshots/zellij__tests__e2e__cases__accepts_basic_layout.snap b/src/tests/e2e/snapshots/zellij__tests__e2e__cases__accepts_basic_layout.snap new file mode 100644 index 00000000..5556153a --- /dev/null +++ b/src/tests/e2e/snapshots/zellij__tests__e2e__cases__accepts_basic_layout.snap @@ -0,0 +1,29 @@ +--- +source: src/tests/e2e/cases.rs +expression: last_snapshot + +--- +$ █ │$ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ +───────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────── +$ + + + + diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs deleted file mode 100644 index 8d11458b..00000000 --- a/src/tests/fakes.rs +++ /dev/null @@ -1,329 +0,0 @@ -use std::collections::{HashMap, VecDeque}; -use std::io::Write; -use std::os::unix::io::RawFd; -use std::path::PathBuf; -use std::sync::{Arc, Condvar, Mutex}; -use std::time::{Duration, Instant}; - -use zellij_utils::{nix, zellij_tile}; - -use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; -use crate::tests::utils::commands::{QUIT, SLEEP}; -use zellij_client::os_input_output::ClientOsApi; -use zellij_server::os_input_output::{async_trait, AsyncReader, Pid, ServerOsApi}; -use zellij_tile::data::Palette; -use zellij_utils::{ - async_std, - channels::{self, ChannelWithContext, SenderWithContext}, - errors::ErrorContext, - interprocess::local_socket::LocalSocketStream, - ipc::{ClientToServerMsg, ServerToClientMsg}, - pane_size::PositionAndSize, - shared::default_palette, -}; - -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(150); - -#[derive(Clone)] -pub enum IoEvent { - Kill(Pid), - SetTerminalSizeUsingFd(RawFd, u16, u16), - IntoRawMode(RawFd), - UnsetRawMode(RawFd), - TcDrain(RawFd), -} - -#[derive(Clone)] -pub struct FakeStdoutWriter { - output_buffer: Arc>>, - pub output_frames: Arc>>>, - last_snapshot_time: Arc>, -} - -impl FakeStdoutWriter { - pub fn new(last_snapshot_time: Arc>) -> Self { - FakeStdoutWriter { - output_buffer: Arc::new(Mutex::new(Vec::new())), - output_frames: Arc::new(Mutex::new(Vec::new())), - last_snapshot_time, - } - } -} - -impl Write for FakeStdoutWriter { - fn write(&mut self, buf: &[u8]) -> Result { - let mut output_buffer = self.output_buffer.lock().unwrap(); - output_buffer.extend_from_slice(buf); - Ok(buf.len()) - } - fn flush(&mut self) -> Result<(), std::io::Error> { - let mut output_buffer = self.output_buffer.lock().unwrap(); - let mut output_frames = self.output_frames.lock().unwrap(); - let new_frame = output_buffer.drain(..).collect(); - output_frames.push(new_frame); - let mut last_snapshot_time = self.last_snapshot_time.lock().unwrap(); - *last_snapshot_time = Instant::now(); - Ok(()) - } -} - -#[derive(Clone)] -pub struct FakeInputOutput { - read_buffers: Arc>>, - input_to_add: Arc>>>, - stdin_commands: Arc>>>, - stdin_writes: Arc>>>, - pub stdout_writer: FakeStdoutWriter, // stdout_writer.output is already an arc/mutex - io_events: Arc>>, - win_sizes: Arc>>, - possible_tty_inputs: HashMap, - last_snapshot_time: Arc>, - send_instructions_to_client: SenderWithContext, - receive_instructions_from_server: - Arc>>, - send_instructions_to_server: SenderWithContext, - receive_instructions_from_client: - Arc>>, - should_trigger_sigwinch: Arc<(Mutex, Condvar)>, - sigwinch_event: Option, -} - -impl FakeInputOutput { - pub fn new(winsize: PositionAndSize) -> Self { - let mut win_sizes = HashMap::new(); - let last_snapshot_time = Arc::new(Mutex::new(Instant::now())); - let stdout_writer = FakeStdoutWriter::new(last_snapshot_time.clone()); - let (client_sender, client_receiver): ChannelWithContext = - channels::unbounded(); - let send_instructions_to_client = SenderWithContext::new(client_sender); - let (server_sender, server_receiver): ChannelWithContext = - channels::unbounded(); - let send_instructions_to_server = SenderWithContext::new(server_sender); - win_sizes.insert(0, winsize); // 0 is the current terminal - FakeInputOutput { - read_buffers: Arc::new(Mutex::new(HashMap::new())), - stdin_writes: Arc::new(Mutex::new(HashMap::new())), - input_to_add: Arc::new(Mutex::new(None)), - stdin_commands: Arc::new(Mutex::new(VecDeque::new())), - stdout_writer, - last_snapshot_time, - io_events: Arc::new(Mutex::new(vec![])), - win_sizes: Arc::new(Mutex::new(win_sizes)), - possible_tty_inputs: get_possible_tty_inputs(), - receive_instructions_from_client: Arc::new(Mutex::new(server_receiver)), - send_instructions_to_server, - receive_instructions_from_server: Arc::new(Mutex::new(client_receiver)), - send_instructions_to_client, - should_trigger_sigwinch: Arc::new((Mutex::new(false), Condvar::new())), - sigwinch_event: None, - } - } - pub fn with_tty_inputs(mut self, tty_inputs: HashMap) -> Self { - self.possible_tty_inputs = tty_inputs; - self - } - pub fn add_terminal_input(&mut self, input: &[&[u8]]) { - let stdin_commands = input.iter().map(|i| i.to_vec()).collect(); - self.stdin_commands = Arc::new(Mutex::new(stdin_commands)); - } - pub fn add_terminal(&self, fd: RawFd) { - self.stdin_writes.lock().unwrap().insert(fd, vec![]); - } - pub fn add_sigwinch_event(&mut self, new_position_and_size: PositionAndSize) { - self.sigwinch_event = Some(new_position_and_size); - } -} - -impl ClientOsApi for FakeInputOutput { - fn get_terminal_size_using_fd(&self, pid: RawFd) -> PositionAndSize { - if let Some(new_position_and_size) = self.sigwinch_event { - let (lock, _cvar) = &*self.should_trigger_sigwinch; - let should_trigger_sigwinch = lock.lock().unwrap(); - if *should_trigger_sigwinch && pid == 0 { - return new_position_and_size; - } - } - let win_sizes = self.win_sizes.lock().unwrap(); - let winsize = win_sizes.get(&pid).unwrap(); - *winsize - } - fn set_raw_mode(&mut self, pid: RawFd) { - self.io_events - .lock() - .unwrap() - .push(IoEvent::IntoRawMode(pid)); - } - fn unset_raw_mode(&self, pid: RawFd) { - self.io_events - .lock() - .unwrap() - .push(IoEvent::UnsetRawMode(pid)); - } - fn box_clone(&self) -> Box { - Box::new((*self).clone()) - } - fn read_from_stdin(&self) -> Vec { - loop { - let last_snapshot_time = { *self.last_snapshot_time.lock().unwrap() }; - if last_snapshot_time.elapsed() > MIN_TIME_BETWEEN_SNAPSHOTS { - break; - } else { - ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS - last_snapshot_time.elapsed()); - } - } - let command = self - .stdin_commands - .lock() - .unwrap() - .pop_front() - .unwrap_or(vec![]); - if command == SLEEP { - std::thread::sleep(std::time::Duration::from_millis(200)); - } else if command == QUIT && self.sigwinch_event.is_some() { - let (lock, cvar) = &*self.should_trigger_sigwinch; - { - let mut should_trigger_sigwinch = lock.lock().unwrap(); - *should_trigger_sigwinch = true; - } - cvar.notify_one(); - ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS); // give some time for the app to resize before quitting - } else if command == QUIT { - ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS); - } - command - } - fn get_stdout_writer(&self) -> Box { - Box::new(self.stdout_writer.clone()) - } - fn send_to_server(&self, msg: ClientToServerMsg) { - self.send_instructions_to_server.send(msg).unwrap(); - } - fn recv_from_server(&self) -> (ServerToClientMsg, ErrorContext) { - self.receive_instructions_from_server - .lock() - .unwrap() - .recv() - .unwrap() - } - fn handle_signals(&self, sigwinch_cb: Box, _quit_cb: Box) { - if self.sigwinch_event.is_some() { - let (lock, cvar) = &*self.should_trigger_sigwinch; - { - let mut should_trigger_sigwinch = lock.lock().unwrap(); - while !*should_trigger_sigwinch { - should_trigger_sigwinch = cvar.wait(should_trigger_sigwinch).unwrap(); - } - } - sigwinch_cb(); - } - } - fn connect_to_server(&self, _path: &std::path::Path) {} - fn load_palette(&self) -> Palette { - default_palette() - } -} - -struct FakeAsyncReader { - fd: RawFd, - os_api: Box, -} - -#[async_trait] -impl AsyncReader for FakeAsyncReader { - async fn read(&mut self, buf: &mut [u8]) -> Result { - // simulates async semantics: EAGAIN is not propagated to caller - loop { - let res = self.os_api.read_from_tty_stdout(self.fd, buf); - match res { - Err(nix::Error::Sys(nix::errno::Errno::EAGAIN)) => { - async_std::task::sleep(Duration::from_millis(10)).await; - continue; - } - Err(e) => { - break Err(std::io::Error::from_raw_os_error( - e.as_errno().unwrap() as i32 - )) - } - Ok(n_bytes) => break Ok(n_bytes), - } - } - } -} - -impl ServerOsApi for FakeInputOutput { - fn set_terminal_size_using_fd(&self, pid: RawFd, cols: u16, rows: u16) { - let terminal_input = self - .possible_tty_inputs - .get(&cols) - .expect(&format!("could not find input for size {:?}", cols)); - self.read_buffers - .lock() - .unwrap() - .insert(pid, terminal_input.clone()); - self.io_events - .lock() - .unwrap() - .push(IoEvent::SetTerminalSizeUsingFd(pid, cols, rows)); - } - fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { - let next_terminal_id = self.stdin_writes.lock().unwrap().keys().len() as RawFd + 1; - self.add_terminal(next_terminal_id); - ( - next_terminal_id as i32, - Pid::from_raw(next_terminal_id + 1000), - ) // secondary number is arbitrary here - } - fn write_to_tty_stdin(&self, pid: RawFd, buf: &[u8]) -> Result { - let mut stdin_writes = self.stdin_writes.lock().unwrap(); - let write_buffer = stdin_writes.get_mut(&pid).unwrap(); - Ok(write_buffer.write(buf).unwrap()) - } - fn read_from_tty_stdout(&self, pid: RawFd, mut buf: &mut [u8]) -> Result { - let mut read_buffers = self.read_buffers.lock().unwrap(); - match read_buffers.get_mut(&pid) { - Some(bytes) => { - let available_range = bytes.read_position..bytes.content.len(); - let len = buf.write(&bytes.content[available_range]).unwrap(); - if len > bytes.read_position { - bytes.set_read_position(len); - } - return Ok(len); - } - None => Err(nix::Error::Sys(nix::errno::Errno::EAGAIN)), - } - } - fn async_file_reader(&self, fd: RawFd) -> Box { - Box::new(FakeAsyncReader { - fd, - os_api: ServerOsApi::box_clone(self), - }) - } - fn tcdrain(&self, pid: RawFd) -> Result<(), nix::Error> { - self.io_events.lock().unwrap().push(IoEvent::TcDrain(pid)); - Ok(()) - } - fn box_clone(&self) -> Box { - Box::new((*self).clone()) - } - fn kill(&self, pid: Pid) -> Result<(), nix::Error> { - self.io_events.lock().unwrap().push(IoEvent::Kill(pid)); - Ok(()) - } - fn recv_from_client(&self) -> (ClientToServerMsg, ErrorContext) { - self.receive_instructions_from_client - .lock() - .unwrap() - .recv() - .unwrap() - } - fn send_to_client(&self, msg: ServerToClientMsg) { - self.send_instructions_to_client.send(msg).unwrap(); - } - fn add_client_sender(&self) {} - fn remove_client_sender(&self) {} - fn send_to_temp_client(&self, _msg: ServerToClientMsg) {} - fn update_receiver(&mut self, _stream: LocalSocketStream) {} - fn load_palette(&self) -> Palette { - default_palette() - } -} diff --git a/src/tests/integration/basic.rs b/src/tests/integration/basic.rs deleted file mode 100644 index 98f77988..00000000 --- a/src/tests/integration/basic.rs +++ /dev/null @@ -1,498 +0,0 @@ -use ::insta::assert_snapshot; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::commands::{ - BRACKETED_PASTE_END, BRACKETED_PASTE_START, PANE_MODE, QUIT, SCROLL_DOWN_IN_SCROLL_MODE, - SCROLL_MODE, SCROLL_PAGE_DOWN_IN_SCROLL_MODE, SCROLL_PAGE_UP_IN_SCROLL_MODE, - SCROLL_UP_IN_SCROLL_MODE, SPAWN_TERMINAL_IN_PANE_MODE, SPLIT_DOWN_IN_PANE_MODE, - SPLIT_RIGHT_IN_PANE_MODE, TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, -}; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(fake_win_size.clone()) -} - -#[test] -pub fn starts_with_one_terminal() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn split_terminals_vertically() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_RIGHT_IN_PANE_MODE, &QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn split_terminals_horizontally() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_DOWN_IN_PANE_MODE, &QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn split_largest_terminal() { - // this finds the largest pane and splits along its longest edge (vertically or horizontally) - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn cannot_split_terminals_vertically_when_active_terminal_is_too_small() { - let fake_win_size = PositionAndSize { - cols: 8, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_RIGHT_IN_PANE_MODE, &QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn cannot_split_terminals_horizontally_when_active_terminal_is_too_small() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 4, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_DOWN_IN_PANE_MODE, &QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn cannot_split_largest_terminal_when_there_is_no_room() { - let fake_win_size = PositionAndSize { - cols: 8, - rows: 4, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPAWN_TERMINAL_IN_PANE_MODE, &QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn scrolling_up_inside_a_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SCROLL_MODE, - &SCROLL_UP_IN_SCROLL_MODE, - &SCROLL_UP_IN_SCROLL_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn scrolling_down_inside_a_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SCROLL_MODE, - &SCROLL_UP_IN_SCROLL_MODE, - &SCROLL_UP_IN_SCROLL_MODE, - &SCROLL_DOWN_IN_SCROLL_MODE, - &SCROLL_DOWN_IN_SCROLL_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn scrolling_page_up_inside_a_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SCROLL_MODE, - &SCROLL_PAGE_UP_IN_SCROLL_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn scrolling_page_down_inside_a_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SCROLL_MODE, - &SCROLL_PAGE_UP_IN_SCROLL_MODE, - &SCROLL_PAGE_UP_IN_SCROLL_MODE, - &SCROLL_PAGE_DOWN_IN_SCROLL_MODE, - &SCROLL_PAGE_DOWN_IN_SCROLL_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn max_panes() { - // with the --max-panes option, we only allow a certain amount of panes on screen - // simultaneously, new panes beyond this limit will close older panes on screen - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &QUIT, - ]); - let mut opts = CliArgs::default(); - opts.max_panes = Some(4); - start( - Box::new(fake_input_output.clone()), - opts, - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn toggle_focused_pane_fullscreen() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, - &QUIT, - ]); - let mut opts = CliArgs::default(); - opts.max_panes = Some(4); - start( - Box::new(fake_input_output.clone()), - opts, - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn bracketed_paste() { - // bracketed paste (https://xfree86.org/current/ctlseqs.html#Bracketed%20Paste%20Mode) - // makes sure that text the user pastes is not interpreted as commands by the running program - // (zellij in this case) - // this tests makes sure the "SPLIT_RIGHT_IN_PANE_MODE" command is not interpreted as Zellij, - // since it's inside a bracketed paste block, while the "QUIT" command is, since it is already - // past the block - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &BRACKETED_PASTE_START, - &SPLIT_RIGHT_IN_PANE_MODE, - &BRACKETED_PASTE_END, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/close_pane.rs b/src/tests/integration/close_pane.rs deleted file mode 100644 index 4618d3e6..00000000 --- a/src/tests/integration/close_pane.rs +++ /dev/null @@ -1,674 +0,0 @@ -use ::insta::assert_snapshot; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; - -use crate::tests::utils::commands::{ - CLOSE_PANE_IN_PANE_MODE, ESC, MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, - RESIZE_DOWN_IN_RESIZE_MODE, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, RESIZE_UP_IN_RESIZE_MODE, - SLEEP, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(fake_win_size.clone()) -} - -#[test] -pub fn close_pane_with_another_pane_above_it() { - // ┌───────────┐ ┌───────────┐ - // │xxxxxxxxxxx│ │xxxxxxxxxxx│ - // │xxxxxxxxxxx│ │xxxxxxxxxxx│ - // ├───────────┤ ==close==> │xxxxxxxxxxx│ - // │███████████│ │xxxxxxxxxxx│ - // │███████████│ │xxxxxxxxxxx│ - // └───────────┘ └───────────┘ - // █ == pane being closed - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_pane_with_another_pane_below_it() { - // ┌───────────┐ ┌───────────┐ - // │███████████│ │xxxxxxxxxxx│ - // │███████████│ │xxxxxxxxxxx│ - // ├───────────┤ ==close==> │xxxxxxxxxxx│ - // │xxxxxxxxxxx│ │xxxxxxxxxxx│ - // │xxxxxxxxxxx│ │xxxxxxxxxxx│ - // └───────────┘ └───────────┘ - // █ == pane being closed - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_pane_with_another_pane_to_the_left() { - // ┌─────┬─────┐ ┌──────────┐ - // │xxxxx│█████│ │xxxxxxxxxx│ - // │xxxxx│█████│ ==close==> │xxxxxxxxxx│ - // │xxxxx│█████│ │xxxxxxxxxx│ - // └─────┴─────┘ └──────────┘ - // █ == pane being closed - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_pane_with_another_pane_to_the_right() { - // ┌─────┬─────┐ ┌──────────┐ - // │█████│xxxxx│ │xxxxxxxxxx│ - // │█████│xxxxx│ ==close==> │xxxxxxxxxx│ - // │█████│xxxxx│ │xxxxxxxxxx│ - // └─────┴─────┘ └──────────┘ - // █ == pane being closed - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[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 fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[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 fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_pane_with_multiple_panes_to_the_left() { - // ┌─────┬─────┐ ┌──────────┐ - // │xxxxx│█████│ │xxxxxxxxxx│ - // │xxxxx│█████│ │xxxxxxxxxx│ - // ├─────┤█████│ ==close==> ├──────────┤ - // │xxxxx│█████│ │xxxxxxxxxx│ - // │xxxxx│█████│ │xxxxxxxxxx│ - // └─────┴─────┘ └──────────┘ - // █ == pane being closed - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_pane_with_multiple_panes_to_the_right() { - // ┌─────┬─────┐ ┌──────────┐ - // │█████│xxxxx│ │xxxxxxxxxx│ - // │█████│xxxxx│ │xxxxxxxxxx│ - // │█████├─────┤ ==close==> ├──────────┤ - // │█████│xxxxx│ │xxxxxxxxxx│ - // │█████│xxxxx│ │xxxxxxxxxx│ - // └─────┴─────┘ └──────────┘ - // █ == pane being closed - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[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 fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &ESC, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &ESC, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &ESC, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &ESC, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[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 fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[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 fake_win_size = PositionAndSize { - cols: 121, - rows: 30, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[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 fake_win_size = PositionAndSize { - cols: 121, - rows: 30, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn closing_last_pane_exits_app() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs deleted file mode 100644 index 0930271f..00000000 --- a/src/tests/integration/compatibility.rs +++ /dev/null @@ -1,681 +0,0 @@ -use ::insta::assert_snapshot; -use ::std::collections::HashMap; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::possible_tty_inputs::Bytes; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{QUIT, SLEEP}; -use zellij_utils::input::config::Config; - -/* - * These tests are general compatibility tests for non-trivial scenarios running in the terminal. - * They use fake TTY input replicated from these scenarios (and so don't actually interact with the - * OS). - * - * They work like this: - * - receive fake TTY input containing various VTE instructions. - * - run that output through zellij so it interprets it and creates its state based on it - * - read that state into a Human-readable snapshot and compare it to the expected snapshot for - * this scenario. - * - */ - -fn get_fake_os_input(fake_win_size: &PositionAndSize, fixture_name: &str) -> FakeInputOutput { - let mut tty_inputs = HashMap::new(); - let fixture_bytes = Bytes::from_file_in_fixtures(&fixture_name); - tty_inputs.insert(fake_win_size.cols as u16, fixture_bytes); - FakeInputOutput::new(fake_win_size.clone()).with_tty_inputs(tty_inputs) -} - -#[test] -pub fn run_bandwhich_from_fish_shell() { - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "fish_and_bandwhich"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn fish_tab_completion_options() { - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "fish_tab_completion_options"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn fish_select_tab_completion_options() { - // the difference between this and the previous test is that here we press - // twice, meaning the selection moves between the options and the command line - // changes. - // this is not clearly seen in the snapshot because it does not include styles, - // but we can see the command line change and the cursor staying in place - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "fish_select_tab_completion_options"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn vim_scroll_region_down() { - // here we test a case where vim defines the scroll region as lesser than the screen row count - // and then scrolls down - // the region is defined here by vim as 1-26 (there are 28 rows) - // then the cursor is moved to line 26 and a new line is added - // what should happen is that the first line in the scroll region (1) is deleted - // and an empty line is inserted in the last scroll region line (26) - // this tests also has other steps afterwards that fills the line with the next line in the - // file - // experience appear to the user - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "vim_scroll_region_down"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); // quit (ctrl-q) - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn vim_ctrl_d() { - // in vim ctrl-d moves down half a page - // in this case, it sends the terminal the csi 'M' directive, which tells it to delete X (13 in - // this case) lines inside the scroll region and push the other lines up - // what happens here is that 13 lines are deleted and instead 13 empty lines are added at the - // end of the scroll region - // vim makes sure to fill these empty lines with the rest of the file - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "vim_ctrl_d"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn vim_ctrl_u() { - // in vim ctrl-u moves up half a page - // in this case, it sends the terminal the csi 'L' directive, which tells it to insert X (13 in - // this case) lines at the cursor, pushing away (deleting) the last line in the scroll region - // this causes the effect of scrolling up X lines (vim replaces the lines with the ones in the - // file above the current content) - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "vim_ctrl_u"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn htop() { - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "htop"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn htop_scrolling() { - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "htop_scrolling"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn htop_right_scrolling() { - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "htop_right_scrolling"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn vim_overwrite() { - // this tests the vim overwrite message - // to recreate: - // * open a file in vim - // * open the same file in another window - // * change the file in the other window and save - // * change the file in the original vim window and save - // * confirm you would like to change the file by pressing 'y' and then ENTER - // * if everything looks fine, this test passed :) - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "vim_overwrite"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn clear_scroll_region() { - // this tests the scroll region used by eg. vim is cleared properly - // this means that when vim exits, we get back the previous scroll - // buffer - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "clear_scroll_region"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn display_tab_characters_properly() { - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "tab_characters"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn neovim_insert_mode() { - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "nvim_insert"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn bash_cursor_linewrap() { - // this test makes sure that when we enter a command that is beyond the screen border, that it - // immediately goes down one line - let fake_win_size = PositionAndSize { - cols: 116, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "bash_cursor_linewrap"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn fish_paste_multiline() { - // here we paste a multiline command in fish shell, making sure we support it - // going up and changing the colors of our line-wrapped pasted text - let fake_win_size = PositionAndSize { - cols: 149, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "fish_paste_multiline"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn git_log() { - let fake_win_size = PositionAndSize { - cols: 149, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "git_log"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn git_diff_scrollup() { - // this tests makes sure that when we have a git diff that exceeds the screen size - // we are able to scroll up - let fake_win_size = PositionAndSize { - cols: 149, - rows: 28, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "git_diff_scrollup"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn emacs_longbuf() { - let fake_win_size = PositionAndSize { - cols: 284, - rows: 60, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "emacs_longbuf_tutorial"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn top_and_quit() { - let fake_win_size = PositionAndSize { - cols: 235, - rows: 56, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "top_and_quit"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&SLEEP, &QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn exa_plus_omf_theme() { - // this tests that we handle a tab delimited table properly - // without overriding the previous content - // this is a potential bug because the \t character is a goto - // if we forwarded it as is to the terminal, we would be skipping - // over existing on-screen content without deleting it, so we must - // convert it to spaces - let fake_win_size = PositionAndSize { - cols: 235, - rows: 56, - x: 0, - y: 0, - ..Default::default() - }; - let fixture_name = "exa_plus_omf_theme"; - let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/layouts.rs b/src/tests/integration/layouts.rs deleted file mode 100644 index 6b91ba04..00000000 --- a/src/tests/integration/layouts.rs +++ /dev/null @@ -1,67 +0,0 @@ -use insta::assert_snapshot; -use std::path::PathBuf; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::commands::QUIT; -use crate::tests::utils::get_output_frame_snapshots; -use crate::CliArgs; -use zellij_utils::input::config::Config; -use zellij_utils::pane_size::PositionAndSize; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(fake_win_size.clone()) -} - -#[test] -pub fn accepts_basic_layout() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&QUIT]); - let mut opts = CliArgs::default(); - opts.layout_path = Some(PathBuf::from( - "src/tests/fixtures/layouts/three-panes-with-nesting.yaml", - )); - - let layout = zellij_utils::input::layout::Layout::from_path_or_default( - None, - opts.layout_path.as_ref(), - Some(std::path::Path::new("unused").into()), - ); - - start( - Box::new(fake_input_output.clone()), - opts, - Box::new(fake_input_output.clone()), - Config::default(), - layout, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - - let snapshot_count = snapshots.len(); - let first_snapshot = snapshots.get(0).unwrap(); - let next_to_last_snapshot = snapshots.get(snapshot_count - 2).unwrap(); - let last_snapshot = snapshots.last().unwrap(); - // here we only test the first, next to last and last snapshot because there's a race condition - // with the other snapshots. Namely all the terminals are created asynchronously and read in an - // async task, so we have no way to guarantee the order in which their bytes will be read, and - // it doesn't really matter in this context. We just want to see that the layout is initially - // created properly and that in the end it's populated properly with its content - // - // we read the next to last as well as the last, because the last includes the "Bye from - // Zellij" message, and we also want to make sure things are fine before that - assert_snapshot!(first_snapshot); - assert_snapshot!(next_to_last_snapshot); - assert_snapshot!(last_snapshot); -} diff --git a/src/tests/integration/mod.rs b/src/tests/integration/mod.rs deleted file mode 100644 index 0511fc9c..00000000 --- a/src/tests/integration/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -pub mod basic; -pub mod close_pane; -pub mod compatibility; -pub mod layouts; -pub mod move_focus_down; -pub mod move_focus_left; -pub mod move_focus_right; -pub mod move_focus_up; -pub mod resize_down; -pub mod resize_left; -pub mod resize_right; -pub mod resize_up; -pub mod tabs; -pub mod terminal_window_resize; -pub mod toggle_fullscreen; diff --git a/src/tests/integration/move_focus_down.rs b/src/tests/integration/move_focus_down.rs deleted file mode 100644 index 4b8410f8..00000000 --- a/src/tests/integration/move_focus_down.rs +++ /dev/null @@ -1,91 +0,0 @@ -use ::insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - MOVE_FOCUS_DOWN_IN_PANE_MODE, MOVE_FOCUS_UP_IN_PANE_MODE, PANE_MODE, QUIT, - SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn move_focus_down() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_UP_IN_PANE_MODE, - &MOVE_FOCUS_DOWN_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn move_focus_down_to_the_most_recently_used_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_UP_IN_PANE_MODE, - &MOVE_FOCUS_DOWN_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/move_focus_left.rs b/src/tests/integration/move_focus_left.rs deleted file mode 100644 index aac3ea07..00000000 --- a/src/tests/integration/move_focus_left.rs +++ /dev/null @@ -1,131 +0,0 @@ -use ::insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - ENTER, MOVE_FOCUS_LEFT_IN_NORMAL_MODE, MOVE_FOCUS_LEFT_IN_PANE_MODE, - MOVE_FOCUS_RIGHT_IN_PANE_MODE, NEW_TAB_IN_TAB_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, - SPLIT_RIGHT_IN_PANE_MODE, TAB_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn move_focus_left() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_LEFT_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn move_focus_left_to_the_most_recently_used_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_LEFT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_LEFT_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn move_focus_left_changes_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &ENTER, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &ENTER, - &MOVE_FOCUS_LEFT_IN_NORMAL_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/move_focus_right.rs b/src/tests/integration/move_focus_right.rs deleted file mode 100644 index 05421998..00000000 --- a/src/tests/integration/move_focus_right.rs +++ /dev/null @@ -1,131 +0,0 @@ -use ::insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - ENTER, MOVE_FOCUS_LEFT_IN_PANE_MODE, MOVE_FOCUS_RIGHT_IN_NORMAL_MODE, - MOVE_FOCUS_RIGHT_IN_PANE_MODE, NEW_TAB_IN_TAB_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, - SPLIT_RIGHT_IN_PANE_MODE, TAB_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn move_focus_right() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_LEFT_IN_PANE_MODE, - &MOVE_FOCUS_RIGHT_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn move_focus_right_to_the_most_recently_used_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_LEFT_IN_PANE_MODE, - &MOVE_FOCUS_RIGHT_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn move_focus_right_changes_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &ENTER, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &ENTER, - &MOVE_FOCUS_RIGHT_IN_NORMAL_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/move_focus_up.rs b/src/tests/integration/move_focus_up.rs deleted file mode 100644 index cd9bd48c..00000000 --- a/src/tests/integration/move_focus_up.rs +++ /dev/null @@ -1,91 +0,0 @@ -use ::insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - MOVE_FOCUS_DOWN_IN_PANE_MODE, MOVE_FOCUS_UP_IN_PANE_MODE, PANE_MODE, QUIT, - SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn move_focus_up() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_UP_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn move_focus_up_to_the_most_recently_used_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_UP_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_UP_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/resize_down.rs b/src/tests/integration/resize_down.rs deleted file mode 100644 index 110f0e49..00000000 --- a/src/tests/integration/resize_down.rs +++ /dev/null @@ -1,725 +0,0 @@ -use insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_DOWN_IN_RESIZE_MODE, - RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, - SPLIT_RIGHT_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn resize_down_with_pane_above() { - // ┌───────────┐ ┌───────────┐ - // │ │ │ │ - // │ │ │ │ - // ├───────────┤ ==resize=down==> │ │ - // │███████████│ ├───────────┤ - // │███████████│ │███████████│ - // │███████████│ │███████████│ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_pane_below() { - // ┌───────────┐ ┌───────────┐ - // │███████████│ │███████████│ - // │███████████│ │███████████│ - // ├───────────┤ ==resize=down==> │███████████│ - // │ │ ├───────────┤ - // │ │ │ │ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_above_and_below() { - // ┌───────────┐ ┌───────────┐ - // │ │ │ │ - // │ │ │ │ - // ├───────────┤ ├───────────┤ - // │███████████│ ==resize=down==> │███████████│ - // │███████████│ │███████████│ - // │███████████│ │███████████│ - // ├───────────┤ │███████████│ - // │ │ ├───────────┤ - // │ │ │ │ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 25, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_multiple_panes_above() { - // - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┴─────┤ ==resize=down==> │ │ │ - // │███████████│ ├─────┴─────┤ - // │███████████│ │███████████│ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_above_aligned_left_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // │ │ │ │ │ │ - // ├─────┼─────┤ ==resize=down==> ├─────┤ │ - // │ │█████│ │ ├─────┤ - // │ │█████│ │ │█████│ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_below_aligned_left_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │█████│ │ │█████│ - // │ │█████│ │ │█████│ - // ├─────┼─────┤ ==resize=down==> ├─────┤█████│ - // │ │ │ │ ├─────┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_above_aligned_right_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // │ │ │ │ │ │ - // ├─────┼─────┤ ==resize=down==> │ ├─────┤ - // │█████│ │ ├─────┤ │ - // │█████│ │ │█████│ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_below_aligned_right_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │█████│ │ │█████│ │ - // │█████│ │ │█████│ │ - // ├─────┼─────┤ ==resize=down==> │█████├─────┤ - // │ │ │ ├─────┤ │ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_above_aligned_left_and_right_with_current_pane() { - // ┌───┬───┬───┐ ┌───┬───┬───┐ - // │ │ │ │ │ │ │ │ - // │ │ │ │ │ │ │ │ - // ├───┼───┼───┤ ==resize=down==> ├───┤ ├───┤ - // │ │███│ │ │ ├───┤ │ - // │ │███│ │ │ │███│ │ - // └───┴───┴───┘ └───┴───┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_below_aligned_left_and_right_with_current_pane() { - // ┌───┬───┬───┐ ┌───┬───┬───┐ - // │ │███│ │ │ │███│ │ - // │ │███│ │ │ │███│ │ - // ├───┼───┼───┤ ==resize=down==> ├───┤███├───┤ - // │ │ │ │ │ ├───┤ │ - // │ │ │ │ │ │ │ │ - // └───┴───┴───┘ └───┴───┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right() { - // ┌─┬───────┬─┐ ┌─┬───────┬─┐ - // │ │ │ │ │ │ │ │ - // │ │ │ │ │ │ │ │ - // ├─┼─┬───┬─┼─┤ ==resize=down==> ├─┤ ├─┤ - // │ │ │███│ │ │ │ ├─┬───┬─┤ │ - // │ │ │███│ │ │ │ │ │███│ │ │ - // └─┴─┴───┴─┴─┘ └─┴─┴───┴─┴─┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_right() { - // ┌─┬─┬───┬─┬─┐ ┌─┬─┬───┬─┬─┐ - // │ │ │███│ │ │ │ │ │███│ │ │ - // │ │ │███│ │ │ │ │ │███│ │ │ - // ├─┼─┴───┴─┼─┤ ==resize=down==> ├─┤ │███│ ├─┤ - // │ │ │ │ │ ├─┴───┴─┤ │ - // │ │ │ │ │ │ │ │ - // └─┴───────┴─┘ └─┴───────┴─┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() { - // ┌───────────┐ ┌───────────┐ - // │███████████│ │███████████│ - // ├───────────┤ ==resize=down==> ├───────────┤ - // │ │ │ │ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 7, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_DOWN_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/resize_left.rs b/src/tests/integration/resize_left.rs deleted file mode 100644 index 9b378e81..00000000 --- a/src/tests/integration/resize_left.rs +++ /dev/null @@ -1,702 +0,0 @@ -use ::insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, - RESIZE_UP_IN_RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn resize_left_with_pane_to_the_left() { - // ┌─────┬─────┐ ┌───┬───────┐ - // │ │█████│ │ │███████│ - // │ │█████│ ==resize=left==> │ │███████│ - // │ │█████│ │ │███████│ - // └─────┴─────┘ └───┴───────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_pane_to_the_right() { - // ┌─────┬─────┐ ┌───┬───────┐ - // │█████│ │ │███│ │ - // │█████│ │ ==resize=left==> │███│ │ - // │█████│ │ │███│ │ - // └─────┴─────┘ └───┴───────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_left_and_right() { - // ┌─────┬─────┬─────┐ ┌─────┬───┬───────┐ - // │ │█████│ │ │ │███│ │ - // │ │█████│ │ ==resize=left==> │ │███│ │ - // │ │█████│ │ │ │███│ │ - // └─────┴─────┴─────┘ └─────┴───┴───────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_multiple_panes_to_the_left() { - // ┌─────┬─────┐ ┌───┬───────┐ - // │ │█████│ │ │███████│ - // ├─────┤█████│ ==resize=left==> ├───┤███████│ - // │ │█████│ │ │███████│ - // └─────┴─────┘ └───┴───────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_left_aligned_top_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ==resize=left==> ├───┬─┴─────┤ - // │ │█████│ │ │███████│ - // └─────┴─────┘ └───┴───────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_right_aligned_top_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ==resize=left==> ├───┬─┴─────┤ - // │█████│ │ │███│ │ - // └─────┴─────┘ └───┴───────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌───┬───────┐ - // │ │█████│ │ │███████│ - // ├─────┼─────┤ ==resize=left==> ├───┴─┬─────┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌───┬───────┐ - // │█████│ │ │███│ │ - // ├─────┼─────┤ ==resize=left==> ├───┴─┬─────┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ├───┬─┴─────┤ - // │ │█████│ ==resize=left==> │ │███████│ - // ├─────┼─────┤ ├───┴─┬─────┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ├───┬─┴─────┤ - // │█████│ │ ==resize=left==> │███│ │ - // ├─────┼─────┤ ├───┴─┬─────┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // ├─────┼─────┤ ├───┬─┴─────┤ - // │ ├─────┤ │ ├───────┤ - // │ │█████│ ==resize=left==> │ │███████│ - // │ ├─────┤ │ ├───────┤ - // ├─────┼─────┤ ├───┴─┬─────┤ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // ├─────┼─────┤ ├───┬─┴─────┤ - // ├─────┤ │ ├───┤ │ - // │█████│ │ ==resize=left==> │███│ │ - // ├─────┤ │ ├───┤ │ - // ├─────┼─────┤ ├───┴─┬─────┤ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - // TODO: combine with above - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn cannot_resize_left_when_pane_to_the_left_is_at_minimum_width() { - // ┌─┬─┐ ┌─┬─┐ - // │ │█│ │ │█│ - // │ │█│ ==resize=left==> │ │█│ - // │ │█│ │ │█│ - // └─┴─┘ └─┴─┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 9, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/resize_right.rs b/src/tests/integration/resize_right.rs deleted file mode 100644 index 48689470..00000000 --- a/src/tests/integration/resize_right.rs +++ /dev/null @@ -1,701 +0,0 @@ -use ::insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_MODE, RESIZE_RIGHT_IN_RESIZE_MODE, - RESIZE_UP_IN_RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn resize_right_with_pane_to_the_left() { - // ┌─────┬─────┐ ┌───────┬───┐ - // │ │█████│ │ │███│ - // │ │█████│ ==resize=right==> │ │███│ - // │ │█████│ │ │███│ - // └─────┴─────┘ └───────┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_pane_to_the_right() { - // ┌─────┬─────┐ ┌───────┬───┐ - // │█████│ │ │███████│ │ - // │█████│ │ ==resize=right==> │███████│ │ - // │█████│ │ │███████│ │ - // └─────┴─────┘ └───────┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_left_and_right() { - // ┌─────┬─────┬─────┐ ┌─────┬───────┬───┐ - // │ │█████│ │ │ │███████│ │ - // │ │█████│ │ ==resize=right==> │ │███████│ │ - // │ │█████│ │ │ │███████│ │ - // └─────┴─────┴─────┘ └─────┴───────┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_multiple_panes_to_the_left() { - // ┌─────┬─────┐ ┌───────┬───┐ - // │ │█████│ │ │███│ - // ├─────┤█████│ ==resize=right==> ├───────┤███│ - // │ │█████│ │ │███│ - // └─────┴─────┘ └───────┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_left_aligned_top_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ==resize=right==> ├─────┴─┬───┤ - // │ │█████│ │ │███│ - // └─────┴─────┘ └───────┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_right_aligned_top_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ==resize=right==> ├─────┴─┬───┤ - // │█████│ │ │███████│ │ - // └─────┴─────┘ └───────┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌───────┬───┐ - // │ │█████│ │ │███│ - // ├─────┼─────┤ ==resize=right==> ├─────┬─┴───┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌───────┬───┐ - // │█████│ │ │███████│ │ - // ├─────┼─────┤ ==resize=right==> ├─────┬─┴───┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ├─────┴─┬───┤ - // │ │█████│ ==resize=right==> │ │███│ - // ├─────┼─────┤ ├─────┬─┴───┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // ├─────┼─────┤ ├─────┴─┬───┤ - // │█████│ │ ==resize=right==> │███████│ │ - // ├─────┼─────┤ ├─────┬─┴───┤ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // ├─────┼─────┤ ├─────┴─┬───┤ - // │ ├─────┤ │ ├───┤ - // │ │█████│ ==resize=right==> │ │███│ - // │ ├─────┤ │ ├───┤ - // ├─────┼─────┤ ├─────┬─┴───┤ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // ├─────┼─────┤ ├─────┴─┬───┤ - // ├─────┤ │ ├───────┤ │ - // │█████│ │ ==resize=right==> │███████│ │ - // ├─────┤ │ ├───────┤ │ - // ├─────┼─────┤ ├─────┬─┴───┤ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn cannot_resize_right_when_pane_to_the_left_is_at_minimum_width() { - // ┌─┬─┐ ┌─┬─┐ - // │ │█│ │ │█│ - // │ │█│ ==resize=right==> │ │█│ - // │ │█│ │ │█│ - // └─┴─┘ └─┴─┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 9, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_RIGHT_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/resize_up.rs b/src/tests/integration/resize_up.rs deleted file mode 100644 index 650dca6c..00000000 --- a/src/tests/integration/resize_up.rs +++ /dev/null @@ -1,719 +0,0 @@ -use ::insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, - RESIZE_UP_IN_RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn resize_up_with_pane_above() { - // ┌───────────┐ ┌───────────┐ - // │ │ │ │ - // │ │ ├───────────┤ - // ├───────────┤ ==resize=up==> │███████████│ - // │███████████│ │███████████│ - // │███████████│ │███████████│ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_pane_below() { - // ┌───────────┐ ┌───────────┐ - // │███████████│ │███████████│ - // │███████████│ ├───────────┤ - // ├───────────┤ ==resize=up==> │ │ - // │ │ │ │ - // │ │ │ │ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_above_and_below() { - // ┌───────────┐ ┌───────────┐ - // │ │ │ │ - // │ │ ├───────────┤ - // ├───────────┤ │███████████│ - // │███████████│ ==resize=up==> │███████████│ - // │███████████│ │███████████│ - // ├───────────┤ ├───────────┤ - // │ │ │ │ - // │ │ │ │ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_multiple_panes_above() { - // - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ ├─────┴─────┤ - // ├─────┴─────┤ ==resize=up==> │███████████│ - // │███████████│ │███████████│ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_above_aligned_left_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ ├─────┤ - // ├─────┼─────┤ ==resize=up==> ├─────┤█████│ - // │ │█████│ │ │█████│ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_below_aligned_left_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │█████│ │ │█████│ - // │ │█████│ │ ├─────┤ - // ├─────┼─────┤ ==resize=up==> ├─────┤ │ - // │ │ │ │ │ │ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_above_aligned_right_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │ │ │ │ │ │ - // │ │ │ ├─────┤ │ - // ├─────┼─────┤ ==resize=up==> │█████├─────┤ - // │█████│ │ │█████│ │ - // │█████│ │ │█████│ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_below_aligned_right_with_current_pane() { - // ┌─────┬─────┐ ┌─────┬─────┐ - // │█████│ │ │█████│ │ - // │█████│ │ ├─────┤ │ - // ├─────┼─────┤ ==resize=up==> │ ├─────┤ - // │ │ │ │ │ │ - // │ │ │ │ │ │ - // └─────┴─────┘ └─────┴─────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_above_aligned_left_and_right_with_current_pane() { - // ┌───┬───┬───┐ ┌───┬───┬───┐ - // │ │ │ │ │ │ │ │ - // │ │ │ │ │ ├───┤ │ - // ├───┼───┼───┤ ==resize=up==> ├───┤███├───┤ - // │ │███│ │ │ │███│ │ - // │ │███│ │ │ │███│ │ - // └───┴───┴───┘ └───┴───┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_below_aligned_left_and_right_with_current_pane() { - // ┌───┬───┬───┐ ┌───┬───┬───┐ - // │ │███│ │ │ │███│ │ - // │ │███│ │ │ ├───┤ │ - // ├───┼───┼───┤ ==resize=up==> ├───┤ ├───┤ - // │ │ │ │ │ │ │ │ - // │ │ │ │ │ │ │ │ - // └───┴───┴───┘ └───┴───┴───┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right() { - // ┌─┬───────┬─┐ ┌─┬───────┬─┐ - // │ │ │ │ │ │ │ │ - // │ │ │ │ │ ├─┬───┬─┤ │ - // ├─┼─┬───┬─┼─┤ ==resize=up==> ├─┤ │███│ ├─┤ - // │ │ │███│ │ │ │ │ │███│ │ │ - // │ │ │███│ │ │ │ │ │███│ │ │ - // └─┴─┴───┴─┴─┘ └─┴─┴───┴─┴─┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_right() { - // ┌─┬─┬───┬─┬─┐ ┌─┬─┬───┬─┬─┐ - // │ │ │███│ │ │ │ │ │███│ │ │ - // │ │ │███│ │ │ │ ├─┴───┴─┤ │ - // ├─┼─┴───┴─┼─┤ ==resize=up==> ├─┤ ├─┤ - // │ │ │ │ │ │ │ │ - // │ │ │ │ │ │ │ │ - // └─┴───────┴─┘ └─┴───────┴─┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 40, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &PANE_MODE, - &SLEEP, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_LEFT_IN_RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn cannot_resize_up_when_pane_above_is_at_minimum_height() { - // ┌───────────┐ ┌───────────┐ - // │ │ │ │ - // ├───────────┤ ==resize=up==> ├───────────┤ - // │███████████│ │███████████│ - // └───────────┘ └───────────┘ - // █ == focused pane - let fake_win_size = PositionAndSize { - cols: 121, - rows: 7, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &RESIZE_MODE, - &RESIZE_UP_IN_RESIZE_MODE, - &SLEEP, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__bracketed_paste.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__bracketed_paste.snap deleted file mode 100644 index 1eec02f4..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__bracketed_paste.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_largest_terminal_when_there_is_no_room.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_largest_terminal_when_there_is_no_room.snap deleted file mode 100644 index d6b74e46..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_largest_terminal_when_there_is_no_room.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line18-b -line19-b -prompt $ - █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_horizontally_when_active_terminal_is_too_small.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_horizontally_when_active_terminal_is_too_small.snap deleted file mode 100644 index 7eaac7a0..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_horizontally_when_active_terminal_is_too_small.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_vertically_when_active_terminal_is_too_small.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_vertically_when_active_terminal_is_too_small.snap deleted file mode 100644 index c9f9eb10..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__cannot_split_terminals_vertically_when_active_terminal_is_too_small.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line2-bb -line3-bb -line4-bb -line5-bb -line6-bb -line7-bb -line8-bb -line9-bb -line10-b -line11-b -line12-b -line13-b -line14-b -line15-b -line16-b -line17-b -line18-b -line19-b -prompt $ - █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__max_panes.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__max_panes.snap deleted file mode 100644 index 2f2d2faf..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__max_panes.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_down_inside_a_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_down_inside_a_pane.snap deleted file mode 100644 index 8f4ec6e2..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_down_inside_a_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_down_inside_a_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_down_inside_a_pane.snap deleted file mode 100644 index 8f4ec6e2..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_down_inside_a_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_up_inside_a_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_up_inside_a_pane.snap deleted file mode 100644 index d37580c6..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_page_up_inside_a_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line12-bb█bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_up_inside_a_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_up_inside_a_pane.snap deleted file mode 100644 index 485bde1e..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__scrolling_up_inside_a_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line18-bb█bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__split_largest_terminal.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__split_largest_terminal.snap deleted file mode 100644 index 2f2d2faf..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__split_largest_terminal.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_horizontally.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_horizontally.snap deleted file mode 100644 index fab0ca8f..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_horizontally.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_vertically.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_vertically.snap deleted file mode 100644 index aaae6b5a..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__split_terminals_vertically.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -a │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__starts_with_one_terminal.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__starts_with_one_terminal.snap deleted file mode 100644 index 1eec02f4..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__starts_with_one_terminal.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__basic__toggle_focused_pane_fullscreen.snap b/src/tests/integration/snapshots/zellij__tests__integration__basic__toggle_focused_pane_fullscreen.snap deleted file mode 100644 index 868e5a95..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__basic__toggle_focused_pane_fullscreen.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/basic.rs -expression: snapshot_before_quit - ---- -line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_above_it.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_above_it.snap deleted file mode 100644 index 8ba40bc7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_above_it.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_below_it.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_below_it.snap deleted file mode 100644 index 8ba40bc7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_below_it.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_left.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_left.snap deleted file mode 100644 index 8ba40bc7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_left.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_right.snap deleted file mode 100644 index cf7bacf6..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_another_pane_to_the_right.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it.snap deleted file mode 100644 index 05bbb477..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -a │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it_away_from_screen_edges.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it_away_from_screen_edges.snap deleted file mode 100644 index ffc59eb5..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_above_it_away_from_screen_edges.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -a │bbbbbbbbbbbbbbb│line1-bbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line2-bbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line3-bbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbb│line4-bbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line5-bbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line6-bbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbb│line7-bbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │line17-bbbbbbbb│line8-bbbbbbbb│prompt $ -────────────────────────────────────────────────────────────┤bbbbbbbbbbbbbbb│line9-bbbbbbbb├───────────────────────────── -a │bbbbbbbbbbbbbbb│line10-bbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line11-bbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbb│line12-bbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbb│line13-bbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line14-bbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line15-bbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbb│line16-bbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line17-bbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line18-bbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbb│line19-bbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it.snap deleted file mode 100644 index 05bbb477..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -a │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it_away_from_screen_edges.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it_away_from_screen_edges.snap deleted file mode 100644 index 6f546abf..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_below_it_away_from_screen_edges.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line1-bbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbb│line2-bbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line3-bbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbb│line4-bbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbb│line5-bbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line6-bbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line7-bbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbb│line8-bbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line9-bbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line10-bbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbb│line11-bbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │line18-bbbbbbbb│line12-bbbbbbb│prompt $ -────────────────────────────────────────────────────────────┤bbbbbbbbbbbbbbb│line13-bbbbbbb├───────────────────────────── -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line14-bbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line15-bbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbb│line16-bbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line17-bbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbb│line18-bbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbb│line19-bbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left.snap deleted file mode 100644 index abd742bc..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left_away_from_screen_edges.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left_away_from_screen_edges.snap deleted file mode 100644 index eb3d6039..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_left_away_from_screen_edges.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────── -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ -──────────────────────────────────────────────────┬────────────────────────────────────────────────────────────────────── -bbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right.snap deleted file mode 100644 index 448a074c..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right_away_from_screen_edges.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right_away_from_screen_edges.snap deleted file mode 100644 index eb3d6039..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__close_pane_with_multiple_panes_to_the_right_away_from_screen_edges.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────── -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ -──────────────────────────────────────────────────┬────────────────────────────────────────────────────────────────────── -bbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__closing_last_pane_exits_app.snap b/src/tests/integration/snapshots/zellij__tests__integration__close_pane__closing_last_pane_exits_app.snap deleted file mode 100644 index cf7bacf6..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__close_pane__closing_last_pane_exits_app.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/close_pane.rs -expression: snapshot_before_quit - ---- -line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__bash_cursor_linewrap.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__bash_cursor_linewrap.snap deleted file mode 100644 index d657b3e3..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__bash_cursor_linewrap.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -Welcome to fish, the friendly interactive shell -⋊> ~/c/mosaic on main ⨯ bash 16:00:06 -[aram@green mosaic]$ 12345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345 -█ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__clear_scroll_region.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__clear_scroll_region.snap deleted file mode 100644 index 2932c549..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__clear_scroll_region.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -Welcome to fish, the friendly interactive shell -⋊> ~/c/mosaic on main ⨯ vim some-file 15:07:22 -⋊> ~/c/mosaic on main ⨯ █ 15:07:29 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__display_tab_characters_properly.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__display_tab_characters_properly.snap deleted file mode 100644 index 8af4cae0..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__display_tab_characters_properly.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - - OS: 5.9.13-arch1-1 GNU/Linux - Uptime: 10 hours, 42 minutes - Hostname: kingdom - Disk usage: - -df: /run/user/1000/doc: Operation not permitted - / 321G / 514G 66% - /efi 27M / 96M 28% - - Network: - - wlp2s0 192.168.0.3 - -[I] [20:07] kingdom:mosaic (main) | █ - - - - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__emacs_longbuf.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__emacs_longbuf.snap deleted file mode 100644 index 4f7e5515..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__emacs_longbuf.snap +++ /dev/null @@ -1,65 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -➜ mosaic git:(mosaic#130) emacs -➜ mosaic git:(mosaic#130) emacs -nw -➜ mosaic git:(mosaic#130) exit -█ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__exa_plus_omf_theme.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__exa_plus_omf_theme.snap deleted file mode 100644 index b09189f4..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__exa_plus_omf_theme.snap +++ /dev/null @@ -1,61 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -.rw-r--r-- 3.3k aram 11 Jan 16:09 CODE_OF_CONDUCT.md -.rw-r--r-- 3.5k aram 17 Feb 16:06 CONTRIBUTING.md -drwxr-xr-x - aram 10 Feb 11:53 default-tiles -drwxr-xr-x - aram 10 Feb 11:53 docs -.rw-r--r-- 2.1k aram 10 Feb 11:53 GOVERNANCE.md -.rw-r--r-- 1.1k aram 10 Feb 11:53 LICENSE.md -.rw-r--r-- 4.7k aram 17 Feb 16:06 README.md -drwxr-xr-x - aram 17 Feb 16:06 src -drwxr-xr-x - aram 17 Feb 16:08 target -drwxr-xr-x - aram 17 Feb 16:06 zellij-tile -⋊> ~/c/zellij on main ⨯ ll 10:27:45 -Permissions Size User Date Modified Name -drwxr-xr-x - aram 11 Feb 14:04 assets -.rwxr-xr-x 596 aram 17 Feb 16:06 build-all.sh -.rw-r--r-- 1.4k aram 17 Feb 16:06 build.rs -.rw-r--r-- 56k aram 17 Feb 16:07 Cargo.lock -.rw-r--r-- 2.1k aram 17 Feb 16:06 Cargo.toml -.rw-r--r-- 3.3k aram 11 Jan 16:09 CODE_OF_CONDUCT.md -.rw-r--r-- 3.5k aram 17 Feb 16:06 CONTRIBUTING.md -drwxr-xr-x - aram 10 Feb 11:53 default-tiles -drwxr-xr-x - aram 10 Feb 11:53 docs -.rw-r--r-- 2.1k aram 10 Feb 11:53 GOVERNANCE.md -.rw-r--r-- 1.1k aram 10 Feb 11:53 LICENSE.md -.rw-r--r-- 4.7k aram 17 Feb 16:06 README.md -drwxr-xr-x - aram 17 Feb 16:06 src -drwxr-xr-x - aram 17 Feb 16:08 target -drwxr-xr-x - aram 17 Feb 16:06 zellij-tile -⋊> ~/c/zellij on main ⨯ omf theme 10:27:45 -Installed: -agnoster chain default plain - -Available: -agnoster eden lavender scorphish -aight emoji-powerline lolfish separation -ays es mars shellder -batman fishbone mish simple-ass-prompt -beloglazov fishface mokou simplevi -bira fishy-drupal mtahmed slavic-cat -bobthefish fisk nai spacefish -bongnoster fox nelsonjchen sushi -boxfish gentoo neolambda syl20bnr -budspencer gianu numist taktoa -cbjohnson gitstatus ocean technopagan -chain gnuykeaj one toaster -clearance godfather pastfish tomita -cmorrell graystatus perryh trout -coffeeandcode harleen plain tweetjay -cor idan pure uggedal -cyan integral pygmalion will -dangerous jacaetevha random wolf-theme -default johanson randomrussel yimmy -dmorrell kawasaki redfish zeit -doughsay krisleech red-snapper zephyr -eclm l robbyrussell zish -edan lambda sashimi -⋊> ~/c/zellij on main ⨯ █ 10:27:46 diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_paste_multiline.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_paste_multiline.snap deleted file mode 100644 index 3a983165..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_paste_multiline.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - - OS: 5.9.14-arch1-1 GNU/Linux - Uptime: 12 hours, 21 minutes - Hostname: kingdom - Disk usage: - -df: /run/user/1000/doc: Operation not permitted - / 295G / 514G 61% - /efi 27M / 96M 28% - - Network: - - wlp2s0 192.168.0.3 - -[I] [21:58] kingdom:mosaic (main) | echo -ne (\ - df -l -h | grep -E 'dev/(xvda|sd|mapper)' | \ - awk '{printf "\\\\t%s\\\\t%4s / %4s %s\\\\n\n", $6, $3, $2, $5}' | \ - sed -e 's/^\(.*\([8][5-9]\|[9][0-9]\)%.*\)$/\\\\e[0;31m\1\\\\e[0m/' -e 's/^\(.*\([7][5-9]\|[8][0-4]\)%.*\ -)$/\\\\e[0;33m\1\\\\e[0m/' | \ - paste -sd ''\ - )█ - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_select_tab_completion_options.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_select_tab_completion_options.snap deleted file mode 100644 index 9a29d950..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_select_tab_completion_options.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -Welcome to fish, the friendly interactive shell -⋊> ~/c/mosaic on main ⨯ sudo badblocks █ 11:32:23 -badblocks (Executable, 33kB) base64 (Executable, 42kB) bash (Executable, 906kB) -bandwhich (Executable, 3.0MB) basename (Executable, 38kB) bashbug (Executable, 6.8kB) -base32 (Executable, 42kB) basenc (Executable, 50kB) bass - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_tab_completion_options.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_tab_completion_options.snap deleted file mode 100644 index 006cd485..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__fish_tab_completion_options.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -Welcome to fish, the friendly interactive shell -⋊> ~/c/mosaic on main ⨯ sudo ba█dwhich 11:18:26 -badblocks (Executable, 33kB) base64 (Executable, 42kB) bash (Executable, 906kB) -bandwhich (Executable, 3.0MB) basename (Executable, 38kB) bashbug (Executable, 6.8kB) -base32 (Executable, 42kB) basenc (Executable, 50kB) bass - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_diff_scrollup.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_diff_scrollup.snap deleted file mode 100644 index 63123585..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_diff_scrollup.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - -src/terminal_pane/scroll.rs -─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - -────────────────────────────────────────────────┐ -use crate::terminal_pane::terminal_character::{ │ -────────────────────────────────────────────────┘ -5 - CharacterStyles, TerminalCharacter, EMPTY_TERMINAL_CHARACTER, -}; - -use crate::utils::logging::debug_log_to_file; - -/* - * Scroll - * - -──────────────┐ -impl Scroll { │ -──────────────┘ -663 - pub fn move_current_buffer_to_alternative_buffer(&mut self) { - self.alternative_buffer = Some(self.canonical_lines.drain(..).collect()); - self.alternative_cursor_position = Some(self.cursor_position); - self.cursor_position.reset(); - self.clear_all(); - } -:█ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_log.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_log.snap deleted file mode 100644 index 74978bda..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__git_log.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - - * wip: doesn't render when new tab is created? - - * wip: doesnt re-render when a new tab is spawned for now - - * wip: tabs now are a BTreeMap and we can switch between them in both directions - - * wip: I think that should also be here - - * wip: cleanup - - * Spawn a new terminal simultaneously with a new tab - - * Ensure proper Opening and Closing of tabs - - * cleanup - - * more cleanup - - * tests(snapshots): add 'loading' snapshot to each scenario - - * fix(tests): update snapshots - - * Add tests for tabs implementation - - * wip: added tests, moved tab related stuff to a separate file - -:█ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop.snap deleted file mode 100644 index 5f37e9ae..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - - 1 [||||| 10.1%] Tasks: 73, 413 thr; 1 running - 2 [||||||| 13.5%] Load average: 1.03 1.07 1.30 - 3 [|||||| 10.8%] Uptime: 22:41:15 - 4 [|||||| 10.6%] - Mem[|||||||||||||||||||||||||||||||||||||3.28G/15.3G] - Swp[ 0K/16.0G] - - PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command - 1352 aram 20 0 3776M 581M 238M S 8.7 3.7 2h01:10 /usr/lib/firefox/firefox - 98777 aram 20 0 537M 6184 4240 S 8.1 0.0 0:00.80 target/debug/mosaic --debug - 1669 aram 20 0 2944M 318M 130M S 8.1 2.0 1h01:33 /usr/lib/firefox/firefox -contentproc -childID 6 -i - 826 aram 9 -11 1581M 15092 11244 S 6.1 0.1 42:21.83 /usr/bin/pulseaudio --daemonize=no - 9419 aram 20 0 533M 7392 3344 S 4.7 0.0 22:01.92 /usr/local/bin/mosaic --max-panes 4 - 98913 aram 20 0 537M 6184 4240 S 3.4 0.0 0:00.31 target/debug/mosaic --debug - 1505 aram 20 0 3187M 329M 206M S 3.4 2.1 23:35.90 /usr/lib/firefox/firefox -contentproc -childID 2 -i - 98912 aram 20 0 537M 6184 4240 S 2.7 0.0 0:00.22 target/debug/mosaic --debug - 1164 aram -6 0 1581M 15092 11244 S 2.7 0.1 21:39.80 /usr/bin/pulseaudio --daemonize=no - 1247 aram 20 0 1184M 292M 84828 S 2.7 1.9 38:01.54 /usr/lib/Xorg -nolisten tcp :0 vt1 -keeptty -auth / - 1475 aram -11 0 3776M 581M 238M S 2.0 3.7 14:27.94 /usr/lib/firefox/firefox - 8574 aram 20 0 2944M 318M 130M S 2.0 2.0 14:36.50 /usr/lib/firefox/firefox -contentproc -childID 6 -i - 1364 aram 20 0 3776M 581M 238M S 2.0 3.7 18:01.89 /usr/lib/firefox/firefox - 1870 aram 20 0 3776M 581M 238M S 2.0 3.7 13:27.06 /usr/lib/firefox/firefox - 9427 aram 20 0 533M 7392 3344 S 2.0 0.0 6:53.47 /usr/local/bin/mosaic --max-panes 4 - 98905 aram 20 0 537M 6184 4240 S 2.0 0.0 0:00.17 target/debug/mosaic --debug - 99272 aram 20 0 8456 4348 3320 R 1.3 0.0 0:00.13 htop - 8611 aram 20 0 2944M 318M 130M S 1.3 2.0 8:17.90 /usr/lib/firefox/firefox -contentproc -childID 6 -i -F1Help F2Setup F3SearchF4FilterF5Tree F6SortByF7Nice -F8Nice +F9Kill F10Quit diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_right_scrolling.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_right_scrolling.snap deleted file mode 100644 index d14a411a..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_right_scrolling.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - - 1 [|||||||||| 16.9%] Tasks: 110, 512 thr; 1 running - 2 [|||||||||| 17.1%] Load average: 1.04 1.30 1.29 - 3 [||||||| 13.9%] Uptime: 6 days, 07:01:39 - 4 [||||||||| 14.9%] - Mem[|||||||||||||||||||||||||||||||||||||8.80G/15.3G] - Swp[| 2.82M/16.0G] - - PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command - 20 0 8576 4508 3356 R 1.3 0.0 0:00.11 htop - 20 0 171M 10868 7804 S 0.0 0.1 2:08.38 /sbin/init - 20 0 107M 29364 28092 S 0.0 0.2 0:03.42 /usr/lib/systemd/systemd-journald - 20 0 32648 9568 6616 S 0.0 0.1 0:01.87 /usr/lib/systemd/systemd-udevd - 20 0 78060 992 856 S 0.0 0.0 0:00.00 /usr/bin/lvmetad -f - 20 0 6952 4356 3492 S 0.0 0.0 0:57.67 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidf - 20 0 14824 7552 5984 S 0.0 0.0 0:12.93 /usr/bin/connmand -n --nodnsproxy - 20 0 17696 7940 6696 S 0.0 0.0 0:01.25 /usr/lib/systemd/systemd-logind - 20 0 1635M 56148 20460 S 0.0 0.3 1:27.24 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 0:38.37 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 0:00.01 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 0:00.00 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 0:00.00 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 0:00.00 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 1:47.55 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 1:26.19 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 1:40.77 /usr/bin/dockerd -H fd:// - 20 0 1635M 56148 20460 S 0.0 0.3 1:47.26 /usr/bin/dockerd -H fd:// -F1Help F2Setup F3SearchF4FilterF5Tree F6SortByF7Nice -F8Nice +F9Kill F10Quit diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_scrolling.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_scrolling.snap deleted file mode 100644 index beffef7c..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__htop_scrolling.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - - 1 [||||||||||||||||||||||||||||||||||||||||||100.0%] Tasks: 79, 382 thr; 1 running - 2 [ 0.0%] Load average: 1.40 1.43 1.38 - 3 [ 0.0%] Uptime: 2 days, 07:33:50 - 4 [ 0.0%] - Mem[|||||||||||||||||||||||||||||||||||||3.64G/15.3G] - Swp[ 0K/16.0G] - - PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command - 123934 aram 20 0 8444 4384 3364 R 66.7 0.0 0:00.05 htop --delay=100000000000 - 1 root 20 0 171M 11616 8608 S 0.0 0.1 0:56.91 /sbin/init - 268 root 20 0 93324 34340 33072 S 0.0 0.2 0:01.05 /usr/lib/systemd/systemd-journald - 276 root 20 0 32648 10192 7240 S 0.0 0.1 0:01.13 /usr/lib/systemd/systemd-udevd - 286 root 20 0 78060 1132 996 S 0.0 0.0 0:00.00 /usr/bin/lvmetad -f - 343 dbus 20 0 6952 4384 3520 S 0.0 0.0 0:13.85 /usr/bin/dbus-daemon --system --address=systemd: -- - 344 root 20 0 14588 7512 6176 S 0.0 0.0 0:03.21 /usr/bin/connmand -n --nodnsproxy - 345 root 20 0 17696 8372 7128 S 0.0 0.1 0:00.67 /usr/lib/systemd/systemd-logind - 395 root 20 0 1635M 83324 44976 S 0.0 0.5 0:32.43 /usr/bin/dockerd -H fd:// - 396 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.01 /usr/bin/dockerd -H fd:// - 397 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.01 /usr/bin/dockerd -H fd:// - 398 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.00 /usr/bin/dockerd -H fd:// - 399 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.00 /usr/bin/dockerd -H fd:// - 412 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.00 /usr/bin/dockerd -H fd:// - 441 root 20 0 1635M 83324 44976 S 0.0 0.5 0:41.35 /usr/bin/dockerd -H fd:// - 442 root 20 0 1635M 83324 44976 S 0.0 0.5 0:33.61 /usr/bin/dockerd -H fd:// - 444 root 20 0 1635M 83324 44976 S 0.0 0.5 0:33.13 /usr/bin/dockerd -H fd:// - 449 root 20 0 1635M 83324 44976 S 0.0 0.5 0:41.39 /usr/bin/dockerd -H fd:// -F1Help F2Setup F3SearchF4FilterF5Tree F6SortByF7Nice -F8Nice +F9Kill F10Quit diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__neovim_insert_mode.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__neovim_insert_mode.snap deleted file mode 100644 index 159bfcac..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__neovim_insert_mode.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -line 1 -line 2 -line 3 -line 4 -line 5 -line 6 -line 7 -line 8 -line 9 -█ine 10 -line 11 -line 12 -line 13 -line 14 -line 15 -line 16 -line 17 -line 18 -line 19 -line 20 -line 21 -line 22 -line 23 -line 24 -line 25 -line 26 -some-file 10,1 Top --- INSERT -- diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__run_bandwhich_from_fish_shell.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__run_bandwhich_from_fish_shell.snap deleted file mode 100644 index e250ba86..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__run_bandwhich_from_fish_shell.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - Total Up / Down: 46Bps / 57Bps -┌Utilization by process name───────────────────────────────────────────────────────────────────────────────────────┐ -│Process Connections Up / Down │ -│ │ -│firefox 3 46Bps / 57Bps │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ - Press to pause. Use to rearrange tables. (DNS queries hidden). diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__top_and_quit.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__top_and_quit.snap deleted file mode 100644 index 1c4e16df..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__top_and_quit.snap +++ /dev/null @@ -1,61 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -Tasks: 158 total, 1 running, 157 sleeping, 0 stopped, 0 zombie -%Cpu(s): 24.2 us, 1.6 sy, 0.0 ni, 74.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -MiB Mem : 15715.1 total, 7001.4 free, 2163.7 used, 6549.9 buff/cache -MiB Swap: 16384.0 total, 16384.0 free, 0.0 used. 12809.8 avail Mem - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 15838 aram 20 0 7275240 56912 18964 S 73.3 0.4 0:17.79 zellij - 12653 aram 20 0 39032 22164 14372 S 20.0 0.1 0:00.63 urxvt - 1477 aram 20 0 3178660 301992 203236 S 6.7 1.9 3:49.82 Web Content - 1 root 20 0 175360 11532 8596 S 0.0 0.1 0:05.90 systemd - 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd - 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp - 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp - 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd - 8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq - 9 root 20 0 0 0 0 S 0.0 0.0 0:01.24 ksoftirqd/0 - 10 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/0 - 11 root -2 0 0 0 0 I 0.0 0.0 0:06.12 rcu_preempt - 12 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcub/0 - 13 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/0 - 14 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/0 - 16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 - 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 - 18 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/1 - 19 root rt 0 0 0 0 S 0.0 0.0 0:00.35 migration/1 - 20 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/1 - 21 root 20 0 0 0 0 S 0.0 0.0 0:00.49 ksoftirqd/1 - 23 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-kblockd - 24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/2 - 25 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/2 - 26 root rt 0 0 0 0 S 0.0 0.0 0:00.39 migration/2 - 27 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/2 - 28 root 20 0 0 0 0 S 0.0 0.0 0:00.99 ksoftirqd/2 - 30 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/2:0H-kblockd - 31 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/3 - 32 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/3 - 33 root rt 0 0 0 0 S 0.0 0.0 0:00.43 migration/3 - 34 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/3 - 35 root 20 0 0 0 0 S 0.0 0.0 0:00.90 ksoftirqd/3 - 37 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/3:0H-kblockd - 38 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs - 39 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns - 40 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_kthre - 41 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kauditd - 44 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd - 45 root 20 0 0 0 0 S 0.0 0.0 0:00.00 oom_reaper - 46 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 writeback - 47 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kcompactd0 - 48 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd - 49 root 39 19 0 0 0 S 0.0 0.0 0:00.00 khugepaged - 137 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kintegrityd - 138 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kblockd - 139 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 blkcg_punt_bio - 140 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 ata_sff - 141 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 edac-poller -⋊> ~/c/zellij on fix-top ⨯ █ 13:00:53 diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_d.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_d.snap deleted file mode 100644 index 5f922afd..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_d.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - 3 line14 - 2 line15 - 1 line16 -17 █ine17 - 1 line18 - 2 line19 - 3 line20 - 4 line21 - 5 line22 - 6 line23 - 7 line24 - 8 line25 - 9 line26 - 10 line27 - 11 line28 - 12 line29 - 13 line30 - 14 line31 - 15 line32 - 16 line33 - 17 line34 - 18 line35 - 19 line36 - 20 line37 - 21 line38 - 22 line39 - NORMAL testfile.rs unix | utf-8 | rust 40% 17:1 - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_u.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_u.snap deleted file mode 100644 index f0b76512..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_ctrl_u.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - 22 line4 - 21 line5 - 20 line6 - 19 line7 - 18 line8 - 17 line9 - 16 line10 - 15 line11 - 14 line12 - 13 line13 - 12 line14 - 11 line15 - 10 line16 - 9 line17 - 8 line18 - 7 line19 - 6 line20 - 5 line21 - 4 line22 - 3 line23 - 2 line24 - 1 line25 -26 █ine26 - 1 line27 - 2 line28 - 3 line29 - NORMAL testfile.rs unix | utf-8 | rust 61% 26:1 - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_overwrite.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_overwrite.snap deleted file mode 100644 index 8dee61ab..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_overwrite.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- -1 █ - 1 line 1 - 2 line 2 - 3 line 3 - 4 line 4 - 5 line 5 - 6 line 6 - 7 line 7 - 8 line 8 - 9 line 9 - 10 line 10 - 11 line 11 - 12 line 12 - 13 line 13 - 14 line 14 - 15 line 15 - 16 line 16 - 17 line 17 - 18 line 18 - 19 line 19 - 20 line 20 - 21 line 21 - 22 line 22 - 23 line 23 - 24 line 24 - 25 line 25 - NORMAL some-file unix | utf-8 | no ft 1% 1:1 - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_scroll_region_down.snap b/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_scroll_region_down.snap deleted file mode 100644 index b4a455e3..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__compatibility__vim_scroll_region_down.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/tests/integration/compatibility.rs -expression: snapshot_before_quit - ---- - 22 line2 - 21 line3 - 20 line4 - 19 line5 - 18 line6 - 17 line7 - 16 line8 - 15 line9 - 14 line10 - 13 line11 - 12 line12 - 11 line13 - 10 line14 - 9 line15 - 8 line16 - 7 line17 - 6 line18 - 5 line19 - 4 line20 - 3 line21 - 2 line22 - 1 line23 -24 █ine24 - 1 line25 - 2 line26 - 3 line27 - NORMAL testfile.rs unix | utf-8 | rust 57% 24:1 - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-2.snap b/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-2.snap deleted file mode 100644 index 24c85bfd..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-2.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/layouts.rs -expression: next_to_last_snapshot - ---- -line6-bbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ -────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────── -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-3.snap b/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-3.snap deleted file mode 100644 index d506a47a..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout-3.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/layouts.rs -expression: last_snapshot - ---- -Bye from Zellij! - █ - - - - - - - - - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout.snap b/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout.snap deleted file mode 100644 index 2f814621..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__layouts__accepts_basic_layout.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/layouts.rs -expression: first_snapshot - ---- -█ │ - │ - │ - │ - │ - │ - │ - │ - │ - │ - │ - │ - │ - │ - │ -────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────── - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down.snap deleted file mode 100644 index 3a89bb92..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_down.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_largest_overlap.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_largest_overlap.snap deleted file mode 100644 index 1c53690e..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_largest_overlap.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_down.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -────────────────────────────────────────────────────────────┬──────────────────────────────┬───────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_most_recently_used_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_most_recently_used_pane.snap deleted file mode 100644 index 1c53690e..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_down__move_focus_down_to_the_most_recently_used_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_down.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -────────────────────────────────────────────────────────────┬──────────────────────────────┬───────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left.snap deleted file mode 100644 index ad879d6c..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_left.rs -expression: snapshot_before_quit - ---- -a │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_changes_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_changes_tab.snap deleted file mode 100644 index 3eb21e65..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_changes_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_left.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_largest_overlap.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_largest_overlap.snap deleted file mode 100644 index b175a531..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_largest_overlap.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_most_recently_used_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_most_recently_used_pane.snap deleted file mode 100644 index b175a531..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_left__move_focus_left_to_the_most_recently_used_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right.snap deleted file mode 100644 index fdd7c3d5..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_right.rs -expression: snapshot_before_quit - ---- -a │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_changes_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_changes_tab.snap deleted file mode 100644 index cefab8e1..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_changes_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_right.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_largest_overlap.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_largest_overlap.snap deleted file mode 100644 index 312b8c04..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_largest_overlap.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_right.rs -expression: snapshot_before_quit - ---- -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │prompt $ -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa├──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ -a ├──────────────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_most_recently_used_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_most_recently_used_pane.snap deleted file mode 100644 index 312b8c04..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_right__move_focus_right_to_the_most_recently_used_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_right.rs -expression: snapshot_before_quit - ---- -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │prompt $ -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa├──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ -a ├──────────────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up.snap deleted file mode 100644 index cf6fc8c8..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_up.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_largest_overlap.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_largest_overlap.snap deleted file mode 100644 index 188bc9c4..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_largest_overlap.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_up.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ █ -────────────────────────────────────────────────────────────┴──────────────────────────────┴───────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_most_recently_used_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_most_recently_used_pane.snap deleted file mode 100644 index 188bc9c4..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__move_focus_up__move_focus_up_to_the_most_recently_used_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/move_focus_up.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ █ -────────────────────────────────────────────────────────────┴──────────────────────────────┴───────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__cannot_resize_down_when_pane_below_is_at_minimum_height.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__cannot_resize_down_when_pane_below_is_at_minimum_height.snap deleted file mode 100644 index 5eedc89f..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__cannot_resize_down_when_pane_below_is_at_minimum_height.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_multiple_panes_above.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_multiple_panes_above.snap deleted file mode 100644 index b69d1c29..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_multiple_panes_above.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────── -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_above.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_above.snap deleted file mode 100644 index 69a35e27..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_above.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_below.snap deleted file mode 100644 index 831b1c52..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_pane_below.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_current_pane.snap deleted file mode 100644 index 6a5197f7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │line19-bbbbbbbbbbbbbbbbbbbbbbb│prompt $ -────────────────────────────────────────────────────────────┤bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├───────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│prompt $ │line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├──────────────────────────────┤line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap deleted file mode 100644 index 0cd41085..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line1-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb -a │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -a │line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaa│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ -──────────────────────────────┤ ├───────────────────────────── -line2-bbbbbbbbbbbbbbbbbbbbbbbb│ │line2-bbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbb├──────────┬──────────────────────────────────┬──────────────┤line3-bbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb │line4-bbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb │line5-bbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb │line6-bbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb │line7-bbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbb│line18-bbb│line8-bbbbbbbbbbbbbbbbbbbbbbb │line8-bbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb │line9-bbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb │line10-bbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb │line11-bbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb │line12-bbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb │line13-bbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbb│line14-bbbbbbbbbbbbbbbbbbbbbb │line14-bbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb │line15-bbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb │line18-bbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ █ │prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_with_current_pane.snap deleted file mode 100644 index a6002f87..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_left_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│prompt $ -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├──────────────────────────────────────────────────────────── -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_right_with_current_pane.snap deleted file mode 100644 index 7a460b4e..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_aligned_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ -a ├──────────────────────────────────────────────────────────── -prompt $ │line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_and_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_and_below.snap deleted file mode 100644 index 29c9a76a..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_above_and_below.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_current_pane.snap deleted file mode 100644 index e86d3efe..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │line19-bbbbbbbbbbbbbbbbbbbbbbb│prompt $ -────────────────────────────────────────────────────────────┤bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├───────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│prompt $ █ │line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├──────────────────────────────┤line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap deleted file mode 100644 index 14d9e507..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line1-bbbbbbbbbbbbbbbbbbbbbbb │line1-bbbbbbbb│line1-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb │line2-bbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb │line3-bbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbb│line4-bbbbbbbbbbbbbbbbbbbbbbb │line4-bbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb │line5-bbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb │line6-bbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb │line7-bbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb │line8-bbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb │line9-bbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaa│line18-bbb│line10-bbbbbbbbbbbbbbbbbbbbbb │line10-bbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb │line11-bbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb │line12-bbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb │line13-bbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb │line14-bbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb │line15-bbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbb│line16-bbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb │line18-bbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │bbbbbbbbbb│prompt $ █ │prompt $ │prompt $ -──────────────────────────────┤bbbbbbbbbb│ │ ├───────────────────────────── -line2-bbbbbbbbbbbbbbbbbbbbbbbb│prompt $ │ │ │line2-bbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbb├──────────┴──────────────────────────────────┴──────────────┤line3-bbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_with_current_pane.snap deleted file mode 100644 index 8e8a9688..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_left_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│prompt $ █ -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├──────────────────────────────────────────────────────────── -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_right_with_current_pane.snap deleted file mode 100644 index 1a90fef7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_down__resize_down_with_panes_below_aligned_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_down.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ -a ├──────────────────────────────────────────────────────────── -prompt $ █ │line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__cannot_resize_left_when_pane_to_the_left_is_at_minimum_width.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__cannot_resize_left_when_pane_to_the_left_is_at_minimum_width.snap deleted file mode 100644 index 214bc8c3..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__cannot_resize_left_when_pane_to_the_left_is_at_minimum_width.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -14-b│lin3 -b │lin4 -line│lin5 -15-b│lin6 -b │lin7 -line│lin8 -16-b│lin9 -b │ln10 -line│ln11 -17-b│ln12 -b │ln13 -line│ln14 -18-b│ln15 -b │ln16 -line│ln17 -19-b│ln18 -b │ln19 -prom│prom -pt $│pt $ - │ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_multiple_panes_to_the_left.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_multiple_panes_to_the_left.snap deleted file mode 100644 index 7cc426f7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_multiple_panes_to_the_left.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -──────────────────────────────────────────────────┤line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_left.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_left.snap deleted file mode 100644 index 7dc8c588..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_left.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaa │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_right.snap deleted file mode 100644 index 16597014..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_pane_to_the_right.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaa │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane.snap deleted file mode 100644 index fbf57dd7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ -──────────────────────────────────────────────────┴─────────┬──────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap deleted file mode 100644 index 6eb2cd18..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┬─────────┴──────────────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ -──────────────────────────────────────────────────┴─────────┬──────────────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap deleted file mode 100644 index 02516734..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┬─────────┴──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa├────────────────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaa │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │prompt $ █ -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa├────────────────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┴─────────┬──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_with_current_pane.snap deleted file mode 100644 index 58edf926..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_aligned_top_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┬─────────┴──────────────────────────────────────────────────────────── -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_and_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_and_right.snap deleted file mode 100644 index 4431134f..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_left_and_right.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbbbbbbbbbbbb │line1-bbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │line3-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │line5-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbbbbbbbbbbbb │line7-bbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │line9-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbbbbbbbbbbbb │line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbbbbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane.snap deleted file mode 100644 index 549b15e5..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ -──────────────────────────────────────────────────┴─────────┬──────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap deleted file mode 100644 index bdee0bd7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┬─────────┴──────────────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ -──────────────────────────────────────────────────┴─────────┬──────────────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap deleted file mode 100644 index 62a92718..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┬─────────┴──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaa │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -──────────────────────────────────────────────────┤line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -──────────────────────────────────────────────────┤line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┴─────────┬──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_with_current_pane.snap deleted file mode 100644 index 654b16d0..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_left__resize_left_with_panes_to_the_right_aligned_top_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_left.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -──────────────────────────────────────────────────┬─────────┴──────────────────────────────────────────────────────────── -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -bbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__cannot_resize_right_when_pane_to_the_left_is_at_minimum_width.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__cannot_resize_right_when_pane_to_the_left_is_at_minimum_width.snap deleted file mode 100644 index 9d366dad..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__cannot_resize_right_when_pane_to_the_left_is_at_minimum_width.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -14-b│lin3 -b │lin4 -line│lin5 -15-b│lin6 -b │lin7 -line│lin8 -16-b│lin9 -b │ln10 -line│ln11 -17-b│ln12 -b │ln13 -line│ln14 -18-b│ln15 -b │ln16 -line│ln17 -19-b│ln18 -b │ln19 -prom│prom -pt $│pt $ - │ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_multiple_panes_to_the_left.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_multiple_panes_to_the_left.snap deleted file mode 100644 index 56b58e28..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_multiple_panes_to_the_left.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -──────────────────────────────────────────────────────────────────────┤bbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_left.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_left.snap deleted file mode 100644 index 2e3ea9f7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_left.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_right.snap deleted file mode 100644 index 87eb82c7..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_pane_to_the_right.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane.snap deleted file mode 100644 index 9fafc30a..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ │prompt $ █ -────────────────────────────────────────────────────────────┬─────────┴────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap deleted file mode 100644 index 21cbb652..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴─────────┬────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ │prompt $ █ -────────────────────────────────────────────────────────────┬─────────┴────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap deleted file mode 100644 index 87714cef..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_above_and_below.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴─────────┬────────────────────────────────────────────────── -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ├────────────────────────────────────────────────── -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ █ -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ├────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┬─────────┴────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_with_current_pane.snap deleted file mode 100644 index 1113bb73..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_aligned_top_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴─────────┬────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_and_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_and_right.snap deleted file mode 100644 index fa310617..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_left_and_right.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -a │bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -a │line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -a │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -prompt $ │prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane.snap deleted file mode 100644 index 7bb38a1a..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ █ │prompt $ -────────────────────────────────────────────────────────────┬─────────┴────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap deleted file mode 100644 index 3c65a787..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴─────────┬────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ █ │prompt $ -────────────────────────────────────────────────────────────┬─────────┴────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap deleted file mode 100644 index 2c2a64e0..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_above_and_below.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -a │line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴─────────┬────────────────────────────────────────────────── -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa │bbbbbbbbbb -prompt $ │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -──────────────────────────────────────────────────────────────────────┤bbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -prompt $ █ │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -──────────────────────────────────────────────────────────────────────┤bbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┬─────────┴────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_with_current_pane.snap deleted file mode 100644 index 24411c3e..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_right__resize_right_with_panes_to_the_right_aligned_top_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_right.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴─────────┬────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │bbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__cannot_resize_up_when_pane_above_is_at_minimum_height.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__cannot_resize_up_when_pane_above_is_at_minimum_height.snap deleted file mode 100644 index 5b09c7bd..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__cannot_resize_up_when_pane_above_is_at_minimum_height.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_multiple_panes_above.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_multiple_panes_above.snap deleted file mode 100644 index cf184ecf..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_multiple_panes_above.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ -────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────── -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_above.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_above.snap deleted file mode 100644 index 877beb41..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_above.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_below.snap deleted file mode 100644 index 676082c1..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_pane_below.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_current_pane.snap deleted file mode 100644 index 24d805db..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ │line18-bbbbbbbbbbbbbbbbbbbbbb -a ├──────────────────────────────┤line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │line10-bbbbbbbbbbbbbbbbbbbbbbb│prompt $ -────────────────────────────────────────────────────────────┤line11-bbbbbbbbbbbbbbbbbbbbbbb├───────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap deleted file mode 100644 index aa571254..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_and_right.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line1-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb -a │line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaa│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ │line18-bbbbbbbbbbbbbbbbbbbbbb -a ├──────────┬──────────────────────────────────┬──────────────┤line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │bbbbbbbbbb│line1-bbbbbbbbbbbbbbbbbbbbbbb │line1-bbbbbbbb│prompt $ -──────────────────────────────┤bbbbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb │line2-bbbbbbbb├───────────────────────────── -line2-bbbbbbbbbbbbbbbbbbbbbbbb│line17-bbb│line3-bbbbbbbbbbbbbbbbbbbbbbb │line3-bbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb │line4-bbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb │line5-bbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb │line6-bbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb │line7-bbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb │line8-bbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbb│line18-bbb│line9-bbbbbbbbbbbbbbbbbbbbbbb │line9-bbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb │line10-bbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb │line11-bbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb │line12-bbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb │line13-bbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb │line14-bbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbb│line15-bbbbbbbbbbbbbbbbbbbbbb │line15-bbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb │line18-bbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbb│bbbbbbbbbb│prompt $ █ │prompt $ │line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │ │ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_with_current_pane.snap deleted file mode 100644 index 463b225f..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_left_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ -a ├──────────────────────────────────────────────────────────── -prompt $ │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_right_with_current_pane.snap deleted file mode 100644 index dfe97594..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_aligned_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│prompt $ -line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├──────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_and_below.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_and_below.snap deleted file mode 100644 index 471fe924..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_above_and_below.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_current_pane.snap deleted file mode 100644 index d2ba58b3..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ █ │line18-bbbbbbbbbbbbbbbbbbbbbb -a ├──────────────────────────────┤line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │line10-bbbbbbbbbbbbbbbbbbbbbbb│prompt $ -────────────────────────────────────────────────────────────┤line11-bbbbbbbbbbbbbbbbbbbbbbb├───────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap deleted file mode 100644 index dfa9283b..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_right.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb │line3-bbbbbbbb│line1-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb │line4-bbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb │line5-bbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb │line6-bbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line17-aaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb │line7-bbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbb│line8-bbbbbbbbbbbbbbbbbbbbbbb │line8-bbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb │line9-bbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb │line10-bbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb │line11-bbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb │line12-bbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb │line13-bbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbb│line14-bbbbbbbbbbbbbbbbbbbbbb │line14-bbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb │line15-bbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -a │bbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb │line16-bbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb │line17-bbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb │line18-bbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│bbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbb │line19-bbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ │prompt $ █ │prompt $ │line18-bbbbbbbbbbbbbbbbbbbbbb -a ├──────────┴──────────────────────────────────┴──────────────┤line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│prompt $ -──────────────────────────────┤line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├───────────────────────────── -line2-bbbbbbbbbbbbbbbbbbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line2-bbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line3-bbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line4-bbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line5-bbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line6-bbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line7-bbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line8-bbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line9-bbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line10-bbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line11-bbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbb│prompt $ │line19-bbbbbbbbbbbbbbbbbbbbbb -prompt $ │ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_with_current_pane.snap deleted file mode 100644 index 3e41290c..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_left_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│prompt $ █ -a ├──────────────────────────────────────────────────────────── -prompt $ │line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_right_with_current_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_right_with_current_pane.snap deleted file mode 100644 index fb31ae4b..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__resize_up__resize_up_with_panes_below_aligned_right_with_current_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/resize_up.rs -expression: snapshot_before_quit - ---- -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ │line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -────────────────────────────────────────────────────────────┤line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│prompt $ -line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb├──────────────────────────────────────────────────────────── -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_last_pane_in_a_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_last_pane_in_a_tab.snap deleted file mode 100644 index 5196e5ca..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_last_pane_in_a_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_tab.snap deleted file mode 100644 index 24ba5565..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_middle_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_middle_tab.snap deleted file mode 100644 index 5196e5ca..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_middle_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_tab_that_has_a_pane_in_fullscreen.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_tab_that_has_a_pane_in_fullscreen.snap deleted file mode 100644 index 24ba5565..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__close_the_tab_that_has_a_pane_in_fullscreen.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__closing_last_tab_exits_the_app.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__closing_last_tab_exits_the_app.snap deleted file mode 100644 index 24ba5565..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__closing_last_tab_exits_the_app.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__open_new_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__open_new_tab.snap deleted file mode 100644 index 5196e5ca..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__open_new_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_next_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_next_tab.snap deleted file mode 100644 index 24ba5565..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_next_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_prev_tab.snap b/src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_prev_tab.snap deleted file mode 100644 index 24ba5565..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__tabs__switch_to_prev_tab.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/tabs.rs -expression: snapshot_before_quit - ---- -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_height_increase_with_one_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_height_increase_with_one_pane.snap deleted file mode 100644 index 2b8efe26..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_height_increase_with_one_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/terminal_window_resize.rs -expression: snapshot_before_quit - ---- -line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_and_height_decrease_with_one_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_and_height_decrease_with_one_pane.snap deleted file mode 100644 index 55f32b5d..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_and_height_decrease_with_one_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/terminal_window_resize.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ - - - - - - - - - - diff --git a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_decrease_with_one_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_decrease_with_one_pane.snap deleted file mode 100644 index 2f72d22a..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_decrease_with_one_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/terminal_window_resize.rs -expression: snapshot_before_quit - ---- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_increase_with_one_pane.snap b/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_increase_with_one_pane.snap deleted file mode 100644 index 95cc6c36..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__terminal_window_resize__window_width_increase_with_one_pane.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/terminal_window_resize.rs -expression: snapshot_before_quit - ---- -line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -prompt $ - █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__adding_new_terminal_in_fullscreen.snap b/src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__adding_new_terminal_in_fullscreen.snap deleted file mode 100644 index 74cf9c82..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__adding_new_terminal_in_fullscreen.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/toggle_fullscreen.rs -expression: snapshot_before_quit - ---- -a │line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │prompt $ -line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa├──────────────────────────────────────────────────────────── -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -a │line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ │prompt $ █ diff --git a/src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__move_focus_is_disabled_in_fullscreen.snap b/src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__move_focus_is_disabled_in_fullscreen.snap deleted file mode 100644 index be8af70c..00000000 --- a/src/tests/integration/snapshots/zellij__tests__integration__toggle_fullscreen__move_focus_is_disabled_in_fullscreen.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: src/tests/integration/toggle_fullscreen.rs -expression: snapshot_before_quit - ---- -line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -prompt $ █ diff --git a/src/tests/integration/tabs.rs b/src/tests/integration/tabs.rs deleted file mode 100644 index c520eec7..00000000 --- a/src/tests/integration/tabs.rs +++ /dev/null @@ -1,326 +0,0 @@ -use insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::commands::CLOSE_PANE_IN_PANE_MODE; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; - -use crate::tests::utils::commands::{ - CLOSE_TAB_IN_TAB_MODE, NEW_TAB_IN_TAB_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, - SWITCH_NEXT_TAB_IN_TAB_MODE, SWITCH_PREV_TAB_IN_TAB_MODE, TAB_MODE, - TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; -use zellij_utils::pane_size::PositionAndSize; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn open_new_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn switch_to_prev_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &SWITCH_PREV_TAB_IN_TAB_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn switch_to_next_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &SWITCH_NEXT_TAB_IN_TAB_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &CLOSE_TAB_IN_TAB_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_last_pane_in_a_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &CLOSE_PANE_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_the_middle_tab() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &SWITCH_PREV_TAB_IN_TAB_MODE, - &CLOSE_TAB_IN_TAB_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn close_the_tab_that_has_a_pane_in_fullscreen() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &SWITCH_PREV_TAB_IN_TAB_MODE, - &PANE_MODE, - &TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, - &TAB_MODE, - &CLOSE_TAB_IN_TAB_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn closing_last_tab_exits_the_app() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &TAB_MODE, - &NEW_TAB_IN_TAB_MODE, - &CLOSE_TAB_IN_TAB_MODE, - &CLOSE_TAB_IN_TAB_MODE, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/terminal_window_resize.rs b/src/tests/integration/terminal_window_resize.rs deleted file mode 100644 index 8793071f..00000000 --- a/src/tests/integration/terminal_window_resize.rs +++ /dev/null @@ -1,161 +0,0 @@ -use ::insta::assert_snapshot; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::commands::QUIT; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(fake_win_size.clone()) -} - -#[test] -pub fn window_width_decrease_with_one_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&QUIT]); - fake_input_output.add_sigwinch_event(PositionAndSize { - cols: 90, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }); - let opts = CliArgs::default(); - start( - Box::new(fake_input_output.clone()), - opts, - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn window_width_increase_with_one_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&QUIT]); - fake_input_output.add_sigwinch_event(PositionAndSize { - cols: 141, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }); - let opts = CliArgs::default(); - start( - Box::new(fake_input_output.clone()), - opts, - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn window_height_increase_with_one_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&QUIT]); - fake_input_output.add_sigwinch_event(PositionAndSize { - cols: 121, - rows: 30, - x: 0, - y: 0, - ..Default::default() - }); - let opts = CliArgs::default(); - start( - Box::new(fake_input_output.clone()), - opts, - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn window_width_and_height_decrease_with_one_pane() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&QUIT]); - fake_input_output.add_sigwinch_event(PositionAndSize { - cols: 90, - rows: 10, - x: 0, - y: 0, - ..Default::default() - }); - let opts = CliArgs::default(); - start( - Box::new(fake_input_output.clone()), - opts, - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/integration/toggle_fullscreen.rs b/src/tests/integration/toggle_fullscreen.rs deleted file mode 100644 index af92920a..00000000 --- a/src/tests/integration/toggle_fullscreen.rs +++ /dev/null @@ -1,89 +0,0 @@ -use insta::assert_snapshot; - -use crate::tests::fakes::FakeInputOutput; -use crate::tests::start; -use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::CliArgs; -use zellij_utils::pane_size::PositionAndSize; - -use crate::tests::utils::commands::{ - MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, - TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, -}; -use zellij_utils::input::config::Config; - -fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { - FakeInputOutput::new(*fake_win_size) -} - -#[test] -pub fn adding_new_terminal_in_fullscreen() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn move_focus_is_disabled_in_fullscreen() { - let fake_win_size = PositionAndSize { - cols: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, - &MOVE_FOCUS_IN_PANE_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Box::new(fake_input_output.clone()), - Config::default(), - None, - ); - - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} diff --git a/src/tests/mod.rs b/src/tests/mod.rs index bd590779..08734975 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -1,37 +1 @@ pub mod e2e; -pub mod fakes; -pub mod integration; -pub mod possible_tty_inputs; -pub mod tty_inputs; -pub mod utils; - -use std::path::PathBuf; -use zellij_client::{os_input_output::ClientOsApi, start_client, ClientInfo}; -use zellij_server::{os_input_output::ServerOsApi, start_server}; -use zellij_utils::{ - cli::CliArgs, - input::{config::Config, layout::Layout}, -}; - -pub fn start( - client_os_input: Box, - opts: CliArgs, - server_os_input: Box, - config: Config, - layout: Option, -) { - let server_thread = std::thread::Builder::new() - .name("server_thread".into()) - .spawn(move || { - start_server(server_os_input, PathBuf::from("")); - }) - .unwrap(); - start_client( - client_os_input, - opts, - config, - ClientInfo::New("".into()), - layout, - ); - let _ = server_thread.join(); -} diff --git a/src/tests/possible_tty_inputs.rs b/src/tests/possible_tty_inputs.rs deleted file mode 100644 index 30668360..00000000 --- a/src/tests/possible_tty_inputs.rs +++ /dev/null @@ -1,103 +0,0 @@ -use crate::tests::tty_inputs::{ - COL_10, COL_121, COL_14, COL_141, COL_15, COL_19, COL_20, COL_24, COL_25, COL_29, COL_30, - COL_34, COL_39, COL_4, COL_40, COL_47, COL_50, COL_60, COL_70, COL_8, COL_80, COL_9, COL_90, - COL_96, -}; -use std::collections::HashMap; -use std::fs; -use std::path::PathBuf; - -#[derive(Clone, Debug)] -pub struct Bytes { - pub content: Vec, - pub read_position: usize, -} - -impl Bytes { - pub fn new() -> Self { - Bytes { - content: vec![], - read_position: 0, - } - } - pub fn from_file_in_fixtures(file_name: &str) -> Self { - let mut path_to_file = PathBuf::new(); - path_to_file.push("src"); - path_to_file.push("tests"); - path_to_file.push("fixtures"); - path_to_file.push(file_name); - let content = fs::read(path_to_file) - .unwrap_or_else(|_| panic!("could not read fixture {:?}", &file_name)); - Bytes { - content, - read_position: 0, - } - } - pub fn content_from_str(mut self, content: &[&'static str]) -> Self { - let mut content_as_bytes = vec![]; - for line in content { - for char in line.chars() { - content_as_bytes.push(char as u8); - } - } - self.content = content_as_bytes; - self - } - pub fn set_read_position(&mut self, read_position: usize) { - self.read_position = read_position; - } -} - -pub fn get_possible_tty_inputs() -> HashMap { - // the key is the column count for this terminal input - let mut possible_inputs = HashMap::new(); - let col_4_bytes = Bytes::new().content_from_str(&COL_4); - let col_8_bytes = Bytes::new().content_from_str(&COL_8); - let col_9_bytes = Bytes::new().content_from_str(&COL_9); - let col_10_bytes = Bytes::new().content_from_str(&COL_10); - let col_14_bytes = Bytes::new().content_from_str(&COL_14); - let col_15_bytes = Bytes::new().content_from_str(&COL_15); - let col_19_bytes = Bytes::new().content_from_str(&COL_19); - let col_20_bytes = Bytes::new().content_from_str(&COL_20); - let col_24_bytes = Bytes::new().content_from_str(&COL_24); - let col_25_bytes = Bytes::new().content_from_str(&COL_25); - let col_29_bytes = Bytes::new().content_from_str(&COL_29); - let col_30_bytes = Bytes::new().content_from_str(&COL_30); - let col_34_bytes = Bytes::new().content_from_str(&COL_34); - let col_39_bytes = Bytes::new().content_from_str(&COL_39); - let col_40_bytes = Bytes::new().content_from_str(&COL_40); - let col_47_bytes = Bytes::new().content_from_str(&COL_47); - let col_50_bytes = Bytes::new().content_from_str(&COL_50); - let col_60_bytes = Bytes::new().content_from_str(&COL_60); - let col_70_bytes = Bytes::new().content_from_str(&COL_70); - let col_80_bytes = Bytes::new().content_from_str(&COL_80); - let col_90_bytes = Bytes::new().content_from_str(&COL_90); - let col_96_bytes = Bytes::new().content_from_str(&COL_96); - let col_121_bytes = Bytes::new().content_from_str(&COL_121); - let col_141_bytes = Bytes::new().content_from_str(&COL_141); - possible_inputs.insert(4, col_4_bytes); - possible_inputs.insert(8, col_8_bytes); - possible_inputs.insert(9, col_9_bytes); - possible_inputs.insert(10, col_10_bytes); - possible_inputs.insert(14, col_14_bytes); - possible_inputs.insert(15, col_15_bytes); - possible_inputs.insert(19, col_19_bytes); - possible_inputs.insert(20, col_20_bytes); - possible_inputs.insert(24, col_24_bytes); - possible_inputs.insert(25, col_25_bytes); - possible_inputs.insert(29, col_29_bytes); - possible_inputs.insert(30, col_30_bytes); - possible_inputs.insert(34, col_34_bytes); - possible_inputs.insert(39, col_39_bytes); - possible_inputs.insert(40, col_40_bytes); - possible_inputs.insert(47, col_47_bytes); - possible_inputs.insert(50, col_50_bytes); - possible_inputs.insert(60, col_60_bytes); - possible_inputs.insert(70, col_70_bytes); - possible_inputs.insert(80, col_80_bytes); - possible_inputs.insert(90, col_90_bytes); - possible_inputs.insert(96, col_96_bytes); - possible_inputs.insert(121, col_121_bytes); - possible_inputs.insert(141, col_141_bytes); - possible_inputs -} diff --git a/src/tests/tty_inputs.rs b/src/tests/tty_inputs.rs deleted file mode 100644 index 43ac8abc..00000000 --- a/src/tests/tty_inputs.rs +++ /dev/null @@ -1,550 +0,0 @@ -pub const COL_141: [&str; 20] = [ - "line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line17-baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line18-baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line19-baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "prompt $ ", -]; - -pub const COL_121: [&str; 20] = [ - "line1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line9-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line10-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line11-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line12-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line13-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line14-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line15-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line16-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line17-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line18-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "line19-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n", - "prompt $ ", -]; - -pub const COL_4: [&str; 20] = [ - "lin1\r\n", - "lin2\r\n", - "lin3\r\n", - "lin4\r\n", - "lin5\r\n", - "lin6\r\n", - "lin7\r\n", - "lin8\r\n", - "lin9\r\n", - "ln10\r\n", - "ln11\r\n", - "ln12\r\n", - "ln13\r\n", - "ln14\r\n", - "ln15\r\n", - "ln16\r\n", - "ln17\r\n", - "ln18\r\n", - "ln19\r\n", - "prompt $ ", -]; - -pub const COL_8: [&str; 20] = [ - "line1-bb\r\n", - "line2-bb\r\n", - "line3-bb\r\n", - "line4-bb\r\n", - "line5-bb\r\n", - "line6-bb\r\n", - "line7-bb\r\n", - "line8-bb\r\n", - "line9-bb\r\n", - "line10-b\r\n", - "line11-b\r\n", - "line12-b\r\n", - "line13-b\r\n", - "line14-b\r\n", - "line15-b\r\n", - "line16-b\r\n", - "line17-b\r\n", - "line18-b\r\n", - "line19-b\r\n", - "prompt $ ", -]; - -pub const COL_9: [&str; 20] = [ - "line1-bbb\r\n", - "line2-bbb\r\n", - "line3-bbb\r\n", - "line4-bbb\r\n", - "line5-bbb\r\n", - "line6-bbb\r\n", - "line7-bbb\r\n", - "line8-bbb\r\n", - "line9-bbb\r\n", - "line10-bb\r\n", - "line11-bb\r\n", - "line12-bb\r\n", - "line13-bb\r\n", - "line14-bb\r\n", - "line15-bb\r\n", - "line16-bb\r\n", - "line17-bb\r\n", - "line18-bb\r\n", - "line19-bb\r\n", - "prompt $ ", -]; - -pub const COL_10: [&str; 20] = [ - "line1-bbbb\r\n", - "line2-bbbb\r\n", - "line3-bbbb\r\n", - "line4-bbbb\r\n", - "line5-bbbb\r\n", - "line6-bbbb\r\n", - "line7-bbbb\r\n", - "line8-bbbb\r\n", - "line9-bbbb\r\n", - "line10-bbb\r\n", - "line11-bbb\r\n", - "line12-bbb\r\n", - "line13-bbb\r\n", - "line14-bbb\r\n", - "line15-bbb\r\n", - "line16-bbb\r\n", - "line17-bbb\r\n", - "line18-bbb\r\n", - "line19-bbb\r\n", - "prompt $ ", -]; - -pub const COL_14: [&str; 20] = [ - "line1-bbbbbbbb\r\n", - "line2-bbbbbbbb\r\n", - "line3-bbbbbbbb\r\n", - "line4-bbbbbbbb\r\n", - "line5-bbbbbbbb\r\n", - "line6-bbbbbbbb\r\n", - "line7-bbbbbbbb\r\n", - "line8-bbbbbbbb\r\n", - "line9-bbbbbbbb\r\n", - "line10-bbbbbbb\r\n", - "line11-bbbbbbb\r\n", - "line12-bbbbbbb\r\n", - "line13-bbbbbbb\r\n", - "line14-bbbbbbb\r\n", - "line15-bbbbbbb\r\n", - "line16-bbbbbbb\r\n", - "line17-bbbbbbb\r\n", - "line18-bbbbbbb\r\n", - "line19-bbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_15: [&str; 20] = [ - "line1-bbbbbbbbb\r\n", - "line2-bbbbbbbbb\r\n", - "line3-bbbbbbbbb\r\n", - "line4-bbbbbbbbb\r\n", - "line5-bbbbbbbbb\r\n", - "line6-bbbbbbbbb\r\n", - "line7-bbbbbbbbb\r\n", - "line8-bbbbbbbbb\r\n", - "line9-bbbbbbbbb\r\n", - "line10-bbbbbbbb\r\n", - "line11-bbbbbbbb\r\n", - "line12-bbbbbbbb\r\n", - "line13-bbbbbbbb\r\n", - "line14-bbbbbbbb\r\n", - "line15-bbbbbbbb\r\n", - "line16-bbbbbbbb\r\n", - "line17-bbbbbbbb\r\n", - "line18-bbbbbbbb\r\n", - "line19-bbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_19: [&str; 20] = [ - "line1-bbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_20: [&str; 20] = [ - "line1-bbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_24: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_25: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; -pub const COL_29: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_30: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_34: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_40: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_39: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_47: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_50: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_60: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_70: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_80: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_90: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; - -pub const COL_96: [&str; 20] = [ - "line1-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line2-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line3-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line4-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line5-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line6-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line7-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line8-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line10-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line11-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line12-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line13-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line14-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line15-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line16-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line17-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line18-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "line19-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n", - "prompt $ ", -]; diff --git a/src/tests/utils.rs b/src/tests/utils.rs deleted file mode 100644 index 2058f9df..00000000 --- a/src/tests/utils.rs +++ /dev/null @@ -1,95 +0,0 @@ -use zellij_utils::{vte, zellij_tile}; - -use zellij_server::{panes::TerminalPane, tab::Pane}; -use zellij_tile::data::Palette; -use zellij_utils::pane_size::PositionAndSize; - -pub fn get_output_frame_snapshots( - output_frames: &[Vec], - win_size: &PositionAndSize, -) -> Vec { - let mut vte_parser = vte::Parser::new(); - let main_pid = 0; - let mut terminal_output = TerminalPane::new(main_pid, *win_size, Palette::default()); - - let mut snapshots = vec![]; - for frame in output_frames.iter() { - for byte in frame.iter() { - vte_parser.advance(&mut terminal_output.grid, *byte); - } - let output_lines = terminal_output.read_buffer_as_lines(); - let cursor_coordinates = terminal_output.cursor_coordinates(); - let mut snapshot = String::new(); - for (line_index, line) in output_lines.iter().enumerate() { - for (character_index, terminal_character) in line.iter().enumerate() { - if let Some((cursor_x, cursor_y)) = cursor_coordinates { - if line_index == cursor_y && character_index == cursor_x { - snapshot.push('█'); - continue; - } - } - snapshot.push(terminal_character.character); - } - if line_index != output_lines.len() - 1 { - snapshot.push('\n'); - } - } - snapshots.push(snapshot); - } - snapshots -} - -pub fn get_next_to_last_snapshot(mut snapshots: Vec) -> Option { - if snapshots.len() < 2 { - None - } else { - Some(snapshots.remove(snapshots.len() - 2)) - } -} - -pub mod commands { - pub const QUIT: [u8; 1] = [17]; // ctrl-q - pub const ESC: [u8; 1] = [27]; - pub const ENTER: [u8; 1] = [10]; // char '\n' - pub const LOCK_MODE: [u8; 1] = [7]; // ctrl-g - - pub const MOVE_FOCUS_LEFT_IN_NORMAL_MODE: [u8; 2] = [27, 104]; // alt-h - pub const MOVE_FOCUS_RIGHT_IN_NORMAL_MODE: [u8; 2] = [27, 108]; // alt-l - - pub const PANE_MODE: [u8; 1] = [16]; // ctrl-p - pub const SPAWN_TERMINAL_IN_PANE_MODE: [u8; 1] = [110]; // n - pub const MOVE_FOCUS_IN_PANE_MODE: [u8; 1] = [112]; // p - pub const SPLIT_DOWN_IN_PANE_MODE: [u8; 1] = [100]; // d - pub const SPLIT_RIGHT_IN_PANE_MODE: [u8; 1] = [114]; // r - pub const TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE: [u8; 1] = [102]; // f - pub const CLOSE_PANE_IN_PANE_MODE: [u8; 1] = [120]; // x - pub const MOVE_FOCUS_DOWN_IN_PANE_MODE: [u8; 1] = [106]; // j - pub const MOVE_FOCUS_UP_IN_PANE_MODE: [u8; 1] = [107]; // k - pub const MOVE_FOCUS_LEFT_IN_PANE_MODE: [u8; 1] = [104]; // h - pub const MOVE_FOCUS_RIGHT_IN_PANE_MODE: [u8; 1] = [108]; // l - - pub const SCROLL_MODE: [u8; 1] = [19]; // ctrl-s - pub const SCROLL_UP_IN_SCROLL_MODE: [u8; 1] = [107]; // k - pub const SCROLL_DOWN_IN_SCROLL_MODE: [u8; 1] = [106]; // j - pub const SCROLL_PAGE_UP_IN_SCROLL_MODE: [u8; 1] = [2]; // ctrl-b - pub const SCROLL_PAGE_DOWN_IN_SCROLL_MODE: [u8; 1] = [6]; // ctrl-f - - pub const RESIZE_MODE: [u8; 1] = [18]; // ctrl-r - pub const RESIZE_DOWN_IN_RESIZE_MODE: [u8; 1] = [106]; // j - pub const RESIZE_UP_IN_RESIZE_MODE: [u8; 1] = [107]; // k - pub const RESIZE_LEFT_IN_RESIZE_MODE: [u8; 1] = [104]; // h - pub const RESIZE_RIGHT_IN_RESIZE_MODE: [u8; 1] = [108]; // l - - pub const TAB_MODE: [u8; 1] = [20]; // ctrl-t - pub const NEW_TAB_IN_TAB_MODE: [u8; 1] = [110]; // n - pub const SWITCH_NEXT_TAB_IN_TAB_MODE: [u8; 1] = [108]; // l - pub const SWITCH_PREV_TAB_IN_TAB_MODE: [u8; 1] = [104]; // h - pub const CLOSE_TAB_IN_TAB_MODE: [u8; 1] = [120]; // x - - pub const SESSION_MODE: [u8; 1] = [15]; // ctrl-o - pub const DETACH_IN_SESSION_MODE: [u8; 1] = [100]; // d - - pub const BRACKETED_PASTE_START: [u8; 6] = [27, 91, 50, 48, 48, 126]; // \u{1b}[200~ - pub const BRACKETED_PASTE_END: [u8; 6] = [27, 91, 50, 48, 49, 126]; // \u{1b}[201 - pub const SLEEP: [u8; 0] = []; -} diff --git a/zellij-client/Cargo.toml b/zellij-client/Cargo.toml index 726bd3a2..9b04104b 100644 --- a/zellij-client/Cargo.toml +++ b/zellij-client/Cargo.toml @@ -12,5 +12,8 @@ license = "MIT" termbg = "0.2.3" zellij-utils = { path = "../zellij-utils/", version = "0.14.0" } +[dev-dependencies] +insta = "1.6.0" + [features] test = ["zellij-utils/test"] diff --git a/zellij-client/src/input_handler.rs b/zellij-client/src/input_handler.rs index 46924951..e563e345 100644 --- a/zellij-client/src/input_handler.rs +++ b/zellij-client/src/input_handler.rs @@ -193,3 +193,7 @@ pub(crate) fn input_loop( ) .handle_input(); } + +#[cfg(test)] +#[path = "./unit/input_handler_tests.rs"] +mod grid_tests; diff --git a/zellij-client/src/unit/input_handler_tests.rs b/zellij-client/src/unit/input_handler_tests.rs new file mode 100644 index 00000000..bf9bc45a --- /dev/null +++ b/zellij-client/src/unit/input_handler_tests.rs @@ -0,0 +1,260 @@ +use super::input_loop; +use zellij_utils::input::actions::{Action, Direction}; +use zellij_utils::input::config::Config; +use zellij_utils::pane_size::PositionAndSize; +use zellij_utils::zellij_tile::data::Palette; + +use crate::{os_input_output::ClientOsApi, ClientInstruction, CommandIsExecuting}; + +use std::path::Path; + +use zellij_utils::zellij_tile; + +use std::io; +use std::os::unix::io::RawFd; +use std::sync::{Arc, Mutex}; +use zellij_tile::data::InputMode; +use zellij_utils::{ + errors::ErrorContext, + ipc::{ClientToServerMsg, ServerToClientMsg}, +}; + +use zellij_utils::channels::{self, ChannelWithContext, SenderWithContext}; + +#[allow(unused)] +pub mod commands { + pub const QUIT: [u8; 1] = [17]; // ctrl-q + pub const ESC: [u8; 1] = [27]; + pub const ENTER: [u8; 1] = [10]; // char '\n' + + pub const MOVE_FOCUS_LEFT_IN_NORMAL_MODE: [u8; 2] = [27, 104]; // alt-h + pub const MOVE_FOCUS_RIGHT_IN_NORMAL_MODE: [u8; 2] = [27, 108]; // alt-l + + pub const PANE_MODE: [u8; 1] = [16]; // ctrl-p + pub const SPAWN_TERMINAL_IN_PANE_MODE: [u8; 1] = [110]; // n + pub const MOVE_FOCUS_IN_PANE_MODE: [u8; 1] = [112]; // p + pub const SPLIT_DOWN_IN_PANE_MODE: [u8; 1] = [100]; // d + pub const SPLIT_RIGHT_IN_PANE_MODE: [u8; 1] = [114]; // r + pub const TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE: [u8; 1] = [102]; // f + pub const CLOSE_PANE_IN_PANE_MODE: [u8; 1] = [120]; // x + pub const MOVE_FOCUS_DOWN_IN_PANE_MODE: [u8; 1] = [106]; // j + pub const MOVE_FOCUS_UP_IN_PANE_MODE: [u8; 1] = [107]; // k + pub const MOVE_FOCUS_LEFT_IN_PANE_MODE: [u8; 1] = [104]; // h + pub const MOVE_FOCUS_RIGHT_IN_PANE_MODE: [u8; 1] = [108]; // l + + pub const SCROLL_MODE: [u8; 1] = [19]; // ctrl-s + pub const SCROLL_UP_IN_SCROLL_MODE: [u8; 1] = [107]; // k + pub const SCROLL_DOWN_IN_SCROLL_MODE: [u8; 1] = [106]; // j + pub const SCROLL_PAGE_UP_IN_SCROLL_MODE: [u8; 1] = [2]; // ctrl-b + pub const SCROLL_PAGE_DOWN_IN_SCROLL_MODE: [u8; 1] = [6]; // ctrl-f + + pub const RESIZE_MODE: [u8; 1] = [18]; // ctrl-r + pub const RESIZE_DOWN_IN_RESIZE_MODE: [u8; 1] = [106]; // j + pub const RESIZE_UP_IN_RESIZE_MODE: [u8; 1] = [107]; // k + pub const RESIZE_LEFT_IN_RESIZE_MODE: [u8; 1] = [104]; // h + pub const RESIZE_RIGHT_IN_RESIZE_MODE: [u8; 1] = [108]; // l + + pub const TAB_MODE: [u8; 1] = [20]; // ctrl-t + pub const NEW_TAB_IN_TAB_MODE: [u8; 1] = [110]; // n + pub const SWITCH_NEXT_TAB_IN_TAB_MODE: [u8; 1] = [108]; // l + pub const SWITCH_PREV_TAB_IN_TAB_MODE: [u8; 1] = [104]; // h + pub const CLOSE_TAB_IN_TAB_MODE: [u8; 1] = [120]; // x + + pub const BRACKETED_PASTE_START: [u8; 6] = [27, 91, 50, 48, 48, 126]; // \u{1b}[200~ + pub const BRACKETED_PASTE_END: [u8; 6] = [27, 91, 50, 48, 49, 126]; // \u{1b}[201 + pub const SLEEP: [u8; 0] = []; +} + +struct FakeClientOsApi { + stdin_events: Arc>>>, + events_sent_to_server: Arc>>, + command_is_executing: Arc>, +} + +impl FakeClientOsApi { + pub fn new( + mut stdin_events: Vec>, + events_sent_to_server: Arc>>, + command_is_executing: CommandIsExecuting, + ) -> Self { + // while command_is_executing itself is implemented with an Arc, we have to have an + // Arc here because we need interior mutability, otherwise we'll have to change the + // ClientOsApi trait, and that will cause a lot of havoc + let command_is_executing = Arc::new(Mutex::new(command_is_executing)); + stdin_events.push(commands::QUIT.to_vec()); + let stdin_events = Arc::new(Mutex::new(stdin_events)); // this is also done for interior mutability + FakeClientOsApi { + stdin_events, + events_sent_to_server, + command_is_executing, + } + } +} + +impl ClientOsApi for FakeClientOsApi { + fn get_terminal_size_using_fd(&self, _fd: RawFd) -> PositionAndSize { + unimplemented!() + } + fn set_raw_mode(&mut self, _fd: RawFd) { + unimplemented!() + } + fn unset_raw_mode(&self, _fd: RawFd) { + unimplemented!() + } + fn get_stdout_writer(&self) -> Box { + unimplemented!() + } + fn read_from_stdin(&self) -> Vec { + let mut stdin_events = self.stdin_events.lock().unwrap(); + if stdin_events.is_empty() { + panic!("ran out of stdin events!"); + } + let next_event = stdin_events.remove(0); + next_event + } + fn box_clone(&self) -> Box { + unimplemented!() + } + fn send_to_server(&self, msg: ClientToServerMsg) { + { + let mut events_sent_to_server = self.events_sent_to_server.lock().unwrap(); + events_sent_to_server.push(msg); + } + { + let mut command_is_executing = self.command_is_executing.lock().unwrap(); + command_is_executing.unblock_input_thread(); + } + } + fn recv_from_server(&self) -> (ServerToClientMsg, ErrorContext) { + unimplemented!() + } + fn handle_signals(&self, _sigwinch_cb: Box, _quit_cb: Box) { + unimplemented!() + } + fn connect_to_server(&self, _path: &Path) { + unimplemented!() + } + fn load_palette(&self) -> Palette { + unimplemented!() + } +} + +fn extract_actions_sent_to_server( + events_sent_to_server: Arc>>, +) -> Vec { + let events_sent_to_server = events_sent_to_server.lock().unwrap(); + events_sent_to_server.iter().fold(vec![], |mut acc, event| { + if let ClientToServerMsg::Action(action) = event { + acc.push(action.clone()); + } + acc + }) +} + +#[test] +pub fn quit_breaks_input_loop() { + let stdin_events = vec![]; + let events_sent_to_server = Arc::new(Mutex::new(vec![])); + let command_is_executing = CommandIsExecuting::new(); + let client_os_api = Box::new(FakeClientOsApi::new( + stdin_events, + events_sent_to_server.clone(), + command_is_executing.clone(), + )); + let config = Config::from_default_assets().unwrap(); + + let (send_client_instructions, _receive_client_instructions): ChannelWithContext< + ClientInstruction, + > = channels::bounded(50); + let send_client_instructions = SenderWithContext::new(send_client_instructions); + + let default_mode = InputMode::Normal; + drop(input_loop( + client_os_api, + config, + command_is_executing, + send_client_instructions, + default_mode, + )); + let expected_actions_sent_to_server = vec![Action::Quit]; + let received_actions = extract_actions_sent_to_server(events_sent_to_server); + assert_eq!( + expected_actions_sent_to_server, received_actions, + "All actions sent to server properly" + ); +} + +#[test] +pub fn move_focus_left_in_pane_mode() { + let mut stdin_events = vec![]; + stdin_events.push(commands::MOVE_FOCUS_LEFT_IN_NORMAL_MODE.to_vec()); + let events_sent_to_server = Arc::new(Mutex::new(vec![])); + let command_is_executing = CommandIsExecuting::new(); + let client_os_api = Box::new(FakeClientOsApi::new( + stdin_events, + events_sent_to_server.clone(), + command_is_executing.clone(), + )); + let config = Config::from_default_assets().unwrap(); + + let (send_client_instructions, _receive_client_instructions): ChannelWithContext< + ClientInstruction, + > = channels::bounded(50); + let send_client_instructions = SenderWithContext::new(send_client_instructions); + + let default_mode = InputMode::Normal; + drop(input_loop( + client_os_api, + config, + command_is_executing, + send_client_instructions, + default_mode, + )); + let expected_actions_sent_to_server = + vec![Action::MoveFocusOrTab(Direction::Left), Action::Quit]; + let received_actions = extract_actions_sent_to_server(events_sent_to_server); + assert_eq!( + expected_actions_sent_to_server, received_actions, + "All actions sent to server properly" + ); +} + +#[test] +pub fn bracketed_paste() { + let stdin_events = vec![ + commands::BRACKETED_PASTE_START.to_vec(), + commands::MOVE_FOCUS_LEFT_IN_NORMAL_MODE.to_vec(), + commands::BRACKETED_PASTE_END.to_vec(), + ]; + let events_sent_to_server = Arc::new(Mutex::new(vec![])); + let command_is_executing = CommandIsExecuting::new(); + let client_os_api = Box::new(FakeClientOsApi::new( + stdin_events, + events_sent_to_server.clone(), + command_is_executing.clone(), + )); + let config = Config::from_default_assets().unwrap(); + + let (send_client_instructions, _receive_client_instructions): ChannelWithContext< + ClientInstruction, + > = channels::bounded(50); + let send_client_instructions = SenderWithContext::new(send_client_instructions); + + let default_mode = InputMode::Normal; + drop(input_loop( + client_os_api, + config, + command_is_executing, + send_client_instructions, + default_mode, + )); + let expected_actions_sent_to_server = vec![ + Action::Write(commands::MOVE_FOCUS_LEFT_IN_NORMAL_MODE.to_vec()), // keys were directly written to server and not interpreted + Action::Quit, + ]; + let received_actions = extract_actions_sent_to_server(events_sent_to_server); + assert_eq!( + expected_actions_sent_to_server, received_actions, + "All actions sent to server properly" + ); +} diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs index 27872b64..5322e6a6 100644 --- a/zellij-server/src/lib.rs +++ b/zellij-server/src/lib.rs @@ -390,6 +390,7 @@ fn init_session( to_pty: Some(to_pty), to_plugin: Some(to_plugin), to_server: None, + should_silently_fail: false, }, capabilities, palette: client_attributes.palette, diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index 734007ea..0abc7a5a 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -340,3 +340,7 @@ impl TerminalPane { self.grid.cursor_coordinates() } } + +#[cfg(test)] +#[path = "./unit/terminal_pane_tests.rs"] +mod grid_tests; diff --git a/zellij-server/src/panes/unit/grid_tests.rs b/zellij-server/src/panes/unit/grid_tests.rs index bce67e06..048d3d0a 100644 --- a/zellij-server/src/panes/unit/grid_tests.rs +++ b/zellij-server/src/panes/unit/grid_tests.rs @@ -555,3 +555,293 @@ fn wrap_wide_characters_at_the_end_of_the_line() { } assert_snapshot!(format!("{:?}", grid)); } + +/* + * These tests below are general compatibility tests for non-trivial scenarios running in the terminal. + * They use fake TTY input replicated from these scenarios. + * + */ + +#[test] +fn run_bandwhich_from_fish_shell() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "fish_and_bandwhich"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn fish_tab_completion_options() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "fish_tab_completion_options"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn fish_select_tab_completion_options() { + // the difference between this and the previous test is that here we press + // twice, meaning the selection moves between the options and the command line + // changes. + // this is not clearly seen in the snapshot because it does not include styles, + // but we can see the command line change and the cursor staying in place + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "fish_select_tab_completion_options"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn vim_scroll_region_down() { + // here we test a case where vim defines the scroll region as lesser than the screen row count + // and then scrolls down + // the region is defined here by vim as 1-26 (there are 28 rows) + // then the cursor is moved to line 26 and a new line is added + // what should happen is that the first line in the scroll region (1) is deleted + // and an empty line is inserted in the last scroll region line (26) + // this tests also has other steps afterwards that fills the line with the next line in the + // file + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "vim_scroll_region_down"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn vim_ctrl_d() { + // in vim ctrl-d moves down half a page + // in this case, it sends the terminal the csi 'M' directive, which tells it to delete X (13 in + // this case) lines inside the scroll region and push the other lines up + // what happens here is that 13 lines are deleted and instead 13 empty lines are added at the + // end of the scroll region + // vim makes sure to fill these empty lines with the rest of the file + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "vim_ctrl_d"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn vim_ctrl_u() { + // in vim ctrl-u moves up half a page + // in this case, it sends the terminal the csi 'L' directive, which tells it to insert X (13 in + // this case) lines at the cursor, pushing away (deleting) the last line in the scroll region + // this causes the effect of scrolling up X lines (vim replaces the lines with the ones in the + // file above the current content) + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "vim_ctrl_u"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn htop() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "htop"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn htop_scrolling() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "htop_scrolling"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn htop_right_scrolling() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "htop_right_scrolling"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn vim_overwrite() { + // this tests the vim overwrite message + // to recreate: + // * open a file in vim + // * open the same file in another window + // * change the file in the other window and save + // * change the file in the original vim window and save + // * confirm you would like to change the file by pressing 'y' and then ENTER + // * if everything looks fine, this test passed :) + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "vim_overwrite"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn clear_scroll_region() { + // this is actually a test of 1049h/l (alternative buffer) + // @imsnif - the name is a monument to the time I didn't fully understand this mechanism :) + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "clear_scroll_region"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn display_tab_characters_properly() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "tab_characters"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn neovim_insert_mode() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "nvim_insert"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn bash_cursor_linewrap() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 116, Palette::default()); + let fixture_name = "bash_cursor_linewrap"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn fish_paste_multiline() { + // here we paste a multiline command in fish shell, making sure we support it + // going up and changing the colors of our line-wrapped pasted text + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 149, Palette::default()); + let fixture_name = "fish_paste_multiline"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn git_log() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 149, Palette::default()); + let fixture_name = "git_log"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn git_diff_scrollup() { + // this tests makes sure that when we have a git diff that exceeds the screen size + // we are able to scroll up + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(28, 149, Palette::default()); + let fixture_name = "git_diff_scrollup"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn emacs_longbuf() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(60, 284, Palette::default()); + let fixture_name = "emacs_longbuf_tutorial"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn top_and_quit() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(56, 235, Palette::default()); + let fixture_name = "top_and_quit"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn exa_plus_omf_theme() { + // this tests that we handle a tab delimited table properly + // without overriding the previous content + // this is a potential bug because the \t character is a goto + // if we forwarded it as is to the terminal, we would be skipping + // over existing on-screen content without deleting it, so we must + // convert it to spaces + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(56, 235, Palette::default()); + let fixture_name = "exa_plus_omf_theme"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__bash_cursor_linewrap.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__bash_cursor_linewrap.snap new file mode 100644 index 00000000..93634316 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__bash_cursor_linewrap.snap @@ -0,0 +1,10 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Welcome to fish, the friendly interactive shell +01 (C): ⋊> ~/c/mosaic on main ⨯ bash 16:00:06 +02 (C): [aram@green mosaic]$ 12345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345 +03 (W): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__clear_scroll_region.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__clear_scroll_region.snap new file mode 100644 index 00000000..b53826df --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__clear_scroll_region.snap @@ -0,0 +1,9 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Welcome to fish, the friendly interactive shell +01 (C): ⋊> ~/c/mosaic on main ⨯ vim some-file 15:07:22 +02 (C): ⋊> ~/c/mosaic on main ⨯ 15:07:29 + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__display_tab_characters_properly.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__display_tab_characters_properly.snap new file mode 100644 index 00000000..48c75d6c --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__display_tab_characters_properly.snap @@ -0,0 +1,21 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): +01 (C): OS: 5.9.13-arch1-1 GNU/Linux +02 (C): Uptime: 10 hours, 42 minutes +03 (C): Hostname: kingdom +04 (C): Disk usage: +05 (C): +06 (C): df: /run/user/1000/doc: Operation not permitted +07 (C): / 321G / 514G 66% +08 (C): /efi 27M / 96M 28% +09 (C): +10 (C): Network: +11 (C): +12 (C): wlp2s0 192.168.0.3 +13 (C): +14 (C): [I] [20:07] kingdom:mosaic (main) | + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__emacs_longbuf.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__emacs_longbuf.snap new file mode 100644 index 00000000..5c08c323 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__emacs_longbuf.snap @@ -0,0 +1,10 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): ➜ mosaic git:(mosaic#130) emacs +01 (C): ➜ mosaic git:(mosaic#130) emacs -nw +02 (C): ➜ mosaic git:(mosaic#130) exit +03 (C): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__exa_plus_omf_theme.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__exa_plus_omf_theme.snap new file mode 100644 index 00000000..eba80043 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__exa_plus_omf_theme.snap @@ -0,0 +1,62 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): .rw-r--r-- 3.3k aram 11 Jan 16:09 CODE_OF_CONDUCT.md +01 (C): .rw-r--r-- 3.5k aram 17 Feb 16:06 CONTRIBUTING.md +02 (C): drwxr-xr-x - aram 10 Feb 11:53 default-tiles +03 (C): drwxr-xr-x - aram 10 Feb 11:53 docs +04 (C): .rw-r--r-- 2.1k aram 10 Feb 11:53 GOVERNANCE.md +05 (C): .rw-r--r-- 1.1k aram 10 Feb 11:53 LICENSE.md +06 (C): .rw-r--r-- 4.7k aram 17 Feb 16:06 README.md +07 (C): drwxr-xr-x - aram 17 Feb 16:06 src +08 (C): drwxr-xr-x - aram 17 Feb 16:08 target +09 (C): drwxr-xr-x - aram 17 Feb 16:06 zellij-tile +10 (C): ⋊> ~/c/zellij on main ⨯ ll 10:27:45 +11 (C): Permissions Size User Date Modified Name +12 (C): drwxr-xr-x - aram 11 Feb 14:04 assets +13 (C): .rwxr-xr-x 596 aram 17 Feb 16:06 build-all.sh +14 (C): .rw-r--r-- 1.4k aram 17 Feb 16:06 build.rs +15 (C): .rw-r--r-- 56k aram 17 Feb 16:07 Cargo.lock +16 (C): .rw-r--r-- 2.1k aram 17 Feb 16:06 Cargo.toml +17 (C): .rw-r--r-- 3.3k aram 11 Jan 16:09 CODE_OF_CONDUCT.md +18 (C): .rw-r--r-- 3.5k aram 17 Feb 16:06 CONTRIBUTING.md +19 (C): drwxr-xr-x - aram 10 Feb 11:53 default-tiles +20 (C): drwxr-xr-x - aram 10 Feb 11:53 docs +21 (C): .rw-r--r-- 2.1k aram 10 Feb 11:53 GOVERNANCE.md +22 (C): .rw-r--r-- 1.1k aram 10 Feb 11:53 LICENSE.md +23 (C): .rw-r--r-- 4.7k aram 17 Feb 16:06 README.md +24 (C): drwxr-xr-x - aram 17 Feb 16:06 src +25 (C): drwxr-xr-x - aram 17 Feb 16:08 target +26 (C): drwxr-xr-x - aram 17 Feb 16:06 zellij-tile +27 (C): ⋊> ~/c/zellij on main ⨯ omf theme 10:27:45 +28 (C): Installed: +29 (C): agnoster chain default plain +30 (C): +31 (C): Available: +32 (C): agnoster eden lavender scorphish +33 (C): aight emoji-powerline lolfish separation +34 (C): ays es mars shellder +35 (C): batman fishbone mish simple-ass-prompt +36 (C): beloglazov fishface mokou simplevi +37 (C): bira fishy-drupal mtahmed slavic-cat +38 (C): bobthefish fisk nai spacefish +39 (C): bongnoster fox nelsonjchen sushi +40 (C): boxfish gentoo neolambda syl20bnr +41 (C): budspencer gianu numist taktoa +42 (C): cbjohnson gitstatus ocean technopagan +43 (C): chain gnuykeaj one toaster +44 (C): clearance godfather pastfish tomita +45 (C): cmorrell graystatus perryh trout +46 (C): coffeeandcode harleen plain tweetjay +47 (C): cor idan pure uggedal +48 (C): cyan integral pygmalion will +49 (C): dangerous jacaetevha random wolf-theme +50 (C): default johanson randomrussel yimmy +51 (C): dmorrell kawasaki redfish zeit +52 (C): doughsay krisleech red-snapper zephyr +53 (C): eclm l robbyrussell zish +54 (C): edan lambda sashimi +55 (C): ⋊> ~/c/zellij on main ⨯ 10:27:46 + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_paste_multiline.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_paste_multiline.snap new file mode 100644 index 00000000..faf24017 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_paste_multiline.snap @@ -0,0 +1,27 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): +01 (C): OS: 5.9.14-arch1-1 GNU/Linux +02 (C): Uptime: 12 hours, 21 minutes +03 (C): Hostname: kingdom +04 (C): Disk usage: +05 (C): +06 (C): df: /run/user/1000/doc: Operation not permitted +07 (C): / 295G / 514G 61% +08 (C): /efi 27M / 96M 28% +09 (C): +10 (C): Network: +11 (C): +12 (C): wlp2s0 192.168.0.3 +13 (C): +14 (C): [I] [21:58] kingdom:mosaic (main) | echo -ne (\ +15 (C): df -l -h | grep -E 'dev/(xvda|sd|mapper)' | \ +16 (C): awk '{printf "\\\\t%s\\\\t%4s / %4s %s\\\\n\n", $6, $3, $2, $5}' | \ +17 (C): sed -e 's/^\(.*\([8][5-9]\|[9][0-9]\)%.*\)$/\\\\e[0;31m\1\\\\e[0m/' -e 's/^\(.*\([7][5-9]\|[8][0-4]\)%.*\ +18 (W): )$/\\\\e[0;33m\1\\\\e[0m/' | \ +19 (C): paste -sd ''\ +20 (C): ) + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_select_tab_completion_options.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_select_tab_completion_options.snap new file mode 100644 index 00000000..88addebb --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_select_tab_completion_options.snap @@ -0,0 +1,11 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Welcome to fish, the friendly interactive shell +01 (C): ⋊> ~/c/mosaic on main ⨯ sudo badblocks 11:32:23 +02 (C): badblocks (Executable, 33kB) base64 (Executable, 42kB) bash (Executable, 906kB) +03 (C): bandwhich (Executable, 3.0MB) basename (Executable, 38kB) bashbug (Executable, 6.8kB) +04 (C): base32 (Executable, 42kB) basenc (Executable, 50kB) bass + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_tab_completion_options.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_tab_completion_options.snap new file mode 100644 index 00000000..a093e708 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_tab_completion_options.snap @@ -0,0 +1,11 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Welcome to fish, the friendly interactive shell +01 (C): ⋊> ~/c/mosaic on main ⨯ sudo bandwhich 11:18:26 +02 (C): badblocks (Executable, 33kB) base64 (Executable, 42kB) bash (Executable, 906kB) +03 (C): bandwhich (Executable, 3.0MB) basename (Executable, 38kB) bashbug (Executable, 6.8kB) +04 (C): base32 (Executable, 42kB) basenc (Executable, 50kB) bass + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_diff_scrollup.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_diff_scrollup.snap new file mode 100644 index 00000000..e4c5e29f --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_diff_scrollup.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (W): +01 (W): src/terminal_pane/scroll.rs +02 (W): ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +03 (C): +04 (C): ────────────────────────────────────────────────┐ +05 (C): use crate::terminal_pane::terminal_character::{ │ +06 (C): ────────────────────────────────────────────────┘ +07 (C): 5 +08 (C): CharacterStyles, TerminalCharacter, EMPTY_TERMINAL_CHARACTER, +09 (C): }; +10 (C): +11 (C): use crate::utils::logging::debug_log_to_file; +12 (C): +13 (C): /* +14 (C): * Scroll +15 (C): * +16 (C): +17 (C): ──────────────┐ +18 (C): impl Scroll { │ +19 (C): ──────────────┘ +20 (C): 663 +21 (C): pub fn move_current_buffer_to_alternative_buffer(&mut self) { +22 (C): self.alternative_buffer = Some(self.canonical_lines.drain(..).collect()); +23 (C): self.alternative_cursor_position = Some(self.cursor_position); +24 (C): self.cursor_position.reset(); +25 (C): self.clear_all(); +26 (C): } +27 (C): : + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_log.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_log.snap new file mode 100644 index 00000000..6f0225ba --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__git_log.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): +01 (C): * wip: doesn't render when new tab is created? +02 (C): +03 (C): * wip: doesnt re-render when a new tab is spawned for now +04 (C): +05 (C): * wip: tabs now are a BTreeMap and we can switch between them in both directions +06 (C): +07 (C): * wip: I think that should also be here +08 (C): +09 (C): * wip: cleanup +10 (C): +11 (C): * Spawn a new terminal simultaneously with a new tab +12 (C): +13 (C): * Ensure proper Opening and Closing of tabs +14 (C): +15 (C): * cleanup +16 (C): +17 (C): * more cleanup +18 (C): +19 (C): * tests(snapshots): add 'loading' snapshot to each scenario +20 (C): +21 (C): * fix(tests): update snapshots +22 (C): +23 (C): * Add tests for tabs implementation +24 (C): +25 (C): * wip: added tests, moved tab related stuff to a separate file +26 (C): +27 (C): : + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop.snap new file mode 100644 index 00000000..a692b163 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): +01 (C): 1 [||||| 10.1%] Tasks: 73, 413 thr; 1 running +02 (C): 2 [||||||| 13.5%] Load average: 1.03 1.07 1.30 +03 (C): 3 [|||||| 10.8%] Uptime: 22:41:15 +04 (C): 4 [|||||| 10.6%] +05 (C): Mem[|||||||||||||||||||||||||||||||||||||3.28G/15.3G] +06 (C): Swp[ 0K/16.0G] +07 (C): +08 (C): PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command +09 (C): 1352 aram 20 0 3776M 581M 238M S 8.7 3.7 2h01:10 /usr/lib/firefox/firefox +10 (C): 98777 aram 20 0 537M 6184 4240 S 8.1 0.0 0:00.80 target/debug/mosaic --debug +11 (C): 1669 aram 20 0 2944M 318M 130M S 8.1 2.0 1h01:33 /usr/lib/firefox/firefox -contentproc -childID 6 -i +12 (C): 826 aram 9 -11 1581M 15092 11244 S 6.1 0.1 42:21.83 /usr/bin/pulseaudio --daemonize=no +13 (C): 9419 aram 20 0 533M 7392 3344 S 4.7 0.0 22:01.92 /usr/local/bin/mosaic --max-panes 4 +14 (C): 98913 aram 20 0 537M 6184 4240 S 3.4 0.0 0:00.31 target/debug/mosaic --debug +15 (C): 1505 aram 20 0 3187M 329M 206M S 3.4 2.1 23:35.90 /usr/lib/firefox/firefox -contentproc -childID 2 -i +16 (C): 98912 aram 20 0 537M 6184 4240 S 2.7 0.0 0:00.22 target/debug/mosaic --debug +17 (C): 1164 aram -6 0 1581M 15092 11244 S 2.7 0.1 21:39.80 /usr/bin/pulseaudio --daemonize=no +18 (C): 1247 aram 20 0 1184M 292M 84828 S 2.7 1.9 38:01.54 /usr/lib/Xorg -nolisten tcp :0 vt1 -keeptty -auth / +19 (C): 1475 aram -11 0 3776M 581M 238M S 2.0 3.7 14:27.94 /usr/lib/firefox/firefox +20 (C): 8574 aram 20 0 2944M 318M 130M S 2.0 2.0 14:36.50 /usr/lib/firefox/firefox -contentproc -childID 6 -i +21 (C): 1364 aram 20 0 3776M 581M 238M S 2.0 3.7 18:01.89 /usr/lib/firefox/firefox +22 (C): 1870 aram 20 0 3776M 581M 238M S 2.0 3.7 13:27.06 /usr/lib/firefox/firefox +23 (C): 9427 aram 20 0 533M 7392 3344 S 2.0 0.0 6:53.47 /usr/local/bin/mosaic --max-panes 4 +24 (C): 98905 aram 20 0 537M 6184 4240 S 2.0 0.0 0:00.17 target/debug/mosaic --debug +25 (C): 99272 aram 20 0 8456 4348 3320 R 1.3 0.0 0:00.13 htop +26 (C): 8611 aram 20 0 2944M 318M 130M S 1.3 2.0 8:17.90 /usr/lib/firefox/firefox -contentproc -childID 6 -i +27 (C): F1Help F2Setup F3SearchF4FilterF5Tree F6SortByF7Nice -F8Nice +F9Kill F10Quit + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_right_scrolling.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_right_scrolling.snap new file mode 100644 index 00000000..aca29e3e --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_right_scrolling.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): +01 (C): 1 [|||||||||| 16.9%] Tasks: 110, 512 thr; 1 running +02 (C): 2 [|||||||||| 17.1%] Load average: 1.04 1.30 1.29 +03 (C): 3 [||||||| 13.9%] Uptime: 6 days, 07:01:39 +04 (C): 4 [||||||||| 14.9%] +05 (C): Mem[|||||||||||||||||||||||||||||||||||||8.80G/15.3G] +06 (C): Swp[| 2.82M/16.0G] +07 (C): +08 (C): PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command +09 (C): 20 0 8576 4508 3356 R 1.3 0.0 0:00.11 htop +10 (C): 20 0 171M 10868 7804 S 0.0 0.1 2:08.38 /sbin/init +11 (C): 20 0 107M 29364 28092 S 0.0 0.2 0:03.42 /usr/lib/systemd/systemd-journald +12 (C): 20 0 32648 9568 6616 S 0.0 0.1 0:01.87 /usr/lib/systemd/systemd-udevd +13 (C): 20 0 78060 992 856 S 0.0 0.0 0:00.00 /usr/bin/lvmetad -f +14 (C): 20 0 6952 4356 3492 S 0.0 0.0 0:57.67 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidf +15 (C): 20 0 14824 7552 5984 S 0.0 0.0 0:12.93 /usr/bin/connmand -n --nodnsproxy +16 (C): 20 0 17696 7940 6696 S 0.0 0.0 0:01.25 /usr/lib/systemd/systemd-logind +17 (C): 20 0 1635M 56148 20460 S 0.0 0.3 1:27.24 /usr/bin/dockerd -H fd:// +18 (C): 20 0 1635M 56148 20460 S 0.0 0.3 0:38.37 /usr/bin/dockerd -H fd:// +19 (C): 20 0 1635M 56148 20460 S 0.0 0.3 0:00.01 /usr/bin/dockerd -H fd:// +20 (C): 20 0 1635M 56148 20460 S 0.0 0.3 0:00.00 /usr/bin/dockerd -H fd:// +21 (C): 20 0 1635M 56148 20460 S 0.0 0.3 0:00.00 /usr/bin/dockerd -H fd:// +22 (C): 20 0 1635M 56148 20460 S 0.0 0.3 0:00.00 /usr/bin/dockerd -H fd:// +23 (C): 20 0 1635M 56148 20460 S 0.0 0.3 1:47.55 /usr/bin/dockerd -H fd:// +24 (C): 20 0 1635M 56148 20460 S 0.0 0.3 1:26.19 /usr/bin/dockerd -H fd:// +25 (C): 20 0 1635M 56148 20460 S 0.0 0.3 1:40.77 /usr/bin/dockerd -H fd:// +26 (C): 20 0 1635M 56148 20460 S 0.0 0.3 1:47.26 /usr/bin/dockerd -H fd:// +27 (C): F1Help F2Setup F3SearchF4FilterF5Tree F6SortByF7Nice -F8Nice +F9Kill F10Quit + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_scrolling.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_scrolling.snap new file mode 100644 index 00000000..5f6c323d --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__htop_scrolling.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): +01 (C): 1 [||||||||||||||||||||||||||||||||||||||||||100.0%] Tasks: 79, 382 thr; 1 running +02 (C): 2 [ 0.0%] Load average: 1.40 1.43 1.38 +03 (C): 3 [ 0.0%] Uptime: 2 days, 07:33:50 +04 (C): 4 [ 0.0%] +05 (C): Mem[|||||||||||||||||||||||||||||||||||||3.64G/15.3G] +06 (C): Swp[ 0K/16.0G] +07 (C): +08 (C): PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command +09 (W): 123934 aram 20 0 8444 4384 3364 R 66.7 0.0 0:00.05 htop --delay=100000000000 +10 (C): 1 root 20 0 171M 11616 8608 S 0.0 0.1 0:56.91 /sbin/init +11 (C): 268 root 20 0 93324 34340 33072 S 0.0 0.2 0:01.05 /usr/lib/systemd/systemd-journald +12 (C): 276 root 20 0 32648 10192 7240 S 0.0 0.1 0:01.13 /usr/lib/systemd/systemd-udevd +13 (C): 286 root 20 0 78060 1132 996 S 0.0 0.0 0:00.00 /usr/bin/lvmetad -f +14 (C): 343 dbus 20 0 6952 4384 3520 S 0.0 0.0 0:13.85 /usr/bin/dbus-daemon --system --address=systemd: -- +15 (C): 344 root 20 0 14588 7512 6176 S 0.0 0.0 0:03.21 /usr/bin/connmand -n --nodnsproxy +16 (C): 345 root 20 0 17696 8372 7128 S 0.0 0.1 0:00.67 /usr/lib/systemd/systemd-logind +17 (C): 395 root 20 0 1635M 83324 44976 S 0.0 0.5 0:32.43 /usr/bin/dockerd -H fd:// +18 (C): 396 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.01 /usr/bin/dockerd -H fd:// +19 (C): 397 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.01 /usr/bin/dockerd -H fd:// +20 (C): 398 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.00 /usr/bin/dockerd -H fd:// +21 (C): 399 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.00 /usr/bin/dockerd -H fd:// +22 (C): 412 root 20 0 1635M 83324 44976 S 0.0 0.5 0:00.00 /usr/bin/dockerd -H fd:// +23 (C): 441 root 20 0 1635M 83324 44976 S 0.0 0.5 0:41.35 /usr/bin/dockerd -H fd:// +24 (C): 442 root 20 0 1635M 83324 44976 S 0.0 0.5 0:33.61 /usr/bin/dockerd -H fd:// +25 (C): 444 root 20 0 1635M 83324 44976 S 0.0 0.5 0:33.13 /usr/bin/dockerd -H fd:// +26 (C): 449 root 20 0 1635M 83324 44976 S 0.0 0.5 0:41.39 /usr/bin/dockerd -H fd:// +27 (C): F1Help F2Setup F3SearchF4FilterF5Tree F6SortByF7Nice -F8Nice +F9Kill F10Quit + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__neovim_insert_mode.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__neovim_insert_mode.snap new file mode 100644 index 00000000..9c2536d4 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__neovim_insert_mode.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): line 1 +01 (C): line 2 +02 (C): line 3 +03 (C): line 4 +04 (C): line 5 +05 (C): line 6 +06 (C): line 7 +07 (C): line 8 +08 (C): line 9 +09 (C): line 10 +10 (C): line 11 +11 (C): line 12 +12 (C): line 13 +13 (C): line 14 +14 (C): line 15 +15 (C): line 16 +16 (C): line 17 +17 (C): line 18 +18 (C): line 19 +19 (C): line 20 +20 (C): line 21 +21 (C): line 22 +22 (C): line 23 +23 (C): line 24 +24 (C): line 25 +25 (C): line 26 +26 (C): some-file 10,1 Top +27 (C): -- INSERT -- + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__run_bandwhich_from_fish_shell.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__run_bandwhich_from_fish_shell.snap new file mode 100644 index 00000000..257fd889 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__run_bandwhich_from_fish_shell.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Total Up / Down: 46Bps / 57Bps +01 (C): ┌Utilization by process name───────────────────────────────────────────────────────────────────────────────────────┐ +02 (C): │Process Connections Up / Down │ +03 (C): │ │ +04 (C): │firefox 3 46Bps / 57Bps │ +05 (C): │ │ +06 (C): │ │ +07 (C): │ │ +08 (C): │ │ +09 (C): │ │ +10 (C): │ │ +11 (C): │ │ +12 (C): │ │ +13 (C): │ │ +14 (C): │ │ +15 (C): │ │ +16 (C): │ │ +17 (C): │ │ +18 (C): │ │ +19 (C): │ │ +20 (C): │ │ +21 (C): │ │ +22 (C): │ │ +23 (C): │ │ +24 (C): │ │ +25 (C): │ │ +26 (C): └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +27 (C): Press to pause. Use to rearrange tables. (DNS queries hidden). + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__top_and_quit.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__top_and_quit.snap new file mode 100644 index 00000000..250e5b45 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__top_and_quit.snap @@ -0,0 +1,62 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): Tasks: 158 total, 1 running, 157 sleeping, 0 stopped, 0 zombie +01 (C): %Cpu(s): 24.2 us, 1.6 sy, 0.0 ni, 74.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st +02 (C): MiB Mem : 15715.1 total, 7001.4 free, 2163.7 used, 6549.9 buff/cache +03 (C): MiB Swap: 16384.0 total, 16384.0 free, 0.0 used. 12809.8 avail Mem +04 (C): +05 (C): PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +06 (C): 15838 aram 20 0 7275240 56912 18964 S 73.3 0.4 0:17.79 zellij +07 (C): 12653 aram 20 0 39032 22164 14372 S 20.0 0.1 0:00.63 urxvt +08 (C): 1477 aram 20 0 3178660 301992 203236 S 6.7 1.9 3:49.82 Web Content +09 (C): 1 root 20 0 175360 11532 8596 S 0.0 0.1 0:05.90 systemd +10 (C): 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd +11 (C): 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp +12 (C): 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp +13 (C): 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd +14 (C): 8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq +15 (C): 9 root 20 0 0 0 0 S 0.0 0.0 0:01.24 ksoftirqd/0 +16 (C): 10 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/0 +17 (C): 11 root -2 0 0 0 0 I 0.0 0.0 0:06.12 rcu_preempt +18 (C): 12 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcub/0 +19 (C): 13 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/0 +20 (C): 14 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/0 +21 (C): 16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 +22 (C): 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 +23 (C): 18 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/1 +24 (C): 19 root rt 0 0 0 0 S 0.0 0.0 0:00.35 migration/1 +25 (C): 20 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/1 +26 (C): 21 root 20 0 0 0 0 S 0.0 0.0 0:00.49 ksoftirqd/1 +27 (C): 23 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-kblockd +28 (C): 24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/2 +29 (C): 25 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/2 +30 (C): 26 root rt 0 0 0 0 S 0.0 0.0 0:00.39 migration/2 +31 (C): 27 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/2 +32 (C): 28 root 20 0 0 0 0 S 0.0 0.0 0:00.99 ksoftirqd/2 +33 (C): 30 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/2:0H-kblockd +34 (C): 31 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/3 +35 (C): 32 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/3 +36 (C): 33 root rt 0 0 0 0 S 0.0 0.0 0:00.43 migration/3 +37 (C): 34 root -2 0 0 0 0 S 0.0 0.0 0:00.00 rcuc/3 +38 (C): 35 root 20 0 0 0 0 S 0.0 0.0 0:00.90 ksoftirqd/3 +39 (C): 37 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/3:0H-kblockd +40 (C): 38 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs +41 (C): 39 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns +42 (C): 40 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_kthre +43 (C): 41 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kauditd +44 (C): 44 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd +45 (C): 45 root 20 0 0 0 0 S 0.0 0.0 0:00.00 oom_reaper +46 (C): 46 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 writeback +47 (C): 47 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kcompactd0 +48 (C): 48 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd +49 (C): 49 root 39 19 0 0 0 S 0.0 0.0 0:00.00 khugepaged +50 (C): 137 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kintegrityd +51 (C): 138 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kblockd +52 (C): 139 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 blkcg_punt_bio +53 (C): 140 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 ata_sff +54 (C): 141 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 edac-poller +55 (C): ⋊> ~/c/zellij on fix-top ⨯ 13:00:53 + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_d.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_d.snap new file mode 100644 index 00000000..e9b83504 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_d.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): 3 line14 +01 (C): 2 line15 +02 (C): 1 line16 +03 (C): 17 line17 +04 (C): 1 line18 +05 (C): 2 line19 +06 (C): 3 line20 +07 (C): 4 line21 +08 (C): 5 line22 +09 (C): 6 line23 +10 (C): 7 line24 +11 (C): 8 line25 +12 (C): 9 line26 +13 (C): 10 line27 +14 (C): 11 line28 +15 (C): 12 line29 +16 (C): 13 line30 +17 (C): 14 line31 +18 (C): 15 line32 +19 (C): 16 line33 +20 (C): 17 line34 +21 (C): 18 line35 +22 (C): 19 line36 +23 (C): 20 line37 +24 (C): 21 line38 +25 (C): 22 line39 +26 (C): NORMAL testfile.rs unix | utf-8 | rust 40% 17:1 +27 (C): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_u.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_u.snap new file mode 100644 index 00000000..f886a2eb --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_ctrl_u.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): 22 line4 +01 (C): 21 line5 +02 (C): 20 line6 +03 (C): 19 line7 +04 (C): 18 line8 +05 (C): 17 line9 +06 (C): 16 line10 +07 (C): 15 line11 +08 (C): 14 line12 +09 (C): 13 line13 +10 (C): 12 line14 +11 (C): 11 line15 +12 (C): 10 line16 +13 (C): 9 line17 +14 (C): 8 line18 +15 (C): 7 line19 +16 (C): 6 line20 +17 (C): 5 line21 +18 (C): 4 line22 +19 (C): 3 line23 +20 (C): 2 line24 +21 (C): 1 line25 +22 (C): 26 line26 +23 (C): 1 line27 +24 (C): 2 line28 +25 (C): 3 line29 +26 (C): NORMAL testfile.rs unix | utf-8 | rust 61% 26:1 +27 (C): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_overwrite.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_overwrite.snap new file mode 100644 index 00000000..f8066d6a --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_overwrite.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): 1 +01 (C): 1 line 1 +02 (C): 2 line 2 +03 (C): 3 line 3 +04 (C): 4 line 4 +05 (C): 5 line 5 +06 (C): 6 line 6 +07 (C): 7 line 7 +08 (C): 8 line 8 +09 (C): 9 line 9 +10 (C): 10 line 10 +11 (C): 11 line 11 +12 (C): 12 line 12 +13 (C): 13 line 13 +14 (C): 14 line 14 +15 (C): 15 line 15 +16 (C): 16 line 16 +17 (C): 17 line 17 +18 (C): 18 line 18 +19 (C): 19 line 19 +20 (C): 20 line 20 +21 (C): 21 line 21 +22 (C): 22 line 22 +23 (C): 23 line 23 +24 (C): 24 line 24 +25 (C): 25 line 25 +26 (C): NORMAL some-file unix | utf-8 | no ft 1% 1:1 +27 (C): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_scroll_region_down.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_scroll_region_down.snap new file mode 100644 index 00000000..17a18220 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vim_scroll_region_down.snap @@ -0,0 +1,34 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): 22 line2 +01 (C): 21 line3 +02 (C): 20 line4 +03 (C): 19 line5 +04 (C): 18 line6 +05 (C): 17 line7 +06 (C): 16 line8 +07 (C): 15 line9 +08 (C): 14 line10 +09 (C): 13 line11 +10 (C): 12 line12 +11 (C): 11 line13 +12 (C): 10 line14 +13 (C): 9 line15 +14 (C): 8 line16 +15 (C): 7 line17 +16 (C): 6 line18 +17 (C): 5 line19 +18 (C): 4 line20 +19 (C): 3 line21 +20 (C): 2 line22 +21 (C): 1 line23 +22 (C): 24 line24 +23 (C): 1 line25 +24 (C): 2 line26 +25 (C): 3 line27 +26 (C): NORMAL testfile.rs unix | utf-8 | rust 57% 24:1 +27 (C): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-2.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-2.snap new file mode 100644 index 00000000..cd74ae8f --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-2.snap @@ -0,0 +1,26 @@ +--- +source: zellij-server/src/panes/./unit/terminal_pane_tests.rs +expression: "format!(\"{:?}\", terminal_pane . grid)" + +--- +00 (C): line 5 +01 (C): line 6 +02 (C): line 7 +03 (C): line 8 +04 (C): line 9 +05 (C): line 10 +06 (C): line 11 +07 (C): line 12 +08 (C): line 13 +09 (C): line 14 +10 (C): line 15 +11 (C): line 16 +12 (C): line 17 +13 (C): line 18 +14 (C): line 19 +15 (C): line 20 +16 (C): line 21 +17 (C): line 22 +18 (C): line 23 +19 (C): line 24 + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-3.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-3.snap new file mode 100644 index 00000000..4c1776c0 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane-3.snap @@ -0,0 +1,26 @@ +--- +source: zellij-server/src/panes/./unit/terminal_pane_tests.rs +expression: "format!(\"{:?}\", terminal_pane . grid)" + +--- +00 (C): line 12 +01 (C): line 13 +02 (C): line 14 +03 (C): line 15 +04 (C): line 16 +05 (C): line 17 +06 (C): line 18 +07 (C): line 19 +08 (C): line 20 +09 (C): line 21 +10 (C): line 22 +11 (C): line 23 +12 (C): line 24 +13 (C): line 25 +14 (C): line 26 +15 (C): line 27 +16 (C): line 28 +17 (C): line 29 +18 (C): line 30 +19 (C): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane.snap new file mode 100644 index 00000000..0d852f68 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__terminal_pane__grid_tests__scrolling_inside_a_pane.snap @@ -0,0 +1,26 @@ +--- +source: zellij-server/src/panes/./unit/terminal_pane_tests.rs +expression: "format!(\"{:?}\", terminal_pane . grid)" + +--- +00 (C): line 2 +01 (C): line 3 +02 (C): line 4 +03 (C): line 5 +04 (C): line 6 +05 (C): line 7 +06 (C): line 8 +07 (C): line 9 +08 (C): line 10 +09 (C): line 11 +10 (C): line 12 +11 (C): line 13 +12 (C): line 14 +13 (C): line 15 +14 (C): line 16 +15 (C): line 17 +16 (C): line 18 +17 (C): line 19 +18 (C): line 20 +19 (C): line 21 + diff --git a/zellij-server/src/panes/unit/terminal_pane_tests.rs b/zellij-server/src/panes/unit/terminal_pane_tests.rs new file mode 100644 index 00000000..f3abf91a --- /dev/null +++ b/zellij-server/src/panes/unit/terminal_pane_tests.rs @@ -0,0 +1,30 @@ +use super::super::TerminalPane; +use crate::tab::Pane; +use ::insta::assert_snapshot; +use zellij_utils::pane_size::PositionAndSize; +use zellij_utils::zellij_tile::data::Palette; + +#[test] +pub fn scrolling_inside_a_pane() { + let fake_win_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let pid = 1; + let palette = Palette::default(); + let mut terminal_pane = TerminalPane::new(pid, fake_win_size, palette); + let mut text_to_fill_pane = String::new(); + for i in 0..30 { + text_to_fill_pane.push_str(&format!("\rline {}\n", i + 1)); + } + terminal_pane.handle_pty_bytes(text_to_fill_pane.as_bytes().to_vec()); + terminal_pane.scroll_up(10); + assert_snapshot!(format!("{:?}", terminal_pane.grid)); + terminal_pane.scroll_down(3); + assert_snapshot!(format!("{:?}", terminal_pane.grid)); + terminal_pane.clear_scroll(); + assert_snapshot!(format!("{:?}", terminal_pane.grid)); +} diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 009a3a92..88fb7848 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -393,6 +393,16 @@ impl Screen { tab.mode_info = self.mode_info.clone(); } } + pub fn move_focus_left_or_previous_tab(&mut self) { + if !self.get_active_tab_mut().unwrap().move_focus_left() { + self.switch_tab_prev(); + } + } + pub fn move_focus_right_or_next_tab(&mut self) { + if !self.get_active_tab_mut().unwrap().move_focus_right() { + self.switch_tab_next(); + } + } } // The box is here in order to make the @@ -507,9 +517,7 @@ pub(crate) fn screen_thread_main( screen.get_active_tab_mut().unwrap().move_focus_left(); } ScreenInstruction::MoveFocusLeftOrPreviousTab => { - if !screen.get_active_tab_mut().unwrap().move_focus_left() { - screen.switch_tab_prev(); - } + screen.move_focus_left_or_previous_tab(); screen .bus .senders @@ -523,9 +531,7 @@ pub(crate) fn screen_thread_main( screen.get_active_tab_mut().unwrap().move_focus_right(); } ScreenInstruction::MoveFocusRightOrNextTab => { - if !screen.get_active_tab_mut().unwrap().move_focus_right() { - screen.switch_tab_next(); - } + screen.move_focus_right_or_next_tab(); screen .bus .senders @@ -674,3 +680,7 @@ pub(crate) fn screen_thread_main( } } } + +#[cfg(test)] +#[path = "./unit/screen_tests.rs"] +mod screen_tests; diff --git a/zellij-server/src/tab.rs b/zellij-server/src/tab.rs index fbcb5ada..523f65df 100644 --- a/zellij-server/src/tab.rs +++ b/zellij-server/src/tab.rs @@ -2272,3 +2272,7 @@ impl Tab { } } } + +#[cfg(test)] +#[path = "./unit/tab_tests.rs"] +mod tab_tests; diff --git a/zellij-server/src/thread_bus.rs b/zellij-server/src/thread_bus.rs index f7c1c1eb..c7262993 100644 --- a/zellij-server/src/thread_bus.rs +++ b/zellij-server/src/thread_bus.rs @@ -7,12 +7,15 @@ use crate::{ use zellij_utils::{channels, channels::SenderWithContext, errors::ErrorContext}; /// A container for senders to the different threads in zellij on the server side -#[derive(Clone)] +#[derive(Default, Clone)] pub(crate) struct ThreadSenders { pub to_screen: Option>, pub to_pty: Option>, pub to_plugin: Option>, pub to_server: Option>, + // this is a convenience for the unit tests + // it's not advisable to set it to true in production code + pub should_silently_fail: bool, } impl ThreadSenders { @@ -20,32 +23,75 @@ impl ThreadSenders { &self, instruction: ScreenInstruction, ) -> Result<(), channels::SendError<(ScreenInstruction, ErrorContext)>> { - self.to_screen.as_ref().unwrap().send(instruction) + if self.should_silently_fail { + let _ = self + .to_screen + .as_ref() + .map(|sender| sender.send(instruction)) + .unwrap_or_else(|| Ok(())); + Ok(()) + } else { + self.to_screen.as_ref().unwrap().send(instruction) + } } pub fn send_to_pty( &self, instruction: PtyInstruction, ) -> Result<(), channels::SendError<(PtyInstruction, ErrorContext)>> { - self.to_pty.as_ref().unwrap().send(instruction) + if self.should_silently_fail { + let _ = self + .to_pty + .as_ref() + .map(|sender| sender.send(instruction)) + .unwrap_or_else(|| Ok(())); + Ok(()) + } else { + self.to_pty.as_ref().unwrap().send(instruction) + } } pub fn send_to_plugin( &self, instruction: PluginInstruction, ) -> Result<(), channels::SendError<(PluginInstruction, ErrorContext)>> { - self.to_plugin.as_ref().unwrap().send(instruction) + if self.should_silently_fail { + let _ = self + .to_plugin + .as_ref() + .map(|sender| sender.send(instruction)) + .unwrap_or_else(|| Ok(())); + Ok(()) + } else { + self.to_plugin.as_ref().unwrap().send(instruction) + } } pub fn send_to_server( &self, instruction: ServerInstruction, ) -> Result<(), channels::SendError<(ServerInstruction, ErrorContext)>> { - self.to_server.as_ref().unwrap().send(instruction) + if self.should_silently_fail { + let _ = self + .to_server + .as_ref() + .map(|sender| sender.send(instruction)) + .unwrap_or_else(|| Ok(())); + Ok(()) + } else { + self.to_server.as_ref().unwrap().send(instruction) + } + } + #[allow(unused)] + pub fn silently_fail_on_send(mut self) -> Self { + // this is mostly used for the tests, see struct + self.should_silently_fail = true; + self } } /// A container for a receiver, OS input and the senders to a given thread +#[derive(Default)] pub(crate) struct Bus { receivers: Vec>, pub senders: ThreadSenders, @@ -68,10 +114,26 @@ impl Bus { to_pty: to_pty.cloned(), to_plugin: to_plugin.cloned(), to_server: to_server.cloned(), + should_silently_fail: false, }, os_input: os_input.clone(), } } + #[allow(unused)] + pub fn empty() -> Self { + // this is mostly used for the tests + Bus { + receivers: vec![], + senders: ThreadSenders { + to_screen: None, + to_pty: None, + to_plugin: None, + to_server: None, + should_silently_fail: true, + }, + os_input: None, + } + } pub fn recv(&self) -> Result<(T, ErrorContext), channels::RecvError> { let mut selector = channels::Select::new(); diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs new file mode 100644 index 00000000..da52c585 --- /dev/null +++ b/zellij-server/src/unit/screen_tests.rs @@ -0,0 +1,255 @@ +use super::{Screen, ScreenInstruction}; +use crate::zellij_tile::data::{InputMode, ModeInfo, Palette}; +use crate::{ + os_input_output::{AsyncReader, Pid, ServerOsApi}, + thread_bus::Bus, + SessionState, +}; +use std::sync::{Arc, RwLock}; +use zellij_utils::pane_size::PositionAndSize; + +use std::os::unix::io::RawFd; +use std::path::PathBuf; + +use zellij_utils::ipc::ClientAttributes; +use zellij_utils::nix; + +use zellij_utils::{ + errors::ErrorContext, + interprocess::local_socket::LocalSocketStream, + ipc::{ClientToServerMsg, ServerToClientMsg}, +}; + +#[derive(Clone)] +struct FakeInputOutput {} + +impl ServerOsApi for FakeInputOutput { + fn set_terminal_size_using_fd(&self, _fd: RawFd, _cols: u16, _rows: u16) { + // noop + } + fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { + unimplemented!() + } + fn read_from_tty_stdout(&self, _fd: RawFd, _buf: &mut [u8]) -> Result { + unimplemented!() + } + fn async_file_reader(&self, _fd: RawFd) -> Box { + unimplemented!() + } + fn write_to_tty_stdin(&self, _fd: RawFd, _buf: &[u8]) -> Result { + unimplemented!() + } + fn tcdrain(&self, _fd: RawFd) -> Result<(), nix::Error> { + unimplemented!() + } + fn box_clone(&self) -> Box { + Box::new((*self).clone()) + } + fn kill(&self, _pid: Pid) -> Result<(), nix::Error> { + unimplemented!() + } + fn recv_from_client(&self) -> (ClientToServerMsg, ErrorContext) { + unimplemented!() + } + fn send_to_client(&self, _msg: ServerToClientMsg) { + unimplemented!() + } + fn add_client_sender(&self) { + unimplemented!() + } + fn send_to_temp_client(&self, _msg: ServerToClientMsg) { + unimplemented!() + } + fn remove_client_sender(&self) { + unimplemented!() + } + fn update_receiver(&mut self, _stream: LocalSocketStream) { + unimplemented!() + } + fn load_palette(&self) -> Palette { + unimplemented!() + } +} + +fn create_new_screen(position_and_size: PositionAndSize) -> Screen { + let mut bus: Bus = Bus::empty(); + let fake_os_input = FakeInputOutput {}; + bus.os_input = Some(Box::new(fake_os_input)); + let mut client_attributes = ClientAttributes::default(); + client_attributes.position_and_size = position_and_size; + let max_panes = None; + let mode_info = ModeInfo::default(); + let input_mode = InputMode::Normal; + let session_state = Arc::new(RwLock::new(SessionState::Attached)); + Screen::new( + bus, + &client_attributes, + max_panes, + mode_info, + input_mode, + session_state, + ) +} + +#[test] +fn open_new_tab() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut screen = create_new_screen(position_and_size); + + screen.new_tab(1); + screen.new_tab(2); + + assert_eq!(screen.tabs.len(), 2, "Screen now has two tabs"); + assert_eq!( + screen.get_active_tab().unwrap().position, + 1, + "Active tab switched to new tab" + ); +} + +#[test] +pub fn switch_to_prev_tab() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut screen = create_new_screen(position_and_size); + + screen.new_tab(1); + screen.new_tab(2); + screen.switch_tab_prev(); + + assert_eq!( + screen.get_active_tab().unwrap().position, + 0, + "Active tab switched to previous tab" + ); +} + +#[test] +pub fn switch_to_next_tab() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut screen = create_new_screen(position_and_size); + + screen.new_tab(1); + screen.new_tab(2); + screen.switch_tab_prev(); + screen.switch_tab_next(); + + assert_eq!( + screen.get_active_tab().unwrap().position, + 1, + "Active tab switched to next tab" + ); +} + +#[test] +pub fn close_tab() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut screen = create_new_screen(position_and_size); + + screen.new_tab(1); + screen.new_tab(2); + screen.close_tab(); + + assert_eq!(screen.tabs.len(), 1, "Only one tab left"); + assert_eq!( + screen.get_active_tab().unwrap().position, + 0, + "Active tab switched to previous tab" + ); +} + +#[test] +pub fn close_the_middle_tab() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut screen = create_new_screen(position_and_size); + + screen.new_tab(1); + screen.new_tab(2); + screen.new_tab(3); + screen.switch_tab_prev(); + screen.close_tab(); + + assert_eq!(screen.tabs.len(), 2, "Two tabs left"); + assert_eq!( + screen.get_active_tab().unwrap().position, + 0, + "Active tab switched to previous tab" + ); +} + +#[test] +fn move_focus_left_at_left_screen_edge_changes_tab() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut screen = create_new_screen(position_and_size); + + screen.new_tab(1); + screen.new_tab(2); + screen.new_tab(3); + screen.switch_tab_prev(); + screen.move_focus_left_or_previous_tab(); + + assert_eq!( + screen.get_active_tab().unwrap().position, + 0, + "Active tab switched to previous" + ); +} + +#[test] +fn move_focus_right_at_right_screen_edge_changes_tab() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut screen = create_new_screen(position_and_size); + + screen.new_tab(1); + screen.new_tab(2); + screen.new_tab(3); + screen.switch_tab_prev(); + screen.move_focus_right_or_next_tab(); + + assert_eq!( + screen.get_active_tab().unwrap().position, + 2, + "Active tab switched to next" + ); +} diff --git a/zellij-server/src/unit/tab_tests.rs b/zellij-server/src/unit/tab_tests.rs new file mode 100644 index 00000000..87c3be71 --- /dev/null +++ b/zellij-server/src/unit/tab_tests.rs @@ -0,0 +1,11840 @@ +use super::Tab; +use crate::zellij_tile::data::{InputMode, ModeInfo, Palette}; +use crate::{ + os_input_output::{AsyncReader, Pid, ServerOsApi}, + panes::PaneId, + thread_bus::ThreadSenders, + SessionState, +}; +use std::sync::{Arc, RwLock}; +use zellij_utils::pane_size::PositionAndSize; + +use std::os::unix::io::RawFd; +use std::path::PathBuf; + +use zellij_utils::nix; + +use zellij_utils::{ + errors::ErrorContext, + interprocess::local_socket::LocalSocketStream, + ipc::{ClientToServerMsg, ServerToClientMsg}, +}; + +struct FakeInputOutput {} + +impl ServerOsApi for FakeInputOutput { + fn set_terminal_size_using_fd(&self, _fd: RawFd, _cols: u16, _rows: u16) { + // noop + } + fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { + unimplemented!() + } + fn read_from_tty_stdout(&self, _fd: RawFd, _buf: &mut [u8]) -> Result { + unimplemented!() + } + fn async_file_reader(&self, _fd: RawFd) -> Box { + unimplemented!() + } + fn write_to_tty_stdin(&self, _fd: RawFd, _buf: &[u8]) -> Result { + unimplemented!() + } + fn tcdrain(&self, _fd: RawFd) -> Result<(), nix::Error> { + unimplemented!() + } + fn box_clone(&self) -> Box { + unimplemented!() + } + fn kill(&self, _pid: Pid) -> Result<(), nix::Error> { + unimplemented!() + } + fn recv_from_client(&self) -> (ClientToServerMsg, ErrorContext) { + unimplemented!() + } + fn send_to_client(&self, _msg: ServerToClientMsg) { + unimplemented!() + } + fn add_client_sender(&self) { + unimplemented!() + } + fn send_to_temp_client(&self, _msg: ServerToClientMsg) { + unimplemented!() + } + fn remove_client_sender(&self) { + unimplemented!() + } + fn update_receiver(&mut self, _stream: LocalSocketStream) { + unimplemented!() + } + fn load_palette(&self) -> Palette { + unimplemented!() + } +} + +fn create_new_tab(position_and_size: PositionAndSize) -> 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 first_pane_id = Some(PaneId::Terminal(1)); + let mode_info = ModeInfo::default(); + let input_mode = InputMode::Normal; + let colors = Palette::default(); + let session_state = Arc::new(RwLock::new(SessionState::Attached)); + Tab::new( + index, + position, + name, + &position_and_size, + os_api, + senders, + max_panes, + first_pane_id, + mode_info, + input_mode, + colors, + session_state, + ) +} + +#[test] +fn split_panes_vertically() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.vertical_split(new_pane_id); + assert_eq!(tab.panes.len(), 2, "The tab has two panes"); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "first pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "first pane row count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 61, + "second pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "second pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "second pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "second pane row count" + ); +} + +#[test] +fn split_panes_horizontally() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.horizontal_split(new_pane_id); + assert_eq!(tab.panes.len(), 2, "The tab has two panes"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "first pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "first pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "second pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 11, + "second pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "second pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 9, + "second pane row count" + ); +} + +#[test] +fn split_largest_pane() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + for i in 2..5 { + let new_pane_id = PaneId::Terminal(i); + tab.new_pane(new_pane_id); + } + assert_eq!(tab.panes.len(), 4, "The tab has four panes"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "first pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "first pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 61, + "second pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "second pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "second pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 10, + "second pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "third pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "third pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "third pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "third pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "fourth pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 11, + "fourth pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "fourth pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 9, + "fourth pane row count" + ); +} + +#[test] +pub fn cannot_split_panes_vertically_when_active_terminal_is_too_small() { + let position_and_size = PositionAndSize { + cols: 8, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + assert_eq!(tab.panes.len(), 1, "Tab still has only one pane"); +} + +#[test] +pub fn cannot_split_panes_vertically_when_active_pane_is_too_small() { + let position_and_size = PositionAndSize { + cols: 8, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + assert_eq!(tab.panes.len(), 1, "Tab still has only one pane"); +} + +#[test] +pub fn cannot_split_panes_horizontally_when_active_pane_is_too_small() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 4, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + assert_eq!(tab.panes.len(), 1, "Tab still has only one pane"); +} + +#[test] +pub fn cannot_split_largest_pane_when_there_is_no_room() { + let position_and_size = PositionAndSize { + cols: 8, + rows: 4, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.new_pane(PaneId::Terminal(2)); + assert_eq!(tab.panes.len(), 1, "Tab still has only one pane"); +} + +#[test] +pub fn toggle_focused_pane_fullscreen() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + for i in 2..5 { + let new_pane_id = PaneId::Terminal(i); + tab.new_pane(new_pane_id); + } + tab.toggle_active_pane_fullscreen(); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().x(), + 0, + "Pane x is on screen edge" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().y(), + 0, + "Pane y is on screen edge" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().columns(), + 121, + "Pane cols match fullscreen cols" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().rows(), + 20, + "Pane rows match fullscreen rows" + ); + tab.toggle_active_pane_fullscreen(); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().x(), + 61, + "Pane x is on screen edge" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().y(), + 11, + "Pane y is on screen edge" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().columns(), + 60, + "Pane cols match fullscreen cols" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().rows(), + 9, + "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] +pub fn move_focus_is_disabled_in_fullscreen() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + for i in 2..5 { + let new_pane_id = PaneId::Terminal(i); + tab.new_pane(new_pane_id); + } + tab.toggle_active_pane_fullscreen(); + tab.move_focus_left(); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().x(), + 0, + "Pane x is on screen edge" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().y(), + 0, + "Pane y is on screen edge" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().columns(), + 121, + "Pane cols match fullscreen cols" + ); + assert_eq!( + tab.panes.get(&PaneId::Terminal(4)).unwrap().rows(), + 20, + "Pane rows match fullscreen rows" + ); +} + +#[test] +pub fn close_pane_with_another_pane_above_it() { + // ┌───────────┐ ┌───────────┐ + // │xxxxxxxxxxx│ │xxxxxxxxxxx│ + // │xxxxxxxxxxx│ │xxxxxxxxxxx│ + // ├───────────┤ ==close==> │xxxxxxxxxxx│ + // │███████████│ │xxxxxxxxxxx│ + // │███████████│ │xxxxxxxxxxx│ + // └───────────┘ └───────────┘ + // █ == pane being closed + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.horizontal_split(new_pane_id); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 1, "One pane left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.horizontal_split(new_pane_id); + tab.move_focus_up(); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 1, "One pane left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.vertical_split(new_pane_id); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 1, "One pane left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.vertical_split(new_pane_id); + tab.move_focus_left(); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 1, "One pane left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id_1 = PaneId::Terminal(2); + let new_pane_id_2 = PaneId::Terminal(3); + tab.horizontal_split(new_pane_id_1); + tab.move_focus_up(); + tab.vertical_split(new_pane_id_2); + tab.move_focus_down(); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 2, "Two panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id_1 = PaneId::Terminal(2); + let new_pane_id_2 = PaneId::Terminal(3); + tab.horizontal_split(new_pane_id_1); + tab.vertical_split(new_pane_id_2); + tab.move_focus_up(); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 2, "Two panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id_1 = PaneId::Terminal(2); + let new_pane_id_2 = PaneId::Terminal(3); + tab.vertical_split(new_pane_id_1); + tab.move_focus_left(); + tab.horizontal_split(new_pane_id_2); + tab.move_focus_right(); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 2, "Two panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 121, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id_1 = PaneId::Terminal(2); + let new_pane_id_2 = PaneId::Terminal(3); + tab.vertical_split(new_pane_id_1); + tab.horizontal_split(new_pane_id_2); + tab.move_focus_left(); + tab.close_focused_pane(); + assert_eq!(tab.panes.len(), 2, "Two panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 10, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 121, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.vertical_split(new_pane_id_2); + tab.move_focus_left(); + tab.move_focus_left(); + tab.horizontal_split(new_pane_id_3); + tab.move_focus_right(); + tab.horizontal_split(new_pane_id_4); + tab.move_focus_right(); + tab.horizontal_split(new_pane_id_5); + tab.move_focus_left(); + tab.move_focus_up(); + tab.resize_down(); + tab.vertical_split(new_pane_id_6); + tab.move_focus_down(); + tab.close_focused_pane(); + + assert_eq!(tab.panes.len(), 6, "Six panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 61, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 15, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "second remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 92, + "third remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "third remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 29, + "third remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 10, + "third remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 0, + "fourth remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 11, + "fourth remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "fourth remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 9, + "fourth remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "sixths remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 11, + "sixths remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "sixths remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 9, + "sixths remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 77, + "seventh remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 0, + "seventh remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 14, + "seventh remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.vertical_split(new_pane_id_2); + tab.move_focus_left(); + tab.move_focus_left(); + tab.horizontal_split(new_pane_id_3); + tab.move_focus_right(); + tab.horizontal_split(new_pane_id_4); + tab.move_focus_right(); + tab.horizontal_split(new_pane_id_5); + tab.move_focus_left(); + tab.resize_up(); + tab.vertical_split(new_pane_id_6); + tab.move_focus_up(); + tab.close_focused_pane(); + + assert_eq!(tab.panes.len(), 6, "Six panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 92, + "third remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "third remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 29, + "third remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 10, + "third remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 0, + "fourth remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 11, + "fourth remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "fourth remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 9, + "fourth remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 15, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 20, + "second remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "sixths remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 11, + "sixths remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "sixths remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 9, + "sixths remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 77, + "seventh remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 0, + "seventh remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 14, + "seventh remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.horizontal_split(new_pane_id_2); + tab.move_focus_up(); + tab.move_focus_up(); + tab.vertical_split(new_pane_id_3); + tab.move_focus_down(); + tab.vertical_split(new_pane_id_4); + tab.move_focus_down(); + tab.vertical_split(new_pane_id_5); + tab.move_focus_up(); + tab.move_focus_left(); + tab.resize_right(); + tab.horizontal_split(new_pane_id_6); + tab.move_focus_right(); + tab.close_focused_pane(); + + assert_eq!(tab.panes.len(), 6, "Six panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "third remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "third remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "third remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 3, + "third remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "fourth remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 24, + "fourth remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "fourth remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 6, + "fourth remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 15, + "second remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 61, + "sixths remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 24, + "sixths remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 60, + "sixths remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 6, + "sixths remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 0, + "seventh remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 20, + "seventh remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 121, + "seventh remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 3, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.horizontal_split(new_pane_id_2); + tab.move_focus_up(); + tab.move_focus_up(); + tab.vertical_split(new_pane_id_3); + tab.move_focus_down(); + tab.vertical_split(new_pane_id_4); + tab.move_focus_down(); + tab.vertical_split(new_pane_id_5); + tab.move_focus_up(); + tab.resize_left(); + tab.horizontal_split(new_pane_id_6); + tab.move_focus_left(); + tab.close_focused_pane(); + + assert_eq!(tab.panes.len(), 6, "Six panes left in tab"); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "first remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "first remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "first remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "first remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "fourth remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 24, + "fourth remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "fourth remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 6, + "fourth remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "second remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "second remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "second remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 15, + "second remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 0, + "third remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 16, + "third remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 121, + "third remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 3, + "third remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 61, + "sixths remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 24, + "sixths remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 60, + "sixths remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 6, + "sixths remaining pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 0, + "seventh remaining pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 20, + "seventh remaining pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 121, + "seventh remaining pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 3, + "seventh remaining pane row count" + ); +} + +#[test] +pub fn move_focus_down() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + + tab.horizontal_split(new_pane_id); + tab.move_focus_up(); + tab.move_focus_down(); + + assert_eq!( + tab.get_active_pane().unwrap().y(), + 11, + "Active pane is the bottom one" + ); +} + +#[test] +pub fn move_focus_down_to_the_most_recently_used_pane() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.vertical_split(new_pane_id_2); + tab.vertical_split(new_pane_id_3); + tab.move_focus_up(); + tab.move_focus_down(); + + assert_eq!( + tab.get_active_pane().unwrap().y(), + 11, + "Active pane y position" + ); + assert_eq!( + tab.get_active_pane().unwrap().x(), + 92, + "Active pane x position" + ); +} + +#[test] +pub fn move_focus_up() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + + tab.horizontal_split(new_pane_id); + tab.move_focus_up(); + + assert_eq!( + tab.get_active_pane().unwrap().y(), + 0, + "Active pane is the top one" + ); +} + +#[test] +pub fn move_focus_up_to_the_most_recently_used_pane() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.move_focus_up(); + tab.vertical_split(new_pane_id_2); + tab.vertical_split(new_pane_id_3); + tab.move_focus_down(); + tab.move_focus_up(); + + assert_eq!( + tab.get_active_pane().unwrap().y(), + 0, + "Active pane y position" + ); + assert_eq!( + tab.get_active_pane().unwrap().x(), + 92, + "Active pane x position" + ); +} + +#[test] +pub fn move_focus_left() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + + tab.vertical_split(new_pane_id); + tab.move_focus_left(); + + assert_eq!( + tab.get_active_pane().unwrap().x(), + 0, + "Active pane is the left one" + ); +} + +#[test] +pub fn move_focus_left_to_the_most_recently_used_pane() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.move_focus_left(); + tab.horizontal_split(new_pane_id_2); + tab.horizontal_split(new_pane_id_3); + tab.move_focus_right(); + tab.move_focus_left(); + + assert_eq!( + tab.get_active_pane().unwrap().y(), + 16, + "Active pane y position" + ); + assert_eq!( + tab.get_active_pane().unwrap().x(), + 0, + "Active pane x position" + ); +} + +#[test] +pub fn move_focus_right() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + + tab.vertical_split(new_pane_id); + tab.move_focus_left(); + tab.move_focus_right(); + + assert_eq!( + tab.get_active_pane().unwrap().x(), + 61, + "Active pane is the right one" + ); +} + +#[test] +pub fn move_focus_right_to_the_most_recently_used_pane() { + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.horizontal_split(new_pane_id_2); + tab.horizontal_split(new_pane_id_3); + tab.move_focus_left(); + tab.move_focus_right(); + + assert_eq!( + tab.get_active_pane().unwrap().y(), + 16, + "Active pane y position" + ); + assert_eq!( + tab.get_active_pane().unwrap().x(), + 61, + "Active pane x position" + ); +} + +#[test] +pub fn resize_down_with_pane_above() { + // ┌───────────┐ ┌───────────┐ + // │ │ │ │ + // │ │ │ │ + // ├───────────┤ ==resize=down==> │ │ + // │███████████│ ├───────────┤ + // │███████████│ │███████████│ + // │███████████│ │███████████│ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.horizontal_split(new_pane_id); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&new_pane_id).unwrap().position_and_size().x, + 0, + "focused pane x position" + ); + assert_eq!( + tab.panes.get(&new_pane_id).unwrap().position_and_size().y, + 13, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&new_pane_id) + .unwrap() + .position_and_size() + .cols, + 121, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&new_pane_id) + .unwrap() + .position_and_size() + .rows, + 7, + "focused pane row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane above x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane above y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane above column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 12, + "pane above row count" + ); +} + +#[test] +pub fn resize_down_with_pane_below() { + // ┌───────────┐ ┌───────────┐ + // │███████████│ │███████████│ + // │███████████│ │███████████│ + // ├───────────┤ ==resize=down==> │███████████│ + // │ │ ├───────────┤ + // │ │ │ │ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + let new_pane_id = PaneId::Terminal(2); + tab.horizontal_split(new_pane_id); + tab.move_focus_up(); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&new_pane_id).unwrap().position_and_size().x, + 0, + "pane below x position" + ); + assert_eq!( + tab.panes.get(&new_pane_id).unwrap().position_and_size().y, + 13, + "pane below y position" + ); + assert_eq!( + tab.panes + .get(&new_pane_id) + .unwrap() + .position_and_size() + .cols, + 121, + "pane below column count" + ); + assert_eq!( + tab.panes + .get(&new_pane_id) + .unwrap() + .position_and_size() + .rows, + 7, + "pane below row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "focused pane x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 12, + "focused pane row count" + ); +} + +#[test] +pub fn resize_down_with_panes_above_and_below() { + // ┌───────────┐ ┌───────────┐ + // │ │ │ │ + // │ │ │ │ + // ├───────────┤ ├───────────┤ + // │███████████│ ==resize=down==> │███████████│ + // │███████████│ │███████████│ + // │███████████│ │███████████│ + // ├───────────┤ │███████████│ + // │ │ ├───────────┤ + // │ │ │ │ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.horizontal_split(new_pane_id_2); + tab.move_focus_up(); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&new_pane_id_1).unwrap().position_and_size().x, + 0, + "focused pane x position" + ); + assert_eq!( + tab.panes.get(&new_pane_id_1).unwrap().position_and_size().y, + 16, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_1) + .unwrap() + .position_and_size() + .cols, + 121, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_1) + .unwrap() + .position_and_size() + .rows, + 9, + "focused pane row count" + ); + + assert_eq!( + tab.panes.get(&new_pane_id_2).unwrap().position_and_size().x, + 0, + "pane below x position" + ); + assert_eq!( + tab.panes.get(&new_pane_id_2).unwrap().position_and_size().y, + 26, + "pane below y position" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_2) + .unwrap() + .position_and_size() + .cols, + 121, + "pane below column count" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_2) + .unwrap() + .position_and_size() + .rows, + 4, + "pane below row count" + ); + + assert_eq!( + tab.panes.get(&first_pane_id).unwrap().position_and_size().x, + 0, + "pane above x position" + ); + assert_eq!( + tab.panes.get(&first_pane_id).unwrap().position_and_size().y, + 0, + "pane above y position" + ); + assert_eq!( + tab.panes + .get(&first_pane_id) + .unwrap() + .position_and_size() + .cols, + 121, + "pane above column count" + ); + assert_eq!( + tab.panes + .get(&first_pane_id) + .unwrap() + .position_and_size() + .rows, + 15, + "pane above row count" + ); +} + +#[test] +pub fn resize_down_with_multiple_panes_above() { + // + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ │ │ + // ├─────┴─────┤ ==resize=down==> │ │ │ + // │███████████│ ├─────┴─────┤ + // │███████████│ │███████████│ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.move_focus_up(); + tab.vertical_split(new_pane_id_2); + tab.move_focus_down(); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&new_pane_id_1).unwrap().position_and_size().x, + 0, + "focused pane x position" + ); + assert_eq!( + tab.panes.get(&new_pane_id_1).unwrap().position_and_size().y, + 18, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_1) + .unwrap() + .position_and_size() + .cols, + 121, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_1) + .unwrap() + .position_and_size() + .rows, + 12, + "focused pane row count" + ); + + assert_eq!( + tab.panes.get(&new_pane_id_2).unwrap().position_and_size().x, + 61, + "first pane above x position" + ); + assert_eq!( + tab.panes.get(&new_pane_id_2).unwrap().position_and_size().y, + 0, + "first pane above y position" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_2) + .unwrap() + .position_and_size() + .cols, + 60, + "first pane above column count" + ); + assert_eq!( + tab.panes + .get(&new_pane_id_2) + .unwrap() + .position_and_size() + .rows, + 17, + "first pane above row count" + ); + + assert_eq!( + tab.panes.get(&first_pane_id).unwrap().position_and_size().x, + 0, + "second pane above x position" + ); + assert_eq!( + tab.panes.get(&first_pane_id).unwrap().position_and_size().y, + 0, + "second pane above y position" + ); + assert_eq!( + tab.panes + .get(&first_pane_id) + .unwrap() + .position_and_size() + .cols, + 60, + "second pane above column count" + ); + assert_eq!( + tab.panes + .get(&first_pane_id) + .unwrap() + .position_and_size() + .rows, + 17, + "second pane above row count" + ); +} + +#[test] +pub fn resize_down_with_panes_above_aligned_left_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ │ │ + // │ │ │ │ │ │ + // ├─────┼─────┤ ==resize=down==> ├─────┤ │ + // │ │█████│ │ ├─────┤ + // │ │█████│ │ │█████│ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.vertical_split(focused_pane); + tab.move_focus_up(); + tab.vertical_split(pane_above); + tab.move_focus_down(); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().x, + 61, + "focused pane x position" + ); + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().y, + 18, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .cols, + 60, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .rows, + 12, + "focused pane row count" + ); + + assert_eq!( + tab.panes + .get(&pane_above_and_left) + .unwrap() + .position_and_size() + .x, + 0, + "pane above and to the left x position" + ); + assert_eq!( + tab.panes + .get(&pane_above_and_left) + .unwrap() + .position_and_size() + .y, + 0, + "pane above and to the left y position" + ); + assert_eq!( + tab.panes + .get(&pane_above_and_left) + .unwrap() + .position_and_size() + .cols, + 60, + "pane above and to the left column count" + ); + assert_eq!( + tab.panes + .get(&pane_above_and_left) + .unwrap() + .position_and_size() + .rows, + 15, + "pane above and to the left row count" + ); + + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().x, + 61, + "pane above x position" + ); + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().y, + 0, + "pane above y position" + ); + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().cols, + 60, + "pane above column count" + ); + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().rows, + 17, + "pane above row count" + ); + + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .x, + 0, + "pane to the left x position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .y, + 16, + "pane to the left y position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .cols, + 60, + "pane to the left column count" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .rows, + 14, + "pane to the left row count" + ); +} + +#[test] +pub fn resize_down_with_panes_below_aligned_left_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │█████│ │ │█████│ + // │ │█████│ │ │█████│ + // ├─────┼─────┤ ==resize=down==> ├─────┤█████│ + // │ │ │ │ ├─────┤ + // │ │ │ │ │ │ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.vertical_split(pane_below); + tab.move_focus_up(); + tab.vertical_split(focused_pane); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().x, + 61, + "focused pane x position" + ); + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().y, + 0, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .cols, + 60, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .rows, + 17, + "focused pane row count" + ); + + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .x, + 0, + "pane above and to the left x position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .y, + 0, + "pane above and to the left y position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .cols, + 60, + "pane above and to the left column count" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_left) + .unwrap() + .position_and_size() + .rows, + 15, + "pane above and to the left row count" + ); + + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().x, + 61, + "pane above x position" + ); + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().y, + 18, + "pane above y position" + ); + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().cols, + 60, + "pane above column count" + ); + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().rows, + 12, + "pane above row count" + ); + + assert_eq!( + tab.panes + .get(&pane_below_and_left) + .unwrap() + .position_and_size() + .x, + 0, + "pane to the left x position" + ); + assert_eq!( + tab.panes + .get(&pane_below_and_left) + .unwrap() + .position_and_size() + .y, + 16, + "pane to the left y position" + ); + assert_eq!( + tab.panes + .get(&pane_below_and_left) + .unwrap() + .position_and_size() + .cols, + 60, + "pane to the left column count" + ); + assert_eq!( + tab.panes + .get(&pane_below_and_left) + .unwrap() + .position_and_size() + .rows, + 14, + "pane to the left row count" + ); +} + +#[test] +pub fn resize_down_with_panes_above_aligned_right_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ │ │ + // │ │ │ │ │ │ + // ├─────┼─────┤ ==resize=down==> │ ├─────┤ + // │█████│ │ ├─────┤ │ + // │█████│ │ │█████│ │ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.vertical_split(pane_to_the_right); + tab.move_focus_up(); + tab.vertical_split(pane_above_and_right); + tab.move_focus_down(); + tab.move_focus_left(); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().x, + 0, + "focused pane x position" + ); + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().y, + 18, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .cols, + 60, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .rows, + 12, + "focused pane row count" + ); + + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().x, + 0, + "pane above x position" + ); + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().y, + 0, + "pane above y position" + ); + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().cols, + 60, + "pane above column count" + ); + assert_eq!( + tab.panes.get(&pane_above).unwrap().position_and_size().rows, + 17, + "pane above row count" + ); + + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .x, + 61, + "pane to the right x position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .y, + 16, + "pane to the right y position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .cols, + 60, + "pane to the right column count" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .rows, + 14, + "pane to the right row count" + ); + + assert_eq!( + tab.panes + .get(&pane_above_and_right) + .unwrap() + .position_and_size() + .x, + 61, + "pane above and to the right x position" + ); + assert_eq!( + tab.panes + .get(&pane_above_and_right) + .unwrap() + .position_and_size() + .y, + 0, + "pane above and to the right y position" + ); + assert_eq!( + tab.panes + .get(&pane_above_and_right) + .unwrap() + .position_and_size() + .cols, + 60, + "pane above and to the right column count" + ); + assert_eq!( + tab.panes + .get(&pane_above_and_right) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_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); + tab.vertical_split(pane_below_and_right); + tab.move_focus_up(); + tab.vertical_split(pane_to_the_right); + tab.move_focus_left(); + tab.resize_down(); + + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().x, + 0, + "focused pane x position" + ); + assert_eq!( + tab.panes.get(&focused_pane).unwrap().position_and_size().y, + 0, + "focused pane y position" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .cols, + 60, + "focused pane column count" + ); + assert_eq!( + tab.panes + .get(&focused_pane) + .unwrap() + .position_and_size() + .rows, + 17, + "focused pane row count" + ); + + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().x, + 0, + "pane below x position" + ); + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().y, + 18, + "pane below y position" + ); + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().cols, + 60, + "pane below column count" + ); + assert_eq!( + tab.panes.get(&pane_below).unwrap().position_and_size().rows, + 12, + "pane below row count" + ); + + assert_eq!( + tab.panes + .get(&pane_below_and_right) + .unwrap() + .position_and_size() + .x, + 61, + "pane below and to the right x position" + ); + assert_eq!( + tab.panes + .get(&pane_below_and_right) + .unwrap() + .position_and_size() + .y, + 16, + "pane below and to the right y position" + ); + assert_eq!( + tab.panes + .get(&pane_below_and_right) + .unwrap() + .position_and_size() + .cols, + 60, + "pane below and to the right column count" + ); + assert_eq!( + tab.panes + .get(&pane_below_and_right) + .unwrap() + .position_and_size() + .rows, + 14, + "pane below and to the right row count" + ); + + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .x, + 61, + "pane to the right x position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .y, + 0, + "pane to the right y position" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .cols, + 60, + "pane to the right column count" + ); + assert_eq!( + tab.panes + .get(&pane_to_the_right) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.move_focus_down(); + tab.resize_down(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 18, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 12, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.resize_down(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 18, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 12, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.vertical_split(PaneId::Terminal(7)); + tab.vertical_split(PaneId::Terminal(8)); + tab.move_focus_left(); + tab.resize_down(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 18, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 15, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 12, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 77, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 18, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 7, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 12, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 85, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 18, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 6, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 12, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_left(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(7)); + tab.vertical_split(PaneId::Terminal(8)); + tab.move_focus_left(); + tab.move_focus_up(); + tab.move_focus_left(); + tab.resize_down(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 15, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 77, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 7, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 85, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 6, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 18, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 12, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 8 row count" + ); +} + +#[test] +pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() { + // ┌───────────┐ ┌───────────┐ + // │███████████│ │███████████│ + // ├───────────┤ ==resize=down==> ├───────────┤ + // │ │ │ │ + // └───────────┘ └───────────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 7, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.resize_down(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 3, + "pane 1 height stayed the same" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 3, + "pane 2 height stayed the same" + ); +} + +#[test] +pub fn resize_left_with_pane_to_the_left() { + // ┌─────┬─────┐ ┌───┬───────┐ + // │ │█████│ │ │███████│ + // │ │█████│ ==resize=left==> │ │███████│ + // │ │█████│ │ │███████│ + // └─────┴─────┘ └───┴───────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_left_with_pane_to_the_right() { + // ┌─────┬─────┐ ┌───┬───────┐ + // │█████│ │ │███│ │ + // │█████│ │ ==resize=left==> │███│ │ + // │█████│ │ │███│ │ + // └─────┴─────┘ └───┴───────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_left_with_panes_to_the_left_and_right() { + // ┌─────┬─────┬─────┐ ┌─────┬───┬───────┐ + // │ │█████│ │ │ │███│ │ + // │ │█████│ │ ==resize=left==> │ │███│ │ + // │ │█████│ │ │ │███│ │ + // └─────┴─────┴─────┘ └─────┴───┴───────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_left(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 40, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_left_with_multiple_panes_to_the_left() { + // ┌─────┬─────┐ ┌───┬───────┐ + // │ │█████│ │ │███████│ + // ├─────┤█████│ ==resize=left==> ├───┤███████│ + // │ │█████│ │ │███████│ + // └─────┴─────┘ └───┴───────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(3)); + tab.move_focus_right(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_left_with_panes_to_the_left_aligned_top_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ │ │ + // ├─────┼─────┤ ==resize=left==> ├───┬─┴─────┤ + // │ │█████│ │ │███████│ + // └─────┴─────┘ └───┴───────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_down(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_down(); + tab.move_focus_left(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(4)); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_left(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_down(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 7, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 24, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 6, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 24, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 6, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 7, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 15, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_down(); + tab.move_focus_left(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 7, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 24, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 6, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 24, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 6, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 7, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 15, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 70, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(6)); + tab.horizontal_split(PaneId::Terminal(7)); + tab.horizontal_split(PaneId::Terminal(8)); + tab.move_focus_up(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 8, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 45, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 50, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 3, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 70, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(7)); + tab.horizontal_split(PaneId::Terminal(8)); + tab.move_focus_up(); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 8, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 51, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 45, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 50, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 3, + "pane 8 row count" + ); +} + +#[test] +pub fn cannot_resize_left_when_pane_to_the_left_is_at_minimum_width() { + // ┌─┬─┐ ┌─┬─┐ + // │ │█│ │ │█│ + // │ │█│ ==resize=left==> │ │█│ + // │ │█│ │ │█│ + // └─┴─┘ └─┴─┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 9, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.resize_left(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 4, + "pane 1 columns stayed the same" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 4, + "pane 2 columns stayed the same" + ); +} + +#[test] +pub fn resize_right_with_pane_to_the_left() { + // ┌─────┬─────┐ ┌───────┬───┐ + // │ │█████│ │ │███│ + // │ │█████│ ==resize=right==> │ │███│ + // │ │█████│ │ │███│ + // └─────┴─────┘ └───────┴───┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_right_with_pane_to_the_right() { + // ┌─────┬─────┐ ┌───────┬───┐ + // │█████│ │ │███████│ │ + // │█████│ │ ==resize=right==> │███████│ │ + // │█████│ │ │███████│ │ + // └─────┴─────┘ └───────┴───┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_right_with_panes_to_the_left_and_right() { + // ┌─────┬─────┬─────┐ ┌─────┬───────┬───┐ + // │ │█████│ │ │ │███████│ │ + // │ │█████│ │ ==resize=right==> │ │███████│ │ + // │ │█████│ │ │ │███████│ │ + // └─────┴─────┴─────┘ └─────┴───────┴───┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_left(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 40, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 102, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 19, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_right_with_multiple_panes_to_the_left() { + // ┌─────┬─────┐ ┌───────┬───┐ + // │ │█████│ │ │███│ + // ├─────┤█████│ ==resize=right==> ├───────┤███│ + // │ │█████│ │ │███│ + // └─────┴─────┘ └───────┴───┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(3)); + tab.move_focus_right(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 20, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 3 row count" + ); +} + +#[test] +pub fn resize_right_with_panes_to_the_left_aligned_top_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ │ │ + // ├─────┼─────┤ ==resize=right==> ├─────┴─┬───┤ + // │ │█████│ │ │███│ + // └─────┴─────┘ └───────┴───┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(3)); + tab.move_focus_right(); + tab.horizontal_split(PaneId::Terminal(4)); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 4 row count" + ); +} + +#[test] +pub fn resize_right_with_panes_to_the_right_aligned_top_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ │ │ + // ├─────┼─────┤ ==resize=right==> ├─────┴─┬───┤ + // │█████│ │ │███████│ │ + // └─────┴─────┘ └───────┴───┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(3)); + tab.move_focus_right(); + tab.horizontal_split(PaneId::Terminal(4)); + tab.move_focus_left(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 4 row count" + ); +} + +#[test] +pub fn resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane() { + // ┌─────┬─────┐ ┌───────┬───┐ + // │ │█████│ │ │███│ + // ├─────┼─────┤ ==resize=right==> ├─────┬─┴───┤ + // │ │ │ │ │ │ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(3)); + tab.move_focus_right(); + tab.horizontal_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 4 row count" + ); +} + +#[test] +pub fn resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane() { + // ┌─────┬─────┐ ┌───────┬───┐ + // │█████│ │ │███████│ │ + // ├─────┼─────┤ ==resize=right==> ├─────┬─┴───┤ + // │ │ │ │ │ │ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(3)); + tab.move_focus_right(); + tab.horizontal_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.move_focus_left(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 9, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_down(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_down(); + tab.move_focus_left(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 10, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 11, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 70, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(6)); + tab.horizontal_split(PaneId::Terminal(7)); + tab.horizontal_split(PaneId::Terminal(8)); + tab.move_focus_up(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 8, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 45, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 50, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 3, + "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 position_and_size = PositionAndSize { + cols: 121, + rows: 70, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.horizontal_split(PaneId::Terminal(7)); + tab.horizontal_split(PaneId::Terminal(8)); + tab.move_focus_up(); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 8, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 54, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 35, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 71, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 36, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 50, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 17, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 45, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 4, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 50, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 70, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 3, + "pane 8 row count" + ); +} + +#[test] +pub fn cannot_resize_right_when_pane_to_the_left_is_at_minimum_width() { + // ┌─┬─┐ ┌─┬─┐ + // │ │█│ │ │█│ + // │ │█│ ==resize=right==> │ │█│ + // │ │█│ │ │█│ + // └─┴─┘ └─┴─┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 9, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.vertical_split(PaneId::Terminal(2)); + tab.resize_right(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 4, + "pane 1 columns stayed the same" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 4, + "pane 2 columns stayed the same" + ); +} + +#[test] +pub fn resize_up_with_pane_above() { + // ┌───────────┐ ┌───────────┐ + // │ │ │ │ + // │ │ ├───────────┤ + // ├───────────┤ ==resize=up==> │███████████│ + // │███████████│ │███████████│ + // │███████████│ │███████████│ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 8, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 9, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 11, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_up_with_pane_below() { + // ┌───────────┐ ┌───────────┐ + // │███████████│ │███████████│ + // │███████████│ ├───────────┤ + // ├───────────┤ ==resize=up==> │ │ + // │ │ │ │ + // │ │ │ │ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 8, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 9, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 11, + "pane 2 row count" + ); +} + +#[test] +pub fn resize_up_with_panes_above_and_below() { + // ┌───────────┐ ┌───────────┐ + // │ │ │ │ + // │ │ ├───────────┤ + // ├───────────┤ │███████████│ + // │███████████│ ==resize=up==> │███████████│ + // │███████████│ │███████████│ + // ├───────────┤ ├───────────┤ + // │ │ │ │ + // │ │ │ │ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.horizontal_split(PaneId::Terminal(3)); + tab.move_focus_up(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 9, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 24, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 6, + "pane 3 row count" + ); +} + +#[test] +pub fn resize_up_with_multiple_panes_above() { + // + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ ├─────┴─────┤ + // ├─────┴─────┤ ==resize=up==> │███████████│ + // │███████████│ │███████████│ + // └───────────┘ └───────────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_down(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 121, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 3 row count" + ); +} + +#[test] +pub fn resize_up_with_panes_above_aligned_left_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ ├─────┤ + // ├─────┼─────┤ ==resize=up==> ├─────┤█████│ + // │ │█████│ │ │█████│ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(4)); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 4 row count" + ); +} + +#[test] +pub fn resize_up_with_panes_below_aligned_left_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │█████│ │ │█████│ + // │ │█████│ │ ├─────┤ + // ├─────┼─────┤ ==resize=up==> ├─────┤ │ + // │ │ │ │ │ │ + // │ │ │ │ │ │ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 4 row count" + ); +} + +#[test] +pub fn resize_up_with_panes_above_aligned_right_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │ │ │ │ │ │ + // │ │ │ ├─────┤ │ + // ├─────┼─────┤ ==resize=up==> │█████├─────┤ + // │█████│ │ │█████│ │ + // │█████│ │ │█████│ │ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_left(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 4 row count" + ); +} + +#[test] +pub fn resize_up_with_panes_below_aligned_right_with_current_pane() { + // ┌─────┬─────┐ ┌─────┬─────┐ + // │█████│ │ │█████│ │ + // │█████│ │ ├─────┤ │ + // ├─────┼─────┤ ==resize=up==> │ ├─────┤ + // │ │ │ │ │ │ + // │ │ │ │ │ │ + // └─────┴─────┘ └─────┴─────┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_left(); + tab.move_focus_up(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 4 row count" + ); +} + +#[test] +pub fn resize_up_with_panes_above_aligned_left_and_right_with_current_pane() { + // ┌───┬───┬───┐ ┌───┬───┬───┐ + // │ │ │ │ │ │ │ │ + // │ │ │ │ │ ├───┤ │ + // ├───┼───┼───┤ ==resize=up==> ├───┤███├───┤ + // │ │███│ │ │ │███│ │ + // │ │███│ │ │ │███│ │ + // └───┴───┴───┘ └───┴───┴───┘ + // █ == focused pane + let position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.move_focus_up(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_left(); + tab.vertical_split(PaneId::Terminal(7)); + tab.vertical_split(PaneId::Terminal(8)); + tab.move_focus_left(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 15, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 77, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 7, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 85, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 6, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 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 position_and_size = PositionAndSize { + cols: 121, + rows: 30, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.move_focus_up(); + tab.vertical_split(PaneId::Terminal(3)); + tab.vertical_split(PaneId::Terminal(4)); + tab.move_focus_down(); + tab.vertical_split(PaneId::Terminal(5)); + tab.vertical_split(PaneId::Terminal(6)); + tab.move_focus_up(); + tab.move_focus_left(); + tab.vertical_split(PaneId::Terminal(7)); + tab.vertical_split(PaneId::Terminal(8)); + tab.move_focus_left(); + tab.resize_up(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 1 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 1 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 1 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 1 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .x, + 0, + "pane 2 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 2 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .cols, + 60, + "pane 2 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 2 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 3 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 3 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .cols, + 15, + "pane 3 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(3)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 3 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 4 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 4 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 4 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(4)) + .unwrap() + .position_and_size() + .rows, + 15, + "pane 4 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .x, + 61, + "pane 5 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .y, + 14, + "pane 5 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .cols, + 30, + "pane 5 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(5)) + .unwrap() + .position_and_size() + .rows, + 16, + "pane 5 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .x, + 92, + "pane 6 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .y, + 16, + "pane 6 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .cols, + 29, + "pane 6 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(6)) + .unwrap() + .position_and_size() + .rows, + 14, + "pane 6 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .x, + 77, + "pane 7 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 7 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .cols, + 7, + "pane 7 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(7)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 7 row count" + ); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .x, + 85, + "pane 8 x position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .y, + 0, + "pane 8 y position" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .cols, + 6, + "pane 8 column count" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(8)) + .unwrap() + .position_and_size() + .rows, + 13, + "pane 8 row count" + ); +} + +#[test] +pub fn cannot_resize_up_when_pane_above_is_at_minimum_height() { + // ┌───────────┐ ┌───────────┐ + // │ │ │ │ + // ├───────────┤ ==resize=up==> ├───────────┤ + // │███████████│ │███████████│ + // └───────────┘ └───────────┘ + // █ == focused pane + + let position_and_size = PositionAndSize { + cols: 121, + rows: 7, + x: 0, + y: 0, + ..Default::default() + }; + let mut tab = create_new_tab(position_and_size); + tab.horizontal_split(PaneId::Terminal(2)); + tab.resize_down(); + + assert_eq!( + tab.panes + .get(&PaneId::Terminal(1)) + .unwrap() + .position_and_size() + .rows, + 3, + "pane 1 height stayed the same" + ); + assert_eq!( + tab.panes + .get(&PaneId::Terminal(2)) + .unwrap() + .position_and_size() + .rows, + 3, + "pane 2 height stayed the same" + ); +} diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index 4e0ce0cb..615df3c4 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use zellij_tile::data::InputMode; /// The four directions (left, right, up, down). -#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +#[derive(Eq, Clone, Debug, PartialEq, Deserialize, Serialize)] pub enum Direction { Left, Right, @@ -17,7 +17,7 @@ pub enum Direction { // They might need to be adjusted in the default config // as well `../../../assets/config/default.yaml` /// Actions that can be bound to keys. -#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +#[derive(Eq, Clone, Debug, PartialEq, Deserialize, Serialize)] pub enum Action { /// Quit Zellij. Quit, diff --git a/zellij-utils/src/ipc.rs b/zellij-utils/src/ipc.rs index 3fd2b243..cf952bdc 100644 --- a/zellij-utils/src/ipc.rs +++ b/zellij-utils/src/ipc.rs @@ -35,7 +35,7 @@ pub enum ClientType { Writer, } -#[derive(Serialize, Deserialize, Debug, Clone, Copy)] +#[derive(Default, Serialize, Deserialize, Debug, Clone, Copy)] pub struct ClientAttributes { pub position_and_size: PositionAndSize, pub palette: Palette, From f9e01c04e12c848160c1418aef0301db2c6a30f7 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Tue, 29 Jun 2021 22:13:19 +0200 Subject: [PATCH 03/23] Modularize spawn_terminal_function * Breaks the spawn_terminal_function up in order to prepare for more functionality. --- src/tests/fakes.rs | 4 +- zellij-server/src/os_input_output.rs | 95 ++++++++++++++++------------ zellij-server/src/pty.rs | 25 ++++---- zellij-server/src/wasm_vm.rs | 7 +- zellij-utils/src/input/command.rs | 16 +++++ zellij-utils/src/input/mod.rs | 1 + 6 files changed, 91 insertions(+), 57 deletions(-) create mode 100644 zellij-utils/src/input/command.rs diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 8d11458b..34823ce2 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -1,7 +1,6 @@ use std::collections::{HashMap, VecDeque}; use std::io::Write; use std::os::unix::io::RawFd; -use std::path::PathBuf; use std::sync::{Arc, Condvar, Mutex}; use std::time::{Duration, Instant}; @@ -16,6 +15,7 @@ use zellij_utils::{ async_std, channels::{self, ChannelWithContext, SenderWithContext}, errors::ErrorContext, + input::command::TerminalAction, interprocess::local_socket::LocalSocketStream, ipc::{ClientToServerMsg, ServerToClientMsg}, pane_size::PositionAndSize, @@ -265,7 +265,7 @@ impl ServerOsApi for FakeInputOutput { .unwrap() .push(IoEvent::SetTerminalSizeUsingFd(pid, cols, rows)); } - fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { + fn spawn_terminal(&self, _terminal_action: Option) -> (RawFd, Pid) { let next_terminal_id = self.stdin_writes.lock().unwrap().keys().len() as RawFd + 1; self.add_terminal(next_terminal_id); ( diff --git a/zellij-server/src/os_input_output.rs b/zellij-server/src/os_input_output.rs index a104dda2..fc1e0eae 100644 --- a/zellij-server/src/os_input_output.rs +++ b/zellij-server/src/os_input_output.rs @@ -18,6 +18,7 @@ use signal_hook::consts::*; use zellij_tile::data::Palette; use zellij_utils::{ errors::ErrorContext, + input::command::{RunCommand, TerminalAction}, ipc::{ ClientToServerMsg, ExitReason, IpcReceiverWithContext, IpcSenderWithContext, ServerToClientMsg, @@ -83,18 +84,7 @@ fn handle_command_exit(mut child: Child) { /// Spawns a new terminal from the parent terminal with [`termios`](termios::Termios) /// `orig_termios`. /// -/// If a `file_to_open` is given, the text editor specified by environment variable `EDITOR` -/// (or `VISUAL`, if `EDITOR` is not set) will be started in the new terminal, with the given -/// file open. If no file is given, the shell specified by environment variable `SHELL` will -/// be started in the new terminal. -/// -/// # Panics -/// -/// This function will panic if both the `EDITOR` and `VISUAL` environment variables are not -/// set. -// FIXME this should probably be split into different functions, or at least have less levels -// of indentation in some way -fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) -> (RawFd, Pid) { +fn handle_terminal(cmd: RunCommand, orig_termios: termios::Termios) -> (RawFd, Pid) { let (pid_primary, pid_secondary): (RawFd, Pid) = { match forkpty(None, Some(&orig_termios)) { Ok(fork_pty_res) => { @@ -104,29 +94,14 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) // fcntl(pid_primary, FcntlArg::F_SETFL(OFlag::empty())).expect("could not fcntl"); child } - ForkResult::Child => match file_to_open { - Some(file_to_open) => { - if env::var("EDITOR").is_err() && env::var("VISUAL").is_err() { - panic!("Can't edit files if an editor is not defined. To fix: define the EDITOR or VISUAL environment variables with the path to your editor (eg. /usr/bin/vim)"); - } - let editor = - env::var("EDITOR").unwrap_or_else(|_| env::var("VISUAL").unwrap()); - - let child = Command::new(editor) - .args(&[file_to_open]) - .spawn() - .expect("failed to spawn"); - handle_command_exit(child); - ::std::process::exit(0); - } - None => { - let child = Command::new(env::var("SHELL").unwrap()) - .spawn() - .expect("failed to spawn"); - handle_command_exit(child); - ::std::process::exit(0); - } - }, + ForkResult::Child => { + let child = Command::new(cmd.command) + .args(&cmd.args) + .spawn() + .expect("failed to spawn"); + handle_command_exit(child); + ::std::process::exit(0); + } }; (pid_primary, pid_secondary) } @@ -138,6 +113,48 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) (pid_primary, pid_secondary) } +/// If a [`TerminalAction::OpenFile(file)`] is given, the text editor specified by environment variable `EDITOR` +/// (or `VISUAL`, if `EDITOR` is not set) will be started in the new terminal, with the given +/// file open. +/// If [`TerminalAction::RunCommand(RunCommand)`] is given, the command will be started +/// in the new terminal. +/// If None is given, the shell specified by environment variable `SHELL` will +/// be started in the new terminal. +/// +/// # Panics +/// +/// This function will panic if both the `EDITOR` and `VISUAL` environment variables are not +/// set. +pub fn spawn_terminal( + terminal_action: Option, + orig_termios: termios::Termios, +) -> (RawFd, Pid) { + let cmd = match terminal_action { + Some(TerminalAction::OpenFile(file_to_open)) => { + if env::var("EDITOR").is_err() && env::var("VISUAL").is_err() { + panic!("Can't edit files if an editor is not defined. To fix: define the EDITOR or VISUAL environment variables with the path to your editor (eg. /usr/bin/vim)"); + } + let command = + PathBuf::from(env::var("EDITOR").unwrap_or_else(|_| env::var("VISUAL").unwrap())); + + let args = vec![file_to_open + .into_os_string() + .into_string() + .expect("Not valid Utf8 Encoding")]; + RunCommand { command, args } + } + Some(TerminalAction::RunCommand(command)) => command, + None => { + let command = + PathBuf::from(env::var("SHELL").expect("Could not find the SHELL variable")); + let args = vec![]; + RunCommand { command, args } + } + }; + + handle_terminal(cmd, orig_termios) +} + #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, @@ -178,8 +195,8 @@ impl AsyncReader for RawFdAsyncReader { pub trait ServerOsApi: Send + Sync { /// Sets the size of the terminal associated to file descriptor `fd`. fn set_terminal_size_using_fd(&self, fd: RawFd, cols: u16, rows: u16); - /// Spawn a new terminal, with an optional file to open in a terminal program. - fn spawn_terminal(&self, file_to_open: Option) -> (RawFd, Pid); + /// Spawn a new terminal, with a terminal action. + fn spawn_terminal(&self, terminal_action: Option) -> (RawFd, Pid); /// Read bytes from the standard output of the virtual terminal referred to by `fd`. fn read_from_tty_stdout(&self, fd: RawFd, buf: &mut [u8]) -> Result; /// Creates an `AsyncReader` that can be used to read from `fd` in an async context @@ -215,9 +232,9 @@ impl ServerOsApi for ServerOsInputOutput { fn set_terminal_size_using_fd(&self, fd: RawFd, cols: u16, rows: u16) { set_terminal_size_using_fd(fd, cols, rows); } - fn spawn_terminal(&self, file_to_open: Option) -> (RawFd, Pid) { + fn spawn_terminal(&self, terminal_action: Option) -> (RawFd, Pid) { let orig_termios = self.orig_termios.lock().unwrap(); - spawn_terminal(file_to_open, orig_termios.clone()) + spawn_terminal(terminal_action, orig_termios.clone()) } fn read_from_tty_stdout(&self, fd: RawFd, buf: &mut [u8]) -> Result { unistd::read(fd, buf) diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index ea3d01a8..8c1818bd 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -4,7 +4,6 @@ use async_std::future::timeout as async_timeout; use async_std::task::{self, JoinHandle}; use std::collections::HashMap; use std::os::unix::io::RawFd; -use std::path::PathBuf; use std::time::{Duration, Instant}; use crate::{ @@ -17,7 +16,7 @@ use crate::{ }; use zellij_utils::{ errors::{get_current_ctx, ContextType, PtyContext}, - input::layout::Layout, + input::{command::TerminalAction, layout::Layout}, logging::debug_to_file, }; @@ -26,9 +25,9 @@ pub type VteBytes = Vec; /// Instructions related to PTYs (pseudoterminals). #[derive(Clone, Debug)] pub(crate) enum PtyInstruction { - SpawnTerminal(Option), - SpawnTerminalVertically(Option), - SpawnTerminalHorizontally(Option), + SpawnTerminal(Option), + SpawnTerminalVertically(Option), + SpawnTerminalHorizontally(Option), NewTab, ClosePane(PaneId), CloseTab(Vec), @@ -61,22 +60,22 @@ pub(crate) fn pty_thread_main(mut pty: Pty, maybe_layout: Option) { let (event, mut err_ctx) = pty.bus.recv().expect("failed to receive event on channel"); err_ctx.add_call(ContextType::Pty((&event).into())); match event { - PtyInstruction::SpawnTerminal(file_to_open) => { - let pid = pty.spawn_terminal(file_to_open); + PtyInstruction::SpawnTerminal(terminal_action) => { + let pid = pty.spawn_terminal(terminal_action); pty.bus .senders .send_to_screen(ScreenInstruction::NewPane(PaneId::Terminal(pid))) .unwrap(); } - PtyInstruction::SpawnTerminalVertically(file_to_open) => { - let pid = pty.spawn_terminal(file_to_open); + PtyInstruction::SpawnTerminalVertically(terminal_action) => { + let pid = pty.spawn_terminal(terminal_action); pty.bus .senders .send_to_screen(ScreenInstruction::VerticalSplit(PaneId::Terminal(pid))) .unwrap(); } - PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { - let pid = pty.spawn_terminal(file_to_open); + PtyInstruction::SpawnTerminalHorizontally(terminal_action) => { + let pid = pty.spawn_terminal(terminal_action); pty.bus .senders .send_to_screen(ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid))) @@ -218,13 +217,13 @@ impl Pty { task_handles: HashMap::new(), } } - pub fn spawn_terminal(&mut self, file_to_open: Option) -> RawFd { + pub fn spawn_terminal(&mut self, terminal_action: Option) -> RawFd { let (pid_primary, pid_secondary): (RawFd, Pid) = self .bus .os_input .as_mut() .unwrap() - .spawn_terminal(file_to_open); + .spawn_terminal(terminal_action); let task_handle = stream_terminal_bytes( pid_primary, self.bus.senders.clone(), diff --git a/zellij-server/src/wasm_vm.rs b/zellij-server/src/wasm_vm.rs index 62198d68..60761e81 100644 --- a/zellij-server/src/wasm_vm.rs +++ b/zellij-server/src/wasm_vm.rs @@ -7,8 +7,6 @@ use std::sync::{mpsc::Sender, Arc, Mutex}; use std::thread; use std::time::{Duration, Instant}; -use zellij_utils::{serde, zellij_tile}; - use serde::{de::DeserializeOwned, Serialize}; use wasmer::{ imports, ChainableNamedResolver, Function, ImportObject, Instance, Module, Store, Value, @@ -24,6 +22,7 @@ use crate::{ thread_bus::{Bus, ThreadSenders}, }; use zellij_utils::errors::{ContextType, PluginContext}; +use zellij_utils::{input::command::TerminalAction, serde, zellij_tile}; #[derive(Clone, Debug)] pub(crate) enum PluginInstruction { @@ -235,7 +234,9 @@ fn host_open_file(plugin_env: &PluginEnv) { let path: PathBuf = wasi_read_object(&plugin_env.wasi_env); plugin_env .senders - .send_to_pty(PtyInstruction::SpawnTerminal(Some(path))) + .send_to_pty(PtyInstruction::SpawnTerminal(Some( + TerminalAction::OpenFile(path), + ))) .unwrap(); } diff --git a/zellij-utils/src/input/command.rs b/zellij-utils/src/input/command.rs new file mode 100644 index 00000000..79bbe5ab --- /dev/null +++ b/zellij-utils/src/input/command.rs @@ -0,0 +1,16 @@ +//! Trigger a command +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; + +#[derive(Debug, Clone)] +pub enum TerminalAction { + OpenFile(PathBuf), + RunCommand(RunCommand), +} + +#[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq)] +pub struct RunCommand { + pub command: PathBuf, + #[serde(default)] + pub args: Vec, +} diff --git a/zellij-utils/src/input/mod.rs b/zellij-utils/src/input/mod.rs index 9250cad5..5c1dc262 100644 --- a/zellij-utils/src/input/mod.rs +++ b/zellij-utils/src/input/mod.rs @@ -1,6 +1,7 @@ //! The way terminal input is handled. pub mod actions; +pub mod command; pub mod config; pub mod keybinds; pub mod layout; From 8086765e509942d5cd7a3f0818f6cef6918ec7a6 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Wed, 30 Jun 2021 19:42:21 +0200 Subject: [PATCH 04/23] fixup! Fix merged tests --- zellij-server/src/unit/screen_tests.rs | 5 ++--- zellij-server/src/unit/tab_tests.rs | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs index da52c585..885cb3d1 100644 --- a/zellij-server/src/unit/screen_tests.rs +++ b/zellij-server/src/unit/screen_tests.rs @@ -6,10 +6,9 @@ use crate::{ SessionState, }; use std::sync::{Arc, RwLock}; -use zellij_utils::pane_size::PositionAndSize; +use zellij_utils::{input::command::TerminalAction, pane_size::PositionAndSize}; use std::os::unix::io::RawFd; -use std::path::PathBuf; use zellij_utils::ipc::ClientAttributes; use zellij_utils::nix; @@ -27,7 +26,7 @@ impl ServerOsApi for FakeInputOutput { fn set_terminal_size_using_fd(&self, _fd: RawFd, _cols: u16, _rows: u16) { // noop } - fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { + fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { unimplemented!() } fn read_from_tty_stdout(&self, _fd: RawFd, _buf: &mut [u8]) -> Result { diff --git a/zellij-server/src/unit/tab_tests.rs b/zellij-server/src/unit/tab_tests.rs index 87c3be71..f4c7493e 100644 --- a/zellij-server/src/unit/tab_tests.rs +++ b/zellij-server/src/unit/tab_tests.rs @@ -10,12 +10,12 @@ use std::sync::{Arc, RwLock}; use zellij_utils::pane_size::PositionAndSize; use std::os::unix::io::RawFd; -use std::path::PathBuf; use zellij_utils::nix; use zellij_utils::{ errors::ErrorContext, + input::command::TerminalAction, interprocess::local_socket::LocalSocketStream, ipc::{ClientToServerMsg, ServerToClientMsg}, }; @@ -26,7 +26,7 @@ impl ServerOsApi for FakeInputOutput { fn set_terminal_size_using_fd(&self, _fd: RawFd, _cols: u16, _rows: u16) { // noop } - fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { + fn spawn_terminal(&self, _file_to_open: Option) -> (RawFd, Pid) { unimplemented!() } fn read_from_tty_stdout(&self, _fd: RawFd, _buf: &mut [u8]) -> Result { From 6f1c103e02dd33ce59a77bb3ddb8c505c74fd469 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Thu, 1 Jul 2021 20:02:08 +0200 Subject: [PATCH 05/23] Add option to specify default-shell * Adds an option to specify a default shell either by specifying `default_shell: [PATH]` in the config, or running zellij with `zellij options --default-shell [PATH]` --- zellij-server/src/lib.rs | 26 ++++++++++++++++++++++++-- zellij-server/src/pty.rs | 24 ++++++++++++++++-------- zellij-server/src/route.rs | 17 +++++++++++------ zellij-utils/src/input/options.rs | 9 +++++++++ 4 files changed, 60 insertions(+), 16 deletions(-) diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs index 5322e6a6..bb642ecb 100644 --- a/zellij-server/src/lib.rs +++ b/zellij-server/src/lib.rs @@ -29,7 +29,12 @@ use zellij_utils::{ channels::{self, ChannelWithContext, SenderWithContext}, cli::CliArgs, errors::{ContextType, ErrorInstruction, ServerContext}, - input::{get_mode_info, layout::Layout, options::Options}, + input::{ + command::{RunCommand, TerminalAction}, + get_mode_info, + layout::Layout, + options::Options, + }, ipc::{ClientAttributes, ClientToServerMsg, ExitReason, ServerToClientMsg}, setup::get_default_data_dir, }; @@ -84,6 +89,7 @@ pub(crate) struct SessionMetaData { pub senders: ThreadSenders, pub capabilities: PluginCapabilities, pub palette: Palette, + pub default_shell: Option, screen_thread: Option>, pty_thread: Option>, wasm_thread: Option>, @@ -219,13 +225,21 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { ); *session_data.write().unwrap() = Some(session); *session_state.write().unwrap() = SessionState::Attached; + + let default_shell = session_data + .read() + .unwrap() + .as_ref() + .map(|session| session.default_shell.clone()) + .flatten(); + session_data .read() .unwrap() .as_ref() .unwrap() .senders - .send_to_pty(PtyInstruction::NewTab) + .send_to_pty(PtyInstruction::NewTab(default_shell.clone())) .unwrap(); } ServerInstruction::AttachClient(attrs, _, options) => { @@ -324,6 +338,13 @@ fn init_session( arrow_fonts: config_options.simplified_ui, }; + let default_shell = config_options.default_shell.clone().map(|command| { + TerminalAction::RunCommand(RunCommand { + command, + ..Default::default() + }) + }); + let pty_thread = thread::Builder::new() .name("pty".to_string()) .spawn({ @@ -393,6 +414,7 @@ fn init_session( should_silently_fail: false, }, capabilities, + default_shell, palette: client_attributes.palette, screen_thread: Some(screen_thread), pty_thread: Some(pty_thread), diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index 8c1818bd..0dba3611 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -28,7 +28,7 @@ pub(crate) enum PtyInstruction { SpawnTerminal(Option), SpawnTerminalVertically(Option), SpawnTerminalHorizontally(Option), - NewTab, + NewTab(Option), ClosePane(PaneId), CloseTab(Vec), Exit, @@ -42,7 +42,7 @@ impl From<&PtyInstruction> for PtyContext { PtyInstruction::SpawnTerminalHorizontally(_) => PtyContext::SpawnTerminalHorizontally, PtyInstruction::ClosePane(_) => PtyContext::ClosePane, PtyInstruction::CloseTab(_) => PtyContext::CloseTab, - PtyInstruction::NewTab => PtyContext::NewTab, + PtyInstruction::NewTab(_) => PtyContext::NewTab, PtyInstruction::Exit => PtyContext::Exit, } } @@ -81,11 +81,11 @@ pub(crate) fn pty_thread_main(mut pty: Pty, maybe_layout: Option) { .send_to_screen(ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid))) .unwrap(); } - PtyInstruction::NewTab => { + PtyInstruction::NewTab(terminal_action) => { if let Some(layout) = maybe_layout.clone() { - pty.spawn_terminals_for_layout(layout); + pty.spawn_terminals_for_layout(layout, terminal_action); } else { - let pid = pty.spawn_terminal(None); + let pid = pty.spawn_terminal(terminal_action); pty.bus .senders .send_to_screen(ScreenInstruction::NewTab(pid)) @@ -234,12 +234,20 @@ impl Pty { self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary } - pub fn spawn_terminals_for_layout(&mut self, layout: Layout) { + pub fn spawn_terminals_for_layout( + &mut self, + layout: Layout, + terminal_action: Option, + ) { let total_panes = layout.total_terminal_panes(); let mut new_pane_pids = vec![]; for _ in 0..total_panes { - let (pid_primary, pid_secondary): (RawFd, Pid) = - self.bus.os_input.as_mut().unwrap().spawn_terminal(None); + let (pid_primary, pid_secondary): (RawFd, Pid) = self + .bus + .os_input + .as_mut() + .unwrap() + .spawn_terminal(terminal_action.clone()); self.id_to_child_pid.insert(pid_primary, pid_secondary); new_pane_pids.push(pid_primary); } diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs index 285f333c..9c0ac18f 100644 --- a/zellij-server/src/route.rs +++ b/zellij-server/src/route.rs @@ -133,13 +133,14 @@ fn route_action( .unwrap(); } Action::NewPane(direction) => { + let shell = session.default_shell.clone(); let pty_instr = match direction { - Some(Direction::Left) => PtyInstruction::SpawnTerminalVertically(None), - Some(Direction::Right) => PtyInstruction::SpawnTerminalVertically(None), - Some(Direction::Up) => PtyInstruction::SpawnTerminalHorizontally(None), - Some(Direction::Down) => PtyInstruction::SpawnTerminalHorizontally(None), + Some(Direction::Left) => PtyInstruction::SpawnTerminalVertically(shell), + Some(Direction::Right) => PtyInstruction::SpawnTerminalVertically(shell), + Some(Direction::Up) => PtyInstruction::SpawnTerminalHorizontally(shell), + Some(Direction::Down) => PtyInstruction::SpawnTerminalHorizontally(shell), // No direction specified - try to put it in the biggest available spot - None => PtyInstruction::SpawnTerminal(None), + None => PtyInstruction::SpawnTerminal(shell), }; session.senders.send_to_pty(pty_instr).unwrap(); } @@ -150,7 +151,11 @@ fn route_action( .unwrap(); } Action::NewTab => { - session.senders.send_to_pty(PtyInstruction::NewTab).unwrap(); + let shell = session.default_shell.clone(); + session + .senders + .send_to_pty(PtyInstruction::NewTab(shell)) + .unwrap(); } Action::GoToNextTab => { session diff --git a/zellij-utils/src/input/options.rs b/zellij-utils/src/input/options.rs index 4ebb5b86..10571978 100644 --- a/zellij-utils/src/input/options.rs +++ b/zellij-utils/src/input/options.rs @@ -20,6 +20,9 @@ pub struct Options { /// Set the default mode #[structopt(long)] pub default_mode: Option, + /// Set the default shell + #[structopt(long, parse(from_os_str))] + pub default_shell: Option, /// Set the layout_dir, defaults to /// subdirectory of config dir #[structopt(long, parse(from_os_str))] @@ -50,6 +53,11 @@ impl Options { other => other, }; + let default_shell = match other.default_shell { + None => self.default_shell.clone(), + other => other, + }; + let layout_dir = match other.layout_dir { None => self.layout_dir.clone(), other => other, @@ -64,6 +72,7 @@ impl Options { simplified_ui, theme, default_mode, + default_shell, layout_dir, } } From 04ad07d9e9749a77417cd03104d71cbdd1468281 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Thu, 1 Jul 2021 20:28:00 +0200 Subject: [PATCH 06/23] docs(changelog): Add option for default-shell --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dc99487..9a6e37cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) `layout-dir` * Fix `Makefile.toml` because of missing directory (https://github.com/zellij-org/zellij/pull/580) * Autodetach on force close (https://github.com/zellij-org/zellij/pull/581) +* Add option to specify a default shell (https://github.com/zellij-org/zellij/pull/594) ## [0.13.0] - 2021-06-04 * Fix crash when padding before widechar (https://github.com/zellij-org/zellij/pull/540) From 06e19516f49e7e56f60a96f630159c54645d2f10 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Thu, 1 Jul 2021 21:48:24 +0200 Subject: [PATCH 07/23] Improve loading of default shell slightly --- zellij-server/src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs index bb642ecb..6618c0a7 100644 --- a/zellij-server/src/lib.rs +++ b/zellij-server/src/lib.rs @@ -217,7 +217,7 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { let session = init_session( os_input.clone(), opts, - config_options, + config_options.clone(), to_server.clone(), client_attributes, session_state.clone(), @@ -226,12 +226,12 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { *session_data.write().unwrap() = Some(session); *session_state.write().unwrap() = SessionState::Attached; - let default_shell = session_data - .read() - .unwrap() - .as_ref() - .map(|session| session.default_shell.clone()) - .flatten(); + let default_shell = config_options.default_shell.map(|shell| { + TerminalAction::RunCommand(RunCommand { + command: shell, + ..Default::default() + }) + }); session_data .read() From 0bf78100ddbae4fa3f199b4c0f4a4b05ac83c5ee Mon Sep 17 00:00:00 2001 From: a-kenji Date: Wed, 30 Jun 2021 23:25:50 +0200 Subject: [PATCH 08/23] Add running commands to an action Add the ability to bind running commands to an action. Eg: ``` - action: [Run: {command: "htop",},] key: [F: 6,] `` Optionally the direction and arguments can be specified: ``` - action: [Run: {command: "htop", args: ["-C",]},] key: [F: 7,] ``` The directional splits are analogous to the `[NewPane]` splits. ``` - action: [Run: {command: "htop", args: ["-C",], direction: "Up"},] key: [F: 8,] ``` --- zellij-server/src/route.rs | 13 +++++++++++++ zellij-utils/src/input/actions.rs | 3 +++ zellij-utils/src/input/command.rs | 22 +++++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs index 285f333c..1a559d08 100644 --- a/zellij-server/src/route.rs +++ b/zellij-server/src/route.rs @@ -10,6 +10,7 @@ use zellij_utils::{ channels::SenderWithContext, input::{ actions::{Action, Direction}, + command::TerminalAction, get_mode_info, }, ipc::{ClientToServerMsg, ExitReason, ServerToClientMsg}, @@ -143,6 +144,18 @@ fn route_action( }; session.senders.send_to_pty(pty_instr).unwrap(); } + Action::Run(command) => { + let run_cmd = Some(TerminalAction::RunCommand(command.clone().into())); + let pty_instr = match command.direction { + Some(Direction::Left) => PtyInstruction::SpawnTerminalVertically(run_cmd), + Some(Direction::Right) => PtyInstruction::SpawnTerminalVertically(run_cmd), + Some(Direction::Up) => PtyInstruction::SpawnTerminalHorizontally(run_cmd), + Some(Direction::Down) => PtyInstruction::SpawnTerminalHorizontally(run_cmd), + // No direction specified - try to put it in the biggest available spot + None => PtyInstruction::SpawnTerminal(run_cmd), + }; + session.senders.send_to_pty(pty_instr).unwrap(); + } Action::CloseFocus => { session .senders diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index 615df3c4..36fd93b1 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -1,5 +1,6 @@ //! Definition of the actions that can be bound to keys. +use super::command::RunCommandAction; use serde::{Deserialize, Serialize}; use zellij_tile::data::InputMode; @@ -65,6 +66,8 @@ pub enum Action { CloseTab, GoToTab(u32), TabNameInput(Vec), + /// Run speficied command in new pane. + Run(RunCommandAction), /// Detach session and exit Detach, } diff --git a/zellij-utils/src/input/command.rs b/zellij-utils/src/input/command.rs index 79bbe5ab..ca505ea2 100644 --- a/zellij-utils/src/input/command.rs +++ b/zellij-utils/src/input/command.rs @@ -1,4 +1,5 @@ //! Trigger a command +use super::actions::Direction; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -8,9 +9,28 @@ pub enum TerminalAction { RunCommand(RunCommand), } -#[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq)] +#[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq, Eq)] pub struct RunCommand { pub command: PathBuf, #[serde(default)] pub args: Vec, } + +/// Intermediate representation +#[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq, Eq)] +pub struct RunCommandAction { + pub command: PathBuf, + #[serde(default)] + pub args: Vec, + #[serde(default)] + pub direction: Option, +} + +impl From for RunCommand { + fn from(action: RunCommandAction) -> Self { + RunCommand { + command: action.command, + args: action.args, + } + } +} From 2a024db839e3be60f9428d39f6e84c7e748162d0 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Fri, 2 Jul 2021 14:08:14 +0200 Subject: [PATCH 09/23] chore(changelog): Add run-command option #596 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a6e37cd..f274d932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * Fix `Makefile.toml` because of missing directory (https://github.com/zellij-org/zellij/pull/580) * Autodetach on force close (https://github.com/zellij-org/zellij/pull/581) * Add option to specify a default shell (https://github.com/zellij-org/zellij/pull/594) +* Add action to run bound commands in a pane (https://github.com/zellij-org/zellij/pull/596) ## [0.13.0] - 2021-06-04 * Fix crash when padding before widechar (https://github.com/zellij-org/zellij/pull/540) From f93308f211565fae527f9b1e5788e12d0ea887c4 Mon Sep 17 00:00:00 2001 From: Thomas Linford Date: Fri, 2 Jul 2021 16:40:50 +0200 Subject: [PATCH 10/23] feat(ui): initial mouse support (#448) * Initial mouse support * enable mouse support (termion MouseTerminal) * handle scroll up and down events * Allow enabling/disabling of mouse reporting Store the mouse terminal on OsInputOutput * WIP: switch pane focus with mouse * testing to get mouse character selection * wip mouse selection * wip: mouse selection - initial handling of mouse events for text selection within a pane - wide characters currently problematic - selection is not highlighted * highlight currently selected text * improve get currently selected text from TerminalPane * copy selection to clipboard (wayland only for now) * Add missing set_should_render on selection update * Improve text selection - Strip whitespace from end of lines - Insert newlines when selection spans multiple lines * Simplify selection logic - Remove Range struct - Selection is not an Option anymore, it's empty when start == end * copy selection to clipboard with OSC-52 sequence * Improve text selection with multiple panes - Constrain mouse hold and release events to currently active pane - Fix calculation of columns with side by side panes * fix for PositionAndSize changes * Fix mouse selection with full screen pane. - Transform mouse event positions to relative when passing to pane. * Move selection to grid, rework highlighting. - Mark selected lines for update in grid output buffer, for now in the simplest way possible, but can be made more efficient by calculating changed lines only. - Clear selection on pane resize. - Re-add logic to forward mouse hold and release events only to currently active pane. * Tidy up selection - add method to get selection line range - add method to sort the current selection * Grid: move current selection up/down when scrolling - Make the selection work with lines in lines_above and lines_below - Todo: update selection end when scrolling with mouse button being held - Todo: figure out how to move selection when new characters are added. * Grid: move selection when new lines are added * Keep track of selection being active - Handle the selection growing/shrinking when scrolling with mouse button held down but not yet released. * Improve selection end with multiple panes * Tidying up - remove logging statements, unused code * Add some unit tests for selection, move position to zellij-utils * Change Position::new to take i32 for line * Grid: add unit tests for copy from selection * add basic integration test for mouse pane focus * Add basic integration test for mouse scroll * Use color from palette for selection rendering * Improve performance of selection render - Try to minimize lines to update on selection start/update/end * fixes for updated start method * fix lines not in viewport being marked for rendering - the previous optimization to grid selection rendering was always adding the lines at the extremes of previous selection, causing problems when scrolling up or down - make sure to only add lines in viewport * Disable mouse mode on exit * use saturating_sub for usize subtractions * copy selection to clipboard on mouse release * disable mouse on exit after error * remove left-over comments * remove copy keybinding * add default impl for selection methods in Pane - remove the useless methods from Impl Pane in PluginPane * move line diff between selections to selection * add option to disable mouse mode * Allow scrolling with mouse while selecting. * move action repeater to os_input_output, change timeout to 10ms - change repeater to take an action instead of a position with hardcoded action * replace mouse mode integration tests with e2e tests * cleanup * cleanup * check if mouse mode is disabled from merged options * fix missing changes in tests, cleanup --- Cargo.lock | 14 +- src/tests/e2e/cases.rs | 154 +++++++++++++- ...ts__e2e__cases__focus_pane_with_mouse.snap | 29 +++ ...s__scrolling_inside_a_pane_with_mouse.snap | 29 +++ src/tests/fixtures/grid_copy | 59 ++++++ zellij-client/Cargo.toml | 1 + zellij-client/src/input_handler.rs | 49 ++++- zellij-client/src/lib.rs | 3 + zellij-client/src/os_input_output.rs | 81 ++++++- zellij-client/src/unit/input_handler_tests.rs | 10 + zellij-server/Cargo.toml | 1 + zellij-server/src/panes/grid.rs | 109 +++++++++- zellij-server/src/panes/mod.rs | 1 + zellij-server/src/panes/selection.rs | 135 ++++++++++++ zellij-server/src/panes/terminal_pane.rs | 57 ++++- zellij-server/src/panes/unit/grid_tests.rs | 64 +++++- .../src/panes/unit/selection_tests.rs | 197 ++++++++++++++++++ zellij-server/src/route.rs | 36 ++++ zellij-server/src/screen.rs | 47 ++++- zellij-server/src/tab.rs | 112 +++++++++- zellij-utils/src/errors.rs | 7 + zellij-utils/src/input/actions.rs | 10 + zellij-utils/src/input/mod.rs | 1 + zellij-utils/src/input/mouse.rs | 69 ++++++ zellij-utils/src/input/options.rs | 10 + zellij-utils/src/lib.rs | 1 + zellij-utils/src/pane_size.rs | 10 + zellij-utils/src/position.rs | 30 +++ 28 files changed, 1309 insertions(+), 17 deletions(-) create mode 100644 src/tests/e2e/snapshots/zellij__tests__e2e__cases__focus_pane_with_mouse.snap create mode 100644 src/tests/e2e/snapshots/zellij__tests__e2e__cases__scrolling_inside_a_pane_with_mouse.snap create mode 100755 src/tests/fixtures/grid_copy create mode 100644 zellij-server/src/panes/selection.rs create mode 100644 zellij-server/src/panes/unit/selection_tests.rs create mode 100644 zellij-utils/src/input/mouse.rs create mode 100644 zellij-utils/src/position.rs diff --git a/Cargo.lock b/Cargo.lock index 264fb743..df0db731 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,12 +190,12 @@ checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" [[package]] name = "atty" -version = "0.2.14" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" dependencies = [ - "hermit-abi", "libc", + "termion", "winapi", ] @@ -220,6 +220,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + [[package]] name = "bincode" version = "1.3.3" @@ -2457,6 +2463,7 @@ name = "zellij-client" version = "0.14.0" dependencies = [ "insta", + "mio", "termbg", "zellij-utils", ] @@ -2467,6 +2474,7 @@ version = "0.14.0" dependencies = [ "ansi_term 0.12.1", "async-trait", + "base64", "cassowary", "daemonize", "insta", diff --git a/src/tests/e2e/cases.rs b/src/tests/e2e/cases.rs index 69233f25..8d41d44f 100644 --- a/src/tests/e2e/cases.rs +++ b/src/tests/e2e/cases.rs @@ -1,7 +1,7 @@ #![allow(unused)] use ::insta::assert_snapshot; -use zellij_utils::pane_size::PositionAndSize; +use zellij_utils::{pane_size::PositionAndSize, position::Position}; use rand::Rng; @@ -54,6 +54,17 @@ pub const BRACKETED_PASTE_START: [u8; 6] = [27, 91, 50, 48, 48, 126]; // \u{1b}[ pub const BRACKETED_PASTE_END: [u8; 6] = [27, 91, 50, 48, 49, 126]; // \u{1b}[201 pub const SLEEP: [u8; 0] = []; +// simplified, slighty adapted version of alacritty mouse reporting code +pub fn normal_mouse_report(position: Position, button: u8) -> Vec { + let Position { line, column } = position; + + let mut command = vec![b'\x1b', b'[', b'M', 32 + button]; + command.push(32 + 1 + column.0 as u8); + command.push(32 + 1 + line.0 as u8); + + command +} + // All the E2E tests are marked as "ignored" so that they can be run separately from the normal // tests @@ -785,3 +796,144 @@ pub fn accepts_basic_layout() { .run_all_steps(); assert_snapshot!(last_snapshot); } + +#[test] +#[ignore] +fn focus_pane_with_mouse() { + let fake_win_size = PositionAndSize { + cols: 120, + rows: 24, + x: 0, + y: 0, + ..Default::default() + }; + + let last_snapshot = RemoteRunner::new("split_terminals_vertically", fake_win_size, None) + .add_step(Step { + name: "Split pane to the right", + instruction: |mut remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.status_bar_appears() && remote_terminal.cursor_position_is(2, 2) + { + remote_terminal.send_key(&PANE_MODE); + remote_terminal.send_key(&SPLIT_RIGHT_IN_PANE_MODE); + // back to normal mode after split + remote_terminal.send_key(&ENTER); + step_is_complete = true; + } + step_is_complete + }, + }) + .add_step(Step { + name: "Click left pane", + instruction: |mut remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.cursor_position_is(63, 2) && remote_terminal.tip_appears() { + remote_terminal.send_key(&normal_mouse_report(Position::new(5, 2), 0)); + step_is_complete = true; + } + step_is_complete + }, + }) + .add_step(Step { + name: "Wait for left pane to be focused", + instruction: |remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.cursor_position_is(2, 2) && remote_terminal.tip_appears() { + // cursor is in the newly opened second pane + step_is_complete = true; + } + step_is_complete + }, + }) + .run_all_steps(); + assert_snapshot!(last_snapshot); +} + +#[test] +#[ignore] +pub fn scrolling_inside_a_pane_with_mouse() { + let fake_win_size = PositionAndSize { + cols: 120, + rows: 24, + x: 0, + y: 0, + ..Default::default() + }; + let last_snapshot = + RemoteRunner::new("scrolling_inside_a_pane_with_mouse", fake_win_size, None) + .add_step(Step { + name: "Split pane to the right", + instruction: |mut remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.status_bar_appears() + && remote_terminal.cursor_position_is(2, 2) + { + remote_terminal.send_key(&PANE_MODE); + remote_terminal.send_key(&SPLIT_RIGHT_IN_PANE_MODE); + // back to normal mode after split + remote_terminal.send_key(&ENTER); + step_is_complete = true; + } + step_is_complete + }, + }) + .add_step(Step { + name: "Fill terminal with text", + instruction: |mut remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.cursor_position_is(63, 2) && remote_terminal.tip_appears() { + // cursor is in the newly opened second pane + remote_terminal.send_key(&format!("{:0<57}", "line1 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line2 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line3 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line4 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line5 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line6 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line7 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line8 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line9 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line10 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line11 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line12 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line13 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line14 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line15 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line16 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line17 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line18 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<59}", "line19 ").as_bytes()); + remote_terminal.send_key(&format!("{:0<58}", "line20 ").as_bytes()); + step_is_complete = true; + } + step_is_complete + }, + }) + .add_step(Step { + name: "Scroll up inside pane", + instruction: |mut remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.cursor_position_is(119, 20) { + // all lines have been written to the pane + remote_terminal.send_key(&normal_mouse_report(Position::new(2, 64), 64)); + step_is_complete = true; + } + step_is_complete + }, + }) + .add_step(Step { + name: "Wait for scroll to finish", + instruction: |remote_terminal: RemoteTerminal| -> bool { + let mut step_is_complete = false; + if remote_terminal.cursor_position_is(119, 20) + && remote_terminal.snapshot_contains("line1 ") + { + // scrolled up one line + step_is_complete = true; + } + step_is_complete + }, + }) + .run_all_steps(); + assert_snapshot!(last_snapshot); +} diff --git a/src/tests/e2e/snapshots/zellij__tests__e2e__cases__focus_pane_with_mouse.snap b/src/tests/e2e/snapshots/zellij__tests__e2e__cases__focus_pane_with_mouse.snap new file mode 100644 index 00000000..79e84810 --- /dev/null +++ b/src/tests/e2e/snapshots/zellij__tests__e2e__cases__focus_pane_with_mouse.snap @@ -0,0 +1,29 @@ +--- +source: src/tests/e2e/cases.rs +expression: last_snapshot + +--- + Zellij  Tab #1  + +$ █ │$ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + + Ctrl + LOCK 

PANE  TAB  RESIZE  SCROLL  SESSION  QUIT  + Tip: Alt + n => open new pane. Alt + [] or hjkl => navigate between panes. diff --git a/src/tests/e2e/snapshots/zellij__tests__e2e__cases__scrolling_inside_a_pane_with_mouse.snap b/src/tests/e2e/snapshots/zellij__tests__e2e__cases__scrolling_inside_a_pane_with_mouse.snap new file mode 100644 index 00000000..bff40376 --- /dev/null +++ b/src/tests/e2e/snapshots/zellij__tests__e2e__cases__scrolling_inside_a_pane_with_mouse.snap @@ -0,0 +1,29 @@ +--- +source: src/tests/e2e/cases.rs +expression: last_snapshot + +--- + Zellij  Tab #1  + +$ │$ line1 000000000000000000000000000000000000000000000000000 + │line2 00000000000000000000000000000000000000000000000000000 + │line3 00000000000000000000000000000000000000000000000000000 + │line4 00000000000000000000000000000000000000000000000000000 + │line5 00000000000000000000000000000000000000000000000000000 + │line6 00000000000000000000000000000000000000000000000000000 + │line7 00000000000000000000000000000000000000000000000000000 + │line8 00000000000000000000000000000000000000000000000000000 + │line9 00000000000000000000000000000000000000000000000000000 + │line10 0000000000000000000000000000000000000000000000000000 + │line11 0000000000000000000000000000000000000000000000000000 + │line12 0000000000000000000000000000000000000000000000000000 + │line13 0000000000000000000000000000000000000000000000000000 + │line14 0000000000000000000000000000000000000000000000000000 + │line15 0000000000000000000000000000000000000000000000000000 + │line16 0000000000000000000000000000000000000000000000000000 + │line17 0000000000000000000000000000000000000000000000000000 + │line18 0000000000000000000000000000000000000000000000000000 + │line19 000000000000000000000000000000000000000000000000000█ + + Ctrl + LOCK 

PANE  TAB  RESIZE  SCROLL  SESSION  QUIT  + Tip: Alt + n => open new pane. Alt + [] or hjkl => navigate between panes. diff --git a/src/tests/fixtures/grid_copy b/src/tests/fixtures/grid_copy new file mode 100755 index 00000000..6d093741 --- /dev/null +++ b/src/tests/fixtures/grid_copy @@ -0,0 +1,59 @@ +⏎(B ⏎ Welcome to fish, the friendly interactive shell +Type `help` for instructions on how to use fish +[?2004h]0;fish /home/thomas/Projects/zellij(B +zellij on  mouse-support [?] is 📦 v0.14.0 via 🦀 v1.53.0-beta.3  +❯  cc(Bat test-input.txt(Bat test-input.txt(Bt test-input.txt(Bcat test-input.txt(B test-input.txt(B test-input.txt(B +(B[?2004l]0;cat test-input.txt /home/thomas/Projects/zellij(B Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +Velit ut tortor pretium viverra suspendisse potenti nullam ac tortor. Adipiscing elit ut aliquam purus sit amet luctus venenatis. +Duis ut diam quam nulla porttitor massa id neque aliquam. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. +Vitae nunc sed velit dignissim sodales ut eu sem integer. +Tortor id aliquet lectus proin nibh nisl. +Commodo odio aenean sed adipiscing diam donec adipiscing tristique risus. +Velit dignissim sodales ut eu sem. Lacus suspendisse faucibus interdum posuere lorem. Ac placerat vestibulum lectus mauris ultrices eros. Elementum integer enim neque volutpat ac. Augue interdum velit euismod in. + +Egestas sed sed risus pretium quam vulputate dignissim. +Gravida rutrum quisque non tellus orci ac auctor augue. +Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. +Elementum eu facilisis sed odio morbi quis. +Mattis ullamcorper velit sed ullamcorper morbi. +Dui vivamus arcu felis bibendum. Sit amet aliquam id diam. +Suscipit tellus mauris a diam maecenas sed enim. +Odio ut sem nulla pharetra. +Cras ornare arcu dui vivamus arcu felis bibendum. +Egestas fringilla phasellus faucibus scelerisque eleifend. +Purus semper eget duis at tellus at urna condimentum. +Aliquam etiam erat velit scelerisque in dictum non. +Porta non pulvinar neque laoreet suspendisse interdum consectetur. +Tempor nec feugiat nisl pretium. Sit amet consectetur adipiscing elit. +Cras semper auctor neque vitae tempus quam pellentesque. +Laoreet non curabitur gravida arcu ac tortor dignissim. +Sed nisi lacus sed viverra tellus in. +Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. + +Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. +Interdum posuere lorem ipsum dolor sit amet consectetur. +Porta non pulvinar neque laoreet suspendisse interdum. +Fames ac turpis egestas integer eget aliquet nibh praesent. +Congue nisi vitae suscipit tellus mauris a diam maecenas sed. +Nec ultrices dui sapien eget mi proin sed libero enim. +Tellus rutrum tellus pellentesque eu tincidunt. +Ultrices eros in cursus turpis massa tincidunt dui ut ornare. +Arcu cursus vitae congue mauris rhoncus aenean vel elit scelerisque. +Viverra mauris in aliquam sem fringilla ut. +Vulputate eu scelerisque felis imperdiet proin fermentum leo. +Cursus risus at ultrices mi tempus. +Laoreet id donec ultrices tincidunt arcu non sodales. +Amet dictum sit amet justo donec enim. +Hac habitasse platea dictumst vestibulum rhoncus est pellentesque. +Facilisi cras fermentum odio eu feugiat. +Elit ut aliquam purus sit amet luctus venenatis lectus. +Dignissim enim sit amet venenatis urna cursus. +Amet consectetur adipiscing elit ut aliquam purus. +Elementum pulvinar etiam non quam lacus suspendisse. + +Quisque id diam vel quam. Id porta nibh venenatis cras sed felis eget velit aliquet. Sagittis aliquam malesuada bibendum arcu. Libero id faucibus nisl tincidunt eget nullam non. Sed elementum tempus egestas sed sed risus pretium quam vulputate. Turpis egestas maecenas pharetra convallis. Arcu cursus vitae congue mauris rhoncus aenean vel. Augue ut lectus arcu bibendum. Scelerisque varius morbi enim nunc faucibus a pellentesque. Mattis pellentesque id nibh tortor id aliquet lectus proin nibh. In aliquam sem fringilla ut. Urna et pharetra pharetra massa massa ultricies mi. Enim nulla aliquet porttitor lacus luctus accumsan tortor posuere. Malesuada fames ac turpis egestas integer. Venenatis tellus in metus vulputate eu scelerisque felis. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. + +Quam elementum pulvinar etiam non quam lacus suspendisse faucibus. Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Risus nec feugiat in fermentum posuere urna. Vestibulum lorem sed risus ultricies. Egestas maecenas pharetra convallis posuere morbi. Egestas tellus rutrum tellus pellentesque. Pulvinar etiam non quam lacus suspendisse faucibus. Lectus proin nibh nisl condimentum id venenatis a condimentum. Adipiscing elit pellentesque habitant morbi tristique senectus et netus. Nunc id cursus metus aliquam eleifend. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Donec ultrices tincidunt arcu non sodales neque sodales ut etiam. Suspendisse sed nisi lacus sed viverra tellus in hac habitasse. Nunc scelerisque viverra mauris in aliquam sem fringilla. +⏎(B ⏎ [?2004h]0;fish /home/thomas/Projects/zellij(B +zellij on  mouse-support [?] is 📦 v0.14.0 via 🦀 v1.53.0-beta.3  +❯  \ No newline at end of file diff --git a/zellij-client/Cargo.toml b/zellij-client/Cargo.toml index 9b04104b..4ca49bcc 100644 --- a/zellij-client/Cargo.toml +++ b/zellij-client/Cargo.toml @@ -9,6 +9,7 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +mio = "0.7.11" termbg = "0.2.3" zellij-utils = { path = "../zellij-utils/", version = "0.14.0" } diff --git a/zellij-client/src/input_handler.rs b/zellij-client/src/input_handler.rs index e563e345..f02b5ad8 100644 --- a/zellij-client/src/input_handler.rs +++ b/zellij-client/src/input_handler.rs @@ -1,6 +1,12 @@ //! Main input logic. -use zellij_utils::{termion, zellij_tile}; +use zellij_utils::{ + input::{ + mouse::{MouseButton, MouseEvent}, + options::Options, + }, + termion, zellij_tile, +}; use crate::{os_input_output::ClientOsApi, ClientInstruction, CommandIsExecuting}; use zellij_utils::{ @@ -20,6 +26,7 @@ struct InputHandler { mode: InputMode, os_input: Box, config: Config, + options: Options, command_is_executing: CommandIsExecuting, send_client_instructions: SenderWithContext, should_exit: bool, @@ -32,6 +39,7 @@ impl InputHandler { os_input: Box, command_is_executing: CommandIsExecuting, config: Config, + options: Options, send_client_instructions: SenderWithContext, mode: InputMode, ) -> Self { @@ -39,6 +47,7 @@ impl InputHandler { mode, os_input, config, + options, command_is_executing, send_client_instructions, should_exit: false, @@ -54,6 +63,10 @@ impl InputHandler { let alt_left_bracket = vec![27, 91]; let bracketed_paste_start = vec![27, 91, 50, 48, 48, 126]; // \u{1b}[200~ let bracketed_paste_end = vec![27, 91, 50, 48, 49, 126]; // \u{1b}[201 + + if !self.options.disable_mouse_mode { + self.os_input.enable_mouse(); + } loop { if self.should_exit { break; @@ -66,6 +79,10 @@ impl InputHandler { let key = cast_termion_key(key); self.handle_key(&key, raw_bytes); } + termion::event::Event::Mouse(me) => { + let mouse_event = zellij_utils::input::mouse::MouseEvent::from(me); + self.handle_mouse_event(&mouse_event); + } termion::event::Event::Unsupported(unsupported_key) => { // we have to do this because of a bug in termion // this should be a key event and not an unsupported event @@ -82,10 +99,6 @@ impl InputHandler { self.handle_unknown_key(raw_bytes); } } - termion::event::Event::Mouse(_) => { - // Mouse events aren't implemented yet, - // use a NoOp untill then. - } }, Err(err) => panic!("Encountered read error: {:?}", err), } @@ -117,6 +130,30 @@ impl InputHandler { } } } + fn handle_mouse_event(&mut self, mouse_event: &MouseEvent) { + match *mouse_event { + MouseEvent::Press(button, point) => match button { + MouseButton::WheelUp => { + self.dispatch_action(Action::ScrollUpAt(point)); + } + MouseButton::WheelDown => { + self.dispatch_action(Action::ScrollDownAt(point)); + } + MouseButton::Left => { + self.dispatch_action(Action::LeftClick(point)); + } + _ => {} + }, + MouseEvent::Release(point) => { + self.dispatch_action(Action::MouseRelease(point)); + } + MouseEvent::Hold(point) => { + self.dispatch_action(Action::MouseHold(point)); + self.os_input + .start_action_repeater(Action::MouseHold(point)); + } + } + } /// Dispatches an [`Action`]. /// @@ -180,6 +217,7 @@ impl InputHandler { pub(crate) fn input_loop( os_input: Box, config: Config, + options: Options, command_is_executing: CommandIsExecuting, send_client_instructions: SenderWithContext, default_mode: InputMode, @@ -188,6 +226,7 @@ pub(crate) fn input_loop( os_input, command_is_executing, config, + options, send_client_instructions, default_mode, ) diff --git a/zellij-client/src/lib.rs b/zellij-client/src/lib.rs index 5b409e75..f3e42a74 100644 --- a/zellij-client/src/lib.rs +++ b/zellij-client/src/lib.rs @@ -187,6 +187,7 @@ pub fn start_client( input_loop( os_input, config, + config_options, command_is_executing, send_client_instructions, default_mode, @@ -242,6 +243,7 @@ pub fn start_client( os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let restore_snapshot = "\u{1b}[?1049l"; + os_input.disable_mouse(); let error = format!( "{}\n{}{}", goto_start_of_last_line, restore_snapshot, backtrace @@ -300,6 +302,7 @@ pub fn start_client( goto_start_of_last_line, restore_snapshot, reset_style, show_cursor, exit_msg ); + os_input.disable_mouse(); os_input.unset_raw_mode(0); let mut stdout = os_input.get_stdout_writer(); let _ = stdout.write(goodbye_message.as_bytes()).unwrap(); diff --git a/zellij-client/src/os_input_output.rs b/zellij-client/src/os_input_output.rs index 405422ab..7242bf7a 100644 --- a/zellij-client/src/os_input_output.rs +++ b/zellij-client/src/os_input_output.rs @@ -1,14 +1,16 @@ -use zellij_utils::{interprocess, libc, nix, signal_hook, zellij_tile}; +use zellij_utils::input::actions::Action; +use zellij_utils::{interprocess, libc, nix, signal_hook, termion, zellij_tile}; use interprocess::local_socket::LocalSocketStream; +use mio::{unix::SourceFd, Events, Interest, Poll, Token}; use nix::pty::Winsize; use nix::sys::termios; use signal_hook::{consts::signal::*, iterator::Signals}; -use std::io; use std::io::prelude::*; use std::os::unix::io::RawFd; use std::path::Path; use std::sync::{Arc, Mutex}; +use std::{io, time}; use zellij_tile::data::Palette; use zellij_utils::{ errors::ErrorContext, @@ -60,6 +62,7 @@ pub struct ClientOsInputOutput { orig_termios: Arc>, send_instructions_to_server: Arc>>>, receive_instructions_from_server: Arc>>>, + mouse_term: Arc>>>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -88,6 +91,10 @@ pub trait ClientOsApi: Send + Sync { /// Establish a connection with the server socket. fn connect_to_server(&self, path: &Path); fn load_palette(&self) -> Palette; + fn enable_mouse(&self); + fn disable_mouse(&self); + // Repeatedly send action, until stdin is readable again + fn start_action_repeater(&mut self, action: Action); } impl ClientOsApi for ClientOsInputOutput { @@ -180,6 +187,31 @@ impl ClientOsApi for ClientOsInputOutput { // }; default_palette() } + fn enable_mouse(&self) { + let mut mouse_term = self.mouse_term.lock().unwrap(); + if mouse_term.is_none() { + *mouse_term = Some(termion::input::MouseTerminal::from(std::io::stdout())); + } + } + + fn disable_mouse(&self) { + let mut mouse_term = self.mouse_term.lock().unwrap(); + if mouse_term.is_some() { + *mouse_term = None; + } + } + + fn start_action_repeater(&mut self, action: Action) { + let mut poller = StdinPoller::default(); + + loop { + let ready = poller.ready(); + if ready { + break; + } + self.send_to_server(ClientToServerMsg::Action(action.clone())); + } + } } impl Clone for Box { @@ -191,9 +223,54 @@ impl Clone for Box { pub fn get_client_os_input() -> Result { let current_termios = termios::tcgetattr(0)?; let orig_termios = Arc::new(Mutex::new(current_termios)); + let mouse_term = Arc::new(Mutex::new(None)); Ok(ClientOsInputOutput { orig_termios, send_instructions_to_server: Arc::new(Mutex::new(None)), receive_instructions_from_server: Arc::new(Mutex::new(None)), + mouse_term, }) } + +pub const DEFAULT_STDIN_POLL_TIMEOUT_MS: u64 = 10; + +struct StdinPoller { + poll: Poll, + events: Events, + timeout: time::Duration, +} + +impl StdinPoller { + // use mio poll to check if stdin is readable without blocking + fn ready(&mut self) -> bool { + self.poll + .poll(&mut self.events, Some(self.timeout)) + .expect("could not poll stdin for readiness"); + for event in &self.events { + if event.token() == Token(0) && event.is_readable() { + return true; + } + } + false + } +} + +impl Default for StdinPoller { + fn default() -> Self { + let stdin = 0; + let mut stdin_fd = SourceFd(&stdin); + let events = Events::with_capacity(128); + let poll = Poll::new().unwrap(); + poll.registry() + .register(&mut stdin_fd, Token(0), Interest::READABLE) + .expect("could not create stdin poll"); + + let timeout = time::Duration::from_millis(DEFAULT_STDIN_POLL_TIMEOUT_MS); + + Self { + poll, + events, + timeout, + } + } +} diff --git a/zellij-client/src/unit/input_handler_tests.rs b/zellij-client/src/unit/input_handler_tests.rs index bf9bc45a..f40344fe 100644 --- a/zellij-client/src/unit/input_handler_tests.rs +++ b/zellij-client/src/unit/input_handler_tests.rs @@ -1,6 +1,7 @@ use super::input_loop; use zellij_utils::input::actions::{Action, Direction}; use zellij_utils::input::config::Config; +use zellij_utils::input::options::Options; use zellij_utils::pane_size::PositionAndSize; use zellij_utils::zellij_tile::data::Palette; @@ -137,6 +138,9 @@ impl ClientOsApi for FakeClientOsApi { fn load_palette(&self) -> Palette { unimplemented!() } + fn enable_mouse(&self) {} + fn disable_mouse(&self) {} + fn start_action_repeater(&mut self, _action: Action) {} } fn extract_actions_sent_to_server( @@ -162,6 +166,7 @@ pub fn quit_breaks_input_loop() { command_is_executing.clone(), )); let config = Config::from_default_assets().unwrap(); + let options = Options::default(); let (send_client_instructions, _receive_client_instructions): ChannelWithContext< ClientInstruction, @@ -172,6 +177,7 @@ pub fn quit_breaks_input_loop() { drop(input_loop( client_os_api, config, + options, command_is_executing, send_client_instructions, default_mode, @@ -196,6 +202,7 @@ pub fn move_focus_left_in_pane_mode() { command_is_executing.clone(), )); let config = Config::from_default_assets().unwrap(); + let options = Options::default(); let (send_client_instructions, _receive_client_instructions): ChannelWithContext< ClientInstruction, @@ -206,6 +213,7 @@ pub fn move_focus_left_in_pane_mode() { drop(input_loop( client_os_api, config, + options, command_is_executing, send_client_instructions, default_mode, @@ -234,6 +242,7 @@ pub fn bracketed_paste() { command_is_executing.clone(), )); let config = Config::from_default_assets().unwrap(); + let options = Options::default(); let (send_client_instructions, _receive_client_instructions): ChannelWithContext< ClientInstruction, @@ -244,6 +253,7 @@ pub fn bracketed_paste() { drop(input_loop( client_os_api, config, + options, command_is_executing, send_client_instructions, default_mode, diff --git a/zellij-server/Cargo.toml b/zellij-server/Cargo.toml index 1a99bb40..7408eb8b 100644 --- a/zellij-server/Cargo.toml +++ b/zellij-server/Cargo.toml @@ -11,6 +11,7 @@ license = "MIT" [dependencies] ansi_term = "0.12.1" async-trait = "0.1.50" +base64 = "0.13.0" daemonize = "0.4.1" serde_json = "1.0" unicode-width = "0.1.8" diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index 7ea62ed6..27eea695 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -7,7 +7,7 @@ use std::{ str, }; -use zellij_utils::{vte, zellij_tile}; +use zellij_utils::{position::Position, vte, zellij_tile}; const TABSTOP_WIDTH: usize = 8; // TODO: is this always right? const SCROLL_BACK: usize = 10_000; @@ -21,6 +21,8 @@ use crate::panes::terminal_character::{ EMPTY_TERMINAL_CHARACTER, }; +use super::selection::Selection; + // this was copied verbatim from alacritty fn parse_number(input: &[u8]) -> Option { if input.is_empty() { @@ -315,6 +317,7 @@ pub struct Grid { pub width: usize, pub height: usize, pub pending_messages_to_pty: Vec>, + pub selection: Selection, } impl Debug for Grid { @@ -354,6 +357,7 @@ impl Grid { pending_messages_to_pty: vec![], colors, output_buffer: Default::default(), + selection: Default::default(), } } pub fn render_full_viewport(&mut self) { @@ -473,6 +477,7 @@ impl Grid { self.lines_below.insert(0, line_to_push_down); let line_to_insert_at_viewport_top = self.lines_above.pop_back().unwrap(); self.viewport.insert(0, line_to_insert_at_viewport_top); + self.selection.move_down(1); } self.output_buffer.update_all_lines(); } @@ -488,10 +493,12 @@ impl Grid { } let line_to_insert_at_viewport_bottom = self.lines_below.remove(0); self.viewport.push(line_to_insert_at_viewport_bottom); + self.selection.move_up(1); self.output_buffer.update_all_lines(); } } pub fn change_size(&mut self, new_rows: usize, new_columns: usize) { + self.selection.reset(); if new_columns != self.width { let mut cursor_canonical_line_index = self.cursor_canonical_line_index(); let cursor_index_in_canonical_line = self.cursor_index_in_canonical_line(); @@ -764,6 +771,7 @@ impl Grid { Some(self.width), None, ); + self.selection.move_up(1); self.output_buffer.update_all_lines(); } else { self.cursor.y += 1; @@ -840,6 +848,7 @@ impl Grid { ); let wrapped_row = Row::new(self.width); self.viewport.push(wrapped_row); + self.selection.move_up(1); self.output_buffer.update_all_lines(); } else { self.cursor.y += 1; @@ -1135,6 +1144,104 @@ impl Grid { fn set_preceding_character(&mut self, terminal_character: TerminalCharacter) { self.preceding_char = Some(terminal_character); } + pub fn start_selection(&mut self, start: &Position) { + let old_selection = self.selection.clone(); + self.selection.start(*start); + self.update_selected_lines(&old_selection, &self.selection.clone()); + self.mark_for_rerender(); + } + pub fn update_selection(&mut self, to: &Position) { + let old_selection = self.selection.clone(); + self.selection.to(*to); + self.update_selected_lines(&old_selection, &self.selection.clone()); + self.mark_for_rerender(); + } + + pub fn end_selection(&mut self, end: Option<&Position>) { + let old_selection = self.selection.clone(); + self.selection.end(end); + self.update_selected_lines(&old_selection, &self.selection.clone()); + self.mark_for_rerender(); + } + + pub fn reset_selection(&mut self) { + let old_selection = self.selection.clone(); + self.selection.reset(); + self.update_selected_lines(&old_selection, &self.selection.clone()); + self.mark_for_rerender(); + } + pub fn get_selected_text(&self) -> Option { + if self.selection.is_empty() { + return None; + } + let mut selection: Vec = vec![]; + + let sorted_selection = self.selection.sorted(); + let (start, end) = (sorted_selection.start, sorted_selection.end); + + for l in sorted_selection.line_indices() { + let mut line_selection = String::new(); + + // on the first line of the selection, use the selection start column + // otherwise, start at the beginning of the line + let start_column = if l == start.line.0 { start.column.0 } else { 0 }; + + // same thing on the last line, but with the selection end column + let end_column = if l == end.line.0 { + end.column.0 + } else { + self.width + }; + + if start_column == end_column { + continue; + } + + let empty_row = Row::from_columns(vec![EMPTY_TERMINAL_CHARACTER; self.width]); + + // get the row from lines_above, viewport, or lines below depending on index + let row = if l < 0 { + let offset_from_end = l.abs(); + &self.lines_above[self + .lines_above + .len() + .saturating_sub(offset_from_end as usize)] + } else if l >= 0 && (l as usize) < self.viewport.len() { + &self.viewport[l as usize] + } else if (l as usize) < self.height { + // index is in viewport but there is no line + &empty_row + } else { + &self.lines_below[(l as usize) - self.viewport.len()] + }; + + let excess_width = row.excess_width(); + let mut line: Vec = row.columns.iter().copied().collect(); + // pad line + line.resize( + self.width.saturating_sub(excess_width), + EMPTY_TERMINAL_CHARACTER, + ); + + let mut terminal_col = 0; + for terminal_character in line { + if (start_column..end_column).contains(&terminal_col) { + line_selection.push(terminal_character.character); + } + + terminal_col += terminal_character.width; + } + selection.push(String::from(line_selection.trim_end())); + } + + Some(selection.join("\n")) + } + + fn update_selected_lines(&mut self, old_selection: &Selection, new_selection: &Selection) { + for l in old_selection.diff(new_selection, self.height) { + self.output_buffer.update_line(l as usize); + } + } } impl Perform for Grid { diff --git a/zellij-server/src/panes/mod.rs b/zellij-server/src/panes/mod.rs index 187b364d..3830b242 100644 --- a/zellij-server/src/panes/mod.rs +++ b/zellij-server/src/panes/mod.rs @@ -1,5 +1,6 @@ mod grid; mod plugin_pane; +mod selection; mod terminal_character; mod terminal_pane; diff --git a/zellij-server/src/panes/selection.rs b/zellij-server/src/panes/selection.rs new file mode 100644 index 00000000..f01cf94c --- /dev/null +++ b/zellij-server/src/panes/selection.rs @@ -0,0 +1,135 @@ +use std::{collections::HashSet, ops::Range}; + +use zellij_utils::position::Position; + +// The selection is empty when start == end +// it includes the character at start, and everything before end. +#[derive(Debug, Clone)] +pub struct Selection { + pub start: Position, + pub end: Position, + active: bool, // used to handle moving the selection up and down +} + +impl Default for Selection { + fn default() -> Self { + Self { + start: Position::new(0, 0), + end: Position::new(0, 0), + active: false, + } + } +} + +impl Selection { + pub fn start(&mut self, start: Position) { + self.active = true; + self.start = start; + self.end = start; + } + + pub fn to(&mut self, to: Position) { + self.end = to + } + + pub fn end(&mut self, to: Option<&Position>) { + self.active = false; + if let Some(to) = to { + self.end = *to + } + } + + pub fn contains(&self, row: usize, col: usize) -> bool { + let row = row as isize; + let (start, end) = if self.start <= self.end { + (self.start, self.end) + } else { + (self.end, self.start) + }; + + if (start.line.0) < row && row < end.line.0 { + return true; + } + if start.line == end.line { + return row == start.line.0 && start.column.0 <= col && col < end.column.0; + } + if start.line.0 == row && col >= start.column.0 { + return true; + } + end.line.0 == row && col < end.column.0 + } + + pub fn is_empty(&self) -> bool { + self.start == self.end + } + + pub fn reset(&mut self) { + self.start = Position::new(0, 0); + self.end = self.start; + } + + pub fn sorted(&self) -> Self { + let (start, end) = if self.start <= self.end { + (self.start, self.end) + } else { + (self.end, self.start) + }; + Self { + start, + end, + active: self.active, + } + } + + pub fn line_indices(&self) -> std::ops::RangeInclusive { + let sorted = self.sorted(); + sorted.start.line.0..=sorted.end.line.0 + } + + pub fn move_up(&mut self, lines: usize) { + self.start.line.0 -= lines as isize; + if !self.active { + self.end.line.0 -= lines as isize; + } + } + + pub fn move_down(&mut self, lines: usize) { + self.start.line.0 += lines as isize; + if !self.active { + self.end.line.0 += lines as isize; + } + } + + /// Return an iterator over the line indices, up to max, that are not present in both self and other, + /// except for the indices of the first and last line of both self and s2, that are always included. + pub fn diff(&self, other: &Self, max: usize) -> impl Iterator { + let mut lines_to_update = HashSet::new(); + + lines_to_update.insert(self.start.line.0); + lines_to_update.insert(self.end.line.0); + lines_to_update.insert(other.start.line.0); + lines_to_update.insert(other.end.line.0); + + let old_lines: HashSet = self.get_visible_indices(max).collect(); + let new_lines: HashSet = other.get_visible_indices(max).collect(); + + old_lines.symmetric_difference(&new_lines).for_each(|&l| { + let _ = lines_to_update.insert(l); + }); + + lines_to_update + .into_iter() + .filter(move |&l| l >= 0 && l < max as isize) + } + + fn get_visible_indices(&self, max: usize) -> Range { + let Selection { start, end, .. } = self.sorted(); + let start = start.line.0.max(0); + let end = end.line.0.min(max as isize); + start..end + } +} + +#[cfg(test)] +#[path = "./unit/selection_tests.rs"] +mod selection_tests; diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index 0abc7a5a..087817d6 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -1,11 +1,14 @@ +use zellij_utils::position::Position; +use zellij_utils::zellij_tile::prelude::PaletteColor; use zellij_utils::{vte, zellij_tile}; use std::fmt::Debug; use std::os::unix::io::RawFd; -use std::time::Instant; +use std::time::{self, Instant}; use zellij_tile::data::Palette; use zellij_utils::pane_size::PositionAndSize; +use crate::panes::AnsiCode; use crate::panes::{ grid::Grid, terminal_character::{ @@ -15,6 +18,8 @@ use crate::panes::{ use crate::pty::VteBytes; use crate::tab::Pane; +pub const SELECTION_SCROLL_INTERVAL_MS: u64 = 10; + #[derive(PartialEq, Eq, Ord, PartialOrd, Hash, Clone, Copy, Debug)] pub enum PaneId { Terminal(RawFd), @@ -30,6 +35,7 @@ pub struct TerminalPane { pub active_at: Instant, pub colors: Palette, vte_parser: vte::Parser, + selection_scrolled_at: time::Instant, } impl Pane for TerminalPane { @@ -181,11 +187,22 @@ impl Pane for TerminalPane { )); // goto row/col and reset styles let mut chunk_width = character_chunk.x; - for t_character in terminal_characters { + for mut t_character in terminal_characters { + // adjust the background of currently selected characters + // doing it here is much easier than in grid + if self.grid.selection.contains(character_chunk.y, chunk_width) { + let color = match self.colors.bg { + PaletteColor::Rgb(rgb) => AnsiCode::RgbCode(rgb), + PaletteColor::EightBit(col) => AnsiCode::ColorIndex(col), + }; + + t_character.styles = t_character.styles.background(Some(color)); + } chunk_width += t_character.width; if chunk_width > max_width { break; } + if let Some(new_styles) = character_styles.update_and_return_diff(&t_character.styles) { @@ -285,6 +302,41 @@ impl Pane for TerminalPane { fn drain_messages_to_pty(&mut self) -> Vec> { self.grid.pending_messages_to_pty.drain(..).collect() } + + fn start_selection(&mut self, start: &Position) { + self.grid.start_selection(start); + self.set_should_render(true); + } + + fn update_selection(&mut self, to: &Position) { + let should_scroll = self.selection_scrolled_at.elapsed() + >= time::Duration::from_millis(SELECTION_SCROLL_INTERVAL_MS); + // TODO: check how far up/down mouse is relative to pane, to increase scroll lines? + if to.line.0 < 0 && should_scroll { + self.grid.scroll_up_one_line(); + self.selection_scrolled_at = time::Instant::now(); + } else if to.line.0 as usize >= self.grid.height && should_scroll { + self.grid.scroll_down_one_line(); + self.selection_scrolled_at = time::Instant::now(); + } else if to.line.0 >= 0 && (to.line.0 as usize) < self.grid.height { + self.grid.update_selection(to); + } + + self.set_should_render(true); + } + + fn end_selection(&mut self, end: Option<&Position>) { + self.grid.end_selection(end); + self.set_should_render(true); + } + + fn reset_selection(&mut self) { + self.grid.reset_selection(); + } + + fn get_selected_text(&self) -> Option { + self.grid.get_selected_text() + } } impl TerminalPane { @@ -299,6 +351,7 @@ impl TerminalPane { vte_parser: vte::Parser::new(), active_at: Instant::now(), colors: palette, + selection_scrolled_at: time::Instant::now(), } } pub fn get_x(&self) -> usize { diff --git a/zellij-server/src/panes/unit/grid_tests.rs b/zellij-server/src/panes/unit/grid_tests.rs index 048d3d0a..0facc066 100644 --- a/zellij-server/src/panes/unit/grid_tests.rs +++ b/zellij-server/src/panes/unit/grid_tests.rs @@ -1,6 +1,6 @@ use super::super::Grid; use ::insta::assert_snapshot; -use zellij_utils::{vte, zellij_tile::data::Palette}; +use zellij_utils::{position::Position, vte, zellij_tile::data::Palette}; fn read_fixture(fixture_name: &str) -> Vec { let mut path_to_file = std::path::PathBuf::new(); @@ -556,6 +556,68 @@ fn wrap_wide_characters_at_the_end_of_the_line() { assert_snapshot!(format!("{:?}", grid)); } +#[test] +fn copy_selected_text_from_viewport() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(27, 125, Palette::default()); + let fixture_name = "grid_copy"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + + grid.start_selection(&Position::new(23, 6)); + // check for widechar, 📦 occupies columns 34, 35, and gets selected even if only the first column is selected + grid.end_selection(Some(&Position::new(25, 35))); + let text = grid.get_selected_text(); + assert_eq!( + text.unwrap(), + "mauris in aliquam sem fringilla.\n\nzellij on  mouse-support [?] is 📦" + ); +} + +#[test] +fn copy_selected_text_from_lines_above() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(27, 125, Palette::default()); + let fixture_name = "grid_copy"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + + grid.start_selection(&Position::new(-2, 10)); + // check for widechar, 📦 occupies columns 34, 35, and gets selected even if only the first column is selected + grid.end_selection(Some(&Position::new(2, 8))); + let text = grid.get_selected_text(); + assert_eq!( + text.unwrap(), + "eu scelerisque felis imperdiet proin fermentum leo.\nCursus risus at ultrices mi tempus.\nLaoreet id donec ultrices tincidunt arcu non sodales.\nAmet dictum sit amet justo donec enim.\nHac habi" + ); +} + +#[test] +fn copy_selected_text_from_lines_below() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(27, 125, Palette::default()); + let fixture_name = "grid_copy"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + + grid.move_viewport_up(40); + + grid.start_selection(&Position::new(63, 6)); + // check for widechar, 📦 occupies columns 34, 35, and gets selected even if only the first column is selected + grid.end_selection(Some(&Position::new(65, 35))); + let text = grid.get_selected_text(); + assert_eq!( + text.unwrap(), + "mauris in aliquam sem fringilla.\n\nzellij on  mouse-support [?] is 📦" + ); +} + /* * These tests below are general compatibility tests for non-trivial scenarios running in the terminal. * They use fake TTY input replicated from these scenarios. diff --git a/zellij-server/src/panes/unit/selection_tests.rs b/zellij-server/src/panes/unit/selection_tests.rs new file mode 100644 index 00000000..1b41f522 --- /dev/null +++ b/zellij-server/src/panes/unit/selection_tests.rs @@ -0,0 +1,197 @@ +use super::*; + +#[test] +fn selection_start() { + let mut selection = Selection::default(); + selection.start(Position::new(10, 10)); + + assert!(selection.active); + assert_eq!(selection.start, Position::new(10, 10)); + assert_eq!(selection.end, Position::new(10, 10)); +} + +#[test] +fn selection_to() { + let mut selection = Selection::default(); + selection.start(Position::new(10, 10)); + let is_active = selection.active; + selection.to(Position::new(20, 30)); + + assert_eq!(selection.active, is_active); + assert_eq!(selection.end, Position::new(20, 30)); +} + +#[test] +fn selection_end_with_position() { + let mut selection = Selection::default(); + selection.start(Position::new(10, 10)); + selection.end(Some(&Position::new(20, 30))); + + assert!(!selection.active); + assert_eq!(selection.end, Position::new(20, 30)); +} + +#[test] +fn selection_end_without_position() { + let mut selection = Selection::default(); + selection.start(Position::new(10, 10)); + selection.to(Position::new(15, 100)); + selection.end(None); + + assert!(!selection.active); + assert_eq!(selection.end, Position::new(15, 100)); +} + +#[test] +fn contains() { + struct TestCase<'a> { + selection: &'a Selection, + position: Position, + result: bool, + } + + let selection = Selection { + start: Position::new(10, 5), + end: Position::new(40, 20), + active: false, + }; + + let test_cases = vec![ + TestCase { + selection: &selection, + position: Position::new(10, 5), + result: true, + }, + TestCase { + selection: &selection, + position: Position::new(10, 4), + result: false, + }, + TestCase { + selection: &selection, + position: Position::new(20, 0), + result: true, + }, + TestCase { + selection: &selection, + position: Position::new(20, 21), + result: true, + }, + TestCase { + selection: &selection, + position: Position::new(40, 19), + result: true, + }, + TestCase { + selection: &selection, + position: Position::new(40, 20), + result: false, + }, + ]; + + for test_case in test_cases { + let result = test_case.selection.contains( + test_case.position.line.0 as usize, + test_case.position.column.0, + ); + assert_eq!(result, test_case.result) + } +} + +#[test] +fn sorted() { + let selection = Selection { + start: Position::new(1, 1), + end: Position::new(10, 2), + active: false, + }; + let sorted_selection = selection.sorted(); + assert_eq!(selection.start, sorted_selection.start); + assert_eq!(selection.end, sorted_selection.end); + + let selection = Selection { + start: Position::new(10, 2), + end: Position::new(1, 1), + active: false, + }; + let sorted_selection = selection.sorted(); + assert_eq!(selection.end, sorted_selection.start); + assert_eq!(selection.start, sorted_selection.end); +} + +#[test] +fn line_indices() { + let selection = Selection { + start: Position::new(1, 1), + end: Position::new(10, 2), + active: false, + }; + + assert_eq!(selection.line_indices(), (1..=10)) +} + +#[test] +fn move_up_inactive() { + let start = Position::new(10, 1); + let end = Position::new(20, 2); + let mut inactive_selection = Selection { + start, + end, + active: false, + }; + + inactive_selection.move_up(2); + assert_eq!(inactive_selection.start, Position::new(8, 1)); + assert_eq!(inactive_selection.end, Position::new(18, 2)); + inactive_selection.move_up(10); + assert_eq!(inactive_selection.start, Position::new(-2, 1)); + assert_eq!(inactive_selection.end, Position::new(8, 2)); +} + +#[test] +fn move_up_active() { + let start = Position::new(10, 1); + let end = Position::new(20, 2); + let mut inactive_selection = Selection { + start, + end, + active: true, + }; + + inactive_selection.move_up(2); + assert_eq!(inactive_selection.start, Position::new(8, 1)); + assert_eq!(inactive_selection.end, end); +} + +#[test] +fn move_down_inactive() { + let start = Position::new(10, 1); + let end = Position::new(20, 2); + let mut inactive_selection = Selection { + start, + end, + active: false, + }; + + inactive_selection.move_down(2); + assert_eq!(inactive_selection.start, Position::new(12, 1)); + assert_eq!(inactive_selection.end, Position::new(22, 2)); + inactive_selection.move_down(10); + assert_eq!(inactive_selection.start, Position::new(22, 1)); + assert_eq!(inactive_selection.end, Position::new(32, 2)); +} + +#[test] +fn move_down_active() { + let start = Position::new(10, 1); + let end = Position::new(20, 2); + let mut inactive_selection = Selection { + start, + end, + active: true, + }; + + inactive_selection.move_down(2); + assert_eq!(inactive_selection.start, Position::new(12, 1)); + assert_eq!(inactive_selection.end, end); +} diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs index 7839f796..22d843f0 100644 --- a/zellij-server/src/route.rs +++ b/zellij-server/src/route.rs @@ -109,12 +109,24 @@ fn route_action( .send_to_screen(ScreenInstruction::ScrollUp) .unwrap(); } + Action::ScrollUpAt(point) => { + session + .senders + .send_to_screen(ScreenInstruction::ScrollUpAt(point)) + .unwrap(); + } Action::ScrollDown => { session .senders .send_to_screen(ScreenInstruction::ScrollDown) .unwrap(); } + Action::ScrollDownAt(point) => { + session + .senders + .send_to_screen(ScreenInstruction::ScrollDownAt(point)) + .unwrap(); + } Action::PageScrollUp => { session .senders @@ -214,6 +226,30 @@ fn route_action( to_server.send(ServerInstruction::DetachSession).unwrap(); should_break = true; } + Action::LeftClick(point) => { + session + .senders + .send_to_screen(ScreenInstruction::LeftClick(point)) + .unwrap(); + } + Action::MouseRelease(point) => { + session + .senders + .send_to_screen(ScreenInstruction::MouseRelease(point)) + .unwrap(); + } + Action::MouseHold(point) => { + session + .senders + .send_to_screen(ScreenInstruction::MouseHold(point)) + .unwrap(); + } + Action::Copy => { + session + .senders + .send_to_screen(ScreenInstruction::Copy) + .unwrap(); + } Action::NoOp => {} } should_break diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 88fb7848..9005d795 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -5,7 +5,7 @@ use std::os::unix::io::RawFd; use std::str; use std::sync::{Arc, RwLock}; -use zellij_utils::{input::layout::Layout, zellij_tile}; +use zellij_utils::{input::layout::Layout, position::Position, zellij_tile}; use crate::{ panes::PaneId, @@ -47,7 +47,9 @@ pub(crate) enum ScreenInstruction { MoveFocusRightOrNextTab, Exit, ScrollUp, + ScrollUpAt(Position), ScrollDown, + ScrollDownAt(Position), PageScrollUp, PageScrollDown, ClearScroll, @@ -68,6 +70,10 @@ pub(crate) enum ScreenInstruction { UpdateTabName(Vec), TerminalResize(PositionAndSize), ChangeMode(ModeInfo), + LeftClick(Position), + MouseRelease(Position), + MouseHold(Position), + Copy, } impl From<&ScreenInstruction> for ScreenContext { @@ -119,6 +125,12 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenInstruction::TerminalResize(_) => ScreenContext::TerminalResize, ScreenInstruction::ChangeMode(_) => ScreenContext::ChangeMode, ScreenInstruction::ToggleActiveSyncTab => ScreenContext::ToggleActiveSyncTab, + ScreenInstruction::ScrollUpAt(_) => ScreenContext::ScrollUpAt, + ScreenInstruction::ScrollDownAt(_) => ScreenContext::ScrollDownAt, + ScreenInstruction::LeftClick(_) => ScreenContext::LeftClick, + ScreenInstruction::MouseRelease(_) => ScreenContext::MouseRelease, + ScreenInstruction::MouseHold(_) => ScreenContext::MouseHold, + ScreenInstruction::Copy => ScreenContext::Copy, } } } @@ -547,12 +559,24 @@ pub(crate) fn screen_thread_main( .unwrap() .scroll_active_terminal_up(); } + ScreenInstruction::ScrollUpAt(point) => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_terminal_up(&point, 3); + } ScreenInstruction::ScrollDown => { screen .get_active_tab_mut() .unwrap() .scroll_active_terminal_down(); } + ScreenInstruction::ScrollDownAt(point) => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_terminal_down(&point, 3); + } ScreenInstruction::PageScrollUp => { screen .get_active_tab_mut() @@ -674,6 +698,27 @@ pub(crate) fn screen_thread_main( .toggle_sync_panes_is_active(); screen.update_tabs(); } + ScreenInstruction::LeftClick(point) => { + screen + .get_active_tab_mut() + .unwrap() + .handle_left_click(&point); + } + ScreenInstruction::MouseRelease(point) => { + screen + .get_active_tab_mut() + .unwrap() + .handle_mouse_release(&point); + } + ScreenInstruction::MouseHold(point) => { + screen + .get_active_tab_mut() + .unwrap() + .handle_mouse_hold(&point); + } + ScreenInstruction::Copy => { + screen.get_active_tab().unwrap().copy_selection(); + } ScreenInstruction::Exit => { break; } diff --git a/zellij-server/src/tab.rs b/zellij-server/src/tab.rs index 523f65df..68e7b7a6 100644 --- a/zellij-server/src/tab.rs +++ b/zellij-server/src/tab.rs @@ -1,7 +1,7 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized -use zellij_utils::{serde, zellij_tile}; +use zellij_utils::{position::Position, serde, zellij_tile}; #[cfg(not(feature = "parametric_resize_beta"))] use crate::ui::pane_resizer::PaneResizer; @@ -143,6 +143,19 @@ pub trait Pane { fn cursor_shape_csi(&self) -> String { "\u{1b}[0 q".to_string() // default to non blinking block } + fn contains(&self, position: &Position) -> bool { + match self.position_and_size_override() { + Some(position_and_size) => position_and_size.contains(position), + None => self.position_and_size().contains(position), + } + } + fn start_selection(&mut self, _start: &Position) {} + fn update_selection(&mut self, _position: &Position) {} + fn end_selection(&mut self, _end: Option<&Position>) {} + fn reset_selection(&mut self) {} + fn get_selected_text(&self) -> Option { + None + } fn right_boundary_x_coords(&self) -> usize { self.x() + self.columns() @@ -223,6 +236,12 @@ pub trait Pane { vec![] } fn render_full_viewport(&mut self) {} + fn relative_position(&self, position: &Position) -> Position { + match self.position_and_size_override() { + Some(position_and_size) => position.relative_to(&position_and_size), + None => position.relative_to(&self.position_and_size()), + } + } } impl Tab { @@ -2271,6 +2290,97 @@ impl Tab { active_terminal.clear_scroll(); } } + pub fn scroll_terminal_up(&mut self, point: &Position, lines: usize) { + if let Some(pane) = self.get_pane_at(point) { + pane.scroll_up(lines); + self.render(); + } + } + pub fn scroll_terminal_down(&mut self, point: &Position, lines: usize) { + if let Some(pane) = self.get_pane_at(point) { + pane.scroll_down(lines); + self.render(); + } + } + fn get_pane_at(&mut self, point: &Position) -> Option<&mut Box> { + if let Some(pane_id) = self.get_pane_id_at(point) { + self.panes.get_mut(&pane_id) + } else { + None + } + } + fn get_pane_id_at(&self, point: &Position) -> Option { + if self.fullscreen_is_active { + return self.get_active_pane_id(); + } + + self.get_selectable_panes() + .find(|(_, p)| p.contains(point)) + .map(|(&id, _)| id) + } + pub fn handle_left_click(&mut self, position: &Position) { + self.focus_pane_at(position); + + if let Some(pane) = self.get_pane_at(position) { + let relative_position = pane.relative_position(position); + pane.start_selection(&relative_position); + self.render(); + }; + } + fn focus_pane_at(&mut self, point: &Position) { + if let Some(clicked_pane) = self.get_pane_id_at(point) { + self.active_terminal = Some(clicked_pane); + self.render(); + } + } + pub fn handle_mouse_release(&mut self, position: &Position) { + let active_pane_id = self.get_active_pane_id(); + // on release, get the selected text from the active pane, and reset it's selection + let mut selected_text = None; + if active_pane_id != self.get_pane_id_at(position) { + if let Some(active_pane_id) = active_pane_id { + if let Some(active_pane) = self.panes.get_mut(&active_pane_id) { + active_pane.end_selection(None); + selected_text = active_pane.get_selected_text(); + active_pane.reset_selection(); + self.render(); + } + } + } else if let Some(pane) = self.get_pane_at(position) { + let relative_position = pane.relative_position(position); + pane.end_selection(Some(&relative_position)); + selected_text = pane.get_selected_text(); + pane.reset_selection(); + self.render(); + } + + if let Some(selected_text) = selected_text { + self.write_selection_to_clipboard(&selected_text); + } + } + pub fn handle_mouse_hold(&mut self, position: &Position) { + if let Some(active_pane_id) = self.get_active_pane_id() { + if let Some(active_pane) = self.panes.get_mut(&active_pane_id) { + let relative_position = active_pane.relative_position(position); + active_pane.update_selection(&relative_position); + } + } + self.render(); + } + + pub fn copy_selection(&self) { + let selected_text = self.get_active_pane().and_then(|p| p.get_selected_text()); + if let Some(selected_text) = selected_text { + self.write_selection_to_clipboard(&selected_text); + } + } + + fn write_selection_to_clipboard(&self, selection: &str) { + let output = format!("\u{1b}]52;c;{}\u{1b}\\", base64::encode(selection)); + self.senders + .send_to_server(ServerInstruction::Render(Some(output))) + .unwrap(); + } } #[cfg(test)] diff --git a/zellij-utils/src/errors.rs b/zellij-utils/src/errors.rs index b37a3a07..b32dd337 100644 --- a/zellij-utils/src/errors.rs +++ b/zellij-utils/src/errors.rs @@ -190,6 +190,7 @@ pub enum ScreenContext { SwitchFocus, FocusNextPane, FocusPreviousPane, + FocusPaneAt, MoveFocusLeft, MoveFocusLeftOrPreviousTab, MoveFocusDown, @@ -198,7 +199,9 @@ pub enum ScreenContext { MoveFocusRightOrNextTab, Exit, ScrollUp, + ScrollUpAt, ScrollDown, + ScrollDownAt, PageScrollUp, PageScrollDown, ClearScroll, @@ -219,6 +222,10 @@ pub enum ScreenContext { UpdateTabName, TerminalResize, ChangeMode, + LeftClick, + MouseRelease, + MouseHold, + Copy, } /// Stack call representations corresponding to the different types of [`PtyInstruction`]s. diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index 36fd93b1..ecd515a4 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -4,6 +4,8 @@ use super::command::RunCommandAction; use serde::{Deserialize, Serialize}; use zellij_tile::data::InputMode; +use crate::position::Position; + /// The four directions (left, right, up, down). #[derive(Eq, Clone, Debug, PartialEq, Deserialize, Serialize)] pub enum Direction { @@ -39,8 +41,12 @@ pub enum Action { MoveFocusOrTab(Direction), /// Scroll up in focus pane. ScrollUp, + /// Scroll up at point + ScrollUpAt(Position), /// Scroll down in focus pane. ScrollDown, + /// Scroll down at point + ScrollDownAt(Position), /// Scroll up one page in focus pane. PageScrollUp, /// Scroll down one page in focus pane. @@ -70,4 +76,8 @@ pub enum Action { Run(RunCommandAction), /// Detach session and exit Detach, + LeftClick(Position), + MouseRelease(Position), + MouseHold(Position), + Copy, } diff --git a/zellij-utils/src/input/mod.rs b/zellij-utils/src/input/mod.rs index 5c1dc262..11c5a843 100644 --- a/zellij-utils/src/input/mod.rs +++ b/zellij-utils/src/input/mod.rs @@ -5,6 +5,7 @@ pub mod command; pub mod config; pub mod keybinds; pub mod layout; +pub mod mouse; pub mod options; pub mod theme; diff --git a/zellij-utils/src/input/mouse.rs b/zellij-utils/src/input/mouse.rs new file mode 100644 index 00000000..d5dc4330 --- /dev/null +++ b/zellij-utils/src/input/mouse.rs @@ -0,0 +1,69 @@ +use serde::{Deserialize, Serialize}; + +use crate::position::Position; + +/// A mouse related event +#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize)] +pub enum MouseEvent { + /// A mouse button was pressed. + /// + /// The coordinates are zero-based. + Press(MouseButton, Position), + /// A mouse button was released. + /// + /// The coordinates are zero-based. + Release(Position), + /// A mouse button is held over the given coordinates. + /// + /// The coordinates are zero-based. + Hold(Position), +} + +impl From for MouseEvent { + fn from(event: termion::event::MouseEvent) -> Self { + match event { + termion::event::MouseEvent::Press(button, x, y) => Self::Press( + MouseButton::from(button), + Position::new((y.saturating_sub(1)) as i32, x.saturating_sub(1)), + ), + termion::event::MouseEvent::Release(x, y) => Self::Release(Position::new( + (y.saturating_sub(1)) as i32, + x.saturating_sub(1), + )), + termion::event::MouseEvent::Hold(x, y) => Self::Hold(Position::new( + (y.saturating_sub(1)) as i32, + x.saturating_sub(1), + )), + } + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub enum MouseButton { + /// The left mouse button. + Left, + /// The right mouse button. + Right, + /// The middle mouse button. + Middle, + /// Mouse wheel is going up. + /// + /// This event is typically only used with Mouse::Press. + WheelUp, + /// Mouse wheel is going down. + /// + /// This event is typically only used with Mouse::Press. + WheelDown, +} + +impl From for MouseButton { + fn from(button: termion::event::MouseButton) -> Self { + match button { + termion::event::MouseButton::Left => Self::Left, + termion::event::MouseButton::Right => Self::Right, + termion::event::MouseButton::Middle => Self::Middle, + termion::event::MouseButton::WheelUp => Self::WheelUp, + termion::event::MouseButton::WheelDown => Self::WheelDown, + } + } +} diff --git a/zellij-utils/src/input/options.rs b/zellij-utils/src/input/options.rs index 10571978..2ba2be86 100644 --- a/zellij-utils/src/input/options.rs +++ b/zellij-utils/src/input/options.rs @@ -27,6 +27,9 @@ pub struct Options { /// subdirectory of config dir #[structopt(long, parse(from_os_str))] pub layout_dir: Option, + #[structopt(long)] + #[serde(default)] + pub disable_mouse_mode: bool, } impl Options { @@ -68,12 +71,19 @@ impl Options { other => other, }; + let disable_mouse_mode = if other.disable_mouse_mode { + true + } else { + self.disable_mouse_mode + }; + Options { simplified_ui, theme, default_mode, default_shell, layout_dir, + disable_mouse_mode, } } diff --git a/zellij-utils/src/lib.rs b/zellij-utils/src/lib.rs index 6285047f..0aa95830 100644 --- a/zellij-utils/src/lib.rs +++ b/zellij-utils/src/lib.rs @@ -6,6 +6,7 @@ pub mod input; pub mod ipc; pub mod logging; pub mod pane_size; +pub mod position; pub mod setup; pub mod shared; diff --git a/zellij-utils/src/pane_size.rs b/zellij-utils/src/pane_size.rs index 8a939381..da165d4e 100644 --- a/zellij-utils/src/pane_size.rs +++ b/zellij-utils/src/pane_size.rs @@ -1,6 +1,8 @@ use nix::pty::Winsize; use serde::{Deserialize, Serialize}; +use crate::position::Position; + /// Contains the position and size of a [`Pane`], or more generally of any terminal, measured /// in character rows and columns. #[derive(Clone, Copy, Debug, Default, Serialize, Deserialize)] @@ -25,3 +27,11 @@ impl From for PositionAndSize { } } } + +impl PositionAndSize { + pub fn contains(&self, point: &Position) -> bool { + let col = point.column.0 as usize; + let row = point.line.0 as usize; + self.x <= col && col < self.x + self.cols && self.y <= row && row < self.y + self.rows + } +} diff --git a/zellij-utils/src/position.rs b/zellij-utils/src/position.rs new file mode 100644 index 00000000..71547424 --- /dev/null +++ b/zellij-utils/src/position.rs @@ -0,0 +1,30 @@ +use serde::{Deserialize, Serialize}; + +use crate::pane_size::PositionAndSize; + +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Deserialize, Serialize)] +pub struct Position { + pub line: Line, + pub column: Column, +} + +impl Position { + pub fn new(line: i32, column: u16) -> Self { + Self { + line: Line(line as isize), + column: Column(column as usize), + } + } + + pub fn relative_to(&self, position_and_size: &PositionAndSize) -> Self { + Self { + line: Line(self.line.0 - position_and_size.y as isize), + column: Column(self.column.0.saturating_sub(position_and_size.x)), + } + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize, PartialOrd)] +pub struct Line(pub isize); +#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize, PartialOrd)] +pub struct Column(pub usize); From 51c826b99192e06240670cc77764b7bebf270c14 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Fri, 2 Jul 2021 16:41:27 +0200 Subject: [PATCH 11/23] docs(changelog): initial mouse support --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f274d932..131bf981 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * Autodetach on force close (https://github.com/zellij-org/zellij/pull/581) * Add option to specify a default shell (https://github.com/zellij-org/zellij/pull/594) * Add action to run bound commands in a pane (https://github.com/zellij-org/zellij/pull/596) +* Initial mouse support (https://github.com/zellij-org/zellij/pull/448) ## [0.13.0] - 2021-06-04 * Fix crash when padding before widechar (https://github.com/zellij-org/zellij/pull/540) From 6bcd84f6d55af648c994bf82cf0a4399368a19a1 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Sun, 4 Jul 2021 14:23:52 +0200 Subject: [PATCH 12/23] Add `layout-dir` to `setup --check` subcommand --- src/main.rs | 10 +++++----- zellij-utils/src/setup.rs | 22 +++++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6bcfa872..b3706ead 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,9 +12,7 @@ use zellij_server::{os_input_output::get_server_os_input, start_server}; use zellij_utils::{ cli::{CliArgs, Command, Sessions}, consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, - input::config::Config, - input::layout::Layout, - input::options::Options, + input::{config::Config, layout::Layout, options::Options}, logging::*, setup::{find_default_config_dir, get_default_data_dir, get_layout_dir, Setup}, structopt::StructOpt, @@ -25,8 +23,6 @@ pub fn main() { if let Some(Command::Sessions(Sessions::ListSessions)) = opts.command { list_sessions(); - } else if let Some(Command::Setup(ref setup)) = opts.command { - Setup::from_cli(setup, &opts).expect("Failed to print to stdout"); } let config = match Config::try_from(&opts) { @@ -38,6 +34,10 @@ pub fn main() { }; let config_options = Options::from_cli(&config.options, opts.command.clone()); + if let Some(Command::Setup(ref setup)) = opts.command { + Setup::from_cli(setup, &opts, &config_options).expect("Failed to print to stdout"); + } + atomic_create_dir(&*ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap(); if let Some(path) = opts.server { diff --git a/zellij-utils/src/setup.rs b/zellij-utils/src/setup.rs index f9613c0f..c46876ec 100644 --- a/zellij-utils/src/setup.rs +++ b/zellij-utils/src/setup.rs @@ -2,10 +2,10 @@ use crate::cli::CliArgs; use crate::consts::{ FEATURES, SYSTEM_DEFAULT_CONFIG_DIR, SYSTEM_DEFAULT_DATA_DIR_PREFIX, VERSION, ZELLIJ_PROJ_DIR, }; +use crate::input::options::Options; use directories_next::BaseDirs; use serde::{Deserialize, Serialize}; -use std::io::Write; -use std::{path::Path, path::PathBuf}; +use std::{io::Write, path::Path, path::PathBuf}; use structopt::StructOpt; const CONFIG_LOCATION: &str = ".config/zellij"; @@ -117,13 +117,14 @@ pub struct Setup { #[structopt(long)] pub check: bool, + /// Generates completion for the specified shell #[structopt(long)] pub generate_completion: Option, } impl Setup { /// Entrypoint from main - pub fn from_cli(&self, opts: &CliArgs) -> std::io::Result<()> { + pub fn from_cli(&self, opts: &CliArgs, config_options: &Options) -> std::io::Result<()> { if self.clean { return Ok(()); } @@ -134,7 +135,7 @@ impl Setup { } if self.check { - Setup::check_defaults_config(opts)?; + Setup::check_defaults_config(opts, config_options)?; std::process::exit(0); } @@ -146,11 +147,14 @@ impl Setup { Ok(()) } - pub fn check_defaults_config(opts: &CliArgs) -> std::io::Result<()> { + pub fn check_defaults_config(opts: &CliArgs, config_options: &Options) -> std::io::Result<()> { let data_dir = opts.data_dir.clone().unwrap_or_else(get_default_data_dir); let config_dir = opts.config_dir.clone().or_else(find_default_config_dir); let plugin_dir = data_dir.join("plugins"); - let layout_dir = data_dir.join("layouts"); + let layout_dir = config_options + .layout_dir + .clone() + .or_else(|| get_layout_dir(config_dir.clone())); let system_data_dir = PathBuf::from(SYSTEM_DEFAULT_DATA_DIR_PREFIX).join("share/zellij"); let config_file = opts .config @@ -192,7 +196,11 @@ impl Setup { } message.push_str(&format!("[DATA DIR]: {:?}\n", data_dir)); message.push_str(&format!("[PLUGIN DIR]: {:?}\n", plugin_dir)); - message.push_str(&format!("[LAYOUT DIR]: {:?}\n", layout_dir)); + if let Some(layout_dir) = layout_dir { + message.push_str(&format!("[LAYOUT DIR]: {:?}\n", layout_dir)); + } else { + message.push_str("[CONFIG FILE]: Not Found\n"); + } message.push_str(&format!("[SYSTEM DATA DIR]: {:?}\n", system_data_dir)); message.push_str(&format!("[ARROW SEPARATOR]: {}\n", ARROW_SEPARATOR)); From 579701a2bb083fafab45b3ef49e40038a2183f9e Mon Sep 17 00:00:00 2001 From: a-kenji Date: Sun, 4 Jul 2021 17:34:55 +0200 Subject: [PATCH 13/23] docs(changelog): Add layout-dir to setup --check #599 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 131bf981..79e81a2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * Add option to specify a default shell (https://github.com/zellij-org/zellij/pull/594) * Add action to run bound commands in a pane (https://github.com/zellij-org/zellij/pull/596) * Initial mouse support (https://github.com/zellij-org/zellij/pull/448) +* Add `layout-dir` to `setup --check` subcommand (https://github.com/zellij-org/zellij/pull/599) ## [0.13.0] - 2021-06-04 * Fix crash when padding before widechar (https://github.com/zellij-org/zellij/pull/540) From 2e0e22cdb4e5c667924758f7b7126115c9fab28f Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Mon, 5 Jul 2021 10:13:46 +0200 Subject: [PATCH 14/23] chore(release): v0.14.0 --- Makefile.toml | 2 +- assets/plugins/status-bar.wasm | Bin 423782 -> 432588 bytes assets/plugins/strider.wasm | Bin 521455 -> 531239 bytes assets/plugins/tab-bar.wasm | Bin 412542 -> 421724 bytes 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.toml b/Makefile.toml index e0043ab7..c58ce3d0 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -151,7 +151,7 @@ run_task = "publish-zellij" [tasks.release-commit] dependencies = ["commit-all", "tag-release"] command = "git" -args = ["push", "--atomic", "origin", "main", "v${CARGO_MAKE_CRATE_VERSION}"] +args = ["push", "--atomic", "upstream", "main", "v${CARGO_MAKE_CRATE_VERSION}"] [tasks.commit-all] ignore_errors = true diff --git a/assets/plugins/status-bar.wasm b/assets/plugins/status-bar.wasm index d484fd2dc0767354f9fb78d17e8b971baae58899..677e8727d21eb5b03d2d7af73042b24a8c653d83 100644 GIT binary patch delta 129371 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 MqM!L>wj}TW18)<7h5!Hn delta 124990 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 diff --git a/assets/plugins/strider.wasm b/assets/plugins/strider.wasm index 797950c0fbac8c94b4408a8c362d8e479d21830b..b4fe4a7cac6f75ca65fa784280c22338a413effb 100644 GIT binary patch delta 182641 zcmcef3!EKAmH)fC?`!7XN$w<>WHOUS-%Ef55(uvZ0!Vr!ff(MXu*xprDzY=Y0+@9b zxj_;Z1mw|3M?sB(5D_F0G!bw~1O-{txU$MFQKNrQ{EHI*>MpA&|L^Zq-Qvnqem4E~FUIS(gq?*#6h(!OLLo^1H5`henyR*-D_ z^jGq0`eJl^Z4fzPhzoO$X=PqBrsdK68Sog8bL49&ieI%VwoAu@rA2*Bh!b-R>F2-(V zSZH=0+ZBWhdFCmIi-U85AlY+hOau+XYV6`t68cY)pwUrtI}}v~CcUnfgogqFsWdKGck61Rn27vzV?NJ9~z(D7+GjitlbInR`TGA?W>WN#~NTB53WkxJzC5YOt8U&jyRn?+U8}ZXk@q{zf@{ zQ~kZw^86^ML7yn8rOQ4%bq>&n?izU6UD_xcF=+t0Mk7tssL(8_5pbQGdHpA(b7RP(|@Evm*{o@;jg9&|e5v9~ljKr0FC z!}Kr4pS+|Zti=hCw)5h+WMg$vqYPcD>I=i$7!!vOq1@;M?SY^%W*~^mA82+CxDyKt z2g1e}>&^P#jo-t~EW~9Iuu+Tydevd1DI|Z7BpGaU8i^Y4VceOXH?cQ;XU_?*@xjWS zfADWTC+@!U7FMiSIJ83p>(86`t}wjy*7TT%n0HzsSMKRFe!kh=LP<@{P5Ti83z@-WGMP6QXGOZ5)RE$%y(7zFM@|6J#=vK ztkjjPTg?bUl&%Oa>44s%_Lw+IpP$_M_9CnTGeDFh;4ndJlnhehAY!2aSHkBJU&SS0 zB%OF2EOC1I_TRq^XO?p$XSeC+;}9 zD-_~1SKwN-<|L%(KuK7uMP|1+nSMb5L#7!SqgRr#zA^Bx*I`ODg9?~pV#=Os%SdZ9 z(kz7~mO=)aUD8#EgMnbaDkn8sv(FfYxT?EhLIJ~nCAQ(KB6w+-G>uC`OA9o>6o~4J z+YJ@tQZ){F4Wu|~p*Z^Nl_r!viliifuK~@+A{bb~fAwKpRBsp^f#RVyA;$wTC_HF0 z?i9Q-f0~6HlY(KQBF02$%*ydFG|E{bGlBs=-Nq@4|{Zso-nfRw_<;;-my&zz)tOXF&h{9Qa0*yJ-`c7fo zU%ytnf!eDY82_g}O+QHk$yV z#FyV*>z0{P8>nA?d$W`tH@$a4DOs^ST9&L>7fIcrlwXdPrS)BUS`$ZjtOyH~MtBUS zuo7bmF>@S^Fa?uDOd)P7zDi7WYl=w(m5eFI3mHvHCaTQ>ld?7kqTTaJKu5fq?a(Bs zBG+V(h!u@H|1_7wj1zpbZ6>#AU0m9w*7I5P=k;)}ok-&0E=qPBEjhRY%BQ{F#2gXm zZIofF2-OOiWyJssYau7dZ%xpffU4Px5xOk>6OFurE;O=prh#2+>DL?0|35r|6Y@wv zPgXn@3>rJal`FRBejL1+bY6IVlb0(BSmG$Wi<-N*vFRn#`&)nB7>*jkF*|Z8y*K7G zRSl~y>8kCFaaxGC2E6~@og1%cm3c0+yX~?_AttMD!hd-;#%2d^>;Y%S-mJZ8b8F-k zPv+;?tBs>SvIqZBG#d5}52IRDLv0lBQ_5zwB##MXLemv9E4|T_?m45cRbloYhBR^K zF9w&_XpK1xcuW-^Rx!g(`CCKc&N^!f9*=6`nSBoj#_L)CXq-V?~EBS-1X}UHhWSv(Ie~l8*Xk z)AMHTvFCU7P^^D8>~iX!OP*FiCk2aeoNVqs|4)<@>IbA>oq3O&m;UXnXWYE?r|j`A zxvXEAy-)o{{9b6aa0n|ksNULDhC} zbr+XltA(;EMNLplubm@5^WHfZ?XEG3qnTlE;&8BaHwELb&?t(mQ4(Vc>nUBd*UY#~ zA7N(A0%6gtQBoPitijKNeC71&y=L!US}M=VTV>5KaThi_G0IAD=aPO5oC0&Uu(bcK zf!>RoT_~R8lJLStDgDJ>3l6|=27dhpY)hbO(r||fgk>uu%;N{KuzljNelT2yx=2si z`;0@q;S|mb>)_Rk)~WB8cgYM>-zSw+WV$W_zf#hB7Bw;Ri`fGo3lAujlis0bIXz(R z`|&yNnL9r(SpUnp4}|XO^>^&I)VU9*|F-`=ZtryF0SEKPU^mqM3^REuWKYlAcX2CS~_vzUSdi$=}!k~xs2DT8hsBRv1s9499 z=_h%8tzJj%*W*TBr|GvB^zOG>uS@OM6GmQtLN5yK7d;~{KAlcExVP`KJG`DW^7^jy zn1g%Wz3ICTK0AEzTj_TXeyWvY*aX8~?2qJ1eJf60)K%dz9eM2J@h%>50O0d+aT{*e zSS#iu0l}CHlNY~bhzp2}_`Dx_6p(v|fpo{U-W)ri+?yVB=>G1r={bkanEXdUV0Q6| ztBsM%8{*OcIQ`tA>)qAqsc)DfN`K%D>(jq_LnS@%u$fT&^uz9RbJHIs6VurXzmne- zlil2v>FmV6*{?SzIX$Sv-M(!BzBZjbU{wYVacMg3jcq_bd*g0yby`2X{rvRdyVY{) ztGCtkp(8F%uUxce-r6@7P2J_wB3W59D#ZEFsD->(Uv>Jg77u^5xQ*>?N3`!+N9K3y zPhN6WvGci=n}T{z!_`XJy1sCF+I8$qH)s94W4F2R4_ngS<1elJLCsc?N4Fe5S7rZv z{1@C_>#savc^E$TFX@?Y+0EUU?(vpG+}iZrZ`r-uq)nL2MXVuhHjN*Xe(EjFxn&vCKoe;C30OK_&0s@$G$byXkW}fRa*64UPH)gC?no z1sEh)pi>5nZ$T)7L!0L!1rNc9K%x&@CVL$L-SP&R92gpg85bXZ$@vVt99V^e4I$m) z1J7K=#e^aRy&?MoMuuVID%drvZTyJcqByHbd_Il)*3^(FV;!;^-)}fir}ujcmB{$~$KRNJCq#_E?W=FfY6v7D2akCP1pkluEDf%Ad^_5#|*MyiN&h&@DwwkD1I8A6GTy3do*2Ft(quCSd*kh zwn&;;+PBEt(O`sAU>f=N^7dsg z1xZV55>La-#QH`z`MUiN;!cwfP{hZnG%sqfTsdLo$5t)!J1FVz1ih?idyR&`EC6pI zbLO&Up!P-i#PCXf^D`9f%w!vp>-wI|w{lVzleBdL-(xtBE-5PHFx<1k!dy;Bm4RUB z892M=Z&8~X;nCeRJ;n5rp7Q2>n7CzKhPEl#cB>GpNYrcK5G9yiia*C9hWuwsIJ*I6A{F%h-y zlCQKse&F<}2Y#Ig28kBjz=}SrX&}Bax_pY2!&ENWl9#9TcT603vR!FWmzJOgRy3`F zr`p93+8oi#DaZ|J2%{jMsV zZu;xz-J0~ScV1Lla|xV(V49q(g8R>yo<91n3)_#ce82wwGmeVff$PhI zKX>lH^w&d&Mz>7uX)n^0vMpzXo!9SMo`(^zkVv^VMHPezniX*`8dnyeNm=fE*ahxp z{-8P1Yfqf!D(OA@PnyAcFrAUbsi|TR8ccq|XY;~dY^ws!VY=d~iRmBC+O1MfW}8`> z?s;}|fi;FYpgB5jr1&p4KYfShF>ZybH4klRKE40!+540ciSo$pr3Pi3-sz@yQ0$Mm z7`?pGT}{tCYg(6r00>m;a5>$2)wJ~S^SURPp(p)DuUUwc$nQwcJmJAO&05YR+TP)W0Ks`qbJ6)J9o$g1k?CWqv07m}HS^?jry@)!bl zu%wxz+%;?I$IqSKSq)KfsyQe9!?{z^AD`RTGp9LW!1);T1dBm42`8l8=S?jG9qC_7 z4>)h>Tu{dRl_7y4AUnREgpF?gAIBS*uQ4`SxI?G!Ja6xvcld?#7Iyq6Y4iSN`?WU8 zTdLqeJM@A{NNLw(lZxe7%VnWcpdxSm5f$TzOY@Gy6J;gsaTQIdH>wQQ7)2dw^-nEuC}z1}4w5=g)VY*Ppv4F#qaU)C@`+{_?Ie)*Lze2)BqFs=#T^wA3rNk4XCciMAq9VpY&H(q$C z+c&-B!kN3(ya32?my}U=jP zo>Z2rE4Ik(+9UvSU{nEeP8C6}yaMt`@lK#JFNUFxOD|hK>&@bER|~2r*5S#4etn(E zL0E1=8?&+T`1Wl*_Ne#7)%2z1`_G2u7M*|o@IcA8mDi`)SvD8f9JekKUK*Y0DSx~B z*kNum)u@15?`zMuZ~g62@8~2}0ru(vGL%VD6c+#-3&=|o)vz}hY+Y7aPA}4x%AxoI ziQ5RdR^l!NK3G{Cqp7I(jDIctzvrQi9x*{*i|`(Ac8T>t(f`kw8oLei9g;SDRm2o)(r$Pv&x8S-32EPIR= zCMd$hwFapkna9Oibg7@fCeggX1}&K;YC4HISvs~DZK(%ZjFvRYv9U!{k+Rh$?B& z$ybfQNS8hH$beFp!CzgD{Mg%anZ}-_7V#QA#$^?M{h5GY!BiF-@~*J&hhjOtAAYg# z7@A!|0M%jxe|~?`r(1g|_Yamb2BJeYg#XX@XD95_@+S4jnjb7~Ykv8XpDp-RS!h_X z{beoauv`suzWnmT!P4`)I+Q^tlQvYCO%md{kLN2?emo&w5-?(zf_mFt(K6@6KeU+L za#e<3Y3PR^w5UD&umf%2@{sZWv*%Wew*BNX;@D!~$lMC6D24x#c6MxLWEM>nM@ztI zc`J5kQpv4#Y5xZs?y2<956%g%Eu?3CaKThFx)pnCbTW~=(e1pK-7KV6tlX`|GL*to z7HEO$Xs%M1%f*e>n#@H*+?sQz>@vicOiW1KQR&gTQR} z@`g+93<$3Y|0TqtQHUubAU$A+6%l7NZi{wE$OQrYP@_@_iei9OBwHO~12kUy|SOg!K+W{OV7QuHs$pQo<6p+dAO%<0BQ5|w*LlscWiT~gZ$s6 zr3U&Hw3NeIf2EZuLgL9N2rHyV$96t+h@X+6yUxu|-*?&DaE$)> zvIc+u{jy8l{Ppku`=LVgr9ve;cQOm&FJIX;%On6Mnj}C;wyGpR10kW*;|Rm3oz$Gh zH}vkWC1-2`q@Jz0EWzGp=_PlVneb&0Hdg~iYs;zhw5xlDMuq|jX;Fe=E(3f%Bldml zyr|Omm?1)pw$zd@k*N9~L= z<_EJ`tAYjdhK=;9>xoSSVQ1ve@vRK=Ne7>_@wMctCQEEP4RRkOy)ddL72lJ}=$?!W zNkPHoyeH||H%xu2A1i{9eq=1jvy+};pJ>V(^N=ZN)OGE(F7qbI)rEkg5sUNvqg)DUW8WtamWk_(5WMJ*-K?%kXb{*m+9l8U2ALflZ#o zp%9roKHRDl-a>sJFvk;x?ZtiE)f$k@XPD@z8OchL1ZlT6byNimk695$1+UxC!q}Ee zMgf%HVxX9*35q!V)kpf?97!)k#9U&MRjo!2%iL(|%$$Ij)!>4lmyD9WhBG1;MLDhB z#GSWuCjbgTh#~3ysW(pii?YGwlU|VvNe8>ZbrZ-k_Ibng!Po-+#E%B!PRbJaQg!or zRgfKECcO1(grgt5@g#;(fa#Fk;NBUts~uYwFRXtpSv_Yqfxs*EaM8}&G_qSLB;cT^cww)#hs zI=*nzzO5~KQb=9&cgc6!k6ju}3$j!CW0mHaA3Xki)T7lJW9|G##Xj&JQ0w>YN4VY$ zDu%O=tbCG6mHGiy>;t4`ddAJWy5FRK_{1IIQ=-h2^w>|F(f5cd$L48TdE&&+*Z<)Y1(%-psYc&bLcu4_z*2& zaIar*%hAQRoEXY-sD17?Q^M?dLN0z4Yok z8}3Kx-FKegewK!JCGJ=255KGA!du5>r{Cdr8^0nPYKAx`VY21suORy8CR@@~pKrP? z>Dtd<+VRS=lkWbQ`|A4tbN3hBp{yHgvEB&LL?m6<)FNpI+n)NH9f=YvNmb+SW&Vqn z#T|>4tVR`GI?`wF*>4_o5tn4G9l^yXt)a$He%SI{f;_2CF+FyHSkjsj_K&&uSBF`G z9oZ`NkB3cG6PfQtEj&OAi+5v-JO_YJttboqUMxu2?+7YU`u9JzgEHhu+Q)G6&*LJ9#lJec@k^>ttU9Dk<4SP^}YU94Zi-&;#_mioj$G0e{Hd?Tp6^ z*4Gm9r}B1q&u3fGcf3iX3Yk1?w@K%Iv3G1&Tpdyrov1o_zqRzFFYX7LSAKDq9>VNZ zCXa6~s2?TS+navli<3|94s1zbCX|$)>i@+RiTx7)2R=$~@}6XeI-69aNJ^4OdZ!2G zZrsTmMonOoud1WWRMtCCXzBhN_S^H5o#otB%eUlVEwQ@|YsqAO5}pr_6qI0DN&kMs zN%;91h~zi0uxA{We)T|lB^q9L15VndlDy=rXkk6D2fv4lrOf$JZ(P2edC2-Z0>IP_ z!9X`;?r5UeC^;#&x@!G1vWdt`@WOzaq)abnnEN+Qg?B93!4yc%+(FNCqZCnwsXIda(R#x{39N@+QAr;VK}C$9pS6wy zZIX*9U^Zc6QNN)2d?qb}4Ae(xt0+D7{+{U)o_v|JR4^tAo%WvI2Rg|V#L`vw?>2c- z9FgTCLD`7%iiNP1Y`;1E$NTr*6GS!1dy|)*=bJqZ+hofI?zgE=1N6zHh3fD6z}*GsXyVs=X>81?Bqce7?qOQgENOUc*DEKg0IkiPW5VXQ73^5D!$DM1oo zxuj=3_?A6Oh|cY{a!@jZOiO}s$&5k_zCbpQg64#mOX>3u?pMOV8){b4UB5iDi!hy; zM7Zh9m$!X+`r?ZJuH;`(Ra@XHbAo_G@+v~HYehtV-c0vI4$R?&IQEcth) zj%dDb7Vc$ojKDV(82=?z-;Nf>#Hv%I@ICnI6MZ8ahtvBXnwG1{1L4shJrtul!%c5- zQF`*G1{US}HqC7nk&MOUrZ2jK1Nhx10fYk|WUpL2ACb5)cC&*C%}xtZAi`M#dZS^IA-}PTIFr7(3|eI>sulHZli`O4&0hxeXK zx%bR&GX zl?{-r{rP6tlluL5d!c$3!)Z7@lG;%cEmyc;3J@?h(nlWNZO;zwuw-^(t+}?fCL=DA zwbt{`oTwL>`$8NOxDzqQf0Al zP}QczAthUC86d&{gYj*}>|5dyxows7_z6ACqwSCMv??Z75ge@if0GLMgUL5^Wexao zT?^IZ30)%$Ctac8KkAAh^%z&InYN%|zWWHh#>PfTYLVvQA+|ASRSHyl**y&9@E~I( zZL4Ztwk=^7+O#&#iK`&rjBKNFQW=8Kux}|3fUtiIQG>*h=rgv&T{s%%$y?M$}(!*zZBL;}D`o2LerlP2gOMEgIe9K#p!4snMMm9%X#ksDP?Bp_^rk$0XYA zg$UQKUhy0nc4l~-cncf`Nx0;d_VtoQDf2NJLiQtKwfb3-08wBGRf|AXH|bwPleJ=* zg~`FT|42k5Ee3vQl77a-O$tMdYTiQzS1@HN$5rvC>`@kl!GtV6Pi~tnLz)jW!=pTk zM^<4jn+~03P^K?^ZP!+m+rX$~nU>ZicEQ?k5eTC@;9=d7xm(2Ct!v*mjHn<4!m;j! zBLW?HkFCt5W}9ZE zBmDi+R%ogo)RNyYf9yGQ1zHO)cyFBV@)$CFi;yb<6e-6MHvwm!c`Cf zq1mP@Ay(8$o4inqJT@C~+$ss%N_z3*djk26$G@~A3C{h;CkZU#dkcM|^#pohHyjc% zf;kP0v;`Iw>wpcecWOP|S$oz%5>z&umx>c?Jk>K+uRQvGcRXG5Am@a2lzMv*e_>g{ zDBf97#fO+^Bt(?KkMv~T`ky|r#<|a~zx;KUNWC4LhwWMN2N6a;Nj9Dd_!@gjLoyKE?wv@S6lDk=pl^#{P@O=M0 zyuMBLTc4oBX7Cktw1*&Q07n^oOm02{4mmtY4FHiWO+Mwr7AB^*_UNpvL#m9sFj=u; zd$0^Re0RQ>v;(vma;*hNynKX}#}E+?aj?!6tXW|I6DCfwqAu78lfvp2maspb#dvIg zC9WV1L>a+ahK*@ULYE1tew+Rd>c?w+ zgfOV6o?MPXsGq=m99_pz2ht#w(Ad)5a2y!Tms;SFHyY+5-QksS4!XP#T;^Jv!4V<@ z`q#plh=++!Hm9s)f_qAyX>M~h0z7bNBok0tH`tMHFl zj9h%FZekr>P=kvkc!&J;PP;9~V~-|Z&?`S>3W_X*wFtQ!+g0OBi;F`yi{)$23|!6@ zjVVCu9+W>%==|tI@$U)zt1WGzBw*5|$uW+NWw2V8zz;SjASK7eV|d}gXo#o8b@CR! z{m*;v)~R}$3l=y5lm<+_VDqEzGd--Q)4w})B6TpZ;;|e%!?aL`%5i;hdg6C?A*ut~ z>H^wJ{We_GIoejsaYws(Lm#fd2tuJ8%kB^RXbhJw!a;_z5Y|Uy(r}dD{>B-81P+Kb-BJ zPiJl0XUR)hCxs%%=d_Uj|&+Eb>Xw7-{3DlTW6r<_S*T?(@6BVoj`rq5hk*@&e7!R3h{rtFgh_Df4H3lL za`R58#Do$hJ(hHU8xq~LLIOgs?c6g^0;ciOoze~fW>jbc^SU+%r_8a}gJ-=58ZfOM zQ${y=tf0$EhXVzX@HX&ZFEwH@6|=r1U`L`5A^`}*)T#70#HC}`Vl9>qgX{g(o#yYd-7O_QItVvuccdm;?K@4!iW$5^6-7H zEfj~3GDG`%1=*YIPW?QLVGvLzzmcaEHlp;f7Y^$!$eH>jC32#6_m{0arZ>JYw}Ni7 zlJrwA^vtd{*nBBP_3;dd68O(FIhFQ+*-%zeqH>q05~c2?nMWRTH8&E>0!vRv(angyAl&HSUT+aED0fvns6he8^W;8J} zc3y=I230gZKD?{iYMYB4Sta3XeqBpy};HJ8@*;fnh5Vs`@i*A=iYO+ZL$_FV+?b$7E&e^d{^ zebwxe3kJo+6!NfkgwjHMdN8tEZ|Gx*h*<$j9WW+x2ZD z+JR78({ur#?cgZdsQUL{&EMiAadSsA78a2(mVO8Eh_E$H2 zxyyBh?!N3F$GSIg>8!guOZRhsQ4{MN=J5NFRb&& z>_ffopapH|P;0V>Msi&>6&l%W~(N<8N{=64hOYs z7J@2eUz+UpbCv8Dw9KWW&+U0ooLl%vE*bi)=lo)`)Q?mo<3hw8U5)i&dKdeZ8B3J+ ztVTz+tk2DVcPaU)OdR@H(lNEJFTu*={+VD&zvM94ZaiK4O&+DTm42c=Dw?afS8b@- zA>Aoo2OSS^ra*m_Qf}c=X-~}msNu4){j$kq+bbI6t^B+ez#0f7MhVbNUvALI0%da_ zb)>stw)BPwCCq@lHHi&sFe~(l1?)pJrWv`IoeUV$g09`X3T_k08Mda?7~`=7>lR>@ z>`VP_O7t*BZIgk!~=xGM5oWkWw~7lS0Z z&9+nJ96Gg}oe+G7gM3s-AR<}pLr+FN>y~&*wxofje-R;Jgs@vP*bXt}k<1YSlg=u!i zv2KI=O!lLDUC$VfIYoU0O=J9YLvoy3;M{H5MaR3Zx^>y?H@hj>U!C9potAIPez4Q>$Fk;0?%3il zi5s-C3r}*5-HSTDCXA}AvvUl3Fatr8Tzjds36d&dBNbefthh9L@Feu-#_W$Lxkb^M zOE+iBT5e)?%E|87XkGr)lAWAuMW&XiM7+S^q?s_+QlshrK{Z5ju|x+|*|Wb;?nqIq z(cT?t1mQyI2k|n?^ypIAbLk&o64D}PAMol0rw1XBB^Qk za;6`pOlaT@gi7iO6Z$F?RexS6A4XLSPX}RGuLw|;1Vu@PLG%nYi`lxra0kEr;qC%q zLCa}_vTKlIg&Bxd9PaIk(CQD2j(!4z5#gI${_(sVU)UZ7F2ORa>x6hj)>XVsuF4j_ z&F#M1#?J{ar5$-aZ`I9`GV-G zSpe@(iPg>umwovZx9^GJYvlA5N97$_@0&iE55fXzhrGVx{0QWVoJBwjyic#&IHk@{ zE=bdoZK!0$L*lIGFWug)!;RBE3f=jsfO(?1`h66aXISc=ux7=;uHoC*n)AIq$6uu+?N6>AX-x zR+edU`Q6~-iMtSM01y8{%}_h;o~Xg%II!dJ2ci?~Y@-8$_fY#kg2DX)efIkxTXC^_ zW1*0|7-Z)@`oyVAnQD+ z%7QuLyH!)=r@{$el7;cJ5QJM&O?TsbpFkB zo)Boe`{XXk+8MZZ#fmjQ{*aE78U094{PuEKH!v$H$lmjiYaRs=PKF4>pUGxSqQ#=` z0l{0q^IzHod^#B1CkO`Wm#rL#FT<1L99zi*v*to&;}o;2E_QpLlWar4cq-}6SFn)i zPRa1PbL!^1+5|~ng9zCrr@2XEUx8?Qq@VI5T~H^pzSCX**aGXjVtMFB;ZfP__qzVQ z^^iOfVAV1$WB}BfbV#Fb%lEnsp^>CDV_(f?zvOl+o6JMXC8xXI)~H#2Egi~TqERF3 z^D{NF>Ii=&BG&$AM8uZQ4U?cPR;HTb2ndGA@=RV_nSJMUx5T}eO?`)Jz2mOJtM@fZ z8C>kuY@W^r(_btxp!4gwa54|BtXu$MAC@2Mv%rw9u#x1o$qWMdlw^N=2hLU4-+*`J zL=|Gk+Ij?AAuaIA_-+JqFDZH3V-CjhY)%QXz}6i%l>wK%#yK@hb^eU5&7WqnfE^ZEx5H_(xPP#q{-7MCy5--`Y1xQN+8=;I}JQ8qdT zh@$X+g_)WC?j5f0FGmv)nkZs}>a=4TL_e~^(C_qiH2nym0E2T}lq-nAq=-#)DJwP| zD_6?TZ^+7E9G=Rae5Y#?$^G|tx+Ab(4|^B>!0PO+?{a6l=d*|2wY%?zLRY~!}YsgWVLs@{?cWi;!VxJ zxjs9MB5Y~9Y|OUk>1+P-q`&;wU$$G7@X}9bzXE>g+ysf28J^YO;3ZT~{@^$v<^blcW2t_D^GY!ijtFUTe6A zr_O5f3wzR;Ku_uJtSHe7atI$DsaCEgclxJEyd!wG#y{0~VnHnPPi*;+w|cdI>f{Oc z_QiXK8$+i5Z~r7ju*#my>O<}r#`n}A%$&8^njv=>Puqsv#CY}E&BzI|#p??(=HTx05*zcOMnY2MaLiUx1g$gM8MAs z&0_E=J&C36prx59WcM)9gZd{G<)MUoXtwoM7WyXy$oty1O|$@;tY&w-POk9Rk{Z#)Ew-wS?VK^dMVvp4)}}o@4j~ z*)nX-5J~MML_-=5ZR9a;ZWQxYHi}>1!dh1(OtQ7}h<-`Em~FJSey&PQYs`K}E5cFZ zLm)t;J3o^X$P27RUD?1gcT9;7$k54dT;`Tm9;6B(>gThcEi)ROaK4)ny;Pcz9{>4i z+4k{-y6jhd;I!O&7tfhP)I=PUYakjh7}Cbd9M#Vx^b--Lpibh9Wh?czvz0oOtuzMI zNnj$uW3bT;nyds)V2HVpz@rQ2kXa-0sLIkUm)}k}TgecN0ZB127dxh^jFg5hWU485 z*m8iB*93?jwI7qFr(I~BOPdpA9X2Nsj`OSOWtaPF`jfZ!8)ZGd3DQP<3gJhN~HqjE>BBdK}GQ+^sBY$XN0R+ijGh4((hQ2AE6J&#R0Vm#((OU+`J8(c@CnpPluUK(%!pvpNs zs-G;jw>-83MA@24TyewrzjJ@ZF;c_st?s;g%g8IyfS*H4o}zo?h&GD@t>ei**CUY< zcaeTuqIevsT`RJC-{;;n?i)0h?CmjoN%vP}v)=D!>tQ)4_xhk-@}OdR8fQmbLOk%LvNu9?UP-_8-ee;{vvyAQJ)y20*Wk1wclbJVX^9MF?2z(gf-7{ zJ$W0fL$TolpEa)Z^MS41E2nj2;hxp47AyA*IO&l2tI(&&yv(>J^kX0yi z1RukR%{9tmVzdW^O)AilT7%zN=q4m=R7EAVW2<{nE9SDSX2ojaIYAbt)$X=K076h$L6^vA)u6N zG7PE}AF6yv&{CqGp=IeZmbK)!1$2$1nXt&mwtxl$Kz?BafrIP^m%2qQvR&rEv4v!s zg7)wOi*MT7VN7lest7*QPoZ|Z%;2)ZLa(teP-OeX`y^%*z}GKSDEv-uxVP{-89Jh} zH#?eDrlY*V|D(A*)u%Tq{lW4x^s6NwYID8e>|01aF7L2S6FgCUjfT&!Aa=JX*xXPX9Zp>y~=BBae zb>wAkG3zwfT;@*BreEeN8=k++9TA3W?lzUb;Z0W%ipZZPW}p3#+t?z9BIjZWLRK`` zKbvgLg|W`uFOvPkWAX@p5chUvi`Rs{grSTbPTx{2@C%bQzav_-w?o(blA9*`=Re1x z4atg%QUnxNd0BhV_=|)iYKxec(Uxty(si&B`M-+k5U?=hYBsfLC>V5C_S9+5D^B+&!KNN2g^g?8bt*j=ykd zDBBsz(2$x>8`oS-@K8%VYkzJ#EA^wsw%)^d&I@Po;y^4?7|^oTU=uR*c^>{rC+3d5 zVdW{AF_=68QryYqR|Y~ION~n`(@Ay(9`~$B34%xmp`d-8K|EXLjYd?W+)OKYAm7DQ z;FXzn>LZ}$W>Y>4zj~k6>k9Ln_`>q+lA3bd?My|)s%af3U^BHPO6|0PL9MMjP!Qny z)vW6CPK#Ie@0ElzoMo1^K%Ti4hXec~=_u;`|DxTIMm#jH?^8}Y+fys`vs2oQ?ys$y zsK43bYuriUBkOE_WcOV|(&c^GudZ=3x%6G@&LN_6#kFoh|GEuWLVwqQl+djJXVhSR znb--7t=GEacfN+5v4%Y%d*5;VNQEgSb`O1rUl)HBb*ow@DNVOvYjI-crmZ(HKkc6W+jKp|pS9uSQ`ib!0>jCiQRpnx z5B;joluQ&Y~A7??i* zT%&KFU=1W$$6eBwJkbXB*IqBhSv_+VvOgwgZo#RV1n>q%etw5E3F~JD)p^uLqOs=0 zmY(+VwkD@pj;_AW*+hl;;9!-R3Si6~9L2aBv;Snn-I@FA!p!F$1Sw_okUp8bs0R|W z6Kv_^a`KxkOIxPV>J1BScGal=+PsElM)KI`ho`dBKIs-j|52!9pZuh266m4ncA_&T zo?5jv|2Em$dKWHk8{JRRBs3G2bkOG#V3l51A4=X}~e0kWXNf=93J5i`g zg3%W(M3veWOUpfqj9F}jCx#cb>?6s7t%eD$je~3@rGOoJn7~m^B0@S9IUmA&*aBh7 z;wcdZ3JnpS?580~4Q>WLr{2Jp=GEv18y=Fa&rv1YyvDuF6|yOxa{IO{mv!qi`V!k| z>sH;!c-rV;C0oBKy9)bh>m$0sy=L2b%&o)`_@V&v$q(5gf?o}q#5l!l5~ex!4GGMh zk$PP2;N-N9T^wZJ{uIgKQTEGExmDpy4`n~Pg(Zl;-;`bVX%;N5*#xiF{es0OZ@h)| zighX(>q{Q8k}WFnD>JrDsQd``he1ef+YDy6km$6{#&WmHqG*S9JNp%BQn! zR15Fg>|6iBW`lOgyWJ#v;l7?7cPmRR-`sH4t?qOeJy5EpjbnPUXFua&!tJHo+|dM1 zHR(^e&7H{4=h|=Xz`^V&68Yei?1|glw0V$x$pMB;|MA6ftHZg*GC-gvv)Z;3$THwcnX6qi4$;94g}7w)em%xb3#ju6pV zGbt3t9dH&UmrG{9$5hT9y4}q^szO`=>y|YE88KVwxcz{tCYn7kNt5SAj@^?RzQRjI z3U1{l**kf%{hYslCOdeon_k54BQ@^SwJsjd9&J_{%-$yZR6AcQ+4XDP{;o57bgi2~ zF#q|rq|n@v4Sm*qx1kI=i7fgp?Mp^&{SdQ<%(1?vvy0u_eX^vt1e{YK{V?(mv&R-r zFvVOlO%teDT#6iv7As+ozqu7*JFMp_Ua4vgIp|YyG5l2Z;HaNFm!ZS+6r~H=HWV(D zB5qA-cEvi$#Br{6pc0ZslcN6>HMdkNsQ6lZqwVA*>2ppz3QwNt2(sZqMheBmQ6|#t za${Xsh>D6gU?9kTRX(LX=np|Uqz2!F{e#)t?{xL-nbmOS-Jf$MrC0b5G*8LlWYLm* zWRj62nzhrnsjaf0gcD|>LO-tNn7U+u%M0CGr?D{YRS+h7kyWcT7yIQ6FqS3Y4--;H z=-dwd0Hay|>2734-|4399C4!0c&Wh=P(EC;41F_rH1no}g-vL23pva>^-bx^1k5{O zklak?$4m7*Y_^xM!Fjf2Gii3#nXIPmE$0Ai=AqnR@}`Msw*WdDpiY4d*+#ZGi3y}H z`PR%!*)U{kt6`W|*0r5(sfLH2r|5m#_}9-X=!fQ*pbB9lNRgiqR4FX5$`oe0*a`M& zIjk?mm87dJM$K{*nB>Q`DpQ~&M=+o3{J@`WZiTO!WkJRQZm$?Jpa_zDFbzOKgB&rY zq5lmP>C*BtKt@ZrD>56xz4B(Mz%Xk&owX=K4MrVaEHXxo`kUFm-{p4O1&}6W`Ue>W ziGJeI?DrCfwqIonKkp{(A~i*inPQ24z1Wj6v^!ahkg|}i{JdK-3C5!oK+I7;@i4oh zCE2#myU7d5{ur(6Z+IB_V@5*~B)7I7;7Mys^iWV*i}oac;N(1$9dx&Qw@+)GHuaDH zfY1`vRz3un3z9pZLxIqTfC6FwryYH6*t z)X+SX$yvXTzADT(j0%3T$3}G|`K;Oljyl8W$s^8wu+Ggoa5xl)mc`0>olOmLB1R$i z#(S9Xk7cXwaWnTEZkujz@%S+XlzXZ8_clrraSLys%bvRDze*Ib#0XK6ds&TsF+1g6 z_zcyG8%o8V(E3|!N_}|(@>XeM5?O%arKc`XNF14UAa%rG) zIjX*7YSHDWTl`O&;E*T?l$Kw<-L%kHew$Lt*}*)%fM0M(kmu45Qa;I8C6Y$IAX|8O zxJx!S3=1t;i_+-#X`X1;qsId+!B41tc*TlMcVC58lRVe_$A$=~0m1C_ANncFh47%C zT2KJgsUd1wYLF!JT3NGF*Hi*7#vnLBE^SL{i34G%=iAfN4@Ar+Sj~2?ob(%azEv!L zwd83%+!74}4flhVoCTcGiO6DtJVi@FjLZB^fHHE_({@v9OJrtksD05*3&Ty1X0tc4 zqi18bc%xfAE?>>5h`nt!=jLqtM%RqHtAhp625#uo0%c03NzTJUclBg>X7kr0wmD07D`7CgsccJBRdQhOpi zm3{brq764@+wRXpeA%H7;8_25!+RcZbDahK&`fb5OCE50Wm_L~$AynPYS9gMQ+D{5 z-CtT2`zZVVm))D&Z?hx+!5!V)`silO_HbcxAL~yvkLYD=U9yo!yd45;8~(w?lk_%m zlpjdQOO$w%tfh_FFaN;}u!CTqhurLN&5yHFA95de&t!ji$nE2PlkL699dOVHTv$_3 zX`~Bc31GgM_Zau+9ELjiy1(V_!R+Ik+~KVU{TG&eoNV$B#uEygCHgXP2Ro{BCm$~G zkn@I6QLs|-h^mRHgtSIcEn&%se~X`514q(>A-=aLm=4T{E3HtDZjg zbXT@zvzye~`B@)tW)v~AkMptgNR6HxNAi-6Ll`Qdl3sfj;J7Xg_{lpv?8AP-=46zY z?M>HNa7^<8LQ3a?7^yHNO4*rTA@@p~N=cg033yb{d0$q6q#PUy{L8X-!KjAv)%j^( zJGd2rWuZb9n!j48=Fpq`w7p`J%}(ty?`&^8*U>nFygGY7Wq_(RIEQX#=c&$6wLxPv2hv}Ju?bq6jfLs=bDqke<(QOwV> z>~36Cu+hO29FIoO6oU&g;w}z1ARU75(rmwnPL3Hz1-NZdNJ)Nzb)C(gG1X*Z7zW<*e^< zcVG0)+0(KupK(3e@Awe{W%^XF-?!FUhvi@O`jF~99L@ytP5#f96d7IoSRXYTP&SL~JXNdA7EkHtOz^;Cs z48W-b3Xnue?^&G0#yhU{?QD5NN;eoCq@D6ok$@7SII^n1X$E=K<`^o=)E&dDZ5HG+ zPUBwb5W25 z1->!;c91WsQDjJ!JyOmi6WDsVg&TnA8X;SqECbRb~dB3Bwd74?ey*XxYFt6*?yO(DUiI zHlM>h$c5$2u7qDwc^N+k=NyJTTAmDVx-N`M7c?tL_wu-+Yw|^t}aTIE~Am$7>inM6K!Zc#U#J_qDh$9-mXGPo+jr z9d>8E@6$(CRHMi^alB^%(y>IIj+{qmn@$!HSqRsOLVn@}&2mfFm$?!4TsvZr#tt;3 z%R3-l^hgS)5u7KgdBbx$K-<{W;_>ms9B1o^aj_00Gn}oXR#YRd>5-n;=37IW)IH(O z=KJ%>B!p^?@FggBT)-HBaZy(=E?yvfk;LGOEMM|!A{%Za_{!sMcB&7|bntDpX~!XO zIl>inV@HJbo8!KS3F+}I?SL;U%EEV?=PwA%P#b?4d(ngBPMFOeU`CEOk?{~NZ&q4K zbQZQet_ZuB;lzG|EfpBb zzvUG*kd~vWOd=-%`y0Ay=c#K6J`$39v7`>k_3+0E{!YFh*N--qnxg_jsSUafL0ELL zdz>DFzvcn$;Hz*e_@qtd@cRTGvtY*#boT2AJ9yS!kLSDbuk1jXlW}OikCXSuLFP#b z3WffXmq?PcF3LWZtIQvY3Ku<@r8v0#TVakdqom`J3rP#Xn^dL%&|0Xq>w!%LHLUaPi} zHI$B{6sGHHmzva{AFU=mShYktXAm1N%~jY)}XOqNEs!;t_1?Iw#h3{z)3+1Nk_+!&j6wSv9~V=A5)PiD79 zAMaU1oNRbXbwg}8nxk?_gBF^ATB_t0u8T>f)rHMs_L)wYt(fMQlJ_k&dk32_R6vNv z6nP$OQ<-0Gm>-e55sR!7e60x#Bu^r^$d${^ScA~-Yj8G)p4!5K11_i-E(CF6^7=Ul zwT!XU?K>)NQL+EHD<9Y(o=OaoVK1GKw=@;WLHu{5VKGGh4m!|eyP_Jz$BMfJcd7(H z%n81d2`U&L_ht`1=@zv3yAu+*QtBrPHZl@w7IF8bDn>f=Otk%D_O-KTF{!zmVi{6%(7A~HW zzhDINJ5B^`ON*-D^~ED-Fg3=SSUo)lWn%x9nY#FK(mbH=bac9;~hhfQ88YTvey6wz;M zZLF@mGI``S?fX3m%A-2o?x@zua)AjFpgeJyZE2t9N%5}G0jKA?>va?#y172lIDq6AvnHYKnkD!uH2B8UKs2J~)Upx1LORg5*x;2hO&&6bd}s@Gowk*3IGpg%iiX1E^#1OMc#e zMHUCbaU5C%=?kx6c&M{&4wIwBYm2VNT?81}p4sSU2*i_SRdKDTP%3Dg&6SCbPKb#K zA_>-ePD>}$L+5Pn(&i+Z>7e!y@}KnmC5S0z^V0M6YuMOzD1V3H(a{gIvGj!-9eu<7 zSUC%z*RRMYUs?*gj0G*iHoI+C3Ye7qa|Nl@+2{a^?zq&_5{7oYXwI;M%C^9WAvmx_ zdK$5$(2D?rivag~z%WpgPFfs745%0hP{dfxVj}=Loe^+a1#}!JbA}%4*a2`CCc>_XX`z?^WtVSx0|y1;1LR*oHT9&HWl zt_}%aN#C4NpqEw-x!C5OS3uF;8(G24;dV-GZ}Cq7ekE>#^4~-dug&y;^{_S4#StDi z_0pE3rd!%mLfFH{eiGn)dZSR?in|x|p_-9rt zmx`JdU@4~SG;5b!_CTyAqeJ0Wrp6Q-`C(Iv131)h+iD%fNYVf~<4h8sCU)u=_Ea~V z3C+abV8&X@J;M%p3bHjpY(&(XK2FV&{WtPcmJ&f$Y`7s zk3-xkJAcZsOq*b8ujPsB14REV#rxXy9i?}BbQmb+oYsY)4(G?p=jlnJ)^eCeMoJ@q zLy!|xV{INb(TUVrCMeWjz>Kjx8@f%v34LK@gxTUT4dg4X&9RN9cR8iP2GHC9OAr0UGJFsdk5w}RfwTd2s+lupi{<+E_+1KA&vmcxph5UnZR zh?e-lY-~Q6HvTs`WKpBG#?L=%U3u+jDwXzw73P4Vs!<)&Zi0vh>sAyKR9 zx1w_Pzalqb!+t+7hn{h>xcuxHvbR5*&3)Di-}$T+e)w5;7KOim z)?FKI>7Sl`_$RD3*l7ZmN2)u&lgO4mS^D%PR)*t;cc-W?Lu|Abzks`f))1>%B7fIR zvYGra9N9R(e*D}2c>7iVa_?_~RlXb>0<&b`7eBb}*Ec?~b;C2hyk*+3htm~)^vp+o z{oUvP<-zCk4+L*+OmJ@Cw~v40((m2*^oC#SO`RgLi5N-cT@vO+ll_|gnsPEhZ2}@g z3kr((!c5b3ABp61ltC}6agEI<(F;Q=Q(-SXhcB}#owaiOCwU?wi@oD8E8q3anj&#I{ zLdPIdbbGTz&~9)hsTRnvWb$%bRXM9U;Q}N-t1P8_mBlZzENf!IFi*9ptP4|BbJJbO znc-T5(bjH)ixQmr%|Co+oHJmM_sQ?J`DR)@uLYV32G43h62-&`eVv&^%LkVYB@-~} zlxu@sRaypcQW7fIQ_4(ej01@%nJ}dLZjh4E#?QEMUZ6&^4}oENZ|}v8Nf=sM573eO z3D4Na+KzQ_@RzX1qy@n#JaT@^kv#Ry3lHbgtrKv3ovAz)^;>mTM+~K(I_9FElQ(v% zN-9+Azp)sPSP3Jo)P>ooTZM5vsb&w;N-;2KMTC8XR*`7c-KJGfw(dFCt6Y5!qsy-N zwcD#D$HzmAZFfy1qC_H!LYduwjCP=!{q!E}Z5c?|ed>_*GHYjaqc5MR#XM|1ok8~p zKw>eVLQPlmg?@#Ki9uT}IRz0%ub#zIg~K=~TOK>?XTZtaWYjykjUrmIIp%j+Gn`Tu zxU~WkA)_S=DP_4G#lmNzlFQpt<4{6IjCM}MjvT_Zc2M}ZVGzR<-l4^D>K$;K_KPc6?+8z5SsQ9hW7H;j zQ6-x~%cvLxx|{-EkDnhM$)$fjwTLp!k94^57|9_Nr=79fkno8?f0|erCMAklL{A`t zJlfq^@AGc=RRb~3jTC0%i^ z#6Y~N*&Ek~MG4|)O1rK;S1sg0eH9=k8}QzXnq8}!lO;(e$E~_x^y;l|nzxfzfreTJ zET7uTF8j0#QKH891Q1<0K$;Xz)(Wpy(W1l*tzEwA_GTX(4SN`+*;Orh)0QX`78P1b zj)4~%4oYf(sj7)U*;t;L4xH^Z`U?pPf~{lY3F7q_9Zj9c4mPkumB%uoIeb-6!Z6^6 zV%9l^E}(7_9bFZ-@Dm?+sFPc`UfzjfCUUy@SdO=X$tdy+JC>;+%Txvx)$`h5I0URw zwb8&Y+aatuN3l!eWdrO-Tl0KqnPBI|s+KSdS|;Jd9!LwzL<``19G-S!AzUW~#j_nt z1Q!;Kmil<)+yBenn}AtSTn+!-)pPIMb>RXyI#tD&tlA4lL7yhJ9Aq4|ru1+E2@Ol^NXU4xJT9Bl>JDQA zhwzh4i&Y^A(;*Q%fh4PSdR|g5R@YoBTO(42A!M5v8iD#<=PsEODodTYGsXavs5eWqO z!F-~n4ijJ8q^%RtExSm!Y&=&R%1GfqGpDosh8fQD{M$MVSgbg)nEf|;zYi-ntdB|jUNSiE_7OdN3yTxL6P7Bsf^hTjZ z;z%=+v7+A)WJR4GFZ#{SVYsNosul^Sm43zG7Fj?jxhh*CG_2_idWvQTivXa>%(OKj z_JnRZlnh#yc5&~RvK4nw7WaG^T@b?S`w=U?D!ln0*&R!h#Di$6zsc6hBkBF>BfHuD zt~dWvUyPO_e^ud3R@-L9 zGTiQT#8i*VxzZZ=K*#JP`&Pv(X7l;5ee5D$pn17m5+IB?Bwjl175xiS=_- z3<9((x*Ffr|Cnh%^RYK%x81e9gqHO#CbVp7qvP-v@3yB!Kf2^`EZ#i#Q}(@j(>v%> zyJK{lIK{P7^nH0(#`{%oqj>N6HBJfR^jEJ|oVH4+0`tYnt-P1$_nfESp~LVQvl&ZU z{V~XKZOkT*PkzZxBGPHphfkpIp)CXvawrXcBA>N29n{utoIo$TZ+L@xsV!dFzYk$k`5?EQL=JvQ>E zqBuD#`OGdIwhK*&BLh_;fmLy6Du%iuyF&3Yz|ixVFcw z!)J)B8(|p2B?$Halg`3KP|QM1oc*P@I5p8^wDr9`hM@(*O+I%@th=(2OC*z`V{`gg zEw<~3Y}_Ujj7l?8-5uDnnMELyoKE@leA03tmrk0(eC?z~(C^`F!_tmBU+$ht+QVq+2@rnpR$7$7i{jW zUABf?L~G-?FNR#0dckFfMxd!Eoh{+@POeF^1#)G`F9y=&xj{__WwQ69U>A)AS(Bt0 z@tdqS${d1DJMY9{sPwZO-WCeRV544QAbl#^Pq_!%vC1&PSmwDowpNw3!+J3X8-f98 zU8m3!TO4p6Mc!`@keqXxkEs7Jh9UvgVdBZ?MGDGJpPAp;u0_v6QJT=RiTyWQrz05& z9a31c0lw4{<=46q2of(Qt^5*6CxZi7&pR+>94?=d-ZYE^CEaNoM2VT;Mw=!`J~r#2 zF)ur8kjrzs-lb=VyuNAECRjKm%X`ftSe~*$Tr_jBIjyXZ^@vciq0bh3&4*LEaitx?KP3x2?3 z`|}FW=Vg9o_Zg(ywKOBDMYk^+16kA~SxdH|;C_Wg#$|3+U zrA0snYp6h;B_R}vH z5(}+`6fz&6ZgVY|sgv_rj7A@5ko1uah0kfCG#NIfGv4SLFq_rQkuWmN<{QxJ1FE(0 zEXolq*v0P095r0X-e4HhM5U;G$0wQ4!eG?wZh+QLA0#Sf|9!0C!e-%+*j`J{wlF$z=chfK9Dr5KEg`qjbfu>OQGu55h3U|A4#0l~IT?3%2*?F^9 zm{i?!;v!rqQ_uNOmJTiU;w-E7gR&Nn1!zfZl2_eAP#vmC-jYEm6Mm;elr+0Txz`gw z>N%p{Tp7>N4BTelxj?_k9vE`Sp7y%O_rmUtH~02e9}j#s2&}`b&A;s?G2^z{|BeM( zdEc9SH^-GX6Yh53&35I@xNW@UiJ>~1G4}!Anz#>|8Ck=}30(|I6Lov2%qt&H>F&nRkITS>8T$B^X zv+2c{#eoYlTa!`kPm`T7WZr?iBC}wWl#R$(EzsejLX~k|M2@gR9Fb{kEp~|xH;Mj3 zr!U=BakhkZ7AR_2OrvY3lt4zUoAhqVsLJAEQOL3=QI6~Kd6uBhF zBET^2H#tT+Zjx=DGEHgenZrqQjEj0J&M#`?7cbQrX`U+)#4c*mq=E z5rN=WSI9B-Woue~k;#E1f0rZ%DC3#pE5KX<1~2*)*^y9GXwnnHQ{jGSMpoUzjyUp~ zl4^k}&^XVlXIEDwUa@#!?SfvpFb?E#mNYT)lH9+sB<&$N3E4&Um*Y6j|A zJ8)ijy=^eUa81}cB?2QxYiv&Bmfl2AB5v?=V&nx*i>s_T!e&4|(^xT;4Y8W2w7HH@ zNzPzbCIxj=;-;}HwBcjd*7RhsE1M!q#>vbh@4+l(S62loprb`KFpu(6L$WXcG~kFT zurR+hDrIAM!<0F0f-dGX8`fOEA(PWf(c-#Hw76_q$|P>+e|4`-nFL38NUGUnn@ye5@g>}Xvs&SVsUc~$FjEekqT* z>N?U{M1RC+zed>>$I84eLwoE>`AB z!jO3m_}J?0ELYX1XWXs2H`HZv*UGvvmd9C0@r04JW=PZ`fCO7hO3}^Ml3OM07<_g} z-_^~%gzil5s^G6i(;@ZZ#OuX}kT-ZIRj7*GWo$htjD%`n$A@5NN@NDnIW#@%$GVyq z_ZdOoc6oa@aA(s!$Vpb;@nCqkQXyjMZKR0P8pE)JL#uT?$wH&w>lN#;PC2()BI`eI z1_xKTww^Z7Ti?J5h9j`^7%Yrfg3$Ukw-B#LmUhhxXI;PMM^;7)ll1u!Kr;>^mt$BU zPj>t|q`jJ*L!YU=4VP<;nrajBG*OEjsH5&JY(5+xCON^6+&qL#C`_4_UBu4HmX;q6 zn&-a!E~trQE|;zTNE(;li%TMNc^4&ur*?WvoZ=EF`0TIZ63blf9bTzEV3pR$4ywJq z>GvI3OzEB0Q7zeYbQP~f!KSO12+t_iiXrvMyWZkjRq9Rt)Q++E`HWgsrr)DaNu2GB zCh1oBpo4d2t$K{uhh!B8Mz!5-d<%6=^~ly^h!Wx5#veg;V{1^^ZQTBYx2d!0Vivx) zZ!Z<@FG**|A(G21WrvuHyhIoEN$xN2JZ{z5ZhO`bADVPuHBdXC3GCu-pkko$Fd73@ z0F7fSbpzD^9l|-|Z|hk40gX+%zcf%S(3qtAQv;O&xk>j<1Eqi(lkT-S19GNWYIM^5 zpSN^0r9cNK-M_R#-$=UKTcLxJ?$fQ%D6(dt622RmbZ;5o3?zQFtj;x%pt}=wZy>4A8ird2lG1lfx|a%+vt1#RY7VRZ zgN{@Pk?!_o0|{MpNV<=;`c+af2I7$I6x&C9_`3dXAW%ipea%2pi1MWS3j;~TlyMA! zfzm*wNq41&a_(Tjc1ib**K{jF;Gt+82c3lk|c`QjdF+nPBO}A z25%ckD2USxUNMkVAv;L67)T1pX$H3%C?}<7vz65b6x48{!M}d5Bb9v9(|=$f$u}n& zyk;P&Lwf%g4HO4L26)UsLTn-l7)X*w9=OFoLKjE{pZ-p#(6z1(Zio6*_Oa4B2&|)A zf9nb9CRhvJp@-_T@6H%-V&SX)=5YI*r>XLrKy13Chni}8Q})>BPMfMkJU|qLd0X{u zgibBdhxOj@dU5+|#rHd2zg}vqx=MNXon?<3k39Ef5$jH5uZX`;@xAKk!RU=30#H6&cWu<7dMJkO+U+t%Fp|EpX%Q9qb^1=pSM$`aW-m5CokPqQ4p3LwPkBWH)f!wk-8PW)#QUK^>Ui?lZm{Z3 zsF8!!Sw#|&6j-rK7YBhnI#_i}>c|B@IQ(s}I;fwdYbsT|^qXj?1Vu8HRp<&vC6+j5 zHk=ysts$y9sj+PE?==lkeFpfHM2KcnH-fk?rKs13sESmWqHY+fYCFl!*lvF*djfID z-3^^d+Op|}yX#i(8$(s6Ug0pVP@-wgX+(2A@d;k!O=OCdLsh@x+Z5!(9`KQ@D41^Y zo{+!Hw{x&JT?te4LvmF%OBa|L``xk zB9~sg%PDnC_vyrVc(LKCbK@>)DDp>eIW=D6>|-C6165rCWER%)#lL(3#DuQNn?GFj z$Vp=oG*CTRsQU;p%-1bUQ@SW**cu4T=`GXTCVA6UoNsNew7{UbOXXiBc$QT6(+~#j8xZ6)UBR_6&TYs zdFxiDKh)H|#TzwB9ar@(k<6PQ8-$}QNYzIIMnK!VXOw!Xc2_h0^-=}+Py@0v9ovi9 z?o*QbQ{FWPsk^f}k~%clnukbrF{B7L^IIpW_TJ)es2{|2dac29Yu4o05c zFXCjn-!M7hpOlNS*eWW|w?hCi0T9#fgotTIxIcQx*E*rP(7<)&Yx5o0thaHr8lNR-(B^Q4P)r&!30+5; zn&2U@jH(#jywL4N@5nK#Ryf$AF{%T&xO|Ly{s57A%~WJJP zeTaHZBJV#=M}F8i^~<^*P7Fo ziEy%Q-tQ->p{A3l^#&Yfx|eX~A3jXwQu!>|AY|Mmj(+s<_N5g5XwuY&ts24pyu&rE ztUO%(a)@R|@<-EPP-|K$o1SR0HC8}|$7u~E9!aDH?~)_bNeT9agv%zMk0segvBGnX zgf2IFl}D<6l;Y4M>71Lrl}D;ssSu{OdjB|5)nyFAVK-X5Kn2q6DAg$_n_y;(H~A=a zsi}QUGh4i!N2$Z|^{w?>ZR`6G_AK&wf~dZTC5y^HnkO4n`8;7$_oJ0#vnxukDQZfP zo~|12@+qo5AHCLYahhPLlAfNDk6!d<5xTV>EsBnX3BiLtmPBeENEBs;U|t z(9YK(FCB?bUPRIrOn*F8^$lg5vZv~uP{t2B_5d?%5O>ku0Q)nk&kLlDeHwoPwU0NWy`ygfTy(1Hx$q`Y=E3@y{BgHGg^C1ap3=%ZhUxer9l>VpIs=(ATQH61 zSgU$=HEiNbktX~ze+wGf47rY}8T9NM?0V!S5vuaPoU`WIma^PEL@Su)NL&9+$vi>S zy&X{7N@TQ;SwMl%BCEs5V^pSwGm(0QSxtetEXIB!WlMrhc2ah$V*^2=F)Wa23kLLl zB4iaaaQF6{fzh9%y{3K2fJW~;#m1pg=~Sd&V_HY#!o+wCu|&6z$*9tE{7h5Cu`G9& zFP4MMFt;KGg7eRwREp1SK4&u!|8vS^BMPIo7d`Dhsj!7ml zucE{#aR4d!-QF1QLI_?$MZ`fun_2=L8Oohm=OG)1N zcpFYrRk;}Fv{6x#Z<*TWi8+v;{ZQ#muIt3CuN4WhXDZdvAT$=4Z}!-Uy3N>xFlc4J zFJ1d+#u;HV>4fAgPo|6*ZcE?@$>gYwd<>@c&G%00_Y5RNgd?_Q5#vzAv%RjWGWDA$ z9SuTG)F+b&jGZU4YdJJSj**z*$r~i|#q(s&%OwK}W5+N}ZYEWXa1mk={O4z;5+nZN&Ze}iNRWsX6N-9lVR!+rdNXkMR-r(#$@W`~ zRs&OFc6wbR1_4;t3Qg0fpcn3#H*db`R#GhVE7B(oROSpec(=}158Io)=?hdR9_O3K zjpp&t0(D*`6S^|PnV?1@n(z{ODo(9gd~LZm<8*a1n>7E=>5O0!Ufn`o{g&XFIXa)EK^?F3^bgnE(&Gf*)!FT*cfd2S?c1> z7(~}G5M>WCRhQfN(+q~-Y)!SWI-QS>Ya?I|#D#+oT2o{oQ5g^{%=5<}JM&;wF_q_8} zk+*HRih4g?t|q!=i~xGr+Ww3QAvF)Hbe1j#4o$3!DU&safx~6mp>|#m%Nk}`S+;5L zMqi*hbxfPq|DlvCg%vA^5FC*MaCGhkp&ShG3Rb9#YZ7`Qt#$uhh(wm=n3~#j`wCTS z(*&N%F~Z*Ly=@+`CJps$Qa=L|qs~{;IR{jgc*k6bHY2|2o(t6`wJ$l}eTn)-Ocp@8 z1$A-nyi1YuP$NXok~@whi+r5cnFH!(=dT<0)vU#>2;6Pup69D@Tse)|eF-!9!Wgw=?S=u)*BE9p(SRxRL|j>oRWf+XSnX1!h&zsc;vM1fDdD+TQwuKu8dV0w|))W}x3A>e@IE+C$#uF&zj2jkB zGFrwri!MNpX>kO=0x;OZE-8~|!7eVcXwzTp+(E*PhSq$#qD|GepoQrQvRDI+Lg!6utew`ajms*eSu;gs1%#JH8B zt*2q6Wb$eilp^9?zWMH&4&VN(`1sGGda|QSrq%k_lNk36ezQ5rac} zv0g&qOGltj>7_9s9>L4;j=e$E=8{5G`U^R5%ghC^;?j~D3-T(uUhr0CHUjn$LsySc ziP-H*bh1j*VipEe@2{3C_NiqiUZuV{v;$gbK&`lUg)>c*llm5uEu=|VsU$@rdzf;{kPWWf3x~?2VDRE?dq2i5~l;6aD(db#Y8}ber+Ns7lrO%soinu zGN#)CDBUg$lrZyVs-A-fbI_({39|T~bG0Zd_OtW|q%Kyo7toy9OMW>ZHfVEA5cg?S1X_I z#=2Nr8}bf&kGdaPx=)8;!(`n*`%p$ua;GGS4X1SYQTINbyxE38J786db8S98S>vdA z6Fr6IP1u?=3y&fnE9&E8M_O#Utf33)lOwI4`v7Z4k(owfkBt;YZ=kULWs!qyvK4n4 zT^V^}YwO5ht-$Milj?l59&Kh-k+Q8KIE>&ChMd;(d@>kd{KwJ@m<6bSb<&t%PkO4r z$a+P}vZ*o6c-azyb7UU6Q4Qy&@HpmpKuE1QzdP8^WR$ZK0@xQ4_hp^w|mvo^ipD2CH;p6WSGZL!`<=}KC21KfTXHw!9-QK<>u(3=#-Yv{2kC}(nW?QmoXqBvPVV3H0@n5KjMSDN9xlZCD7Whi1(XV&1#zJ_fN z4Pj@AK34e95QgdbLqm|Lh?>+A*~GQZJT zK%YtBwcMgaZefa$8Ye%3lZ5Q0qU+H1rr(05K`baWaibyKqkt?B-b*GVxAx z&=N6%-%thj6zeN#2wOhz8v-ni^oF4r6=oz#2azk~T{!GeHABC`W@V|MWFhlsjg3o0 zWF&l(?M+^%I-BwqKn#9)^$ICnUidqz7OhJ${k8+CgB`w?iFqwfq@)u2Q&l{A^B@xq zy29u$q?fR?oFdJoMOFb|7@^JnMNjjTtOIbpzpqoB+C7XxmB=%-C5-u?ryj6A0 z)e&zynnqoJnp55Ux&c7hdF*|m+-*su(j|2RdEFw5{g>3$^SVJ+4KJx1#A|bre(lEV zTGV44D(Jq3qN+R3uJh^|0_|;G4;*%59L{Gwd2Nd8SFGgR?KzBhaURP1=IFe-VLVsE zc%@q3MLO>#?kwgY$O!R*kMi1?*PSHP+i6t!ADptB=3dY80~wH5f~@_x>FqL1&^r8Q zBfg4y5vx)-MC+IEXcqHl>%cx|f536&ur=C!(7?rxIV&PG@+*`lRJ5VUJa3mLMB2<# z5QoBK?ro}OvKgrq(PYdjg;chPEXopv2DPnNc9_v3OdzT1!>0tM0OC;XWKNr4`H z$bclh7)KJzYNsN}XAJE40}_APf~`j*IgrP2M3#VnZVd9~XA2M3Zy8oF=+Ox>g&AY( zi2QMi=Ak;{((O=$t;O}wHmDS2$cteo61!xR-V>#NGF!J-mFB*%p6AoWqJQzjOI`op zsA@S{@c*yt|9V|#2f*8@?tDWPxv4|8KOH#a5^AUg+1h#aeY~POR86@#lYKio9*K~+ zm8ZLVyVrP!Do^#%JEYan>2VD9hqZQjLyhi=L_s3!jaUt$T}8thpIg(wLIIQKJjzT`TN@jRhdg1V(DwwW6i9I;OE25?)v&f zb2f1+d%aezcX$8$ajO@qi!STyE1T=tcQ9MkEPuCVyR2W&KD+E%d26${@FNJ{x=nlZ zCu~u;%Dk;_&Q`js^Y00F?ViVvmsknXoOiBtH{{9dN1lB~sU!7_OEc2b^4_T3hP9L@(CeAykFz)>^X=wMLi`y*o( z2GN{z@dc0JmD_d|_9=XOE5P>PeSLiixOKPr(P>nI`z=1)Wj)xf)QHx&U+-=YLb^N6 z8z`=F-_5)33S2d2>M#yVBoAr+{F?9exZ>98#@lYH4@$oC@l)#Hy9^#wwu4%3XrS?$ z#<~vP33scST;h8^S?qLYL4Jw5z_KfNI>&#|cWE@Xfb2iGvjMV+ldD0JFyYvt)%9Ir zy7pq(-;yWW$;kYZU1vEWzjw%XSYO{^J#R?yr}L2sC}NkZCNYpHNd{Cpnkpll?Zxg< z2V>7`)%6wj+ho^QNWZ6lj8LI~iawU*_QDe1a%}3@F=LC0-j?k?CQDDX(|r0MrUd2* zYu`Hr!n#fDI0vDUaAd|+I2T|Js~Wwh@1Zx7@-W3nHnWb5Dd3x+M%a{A#c)>ai%D!FoBHlirck$OXxR1%u1}^Yxio zlpYV6=0q4F%Gj6$hMM_2=rGGAkl>lYkDyUn9c#fZ$QE%dfkqjXCFN#>YS3aZsq@HY z{n5P&WD{GsKy?f_88s}SVB#}h7R|{d0~RK6L1cD`U>{FPGQYma;9QWJ_Hiy_VG~r- zld?6+$!7|b=j01;DEVW@z&cbPg7Y{yml0};LbGH1URh+fLP?F9)N~_h`Z$*y1voF- z2j^*nb3ZW|<<_52v>%+~vk%VA^tfLyg7c#N;hb|CVq)tJwb07$`?0Dy%%%vafarJp z>ffE?ELdpEcHjG-7WQ1zQl)4fq$$)f){-(5xQ|7M*c_*FqpIl^#HTe& z8$XvABH)Zq9grTx;yu5S2i0&;KL z+F}+7R(SS(Sc&xTI^L&7V=OWqD5qDsXsI{TI4&Iz*12dGw@EK_dEX4I6nH?)({v|u z-xQO^k+z{O7GSaHPFE&H5PDb8B?u zT3C*3wU{T7XkAJ)Ic!}=Yt5!6rct~}D%hr&NVPgduYza#481%t=#0uVeml(rnF^+)TZS(A0*H0cUYpiR!#!oKY%pe+}0B8Qa0 zZ_a#dlu+|^B;v=Llz5VG;T-(&UdWNi;{ltugul?3XtIR?=ZEIVRr22Y(&co-52|DH zUOIH)n1?So234cf3mIUKo_p&v7u1!JTOyk0W+qV`W!bVZqc5v3T%Ikwlt?O$#f{Mj z%ZX)vJjrrm&9B)i*Yr(%Y>gwz==dcpI&;R6>9m|J!H$A3G@(}u%H>VgJZjdaEt^Aa zte{RzWrU;oVo32c$;TM$o8YhP4x-7mKMK_gn*=R$TYg1b5P2x}@OoMpJiSmt5CGlS z!)?RdMgZiKOty46(UoM&F5rJ$NW=G)1yCas|&eh2fHj0usN)mf+++|XEjtI z#b#-8PRb2imBZZ(ztjKBgp30x6c_R`t&3?`p@+ygzAX|oNR?%2mKp&O+CUFEtw4wY z=276PWmL1urtXF3*E7Ppo=w`A`GWJ%T1=n9`E5D4r6HoMElb|%AJ|*fACT#~^gm** zo)(G*N>nI3X`$Y{-$lERyy z7Cr3FxfXMay5jjrM$?cAV_v~KeVfT6|F^8)|YO+C|<;5RF_0!(X z9ae8wkFm$VMye?Y!&iM)G*(Y#k_Aj>iO5xF`Lrk!kkgn?h|vP2)P!o11V>=ck+CTh zC+(EhA_9PLH6nydTl}FsmWIu_e>|7yx`{&H4rQRIbnBw1WcBEq;^Br`1*JB$|dV4=epWF*y?W#jz$Y;I`_N@+Guj>ab` z(YyF5Ic+1gB+`3nTK39IASx@{agq*92EZeUNwZ_mq!{3~xxHNt}tV{N)o(IXdYb23cY1tn6ef_z&l zB#dW`5?z_hWwgkIh9Fw^GolWLIN)7c=5%Wp>#mkPG^IWuONn$3T*_W-DlR8#(ku(j zrRK~Y)}WeE6g)ssYST*LGv?%%WH7*KYU1=VVH334Rup|9>LdF_y+-9R`$0X2nC}<$ z_7|bPE!HF6;}5ISj>O_4+7?8!MX>wa1&0+hGBi$kw?3rG4=dEHp!j0;X6yvZs*kOJ zt!7tIZed3Cg)8Vm@DZL)AbiDnIjqIF5UzBEb}78!VO5sf8y8V2#y({DCAj!{sF2z* zR44|G*;qUvL^juW7^_&4_sP&8B-a)p7HV8hcXGNwh|ok+#p9gb?00>mz!EHzYnF|S99l~~Ms|7Yl6 zw3H+CECYUqJF+oI%xBwLvkHSV-JWJMFlAcQWa$o) zS<%$D_Ogg4qL$t!t0#UEoA3Sf=c+VkQ+@4?QaIw?ACr>}v`QbFp>OMLgt0Qs7So?# zGI}E2xJ&}zq9J1uhyGs&CfGcJXeox6=zIK_Y>8n%u}BIz3{oXx`O3sCu6|S^;1mv1 zO>q&L1mPPJSdWN8I9bmKJe#6Bj~Fo_0;~RFF+t}UW)x(oRZPekIRSNn-hIc237p0& zx@Sa7lC?xEVCJ5^H5#)KE&3sUQNeWe*@!;1mja67J}D9hGUrmUabb+Sm{Gqdyb+Nn zBACY~F40}M7Q6gPE8u)4%(bQOW=F0bQs9Vp++(UChh4DXM23+@MuMWUDJ>&O(J4H2 z5^)`6lA{KbqeP3zksy$H8~%l=Za16IP#?SX1gfqV=n*MHi*HAz zyX!9WE9*tXH;Hy1@r{9QUV1B{yUf=MyFNYEqRItJd@GYtwooTpnu)Yu)3BOiQAzd$Ny(7RY#KT#@K*gwwHsBHO=PaN88T?) zQ%_T4cPhw5@`D`Vdovy@)P1}X4>``Y)N6iRb*V^XGm|+RzFSf_!Scs+OupYB?N`7e z|Gb}*WR3rRii(AoNyr=UgsLdu3&)%EgzAk9-r%m<0>@zLQC_H+~JhAS1=IbgE1FU37l-R)5&_DJfZ4hfu~pdBx*gWjm;e4 ztQ#*eL|}4oO+BL~O*t%k7vMoE@I5{C2bE9(`;)zqYhi8h6B;KCVNyD4h79?50}5h^$Zd(_DPS51stA0w% z1pIu8w#+pA`DTnzAUZQNWRg!F6I=7CXV&#Gt5F#$1Oo&;Fu?gNy5ESFO}mmmJrt0E zib#}iV$=w$i3CG|WcJ&l7-dl1}t|p#(NV9L{O6$U3!P;8`#M;iZ6hG3AgR1yu)2NI)=pM&Vh4XW{fZ8%^=H*?@v|$Ce}S zdQ`3_%fDvAVl*RdTMut1pbtU)>ZgouMfXp8Va(8ppiPu+bSTIJ=&#jDX!VN-zO6b$mL?f>2$YG;!!bz6 z1+K3Z`D$$YU6-^n5zZ+7-q?1sSiShYm{y8t+JqK0W$Mo|Cozl)dQxxXFOe1Vy)6-o zEl8^X5cIIkMY?uG0MN1t2ZullvQMcmEm>Kng3LX;r-DIPyvl zBaIz|8QBl9z?=BE>gXV&>rTBv4=RjIU&y$=gpG2f``6t&mXk&j;7|`8nkiE=D&_+T zossqygx1TQX=GJn(B-(3>Y}>0p=_2>gMC?tY3iT4{_+kJ8#}6IQo2*nW9oJ*JrVqf z4pL@h<*;H@Q1q|TFIkQ#uEkT#PEFtB=)S2lEt0MyikI#|f-dTwgzlo8po_wPhzT}i zB1;H~&o=(RNw5LB!}+282PwL1RyzETI4o6&VUAJuy6$j`6aj86&F zEp1%nXTwHC354x|;riL0zTjiS{Y>YghZqz)7(YOt^v%%9-OPldHpFG^hr3z;u>+T3a+B{9nu?Mr5;tOr z(6@SovjOhjfDJ26ph6pzc6E(z0qSLSRadX>H!An-u5R4j^O--!A$(IB!osA7^HgLX zZH|aG2Xu)tzDjTOs#hdfL?SB^-ok<>%c9md#gd0L3EKn)uVOOTYEWR_9- zG|{}k@t}Q~0x~mUJdNO!n%BFpWno)!nCu^$V)O^Qc2_fhD*Lkvr{cD_li41$p#s*Q ze)wDL=QUlNRZk<8N=C+~SG9B&V9v|xn0(_LGJPIB0-`7|NM3e;G$A88WC24e#KdG4 zTc{q+?v&W|^%etaP?r{#F65`lV25Cf6-Z)nB^G`!y7H1nGV`Zg`Ic$FL4R%_!y=^a`;??$;isCs6$~D-P(rU|VJ*zEPCJKyj2L)$lXl12{tv;bD1T`V1|l(RRqF#HWx`5rQ{mHrs$w6J+J;yIFbmEJBp>a^^Dk9 z%#2uN2!UPFnZgn=;a%g;5@0ceuqF|V=BI=0idQf%)pFF|*pKo6}arDc)2(kOrkOi+-0dlB-1K{{d{m6Fm;JC7Oh+audA%gb)# zsf%W*RsxXbrOj`tc$CY!qRVt)zAdZG$&jz0a%tIJvTDq=h_kD)l4tX4Y2204dHJiE z#rhAr!bA13x-c!YgiiuF#45O9>+||y+rKTg?-DAkDX+NS?g!5FxuK|oiWT|131~2R%V{z(gg5&ZdbK- z#M?E@?l=aeZ=Ur-1(7`9ZheVVI=j1g=v1n;T{uxo!_1;CCr%l^uStDS*(+IS=`A^u z$$zb7dK5de7AyIF@yrEF=PWsM&Y24q^qafr^f~=zE}40{x3h;cp=$P=zDt%Stc*3y zvaF#6meq}?hBr-pRsB`kGP^Ix1k&I;%&kXOT9cowz+_6I)RdG5#5xfWT3}vVBHMQnY zoHA!+tOY!ej96Bj=h|a3))_pXbu6oW2p)`oT?lRjE(>6<@^v+K(@C$ZiaLxr&-xrh z7kW2*&bBCp-lLzZ3HGv|Mx6->pd%Abt^MGpg$d`8&!5OQ9=OH{3Jar5_KjRjB1pXt#{@(Q!&MacvUEy@kmm?+Y7jcIQ1*r`19&7J(8;<+W2)B%9UozYw z1P=hN4#C5KYXjJ;s&qOQXu6}KTQL;#Zmx6+a|_*!E?nX1CaZJyf{z6jLD%JMb>3X^Nay=?w3(d`^sA{NY5IHk>YF^TBS)P=@D0GyGy;D?MA-j_ zz}*9X@2VcosH%X=EF@~F=e9UI>Ij^I)UOOP7Tg7{3;BC{`3o%mp(r)U&pSSn@P5dI}-8-lkMZcY*OKnJ#ujIbnThPlnyJY#X8LI|x5c%uLbCvgTFK2Y#`6Gx| zn8kAMklxPNI(0%uv(wHv$whhT6fNt|-^%DFy4~B*+c~B~?`ej(Pg%6&^qI?+%~_J2 zvt-GlCDtKcSs!O~-RZ}f$~lv#w1G=_N+S_IA~D|XE$ibPmza*Tq+M{F_fj9{VS9$R zy06o#!+O$^VqbTB#_GcJL7wvUa__~y&T;iacs+@G2Dh|G%4N;u-a>30dA@IZpAU8_ zyjlI6{v`qDiV>&KL+Pg5`#C4r_VG6iaH=CG<8r*09pLn1C$z}}oQmk$pF(T5dJ6_P zec~_jO*tX9d+P@{XGdn~z?}vwcj>*Uj=p~$pHQvu+U=w{~LISx4MY_anN9= zr@huYaj-Mt=pYfvgK(1o7Un961)m3V&)l_Eo&Me@gPrcV!1-mI zrMLmS9au;zfWPTTchCxd3%EW6p9(C}KoI^+-+v?@&A>gV#kstn#yyXFzR;aGEZ{z! zd*?DkJ8zPAVIrq3Jmbt|+0)Nlx-5J0oa~v)PU$n;ik+0v)H=p{d5Cii$n81Q8D%f@ zP8sTSjx6G%8Qynz?QjOKhG5&)<6`euL!EchXU)uLwA@ax4hGvV409^z72g|1(+Rxq z#aqbtEN|p+r(a!Ax-0i8{SAKUpYpC4?hG5fhsY1-tLI_sU3m6eLJ?;5J5cH9h7nE; z4W-ivr@F@yK3~cmRPSi0V*v0?Cugh%p5uUpCC%_o9^s7bDb#Q#_fzCRy#L58)fm9* zcozm@&GMcf;fxu5_^ga2?CVdkAtA!AnNx4(@sY}tO$Wr+b;Kr}`VSx;>06HB4l4dE z-p}Sfhr2Vkv?00A!U;m^xgQ`|X_>$DE*j;Gw)c2XjB@&YYr&k1 zC3Gb%M83jC!CJ_Jv9GS&03PncLHIYQ8RWb-DnFe>Y+(~R4--ugyo*0DbVlsrA`KcDfRTX{;_FYuJKclhpq;VDV{o2TS`%Bd%h zli0_cw#+(Yo(Vg_`$N@Q~#+!xYLTX@#Y1*gr< zE||0M)MazC)^PlVu@-v04K^Uc&dFn~0Ej(pW z4BjcU#J|pcNAz6g`j-EE_j_=?D*^PM(3`#rKhUr14t~_O&f>Ng*y>t*Ok}(S0WKHM z+-0_>;ZIAVd4d_-^K#$oKL2Onm=nM@HfEJ@Nh6wj#eJsAR%E z){cw>pIx}^bNTEJ9QVo8b)@-gZp9uaizrt#cNYJTbE_L|JJN*@7ICY8+R;16@O#|q zJ9un@Tt4UKtiwnbC}1(Sy3CG_qo-NLtwz{(^k%B(9d320ZClZk`F5>*U!ZJV29+fL zWZPT?A6U-1*B;HW-P>d2XS5xA%lA=-*d5~!`IRMZY|+;-aZkv>S!Y*SiBCf=5+vRy zA35LLX_v-pLk^J>3nGbh*x^-0%kA3stGo99mACR#r;|O-`@yLw3Q8%)cyGt4PG$5I zvi`ltynmhQ99na|biV#&Pb(^#B%QB+CA^d7IumnW8e|T3>-5<72jB3tpQ%mX9FF$9 zqT=Ji(VlOo)8~f*6b?+M!|BGlmu8mdKS1&jLqQpej};vY)y7luZ$did0_+HI)>EmUt%Q;QWQwWX1X~p|PGr=;R@)A|~u= zH9*Pt?e;Ml!)^d5f7p)4+Jm?j0lYKjJChHDrU}fIxHd#z$#E)@oP)zId<5X3ek^|v z$e*sb$9YSUm@^HE>B!400dArG<8Y#>+|CsRIXgO=x4Q*;53fV1>DAoMIET>c&+@m6 zzvw^t8;GD&Fa*l5)GS`3r}B3VcjSx$Tm3>@e$C&<;_?!qqMrxQx9J0vCyY_&>=xdN zKu~m6G>6A0@R8_e{2fe%M-P_<0;Tq#DMa7Uxezi_4~XZZ{C&oqIt~`8t|eH+<8KRh zYLic~rp_pQ&{6yaa&%j4EA?pV9#Rdi)MN2@E*Ekrc_ki?cMm%ZcjEDHh8)T#usvl} z$f5l)?c(VWT;3dw$2xj`Uw2r@-+{Gu*sZ|tH{$rt;;^j$+WC7Bw zDa;byws2>9+3HRLMDFFUE`viq0ut)G65}oMCn-nP^VUH4GUPFZNNPoz_N4y zP`FHQN;{dC_@F|<&Ff(0EVT%?=-K?;#a%f(YNV~`PXd=QFr@e3@FPG?<%Po6)&c#F zyK*YsFIT6>1MxJFb)z)$X*7dxi8t5q8_8%5j+{WsUsw6N5_gr;x$g-qpdGU#x4_l4 z5Zc#{%q6RT<+gj+kx4(btyj41YNXavkWz0IN%dHYaqUY)cnV3We5L}7t3))-lJFK^?-E+h@ zUe*q@<*=X7!15L9jh5L@<`Wo_oY{18=EHWy$UK-X3A(ua5tuC9-krXJj^H3r71>yv#_(T4(W zdet}LseefA_*e3W6H}`o!r)4JA9_wzE;Zu2feWc`FG=jWt`$CLg5$I0(ylG7&Qo6! zSGAD}j2v8ITZ_3z^rj{sso_u3tayUA+k05n=p*fl>9w}?4EN|McEzR42x#{Kc7?mf zwsP8Ih}2#UK~$E%NO%4u(3nwnWFegT2i#+>up=M*#J2wSBi@$~KC+W$W4G^(FoWcekwtFVnEjCUf_2FE~TSJiJ7I&Yxs?!4er0opL`} z=3dZDn_SP!Z*u}oRJM<1O_I*KEuWe~FW70v<|1qye+@~#X&1+)0h}YiQoB0#2dH(m z0E<;Rb~vi}%>apO?6TNvP}4R6F0yN4LR#+vXz5L8O9Z=swx(H?Kwm&yKIZWMPiU(; z7q27f;7VLvE2g@s|8qN7niM}nKuE{cZ`%h$a^#I6}>aDyLjKs zd;3my*VHb6;A;QfPNjab+Nu4w8{y4X)wZl{?UaxEMbfW68-&K=8x=+0ey$bnavm)$ z{rdqBwtrPMwkvK4!PVJHvJP3je~F8PSryNz7}<7r<~n2-HUb@Ts7bA zl=*uo4>jbGocxO{X8EA%=!(qJfvv%-DkD}}JcFxh^1cD8p6UeWl&`-P>9~pa$-LJV z$E~WCjycl4Fp6;ercRAf3EHd<_5x_qOY;u+@i#B zmiNpnPDL&r78Mp;tvc>2D`+ub3n_`W76Wzy}ROaNKd*jb`F zp`6pc-|D#FOgoZVNj8H^Fm&EtaJVYPKVOs6_(~l9!>aVt+_xsdZO2^V^bnpzim_rl z;BIpTGw;|%vF8Aq0Lp(Ai7gE`~0R~;6 zs>>F&Fp#@}d5?!Hbi;1oJ>Re!1qkH(;|1{L`!jA});(z1tMJIT>}G)fD>B%DHf)L? z`}ZTrHe`gdXJXPpYy*fLZg<$bhxj^No5qv$7XOr1bzZpQk!8WW$jy;u7ceek7`P-t zo6utlJ+iFW#OUG^ZWQn2&WtvH6h(v(-KCmg+cmxM#m3XFx%zQl=JE0-<4d;5v)fEF zsCCEwi-E?q{4vcCFOXL2U#iiLl)ZWs?Q|_Rm9die-){}Pn1C4^Ela!=awzR%C#?9B zp>{N2R5X(MJmetl=A*sfcQic1L@WV*zgK|g+rnkN!ToSDL|DzcCi8v(ybDfQb?}G~ z>GOS?4(|I@p(s{Fh2ub6BS!m0-wsmk`JV zJO1g-fe%!5sGUi?6LLuZPLGIHclea*D}S3U@51#3rMUqw*_J4JBSY=txjR~;hzzsi z#k<~bb%+iqjAu>=g(y6wo%pJA|H$78{-Rg%_ab-XN>tiMziCJz;K%%Z%pGA|8twKc#6s@Kbbt@v z4*3jyC*;%d6I5T^`kTTs+d7?=gRF{`=>%*UTmc1)VyUSi}osbdjjJ@uB#?{(?Ktb%%b;z?v>+jRCb)~Rs zfOhXN#`S6`|4!porN?#F6f>?%l!YX2#&&gjpqCZjV4&9s5DfHY@E#2G&f)!l271)O zHkLJ5&GPa8(}7+KDVi}=?!X3mJNe*0AL#9tul<2u1}Q`adg&HD00sYY;j0IG4fr15 zU@zm0g&O>e@AX^a*S7{vy1vm?#(qMLPbS{7Aq7KYCv`(=5a6#)RoP`I;;bg1&NcDW z1Glt(nQdPdzbGUbu|GsSQ5fR4MMF^Db0x2Xw$@5~pE?!svQUV!e>w5gVp0n(Vc}~6 zfM@3(>D1%5_~jS(Y{z&!oQceIW|a>p7knIB{4>TUl93?=Wx5;Q0`S${aNPmw`$~TP znPq*zU3Me$r62K9|33gXFvqr=8IljV%f3nTEP1JsT5*A{Kv#9lA-46JwA??oRaIH* z%2AZ{97C{+ocK4HcnhwwOPM@6G=#RYD^(;lDi?BL9ZKq?(%=J>=%w*k1OCU)hsT_4 zXJhU0JVSt52D5LrLy8yRJ-dDK1!}8BfYr=k#6HApw?Oa13ht!3vkL(3wL2uQqaqIl zD8gXXim$s~bTa;h|2I;bLKQ9bdiP%NjcbD7MkaoAFZlkw;2-V<-?dkF{HNSatr5no zXe#lWkVE>lHwk)9hoeytUCgiyjAKFJuD04UO`)wQX((kpVAXrQkg|ZO;si>g1;;)lz zaLuZ+)A7W)0Z95!*&S1-XyWkkKeJ=Ec&FAutX1}gio|CQZvCX;W~O-)q0%)JG57eB zkVE>#h(=bbB9zk1npEn_P@tJT;)#|JoX#!Rs@6om&_`sCQnbZweeu4yO|=ijbW*SC z#Iqqd9S8fVYzSK?4UeQg453BDvHDy%-Pi22j}}w#nf2NK8dlbZ@;0+`I`KOL8~mr& z%9tm9O{g)>dY#OKsMqQ|Jq}xIt&#r~S1ax2OaD53XtVSWAw--su*8aon-a9%E%lXc zDMW~0(v;L;k0EOuDSwD1IV(Dq*Pn7HEUZWF`3Wj2DT_mkZnqy9gmx zy+EMVri?7-hfSBC1sEXofD9Xa6_CZA-zR((?@B+wKCla_7F0;$q zI-HfWOT@RNak`)Hu9REE)@a{ZwieD3-4Vpdnz?i#|FO#tTv@=`eKb@*cI@r_)_pk$2je@uH(cn)11Em8u>r4(EdZxhd5yI}hD^ zB_udc`v2mp(8qI=s#B&hqz9k-cm)+T3?ZdI9}stTItfqay$;cnW^_M!3a&{>yEOHK zki(R*@%XYi!b8ec(4@~5jg%0vJzZ}aJFsn zJaQRa;BI8c^KrPOisyK-Al6*sEW6EQms+>x72A4=J8`!iJM-uCOULldJ!szS z$M|L{?Gx&Xef%hTcz~{_+LehS@$s*&XK}PuRT@GeT8_Luq30W1%RYlrAIrJ)Dj=nF5SmMDEW3Ox$b7+e`+Oi_wUl z$uj9vCT%p*W-3dJMnowbT;*ak5}s2sGg+gq4+0R27>&dpB-vGx?2izW?gZEXP`<@U z$4(%BTLkzHfUv-K#{zX-VOPeU*i1CX0z6M=9ae)UEA5i6(2_C+uc(b@A8O4=vd*qe zU7J_4ftnlEU{Yu$w%^(sNRqM=g0tWvCt7}pp7=RqMef9T2%BtGX^rF-QnA!IB?zMz z@OK|~Vij`gT6ou1?nG~`GP?FX!`iLrTHfZ&Lr3=-oc$l~!E7}27SLb+;(I-9+aDoDY^NrGW12KTfz?fnht(bO_Y?jiPw*#$VHRea0kgXD zH`G*s8W^v&?tOF$lNkUPmz52oD?W5G!OP3y-9p`R1_l-{4Lcm`6esG|Njy0dS>~C7 zlEj(eAirRpx|O&uR5uchl{!~{X1*e!($hn5yH^ud*%8DtLvm435o_eViTBKPG|$Tb z)(Y@rr#OCxpO#KPGc8&YztMM*sP%B@%)JL?SBEG+7?fFwN5fep9V-=<$crn=Q(q>L z=R~CcFNqPUmqQsWt}IFYDg;Y9u@J6A)B_2+{2H5?iP89fiUfo8je_+Kr5fwo!dQRT z$9ha-9TkWmJSGUQ%n8KcGbY&XF95^eq+t3`fG@#v*^~9uGhvE5l$2dvN+&Px*_zlU z+WczX%X$?=;=67#lp_DJ&kHIOU2kr6NNGHQlTvhr&5SNeUe}y-}zk22$$Tq*_ z@0K@cbcMoEUi*Z%clqo4PfCSo7n#C~G|J*yytO&f_Lm6rCVyg%)ENzjmJ1_`Uoo;{ zXEfKUAH&|rLHu3F-FcE7S$ik~33ulc=v&o;J4wGoP!z4qTE5-3e#PD6^2jCcTGp?) zd)#a*c}6~X-|&MT4-o6k7-mVzJuq^5k@r*~AGNn5?RZX-_Xaz%rpmT{!`)-Bt;9{| zur`#Q%B>s!n&EUk`lR-Rg#8|UD^gD!6$B-jVcFEnt)SJrU!+WINVd#C6Ft;SzVGBc zKl#2}fMD`HGm~y)@5y(Wh7?71a2=3(qB>V5lkW{gIJ~h&&%HPDuIJv%WXAP)@flT} z6vM1Dc-KZ*rQwPA;S>` z_Rtl5zkbipXFOpa(?NO)==c-9{uGdq z%h#9#G6@U$9LN;V8DxmCX8M}<{Y>8!?`5DMv*rIEngeP!C2T8x>PhZC%y!?sfdn3mSId$P zi*~i5mug>a0aOaWl8$Ow($Rk*(1on&sBTXt4;28GUIhkN(Tw!CDxUc!d^WgpkCvvd z4gj9HC;Oxqh2W+);^`lT;k^t_o5bL>rp=0l6}?rwIJ{zE1uGVc!#3|1vSJ|}Ua@e| zG3|=OD;6%qNU*rGAlbhzWMoy;Kje^O)q-e%1s8!#d?99n#o;vy;!qS`qo4;{Md39H z1ZgKR6o=Pbtmv!KU#kSLi~}k{@&BRjJ;1A|(#QXqdo!1rQ>qK1@%PQ(>uqJ@ISu2)RENIq>^&87#?AUQ_=<15QtNuRknK}2) zB|!q>{-6JOo_FSbPe1SJ?`fMRq4T)&`q*ngAlO4o5bB-3bSGTCh_(TjBG>1 z+mCl@W{eDFZz(g}Z7EONF*DQ%L*>`zOPCmk9v@E&&?28!KGu7DWS!-Ru4dj%Ro+6) z5i-u?C;@UqwTrp0@|TZZ(!SK+#e59&+t3ZSVQubQzE&e2nR}kzTX}HuX^cN-zG@hP z^yy|=|Gd^TJ_q`6SRo|qKK-=MG?d|nofyI%4-}iBQ1iM}Q?ub)OeWBj7IzATR@Im8 zkrsDLJ~53uf#ST7b6}(Pi-BJEP*3NF>yjEdPcxhSM?jKq)7-_Q+tjEZH*AJ zrgnP+>=HuO)STBmrE%s4LN6#0IiBghjQY~JYAz; zI_`dOGGx|S1}-yBBVI=Os>NiZV-EqZ1y68csSuhAtAv0Hj&MOM;Y7M{LaWVj!%byJ z``oaX6Z2LHr`F7hz7-IH6#qNZc_~0Ep~&?CKh+Y-EhR37$f^#ZyDs_K73uC?x28 zLfO%~g4y&ycV}PNuT`;wNOV#_L-NFtlBt#CizB5|t6$F>SFCL=a{_#nW#G+~)aXM4 zbYLXmAtyR9Aix-Odq(>30Ik*=W2KXQ7ZU!Ud%Hy+43rgU=lOt_BA1WOf?-+>`fHXm zypN{1%xf1b(>WwyVZ_sLrT?Zj3IZAsPPs9&gd5bo#Myy zopsP2*YH-kc`aaLN9E?_$8?|+$S1lw!OcsfrrSf(gXafwV@@&MiEOgiD0T3eocJ!_ z1qX_(&Wg*{iZa3VwhC}Jxvv5$xvxTq#J&n4lKU!zO6;qshDhwIfJp4CNJRVBw^c~` zC3AyPT%mtWiYw;ZNr;=|fBfI%_B>Khye7-8qZL~Wo^yYwATDWNHL|-%)ajTEU;+PFqvmK!+lH_4cNE(Ga>La)~8G2)jxy(FER( zTw)WkgqChG7wvX+IBUCXQjN(;1Amtds;yo!+YwHzf?oxG*8Of9R1t-KL}lI} zDQp=YZw0pxrg7?<8<(wbMS{mHwX3HLe497E8PN@Rr`4c-PE__oqok@5Myd5XZi-ex zs0N{J!JFtA%9qlnHbqyFP+jt7fp59wZ7+dX4>uaz6F8{9)qyR6$prkSy))7K8P0gQ zfse&4!&0`OcRn>-@Vk`%x&X769^CJL$?fiL^sKaV&nV z$96BF$4gtdEp6kP0Mpj}PfI8~3vSylem(DZDHR*N1h&&E{*Oeq(TuB-^{V(oGaB4C zCfT-qh6>UAO@evyK^3f54++Ql@cLvtHoN^ST?ENm6^{)S+VhyKWgSAXJ%GvD0~i%U z44=5kWUXv-tHrtbZ)g%WSbochdAmmT*C3~=j0PFA0Q z#!iD+WJz=j%*R6wx2$6a@H)2n7vEu~GyhDe;(N@j6uV}_m)QLp(NXb(X6KZF^yg-m z&bJ0f)?aWAC?r-xVPuApEIzW?zqpz07uS@U#-~8>lZX)p`r#eqoeKE#`@Y=ZOEY~~ zki}n_-BUyO+T1Pu;z^0v8pYq315<5$V~!KqygJ2kg7JZA)B(jGn9lO%fU^(HZc#ZD zrPc2uM*5HqG7RZGrE}~;qN7AWpO_)xN95EIe&U~nF$vj)%B4F$^rQcZX)l#j9}6?r zngi^~jf`1@c-G9cU#?&b3XyYj*e$dRni+hG(Q{^x^z28yz~wt?u9O z9=Dt6J&9hV??mrxLh0hcac;S8Egqp{~|&S5uRq5*s5bh0q%# zY9O}zvCacJr;pQ2G3tM=4|o3m#XTFf!ZUr(#!?~l@vBu3`uJ5VxITWh0lY)UuP6lS zo{fUT{@2H^$_R0*?%Alu!L}d2nkTOP<5!EpllN>idM4`V)hh4~9=%fKC@%LYtiw^+ zy#v*C3LC)_*C}Kj?#;iX4KMa_X}`-oT=vYC8PyQKa=PCyuI*OgZf@$WOAi&dy-7ix zx1L8BWe*jr^VW;O6X&fPh0y1%R|(;tw{8*Kzer&Nc%oj~M+E9+r60Th*+mK|yL)zd zBU{3c1}``$W54ni?l*|a{RUdmgC@q~YS7k!c`-d^p&S1NIaLwNpv7}`*OG0#jg1QD zE4hD}82+aRT6qT-vO5A8x&y83PSVuM^@Wi!V8;Qa-MI1d7!Dy`36w6k%upqqReK&f z>4>TZ_c6Aljd&M3{oIKC39^QkBiTgLKay`B6{5`*;wCE=p9^6e#RXFPIPn|73k2WK z$vQ4DOx=CgoOpCOEih)_&VBdjkUDg8f@^u!?MVpFEAgZBHmi5M459{Nd>6+#EFe`M zzlRxjrUf<1%$$@14CB`gZSMdBmFe>Rk`XJt-RhP8ylA+-rs!;PuDm$X^>>-R)snD8 zaT(-?-+|(?-S!pHt$Iq2ZskB{ia?|E_ey)y#q9Vb@k(&n4Dr8AcVz5Mrg0BY+Am^K zZ5AyvjavYzDUn0|Vj33#QiqJtu8&Y}vX~`B^7vE%V}~#uTHM<-RsmysvGu%rAJaG( z7&{r0o!Av5XDi00nP&DX2sw2zR^FXa)z4bpn`xWugdcmzCPy!(Fj14uNMm;k6}|WY z0`X(OCxwQogFTCd7$3@Zg2Vf!PyPtYML$Fas9lHdMuEbX~>8mo;Px7{;b zTX3`;-S{oUW@5J;1M-s8CLF@wR@QBo$hj%kB&ZW}ZSrWl1hkoObPN6e6&E-*r4nK$`tpV&KPcVws`>pS0|JifA;p+ucD zY);B89b-qab*#-T9jWDS22<}YYroO4#1kB4KE>`UtvY?xtxMeoO?ihl3tvH_q>fEl zU&pgj&TDdSbm~1IUk}`bc4csy8qcAjUTx!<#zvtm%znXSh=p8O5+)(xTj6RN(&k2021$>?ZPC1Oq68idL^nc`Ih1up@ z4J@3Kaw)Ib@b~Yz$p2p$)W-TR(+S}zsD|A9;m|Ap;Nj2Lu!G|dguk#cEB-pfIx$$@ zJATw^BtYkZFV0cJ`x5ZnD#ua7`)UY=_qGi0>jYip{65@Y1pl0s+ z-L=fqBz5;#@$YL8(|WOqmp#gsG||5%H{*Kpvm|bq>xdm64#_7Pq3(UL$*C3hz7RsRs5sc)0d!?!Fcvx6Z zdy^`ExQ$lj&g-yzvzccU&iL8%&dnqBR?$cdVZC`~KP++a)O8VlcdR8v$drtkB{ zfX%FAiElN21a)sE#DdH7Y*p#Om0Uw={dx#$ypn6kz3J`Lb|u#+z-%*e4X?_pQnI-# zAq}tL!;geqqY`5K$Tht1HzU~a3$K!E#Ok~@O6e`QoErp&Bx{ke@IH>IrCbUvFH~&l zQfQk8*vS?WBd7UnxecHeqCck%GWKsE7liOmNTdf(`pH8SsYmPsw?(T6ZvL|9$TzpK z>HT)fP3I70$_QE%r0(eU!0{v~+cTde)2C+WvDBwS7EzwexbUux&>T`(lZcU zuJ;UzF5%3tu^37ENV9+EzWA?IkI`H=U+Ah^voS9`zwM>iskdgI*VaPeJ3YBITU=je z6}Es^ffI$Ie&DkN?*va(|GqMH!5wcR=S;?hy6r5yBI>ZvyFnc9aX7zb`@ruX=kqomC;U)6BYow71{R!m@(E_+`N@T)*~QVDupaoK5a5@U9S`bCP5C z-W38uByJE8!oNYlH7cP3r#`Z8Xfh2E`7c-!GP8fy#6nsj>o$7hcYy_~O>1WwpV`s? ztv0hi`Lk(AqqU$Ik!B7~%7Fz}hEtj*v*9Za!pH&l1^0yQYi4l=;3c#_3+@eD&LvP< zEx3g%hn8NUNg^^hlx1In#w_g5pJMimyAX9k+z_=#QqPwP-pC0VxoB)9#Eg@+o9QY99o#QHVucEIph2 z%wp%ug3D=gzoqhMwV7LJ-QZ@g-|Yx;F)^Z?D2aJFcyfSW;K#4+n%;I=D(L0P)~RY? z$)D*6jL3NUUpc(Cpp+sNS?E)x#U|a{>TZ1Gjs&l3eGXFO-Mg_|MTa?Zpl^`9GnmM` zEBdCVl(A655AXRV6Vjbtw@Bjr9Ilv{?l=QZ@RQ3=NfXBPNorK|!^X5>NsSTH)0}8t zKx0au)C*tt$g$!BF<)|&VeAoi;!oX=%v|tjjxCpFwSe#A-Vn;S|GS*gB9vT~6<3#K z(RgxER)$=ZRRHc^l4ZnqVlP<<8u$?(3|7iD$%FQ>D#sytfmrVVOD z%`sWsl@mYxl`CXYVqb%oHR2`rTg5MdsDlw9If5{S0C#H%b>YFtBZ@rvFU zu(C&VkaKx}p7b&;%^!jqE6fqjZ9$Ej%wg%34LT2avic%MFR51kZ0^w3N;3UMmfQ%Y z)gGBVAQ`;sVUN7bSnxKpJ#uqWgqVAD^?S+CLDQ+XU+|IPX~lEY;vDU(UcPDh+ zIFtxg9272!FNCOqpo`Bq9(Ysh3K%zN)1)yk@AX};Q`9yVhAk@s}fv$?9LLZ<39gFMC!!nIpJRFot&jY+!M;$ za*at379gDTNRKW^)IU7AFH~&UUGZ+EczH^=*m;7+Lo13>UlrgQOgpq;$Z(d;)vj^U ziyP$#Frn~pJp4}|5Y&4q)YF?#ua`J1@Ux|0VUl~5f@|*82+?8YrJvQ92;Hby7%p%o zt?9aaIvy$Hv;zy_+p7 zUSh|_8)smA+nJtax8k}q$iwTrzO>?yzyV~n*Ywd*x#6o&7DHg3lEDG(CULNG=ouO!Ib-6p#C;g&Eokr4MK_$0OLT96R(7_t7ig=c| zzMIor!nI{urxx|;^tzCpEN@AAao4pK7AvH{qWLTJ?$x!ddB)PxkHbt2j$t zK^*#a8l~|kKBM=gNFKw4;+*|WqZz2U1EK{)UYV#k2OE}5Zw;O2cY7(`uAssWA3;wOhc+##j7Dz7iy{g z6@L%qs=BaL2wfLe3bD0y0VldDw21pntAe|k-cQwq_2NR;1p{7geO(Yf|5{Zbuf&S9 z)7x4X3W!*nbZsVCR0ZiFOT@|AP~Ui&3stq5lx^dlE$5wJ7ego+EojUmkbERUPM1It z%pdJ;+JmeO?d3;uu|%>p)FWS7qDC){hLh5@ycz0gA506fN~}IYp^?U-MTp}=PDVY% zdQIE}A&)eR30UMlTIYY%vAw6_Oq%x4c*?$2$>$RSt9THdzn@CAc#}^Wt$xKX5i`3R zE&f!XVxLZC_Q4?M3vmOlnO*|&fDqT%X7<>#Ok*BU@gGc12T>K_8r<9p@s60xlnK{z z`iyM%R=(1ER9wT2n(u+gC72agNe8kKY^Yc-lbPDaGSdhXbEWjKZ}g|g?=z4EJ9gF4~>PBY~sy#rZQ#O(L)G$(e-K6QU*Zem9c7hiTLTN56%h5vs#V=mI|0 zC48EJBe~XOe;mn4iX*u_@6`$nad2dB{?B9Z3vlFryvI{>{RkR5hU@-e8j~5E9(hj6 zy77_cdQW?J={TIL3esiZ4o6^iHlyWoAKZ+ z;HXuS+JCuR<{SABA9=EpM<%^gWRKt5TLqc%89FO33|xJt)3xAqhREME>f|EL7-tqc z=Ut!FP&cyF1~k--EX^#wX~o$HH!r93HhdAYkZg$;cRC@6JibDtH#N}bj zSy25Cbkti>b%M8dDPiCYPlxU#>`vyUcMC9J{z|haIo%9D3onA*<4m)+;VaG8ug`$5 z8OyY`&)0^4FN&{M1T++1-wg6hZrd-tGB6PKuDba&XvgPk0YNpM6{op~y41%itBMc`P`=e51AU+Y_fZ(YK;`F|b z{Q-D0cq#86J0gnIYQgYOkEnLtqcUToC%*sRMue#rLN zVh{JO8wYQ@@2NxEo_Jq3MZiBMG-XQy{>079!j9i|w=N!#U7>}HxO2oeQA`Wd8ZM=q zd0X zkDC2#x$>lC4&lqAGV0Qk^%&_(PmHwmyB5~(Qtx)>T zlO;mvJ5QP*)SV}`dP`=VXSQ2h-jUe|Aw^!^kjXmH!{wfnVjq_~PRe~;4lP&vxExrX z=i~BT%wi9><$!S`xEwCdkY{36K?I+ONmLib#1>3vJZ<(;Ok6KkK;X5)W5VYm&)lB5uu?1mkAQD=e*O&RA<^ zWvC}uPLe1gc2`j#L1R7U*?Iy7iMOLJovI$+{j}u zj{7}rtyVMsWA=2`2Q;#ZkONE%^c}Kv=D38Tl@z4(bkd`h*S}v9wBq;g$25{^iG_rs zpLS9CKjXh);vGAIL zlz7BOQU`O~=(Irg9&rlya$TbnPBS4FbF_K?2M@J6`nNv+L;i36RU}FV?v1eLlwk?|;N+3pE-`?e0%JHFh z;!su5+NJX>VAnNZPnU?GR?JGZoY}2ut zwGV`tV`is%`emoWEqm&DU_E}9C;OfG3!IPxM}4)=dK&Y}*Cv$%@xsjO+nDXRfy+pN znG4z&EkXNnF=A(8sOngMlAfb|SJLAzzV()RPMBcXJB6viw7Dltw4CUpjoKbh(O%xu zIYI7v)JhHF4-eEjHEX&i*kVefnt!EsK)F+s(OZI6yhb&;3wf*6>?=xBw~7@yLs^9k zv0i@~;m^JzKWia#Ypr&_*gJW+kywLo?a4#6Bo?nE{H)VS7{1-!HM$l@TFt(@kMnGRp8AQE<2(}77!}ze z<)q`(Ic7X%HNlmY4Dl~^Z-9-n@97&|fT&-q*=w?#W2I{ON?mTqO@#?{5>vExE-Fl1 zzAqMMKQtgZJ(w>K=Q@YFk0$&ua&L8lH#*%Ii;mO!m!TVT3u3)ITr z8W=l2;O&@!{Zk$V7&D+(ydQ~~MK+9ai?i*u53sxiaiSe|;?F@Wg_t|viB1kAdG0Zp zPFjFIac!sE=oeVlYVILjqq_tw%$?WMnG=Y{iB`BrEcn9Dm_f**{QQpwUk4(BZ660B zhf<2d>aNjqQgW!sIXMt|M{~$k2e4O?;Mp&6Ot+c+G2n><*z1JQ2e3B^;UB=xIs@E4 zfL#opkQa6VK>c=eW_G znKo#(OKW!ehATA1UYR}A+s&epJ~)ssq?~QZX9aVn!FHUJf*MzItK&zFbcUpXh0*TL zt^p5ZnIio_iew@auriiVWZ$D!%GKdPKmU>zb*2S1W_QYTCI&UGWz29%P{VMFR6q$& z$CzCOPw%N35kLHjThlV_YbXZxS;Y4KG$(!{MWzU1#9y7b?7uDppYlh?maW%S;JIwO zj?1>|SrB9P%dzDNl{zutZugEiuU`1ud+W8~+#IL^75AoPMkPI3k*27>r`!vlgl+wv za_@OI-_LelXY0_`aUMJi7C82s=jd3fzxTxV5e!Z{X?+GmM#HS{OyhQ7{!OMcJ}3l~ zhva0ZqE=hjY$)m1+ZH4H-OQRKFu%bxtsQTnaRTOFZ$`f3zuTX|_t5Jnq45{63bHq! zmB4&Ns-ZrMSyC9r=Q3da9b)r#wrWNm;nVk0v<{Gk78=C6SAnIC=wwEE z@5J~JP{e?#JYoSTVhtn0$PAyD4Kr>9lt}~f^aSzsQq$;h4JL~_$@nw_G0aGcYa_tK z+Fk+`Gmw-UOVvVbi+dS>9%P&a?C^{~^zN z_!0bX_3;<^4|~DWf0}>Ziyl6f|KB}4baDZyUj+-S3tuDr=OGI|HzUj5;Z}TVX2EeG zxD+{TEmxicD(DYhXUy2Dyy}ZXrF2K~m$lpi@VZHSBVXgi6Wu&Fk*hv5j7I?RAX5G@ zBY!~o_7>%5#8=8UYrYHeq)+_B|G=+3gA4h;<>8U~9}HtP;M^86t+hWI#zp`3EQSBW zRrG-HE$zRCaXldTz9ivkKyWK;8aD!hzs-Menuk~Me;|!cPz)j#=M@0K7xI6?$H&^H zaWf$L7dmvK=^kF%#Wc@OIZv%!msvyxsK|DS_7K zajrth^?Y(~1L>CM5ufIp#z_SpUfq?T0fJyWmCExk-!zSXz9nW`y2wmPa;s_-Thv7d zvpif$a_hiHY_ll0O{@mL&7lo|SOvHGl7Mza=U$Rj%(g{xKEhb)B}HxZT?xKr(fRhe zTeZ7u4e!qR4M0jp3;(@(c=-1vrg3=H8;Dr@JZ{a?=s^Eom z5{K<^A6<7hk~fml3rJ0iG=e-Mgw){6XczwqD3iNb5?>35NpGExx+rXM|5s10bqYn>Lu*n zMCfJrIhA?t9HeLnyp$ZT7~;r2MM{oW4xSL>xz$h|m*YjZw~)*IO&9eV)(}JlD*?D* znNzrm5fJ=&{)Kyc_$~bZ?ctFXbcxRbsvLZ`5AA2SDkv!;qv#+H0hH0Sne1)=l*w+h z*$59fU9k4vxpdrr@U6wp_3^t&w#{i?bWoh^&Y<8Qr9%@ zpw|_HGnW(P6$+2+d~4Em@4;VgRK&O1W%{ySTv0SMQOd_yl+_>pgP3ccJ7fU-AiqhTBXC}Q7Ea0F1^ zt)-R!FQAB>MwrH7Kww>#S; zr~oy+aUN!ke=1PJ)q;^VmzqZGGM}h{3-_Y5_#0=wfyI%He1<*A zQ1DRRCmRP6*^AG`qVp+xKF@l|FdhXmpMyAVJTL14nF}G@J4m^^9-~*dmS|~(Y3xjY zo!KeEfNdvS%obNu95eFur-spA>8w5<(;wAEp2*>{A~yjk^F9>nA}XFY(EG7@gKI*~qER>uV_q*9gm2@R7S{ zvz|(0`1z`6y~U^7Q)ul^v7G_3Oo)*XS3P4GZva_$LKLrI9tC7w4sjVH*jEA16F~g?knEgR%HNWg4dYoL=VQ{hge1KHSnRtmiLK5`|j~(`cChA>KuXnZ`IkO!{xyQU9{eGarwZL$fpM~$*KmI^c{CFYZHKq(7PZ#4uOye z)g5IT4+6?0b0*IZ0xFz4X5ky4yly(4ZX6Jwr=7u7V}Nq8*}AcvDzk;_3|6hhpD8p+!kKIe9UI337giV*pQhAQEkbz8u%F&Nc9l)y@^f%w#X&MLKB@{t~>cf1vmBxtlZ=tjSu@7MG-$8OI zJc@|EfrJB4M0g#WiGkP@GMMM+jhBHKI|?J;fXIQe*ieW+xmj#&1Y*O*yI$NmPy`{4 z3P&-^0AlGR=W`mAA$$77IV)J~08~J4-h&&G6RX3!-gJUT0pfvQiT*_??wm$Mj;6KU zXO(F@1}I{e2buc1d}4D{#d}*OLh50*Q(0pWBySMDe4yt?*5$9VVWk(_QO`Fc8O%Lp z^&r21VCPOZlf)k>MUO4SWI86@527(#1hE6D4t z9ZhZXrna|HyDqDvPuY(>1pi>-d^UKY*pY|Rz2@O8IQ7`ktXb?%Vb1Jr8uy+B(b=?K z?rR$6vEXl+kz@P$_-HJB%|2D-;tMl!+I|XmjqyD&>9jv1iAz1_XC21^-Z2U{B2Qdp z8s7rrBMFZ7EoKBVmKNY~a_L)2`GgbbvuBXnT9B877y++81}S0CH1z{Iwtj3$Jpq_% z!3VAk?ylcyb}4>pb!z?VrqQ#NYsZggqUkC0!wtKAhU5bnc)Sss)C0GB@v)}!SqcoE zW?Hv>Vi+F-gKH8z+^1MG>9EfY<0W9^7-DhI7rX!sD5B>a#$j{dzoH&r$Q_xBJOa0~ zucD~$OPg>GFj93@p*tjWsV>&kZ!?*wtOUwAL z7aU8`fBHC<`X=O;diJs6Bh&Z{*zpepCQF>5`}jm|f?;ccl3if){X24K9w@n03YEmD zlg}}amG8ezWqAklw>x!tmqkXc%IMGG-Yl=uND{zht(38&PI7W3)V|t{ESjTtCf0Xk6!1ov|i1$y& z`USmz#xWun52RBENJDaFq+Hn_o5q@$^pvsS#pxxuN@dG3EG~Zpi?C(D%U-xDeBn#x zom6hEreBwxb&S+DUrpbqYu0BB#I%||t$S8~dK|5$Ps`3aDQLecH}llp1LnuZGuQV> z(g(flWWD9lUi#%O1S7MN3a!=j;|64w1%f>Ih^)>-0(94iX(_vrJ$Lq2s!M+CWF``< zbF$`B(`W)nqP^3fk&ew&=^xuIgE~<#3=Kq0E9^L3YTnf(zAUqyE?-f5w2I6m z$|)DHRfKX7y+5~-O)8Q=9AwA=w`PdL&I{#rE27S=6XJZHS~VbySyUPx9O&l0x2I_o z33VZF^xnRK4Py|8HsdH0d(~ock(pH_*T~HiqJe87QUkxl%h7^>G+oVP-2|{PK^^RerhdGD70#E0y*yh@w`VR`7oBHF&C( zL^U-&D?-JdVJB@zWzuJr4m>&LcZsBs$ zT?yV^m3TQ&9y?Ga3Z+Wah+oIX3#B^Lg1gj(?ot<)Kx}(8$eJ2V!z0}arGhu%<>9My z3#Do|OStV+Yj-Q_wMs;*c;+W!1Gr9uef(CZLGoYM<;@6VJKPp5bUS|haKI|a%r|^2~m}sH5p4m*!B0P)`_csudmLe{GI zyIChB6HpAU6HpG`kp#3K|IE`i$;vx|btRCM^*is87Imw>K^hB?cj?bG>pbxCvh6Fk zFJLpyW*%%uMxA3CX9D2Keo?pnjX#*izkrfQqjKr9Rwa))srNs-zt;uOMVBa%sS)|78Fjp@RU$5V$jOVM|3M*r#9y;LHtWCY<|x!zlAsfJXB zJ{=hExNQeKgHrsFF^=^U<8w8nYBa60`upRb2biOe@JBTdB(qh8-iHLJL^N(84sN@H zuDBG0){7}x%Qh(l+q(>mL8htRklR3L;HnVVn=b^KH`}ue)c>n{T4z@>)oQ)T&*TRf zGs}U#(8r8tB46_vvJ3Ldx)7agQutymxsk)~=`=VGn$~x_c|$Dl)RJ= zM(}px-)@Vmhd7LqRg+sQj{O8I0oMs=0&h0~9gF`3sV%M)r_hq_eB3|D_Xa*zLm$(4 z6PWm+X`RAk_%1;3(u=qv2>?%Iux>zBL3Zrv}w=zIB?A<9r(-636+n&hd`(xyK%gtO6o&p06B2pXaLv=RBWxoNpe4 zKF+sT@ZWlzPxcDce_tOipb)fkq>n7wc$sEzTh^bJWc`8nA=o_EW4#>pYx3|8pZN0& z;bxEgC0d_fKk?U0u!{9^;;&T`a^i0TMB>Ds&FnpK;;#r|k?SA%D-*&$@>d0}kNnL7 zPn`Ix6GET(TMF^p^P&FR`f#_+9r+_0c17H`X$?^Q&72>#L2Scc6I}8x3J4|TER{QO zizqNrM0__LO{aE@N2q!zGM&(gd?Jgwk`uRrO)5i1)KG}<1emmc#5+J6`3Ka_-OxE3 z;ZoHkG8&k4IKsitCmO~$A+95Yc?gA@fk`b8tI_RJfyp04xMYN0>cdCGB9Rzks%gMJ z*VDR(mi8l|x44556_>LB#*yS#_-Bp>?_pY9`5z*9Hdd2DzoW47%{WHP#maAGa8)J& zyn%)n%KKmo2C;@7M(p!}6|+yypfsJfKWw9Wxh#O?^zj-(X>_FYEU|JB6q;`;p)eb?3} zU~}gI`|K^$j>PTU21r|_{}nva<66wjIwI(29C&*5V&L2uUu=p)D!6|yDX zUF1{1C$boyUI0$~nH80BcoM4Q6WN>3eE_>_aTi&D4-Wz-zSM~oSMlbdp?p*xT|3)U z;?0wIOCvHCF;cKV+#MHc=$pyM?U|?(BX5_y3R6; zpMZ?_&BzAi2vzTar^B8>_w!cH{Yd;WJ|T*`V*NOAvL{B@fqcbqFJmT!BErfY-e*iV zL;K>7br7E=;^8u!oz`j?cL5nZ!()xH*>nVCoN7kaTU_#jAX)s2i~*VH6V?xZHI3JS zjB8=fGcG|zp5wC-h(5)>tvPvY8v}&!7Zpc7j-{RXoCMg@u@uTD(*YrT&RvYzS7QD# z<};u3iT@(#T*GXm`2R5ZC$jT*ZLaxqa49B#$VVWkC~-7#5i2Et*yFJKll6DskQQ^V z{5xV?z>cOlhg}ILd}Vh@%ZW}4XfUcvc}59(OV239$H$DVw-iv4Y;yy$0A?tIm5Y}wlJ80F+Uz@|tfChmG%am<^h(EtdS=Uk<|!m@Dr z$bg1$d6WG#YCnoyliZI| zC_pO~9~;#8eOdh718jR(1s7p4Ey8sq7l3PiK*HXWmK$ za!-f2W+rZDL3G91kH>N0@bM7)K-A9#q2bK^3&gRPvttMl6P{)zlt}HHNUx^x$?Z?? z^q02{G6fHqsGD?gV-orH`W&1ap~9=tmueD{n#>0f&LHBWZwpIVi@8FHWZL)|40MB6k8uaNT&7Q8R9_t zjB9}Y&p-@xHSvXX6XWqLasy5!Q%1>Ay*Z<~8ygt)x%8tUwdVOy zw&wd|VDTK5)n6eqM}jC~xo;df2A#Xb_;q}G4aDt9;oIeJQ0I^A*qB(7fd3@%~pqg=>CT`SIJJMuZ$ z65@MUJmGwZfo!Bb;x59!iVvPyGwwEx>j7{=PYeL9Ux?B%BzOPU&?gtqWT{CIgZ>WH z-FT5Y`w2OCu#l+g8*nd+Pip&fL%Gm|@It*?6+YICgXd}2m+pqk0Fa7hTzth}1dn16dFgZv0Ow@I(&WD9 zi9Nm0(?54j>(zOlzv-WoqR1WtIU)swWJBAtARBxlWbRFUOXo8Ykm?*c2xJKmVof&m z`jH^(_*m=tj5vz5N=7@>F+UO^mlmeq5sYd+_Iy{XldcgO40j?s@saE9!ZK`2U9k+a zVi}ODB(5EYt6i8_GG8eWb_A{dA<2xBseb(OqiOqWABsHKM8!y z6wf1?El;T#i^6MWS zo0e7f0~0!}tZCWty%tb1#O|^2_(Kd>=7D#8*~z~Hd@*>wtlvdX-miZA4rztvp!!31 zNGljt6b$^4ZgGmL(I}p*&W%?Q_$tBuz*{8nf$fI7Uaa}y8X3uO3&1xGx7&_sySVqy z@HzINnHQUxB7V-kOyx+QIo`K~-* zqM7{(QP)K8`ne@(1I*s_S7FTxEyJY#ZzX93)-$i*UH!WyX+zz?ulhdco7pFqCvY?S zOWGXmQTD4ke1ecQYEMzN!VMoh&UTR}XdGY7|D1x^LY7+J1mC%9IGV2&V4T4NCt(ysO9U!L6ff-i40jCTOR zetuhcn-YW8vv(S30+0gmEFMSH6Z*Em!rK466*zV2gIrY zhOrR{|HSAf&TxB=;`+0Pr{%ld;Q2{|F=$Q8cp}1*By0$Ol-4!91wyOvducJJ?}3`c z#>Z)S(F$5%t#WzvXHQyXt>XJR&T9cWdUl2r?H+KDIW#-E>;8I|0?uNmIkq%IHAEnK zq}?O>6NFY7SM`hqxt?)YIpg^q@UK>^A7$s}e@tjgAY%LGMh^`H6x+9ZbYvjv@v6L7 zO@f|CFEqTL4#r4-Cz$FqtI&Bh&|rlvt0?{5gk@wSa{Ag?SO4aSwC=7V?0?`vlkm{C z`Z@0%khC10Z{?)-JtnDZja2{QzJFN^LD{FE(M&|5bGR>GxYsJgZe~0A{}< z|9hjc0sFa^bcxRfw>yCka-vdpMXB&R5AM9>@|$oX&N_29_!diitTqsv&Lc8Yec*m@ ze9-A)7A)N(Kdt4geItUuyxHP^? z!Q<|Jjx8KQybgV z9_1iw=ii}6kuIV#80(t$W8HyBJHe81eeIFSYuqhJ0~9 z+Mmtzw5c84wLViDC3MZyW{7r~+8$3+6F!AB$8N?i_hu_YQqn3O|JBM(KZ$vnR^b<{ zT)P)d!v-;Z%o-NYfv{;edzU-5v>8Q$_cFW0Hfb;LAw!r_hI#l&tCxKsO+%FsPgycdLkRsI7+a}7kd-j0zW(Of4c&sw=g z_Vh8FRsq5@MA~u8Af}@8_{h^+;Y*p~tBFHM297xKlrMgD8}?^Nc^we`GR?@oWTIjG zsZgTX$-8$&ENe;asHeQiL3p5@ep+x?Q_Rf{r!6F^G=t$mc24>Q5L)$-mm&TX)R31U zdL8STtNPbRJq?j!N1lezcEqN#V%Trt&l*1z`z45V5Pf+|#C{xNqY%6!68kC;TwnE! zNNR*jY{%EA|9ZEy?vZ~z!-M8)>a)ip_1|-ipUOuzsVvJe_y-VX59uY0v5YRHmQ7}D zX4gwGEWl7^*N0N>O9a0zJ9;U(sg*UgYitr3s+DAF{vaxMsIp7_&12IBxSPzqW4j%r z?c&>haWxmO5ug1zaUD2w@wm*z8^M_qI|C?BTIKUVfKwRMkVgV;)W-bt*9}d-LeqzX zBnD;Ru_FA`%3>P7l2kTJ_)Ozxk;+!VJDSQ3^-bf_26iZoc2+Wt#o#)PmEgZIjcKIE zso%FeZO68or2hRpZ==0HZf~;p`*if~y?~s5JbLl~%@0WSelH7@x-fgc?+Va;WbgMO zL5<|zZ+tljP%ZMSc%QWx|DKMW74)7xSlN9pq>3SA2p8FAZymI*obMnXNN>p1+SoEF z$nixYbbf8S%p*Y6X9-OX?7_DXRlR%v2|T>5!9i2r)6s z=zV98lxbM+r@DL7FrQV43ZF5I+Ps8_l7wv4>NW`xvkO(L+YFItbz6mKztwf-cqQJ; z|8Sn&J+%%@;4b;pmN{|s?5HGUqNIBc&zo?e?W9~o8)~>s*R|2MBQt80pZ=Zf zXiTQnTB)hEZ$;^acd~o8v5_HtZH)w8W@kDnjm#K3)}dC$O&$GQ@qgYHc0wA$^#bm!j0Pzwv(^OP=CN~_WR zWO%g=Zt9=hBQ2i4k_gCtcLEN{Fg7xXPwmb1U+&B8Tc<3ea<^Uta%}r-$E*Qq>lg)0<;qY3kom|dwI5Ha7 zYV>?_*L0C}YBl;y2FIz~JOwdt3VXfx;8W7y!RS&|vkg|oRYz;stPfpB8_^7ek6`KN zNszCEIE96qJzmaCKT?`YS|ME3YF^JD)A5md$d&=%c&^>0Vf>uU(Xu=}u?#Co}8Oed1p+ zlBi-_HM+Q$eFck`v%rhGa4Fj)a=#8@=c~=G8D}!EUJ9YSxBr0AN-?_D>=UhJw4_zp z&@3f3Z^1C5r`dlq@;k2(7)mISeifc+mBEW)MtnIs8}OlQM=N@pHsW8lTVDE(fu`6w zjcez0!BY0h%5yrxUN?GPFw*0Dsz_(${c5DWh=)rZ(bN!{17Aez28)A$SeAw9oM?h-j^6pdz^h{8u>Zh2ll>u|TMbv9Z4| z@XQte35sGYxvbUBcbS9JC8xDgx$R62)XSY$n%$kQGzVH`?P6udG6Nc8x-mq7DIl*ufuUBpMZf0Q~9+U_5m!07Ky zsoYA@G+Pa;so)aJ(Tk&J2K%E6^PS$w)5wOg6Wvktra%WZ`l75@N^it%0I`(5=aSs$ z)BSW{gs`MfbdO-ykDNz_J{!n~usRKy>iqKT*f2L}{|YpM^q;cxg|?-6s^7$H=_d3w z*+eAo7#J%Y9{q)xHvlFHw??xV8G2iI^eG?7kqZGv65&;FB;ewI82gW^Jh-pJe7b!aKkHBTjqLfVRiIB2w>hFSX;}%gk1D zmonkbR8x|led{BB^5;=hBDW(A{S+8oM8S$8G^+qcPhwBf)l#mO@p;GPGkP)R{V8RN z5nM20gg!(&`wOuk=I@J^9G=NGDV~bI%PF4i9hDME!PbZeNPizsJ}^iZBqbdXk$_c4 zUMUGgqiMYduEYgw3kya6%2YjIKiqIBV$RorvAyFrox(W3Kl0*XxlTQ}RwG-?e(}c{ z$Y$Yp`M4gjAIQ}N|HuDd+=#w}saECVyT;Pa)D)K^d_ilLaW@_o<9_7JW|sZL6q;%w zzTx5Pf6Ql>2!wgHWxor)6nw-hW=8bXW0RhYxIHs{c7V=t8_Yr@dSyUs#2uOG=LhJV zr?8P9qP>>2@)7rD$2$9Mw|G0^o-Ae7DrWa(=Kny*8w7u{dwwDI3I>8dlcn%-!Jo}k zc(vebvh&?A37RLwR|D*mXz&*co^S3RKL(-^LZr3T;Hv~z(%OtTZd$}%t{GR3HVQG> zca&9}bW|*O(os3&h)OeVIJ=+hF-7rz#A{}DewVq7I5020ARd+1SG6iVJ3H1G;KzjY zJR>HSwJKeln@V38k97;0Uz8iG57NtX;sc=U)zfoC0_W@S7C z(IUhfG6ao}fS>Ed-s&CV^JJh!kwvf_KN`FMTsU6ypHA9v5`8VB zTl`KEPzHerH#T&iq|K74PW-<_pc*sqjIY7xf%lr0ros_Vw2H3HD2R$jo+AI-@r^cL z+$@%W-}3`*^a54^tqKIx5(wy_VDvxAh^3bVI7NC?s~!C$py>+7e++13Jsr+*P6}!i zhn@6ef*K#Ev2I|*AD~dKC-Bl+991-oA+Z1ZUaDvmfa{`B0Na`Nt5G3&(W?d5%v%DkW7i~j zAa>2l&2NjHYZNA#*D4+oz0~I7_PkX3&Q0i*dGV>VW*c!_`dD844T?&^Fz_ndK8qYF z0nZAh<=9fkDCsTF&=)mb8hYIRi2ZW3p@W;a9Vn%xSnYxV}g zlQmnH7Gv`j+unipCsDJDcWAdRstQ+$nXcJ2;2o&h?Rw@{>{`6=Dz*p_pb5z^A0X**`ukE#W479yP5P2W>;e8v)urjF9{k;sU0#9Vv zEU`w0ZF{R+CqC%BTMD7`ZY6lW>o?15gxIRgTZfB8-WetBvRkpV2s52`W#B1!r^i2= zG|TP!=4W0Nek5AuSzf>@pt?XnO9KJ@THaCq{AQWVlbl$I!_sOmCtAQ0Ik5rax8+1u zX&@(xA;<|=b&%x{x*AmrzEwFf4;P7?SOU>bkER&35;L6>Yrx3~xsAziex-wK*Ec^W z)=9v+f86K=tOCj!o(!lMTxWUPoN!^eR)L(5YE+KH(&=6`ss`89XdZZS2qOj`)89zm zHHwQvy}WA%PvqS?vDI!ZayvS>F-8P3uK+?JBi-ochN-E8j*kkwISbyDf~zSDcw))|o?v*35P>O+*wa&%onW_~vViBidd?z5 zaLxj)=PWhg$wDIrddji{qV%KA+uk`gx#FEJ4b2d`Ftmc}!mvT`ttt$5S)ec!Lu{@v zxRn^{OsWCbwQU;4z^X7b1;S}ghT}TH(y-aW5SKYiE6$|4{RqART&60v zOjYciA(*CQ$TX!$2ycp#GSiWK5|>(e6P;lDFJ81e(~-8l3~x)nD^Nq)DhWalX=g#S z-?n$8X?JDfS|?uULa-D<7lM`Gx)7`pyrYGn!#%1u{-FTqE|pLc`L_{5SLUoS$#PN* z?w1oaPc4T|G(FW2+R?m#qs2)_fjlSt&1Sl^veW2Qaaj7}{z@RT3S6c`B9LhjTvgfl z*i)E_Dr<$&;P&*9S7mHrce<;$r~AdiU(AZ0u#YY$h_|lF$T(c+T@ZkcH2bITLvUJU zjAorCDx1}{8hK4#+w%mm6dTJ}h?_zZ67siF(;N{Ur*u4T$o2FQL0aX!n$;E%jnXf? zX=4evo^w}%>$a^1Tu&Qo1rJOcmnb)dYP#Iy3ZZADYamL$^n6~YYT;tjz;gWzDT3`9gSw&Aw+k4UX?B|4AzSDhQf0BjYCgZV{7O zli|LEv>vLIrzIsMqdX8&0fY{z1YDQuO2GpG)s&0;llZBSYB5cOv;;zhWY{9BZGu!O zlz~sPnEA5WR`A5YXM+&QfsZ{Nd;Y+u2wX?03|vRatrEhElNv40QjR=&H2LFv?qE-o5kBK&T0jn{QJ%Rk!0ToS12GpT35zU_n zIm>WYIz$RT#jpxO_Xo4Ub(YtG>nvX?xNciriug+9=(oucgJQ%r;vY?aYGo}q3sW_A z7Y&!ftySqnM1j&zuE&GYJ=#0=WxvWy&6tRBrI{7KcqYR=h`j5v<1&sa6a0@kO8#F3 zuFK6Va9wWd1oz5~5pCEfQT{w%_Jtiwv60c*KRS%2K`Ysc+M)^mYFhyrAa!9S_DlC; zIZULTYakMJVI9O4>VkwX^>=e?8XLt6T^F(@CDT+4uG3U5ct`6(>d??lU5@Z7#U^#a z9~xE@N}?FggV3YA#o)RWH-ZO;hO5MpUOQz5YlvQl1r*ZsliNVMJ@OiTP{`p+wslM z^Cc3nZn~PhfK@=vfq+^A0d=(Hl8UndcW&t+eqLl%2C||A;!kRZXhHVQIBrla@m0nzRx;QIpn)fv!pG#K{qU?irHTx@s`MH<1S0ML_ zA^hBPjdBPbP&K#?s6*N3=iWTrl^*Kn-eL%ydyU|U+*>6El6%s0wuqA&)AicU^#L~q zQ;UR~0tn?sh8iUhr8CS-wRBr4CjMlvMsRw3H6W=ITXPt6%YbC5vgOV8R)XsR$r^AO zkhrp8V4VFhS95`M6^ESMT7B_$AkDKRR+wW}KNttupHi%Ko7N*9`* z7-b2BaKCyQ^}k67#eGNQC|Y58YlSIWAxmi{P?4p$+agR!6}K#FN8DoAB3@~gG@omZ zh>K)pgCvvHMv5hpKyUHeC9*?myDm)R>{K;dk1TV2d&6&@r!Q9IPmV9UFlOz3||%zN9!3!?vF4oJwL zb5M>V5wQJ$0dj@bjN<~tUJZtERRdLEz%Jb1_9Iln-o0G3k|6GTI7#5^@?@Y`jvX_#e%DjEWn|_vyf_7<9Up3%ks5TQ;XVvDh~Wa|>6*@X zdO@zj*9m@hH;HoF$9^Ky%)Bn&uyq}XG?;m(vgi9wAaV|y0GHJw?9g#{b;iE?oN07n z%WH(~iYf!LpX=(Cnh3X{5lZ4wpT63yc6ul&S`Kvj1J*h@1bH{?lE;>99$WUWPD|bs z+oPBFI8?^@rggJBj5O~+orZXg|I8hE5U!6IaYn*vfU8BhiS8(lB_FLUMdr_>(9QA< zZagvJI#ROGP_Idei^z)*@|sizuSrF2J&gpP4k0g4$zI+BvF@}@AcjTRw~HhH*o(OAcX&#)!_pS^_ms& zv+9t|$(@6R)!a+A7pc1f5QF>Y@}3rKD6BTEekbt+AAr6Q8j7Yhl8-XwbXMSfE9;HH zNalvnFmO}fBK`{RLyGL7?9v7DyPDQxrCfhD9GoYurt?>L4;Nb>Kpn#T>+VCyC#sX^KYTcM zy&d7{k0kHpH7$a+p5;H0LA(Su=NKxnyuX$ImTApBfi%rlcw`KJh09x9pTGkZ4I+Nh z$v!Smas3Q&Dnd!|>N)-godOOE{>We9!h)U)5X=F>f?Fy1Dsj(n4dt0CPOg_ad2?PK z1;eYz+CTcSl`xLJ)KJfTNf>=Dr)iVe{@IL7y~4*OhJU!3)6chff%oRGa0&b#h>?^Y z3HIz zs(}0*m8GW6SSqn(@1m!4mHm!Q+Pl7lJ$E<1xjmh-^)yiMDsAdQYT=VW!Hd+GCn%`$ zidliYVzwJ)<6NL%M@$}~3}hStAs0zbrVuOvl!?d8*-)Oz8+-;= z9s^~=&5-=9|L{?!<4tP;kyiM@94V-#99<2R<(qjAUTYek17(MsA^BU+(gY}*mvL+M zjXpkKDzARPj*HF))Oj!1jo}5m>%qI8&CPO!STelJwKus(y0I7K2#6j6H_zxzLjpw4 z$S|!(%DB!Mi2l)BxkM4!(fx0Z4VI}p7y!&GsOoOB(}!~tx2QBj=TnRu=uveuhLj5Uc%<`6UVmo8}R zNgP%Knd-z*=+7guc^@BZ4WFK)fH%|~*CBOFc=DR>96VYI#1@iUi?VQ#-H)CDi0w<5 zq0Bxy$T-+CAilSk;?Vj1v3(hz3ADEHDv6;Hy0k>wzXB{)%J8_zw3ZWrfumiB;ik1S zJ<3CX7^Gjzt=53xXEec5K=7&udA<_>$G=-gYft|QHf1Nn=)om!FYrHtEa<^`vE}0oUnDOg~~$<1uqR*urT{sAw67?Q0m10E0g;t=#>5 ze2Qtw!M-N}v2)^qhVe5XcH{`N!m+dLdNSn(Pk%mtg-@YqzJ%xIzJxz`7t_ka<(}f2 zQwyQku{sikV9NoXU9on*hK3L**;~?3Fi+d*1GW+vK17m`9P~w=C}v~xAP!g9TtRBm z0v!QlKgM;aI~vBBCE%xG;NE^UZAd*7LqgoE3rUk>g;&U2DayGeev$rxQXn-dcQ|P{ zof0fJ&gWiaT1S=pc(KH9Db}o;_E-^2-}m7uZ#7XyiLq=nJ@Rs>b=2mHY$P}+%7>1RyJuGQMBY|}~jjJyO=2}k+}lkz6c zqR?nGb@AWzQZAHAx|Ff2aZsr?oUNB3Jr6f7yi%`n8{SxWm0sgTU_R2(m>nv}EkltI zH6Af_)js7Nry!F0U|G^;hOP&47{9dHY2D~au%q1okTBD^ykmfMc`_}{72|)E0p<^g z{Nd}eqN$S(bdpy4A0OS#4X`W)gjaM?>!2NTmW(OE*DA4_FU$FU22`T`69Hi&BH3A}Pc1cR7yI19;)^bx6>w zlS>cc5$IsZk_9+QKgOMRk)Sq8!3CHU3rgxKhJ-(8BmCN3X1Qf6R1s18wxDj0FMw+y z0p<4v<#*eUOgm)`nFj|4zG1DjUGDV?Yw>39=}c5l#2zY2~6RFrbOj-$h4*JG1qa?ikdaEcD$-8`gO@ zdg!wq7pSK=df@W}GW4)#OZOKSz|lar-o%5~l%%n>v|Netcepl(7 zUb1EoAtb@V3L0}4KV9j+%n9f6EDu$bUINEXr4;=PZFd3C>lz%xW=C%WPiewx51S)* zK4eV&hdtGg#l5o}%ctE%TOWbr3xbeH$jDzH+pr0ri!U+#zKa*pJe4ZT3!Onop#RE7 zWduKr6*PYIFnpKytKfn7ka5(%@zb#->W%=8TQ)8sn$T|*R{Bm z_It97dJk;L_@RV0=nC{&wjc$w!TjgZ5a?-bny1Hq2SFD4jZm77@k6yx3e+)vs2NPb zI>wKt7D9As{AhMacOAMVQy;nx|8pCA*EU@L_4He5k{8nS!G!k*PXBo49rno|PXEIH z#q{0A^hpW9@4uOT(|bTR*Po4&x$ z#Wcbd+Sr={hrT}G#_m5H`iegqx{iOe2!DpTqThCEz9C)E|B1kUzX`a}t(OMNt{`hj z{|^L%{{LgYX=t*{q4is$H!lWM8E~WK5Bqier+$rYTYgWe0EJX`Q0Kp?1R44X2Xcr0 z_L|XyLWhQH*Xe)spv>TZ`b*;3?_4#w>tpdwuz={@eGn%yO%xC1%eCqP{zYFU1)P4ZlnKoN5nj2vL5i)X)!66A-9-reE{QxDFZR*nK&Zy@DiIR z(Xz4@xd-XWr!aVquE*zks6QAyOgUoQN=1jQxOFYv@*s1{D7O&Jh%d!2GlpQo?KuxZ zgT&Di@pzD7Sbb{@q#rH?d=5dmvp-|s;pllUOq*U~F-IId8%@fK78uZrk#?iWY$O^e z^BBye@o^C6IC_o&&}YNY+>WE?%eeE|&2Y@!g3Q;L&8;o>Ks2DYo^#N`SIF2Xg9rMR z{Cfl1UXF~>w*2dT{t+-~W(Zrp>JO)n`Iy`QGrBe3_IPyVcUb7${4NE^M6N80FpF{J~xTbo3k|3Um$7}}-j ztfvP5oxxY{!do^!2c-JK0*%FM3YX4?O-(m@V0-v9=5`zz>~VIT+QpcfHuX=aY{VZ< zotk1YZl~bg1JqO+GH6P?XT1XHNYM-)@F~fKCW0e&ohf!1&JR+$)f79W3|NaJc4Oxf zgE0l|sCdf6M!9igoT(dym>rEo+F=?XV$3=yqsN$?M%vgujsR04b)KFv&!V&zm%v(r z=K>-6_iWn=m$w94A_ zPtzTmK8t;36NJ}hB=Gf*AGcvAWjoSucjAx1BBo+p--fz^qCe53|wrLvIz58;a73HWLDSZEi_yD{?r zL_E|C>B5t)F!kzs;VM(FZX8pppb@RdyBBDF^C+{cmq3sf4`uWTu0h(EU@Owb1ou-~ zpJ3>m0E0L7=9JJ^iPH67=nui6PY2{vYJ)>B3Cu6-5&COD{iKqX;5Z7DJB}WDb)u0RsT>$p9Z)&N1-Of!h$#I8O~l@sCLWk&X`O?Qr?eP++|8JL4zjU( z;#jx2c5I%ewIH|I6fa^AJ-8JyU+y6yMb}ftc!+4PsD$U@DU9_vWsDe=Z;&xS7LnfB zD|zU3kae-LfBVLamOl$GrMF-Be}5i&Sc!i8fh`_n{w%O%J?jFCJmf`Q{PXb2)fAQ;lxR-UOWlBTM*iEJkA(Kidvq6_hmB?U{ z!SY-`cv$3eDLrb2BjCc5vB-!>sv4?%ohd;Cp{}Bg{=9uF(gRwImz}iJoe$|R=sw1V zDa_eSICyag2RA!3&9y!tpW1(@y=51%}3LLRHrpT+&;f|Y; zK8zbb9KhG)9ztfk2};m45RB4;BJ8B)DoAhoL{f4^G?Dr$2-oD1Jv2^+v_a{6DQ$2v zqz$a?K-wVm)0F;;gs!dN|4r!{p+_kHp9wt+O&Ek;p+KuQMn4ZX0w~=>W|u^~7{eh&O#(gf%Q(scS;fIt7-4FUMwQM@+`dQ@(2 z@yuFH1OluwwPzGoA#EtgTah+Y)V)X>D(X>6>ndssNuUl<>3^W3qFqu^Pg8rw<7x4c z7#-exP3n6N(#GhM=Aztt2u0%uyAe8iu{&ff!OiX*?t6#E{|d3#|H=U-})sI)Qxx!Z8$W2cWr4#dJe zgk{Qq6Q6WzM21!}A2uxE9+0r#Qkb=yO%k1DI||aCO~G}#B#?)JXA|Ep_zG8UB?i6+ ze;?76)41~1Ex7V7{yu7D0o0JMZShaEXH0i6JwVixfhuC4E|!D z$6v@Eu+C8vO|fx+#xxwG`kP|!#`zse#|tjv|0uRhFEgSLrvz+*Uzx83G9?^0$*U)8 z@k*4o-Hx7cpbR?tl>WZKpS%Ua>Lnbhk0A((&ckt>Few{a&Vx3EBXtXW0OyUyg5XF+ ztdz29F=GdCq<)CZlMdjZQ_sXAF^4jha3WZd*hU$u^CHl>`zpQI3RnUMafqg0z5&q@ zH|lr#BH^G+r5O$xWwD8kz(F0cO!Omu!p_`=P`%?gQt^p5Y~iu^7*u-Qj4eD8C-SI+ z*tN%zihvU)1%6Oo`<{FTz9%nADi2_*gT64IF$!Lg&oM>%YJ3L18sFmopnL{>P~P}# ze8#1ijq%<2419MU!G($1cj+_mU3y*L@Qu}W;(KqxX9tb62?#QOoPMKY6F3GUUSN$?b0qi>G<6sUu60vE6P2O3pNlUzotmKmmHr2g4G;bxAdgt2;NV{a zFYs;|!S7Ud)(~4cmv!dp-Nt`pV7GLOm8py+i*##mLeqDx;PL z|&(BctgAF`h17YHV~ix_h(OPNAJRvny9t-1o0h+^+@Mr z2LH*+m$mkUZ5;YA;AZ?#BjnzIyf9_(rYvfGH?^LaC0alFziXXE9S!IZ9WVjY4(csi zz_f*(rp!45H6je9b)aS;{f9s`W{mTHglR<>c)0=8d1&o_1XK;C9vZ3+)AfJWIIzn9 zJI5vaJy6ktbQ5qDd{Z!$@{gb#k>*=CTM7=`g(#dOCH>!uy2h9)z{5owp5L@_(Ydri zlahE40_2V9K{&`eqMtFbaX5-6%0f8g#NZXhlVk`7yoQ)5Zg8yoa1eL9tt~Z#pefI`zgODCGrV#~Wzo>%XgMWU^`6h|Z z@+7;7U4~-}U$@&F-*V|8m>TgA-#F86%?`94c^H2b2`VKag}d6%U`V&%V+PM0HZjxU z-`)BQxB9(;TP~_H42N0NH4mgyG7IT$V)vug0_3Fr-4V|y72?vM@%Xy}hiSHnWz!W? zAB;X7%ca*xj_POh!q>o2zXfOdwbF3=D)@T=S0Yd1FFF;qSK%vd18YpohQrhknR^~E zvG;M9!tu56gojORDh|_w;{nD$**ALtQJ{owQdW+PwF2W{>>MidD=INIR7pF z*&X;Q(5t5)dbZNkf_prUwKjg{uad%7ePiUn@UdBz_#!TBMPc*T(GjO!>bz+N=Ap%a z3t#v9O&%(M_(@Rlm?TE|AW|)wMl%;vqiZV6Ox&hBQqf@@VSwM-Pngf$e%6XAkP;_F|3lL$rr#>8$_#%edfpqYVk;!WlP3$zKD`O(+UjXkie!i!FiS+(z<@kodl$Y7F*R`T2a^&n#^C3nJ@rsb;yW0;hx*h9zlPG<;QfQ8 zv40xS>Yt6hmFnta-;cCD_H1?>nR6XHUwxN3O4|G)pMAGEZLtf>k<9MI|IN7n19&=VpC=?X>h2fAG%`KFvp*F|Xk* z?Pd>UYuZNq+w3v5wTzNICf@R+`E=W{NcptHarp$_5hPc(;bMh}pM3$fuI(_l^Bw;* zAEk>ODE~Y)b-;X_kGS8wxNSs&oMX}owY+2A&5wo1$El4qT2DuQLY=m0r_JrAwmnao zOUzWigZ@^vS&o@o(dikpr_C}-UT@;5kE7|ck5T(SnzvG?p4(B?#PN5W8d+>=+wq_| z$JF-qFd1plEO)QP4^=te(iB{iT2mo^4Wdn9H|X=)|hVpI$Q>VyhE_YklJvo z)g;zFV4PSyEPW7$EqWK|boL;IG~_{ZmcRrt7Z1S>&_4T~dB3FJ6R^WbD$Rsu7(dq5 z6EKOBA##?f&7CVZ^`u)_G}JV05+e2g`=0<-nl_C8P3KsQDJIVEnINZ0*S*b;O^^py zUhy`V9O(6Voa1o*80Xh<{^vV*TmDA$TnEs320|Umn@qIjug!>=k9EtN! zIEUc6{2@LIf&3lsn%EOK4@SqM(err_#9yKvANm=E>p%8`0!osTe{5oDxUe5*n#s2~ zx8Z!}CwNc}=O1v6#yJ!Y85&?7&ex)&M?b@Jb2uOS+{B1+zlAe(Jn$n8Qh&oh?nS;g z1^|Gt>0g+b9p`;G_r=+_57$X@zl96AIEQ@+9S-MWoO95y>nnWE6eCtnnOHsYOTRU- z8k{@6Gl|d7&;K{hDE}hP)WKUg6MB4)^H7|J`~YnW=S8QX@5q2P^49|ri4Z@?)3ps8&GHKO<#XP_l}I2#y% z?xzATsGYBdfVgn|^ci3S0Ja(>{;=s<_cFzxypoC#&5GN2ajZy%25&ya7!nE;htuGQN!!o>Qcy*EaJHcj187Ah%$TngC1afOQ z8Ul`uL4i=L=!^@r>kgc!q1--;Mnsta*C~{b2Vzdcxdvy#;bxq-W55Xxjkq>d1H#GZ z@KSIAfT;N&L1E)l zC(3cNkM7WjwF773?Z&SU5)vbw4YS5?%KH+VhWTv&RALyK|EHBBO-?KKOhFK{^Nu~{ z=(gu)$l20)DJ(Z)cHF$~^X0kSVbKjXMVfjl74f-I&?=2geOOS~(C)*!k4U(}lmJdO z7+-*)Li+W#^4anQrkGz!yK4%frPfvNn1TMxY%bO zs`t5UzQJA}KCa$pf&5grbz!u$mxuAabL3=RnjaL)FPk1muW3v4x3?_aIYX|3}b{(3!7TNc0iLOGcKvRGbw?r{1q zc)>4LdDyvkV5yR;Te^}oxOA=CX00XihFGj~+bIP>Qq}0HwL83m?veF1*W2ih>Mzp` zu{9Q7gO{#C3$)gv9leCtNLU-(buN*CyGv`kg+a_T)Oa0MyTw)SbW;^5k2XiG7z4(G z0b1&;Hm_Us4WZ}uG`QULR1kN)4qsz!gPzfc+c|J>raDKRtwxLr^18E~2xJ-?EFP;i zVvJs|46UHEN>7ZW&O@z3{)zHhaVq2=QZ%fJu7iZr&Q))BG*QK#{H#rmUqJQ!BZ0zz z#J{ds5Ul;?k);DV{eQKA}=*Kv zpT}XdIGP$9^#Wr6cweo{=HMgny-I$iL*}M%p6-+G;Q=S-$UR(_h|GH>+7S5k@ z%7rm#T}LFO>Kp55a0-vBma{1gMPH{rSbOU-x`jpZc-=OKPap_p*@+WTyrEhyHFf9r zR?7wG`u%FT%oN4bYUEr~7@tuiuj@`IqV?XBe_A7_pp@#8d*ODbOCH;8E|AI0rprRO zwXJu_iWJgGGHur`k*Av%oHHN$t32nwQGnXOUoVx;oeK=`$z{@+pLmT=&Wp>6paCWc$#@@vl`6{KU5<4JHDz#ai*8Kdcs=NYcv7@M94BxO)9?DzZmP6W( zu9p{Pw$-)Cd^FE&lgG6M{USeE(6)K35^D-4okFlh0zpv`w?3mJ@{X~JnLjs9Ddz`D zl|J0FPm$Y(j8~>hW@4+nWuo#hzqwe+FT!o)XQG4@G#wdIEtSL&Lwn>wf&r|pt`;_hxc_lV$Nv_>q=qRaz za-GW;wJOQHZjKVlTP{?l@Jm~j=(f=pDmR$aeDI*$f&%_lq0&E!)@$%!!H5UXa5&Ec zN9H-plyn|aqzp{zGj3KNIpahk!V8w-H42) zN=ph#N~)@IN{X!3Qb&%>-;~1Lm#gDMQ*G}oQQqjzM;9woVscOlKW9NsZc%PgA<)h4 zb@Rv#Y67n~pbm^I_am>ELQXElaJh`#PLPL)v$PDMn(C# zC3&UA_99zuVPUa#3^(1N#`3jZHJo2@05zy_sl1#You{O>y|hfRg-FHP+(Ks8`>alf z0Jza^WQ3#2QS2;q7UvZdT1#!t&Ur=hkq6WP5nabwT+DY`G0Z3SfM7ZsA>1#>FSZpI zqJ^rG5}xz362rgps0zRO0Omr2GL`ehiAqXDX=!1;t=L*%x92;noTa&Z+(e~6pSMBn z9Q&mcm42}$wvxh}d}nbnEVg`We&HC%zIq3rZa|Q~GEteCUg)qF78eybOPqN*4tqiA znBRak&kxq9KY^$d#A~y|M64>VvN{TKbclxDp+=TG#3|+D5T1G)^!XbO z%iZ~ev&wmGKm4qmka&krkp~3g5Lln58S~4@$w3p=(qd;`enCkNuwTfum5N%#&-|)X zv~51C>>6mw-BO^Y^N2xec-un*)j<*b`xLODgJo(3zuW>sey&Uj<2zhPMVG19w*6A3 zJ{;sP(<8}Vl#^dlT4*b9Sc|Ki#aLjlGLOYq>t4oJ9{@Md$h+-<3Uy`(kLaiNXj?K# zJuf!#Po#cc|Ngx43MH3Mu2SRMBC6EYrqrGHO5wU&$J1C@9qet^0UtqZ@M_%Me$ z$~2a*bf|MfhoP9JQ?e)cyACyK_*ZZZ&T-h-o2c@)zq#r>wJTPzyJ?a%B~qSQ2X56m z>cx235dcTm>Y0P*I@K{j^Hj#Ct&n~E3#U5L)WHW=tHTyP4p><2_Oiy3au$RJ>Y-7W zWum!q_9?oAQNYNFSYxfX*E%f1#?Sl(XZ2W|?pizh zkv~zbjw?Nig3h`Ib^unKt;S(n;;>uLCEJBObZydhyDpU&%zQK4npeu1q2Hs}G+}_T zt9Vn5+B>pUAG0>h9+;MCsa#rEfW9X{!-vi1WwFQrFkXEwFQbZplxX`4wMq6&D z)8{b2HXY!wSiIF1x4VuNU>26Oa^J8a`gp|P`th0z)$zl!(L|lKsjSiGy4X?9-a|{m zgkgR4!fXi=K7i<@0MOMn*0L}8=NDoPzvJ0U)NGT5kY-xXa&`(W)H{~xa~^5tr><4g z=HExH`Q2!&1LK=vT}H^Xjhcnh#SZupN%$$IAsb*`u~lfnYPWg-G9SAPoe<@Cy7RJ6 z)jqsqlMJ~=VA`=n?ZH>psu4wxp@L}XIa+(Sx6azYZbQEslB~qM9liz^t^yVO1bTo! zR;vy*?c`@`)sbOh{{`qJQ2TB^wNA~9%*6&>XS_kLjf_9NKy8RSvyrCpJI$UXVv730 z0oGN&>Q~P8VLL<&1p{E)XJUv%=R_{BLpAK)cO&mrua-nzy~#ivm$pimUAN^1HIA>U zS0jRgtc>4jQZuDHZsd>LuBP$&IZAiZaVM(JvRTU!0!Oe zTd+Y4`mtASPQ0zNI_tGU`+y7rL9R?fB&I6*n=qiKAb2RdR= zCN^}04`Tvc7;Mn>{M2Su=vBib-Rt9A?Bj1Vt7xKus6ZIhTgRLWH8$_x12 zUbSCP)gi{yUjqsZdI@viw^NPlbJspvU#zRc(g?qS+wNeuW@yYpN6lgT`EZ|_ES);Q z&-bZmA&asFY}nyVVjf$npc#%RRT6@BY-arISePt^^)Rtu#5S-{;ntZzE5e?_@cbMx z7t8gBsPMUxA=TW%Px;ioNxxnQ?~>KF1gzKQumGiRx|x_|eYK;E-}i}}5%lj{8DDjc zGFANvpaenj^uMVI;|5I>jt%x0Iuz6)py;S|)ZrOtbPJ5Kxa-j(5Z>lsFWdwq6XUe_ z8mkN<4?Dsus@47(vvv?(X(lM$XXgVwsv4c-mI8X5e}kBJ3?K0irC9pmX1<|OO_C1m z;P*DFmVwbguEu(*4z$rhdObjhRR`yWQLBrqK8UVd_qt+{ns@N)m#PI}VOR#u)xz$> z${!8}Ci{jf3#1Qs@~O+zjG#v~c*pQH%hZ8A*41F94R&{918ZNy+n1^NL3hmrx2;f; zr<2gCA~Evty41(5K~Mhu7_}v(Ikire-xW<_5Tuz+UaO7P~HU&OgHVSCvXu z^xv>`Wp_BOaL-w4-0mf8@>a%sY*SK#O0Q%5xm8MX>HM95l68rr%m#tp=yhZR@6XQ{ z6sW_ILe8t)kZ{Xb5r#pl%3cAdN&iZT<`;giY#jC~6Xk8o?CetTj#?{RX@0&TtsrdF zTVJsvu%9*qwy-ia(@-vlBa-pRpOl!Od%_vtvsg{+DMv9j$Y=oN^%#WWk_*$60leX^`wjzCjpFVCcFjH zfZ}8+vS$_p-0pe@8+?enmxCpwxAOJN)%=#*fHoEn@UVd?7#Ez4VqASY@j+-D8akxi zDoD(-G?#q?*5`2pnyz~CU|78kf`OTV+4jb|D!s`k!1`#5$I?l{a5u7+8-x~OFSBtc z{0p7-iuCd=yncn691*r1Oh&9MOnFwnS@5!)R#oOx4ydU?H*69l*PrbFOzG_Jpx&`o zk(0~WTcCbF;fwK&wh@1Hd-x;U!P17`!{2#OEfC-i+PDLFcb<|ptUM00gzC!rf}@D) zLaS`7*A*i6TqkgR%d8%QSk_@Jr_X`+#BY8{mvIdr#!XNMXMc^+=)#=dt|f%|H1H`4 z5CKTZRz9qa?KdiUa5<~M+CnQMHN6+VYP#Ax=8{18OaaX|0~7hRtCeii7;ZVJ#`D(I zN^GP~#(hCaR-XlWw3v6xokb{a%g+vkh#IMVQj?1F&5u+~yfean$at|HKAMz-nF_Yi~FK5?d zXpW1@T={wB>{c7&!)3K^V$c#Gm%z!BV>KRNsd6{5?+-J6(PU*%Pj#~)=&RiBTKG0* zlBCV#!I!9E!LtvcMRGOsk&SW!FTF&a9G46308VdlSZy`T?&runqD_hE#j=2<77GMB zM7jbMM5r4U(%V^eBR_VDnw-B4Mf^C-&MeoMjSwL$ZWAr$AF4E(tvtB>Hvl98{t0y3 z;BD5l?@Yjq`tz}`+8N&vqYjSW&?%TjASJoa*+s1o`v;T}`DehPbFhc*HB6|V4~oU*_ob@Iy(Yl>0()T!9-Q!a9Zpx1#p|epz5qeQnl*K) ztIs5Ff)*`_EM#HMdK|3gU@d)SvUxP!_smWmb1~fYdEh> z;2F>cbt-ss5}0VGS^4OVe8635uTJmNK)|~cjHd=l4{OD+CL=yVqp_Jat~wTjA?SAK zDSog`O(e(Vt%>ccbd)6bnwO&BK#e|D0qyA2C^b3u1+)YLgkt!to^rFWoA~rA)aal` zp%xx-D(TW~+xXfm)O3>-qyueZ{W9?86IZAaVNU2GU?4yk_U0PKJLaeby$Y@Xw)rfC zg|!YC2W$ssX@xj$VE02iP3r+p2zw(hb~*SSOfC!AyY6}mv0qkxV}PJc`==VhkF8O2 zM=iaXFc^Ddg6~`hOc2s*HRcS-gpGg(mIeX^hSLTj`wFuZCV;L=u^l`3lhtbe?CW7t z>t--abBA}SgYBOQB8Ps+o`@3Uz#<{4s+t>M+>jQ=nz8PhsyYfhg?#`-_p5D|95xt~ zXBwxbX3q5nut&BE9d&VCh=I2q;Ne%P$?=!`7B%vK8c#sZIBm*^ph{p6Sz*R)1zEK7n${O%N`Z{nr60eY&2rBLIjBeqW4rJ$?7^J&+rNrRiU<=0FC!dSb`(bzQ@ zYqbMp@3OIBm^UFLiMD8dvPli?9t~xq)_QR>9t+}wm#BlJOAZNVLo~e{Lu<|=2!Xu> z)J&>Y76zS}#`urtsRJ(j9CZWy5gR~6*jl!;k1?k}dtm@{i!{<6c7b(ux-}MoM`$+s z8ow!^k?!kFkQgK?#x+{ua;wrbylXdL+aq%q580sB_H<)-CNt~_DUC)wk!a9Df*rLXQSoCXG0gbxuV_3@B<+v|o2$}OFLG0|? z2EUjE_hVzP^ZTEO5`Kh&R4IfoTR>|mcIDao5baJ!gAMbBsaXs$N7@+QuntPy>`hAV z*f%j`a$)JiosRM#Guo8O=w8l_O~cUK?7&TYe8Y8W?>@Z&DPZ$`(;-VODuZATYt+gjy5VkQ&LJ!sqc)MLbEL*}Z-pqkb zKisGRf;eJWIzR`5LI{<*>oj!ey1x}(&hCavsyl{H?Ax+c9ny175Z28D@kRO;l#qXI zr#AC~N@0WzZ-mib$N8SEYEsWHvEJuFAc9wt&-f|`jmmZEadHd3TFN_FDdbP(U8B6 ziyE!92D4s-dSFV{DxbR+)!A!{iCheY@iOp>_Ht!}ly!t#Z&U}Q+z!y`zVN8)DG67C zrUEs>v^8C$Xtq|%6KDpegGT#z-VcO_bwzPI>@x@r;@co0wxCl+z%4bbO!Pw4oS)D0s}S!bZI!&8_92$v1Nji z5=Ku>5-%fKo!H7>xJfNaaEdk2BW&0vk{<9!vUl5g+BP*#`l5~ByA9^`wVh7Jgq$0I zbq0^oZ6|AifGY_h_IFH)rYxp)AG9;xDnt8vUxtO+em_69O&ujww(*^>!D+eY38jDJ z1|dPc4K8afZCB*o!WV5<<05R}mr&9)Zh1GB=Bt@XdO`u_8tCNE9Pv}HU_9$HB{`@8 zLO0|oWqjoA7$k8OeSnoSdHoJGD`?CZEb&$)X8dbc6EeaD65ADchL;ffK;VYKLSPcP zO8r)|fZ|jLyTLP{X@=ftSoGOa%SMQEbxTnAEiiqismY~#fDmKr$#=oV12zWx(c-{Z zuVh>jp5`G~Hh**!`vTQhIF!CpoMy&!-Aqq~T73hsM2`hxr;sM)M5yHBHNR+*lmn1AG<{OU7Gp|oxzKfX&{8SNI_2=IH^TAs>ElYQbh%)ViG1QpCDP0m!wg%sOr9-0 zct6j%Rh<#E71jZWa$3e}VERl)!(<1bKAQCNM?j#?S`xm10J{nBp`DSS+YA>6Z2^Z= zwhM(6q{??*At!db8I=fN{JwuFDFaw8NW~@`DU-n#z{p(=ZSU$%OhfEl5n)}cxflmX zzMcH!ZEAkpS@2L;v9*m*=dkob>I?{&pHL0qFuPq%G}Zcj9m&$&H<4d|U`_!>rO|*B z-D)~~plk08=~=X)6auvtD9TN9l=v~_EFaL<#5XJgi{=xzv&+#2hzfpQ*ghY(K@Kco zap1n>_+jq@$;qWCR;dQK9dVhQDGh1nJ9n!yq}7@S9_DmE$*1#XA#5t|P@@v=Meq8q zfSt9YVX}nTk3ix*6VM@ukjR3jnz}OnH2i@)lHV+)D(?(^MZ6JdxB}S?dmhE8azE-~AF10Yop?NH`I)g+M z&}7a%j9Wid#!B~hnjH~R)=fP7ZuM&EodbNsUFv{*3b2HevB9;3nV@=&t94gl3XNb{ z5KbgzNFRR04^g&-z<5OI7Z-)nhJOTcqQYt%5Bh|WR1~wpuag=EWj-hbj`kI!UQ8Fu zF4SU+F!1WJm3K?4fl%bj*96-pK&MgzONy7o3?YgYK5T4-2(?s;z=ijc#AP zl7TWXA=tAJqneV>>cHLsYA7&#=Tdc0{BdB9-62da%>Wlx!K1r)>&I$B^5ZaDN7K{4 zlU=?B_RbM1D_s5Te6g*Q%vUZ_lp*8MC`>F`Jh5}&V_yRKXj_IY$8cclx|h}KJi`on z_~k8SXu?dO8$B{2NY%@JfZ9r&u-3s(?NbxrrN16t`m!)Jqt6>y88{3kfekg*3q9%^ zOh{9$$zq)WIFZY=U$Cx8J1*d%_aj*95nU8&3tYXOFS<{infD~70fHe+dlCy}$JlJ3 zeR7KEGH^2hH_fL*v392L zx{HaFHB<=;xfSC_STFmal}~#>O_Xk`CogC0Ft&*itb`&$?{%X_s~m8gI^ch`H?!2+ z0Kd8h&67*Yz|f&2xXRhVoB6>9)Z((WST=ZSAupTrbzFuS)d-cj*Iimw9n^<55|ek4 z3PbyX8Q{IVeTx#UvbW&|^g4LUB}z)dEvcwP+r1Dmotgw&ae%LSP)$w@0R%};oZAY} z&_0Jaqvw_inQWZa_>(oTLq-oy+MvDtKBJNeyuKbp@y;)q=9WTBO&iz2mVsD z!&#V|Nh_5qY0*uzp_Qub(!k2*?(dW|X^!s18njOhk4S)8Lh+n;g5XH8;HTEAG2xSO z6)acm@Uo}(a`!%UU~~=eUXPMcF?8(Slx1?$b+GTA*r)bZOTgf}?FdyRa7C5cNpJYtOOB@o6^V3-|}15xzs^mrlh*<|29#e;a^p0GpGdtF-0%Hur& zT6jvpIE9~_Jv$a7cfsj1@Gy5>sAh-1cr`ei%R2@k8qI8>jrc`xp7w*%O)9*J?|4`p z5+8x_&^{bH4fdl2^|Mz203PX8OB3NLhow)^@oY74-e7U;-gaJkQ0TR&`0(5>h z^$xN8LQUDL;gT=tb@+Hjc$5LsH~aYNZ`2s+V!t(=8ovh+a`|*Tm<+Z+0SLJuEa4Cr zPKAqi@$E;{3MrzAcO1cX^cYQ%6Tt;Nf;yltN7gDC$qfcmWCy@Ng#@-#3!hK*Z*-zi zFz+O|Na$t@BjOLSigDaF#hL;QkA;ba?jh+p-n+E-fF#P54ljSmkQLh&%h+cxgvCmw}^ z`2KoAKwF-(wt*d?8aF<`3d!npurf>FI(iimb7U)chk0|X%8=c zML>i{6?)d#{|^d@1A2(3!2u5^HrBkDxofE<&*NT}o5RL9NG}NpvG`%R#%d_ujy~*V z=<#B}S7;Z)y98CNox=}2sbpFE=X*rf2!o zr_|WO_dG&dfV-i(nSGuDkT=$|Td>^DMueWw%;831FIEZ+)9LIQUhy1+%>Jj;AyEq> z4Mk1crlUR1pPqup6L0S32Y1Vtnx5vZPpgBa>`H$8X*D)zl^qY7KPs07J%j|s*rjb; zpeYv6d*MxFKiX*tgxA1A%w>?Qpu(V(fANia*fUi4>kk#;KL za6wcYfgHsikU9^Z_fz;1q?~g-m7qi)@5R%x&ah z&#Admk(fhu!o_~biCt)P4IIRF-eLa8b81Yc1(@cuHZ;O(PxMQ@^9DhM*gq(9(oW>d zv*5PdEKeF$&gf~r&|0uw%0vp7VrLoy0YcsPX42fh_<@l!=(NDYdOk(x%7`m`z*isGed-3*cCAj}4fYWfN5sHQr=MVwT z7<_YYLITo28fNjtm(?bWX27L~Kl2s}x{&H!YFcmSqqjEqQ`MBqQMz=F3s z;II*PA*&50+G6 zwgxNFIm3aK*n>TTWghEc7lLB6t=P51y2P3vN+s`>z8Cu$|MC^UZ97+9RR=6wK9%sm z=d&URV=?tWQRpN--FP~cv}IO2D`1C}W60WmY7~a6p*++HfUX7(`UDj1+%2_CvJ>4MVY zBi{`>h$~Q;v4g@o_|GTQ{^P9xAn6sqg~mr%5#S@Nb$T5ETiO$=2*Xv7WjX5xy4AKN z$AUOXL*X0Vm!U-MP{Uf@1_AlN$t>1o6kS6udVm-~jUZbhAi)kE06xuH=ALV9p6Rf{ zEeF;-1}_Fzz6Yc=+2`U7LMUBvyk zh|ZlJHfj!k_f2)y=r4&i2JQ#K2f)UP=yHk`xdc-MFgqc@9>Q>qeZpg~n#o*6P#oKB^Tm~A`&{WfkEHGwSPy@dQH%tEpP=dbjxGOdY^>twce~%O*2xO^c{!d|A>JNEicKR-4F67Bek1?p9W_rH zID_{&srD}jHZT;(@-Xx;j?8`tK0)f8Qw9(Kw=mB$9Nlg!wu9-zo+VtTr2@fE3 zoK$0azXZJw(-GTSj{^8sQeNswW$BIfVC>kZiao1HdV#O5+7rVm6D<`C`4Z#>KboJm ziqI|T%M$@ZFPS42=%cluU9V#)>m^XGKYzAE&CPBO5S+9!^kvL0h$ghx7qH$?>v-$i z@}TqMh=n!b33b20aIrAOgs*nEP#^Ut@Y%x{u4aLWW^S(58m|JN+JOQ(D~Hols8dnP z_k^kVfFD6S+6Kx?eRNG`7O9AAE_Dp{EA~{MB!1HQKuiLfBhkXn zq7e2-F2_0q+R3EEti;R_GwgF!)xsL3Wn_nvu=D)B+CQ4UZ!EYgf`l~uf1;8^M_;H7 z6VVkUq7h+-sD!04jDPu)JSb>_rmD|0eZa5!K?^nJupcB=Eyq!>j!E=5Z;K+HypXJZw!AGE!8?!1*)8-Ebze;_dm2O4 z9;o96l`{0u9VP=F zZE^7{PvR*8@;?au@fP9 zOB>m(z?rW50rdWLT>|RSs$}||Z?7I>M;~j+BNM3ufpfaFUVqmSP64g2JTp6nNl$6$KIAMWBw zU#JYEwpKIb(zZ!5xhcU>4KS76Quj{%1iLPMfMBo1))(8?pB}8?sYMQSqx+5D0w~a9Cp6AS^MMXx2n^vE=GFY{muh1EB27(UZNN;@fV73Y2Fnb4 z+`;JO=Yiastp+>#>OQ$QcYlT5yY5(UaFp0yTL2Maj-AB2UgJ}=pL;KV^DA|TX*ciw zwfcPAzi=babvp)m@I@Z^5*`vE(=h(a1oRGFmgMEzAZYP06q`IVN!cz){KXL#@SYg&=MhV*kVM#C)c;;jG1Eix|)%kf% z1vzXNnIL#F@mp0L0JwIM93;j20pgm02XQRk>`8CE~2fjmSa}|H{J3OtoXzG^l)vJ-a=6kg)vv2O;!u-KG*;S4P L>)=0q-1+|jo@)IU delta 176669 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 diff --git a/assets/plugins/tab-bar.wasm b/assets/plugins/tab-bar.wasm index b7148fc744b38cc35fa3e596492e4b7728d8023d..221d1baa3f7cd7df30f86ca8830c172d1859a72e 100644 GIT binary patch delta 139710 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 LILT|g#e@DIO7&a- delta 134622 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�fbTmOJ-ha*+M8t*lkdph~9zOy9iTNvXonVi}c+^ z7wUJ%dcFYT*O6ys{j$<9R|c;f1|O2UniRv|jH%TcY$ z*}kX{)e&}Ue5qnf$%u7?X^m3xKzItc^Am^4Y9s^5Q5+<9I&aY&VCl_18(RpIca6BW z02Or@vcze3TM$&|UngPcx_cGPdx31a$sD8G#`cI2{2w}tY zt5>2*-C%V&%vU#@Q!l_hHrC5;k3Ra@FX5&8^ye;WTYLG&#Lt@`AAPt>DSmNUwC{~m zqHUj<#SWH9pPgO!y(vLb)c~icaQ!T^B|75zNlAK8U5=05dE=L&&;Hk8k-h1l%F4^A zD2W2mn((##9$|UTM7g0~8d*Ny@3E_gKp)c9^h@LMEBzk3dKz7pd;6u4WmEDPy>!z7 zmAiB=H@4=`*l*Py3jwUxIkrjtu2QSvCOrP6-=oXb>{{8PGtXF&`3P0aMV8%h8e~FDulWtjk^zko_ zF-Jx>e{o{|&d+R2)(MM8ML+%Gv1WTT?n_tm`^_(X1$*KHU%rU@KYn=z_nU7Eqd992 z;d$BGgWPi|dTi~%?s-@=@wWDA+WT*tUQN5Rn)deU^X#wG@|^#bTAuIL)3UeM(%yRe z!PUCf-9D*W_Ql&Ln>*Ks>vD!y6Yo%mPIbT6yWbzV--fR$-MZh8e)S6ObL;2x8?GB0 zowxos+?{x*x_+hmeZc+x&He88HKm{Ken0oMOS$j(`T;a}($_~DdT{=RF~JMP@zLZb z+oP33vs&qBjW%x>7_B@l7599Yh|3o@yvyGnMfSedh61>V55GJ#I{U6MW6Hw@dLBtF zc62v}3a;qx(h#O)LU*Z^%ed~+@M!&ArwqmeWCwPa2cgE48*JmebIa}P$A4o8t*<}y zo3WWPg7#!4n$y|K|*cONu)1h2yZ{G8ifPGJ$GmLp9@ zDzUjQu_ve0QPB_X9%V*Hf4m#~jhgQnYf8}p_lz4+4#y}f0k55YXQ<9JVuEI9BODto zz2`zRF8b>|tIOkM4r1Je<7{r}lG`8|J&bn`Qo>3TqTYKe=J}}ezDeT{V_nl$9O`-D zaPGnthjHgC@TLg@CW<%YG9g-dU%5J0(IfZe%+Tnu`$n5#(d+k>%yH|(-eJZZ7tP!_ z!W_ANrC zuH$z|blF3N;Mr6<`rJdq=4R~_wp|gd-i@T9j0^r2m7=h)rO&kUR;q2jq<{*dSQk5$ zpenb;u&~wr_~tccR5QNHTFfYs@X`2(M^}!8Q^FaMqtLr*&B&QYe1gVZOy0VBbBmP@ zXGB>ehDLIl*$#1mqfH4wePt94om-S>*Pb1rYLN+)ZB0T}oN6Qy6WCGHw9s4}Xo!X& zG7F~!OjYsGIXX%J?oS^sSLpS5N~1#ENy#TuHq6NBP*vh<&18};G90zm;CBX{%7Q8; zyPxRpFtb~8hN^Q8stO(I8-#Le_hIHV^ej=L(|mn-%-PWxX35QNs$`J6)$3YBzn<^Z zXsZ^`>!^#Nx~e?dA&Mj9g3BRgy#eb#{N2TV@KClfzWHmWHCnv!5Lm-)8#{72TR9RM z%0-WFeCs4_cG_lS|HAeG1Du`kbg71^Qozy_@IbYb7dIFE*Zl`%lKGCVy}zT7NnQtX zCuXAW-9LJ6CMlOoUI@By8F~AOYR`i+Sr=GAb2RVn0XaU(CDiU3tyqtZV9~U1@2I4b zy{CSsWn>_QHd7Lm)Nb)MnnlgN(H>ottMgR0I*plR8Wo}J6n)q2+BAY&!ZZS0G>x8{ z#z4~;Xc{3Y$;&#{RD?E0{D5XfAH>a($tid>h=VZ%$TN8gM#{L!qr$4gyMJvUrCEfh zX};?gPBL}D)m80WQe!^OrEA`@=*35Fh2>xO{o@0(CVFo3v5@p3KYH`b<*AI^XSF}N zh-OD^_+BP}BaSc_MmZz&M~~mGH3J_{(;YvW-5O|F>IG6Tb?t=YvW3Se_v2}4V8GpB zKOQyS-2qBPHDLg=4X7mR#=sjd5P#GkOXACZd`bql=<2eGp84?v;vEP4WdCN+vgDj( z>Q5$m$4^EM0)qg0=z5f_xU66KleecB*0Vp~hu^`Etux2Ozq-^c9&n7%%{vIi#GpYO z8J~R_k*;U|VnUE}Z+sg@r7Z_VKiM+7niX3l$-2Ju_`$w;ef_(hyecrSM=$(l3cn+M zyE%9{)eznO;!u>Pe!NE9!_jlD)EHTKd(y9!EkpgO#wOxLO z3C>fHRZ6$v2-X8SctDJiN_ZhU;6@-F7*Y1-RTw!;(Sa^w;oRph4m0>BMQ0R2v0uPe zu05*|iC3%8N&-k~VPoC`;=BNr9+(^4rJ5@k3p~uFH-MwRqfvAtoDaO(m zwaTMwz=$0o_yUJtjjv3g!lIj%YgAfnpfam(+6DQ3ag4ZXQ)Ia4S=JqySk2 z<;|-29aQYzBDhyoTe>dD;=Vrf>1k|SKs$m-^vKh#Ddc-=^y{bFj%W-s z6a8XIwZQ?yS>8^(^AC{|ngB`e&c{wx9lupP{o~`NOaS#6)v75~c|Ux_DgvE4k)))fj(-cJem5ks7_+s9ocX^^H2#vLP+bnbm^AxBm=gn48h5NZtF=?(-p z8H8P_BK^uogCe-lj$SN0S260?>V&Pf)n}G2aXZobSCdJqX%GjYnhes}Pz#t7Ho5{R zUR8OGn6pi)0_RqP<1Ip~q&NOaAx&#sZU;Lx;iVEMYS8{5Vvd#~)V6u>AXOUr$^O1g za>hw@Q!a^)45Gsq0Q&#oU|#XZaqrAjg-M2BI$JJfdMOc;NtmPbjO+{JKbV^Xp5?0X%wY~L#gyl|6XHEe zZpJ1OFiSzFMIm#Vup}cAU+h$WIvNuCK$|>%ZxBCU2+NpCb^$?CP=~|M~-_ zg@Eu~OB9!fK4Cp=B%6=BrUqQZy`Xf?Ma#8Iqn!msTu77E{yB{7M_wvN*-PJF@1-<9lm&c+C75;jm!B4RAm21o~(fC(u z%EEpSim59Lg}moj83}LCKOH^s>S0AkCU`HZwn#df^x6T0R-OFXuyi8>YluGl+N8tm zH0cA036gS-Xy8_LM<8cV@X!+hP6jEBFvJ5Aro|*})0rquzj|#3;`AA50`!Ib9E6xM z4;JBRpYrA_M9dQW$J5Fm@F;S2TTXC@NoE2@+eH0Rj+|qqYA>aVA5uv-&m4GCcIv1o z5#2e_f&=3j2}1(y&jTB{I&(&PJjL+Blz8iljbSTQttRLQj#$cyCZzsKFCr#iT4bXA zN;*r5)4b#TzSD8hf3!}Hfl{q+mogrkbyXYACfq|b23+^uF(Q3;Du?{}^q3ZwB;T`R z%A4!c5YVbTsI0&-_%n5^N3DaBz8pc~^s`ntAY2YMERLM~MNht_eX#I#Cx*by8u3d? z;Skmv!izR~GCTEBdKnXwvAr96J=^Pro{X;s*;+(}8d4Sr_VOg7^YAFmgDbh~3}JNX0U?%`AeJ*PG}utqUH5^OH1>#|-B5r`O}I7E)i|aCVFNOUm3Czh}5P+xZFY?ceBS zl-C?%+Tz~4-@GB!W-wx2j}IDcR&cp@w3#~CbtPr5W2i*FbD~0V;nzcRr5as1#x;76 zyKMNw7&A9Rsr~j*YpdVAk1;fQ@+31Tc=M4UG&a`-p@+2rzWQCWFDVD-hruVft-Mvd zCqKe-R+#;!lrbXtYKEAwB>xv<;tl(n8xEIHcgmG0(B3V*#xQqPqfL2BHNC9W-jk?3 zeXrwBO*KC-tKyTUnXbf9}WJGrb+E`LofhaBYIRg%lM zlS_8GOI$FWxp*{{iq}myB@@Iyo^DPzkH)iRm>+)tnh?hj)0*5Z-1fLjm}3VZFf&kS zeS6&ly}V+L3OONdhoH?_h$F~5SSkdUmMB#cq7duRdPqws`^Q(61pV4Oarw%rg1|OF%cwO6Hz47T6 zZu!!yuY36?h7X8VePCF$aB3=k;S7@*yb2OYjin@U#w*rr^!SO-JJ^)RuHu1SyS?F7 z4_(WU%0+g7i@)BgthdH@A8bZc4pdj9zY_}oM}c87cU1`4HAyw7eiif(`C(km&#$EY>x^RRYz#@a3 zRN`rwZhH;M6FqN+M_cyF__MP>^-TQmEHi5mTHpeyR2g_2v;wP)TMjV?wy-3YvCVKp z+l;jeVD;vtL(HtQ3lZ-z-NkFsJTN`bt|X_pZ7nwwPTR94zUvUPU#3S;S{MK65Hs3r zj|UuT@X^Qf4>j!vy>2)IN5RN0Ak{wT75`@7OnPQrElGy9Saq`xCGS+}^@p0rMygT< zFV78gtvg1kS?BDLOnk**=GFq{5a>qlUDE8s&C#^`sl&~SiakiOs5US(FVHV|&y;q44 zD1zC|uJ`Fu;DhDrVRm(irITc~!fagXG)Ja2z_sx?ou*tlaJqjeEwDW4Lg(M>d`M+b zqQh^Ij7#C7q$PZelSxRZLk|L{XRp?TQ^v~| zBU7eav1|YZN4&v0Les8I!AQ+TOb&Ncq)J&V=L|aHtBz6&_6zigXK*;)X-&E5P;AIk zc%#M7cuJRuC}g;diZs z>AZNccH{`|wMW`bVs%sYv82PT)egUd4%c#N7EOHWo6Y#4*`z~GLjf6aH+QwJSREtN z!%{yu*jHB92B5nHnN9q}o6VT6y^zkD`b20N_5yqcRU42%|E4)+pEm}5btHngK(CQV z6ZPV4J!VMbHBgF}sa+GFGuKQQoOB29)(Lq{{H3{O{N4z8OZ?PaQ!-b_nR#aa;R#fbX3EBVwjB_ z>7J^~X(FLZD}L|c6V*tB@Ts_czGSk-X1(?;(;zh9ylk&tc9xE@L;&_}}p+n#jkAm#XaySXj z!6fhW36PM zk_3#><_WG*4is`bu5qmHTC^$YH)k8BE)H|&>$k!EHl5#9bWwi_wQT6ZZNUGWXaid( z9zEX-ecP^(Wo<$x27{M<1z=qyJi5#-fMunNdWZsIQ=s4LLN3OUoHm|t6eMS zo1e~q#YpI+v9WU+%c--RY?JN0|+`9A&=mo8#ie$C@+D!|^YVHT#>F;=)2Rw(*lM z_hKH}d?^)ed~rhjo`q&q<<*y5S`nAjz`T7nc^b%5F>imCJPqQB4m{YGvpH|??0Z+p z+ttZaft+j)zCL+s<_Xv8^5kgUOoKtxr$sj({k=V3X7j-3#}W&D*<@r(wLq zow7E0YT^kG)h)?W15d#E`sAsRCzdysCr_#q=H+k4nb|XvdFf#K4eG3B$k?&W%O840F>H{V1$|eiL(kRe*s%C`^Q&Cj zOCU!QJ_y-q`m;=bp8a9lem~5jqD~!hs|0r0P!&= z#h7%ss#{&&25##3P3J~UhjMAUbryF5g$X&wGQ`{*P+24v)NC8<^56F+(f9aS@K%-K z$hZ^Q72=<_4ac%WP_2|X(DPW=@Sg1~qTjoiC9}k{wm7kZNhbwxfaRWnP__=C zChj3-{4`1 z75IN*)EQk`9lLWFl7uTc07^!XhPXRA}F33LEoB(BPo z+3mGgyUuR@J-oZRI`eP+w<4S_M%+oF!q#O3gl`n$^eiDxkHkw(G4tj*_u4;>TdLIx z$R)24&0@bg$aJ^BCI8kxM3pZNiO)RM!s#-&*U5OS$ z-DRMO3V9@?E45iEQW>a)iNGTVkc(F%*J}Ck6{)1H0C>Nz4DQ z)S9Ho$~Ez__n5&x*K6NnM!n0`Ln|JwC?qlTVeAiS5Q;7(@^h>1xA7y%VlTdeW{b(2 zp67V8lApc5S+$|{y=Y5EUq=TZ`I2XKmngy}MEx8VdU(3Ft={PTDe11taRoGY9>a8( zIUoBrOfO`Mohv16)rN4)-=1bp9P|sdO!&U~x8iy3uZxd)pBY=JDS}3d;0WHY;U%cd z-7tB6aYe*VH&>Y%_E|2)>y%K7nNb3VDA^3Gudc0ytnIxs? zowQSBi|5TXqXHh{jql@t@|WUu?>BAc<@kH=H^gqnnbXazA)8+51;!|dwt9zre>8sU z>E?ZAP5iCX&8euSBhN6WXC>`9nk~NU40AwYpJ2y1J(yF26g&D%c0hc`YSR|=Zb(Jv z3~Z>-EfXI15kGvS2P@mSc63g%nPR!4qmnEI!W;SPb=W&|X+U z$iV2R!D1G-Bh{$l@2Uc8Nt%G?I;+FIYrRRXj4mTbuT#RIr!X}cjhU&|B44tH2PM&I z46qIOp9Eos;W=I2o%e|bKc(Vn!4Fl6GA#6=XS;>IVs)WU_N*5A>Q!}Ct8)FyByraw z6fO5bAJXR2VrjBxRnUaR>Vlu4DlPcctKxK}Ff&WtqMJ##oUmm@FsV?StG?8S6KLrY zO1qUk4*;8ZpG9WQ!XV^aA|3KGS{^yHSeRXM!k}}%1>*Q)Nxl59BC3!(5=L-Y?h>@% z8=y7ICD(|W5X9eKWJZtns>_3(rb7`Vnu;UMaAOv(B5b+P32VaRSu=I{cCgD5gQR;13IQn=!*?V z?dZEbpsL%o^L}kGN%DX%tlj}%8Uz2`x=9s>T)?D^9`J!f$BCscU}@rClPLn!)6^>C zq*`fTqtGtduvCvd&Q+)olW_Y~z9CL`{ruYyy{P`R+-}l%4Sps{*ap#(Oruq=yzSLYs_|YLB zGE+{%C7BEbde=a3+*Rx&)u~Q%Tv9si9_^i^0TOrR5TKSe>oIy`AMqBTKQFbL|7WAu ztp%SAgln?GlrQd#H+{&g#=bc7JhT6_RoGv4kiCN_0tvxn;kW?6&tpsi;Qoh8Gre9iz15e=$1P->Do6#@7*ofQ{KVuqRLvgG z_2W_F!#-+q`zxThrQ2?%o7`zNpbd@&8Tc>@niNVwaub6bZbOFx@w+~P9m-w~awS-U zU7;aj%FGB_ZBydUrq@UyM+ZjbTPg3#I4w}sdiL2}fJ2i`bbi%1{c<;GuuKXpoZdyZ z4ixLz4FFQcb{oE75PidsPW|GLH}7r0f=d4ZL-(}-_wQtKQV^Yt@B65EyTAD_PO+Tw z-)8I^x~h8P?*BF&;Cw``=3S#;;s^fQltW>`#XhPGgQqM^nu{ zj`eG7P2IS`5Br!I?mzNsoS$YE)>oS1M?PjI_`giW=X}@<8}77Je)xz&m|#v)=Z$gc zd_E%M;0Vi#?fGWNLg0y%){>VsE?YTpEH-%>QN~NJRj=x*vQ$H+x*8yz039?DTvxCd zHr+okzU6$gL}%);*$5uvgdJFf>@TGpvvm~VqOx_gFU_Q-=rCxvTS9S7hS($)n|&#y zYL0LtO)fLguN?tuiWe$o%YiI$5vVMyKk>?so26r5%3{4q>&bT@tl?27QzQ_%DV}hF zx#J&&Hu}#8(c;e!KGtLP>0ffEr{FV~JgsG*Y5loGYSV4Mv-ZaVHjSs^**#{w&nnjG zJ?2zhzuRL*%}qIDNnYzkq7klA98xkC7>aBFY&oqqCZvZU&|MdYUc&I@c|Bkm3U`%7 zY2%08B4m1=A7>8i(9_~K0lECLd< zbOxbuNh1jH=E$l4LjCEIsn;Jj ze8QYkE&st!7<-DVRnyJz;rJfM?AXV40ON!0)qe-*I!8`wteHE@YhrNDH;V=%CWZmf zq~%Fh*3fJYiO;#%a3nw&=u}WitRO-0P__*Sefz~`>Lhw7vaJhDb+d|%8VqKu z(|GbK&~S;FQSlwF8%{2ii(SjE4(A~%At1*ZX#I>j?gAtU0#@zAhn3)fQzs7{N>nG0 zR6-u9s@>VIuEg&A``;MWK0eg5=@N53zF51$w40yA|HUQqtDU?o#tV-&Lxbmb_QpS4 zVTNaRC~<&GG?&HSSN0p?Pk)l^YkJTQ8j?46#3ho<#`rM3`JUbs;@+dpFqdF{<4Twp z;@fx~yxOxdK3R1yTh>>@rLnn`8m@^)>hhWR;7iTTRgT5w=*vvWBvIIATm0F}%;|^j zEx@6Dx#OV%-F=FGkRrW_o8tTIqk0y%1zKC;!!I|J{QFB$7GCuGL(#AmK17-v0_S z>BN8D0Txj(g7)48Br31zAx%v200ojQ;bxm+Hlj^OL;n30EQqg)XIx1qZ;DU65`}ns zeDjrr_Eb@RYy8tI%`_4-E6t=zE%8DY8ssPG!C5K=?5fn>j`v{cEKxaX%VduAa^RUX z`jq?x%z#8Pr+CO5tk%BeqNH|>iWtIxQeqhezq8_~pI^q2QnBOcX%E_Z5MeTY(3|g@M-H z6H+Fu^G^hxr_ilj5+XWao-^_A3f|%jemh{UHpH-^0q&wa>&O$14TmOQ1FlbwYj z{2Jn_Yam1yVqWb^CeIp`>AIq)XX}kCQXEA=M7$hKa8b{}3|-2xRnC~kl^znDQS4!k zr82?n0s?+9=g?(X@^UQ@1M05Cc2NEZ+|tN6@nt9!5$dYdJWxCPL9sWf%`J(FbtVg8 z4eq;QtcT?;)-L#tIR&W>4|T@8b8;j_`6q|>jqUlggIfc^AO${FTKW;!*$Ey zHe>9gTpa3DC;O4=WUr0CevSEROV95=rA0h-UTX-b$<~>1vrdvJ# zkE@at_9mQhu38Ao`DwM(8DOq>U6|x-4`x`a2bfKkylIg4q(^`x*1zcW(d0 zMv=DPX&*^c4NKsp^o-3s;z8LhnHQn+o*3>rxSQ!RfW}5ke0K>__X>6F=J;cuHC;gb z-p|sxp7^=Xnu8i0RuLzU&v2g`%*pvQH~L)Kp600@%ef|}+kV9oxc zH}>*AwsMb2I?`+Ru3=~i#EPCz!piZ3HV=w|s#9Qz{SE~L2CKCn=qav*A2cF~4c00i!WF)_$_fCVIZ27e2 z?iB7&+9p#^+9CTn?ykiVKpK1}d8^l5JeVt9g)|XAjNVlgrY8n7@dMD7&C3<=HnD9Q zeV&>p)&kp*^e^(<;d#@&YHwTV#AO80tkdd%I2-am4WBA*WsTF~7n3VaJhe@?x%iB= zazkJzxo@G!<;)HY?YkJGAO&YUj&pZtv#bXzO}jkYS14K6^KHSU!OgI$^;WL3N$w8r zWT&{h0(X<$9p4|A;+0v-<wk{2uZISI7rhSQy zy<&LwSr4T(xxL;fw+3ymV_6B&soSdwyRGJ3$!#Nhm93VM*$tu38ZNP3m{-kBu4WRF z%2sJ%%0bZHs%=;EM^hDq#Cd@ztwyRH0LnlzUxY+iSS3_VZS5K>=l; zV?9W0twRV8NEN13(PTOKm~!XdVHx^zJ%ST8bPyVy1DYuqw&W;jgLP-0I%aLgylWra9FonG%h!qdag%Fw+URWTH4rRUR!T);TORZF>!D zG6$c;HZ2|$|L_hoJb30mMwfT}$LaE&Rl0n5H@f`czfPAJ;H-9wF0)eipvn@e3%ksA zJT$HnLYu5fiN5|{q{uo!`u{&gI^zBRIz`5%+szfk0k6B=j6C2CL%>3mc(=-e>aTSd z)?lRQ5(0MZI`e=#M0ZB~_jP74@%%Nr$+>DJr94Cw$_~b=bDT64k1L_6Cz`pJzt6~3 z^*jm{JTZyGUH(N>FTD3e;YkT|cgm2cW8dPflM8l(yMw>m+f_nw?Uf?3!>+D9x~H3V zd5U*=x^kDND|kw(?$O<&$+CjHLZ01D2W0Hxbrd~%1i1(Y8z{XtrJZqjVsz$NdXB4b z2{lsj(K<_wz%4={+*W%Yt+Ah|0#FZ*qG*;Y0S#0l=NK_L~*+n3)79D*_Qc6jr}SWRamTN zDhdR?*z2k@iz!mDsq^}ti4RPsz@}w}X;CCo$HTskGrsIBPfoP74hUq|_8&Gb3&di{ z->o>?b*}3Q-S|p!7gPwoO>XhneJQzvyRLC}1ZY;h>Xr;>Yi{M7QBOXJt6!hh+(==R^X zvlnO~Pv*+_*WWZP@loG0<0_9L@PG{d60i6g4jkeJz%Kg>57(T%nkQbO6X2Rz#Y0y` zlKVQ{_4F*S%DN;UMjF15a~9jjzVy>CrO$O3X4jC@i7Wfc+Ugy?SrVP8Wp}Ktkg7I; zu6;zZxAw4=2M2V!Mac>%gunRqd7iXj{gkeWjp^HMF40*mKD|Ja_PG6_mfgGdQL2Xq za46cDumNjiK-$Mt>#es0!efA^7KoMyyBQ zcQ+Aq&&RLbZQ4dBT@rt_cdKyPUJwQ!UQ8)T`A6ad?lFhq8e4pix#R#h41rdQRE{^j zL1~3HRLf7g*PPhkvXy{S{Hc3QYsNKX;+2n@sjZvUsPNQo(w%&+3UTj^|8lSCrj!45 zpZTbHB>wq*?2GM!L^^lI{bmArR^D&UYgR4lqOYNDj$6KM z#^+tlf(i+9zHJVjsz#F;)+=`hn`9CQZDW^x*1=J=G_dgmpWV7|oA$het()^l~_p?V0!Ji_cj@Affsq$FhCC`hb5L zL<;={R?;pw+8y*(@?FeRt*k>|3GCEjecgeos&u0;CA%ZuvdK(^e88@X`%WM+VAtIi zw?ANJ6l!g{SeE$Y2cW;#;`1LcB`!BUz=Hh^x5eLiz;uj&`YJf&=>t3N5fiMCu)6>> zT2y>3E<9*DGLD8`i4S?uwC7x7kZk#^-#;WZH%Iz)HmK z=+5PGB(O=j-rn{U8M@~YQKW^frgFN*7GN6wcg?2J&wrWsMgH z5%cnCdxe^uVF~|pQckvlUCzuYe27jZQ|%sdE}ay`S)sj?$#uLRGOV~Qe(w9`)N0q| zzwF<2ui7oTe&!F%ebuf9yL8>Jbsh1Wbba9u&5oiF!C_~ZJsR?TG(KswX+NVMdhkAB z*u>1(04@*DPZ*JlvF%UMinP^-P(3bi;1T6OQM<{MXyG+XFK~iONA%5h=%QK@0T{BrNY$%;V!l(ZPPM}(dcZzfMF#;3 zbVhf&;ob3NkD3GX4%-}DSl4>gbPucJ_56YXk5Jd8C2fuu{M3x;hlQAAO=Y*hsrdl@ zD}HJ=!T68<8DgZ0bBlgvmLmkV{mjg6uQE8Hts?^`SOjgz;K-kw_QR_bz=!Odyh((B z65So@F78X77)zZ<>cR<4=a!$F;|_C!E@xqTjvmR&mTOetK4M8~K$4n7lDZ|hq(Hpi zV=NUrVKq9w1K1w zFU@z_9mCTP9hNrjSebOF<+sJXzaj#1OZEM?NBK6z^B*^#ND#ttW3^-22>8;I<{<3gNn6c=TJvtg z;tRK$a=kSdY{%K$eNz|T{A)8f{?S%*N0r&p9oHmuxm%Ou6ylBljhV6s;t9Al{`=9WA^Pg4(HX?PEg0Wpp=7tTZh^k525v`-LdVK zr|Q_&pABLUI&$F=Bpci{CmO-hYrFSSbW-)U9;{ih5Uu5j*RYD(4N*7!}B?XX|VesqRx=+ z#I2-rFEV4{(ef+lxPl@G)X%MyVPkps8@QH|ce}cmiq4E+%PwN=D0~t1)xjg|or%Yd z9qXyiF)g0HM3DG6@8SiLgrh&kZ8!T=l#jV_fy0j|*hK5zK8rr=d$G!kl8BaMN(J|n ztZ`{&PA99m=rZY4)d0U#C-HqHHV+mRLDp`2lTMU~E3Do%*oUikoZG=2TOmEzJ5i|% z%hipJerNTs5^%?Srm)-sxnc-7If)BfD&IjC7ouV*>wt!4glH`Csg33a6D0pUiAgz? zs6NMb5%fI>k5&_7&9(1%yNiS97gd5MLp_qx>NbLB*&rc*)vkL+(S-7e?ag^zjXYs! z8ml9z6y3t2n)Bc(R7Q$6hf}guM}VuI^`n@SMmAn_>tM=8rUyibZ+*#(9jgPCLZ}KS z4d)~1f%t4(91GkD?rN4JF&bVr?HvPwGZ17GB}Y#VsvkX>oIE*DZwBhk!1$<_&AWAu zIbiA#stDe`J32gL`I3{PnHkBT5lFl~0=Y~7s%|6tjSBBzzzAd#2ubiA1R4^bXQOK3 zh*foZkvv^Vt*kE+Frvn^Te0G*<&0yh4V(vuEf2B`0uWt_A)#>C5Q)q~;(P!REku-eEMY-4HJez384SABT(`QPRW()j}b<&}xxO zow8f}&i;Qo=ppC?FoBQ^KL>%jX*(QDu>hj>5ez1T#FlyVTAFTgNSUMWE?NkXvT@HV zh<86;miOBRV4;EJ)dqNX|10LZjV`NLZ8pC4RRZm@8@~RkS!#%7oAftxq{+rl{>=;> zk^M$#fDJeoU>G*?ebxJ++<&t)AYSt~^qSo>>SZnCkZQ((JIrUzWASY}%nyh3wVUin zVjp~%-SFwZv!{c)PBwlULZwuQKWh9LEd_xg2kzVUGCd;7xvb^s_MQD*x}z0l!k`hRP&jjG;Bk=@jq%B zn`>K;o8udO|0L5K|IPQ8k7@;`s|WxaOw)nocw6f;;eKfdy=w{LaEBR|8U9xPzZ)Avth&_P3#lbHUIlC#N&PKT(IzI{wdP5RJjDr{mhn&LkV z^V^f{ikLT$I*HX2_Xve4wfaNi8;AJK!xaw`fVHJT`sB*M+aMIe@i;dpUYhn#EYQov zr54yE=L0+t|1#~Lg+X{k#y{CS5UOIlEdk(3hNbXE~m85wuiTUTPLQ-&;<1U?p6Nvn9#dtejZqd&`Nh zIeTDVr2~{z9%NDMXg+J0>MBZ@(eCTPMdjgLO`Iax+=XEk|7w80vZ$_=+QQ+4RIY}p zHpd?;`unHaAhGz4qJIZ5bnhML-wWxK2l-=6Q#^N&e@2sb`z^#&l+!%^<{*DIAt%w{`gMl5P}LfTszdC zWrifZKne^hBt1i%W#ius^T+)|S{bb4Lg&EVThB~B8N^P&cz!E~2EG)3wADXA@pf(y z$qg^>ZuKW+7zx9P|5(d`Hl0MIDRtU#{}8}^=J0>qc1sAOAO?0d!Lv|stpmw-cLZA# zFH1pNFAn!VGF-zGap3SnZbJ3Ve&7rE|FoGQbmeDlVERk(%WZz=BzECQ>TJetVCmZE z8$;#hBu$Y+)mz0AW#d!Z{f-6-JZun5+4!n<|ImM9f;YUc-TmPT$f;} zVAq6caiXX09AFhA2JRB-kIx=%&cFy3R?Hb&OwUZ#@m)O^jPyI)KE^alo~}g8E+xp{ z!c1yUCxDE9I1+88DIPe=e@m0fJ1Um+J7<*N)-Fz+a#D1NQ`L~6tqH?!jXz!R+vDC* z{-S?~KJnW}`#S37($W6deKkBdUn}~Yt}TpAsE$OMLcI^yeqBpJ)eY-_j!9Ax(o-L}10w^ImQLTLv(ZK*V2lLtF-horE3z5(u!$SOU80 zIaoZ-SVFq$2}J&76s%TH=&URv~(6ysrhSKLWZFP;o z=OY2ED!S!hJHW1GRage`~8V1h3bo-ZTcJY|T3gyQpQ z4Vpl)cGyr%jsw_(Q~_@hAmLidB%A%H)eWy6%jj$IJVPRQE+3$;2(%1|^=Ajcj_R{^ zqdFLeeHq*&wDvutRcdCE3N*uvFO>`vw*m0MsB*(}K0A%HI!v2Vgr!4x*8SNg*vvYt-##OFM{O5uVoyDPIr_#9eq0;_n9$*$)NkjHj4gZlr^s^yKS>@T zs57VN7(tSDa&2oj=V;B4oo5*~>WFiGA36C`R&bS9_Vya0omcyp!-8_80rIoplsuEq^P?gQ1F9?M(hOgJYe!&rMiP!#P{d>@E!=`_&jo!?}LZ?=H9NFx?Rf$ zkqUetMkpvPFuAn_)r3n}K?( zuF^H8h$P_H<>6HxNQ1bwP z<~Gnx699J`PiWV-&mtL7%j?XNeNYpF%^ViGRbi7}IHVS{J4`XV#1C699ITk#mRdkD zBOP7K6!v8rXnHf5E5+K#h<>RJzgfc{P#f5Ee-+JB zSMabpLOq*w<%pwRU8(ObUE8MncXCzi@mh@`)QO#bHKTp`n$2$Cxi0tdRxQ!)DX?zbLtx#!){}e79n(Oely8T0t z)<2(e0tS*uZ;nQ(jk#50Zmf;@jiBFake=+FJvZ-KB=FwpzSpLR)gl^_TyjyiY9T6h3d5`u}VZGK)hOes{=a5#Y#kTNZ}eQn&a&T0caNXKbjQSWDoW@~^m*{c0&boJ3g;?pFMe(TIoI;mO-m z#F%F%jJ-2q>^5QST?u1<6HJ>dZ$>b3nUjczxrhfJ0q)Jy&H=~TISfG3_i_UJ@RCmV zR~U{hLu2;J+S1~?ztA1)2I!6|dz>e}b0=TW;QSYf-qg}E@s&s6X>~`yz!3w9JPuVs zcKJBlML~j#JB+}=71msb%@G{^!Q@D&Q~**K5ZA?VxK4^{zkC1Y^3or;5$jNQIfA0tBNhtcxB$6T&JLlHbw)eNT)*6E zA6n5mp0t6&l}wiL1xZpR<4En-ChO>~P2?Q@iG)6?8T*ew!f=~}p*!XQMNJ5t(8CJD znS!*pl8(^RN_QDyolt}vt8Uv$h9=#p`Upa?Lo4xxYnlZWuWQwv*ZlUu+dlKPP!h?3 zc{3yKS|NuEwZwJtaj>F z%eJWO;JA63U#@I-rzb1rb2syuUPed??+hc7CO@$|;AM2}#qC&c^g!rh*hn zS~vAWOr^PFGg_rZk1NwiJzZ*AromiwC6|t=CZmr2(m-F#FxQj)unHFDNl@yfeJ$opjTR97fQDU95tC`Fc@WUJ#F{3V*Ia6!E^ zNF59Js8eF$Ix%%SHcNA4$$i)I1CC01-^cwnPIHlHh*d_|z#9kh=20tETXgiOT+0)m zog*(4Mq}V7T^v!8?Bc#e7bgxGuXOe81SRbyyIWOX{JAo()n$(crl`ItMP3kvI5F_Kc zYbO;{qZARNG}2GIQsjM3KW&}-H|wXx4pwYPp1h|-nQWg3i(k@w!i@2E0AE(g%)-}rn$myT0uY;~jx6CU=|32-F^AtU%1 zybhGS2pR(=JAz&gN=^i2(kz(~^!K3TN6-XwqCd+W5qZCYIW80SRal8FSytilwph!m|Pe~TVLQf?!8w?T)9 z{uVvrXP8s7njX}+N07^XiHl#+BPgsM>v{+u`QwFNr=`-wk^^RSeC*(Zi!yMuq8tCh zxKXWkn&rA6{7Ou!JE&Gy#o*;cBZrejQ{`*ds1!1cM`^4QfX^DDg3`HYb7<4?-m@;z zdsMGs2z5T~L6>qy@Wi}JUcq4K<|<1SA^N=&uiL#g(ru-CshO8Mn4NX$BT;8Tn^YS! zLZw;7pdf>@DuE~sYza%fuv`>Ri+<9MMIxE|`AQ3%tJjp$fYz(Zk2%1V`*Ey<|lEH#UIMa-g32|p5X?r)S=6J@kf zoELf$BHcCd#ALLUwYucVh3z5zd8u?Y9r>ui5B)PJt zmcz(HZ=;T2%pC=-iES9D7K$DmXmp8h(6G}$la%8I&TKKnWh0X3rt78^RadGz{#kKP z){9!yr}TN9v_qHxP*x_$tgiOcl*-TS!cm1_BFpKmX`#q=(S>C4F!+a*^2}8^_O9zS zDhOc^Ug77RSztURSf&yk+)tC4lh_W4r!N;usF@gFo*^reem~-nYzZz|puQY*h^dy} z24ALTEH${nTs6m0iLw9}Yg29X=uZa8fa)nP#}$a}PK%MHea1G9O{vdC7=w2jat6)R zIANEOaS3nq$1bfl3VkaUE{xq?Z5%dE3us~O2u;&^r)gSS{$08nx)pRAK#UHEyO*wL zKv%{_4mLW3#ES(GgVrv_O%;=r6_kplee9jVMvtgBq7FED>5dKPPQO5RZs5KjbTlQw zh5=Zw`C0d_4cxmmpu0Dqdo-YXYFViX^oo@XH74Z>6NGI7yw@g6#9CGC+@VIF6c+Z4 z{dK6(y|SwN?5f_~yY=qby?br9+S=ZId)IdF+N)c)ZdG09&6+!_55KBDeS7wewHaot z)JtOPhq0Gl5_@f!(WmgS(P32^E6lKFl8Q?|7ONO;OtBN>mUD+2_nIlG_uDe|P~&=C z-y8e-FcyLL#xSU&rH97;Qe!+d+G{loFBi88Yc~IT$2hz=y8*otTJq?+FM!SvddnlTj4WLr8+&24 z(V~-dpOlWUS?4 zBfYm)(>bh(r>F45`elOtD|Al}{Q|VKZRLN<(Tgc%wuI|vI1E+xv6Ge<!9*i*+DC3a4)u$D>SzsJ5h&ge0ED(LTsza{^{o?%VsE1;zYTv`g@ zb-xK(q>StSC+K#uucvS>YxOdtW#MFM?pWLx(>g-@Hz@p1%M5Gu4WzXMw+l>%L0-BH zdzX$ia2HzKlX3Pt#~2@L-y3!hB&-$k|3U1`mBysPsy<;6QQEvE%NEUA zv7&ZaY3;IQOO|O9VqdK^29=#y6;?5y&cAqD%Rgyr(x;`!n`7gTM~c*8E%^z@{(QV~ zLAS#}-7Y>6d=fAjkbFuB1*9__2}rA37(4a^qeJv|vL+RAZQrm~&i|wQOJZyI7k=#p zgelUXTxJ~wel*}^!8GXU4eUn7X*c=a&@+IUz%c;X4XAw8K)f6)S!ImRb_G|2e2F+H z*%Do4Ow-HeLQCWA0!U-@racRKZfx&~Mwgbi;*IX4Oes&PAx7;RzTc*0{Gm&1)JaB1 zdnbORsq~DUdXjN$%CImS>$y~7*O-2a(IeLNWTUH+oo)%{;O=GUTx+20YhOKk8kqiFa-dWm$JiIhQD$rGQ*5o(iQ_-$)tFF7mx<-(i^}mU9{OazHA0`HHzqR)Q1_4Qn~j z!9h+_&yD@%bfa|}Z?Kg(9}l=m$_OJtHpl*by3wbdD=($^&BZz{Kc(2MfCorH8siIF zjyi)uD!OEtGnB95U)XpG|FA<^DpD_W&B(GU(J6y|JTRu zZ;t=}nSUxw+swbje;5A}ev3o5*Y1xyJREm;>CiBeL(|^kUwX+${7V9Vk7b`_$$;Kbz|F_5g@8VyQyPtna?(w+&OZ-c$@AEI&oj8B?@cQ|6D~8ms z&^nHA{C44AQXE!0Z`R6%E2b{1UA|=HvN^Rm!V7MisfOm7SCTv z?_S*^Pw4$WG)tajGi6H8|= zVFWs%cCOR>NK;jabmIQ8d(Sqew3Fr~M(XKgVB<(<;IF|#+EB_sKCdvP6`z9pslaJK zY~wjb$8ML63Tv&Q?gFI6xwJ@lX@xE=-03THEOf5X!+wci(%@c+jXu|C5%?ZbDmF4Y zw)kA5Wgrq)yP>au*89iqKGzsD+8t6F{y&R%si(*JmuOt~2jcb#H9a2f{$Y@i_O!7M*A0+d~$r=sdS}_R9Ik)Gwa5 zq;=3~`aG5QBCQ(VVvchDwC(gD<9rD9kiM!+`WFh_VAbndHJ~rljkUN)KZ>UKm?W;} z>Y8yla?6~`;}Sr>PB-_$hpw~&{m-~=A&_|$Em4-XCM+9fD!O4hXn0Tu(s_qzWkGW-c(T#UmJ z)burgahGmB%6}HMWSpz}-$#JAW!y0O>bn1sd`&wWFwWL>%|DB;KEk)ej} zKNsXlA?~HpM^gLJ0wNhc-G3&?(?VS9*ZqHIw9Z9akBqQ%|E;u(&w@mX*{ypGG4CN_%R(9Y~Vs}k2&5(rb6`oKknu|OZnWtyi z!3RASSsk;3^F4IVNp?mz=o+HRoMjc;&wCs*XGg8voNGNcITJ+(Bh@@ld&#KPLjl`k z;romZs#%ZH{YAA13^Veq-N+S@gW>hO*!4cdCWy#=x^3mdw{1cUGa``;h#e5d8awAG z?gIH~oiQN#vt5bA@$ZgyuA#)@DcRaeG3#9cj#BMgI ze;$vE0dr}ZZagVA&+_<2Y+k{a|NmTShP1CMMEa_nT>}<^f&MxEC=Qp=QT^+AyeY_G z(hX^^PXYe-R4%09854Q(1#R&~yfl=3Vo>7&6PJTYcGX4`KjXv!ac%eJk(bc9lJ7p_Xn%J>AL3L<|f!-!=e zR40g2zqC$P9z>luooTcWh(FilAK^z@+uaf|6QFNe1BT4?hXTS7*F=I*pWUFq^Zog$ z1;(Orfdhso?MR(Jq@`9?Ka$>`%1YF~mZ+`OWN;s~b?_@o(pR;06E&q;?vpv*j-K(9 zjAF*^RJd`6Jfs7e4}fLEfZ#{Eza{@m1^6L=@G`Fz7rWtAlQgqz##(7d#APv9~RS z?;+z~e|f0FSA#tX2~&qpA6Gpp?xJ zAH%Pim>Dj1Rmw` zI3If_r|lqx(kf^maPsuSKohD5~udlxNH%1fIadJd($SKyjXK ze)cGV9|IRLZY+C^$B8`5)jYNW?Xz_=^CwnSf%bjG&kt|l{1cDPZ)#eHJ9P6ES_kT? z)}fc4cM<>h3tp;6Q)R}Yi*)UJphLUh0$HSqn-1Ly0-X@%t|_`KEnmxTwVW|<8qs&N zBP(Im+Bn|fVn#slNw0LaT7qu_@7>O4TiFmhgm{9X@u!Ozy{5tc-f!x5?Tm-_%qdI_I{iG1$694y)821 zeI;)>*lU$+_l(o?Lg~780x)o*o_Fz>xP3Q0Z_J@_`(9F4e-~Bp1;4a~9iS3;FbAwP zvp9f;2Mpo6!fp=SacnNLtE+(_htOyp<2oI2v96sD44G`K?ncyWcr*&%liiE#9=bMH zh8$HOBPwk*?;gtbFTmH5EW}&$ZLq2N6VkYAbiH{8T#e&EE`J(i0Szl57nLZxXuYmI z12FTk+az*_*J|C2Tv3I%I)Q#>W!n}F$TdBB`lFG+-eoS0r0ApvG`rP;q)m@Q{AO^b z$0B2!9-P>K9?^jA*MRPvN=H7RVXPrT8QVJQ);frd5GCVuJNTTp$$XU;?Bp5SOJcKL zFq#ki+T(@H*b?3~`w_?Ct$an%ptp$qtn&X!3Ad^eHkH95ZZB(Hr%)4l@IE{AyGOWOKZahF#A zWE~g~7etjYkRZlz9{$lhR0JOoW;y;<7zjLkBOZR>G5BSIE)x$RcL^~aV&D#s%b5@f zmyF#AI6#GIqv_fLKoRRT(tlGZVjzhv6vzMdedO*u6sI)dn(nxFOS5w4Gp3DF;X_tCy7dHzz{h&A<(Hwd&T(pP z{hMyR2BPQ^-3}BZuU%8bclE4?89FwJ>+kifNZoQK&Jd+VX5<3!UEs|+hOH>LY%=Dw z)Y}BF6(VkOE^nD*)VmZOW>iBIt%-i2X_W+M*2N4>xjN~dHy|(b4G-PwB-&4?Vz0+X zb+fFXht4leGc*75pQMNUFJ!$WH1m_BRo>v1#b54XN=u4`WHI!9)ZNqx?ukfXg{^EvL|ACj6Ibq~UdqMB922kTWh&S9Tt+#bqGX`iOzVtPZ zoGhxEHHJ1{YzK$UONK1YkJv+(CTZ&;X%Y2Fi>yAV_?V1Vw5?KN2>;ucXSetG2>-`t z2X7)Z*N9j@*CqHbYZnS0J}+K=u`e#NZEq&5=`3#TS1t%_9d{l&g=C~xTEw~o@ize? zbeLXfdzFZi{(44=7E$&yYJ_CU)gns1_=X&QOZ-=*=_Rc}CJJ!{v+#M$s*VA|M^Paq z+bVVKGa!6Es^~zph;h<$-!=3ED;Q3-4X0hIYq{<5c81S>KcG@lkMP;dC{IoJCFli) z8C)9m*zn?P@DoSHQ9;skY-rmiy4;@@5%U|~6&5{hC{Wh6N5e?IAL_^X;aZ&WY5Dht9JmU~eGbdwe zGU}P#vo-tax}*giux;=GkA=vsVNs-uYlN5Qduk)3`GbK~9t(P>Y8{N#hu+WQNO{cW zVIIdrM)LGh2JJ0GX!LuK`MVplk_>xMh>l_OPLD($tJSpaBk-OZjo9}A8`dA3cEr{|IQ2w@4?tOR|xd zXKjbDMgqTM>X(n#QX&5A%d-1;!dXZ9v+ed?3z6l$J-t`;`0G7vc1IK~@RT=;B%=j4 z*LjAC^t{~Q%btKzKi&!yx>5ZdSoH-zchiyd(+jeLJ6#KCNobv?jM6Srm@wLJA1D(X zu2;d^^uipNPWn^5TwfaJx+Mv&5dw}|!tsqlz->#oy;TTgYld)oJH*d$IkG1cJq|zV zh1rq(bP6~MytLRl9Ogv}Ai^EeOgrXj=%Js|3Ifl0EP~HDEkDUP;al_2f6ce({{ z(~P^(-2IR6`0OPHv~+Z9tjTc@2*XfwH1_ z7d6|nMiX7S6{`xYnlosd6+9LKWrynKnXLc*6)2mgleF(e6gbI*82Yom;e*w>*8Ox{ zt31zq;U6qRy^g|rjc&-lxn`Fm4=V2>(!c%Sq+H3mPuh>182~Etb#n;+(UXO!)Xib6 z@SFiu_S6lrQ&OZN;lk-`1R9`SXkF3xxr zmum0<9radPMAoaOipwD_GGwi4DY#mv%6X3Lxu(PDQ1Cb}Jth>WC&RAEW|>~gInC>% zZ+^~4aazfi4*gmOx7E7=NN}tkyvsvNXMfofC3Ikdhc5p?Z=14EQ2wKy_w$Plb(xOh z603i~$c{!XAUkWMr~|UCGl_X4c=pAVvO2E2upSb@S+- zoE6lbL#2CO168Kt;i0;xtYxY7tIEkuu3yRWm1-eQsNZn?s+tT@YL>4m=>!n_vG(-; zul1{?P6<=nq*|o=P1di9c=0)IR8z=2gZZ1LYyGnG?_EJ>BzOIqaR{!Qy|EcUKUvbf zErh7v%EQRiwGp;%$iLYltZS=)5gEE6|K@4Ay3+JU1f|&;`FK*II_@p{Tc)!49?&D;SDVMVv-))Yk4 zx-s~=l_8-WGGQx3c3U*TB8Z(3<@5D|KyRb8Jr+5E>E1LR6A_gmQY(xIBvX*qTykFtS#+Cj z+iJLQ`*pT#VKy2t0^R{5TXrxr>yud$i-6&=h{%?0;3AJrw(MY9>qxd*lD(bTxCr?g zi0r2k>}O6UgR6yd#r#HygqYtdgoyclh-@b>O-k&%=z)w4THsxe>McoYfu%4a=m}%O#goDid{5`<@M{z#zEe;~Bb%_rl&igp-@`SFJ zTo9KReI~2rKI2u?db5-w2~yfZH=kgC^g*DMja5Syo63p3H=qVM--Zoz-WP!iL{$jw zRGgJjGVkcqb?p|QBHbWcv2LAwIngUG*0uagu*);-k3GGxqR41zZzWmR1fFCXdW*** zYqwzrrYv&ZnQzFd&0MdAvv6n?UqaKL&Zz@qXXt{2`R_h8g z1MP_3H5FGpY~)7UQlK|Rl3;7pNTU!&^i1W{+1L4ZUIy zW5eS+I6m5y0G3Bex>EQsMvvbC6|Hp3myZ6%@KMnkLHV5@K^cWgtAQF;!c0tv6ZBH+ zGMsh`AuDy0A;PHGYNf6}eD5lRtkl`FaB_{T*4Z;WOqUhAz*Qc(lbGaDq?bDA+OR*- zAS*&TW5Qla(1lq@#a+4~|K^l$#_TN`95^@Vkk%A(zE;v%rH6yZ&T}IrfBy;DGd;9gd0yaQv0AP8W790oxO@d0BSc#< z)F`md&O=!jVwhn^HjuuXt0kbf%cKmfvpTE#UwnI0|A_j)H1Fk>8?-}=REB3(Q6Vc(bT@&D#?_dn0l9+uQj7eEi>HUvv z@fti=dQIGPxU<53&LaeiveV3zMH6PLzqDwQRA$={>n|^o#JcIe7E6NTJjwDo$(&i9 zY)Ps|d)$S7*wd|`lc|#EeoUiDw0Si0+hb9-{)-~r>B<3YMwSC^HWmWlD}W69cW_Fyamail@D-s);L*fB@Fu9lKJYdn+vK}uC12vMhX5`j-aVyDEJn`8MNR02wFc{x;leaLyo}J5wum{`yqP{+7ezw zj-ahoESd5@IexauDcnAUYk|Xlt?>fI!6=~&3(-g+f_9sfaC`Si2z&>4W$WCCI^`mG zj;YQbSd&=xJ6OLDK`rAQ#hLkI6>G_hLKnzbejulE*Lj$>`8RE$4G!g2yq5Pr zX%$a91#Chp{zjV`!37=_tm6Iu+3ARYY?8R9VxZC7x|GF_ol$9VN3!~H3vPQLdJeNw z7eA^F_*g`SBpIGe0yB-~>K+J{zPkiBSeDX|9p<7awS=1SDbgzi`I zxt^sN;@7x~hyM{Ca%8t+8>{AH3UzHAQ1Lj+ausfRDutQnIr}yhU+94+y_xw^FH$ME zzAL`c2Lyb*T#}f-)+;h|BonT|W)SPm>ZtXxTZp*N`6TzAZp-?sYiJ`ag0cqd8fP8W zrI2e4PfhOMGHf(;8TNhl6HsIw<5pQU`B6)%AL)kh!{5F|y!6k&m}ahbRZF!O#Pk26 zZgI)5R(do=epPR4y^c;;CB!p&$Qq5VH~}JXW7OB&dJ9dvPMn_Aiv!uu(jDgrHgjx%?dwZ*b4^$tts&JO?)NH@7L0!B?U8FMiJ(#O1;&t5?=DMch4R)Y} z!LCU#c{@c2+!*KaE@9Zu@YwAYaV8U)KeHqII;i*+S5wnQuQyrS>C0ml(D~oGSS(`zIV-Q(dJu3-0wSgH-SA82Bnd!~ZVM``1+3 zI8VAgZZ%5+iyK%pctfYsU-;h+m4^nKdPQd)B}0*DVyyH?qyNnWLf+DeO?iuxHz5k2 zqA>P22<2_ExZ9{NS3BPUuC(*w-{_4b|7SBeSUOX+bOu9zImZen0n$7C)*M7DApJ%& zDsQK&JVNjCKgC1$aRQ(NV^&{V*Xn@*B^+)48%Ra~VvO|OEi^-OF;=ppIbd3YGXy@y z%%~iC7%;$SyJR!{T6_&RI<nFr&3r>h>~s*ebf**^?eHEoD!7 zz_k2*?@3D>&X#neFwuQ(WdBT{gBT_*o%fNugP4%R$42Rp{(-XYpkyxUo*VdW*xiT= z?&$dciVM7?>ODR2n{y$mHR=)vrC#^9T3!C{g9}>8ZGGeYy}hC5rS*#wWA##}Dp@X- zlPa&cQlUCBX)xl6mCXTz?UdIV2lO(s8^6|=+WzFd#;p5fBQtI!P-vR>=*pKZvKBt* zIy)y$4jD z6?t{DnmSx`GYXp=E_PD~?r>o-e1NOrq7*ziT(paGYXA15*vDOdT9UT|x*O&8c+dFJ z>CNjr~b z)N|5G%IL`REIDZ98Wrk)b=u19u9CDmZlzK+HVi})*(8rUc$g3H$mUMV`RF~Gv1cgu z#xU%IJZ1s)i}YMKyK3TnRg9?sP`@gt7tO{s^&4{Yhd@^{Z4*3gH0f6hu`wJ8k7hqa z@IRDAhB3WdE%=&dN{QbDo;|^~l@h-l0wvxOC4P_KDDajj@ZrS}Kd-!dbays_$`2#` zN&hETB18PjD?HN?Xg9sY0Ek zbz4ck%o5fJ9=)w3Wj;{9**++5>~A7+S3lkczOU75G|9L*IB)DL6)^bsC2p(~@eVWC znW}XSxeA6nbCUWia|7Nt5VBw5sAupaZwy!V4j$nNAu+t}aX4={jJR-lF=Pf4|kXm$>eT_Z4t?!g&Ud6D5RN{f@eSPFW;}6divBaWmR(O z-Jm@7q>7Z8C$wkg8E?EzmrXODoT6(vQ<)#s|5G=69Ib1o1NA%Oa|+|fQDEt#nem5t z>}IxKf2p2VHilb}fckUwyz3_5<8bf`<6-jl9;&O;r}gw@Ep@iPbe*oPo`mNc^}t7- z)u8%6MfG;6Hn;1Amb})!Y8f2etmmf6gm-Nv6V{63yWFQFC)+l~eMXAtC{IJwU7BY} z2i*m(mJw7BrPt9r)iOeX;7-p>^50!Y=!#>bb%bBHj4+BQ63YlR5c^(6aMRy^QM4b+ z2syI-?3%huZEl41H2M0wSXy!qK&kYz<@T)xC!n08+VM!T<@PN(slAHA$ZI{895!DI zQO?a<86V7}7KDgjx|MQ*TQ1#7Il(QLZY54|OZw^vx1{91ww5EX^Jpi0>72pie1;3- zav3}}#s`lD3w3i3`0(M}=Rgy7X23Vnw4`}0_?v{<&8b|+{wFZ8U-UgTy=d*`Fdo+e zi`sBOCI20xM?rMd%^PU`KLLwMi6VXlO|ceuf@zOQ993qcXByV0=iPoZ2RuXx(|aMU#i z_chP{)RSvSiowRZ{!muW$ctnpazDgUhy{PQBY)-W%UbY7d$Nii`hrtA;H6#7&~R|q z0+;I-iXQuffUMKv(6$eFv;d;8r`{&>4Ns(n zy}6`Eojt1(zvnc*;34$}h_f4eC`$XBQc37b%%bl+1-!NY~rge}hA=S>)3r!8Z|Cu36O9&hZ{AssDyVg8%Ra`7t{p zQEZm@Iz_W068vc)+S(Bbx)YpWO&mtiBGc;dB)!FU1H6>M}zhZTEmn7`2&T0tveT&t2o_|@YMt{ZXY$LG>$Novfc1_() z+!^r;uPUoIhYQHN#cRsEIgI@4DwO-`@F*eNSBGmLJg3S_#?00=Sx>K9Yv?7nxWw^D zA@eQ<-;aU12X*r!giqmgg_rz(7S~cCuj(pUJbW193!v`zK36o6zEZ;Pyh_*P#n!qz zeAXiq_@_D5-RU#!yC7UscatyI9^sKyb?uF?)eno+c%OHe-ZIh&Vx17z1g&**Y2|`% z)Va~Yz5~CmnRg^7@g%ToYWwjvlSJSeiKNM!AvEh^ z^1FwqC9l@$5aE>&Cm6grMO&^E;!-586&HhQ{QG}#RtarRj*j%us>u?BI;%7ld|%qP zTXxQo9*mPb>b#z&c6OHvQ~t=ix|;vXxwQTbbg3Du)g#=gZYNE`BYv@^J# z3@OXb{hO;1^Fv;kQ4S@ag2}4$@YVshmBkloZs(3Q zP0i*1#PH*q;pO;P7FW&1vd~DK44sDfsPt}NKW@HrZo7wCb5#d(7HK^}`2b)

ajL-GEu6^5#4!O2;)uKsUI#v= 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 R*b0|{v_nq*F;PkW{{wj{O345K From 7fe87f59a3081cdd937ca0cee94e0d4fda46ee6a Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Mon, 5 Jul 2021 11:04:51 +0200 Subject: [PATCH 15/23] chore(version): bump development version --- CHANGELOG.md | 2 ++ Cargo.lock | 12 ++++++------ Cargo.toml | 14 +++++++------- zellij-client/Cargo.toml | 4 ++-- zellij-server/Cargo.toml | 4 ++-- zellij-tile-utils/Cargo.toml | 2 +- zellij-tile/Cargo.toml | 2 +- zellij-utils/Cargo.toml | 4 ++-- 8 files changed, 23 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79e81a2f..13c8cf27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] + +## [0.14.0] - 2021-07-05 * Add improved error handling for layouts (https://github.com/zellij-org/zellij/pull/576) * Change layout directory from data to config (https://github.com/zellij-org/zellij/pull/577) POSSIBLE BREAKING CHANGE: diff --git a/Cargo.lock b/Cargo.lock index df0db731..52967fbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2447,7 +2447,7 @@ dependencies = [ [[package]] name = "zellij" -version = "0.14.0" +version = "0.15.0" dependencies = [ "insta", "names", @@ -2460,7 +2460,7 @@ dependencies = [ [[package]] name = "zellij-client" -version = "0.14.0" +version = "0.15.0" dependencies = [ "insta", "mio", @@ -2470,7 +2470,7 @@ dependencies = [ [[package]] name = "zellij-server" -version = "0.14.0" +version = "0.15.0" dependencies = [ "ansi_term 0.12.1", "async-trait", @@ -2487,7 +2487,7 @@ dependencies = [ [[package]] name = "zellij-tile" -version = "0.14.0" +version = "0.15.0" dependencies = [ "serde", "serde_json", @@ -2497,14 +2497,14 @@ dependencies = [ [[package]] name = "zellij-tile-utils" -version = "0.14.0" +version = "0.15.0" dependencies = [ "ansi_term 0.12.1", ] [[package]] name = "zellij-utils" -version = "0.14.0" +version = "0.15.0" dependencies = [ "async-std", "backtrace", diff --git a/Cargo.toml b/Cargo.toml index 16525452..138f4d30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij" -version = "0.14.0" +version = "0.15.0" authors = ["Aram Drevekenin "] edition = "2018" description = "A terminal workspace with batteries included" @@ -14,17 +14,17 @@ resolver = "2" [dependencies] names = "0.11.0" -zellij-client = { path = "zellij-client/", version = "0.14.0" } -zellij-server = { path = "zellij-server/", version = "0.14.0" } -zellij-utils = { path = "zellij-utils/", version = "0.14.0" } +zellij-client = { path = "zellij-client/", version = "0.15.0" } +zellij-server = { path = "zellij-server/", version = "0.15.0" } +zellij-utils = { path = "zellij-utils/", version = "0.15.0" } [dev-dependencies] insta = { version = "1.6.0", features = ["backtrace"] } ssh2 = "0.9.1" rand = "0.8.0" -zellij-utils = { path = "zellij-utils/", version = "0.14.0", features = ["test"] } -zellij-client = { path = "zellij-client/", version = "0.14.0", features = ["test"] } -zellij-server = { path = "zellij-server/", version = "0.14.0", features = ["test"] } +zellij-utils = { path = "zellij-utils/", version = "0.15.0", features = ["test"] } +zellij-client = { path = "zellij-client/", version = "0.15.0", features = ["test"] } +zellij-server = { path = "zellij-server/", version = "0.15.0", features = ["test"] } [workspace] members = [ diff --git a/zellij-client/Cargo.toml b/zellij-client/Cargo.toml index 4ca49bcc..5eff3b81 100644 --- a/zellij-client/Cargo.toml +++ b/zellij-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij-client" -version = "0.14.0" +version = "0.15.0" authors = ["Kunal Mohan "] edition = "2018" description = "The client-side library for Zellij" @@ -11,7 +11,7 @@ license = "MIT" [dependencies] mio = "0.7.11" termbg = "0.2.3" -zellij-utils = { path = "../zellij-utils/", version = "0.14.0" } +zellij-utils = { path = "../zellij-utils/", version = "0.15.0" } [dev-dependencies] insta = "1.6.0" diff --git a/zellij-server/Cargo.toml b/zellij-server/Cargo.toml index 7408eb8b..16049c68 100644 --- a/zellij-server/Cargo.toml +++ b/zellij-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij-server" -version = "0.14.0" +version = "0.15.0" authors = ["Kunal Mohan "] edition = "2018" description = "The server-side library for Zellij" @@ -18,7 +18,7 @@ unicode-width = "0.1.8" wasmer = "1.0.0" wasmer-wasi = "1.0.0" cassowary = "0.3.0" -zellij-utils = { path = "../zellij-utils/", version = "0.14.0" } +zellij-utils = { path = "../zellij-utils/", version = "0.15.0" } [dev-dependencies] insta = "1.6.0" diff --git a/zellij-tile-utils/Cargo.toml b/zellij-tile-utils/Cargo.toml index 0d78aaae..9c8865a9 100644 --- a/zellij-tile-utils/Cargo.toml +++ b/zellij-tile-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij-tile-utils" -version = "0.14.0" +version = "0.15.0" authors = ["denis "] edition = "2018" description = "A utility library for Zellij plugins" diff --git a/zellij-tile/Cargo.toml b/zellij-tile/Cargo.toml index 93bc3a61..b0c18ff2 100644 --- a/zellij-tile/Cargo.toml +++ b/zellij-tile/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij-tile" -version = "0.14.0" +version = "0.15.0" authors = ["Brooks J Rady "] edition = "2018" description = "A small client-side library for writing Zellij plugins" diff --git a/zellij-utils/Cargo.toml b/zellij-utils/Cargo.toml index 16aab07d..a15be803 100644 --- a/zellij-utils/Cargo.toml +++ b/zellij-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij-utils" -version = "0.14.0" +version = "0.15.0" authors = ["Kunal Mohan "] edition = "2018" description = "A utility library for Zellij client and server" @@ -27,7 +27,7 @@ structopt = "0.3" strum = "0.20.0" termion = "1.5.0" vte = "0.10.1" -zellij-tile = { path = "../zellij-tile/", version = "0.14.0" } +zellij-tile = { path = "../zellij-tile/", version = "0.15.0" } [dependencies.async-std] version = "1.3.0" From 50a580f6bd3242a6db109bfa7b3cd856de407ba0 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Mon, 5 Jul 2021 11:08:26 +0200 Subject: [PATCH 16/23] docs(changelog): fix version number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13c8cf27..fde351f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] -## [0.14.0] - 2021-07-05 +## [0.15.0] - 2021-07-05 * Add improved error handling for layouts (https://github.com/zellij-org/zellij/pull/576) * Change layout directory from data to config (https://github.com/zellij-org/zellij/pull/577) POSSIBLE BREAKING CHANGE: From 9c419a0a4f5a6a4184cfe9169ba8eaf3113946c1 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Mon, 5 Jul 2021 11:08:58 +0200 Subject: [PATCH 17/23] docs(changelog): fix version number again :) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fde351f3..13c8cf27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] -## [0.15.0] - 2021-07-05 +## [0.14.0] - 2021-07-05 * Add improved error handling for layouts (https://github.com/zellij-org/zellij/pull/576) * Change layout directory from data to config (https://github.com/zellij-org/zellij/pull/577) POSSIBLE BREAKING CHANGE: From 47206866b68a00222a95b02abbfdbf0a6f38c781 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Mon, 5 Jul 2021 18:51:14 +0200 Subject: [PATCH 18/23] fix(os): attempt to stop children with SIGTERM before SIGKILL (#601) * fix(os): attempt to stop children with SIGTERM before SIGKILL * style(fmt): make rustfmt happy --- zellij-server/src/os_input_output.rs | 47 +++++++++++++++----------- zellij-server/src/pty.rs | 15 ++++++-- zellij-server/src/unit/screen_tests.rs | 3 ++ zellij-server/src/unit/tab_tests.rs | 3 ++ 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/zellij-server/src/os_input_output.rs b/zellij-server/src/os_input_output.rs index fc1e0eae..24d40583 100644 --- a/zellij-server/src/os_input_output.rs +++ b/zellij-server/src/os_input_output.rs @@ -54,8 +54,9 @@ pub(crate) fn set_terminal_size_using_fd(fd: RawFd, columns: u16, rows: u16) { /// Handle some signals for the child process. This will loop until the child /// process exits. fn handle_command_exit(mut child: Child) { - // register the SIGINT signal (TODO handle more signals) - let mut signals = signal_hook::iterator::Signals::new(&[SIGINT]).unwrap(); + let mut should_exit = false; + let mut attempts = 3; + let mut signals = signal_hook::iterator::Signals::new(&[SIGINT, SIGTERM]).unwrap(); 'handle_exit: loop { // test whether the child process has exited match child.try_wait() { @@ -66,17 +67,26 @@ fn handle_command_exit(mut child: Child) { break 'handle_exit; } Ok(None) => { - ::std::thread::sleep(::std::time::Duration::from_millis(100)); + ::std::thread::sleep(::std::time::Duration::from_millis(10)); } Err(e) => panic!("error attempting to wait: {}", e), } - for signal in signals.pending() { - if let SIGINT = signal { - child.kill().unwrap(); - child.wait().unwrap(); - break 'handle_exit; + if !should_exit { + for signal in signals.pending() { + if signal == SIGINT || signal == SIGTERM { + should_exit = true; + } } + } else if attempts > 0 { + // let's try nicely first... + attempts -= 1; + kill(Pid::from_raw(child.id() as i32), Some(Signal::SIGTERM)).unwrap(); + continue; + } else { + // when I say whoa, I mean WHOA! + let _ = child.kill(); + break 'handle_exit; } } } @@ -90,10 +100,7 @@ fn handle_terminal(cmd: RunCommand, orig_termios: termios::Termios) -> (RawFd, P Ok(fork_pty_res) => { let pid_primary = fork_pty_res.master; let pid_secondary = match fork_pty_res.fork_result { - ForkResult::Parent { child } => { - // fcntl(pid_primary, FcntlArg::F_SETFL(OFlag::empty())).expect("could not fcntl"); - child - } + ForkResult::Parent { child } => child, ForkResult::Child => { let child = Command::new(cmd.command) .args(&cmd.args) @@ -205,8 +212,10 @@ pub trait ServerOsApi: Send + Sync { fn write_to_tty_stdin(&self, fd: RawFd, buf: &[u8]) -> Result; /// Wait until all output written to the object referred to by `fd` has been transmitted. fn tcdrain(&self, fd: RawFd) -> Result<(), nix::Error>; - /// Terminate the process with process ID `pid`. + /// Terminate the process with process ID `pid`. (SIGTERM) fn kill(&self, pid: Pid) -> Result<(), nix::Error>; + /// Terminate the process with process ID `pid`. (SIGKILL) + fn force_kill(&self, pid: Pid) -> Result<(), nix::Error>; /// Returns a [`Box`] pointer to this [`ServerOsApi`] struct. fn box_clone(&self) -> Box; /// Receives a message on server-side IPC channel @@ -252,16 +261,14 @@ impl ServerOsApi for ServerOsInputOutput { Box::new((*self).clone()) } fn kill(&self, pid: Pid) -> Result<(), nix::Error> { - // TODO: - // Ideally, we should be using SIGINT rather than SIGKILL here, but there are cases in which - // the terminal we're trying to kill hangs on SIGINT and so all the app gets stuck - // that's why we're sending SIGKILL here - // A better solution would be to send SIGINT here and not wait for it, and then have - // a background thread do the waitpid stuff and send SIGKILL if the process is stuck - kill(pid, Some(Signal::SIGKILL)).unwrap(); + kill(pid, Some(Signal::SIGTERM)).unwrap(); waitpid(pid, None).unwrap(); Ok(()) } + fn force_kill(&self, pid: Pid) -> Result<(), nix::Error> { + let _ = kill(pid, Some(Signal::SIGKILL)); + Ok(()) + } fn recv_from_client(&self) -> (ClientToServerMsg, ErrorContext) { self.receive_instructions_from_client .as_ref() diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index 0dba3611..cc23e77e 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -273,9 +273,20 @@ impl Pty { PaneId::Terminal(id) => { let child_pid = self.id_to_child_pid.remove(&id).unwrap(); let handle = self.task_handles.remove(&id).unwrap(); - self.bus.os_input.as_mut().unwrap().kill(child_pid).unwrap(); task::block_on(async { - handle.cancel().await; + self.bus.os_input.as_mut().unwrap().kill(child_pid).unwrap(); + let timeout = Duration::from_millis(100); + match async_timeout(timeout, handle.cancel()).await { + Ok(_) => {} + _ => { + self.bus + .os_input + .as_mut() + .unwrap() + .force_kill(child_pid) + .unwrap(); + } + }; }); } PaneId::Plugin(pid) => drop( diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs index 885cb3d1..173e2ccc 100644 --- a/zellij-server/src/unit/screen_tests.rs +++ b/zellij-server/src/unit/screen_tests.rs @@ -44,6 +44,9 @@ impl ServerOsApi for FakeInputOutput { fn box_clone(&self) -> Box { Box::new((*self).clone()) } + fn force_kill(&self, _pid: Pid) -> Result<(), nix::Error> { + unimplemented!() + } fn kill(&self, _pid: Pid) -> Result<(), nix::Error> { unimplemented!() } diff --git a/zellij-server/src/unit/tab_tests.rs b/zellij-server/src/unit/tab_tests.rs index f4c7493e..c19c41ce 100644 --- a/zellij-server/src/unit/tab_tests.rs +++ b/zellij-server/src/unit/tab_tests.rs @@ -44,6 +44,9 @@ impl ServerOsApi for FakeInputOutput { fn box_clone(&self) -> Box { unimplemented!() } + fn force_kill(&self, _pid: Pid) -> Result<(), nix::Error> { + unimplemented!() + } fn kill(&self, _pid: Pid) -> Result<(), nix::Error> { unimplemented!() } From 79c30e9d59e69959317ab046c57b8a81f57af1ac Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Mon, 5 Jul 2021 18:52:15 +0200 Subject: [PATCH 19/23] docs(changelog): kill children properly --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13c8cf27..b3da8742 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] +* Kill children properly (https://github.com/zellij-org/zellij/pull/601) ## [0.14.0] - 2021-07-05 * Add improved error handling for layouts (https://github.com/zellij-org/zellij/pull/576) From 82288c6a3d4a1347016fd7a5bd83fdbcbe9fcc1d Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sun, 4 Jul 2021 15:20:47 +0530 Subject: [PATCH 20/23] Remove test feature and hacks --- Cargo.toml | 3 --- zellij-client/Cargo.toml | 2 -- zellij-client/src/lib.rs | 12 ------------ zellij-server/Cargo.toml | 2 -- zellij-server/src/lib.rs | 18 ------------------ zellij-server/src/panes/grid.rs | 7 ++++--- zellij-server/src/panes/terminal_pane.rs | 1 - zellij-server/src/pty.rs | 1 - zellij-utils/Cargo.toml | 2 -- zellij-utils/src/setup.rs | 6 ------ 10 files changed, 4 insertions(+), 50 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 138f4d30..f5f221e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,6 @@ zellij-utils = { path = "zellij-utils/", version = "0.15.0" } insta = { version = "1.6.0", features = ["backtrace"] } ssh2 = "0.9.1" rand = "0.8.0" -zellij-utils = { path = "zellij-utils/", version = "0.15.0", features = ["test"] } -zellij-client = { path = "zellij-client/", version = "0.15.0", features = ["test"] } -zellij-server = { path = "zellij-server/", version = "0.15.0", features = ["test"] } [workspace] members = [ diff --git a/zellij-client/Cargo.toml b/zellij-client/Cargo.toml index 5eff3b81..5a2e314a 100644 --- a/zellij-client/Cargo.toml +++ b/zellij-client/Cargo.toml @@ -16,5 +16,3 @@ zellij-utils = { path = "../zellij-utils/", version = "0.15.0" } [dev-dependencies] insta = "1.6.0" -[features] -test = ["zellij-utils/test"] diff --git a/zellij-client/src/lib.rs b/zellij-client/src/lib.rs index f3e42a74..90732024 100644 --- a/zellij-client/src/lib.rs +++ b/zellij-client/src/lib.rs @@ -118,7 +118,6 @@ pub fn start_client( palette, }; - #[cfg(not(any(feature = "test", test)))] let first_msg = match info { ClientInfo::Attach(name, force, config_options) => { SESSION_NAME.set(name).unwrap(); @@ -140,16 +139,6 @@ pub fn start_client( ) } }; - #[cfg(any(feature = "test", test))] - let first_msg = { - let _ = SESSION_NAME.set("".into()); - ClientToServerMsg::NewClient( - client_attributes, - Box::new(opts), - Box::new(config_options.clone()), - layout, - ) - }; os_input.connect_to_server(&*ZELLIJ_IPC_PIPE); os_input.send_to_server(first_msg); @@ -167,7 +156,6 @@ pub fn start_client( > = channels::bounded(50); let send_client_instructions = SenderWithContext::new(send_client_instructions); - #[cfg(not(any(feature = "test", test)))] std::panic::set_hook({ use zellij_utils::errors::handle_panic; let send_client_instructions = send_client_instructions.clone(); diff --git a/zellij-server/Cargo.toml b/zellij-server/Cargo.toml index 16049c68..beefb82d 100644 --- a/zellij-server/Cargo.toml +++ b/zellij-server/Cargo.toml @@ -23,5 +23,3 @@ zellij-utils = { path = "../zellij-utils/", version = "0.15.0" } [dev-dependencies] insta = "1.6.0" -[features] -test = ["zellij-utils/test"] diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs index 6618c0a7..660acdc9 100644 --- a/zellij-server/src/lib.rs +++ b/zellij-server/src/lib.rs @@ -114,7 +114,6 @@ pub(crate) enum SessionState { } pub fn start_server(os_input: Box, socket_path: PathBuf) { - #[cfg(not(any(feature = "test", test)))] daemonize::Daemonize::new() .working_directory(std::env::current_dir().unwrap()) .umask(0o077) @@ -130,7 +129,6 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { let session_data: Arc>> = Arc::new(RwLock::new(None)); let session_state = Arc::new(RwLock::new(SessionState::Uninitialized)); - #[cfg(not(any(feature = "test", test)))] std::panic::set_hook({ use zellij_utils::errors::handle_panic; let to_server = to_server.clone(); @@ -141,21 +139,6 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { let thread_handles = Arc::new(Mutex::new(Vec::new())); - #[cfg(any(feature = "test", test))] - thread_handles.lock().unwrap().push( - thread::Builder::new() - .name("server_router".to_string()) - .spawn({ - let session_data = session_data.clone(); - let os_input = os_input.clone(); - let to_server = to_server.clone(); - let session_state = session_state.clone(); - - move || route_thread_main(session_data, session_state, os_input, to_server) - }) - .unwrap(), - ); - #[cfg(not(any(feature = "test", test)))] let _ = thread::Builder::new() .name("server_listener".to_string()) .spawn({ @@ -306,7 +289,6 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { .unwrap() .drain(..) .for_each(|h| drop(h.join())); - #[cfg(not(any(feature = "test", test)))] drop(std::fs::remove_file(&socket_path)); } diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index 27eea695..df9b7a9c 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -1766,9 +1766,10 @@ impl Perform for Grid { _ => {} } } else { - let result = debug_log_to_file(format!("Unhandled csi: {}->{:?}", c, params)); - #[cfg(not(any(feature = "test", test)))] - result.unwrap(); + drop(debug_log_to_file(format!( + "Unhandled csi: {}->{:?}", + c, params + ))); } } diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index 087817d6..0dc28aa7 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -387,7 +387,6 @@ impl TerminalPane { pub fn read_buffer_as_lines(&self) -> Vec> { self.grid.as_character_lines() } - #[cfg(any(feature = "test", test))] pub fn cursor_coordinates(&self) -> Option<(usize, usize)> { // (x, y) self.grid.cursor_coordinates() diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index cc23e77e..e7884f35 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -198,7 +198,6 @@ fn stream_terminal_bytes( } async_send_to_screen(senders.clone(), ScreenInstruction::Render).await; - #[cfg(not(any(feature = "test", test)))] // this is a little hacky, and is because the tests end the file as soon as // we read everything, rather than hanging until there is new data // a better solution would be to fix the test fakes, but this will do for now diff --git a/zellij-utils/Cargo.toml b/zellij-utils/Cargo.toml index a15be803..6b530ee9 100644 --- a/zellij-utils/Cargo.toml +++ b/zellij-utils/Cargo.toml @@ -36,5 +36,3 @@ features = ["unstable"] [dev-dependencies] tempfile = "3.2.0" -[features] -test = [] diff --git a/zellij-utils/src/setup.rs b/zellij-utils/src/setup.rs index c46876ec..c25e1fb9 100644 --- a/zellij-utils/src/setup.rs +++ b/zellij-utils/src/setup.rs @@ -12,7 +12,6 @@ const CONFIG_LOCATION: &str = ".config/zellij"; const CONFIG_NAME: &str = "config.yaml"; static ARROW_SEPARATOR: &str = ""; -#[cfg(not(any(feature = "test", test)))] /// Goes through a predefined list and checks for an already /// existing config directory, returns the first match pub fn find_default_config_dir() -> Option { @@ -23,11 +22,6 @@ pub fn find_default_config_dir() -> Option { .flatten() } -#[cfg(any(feature = "test", test))] -pub fn find_default_config_dir() -> Option { - None -} - /// Order in which config directories are checked fn default_config_dirs() -> Vec> { vec![ From e2949509a2eecf62cc8476891a89cb8a4cad1623 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sun, 4 Jul 2021 21:16:47 +0530 Subject: [PATCH 21/23] Add custom function for unit test in zellij-utils --- zellij-utils/src/setup.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/zellij-utils/src/setup.rs b/zellij-utils/src/setup.rs index c25e1fb9..61c330cd 100644 --- a/zellij-utils/src/setup.rs +++ b/zellij-utils/src/setup.rs @@ -12,6 +12,7 @@ const CONFIG_LOCATION: &str = ".config/zellij"; const CONFIG_NAME: &str = "config.yaml"; static ARROW_SEPARATOR: &str = ""; +#[cfg(not(test))] /// Goes through a predefined list and checks for an already /// existing config directory, returns the first match pub fn find_default_config_dir() -> Option { @@ -22,6 +23,11 @@ pub fn find_default_config_dir() -> Option { .flatten() } +#[cfg(test)] +pub fn find_default_config_dir() -> Option { + None +} + /// Order in which config directories are checked fn default_config_dirs() -> Vec> { vec![ From af86edcf99efafcae243b6e2cefaeeff3ead2b88 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Tue, 6 Jul 2021 23:37:53 +0200 Subject: [PATCH 22/23] Change name of `Run` binding for actions * Change ``` Run: {command: , args: [ARGS], direction: } ``` into ``` Run: {cmd: , args: [ARGS], direction: } ``` --- zellij-utils/src/input/command.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/zellij-utils/src/input/command.rs b/zellij-utils/src/input/command.rs index ca505ea2..b66c7500 100644 --- a/zellij-utils/src/input/command.rs +++ b/zellij-utils/src/input/command.rs @@ -19,6 +19,7 @@ pub struct RunCommand { /// Intermediate representation #[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq, Eq)] pub struct RunCommandAction { + #[serde(rename = "cmd")] pub command: PathBuf, #[serde(default)] pub args: Vec, From 50d049a0edd2b342b4c6e9e279d0be77c2c5398d Mon Sep 17 00:00:00 2001 From: a-kenji Date: Wed, 7 Jul 2021 11:09:26 +0200 Subject: [PATCH 23/23] docs(changelog): Change Run binding #602 Change ``` Run: {command: , args: [ARGS], direction: } ``` into ``` Run: {cmd: , args: [ARGS], direction: } ``` --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3da8742..4c5367fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] * Kill children properly (https://github.com/zellij-org/zellij/pull/601) +* Change name of `Run` binding for actions (https://github.com/zellij-org/zellij/pull/602) ## [0.14.0] - 2021-07-05 * Add improved error handling for layouts (https://github.com/zellij-org/zellij/pull/576)