From 2c873cc914417639de0fb2fd08ea371dbf0e2873 Mon Sep 17 00:00:00 2001 From: Andrew Hamilton Date: Mon, 10 Jan 2022 10:58:20 +1000 Subject: [PATCH] editor: Add corner cases for comment_lines. --- diff_edit/editor.py | 42 +++++++++++++++++++++++++++++------------- tests/editor_test.py | 31 ++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/diff_edit/editor.py b/diff_edit/editor.py index ced5162..cf50f4b 100755 --- a/diff_edit/editor.py +++ b/diff_edit/editor.py @@ -462,24 +462,40 @@ class Editor: try: index = self.text_widget[self.cursor_y].index("#") self.cursor_x = index + 1 - except ValueError: + except ValueError: # '#' not in line self.jump_to_end_of_line() self.insert_text(" # ") else: (start_x, start_y), (end_x, end_y) = self.get_selection_interval() - min_indent = min(self._line_indent(y) for y in range(start_y, end_y) - if self.text_widget[y].strip() != "") - if all(self.text_widget[y][min_indent:min_indent+2] == "# " or self.text_widget[y].strip() == "" - for y in range(start_y, end_y)): - for y in range(start_y, end_y): - line = self.text_widget[y] - if line.strip() != "": - self.text_widget[y] = line[:min_indent] + line[min_indent + 2:] + if end_x != 0 and not self.cursor_x == len(self.text_widget[end_y]): + self.enter() + self.cursor_left() + if start_x != 0: + new_line = (self.text_widget[start_y][:start_x] + "# " + + self.text_widget[start_y][start_x:]) + self.text_widget[start_y] = new_line + self.cursor_x = len(new_line) + start_y += 1 + if end_x != 0: + end_y += 1 + mid_lines = range(start_y, end_y) + try: + min_indent = min(self._line_indent(y) for y in mid_lines + if self.text_widget[y].strip() != "") + except ValueError: + pass else: - for y in range(start_y, end_y): - line = self.text_widget[y] - if line.strip() != "": - self.text_widget[y] = line[:min_indent] + "# " + line[min_indent:] + if all(self.text_widget[y][min_indent:min_indent+2] == "# " + or self.text_widget[y].strip() == "" for y in mid_lines): + for y in mid_lines: + line = self.text_widget[y] + if line.strip() != "": + self.text_widget[y] = line[:min_indent] + line[min_indent + 2:] + else: + for y in mid_lines: + line = self.text_widget[y] + if line.strip() != "": + self.text_widget[y] = line[:min_indent] + "# " + line[min_indent:] self.mark = None def join_lines(self): diff --git a/tests/editor_test.py b/tests/editor_test.py index 2d9acc5..802af27 100755 --- a/tests/editor_test.py +++ b/tests/editor_test.py @@ -66,11 +66,11 @@ class EditorTestCase(unittest.TestCase): def _assert_changes(self, changes): for index, change in enumerate(changes): - with self.subTest(index=index, change=change): - method, expected_text, expected_cursor_position = change - with contextlib.suppress(IndexError): - method() - self._assert_editor(expected_text, expected_cursor_position) + # with self.subTest(index=index, change=change): + method, expected_text, expected_cursor_position = change + with contextlib.suppress(IndexError): + method() + self._assert_editor(expected_text, expected_cursor_position) def test_empty_editor(self): self._assert_editor("", (0, 0)) @@ -166,12 +166,16 @@ class EditorTestCase(unittest.TestCase): (self.editor.tab_align, " a\n b", (1, 1))]) def test_comment_lines(self): + # from scratch self._set_editor("", (0, 0)) self._assert_changes([(self.editor.comment_lines, "# ", (2, 0))]) + # No selection self._set_editor("a", (0, 0)) self._assert_changes([(self.editor.comment_lines, "a # ", (5, 0))]) + # Comment when comment exists self.editor.jump_to_start_of_line() self._assert_changes([(self.editor.comment_lines, "a # ", (4, 0))]) + # Selection containing blank lines text = " a\n\n b\n" self._set_editor(text, (0, 0)) self.editor.set_mark() @@ -180,11 +184,28 @@ class EditorTestCase(unittest.TestCase): self.editor.cursor_down() self._assert_changes([(self.editor.comment_lines, " # a\n\n # b\n", (0, 3))]) self.assertEqual(self.editor.mark, None) + # Undo comments in selection self.editor.set_mark() self.editor.cursor_up() self.editor.cursor_up() self.editor.cursor_up() self._assert_changes([(self.editor.comment_lines, text, (0, 0))]) + # Selection on one line, in middle + self._set_editor("abc", (1, 0)) + self.editor.set_mark() + self.editor.cursor_right() + self._assert_changes([(self.editor.comment_lines, "a# b\nc", (4, 0))]) + # Selection on one line, on right + self._set_editor("ab", (1, 0)) + self.editor.set_mark() + self.editor.cursor_right() + self._assert_changes([(self.editor.comment_lines, "a# b", (4, 0))]) + # Multi-line selection, starting middle, ending middle. Trailing unselected line + self._set_editor("abc\ndef\nghi\njkl", (2, 0)) + self.editor.set_mark() + self.editor.cursor_down() + self.editor.cursor_down() + self._assert_changes([(self.editor.comment_lines, "ab# c\n# def\n# gh\ni\njkl", (4, 2))]) if __name__ == "__main__":