##// END OF EJS Templates
IPython.testing.tools without Nose
IPython.testing.tools without Nose

File last commit:

r26903:b5182174
r27041:47037d10
Show More
test_magic_terminal.py
193 lines | 5.5 KiB | text/x-python | PythonLexer
/ IPython / core / tests / test_magic_terminal.py
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 """Tests for various magic functions specific to the terminal frontend.
Needs to be run by nose (to make ipython session available).
"""
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import sys
Srinivas Reddy Thatiparthy
cleanup
r23081 from io import StringIO
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 from unittest import TestCase
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
from IPython.testing import tools as tt
#-----------------------------------------------------------------------------
# Test functions begin
#-----------------------------------------------------------------------------
def check_cpaste(code, should_fail=False):
"""Execute code via 'cpaste' and ensure it was executed, unless
should_fail is set.
"""
Fernando Perez
Use `ip` consistently in tests to refer to IPython object as per review.
r7735 ip.user_ns['code_ran'] = False
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
src = StringIO()
if not hasattr(src, 'encoding'):
# IPython expects stdin to have an encoding attribute
src.encoding = None
src.write(code)
src.write('\n--\n')
src.seek(0)
stdin_save = sys.stdin
sys.stdin = src
try:
context = tt.AssertPrints if should_fail else tt.AssertNotPrints
with context("Traceback (most recent call last)"):
Fernando Perez
Use `ip` consistently in tests to refer to IPython object as per review.
r7735 ip.magic('cpaste')
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
if not should_fail:
Thomas Kluyver
Refactor paste magics and ipdoctest
r10754 assert ip.user_ns['code_ran'], "%r failed" % code
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 finally:
sys.stdin = stdin_save
def test_cpaste():
"""Test cpaste magic"""
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 def runf():
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 """Marker function: sets a flag when executed.
"""
Fernando Perez
Use `ip` consistently in tests to refer to IPython object as per review.
r7735 ip.user_ns['code_ran'] = True
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 return 'runf' # return string so '+ runf()' doesn't result in success
tests = {'pass': ["runf()",
"In [1]: runf()",
"In [1]: if 1:\n ...: runf()",
"> > > runf()",
">>> runf()",
" >>> runf()",
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 ],
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 'fail': ["1 + runf()",
Paul Ivanov
remove sys_version for Python 3...
r22959 "++ runf()",
Thomas Kluyver
Skip single failing unit test on Python 3.1
r5935 ]}
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Use `ip` consistently in tests to refer to IPython object as per review.
r7735 ip.user_ns['runf'] = runf
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
for code in tests['pass']:
check_cpaste(code)
for code in tests['fail']:
check_cpaste(code, should_fail=True)
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 class PasteTestCase(TestCase):
"""Multiple tests for clipboard pasting"""
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 def paste(self, txt, flags='-q'):
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 """Paste input text, by default in quiet mode"""
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 ip.hooks.clipboard_get = lambda : txt
ip.magic('paste '+flags)
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 def setUp(self):
# Inject fake clipboard hook but save original so we can restore it later
self.original_clip = ip.hooks.clipboard_get
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 def tearDown(self):
# Restore original hook
ip.hooks.clipboard_get = self.original_clip
def test_paste(self):
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 ip.user_ns.pop("x", None)
self.paste("x = 1")
self.assertEqual(ip.user_ns["x"], 1)
ip.user_ns.pop("x")
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662
def test_paste_pyprompt(self):
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 ip.user_ns.pop("x", None)
self.paste(">>> x=2")
self.assertEqual(ip.user_ns["x"], 2)
ip.user_ns.pop("x")
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662
def test_paste_py_multi(self):
self.paste("""
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 >>> x = [1,2,3]
>>> y = []
>>> for i in x:
... y.append(i**2)
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 ...
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 """
)
self.assertEqual(ip.user_ns["x"], [1, 2, 3])
self.assertEqual(ip.user_ns["y"], [1, 4, 9])
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662
def test_paste_py_multi_r(self):
"Now, test that self.paste -r works"
Thomas Kluyver
Refactor paste magics and ipdoctest
r10754 self.test_paste_py_multi()
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 self.assertEqual(ip.user_ns.pop("x"), [1, 2, 3])
self.assertEqual(ip.user_ns.pop("y"), [1, 4, 9])
self.assertFalse("x" in ip.user_ns)
ip.magic("paste -r")
self.assertEqual(ip.user_ns["x"], [1, 2, 3])
self.assertEqual(ip.user_ns["y"], [1, 4, 9])
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662
def test_paste_email(self):
"Test pasting of email-quoted contents"
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 self.paste("""\
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 >> def foo(x):
>> return x + 1
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 >> xx = foo(1.1)"""
)
self.assertEqual(ip.user_ns["xx"], 2.1)
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 def test_paste_email2(self):
"Email again; some programs add a space also at each quoting level"
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 self.paste("""\
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 > > def foo(x):
> > return x + 1
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 > > yy = foo(2.1) """
)
self.assertEqual(ip.user_ns["yy"], 3.1)
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 def test_paste_email_py(self):
"Email quoting of interactive input"
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 self.paste("""\
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 >> >>> def f(x):
>> ... return x+1
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 >> ...
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 >> >>> zz = f(2.5) """
)
self.assertEqual(ip.user_ns["zz"], 3.5)
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 def test_paste_echo(self):
"Also test self.paste echoing, by temporarily faking the writer"
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 w = StringIO()
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 writer = ip.write
ip.write = w.write
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 code = """
a = 100
b = 200"""
try:
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 self.paste(code,'')
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 out = w.getvalue()
finally:
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 ip.write = writer
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 self.assertEqual(ip.user_ns["a"], 100)
self.assertEqual(ip.user_ns["b"], 200)
assert out == code + "\n## -- End pasted text --\n"
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
Fernando Perez
Add failing test when pasting multiline strings with leading commas....
r7663 def test_paste_leading_commas(self):
"Test multiline strings with leading commas"
tm = ip.magics_manager.registry['TerminalMagics']
Fernando Perez
Add second failing test, for source with trailing question marks.
r7703 s = '''\
Fernando Perez
Add failing test when pasting multiline strings with leading commas....
r7663 a = """
,1,2,3
"""'''
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 ip.user_ns.pop("foo", None)
tm.store_or_execute(s, "foo")
self.assertIn("foo", ip.user_ns)
Fernando Perez
Add second failing test, for source with trailing question marks.
r7703
def test_paste_trailing_question(self):
"Test pasting sources with trailing question marks"
tm = ip.magics_manager.registry['TerminalMagics']
s = '''\
def funcfoo():
if True: #am i true?
return 'fooresult'
'''
ip.user_ns.pop('funcfoo', None)
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 self.paste(s)
Samuel Gaist
[core][tests][magic_terminal] Remove nose
r26903 self.assertEqual(ip.user_ns["funcfoo"](), "fooresult")