test_irunner.py
182 lines
| 3.8 KiB
| text/x-python
|
PythonLexer
fperez
|
r302 | """Test suite for the irunner module. | ||
Not the most elegant or fine-grained, but it does cover at least the bulk | ||||
functionality.""" | ||||
# Global to make tests extra verbose and help debugging | ||||
VERBOSE = True | ||||
# stdlib imports | ||||
MinRK
|
r4794 | import StringIO | ||
fperez
|
r635 | import sys | ||
fperez
|
r302 | import unittest | ||
# IPython imports | ||||
Fernando Perez
|
r2652 | from IPython.lib import irunner | ||
Thomas Kluyver
|
r5204 | from IPython.testing.decorators import known_failure_py3 | ||
Thomas Kluyver
|
r5431 | from IPython.utils.py3compat import doctest_refactor_print | ||
fperez
|
r302 | |||
# Testing code begins | ||||
class RunnerTestCase(unittest.TestCase): | ||||
fperez
|
r635 | def setUp(self): | ||
self.out = StringIO.StringIO() | ||||
#self.out = sys.stdout | ||||
fperez
|
r302 | def _test_runner(self,runner,source,output): | ||
"""Test that a given runner's input/output match.""" | ||||
runner.run_source(source) | ||||
fperez
|
r635 | out = self.out.getvalue() | ||
#out = '' | ||||
fperez
|
r302 | # this output contains nasty \r\n lineends, and the initial ipython | ||
Fernando Perez
|
r2652 | # banner. clean it up for comparison, removing lines of whitespace | ||
output_l = [l for l in output.splitlines() if l and not l.isspace()] | ||||
out_l = [l for l in out.splitlines() if l and not l.isspace()] | ||||
fperez
|
r302 | mismatch = 0 | ||
Fernando Perez
|
r2652 | if len(output_l) != len(out_l): | ||
Thomas Kluyver
|
r3718 | message = ("Mismatch in number of lines\n\n" | ||
"Expected:\n" | ||||
"~~~~~~~~~\n" | ||||
"%s\n\n" | ||||
"Got:\n" | ||||
"~~~~~~~~~\n" | ||||
"%s" | ||||
) % ("\n".join(output_l), "\n".join(out_l)) | ||||
self.fail(message) | ||||
fperez
|
r302 | for n in range(len(output_l)): | ||
fperez
|
r635 | # Do a line-by-line comparison | ||
fperez
|
r302 | ol1 = output_l[n].strip() | ||
ol2 = out_l[n].strip() | ||||
if ol1 != ol2: | ||||
mismatch += 1 | ||||
if VERBOSE: | ||||
print '<<< line %s does not match:' % n | ||||
print repr(ol1) | ||||
print repr(ol2) | ||||
print '>>>' | ||||
self.assert_(mismatch==0,'Number of mismatched lines: %s' % | ||||
mismatch) | ||||
Thomas Kluyver
|
r5431 | # The SyntaxError appears differently in Python 3, for some reason. | ||
Thomas Kluyver
|
r5204 | @known_failure_py3 | ||
fperez
|
r302 | def testIPython(self): | ||
"""Test the IPython runner.""" | ||||
Thomas Kluyver
|
r5431 | source = doctest_refactor_print(""" | ||
fperez
|
r302 | print 'hello, this is python' | ||
# some more code | ||||
x=1;y=2 | ||||
x+y**2 | ||||
# An example of autocall functionality | ||||
from math import * | ||||
autocall 1 | ||||
cos pi | ||||
autocall 0 | ||||
cos pi | ||||
cos(pi) | ||||
for i in range(5): | ||||
Thomas Kluyver
|
r5431 | print i | ||
fperez
|
r302 | |||
print "that's all folks!" | ||||
Thomas Kluyver
|
r3725 | exit | ||
Thomas Kluyver
|
r5431 | """) | ||
output = doctest_refactor_print("""\ | ||||
fperez
|
r302 | In [1]: print 'hello, this is python' | ||
hello, this is python | ||||
fperez
|
r635 | # some more code | ||
In [2]: x=1;y=2 | ||||
fperez
|
r302 | |||
fperez
|
r635 | In [3]: x+y**2 | ||
Out[3]: 5 | ||||
fperez
|
r302 | |||
fperez
|
r635 | # An example of autocall functionality | ||
In [4]: from math import * | ||||
fperez
|
r302 | |||
fperez
|
r635 | In [5]: autocall 1 | ||
fperez
|
r302 | Automatic calling is: Smart | ||
fperez
|
r635 | In [6]: cos pi | ||
fperez
|
r302 | ------> cos(pi) | ||
fperez
|
r635 | Out[6]: -1.0 | ||
fperez
|
r302 | |||
fperez
|
r635 | In [7]: autocall 0 | ||
fperez
|
r302 | Automatic calling is: OFF | ||
fperez
|
r635 | In [8]: cos pi | ||
Thomas Kluyver
|
r3850 | File "<ipython-input-8-6bd7313dd9a9>", line 1 | ||
fperez
|
r302 | cos pi | ||
^ | ||||
Thomas Kluyver
|
r3850 | SyntaxError: invalid syntax | ||
fperez
|
r635 | |||
fperez
|
r302 | |||
fperez
|
r635 | In [9]: cos(pi) | ||
Out[9]: -1.0 | ||||
fperez
|
r302 | |||
fperez
|
r635 | In [10]: for i in range(5): | ||
Thomas Kluyver
|
r5431 | ....: print i | ||
fperez
|
r635 | ....: | ||
Thomas Kluyver
|
r5431 | 0 | ||
1 | ||||
2 | ||||
3 | ||||
4 | ||||
fperez
|
r302 | |||
fperez
|
r635 | In [11]: print "that's all folks!" | ||
fperez
|
r302 | that's all folks! | ||
fperez
|
r635 | |||
Thomas Kluyver
|
r3725 | In [12]: exit | ||
Thomas Kluyver
|
r5431 | """) | ||
fperez
|
r635 | runner = irunner.IPythonRunner(out=self.out) | ||
fperez
|
r302 | self._test_runner(runner,source,output) | ||
def testPython(self): | ||||
"""Test the Python runner.""" | ||||
fperez
|
r635 | runner = irunner.PythonRunner(out=self.out) | ||
Thomas Kluyver
|
r5431 | source = doctest_refactor_print(""" | ||
fperez
|
r302 | print 'hello, this is python' | ||
# some more code | ||||
x=1;y=2 | ||||
x+y**2 | ||||
from math import * | ||||
cos(pi) | ||||
for i in range(5): | ||||
Thomas Kluyver
|
r5431 | print i | ||
fperez
|
r302 | |||
print "that's all folks!" | ||||
Thomas Kluyver
|
r5431 | """) | ||
output = doctest_refactor_print("""\ | ||||
fperez
|
r302 | >>> print 'hello, this is python' | ||
hello, this is python | ||||
fperez
|
r635 | |||
# some more code | ||||
>>> x=1;y=2 | ||||
fperez
|
r302 | >>> x+y**2 | ||
5 | ||||
fperez
|
r635 | |||
fperez
|
r302 | >>> from math import * | ||
>>> cos(pi) | ||||
-1.0 | ||||
fperez
|
r635 | |||
fperez
|
r302 | >>> for i in range(5): | ||
Thomas Kluyver
|
r5431 | ... print i | ||
fperez
|
r302 | ... | ||
Thomas Kluyver
|
r5431 | 0 | ||
1 | ||||
2 | ||||
3 | ||||
4 | ||||
fperez
|
r302 | >>> print "that's all folks!" | ||
fperez
|
r635 | that's all folks! | ||
Thomas Kluyver
|
r5431 | """) | ||
fperez
|
r302 | self._test_runner(runner,source,output) | ||