diff --git a/kitty_tests/screen.py b/kitty_tests/screen.py index a8dbd16f7..c1d0d2b6f 100644 --- a/kitty_tests/screen.py +++ b/kitty_tests/screen.py @@ -1147,22 +1147,44 @@ class TestScreen(BaseTest): s.toggle_alt_screen() self.assertFalse(str(s.line(s.cursor.y))) - s = self.create_screen() + s = self.create_screen(scrollback=10) + draw_output(1, 'start') for i in range(4): - mark_prompt() - s.draw(f'$ {i}') - s.carriage_return() - s.index(), s.index() + draw_prompt(str(i) + 'ab') + draw_output(1, 'ut') self.ae(s.scrolled_by, 0) + self.ae(str(s.visual_line(0)), '$ 2ab') + self.assertFalse(s.scroll_to_prompt(-3)) + self.assertTrue(s.scroll_to_prompt()) + self.ae(str(s.visual_line(0)), '$ 1ab') + self.assertTrue(s.scroll_to_prompt()) + self.ae(str(s.visual_line(0)), '$ 0ab') + self.assertFalse(s.scroll_to_prompt()) + self.assertFalse(s.scroll_to_prompt(4)) + self.assertTrue(s.scroll_to_prompt(1)) + self.ae(str(s.visual_line(0)), '$ 1ab') + self.assertTrue(s.scroll_to_prompt(1)) + self.ae(str(s.visual_line(0)), '$ 2ab') + self.assertFalse(s.scroll_to_prompt(1)) + # wrap prompts + s.resize(s.lines + 1, s.columns - 2) + self.ae(s.scrolled_by, 0) + self.ae(str(s.visual_line(0)), 'ab') + self.assertFalse(s.scroll_to_prompt(-4)) + self.assertTrue(s.scroll_to_prompt()) + self.ae(str(s.visual_line(0)), '$ 2') self.assertTrue(s.scroll_to_prompt()) self.ae(str(s.visual_line(0)), '$ 1') self.assertTrue(s.scroll_to_prompt()) self.ae(str(s.visual_line(0)), '$ 0') self.assertFalse(s.scroll_to_prompt()) + self.assertFalse(s.scroll_to_prompt(4)) self.assertTrue(s.scroll_to_prompt(1)) self.ae(str(s.visual_line(0)), '$ 1') self.assertTrue(s.scroll_to_prompt(1)) self.ae(str(s.visual_line(0)), '$ 2') + self.assertTrue(s.scroll_to_prompt(1)) + self.ae(str(s.visual_line(0)), 'ab') self.assertFalse(s.scroll_to_prompt(1)) s = self.create_screen() @@ -1244,10 +1266,19 @@ class TestScreen(BaseTest): s.scroll(2, False) self.ae(str(s.visual_line(0)), '$ 1') self.ae(fco(), '0x\n1x\n') + # test: obscure prompt in scrollback + s.resize(3, 5) + self.ae(str(s.visual_line(0)), '0x') + # without succeeding prompt + self.ae(fco(), '0x\n1x\n') + s.resize(4, 5) + draw_prompt('3') + # with succeeding prompt + self.ae(fco(), '0x\n1x') # resize # get last cmd output with continued output mark - draw_prompt('3'), draw_output(1, 'long_line'), draw_output(2, 'l', False) + draw_output(1, 'long_line'), draw_output(2, 'l', False) s.resize(4, 5) s.scroll_to_prompt(-4) self.ae(str(s.visual_line(0)), '$ 0') @@ -1257,6 +1288,44 @@ class TestScreen(BaseTest): self.ae(lvco(), '0\n1\n2') s.scroll_to_prompt(1) self.ae(lvco(), '0x\n1x') + # test: obscure prompt + s.scroll(2, False) + self.ae(lvco(), '0x\n1x') + # test: prompts without output + s.scroll(s.scrolled_by, False) + draw_prompt('4') + # resizing resets last visited, rely on scroll_to_prompt + s.resize(2, s.columns + 4) + s.scroll_to_prompt() + s.scroll_to_prompt(1) + self.ae(str(s.visual_line(0)), '$ 4') + self.ae(lvco(), '') + s.resize(5, s.columns) + draw_prompt('wrapcmd') + s.scroll_to_prompt(1) + self.ae(lvco(), '') + draw_output(1, 'wrapout'), draw_output(1, 'y', False) + self.ae(lvco(), '0wrapout\n0y\n') + # wrap long prompt with long output + s.resize(5, s.columns - 4) + self.ae(str(s.visual_line(0)), 'pcmd') + # test: set last visited to previous empty prompt + s.scroll_to_prompt(-2) + self.ae(str(s.visual_line(0)), '$ 4') + self.ae(lvco(), '0wrapout\n0y\n') + mark_prompt(), s.draw('$ end') + self.ae(lvco(), '0wrapout\n0y') + # test: set last visited to continued line of long prompt + s.scroll_to_prompt(2) + self.ae(str(s.visual_line(0)), 'pcmd') + self.ae(lvco(), '0wrapout\n0y') + s.scroll_to_prompt() + self.ae(lvco(), '0wrapout\n0y') + # test: set last visited to continued line of output + s.carriage_return(), s.index() + draw_output(1, 'z') + s.scroll_to_prompt(1) + self.ae(lvco(), '0wrapout\n0y') # test that post rewrap prompt lines have correct attributes s = self.create_screen(cols=5, lines=5, scrollback=15)