diff --git a/src/terminal_pane/scroll.rs b/src/terminal_pane/scroll.rs index 20f98da06..6301c7c18 100644 --- a/src/terminal_pane/scroll.rs +++ b/src/terminal_pane/scroll.rs @@ -661,7 +661,7 @@ impl Scroll { 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(); } pub fn override_current_buffer_with_alternative_buffer(&mut self) { if let Some(alternative_buffer) = self.alternative_buffer.as_mut() { @@ -691,6 +691,19 @@ impl Scroll { Some((self.scroll_region.unwrap().0, self.scroll_region.unwrap().1)) } } + fn scroll_region_absolute_indices_or_screen_edges(&mut self) -> (usize, usize) { + match self.scroll_region { + Some(_scroll_region) => self.scroll_region_absolute_indices().unwrap(), + None => { + // indices of screen top and bottom edge + // TODO: what if we don't have enough lines? + // let absolute_top = self.canonical_lines.len() - 1 - self.lines_in_view; + let absolute_top = self.canonical_lines.len() - self.lines_in_view; + let absolute_bottom = self.canonical_lines.len() - 1; + (absolute_top, absolute_bottom) + } + } + } pub fn delete_lines_in_scroll_region(&mut self, count: usize) { if let Some((scroll_region_top, scroll_region_bottom)) = self.scroll_region_absolute_indices() @@ -732,23 +745,20 @@ impl Scroll { } } pub fn move_cursor_up_in_scroll_region(&mut self, count: usize) { - if let Some((scroll_region_top, scroll_region_bottom)) = - self.scroll_region_absolute_indices() - { - // the scroll region indices start at 1, so we need to adjust them - for _ in 0..count { - let current_canonical_line_index = self.cursor_position.line_index.0; - if current_canonical_line_index == scroll_region_top { - // if we're at the top line, we create a new line and remove the last line that - // would otherwise overflow - self.canonical_lines.remove(scroll_region_bottom); - self.canonical_lines - .insert(current_canonical_line_index, CanonicalLine::new()); - } else if current_canonical_line_index > scroll_region_top - && current_canonical_line_index <= scroll_region_bottom - { - self.move_cursor_up(count); - } + let (scroll_region_top, scroll_region_bottom) = + self.scroll_region_absolute_indices_or_screen_edges(); + for _ in 0..count { + let current_canonical_line_index = self.cursor_position.line_index.0; + if current_canonical_line_index == scroll_region_top { + // if we're at the top line, we create a new line and remove the last line that + // would otherwise overflow + self.canonical_lines.remove(scroll_region_bottom); + self.canonical_lines + .insert(current_canonical_line_index, CanonicalLine::new()); + } else if current_canonical_line_index > scroll_region_top + && current_canonical_line_index <= scroll_region_bottom + { + self.move_cursor_up(count); } } } diff --git a/src/tests/fixtures/git_diff_scrollup b/src/tests/fixtures/git_diff_scrollup new file mode 100644 index 000000000..98d06baac Binary files /dev/null and b/src/tests/fixtures/git_diff_scrollup differ diff --git a/src/tests/fixtures/git_log b/src/tests/fixtures/git_log new file mode 100644 index 000000000..9b5bca629 Binary files /dev/null and b/src/tests/fixtures/git_log differ diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index 578e8fd29..e42a26fb8 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -413,3 +413,51 @@ pub fn fish_paste_multiline() { assert_snapshot!(snapshot); } } + +#[test] +pub fn git_log() { + let fake_win_size = PositionAndSize { + columns: 149, + rows: 28, + x: 0, + y: 0, + }; + 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(&[&COMMAND_TOGGLE, &COMMAND_TOGGLE, &QUIT]); + start(Box::new(fake_input_output.clone()), Opt::default()); + let output_frames = fake_input_output + .stdout_writer + .output_frames + .lock() + .unwrap(); + let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); + for snapshot in snapshots { + assert_snapshot!(snapshot); + } +} + +#[test] +pub fn 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 { + columns: 149, + rows: 28, + x: 0, + y: 0, + }; + 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(&[&COMMAND_TOGGLE, &COMMAND_TOGGLE, &QUIT]); + start(Box::new(fake_input_output.clone()), Opt::default()); + let output_frames = fake_input_output + .stdout_writer + .output_frames + .lock() + .unwrap(); + let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); + for snapshot in snapshots { + assert_snapshot!(snapshot); + } +} diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff-2.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff-2.snap new file mode 100644 index 000000000..53a568d55 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff-2.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- + + * 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/mosaic__tests__integration__compatibility__git_diff-3.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff-3.snap new file mode 100644 index 000000000..e50d94934 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff-3.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- + * 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 + +: +Bye from Mosaic!█ diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff.snap new file mode 100644 index 000000000..739c38e66 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- +█ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup-2.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup-2.snap new file mode 100644 index 000000000..e1f541c25 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup-2.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- + +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/mosaic__tests__integration__compatibility__git_diff_scrollup-3.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup-3.snap new file mode 100644 index 000000000..ba0e26d41 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup-3.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- +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(); + } +: +Bye from Mosaic!█ diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup.snap new file mode 100644 index 000000000..739c38e66 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_diff_scrollup.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- +█ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log-2.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log-2.snap new file mode 100644 index 000000000..53a568d55 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log-2.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- + + * 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/mosaic__tests__integration__compatibility__git_log-3.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log-3.snap new file mode 100644 index 000000000..e50d94934 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log-3.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- + * 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 + +: +Bye from Mosaic!█ diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log.snap new file mode 100644 index 000000000..739c38e66 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__git_log.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- +█ + + + + + + + + + + + + + + + + + + + + + + + + + + +