##// END OF EJS Templates
Move width auto into less
Move width auto into less

File last commit:

r13375:247753ac
r15960:9e8d2cc2
Show More
test_magic_terminal.py
210 lines | 6.1 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).
"""
from __future__ import absolute_import
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import sys
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
import nose.tools as nt
from IPython.testing import tools as tt
Thomas Kluyver
Fix tests for core
r13375 from IPython.utils.py3compat import PY3
if PY3:
from io import StringIO
else:
from StringIO import StringIO
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 # Globals
#-----------------------------------------------------------------------------
ip = get_ipython()
#-----------------------------------------------------------------------------
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 # 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
Thomas Kluyver
Skip single failing unit test on Python 3.1
r5935 PY31 = sys.version_info[:2] == (3,1)
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436
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()",
Thomas Kluyver
Skip single failing unit test on Python 3.1
r5935 ]}
# I don't know why this is failing specifically on Python 3.1. I've
# checked it manually interactively, but we don't care enough about 3.1
# to spend time fiddling with the tests, so we just skip it.
if not PY31:
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 tests['fail'].append("++ runf()")
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):
ip.user_ns.pop('x', None)
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 self.paste('x = 1')
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 nt.assert_equal(ip.user_ns['x'], 1)
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 ip.user_ns.pop('x')
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662
def test_paste_pyprompt(self):
ip.user_ns.pop('x', None)
self.paste('>>> x=2')
nt.assert_equal(ip.user_ns['x'], 2)
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 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 ...
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 nt.assert_equal(ip.user_ns['x'], [1,2,3])
nt.assert_equal(ip.user_ns['y'], [1,4,9])
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()
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 nt.assert_equal(ip.user_ns.pop('x'), [1,2,3])
nt.assert_equal(ip.user_ns.pop('y'), [1,4,9])
Fernando Perez
Refactored paste tests into proper class with setup/teardown.
r7662 nt.assert_false('x' in ip.user_ns)
ip.magic('paste -r')
nt.assert_equal(ip.user_ns['x'], [1,2,3])
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 nt.assert_equal(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
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 >> xx = foo(1.1)""")
nt.assert_equal(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
Fernando Perez
Fix tests for cpaste to use email quotes consistently in pasted blocks.
r7716 > > yy = foo(2.1) """)
nt.assert_equal(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 >> ...
>> >>> zz = f(2.5) """)
nt.assert_equal(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
nt.assert_equal(ip.user_ns['a'], 100)
nt.assert_equal(ip.user_ns['b'], 200)
Fernando Perez
Move tests for magics that are terminal-specific to their own file.
r5436 nt.assert_equal(out, code+"\n## -- End pasted text --\n")
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
"""'''
ip.user_ns.pop('foo', None)
tm.store_or_execute(s, 'foo')
nt.assert_in('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)
Bradley M. Froehle
s/nt.assert_equals/nt.assert_equal/
r7875 nt.assert_equal(ip.user_ns['funcfoo'](), 'fooresult')