tests/cmdline: Add a test for REPL paste mode.
Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
This commit is contained in:
parent
5e965618be
commit
8eb5636996
3 changed files with 224 additions and 0 deletions
|
|
@ -33,6 +33,7 @@ exclude = [ # Ruff finds Python SyntaxError in these files
|
|||
"tests/cmdline/repl_basic.py",
|
||||
"tests/cmdline/repl_cont.py",
|
||||
"tests/cmdline/repl_emacs_keys.py",
|
||||
"tests/cmdline/repl_paste.py",
|
||||
"tests/cmdline/repl_words_move.py",
|
||||
"tests/feature_check/repl_emacs_check.py",
|
||||
"tests/feature_check/repl_words_move_check.py",
|
||||
|
|
|
|||
90
tests/cmdline/repl_paste.py
Normal file
90
tests/cmdline/repl_paste.py
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# Test REPL paste mode functionality
|
||||
|
||||
# Basic paste mode with a simple function
|
||||
{\x05}
|
||||
def hello():
|
||||
print('Hello from paste mode!')
|
||||
hello()
|
||||
{\x04}
|
||||
|
||||
# Paste mode with multiple indentation levels
|
||||
{\x05}
|
||||
def calculate(n):
|
||||
if n > 0:
|
||||
for i in range(n):
|
||||
if i % 2 == 0:
|
||||
print(f'Even: {i}')
|
||||
else:
|
||||
print(f'Odd: {i}')
|
||||
else:
|
||||
print('n must be positive')
|
||||
|
||||
calculate(5)
|
||||
{\x04}
|
||||
|
||||
# Paste mode with blank lines
|
||||
{\x05}
|
||||
def function_with_blanks():
|
||||
print('First line')
|
||||
|
||||
print('After blank line')
|
||||
|
||||
|
||||
print('After two blank lines')
|
||||
|
||||
function_with_blanks()
|
||||
{\x04}
|
||||
|
||||
# Paste mode with class definition and multiple methods
|
||||
{\x05}
|
||||
class TestClass:
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
|
||||
def display(self):
|
||||
print(f'Value is: {self.value}')
|
||||
|
||||
def double(self):
|
||||
self.value *= 2
|
||||
return self.value
|
||||
|
||||
obj = TestClass(21)
|
||||
obj.display()
|
||||
print(f'Doubled: {obj.double()}')
|
||||
obj.display()
|
||||
{\x04}
|
||||
|
||||
# Paste mode with exception handling
|
||||
{\x05}
|
||||
try:
|
||||
x = 1 / 0
|
||||
except ZeroDivisionError:
|
||||
print('Caught division by zero')
|
||||
finally:
|
||||
print('Finally block executed')
|
||||
{\x04}
|
||||
|
||||
# Cancel paste mode with Ctrl-C
|
||||
{\x05}
|
||||
print('This should not execute')
|
||||
{\x03}
|
||||
|
||||
# Normal REPL still works after cancelled paste
|
||||
print('Back to normal REPL')
|
||||
|
||||
# Paste mode with syntax error
|
||||
{\x05}
|
||||
def bad_syntax(:
|
||||
print('Missing parameter')
|
||||
{\x04}
|
||||
|
||||
# Paste mode with runtime error
|
||||
{\x05}
|
||||
def will_error():
|
||||
undefined_variable
|
||||
|
||||
will_error()
|
||||
{\x04}
|
||||
|
||||
# Final test to show REPL is still functioning
|
||||
1 + 2 + 3
|
||||
133
tests/cmdline/repl_paste.py.exp
Normal file
133
tests/cmdline/repl_paste.py.exp
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
MicroPython \.\+ version
|
||||
Use Ctrl-D to exit, Ctrl-E for paste mode
|
||||
>>> # Test REPL paste mode functionality
|
||||
>>>
|
||||
>>> # Basic paste mode with a simple function
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== def hello():
|
||||
=== print('Hello from paste mode!')
|
||||
=== hello()
|
||||
===
|
||||
Hello from paste mode!
|
||||
>>>
|
||||
>>> # Paste mode with multiple indentation levels
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== def calculate(n):
|
||||
=== if n > 0:
|
||||
=== for i in range(n):
|
||||
=== if i % 2 == 0:
|
||||
=== print(f'Even: {i}')
|
||||
=== else:
|
||||
=== print(f'Odd: {i}')
|
||||
=== else:
|
||||
=== print('n must be positive')
|
||||
===
|
||||
=== calculate(5)
|
||||
===
|
||||
Even: 0
|
||||
Odd: 1
|
||||
Even: 2
|
||||
Odd: 3
|
||||
Even: 4
|
||||
>>>
|
||||
>>> # Paste mode with blank lines
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== def function_with_blanks():
|
||||
=== print('First line')
|
||||
===
|
||||
=== print('After blank line')
|
||||
===
|
||||
===
|
||||
=== print('After two blank lines')
|
||||
===
|
||||
=== function_with_blanks()
|
||||
===
|
||||
First line
|
||||
After blank line
|
||||
After two blank lines
|
||||
>>>
|
||||
>>> # Paste mode with class definition and multiple methods
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== class TestClass:
|
||||
=== def __init__(self, value):
|
||||
=== self.value = value
|
||||
===
|
||||
=== def display(self):
|
||||
=== print(f'Value is: {self.value}')
|
||||
===
|
||||
=== def double(self):
|
||||
=== self.value *= 2
|
||||
=== return self.value
|
||||
===
|
||||
=== obj = TestClass(21)
|
||||
=== obj.display()
|
||||
=== print(f'Doubled: {obj.double()}')
|
||||
=== obj.display()
|
||||
===
|
||||
Value is: 21
|
||||
Doubled: 42
|
||||
Value is: 42
|
||||
>>>
|
||||
>>> # Paste mode with exception handling
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== try:
|
||||
=== x = 1 / 0
|
||||
=== except ZeroDivisionError:
|
||||
=== print('Caught division by zero')
|
||||
=== finally:
|
||||
=== print('Finally block executed')
|
||||
===
|
||||
Caught division by zero
|
||||
Finally block executed
|
||||
>>>
|
||||
>>> # Cancel paste mode with Ctrl-C
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== print('This should not execute')
|
||||
===
|
||||
>>>
|
||||
>>>
|
||||
>>> # Normal REPL still works after cancelled paste
|
||||
>>> print('Back to normal REPL')
|
||||
Back to normal REPL
|
||||
>>>
|
||||
>>> # Paste mode with syntax error
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== def bad_syntax(:
|
||||
=== print('Missing parameter')
|
||||
===
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 2
|
||||
SyntaxError: invalid syntax
|
||||
>>>
|
||||
>>> # Paste mode with runtime error
|
||||
>>>
|
||||
paste mode; Ctrl-C to cancel, Ctrl-D to finish
|
||||
===
|
||||
=== def will_error():
|
||||
=== undefined_variable
|
||||
===
|
||||
=== will_error()
|
||||
===
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 5, in <module>
|
||||
File "<stdin>", line 3, in will_error
|
||||
NameError: name 'undefined_variable' isn't defined
|
||||
>>>
|
||||
>>> # Final test to show REPL is still functioning
|
||||
>>> 1 + 2 + 3
|
||||
6
|
||||
>>>
|
||||
Loading…
Reference in a new issue