Show More
@@ -17,6 +17,7 b' from __future__ import with_statement' | |||
|
17 | 17 | |
|
18 | 18 | import os |
|
19 | 19 | import sys |
|
20 | import unittest | |
|
20 | 21 | |
|
21 | 22 | import nose.tools as nt |
|
22 | 23 | |
@@ -71,3 +72,19 b' def test_temp_pyfile():' | |||
|
71 | 72 | with open(fname) as fh2: |
|
72 | 73 | src2 = fh2.read() |
|
73 | 74 | yield nt.assert_equal(src2, src) |
|
75 | ||
|
76 | class TestAssertPrints(unittest.TestCase): | |
|
77 | def test_passing(self): | |
|
78 | with tt.AssertPrints("abc"): | |
|
79 | print "abcd" | |
|
80 | print "def" | |
|
81 | print b"ghi" | |
|
82 | ||
|
83 | def test_failing(self): | |
|
84 | def func(): | |
|
85 | with tt.AssertPrints("abc"): | |
|
86 | print "acd" | |
|
87 | print "def" | |
|
88 | print b"ghi" | |
|
89 | ||
|
90 | self.assertRaises(AssertionError, func) |
@@ -34,6 +34,7 b' import sys' | |||
|
34 | 34 | import tempfile |
|
35 | 35 | |
|
36 | 36 | from contextlib import contextmanager |
|
37 | from io import StringIO | |
|
37 | 38 | |
|
38 | 39 | try: |
|
39 | 40 | # These tools are used by parts of the runtime, so we make the nose |
@@ -46,9 +47,9 b' except ImportError:' | |||
|
46 | 47 | |
|
47 | 48 | from IPython.config.loader import Config |
|
48 | 49 | from IPython.utils.process import find_cmd, getoutputerror |
|
49 | from IPython.utils.text import list_strings | |
|
50 | from IPython.utils.io import temp_pyfile | |
|
51 |
from IPython.utils |
|
|
50 | from IPython.utils.text import list_strings, getdefaultencoding | |
|
51 | from IPython.utils.io import temp_pyfile, Tee | |
|
52 | from IPython.utils import py3compat | |
|
52 | 53 | |
|
53 | 54 | from . import decorators as dec |
|
54 | 55 | from . import skipdoctest |
@@ -210,7 +211,7 b' def ipexec(fname, options=None):' | |||
|
210 | 211 | _ip = get_ipython() |
|
211 | 212 | test_dir = os.path.dirname(__file__) |
|
212 | 213 | |
|
213 | ipython_cmd = find_cmd('ipython3' if PY3 else 'ipython') | |
|
214 | ipython_cmd = find_cmd('ipython3' if py3compat.PY3 else 'ipython') | |
|
214 | 215 | # Absolute path for filename |
|
215 | 216 | full_fname = os.path.join(test_dir, fname) |
|
216 | 217 | full_cmd = '%s %s %s' % (ipython_cmd, cmdargs, full_fname) |
@@ -324,6 +325,47 b' def check_pairs(func, pairs):' | |||
|
324 | 325 | out = func(inp) |
|
325 | 326 | assert out == expected, pair_fail_msg.format(name, inp, expected, out) |
|
326 | 327 | |
|
328 | if py3compat.PY3: | |
|
329 | MyStringIO = StringIO | |
|
330 | else: | |
|
331 | # In Python 2, stdout/stderr can have either bytes or unicode written to them, | |
|
332 | # so we need a class that can handle both. | |
|
333 | class MyStringIO(StringIO): | |
|
334 | def write(self, s): | |
|
335 | s = py3compat.cast_unicode(s, encoding=getdefaultencoding()) | |
|
336 | super(MyStringIO, self).write(s) | |
|
337 | ||
|
338 | notprinted_msg = """Did not find {0!r} in printed output (on {1}): | |
|
339 | {2!r}""" | |
|
340 | class AssertPrints(object): | |
|
341 | """Context manager for testing that code prints certain text. | |
|
342 | ||
|
343 | Examples | |
|
344 | -------- | |
|
345 | >>> with AssertPrints("abc"): | |
|
346 | ... print "abcd" | |
|
347 | ... print "def" | |
|
348 | ... | |
|
349 | abcd | |
|
350 | def | |
|
351 | """ | |
|
352 | def __init__(self, s, channel='stdout'): | |
|
353 | self.s = s | |
|
354 | self.channel = channel | |
|
355 | ||
|
356 | def __enter__(self): | |
|
357 | self.orig_stream = getattr(sys, self.channel) | |
|
358 | self.buffer = MyStringIO() | |
|
359 | self.tee = Tee(self.buffer, channel=self.channel) | |
|
360 | setattr(sys, self.channel, self.tee) | |
|
361 | ||
|
362 | def __exit__(self, etype, value, traceback): | |
|
363 | self.tee.flush() | |
|
364 | setattr(sys, self.channel, self.orig_stream) | |
|
365 | printed = self.buffer.getvalue() | |
|
366 | assert self.s in printed, notprinted_msg.format(self.s, self.channel, printed) | |
|
367 | return False | |
|
368 | ||
|
327 | 369 | @contextmanager |
|
328 | 370 | def mute_warn(): |
|
329 | 371 | from IPython.utils import warn |
@@ -29,7 +29,7 b' from nose import with_setup' | |||
|
29 | 29 | import IPython |
|
30 | 30 | from IPython.testing import decorators as dec |
|
31 | 31 | from IPython.testing.decorators import skip_if_not_win32, skip_win32 |
|
32 | from IPython.testing.tools import make_tempfile | |
|
32 | from IPython.testing.tools import make_tempfile, AssertPrints | |
|
33 | 33 | from IPython.utils import path, io |
|
34 | 34 | from IPython.utils import py3compat |
|
35 | 35 | |
@@ -404,13 +404,8 b' def test_not_writable_ipdir():' | |||
|
404 | 404 | ipdir = os.path.join(tmpdir, '.ipython') |
|
405 | 405 | os.mkdir(ipdir) |
|
406 | 406 | os.chmod(ipdir, 600) |
|
407 | stderr = io.stderr | |
|
408 | pipe = StringIO() | |
|
409 | io.stderr = pipe | |
|
410 | ipdir = path.get_ipython_dir() | |
|
411 | io.stderr.flush() | |
|
412 | io.stderr = stderr | |
|
413 | nt.assert_true('WARNING' in pipe.getvalue()) | |
|
407 | with AssertPrints('WARNING', channel='stderr'): | |
|
408 | ipdir = path.get_ipython_dir() | |
|
414 | 409 | env.pop('IPYTHON_DIR', None) |
|
415 | 410 | |
|
416 | 411 | def test_unquote_filename(): |
General Comments 0
You need to be logged in to leave comments.
Login now