summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_pyrepl/test_pyrepl.py
diff options
context:
space:
mode:
authorArnon Yaari <wiggin15@yahoo.com>2024-05-31 09:02:54 (GMT)
committerGitHub <noreply@github.com>2024-05-31 09:02:54 (GMT)
commitdae0375bd97f3821c5db1602a0653a3c5dc53c5b (patch)
treeb2725a7e2a82ffbd9bfb0a5c164db99a11b4faf8 /Lib/test/test_pyrepl/test_pyrepl.py
parent94e9585e99abc2d060cedc77b3c03e06b4a0a9c4 (diff)
downloadcpython-dae0375bd97f3821c5db1602a0653a3c5dc53c5b.zip
cpython-dae0375bd97f3821c5db1602a0653a3c5dc53c5b.tar.gz
cpython-dae0375bd97f3821c5db1602a0653a3c5dc53c5b.tar.bz2
gh-111201: Improve pyrepl auto indentation (#119606)
- auto-indent when editing multi-line block - ignore comments
Diffstat (limited to 'Lib/test/test_pyrepl/test_pyrepl.py')
-rw-r--r--Lib/test/test_pyrepl/test_pyrepl.py81
1 files changed, 80 insertions, 1 deletions
diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py
index aa27220..45114e7 100644
--- a/Lib/test/test_pyrepl/test_pyrepl.py
+++ b/Lib/test/test_pyrepl/test_pyrepl.py
@@ -312,6 +312,14 @@ class TestCursorPosition(TestCase):
self.assertEqual(reader.pos, 10)
self.assertEqual(reader.cxy, (1, 1))
+
+class TestPyReplAutoindent(TestCase):
+ def prepare_reader(self, events):
+ console = FakeConsole(events)
+ config = ReadlineConfig(readline_completer=None)
+ reader = ReadlineAlikeReader(console=console, config=config)
+ return reader
+
def test_auto_indent_default(self):
# fmt: off
input_code = (
@@ -372,7 +380,6 @@ class TestCursorPosition(TestCase):
),
)
-
output_code = (
"def g():\n"
" pass\n"
@@ -385,6 +392,78 @@ class TestCursorPosition(TestCase):
output2 = multiline_input(reader)
self.assertEqual(output2, output_code)
+ def test_auto_indent_multiline(self):
+ # fmt: off
+ events = itertools.chain(
+ code_to_events(
+ "def f():\n"
+ "pass"
+ ),
+ [
+ # go to the end of the first line
+ Event(evt="key", data="up", raw=bytearray(b"\x1bOA")),
+ Event(evt="key", data="\x05", raw=bytearray(b"\x1bO5")),
+ # new line should be autoindented
+ Event(evt="key", data="\n", raw=bytearray(b"\n")),
+ ],
+ code_to_events(
+ "pass"
+ ),
+ [
+ # go to end of last line
+ Event(evt="key", data="down", raw=bytearray(b"\x1bOB")),
+ Event(evt="key", data="\x05", raw=bytearray(b"\x1bO5")),
+ # double newline to terminate the block
+ Event(evt="key", data="\n", raw=bytearray(b"\n")),
+ Event(evt="key", data="\n", raw=bytearray(b"\n")),
+ ],
+ )
+
+ output_code = (
+ "def f():\n"
+ " pass\n"
+ " pass\n"
+ " "
+ )
+ # fmt: on
+
+ reader = self.prepare_reader(events)
+ output = multiline_input(reader)
+ self.assertEqual(output, output_code)
+
+ def test_auto_indent_with_comment(self):
+ # fmt: off
+ events = code_to_events(
+ "def f(): # foo\n"
+ "pass\n\n"
+ )
+
+ output_code = (
+ "def f(): # foo\n"
+ " pass\n"
+ " "
+ )
+ # fmt: on
+
+ reader = self.prepare_reader(events)
+ output = multiline_input(reader)
+ self.assertEqual(output, output_code)
+
+ def test_auto_indent_ignore_comments(self):
+ # fmt: off
+ events = code_to_events(
+ "pass #:\n"
+ )
+
+ output_code = (
+ "pass #:"
+ )
+ # fmt: on
+
+ reader = self.prepare_reader(events)
+ output = multiline_input(reader)
+ self.assertEqual(output, output_code)
+
class TestPyReplOutput(TestCase):
def prepare_reader(self, events):