@@ -312,6 +312,14 @@ def test_cursor_position_after_wrap_and_move_up(self):
312312 self .assertEqual (reader .pos , 10 )
313313 self .assertEqual (reader .cxy , (1 , 1 ))
314314
315+
316+ class TestPyReplAutoindent (TestCase ):
317+ def prepare_reader (self , events ):
318+ console = FakeConsole (events )
319+ config = ReadlineConfig (readline_completer = None )
320+ reader = ReadlineAlikeReader (console = console , config = config )
321+ return reader
322+
315323 def test_auto_indent_default (self ):
316324 # fmt: off
317325 input_code = (
@@ -372,7 +380,6 @@ def test_auto_indent_prev_block(self):
372380 ),
373381 )
374382
375-
376383 output_code = (
377384 "def g():\n "
378385 " pass\n "
@@ -385,6 +392,78 @@ def test_auto_indent_prev_block(self):
385392 output2 = multiline_input (reader )
386393 self .assertEqual (output2 , output_code )
387394
395+ def test_auto_indent_multiline (self ):
396+ # fmt: off
397+ events = itertools .chain (
398+ code_to_events (
399+ "def f():\n "
400+ "pass"
401+ ),
402+ [
403+ # go to the end of the first line
404+ Event (evt = "key" , data = "up" , raw = bytearray (b"\x1b OA" )),
405+ Event (evt = "key" , data = "\x05 " , raw = bytearray (b"\x1b O5" )),
406+ # new line should be autoindented
407+ Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " )),
408+ ],
409+ code_to_events (
410+ "pass"
411+ ),
412+ [
413+ # go to end of last line
414+ Event (evt = "key" , data = "down" , raw = bytearray (b"\x1b OB" )),
415+ Event (evt = "key" , data = "\x05 " , raw = bytearray (b"\x1b O5" )),
416+ # double newline to terminate the block
417+ Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " )),
418+ Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " )),
419+ ],
420+ )
421+
422+ output_code = (
423+ "def f():\n "
424+ " pass\n "
425+ " pass\n "
426+ " "
427+ )
428+ # fmt: on
429+
430+ reader = self .prepare_reader (events )
431+ output = multiline_input (reader )
432+ self .assertEqual (output , output_code )
433+
434+ def test_auto_indent_with_comment (self ):
435+ # fmt: off
436+ events = code_to_events (
437+ "def f(): # foo\n "
438+ "pass\n \n "
439+ )
440+
441+ output_code = (
442+ "def f(): # foo\n "
443+ " pass\n "
444+ " "
445+ )
446+ # fmt: on
447+
448+ reader = self .prepare_reader (events )
449+ output = multiline_input (reader )
450+ self .assertEqual (output , output_code )
451+
452+ def test_auto_indent_ignore_comments (self ):
453+ # fmt: off
454+ events = code_to_events (
455+ "pass #:\n "
456+ )
457+
458+ output_code = (
459+ "pass #:"
460+ )
461+ # fmt: on
462+
463+ reader = self .prepare_reader (events )
464+ output = multiline_input (reader )
465+ self .assertEqual (output , output_code )
466+
388467
389468class TestPyReplOutput (TestCase ):
390469 def prepare_reader (self , events ):
0 commit comments