##// END OF EJS Templates
Autoclose stdin/err for bg scripts, when not assigned to user_ns...
Autoclose stdin/err for bg scripts, when not assigned to user_ns Close manually in unit tests. Closes gh-11171

File last commit:

r24290:f0bb600d
r24375:f793944b
Show More
test_pylabtools.py
250 lines | 7.4 KiB | text/x-python | PythonLexer
/ IPython / core / tests / test_pylabtools.py
Fernando Perez
Add test file I forgot to commit.
r3734 """Tests for pylab tools module.
"""
Min RK
fix instantiation of shell in test_inline_twice...
r21765
# Copyright (c) IPython Development Team.
Fernando Perez
Add test file I forgot to commit.
r3734 # Distributed under the terms of the Modified BSD License.
MinRK
check that PIL can save JPEG to BytesIO...
r15684 from io import UnsupportedOperation, BytesIO
MinRK
test select_figure_formats
r15390 import matplotlib
matplotlib.use('Agg')
from matplotlib.figure import Figure
Fernando Perez
Add test file I forgot to commit.
r3734
MinRK
check that PIL can save JPEG to BytesIO...
r15684 from nose import SkipTest
Fernando Perez
Add test file I forgot to commit.
r3734 import nose.tools as nt
from matplotlib import pyplot as plt
Fernando Perez
Fix critical bug with pylab support inadvertently introduced in #648....
r5468 import numpy as np
Fernando Perez
Add test file I forgot to commit.
r3734
MinRK
test select_figure_formats
r15390 from IPython.core.getipython import get_ipython
MinRK
update pylabtools tests
r11329 from IPython.core.interactiveshell import InteractiveShell
MinRK
test select_figure_formats
r15390 from IPython.core.display import _PNG, _JPEG
Fernando Perez
Add test file I forgot to commit.
r3734 from .. import pylabtools as pt
Daniel B. Vasquez
use testing decorators to enable tests on module availability
r14777 from IPython.testing import decorators as dec
Fernando Perez
Add test file I forgot to commit.
r3734
def test_figure_to_svg():
# simple empty-figure test
fig = plt.figure()
Thomas Kluyver
Remove uses of @parametric decorator
r12374 nt.assert_equal(pt.print_figure(fig, 'svg'), None)
Fernando Perez
Add test file I forgot to commit.
r3734
plt.close('all')
# simple check for at least svg-looking output
Fernando Perez
Don't use new subplots() call in matplotlib so tests pass with mpl 0.99
r3745 fig = plt.figure()
ax = fig.add_subplot(1,1,1)
Fernando Perez
Add test file I forgot to commit.
r3734 ax.plot([1,2,3])
plt.draw()
MinRK
update pylabtools test to use new print_figure
r3984 svg = pt.print_figure(fig, 'svg')[:100].lower()
MinRK
print_figure returns unicode for svg
r16048 nt.assert_in(u'doctype svg', svg)
Fernando Perez
Fix critical bug with pylab support inadvertently introduced in #648....
r5468
MinRK
check that PIL can save JPEG to BytesIO...
r15684 def _check_pil_jpeg_bytes():
"""Skip if PIL can't write JPEGs to BytesIO objects"""
MinRK
add note about PIL's jpeg support
r15686 # PIL's JPEG plugin can't write to BytesIO objects
# Pillow fixes this
MinRK
check that PIL can save JPEG to BytesIO...
r15684 from PIL import Image
buf = BytesIO()
img = Image.new("RGB", (4,4))
try:
img.save(buf, 'jpeg')
except Exception as e:
ename = e.__class__.__name__
raise SkipTest("PIL can't write JPEG to BytesIO: %s: %s" % (ename, e))
Daniel B. Vasquez
use testing decorators to enable tests on module availability
r14777 @dec.skip_without("PIL.Image")
MinRK
check that PIL can save JPEG to BytesIO...
r15684 def test_figure_to_jpeg():
_check_pil_jpeg_bytes()
# simple check for at least jpeg-looking output
Daniel B. Vasquez
use testing decorators to enable tests on module availability
r14777 fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot([1,2,3])
plt.draw()
MinRK
check that PIL can save JPEG to BytesIO...
r15684 jpeg = pt.print_figure(fig, 'jpeg', quality=50)[:100].lower()
assert jpeg.startswith(_JPEG)
Daniel B. Vasquez
add unittest for jpg, only activated if PIL/Pillow is installed
r14775
MinRK
test select_figure_formats
r15390 def test_retina_figure():
Christopher Roach
Added a fix for issue #8871
r21813 # simple empty-figure test
fig = plt.figure()
nt.assert_equal(pt.retina_figure(fig), None)
plt.close('all')
MinRK
test select_figure_formats
r15390 fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot([1,2,3])
plt.draw()
png, md = pt.retina_figure(fig)
assert png.startswith(_PNG)
nt.assert_in('width', md)
nt.assert_in('height', md)
_fmt_mime_map = {
'png': 'image/png',
'jpeg': 'image/jpeg',
'pdf': 'application/pdf',
'retina': 'image/png',
'svg': 'image/svg+xml',
}
def test_select_figure_formats_str():
ip = get_ipython()
for fmt, active_mime in _fmt_mime_map.items():
pt.select_figure_formats(ip, fmt)
for mime, f in ip.display_formatter.formatters.items():
if mime == active_mime:
nt.assert_in(Figure, f)
else:
nt.assert_not_in(Figure, f)
def test_select_figure_formats_kwargs():
ip = get_ipython()
kwargs = dict(quality=10, bbox_inches='tight')
pt.select_figure_formats(ip, 'png', **kwargs)
formatter = ip.display_formatter.formatters['image/png']
f = formatter.lookup_by_type(Figure)
cell = f.__closure__[0].cell_contents
nt.assert_equal(cell, kwargs)
Thomas A Caswell
FIX: Remove the non-interactive backends from pylabtools.backend2gui...
r24290
MinRK
test select_figure_formats
r15390 # check that the formatter doesn't raise
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot([1,2,3])
plt.draw()
formatter.enabled = True
png = formatter(fig)
assert png.startswith(_PNG)
Fernando Perez
Fix critical bug with pylab support inadvertently introduced in #648....
r5468
MinRK
test select_figure_formats
r15390 def test_select_figure_formats_set():
Fernando Perez
Fix critical bug with pylab support inadvertently introduced in #648....
r5468 ip = get_ipython()
MinRK
test select_figure_formats
r15390 for fmts in [
{'png', 'svg'},
['png'],
('jpeg', 'pdf', 'retina'),
{'svg'},
]:
active_mimes = {_fmt_mime_map[fmt] for fmt in fmts}
pt.select_figure_formats(ip, fmts)
for mime, f in ip.display_formatter.formatters.items():
if mime in active_mimes:
nt.assert_in(Figure, f)
else:
nt.assert_not_in(Figure, f)
def test_select_figure_formats_bad():
ip = get_ipython()
with nt.assert_raises(ValueError):
pt.select_figure_formats(ip, 'foo')
with nt.assert_raises(ValueError):
pt.select_figure_formats(ip, {'png', 'foo'})
with nt.assert_raises(ValueError):
pt.select_figure_formats(ip, ['retina', 'pdf', 'bar', 'bad'])
def test_import_pylab():
Fernando Perez
Refactor gui/pylab integration to eliminate code duplication....
r5469 ns = {}
pt.import_pylab(ns, import_all=False)
nt.assert_true('plt' in ns)
nt.assert_equal(ns['np'], np)
Ryan May
Add tests of switching logic.
r7966
class TestPylabSwitch(object):
MinRK
update pylabtools tests
r11329 class Shell(InteractiveShell):
def enable_gui(self, gui):
pass
Thomas A Caswell
FIX: Remove the non-interactive backends from pylabtools.backend2gui...
r24290
Ryan May
Add tests of switching logic.
r7966 def setup(self):
Ryan May
Improve test mocking to actually capture failure mode.
r8003 import matplotlib
def act_mpl(backend):
matplotlib.rcParams['backend'] = backend
# Save rcParams since they get modified
self._saved_rcParams = matplotlib.rcParams
Thomas Kluyver
test_pylabtools also needs to modify matplotlib.rcParamsOrig...
r12924 self._saved_rcParamsOrig = matplotlib.rcParamsOrig
Ryan May
Improve test mocking to actually capture failure mode.
r8003 matplotlib.rcParams = dict(backend='Qt4Agg')
Thomas Kluyver
test_pylabtools also needs to modify matplotlib.rcParamsOrig...
r12924 matplotlib.rcParamsOrig = dict(backend='Qt4Agg')
Ryan May
Improve test mocking to actually capture failure mode.
r8003
# Mock out functions
Ryan May
Add tests of switching logic.
r7966 self._save_am = pt.activate_matplotlib
Ryan May
Improve test mocking to actually capture failure mode.
r8003 pt.activate_matplotlib = act_mpl
Ryan May
Add tests of switching logic.
r7966 self._save_ip = pt.import_pylab
pt.import_pylab = lambda *a,**kw:None
self._save_cis = pt.configure_inline_support
pt.configure_inline_support = lambda *a,**kw:None
def teardown(self):
pt.activate_matplotlib = self._save_am
pt.import_pylab = self._save_ip
pt.configure_inline_support = self._save_cis
Ryan May
Improve test mocking to actually capture failure mode.
r8003 import matplotlib
matplotlib.rcParams = self._saved_rcParams
Thomas Kluyver
test_pylabtools also needs to modify matplotlib.rcParamsOrig...
r12924 matplotlib.rcParamsOrig = self._saved_rcParamsOrig
Ryan May
Add tests of switching logic.
r7966
def test_qt(self):
s = self.Shell()
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib(None)
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'qt')
nt.assert_equal(s.pylab_gui_select, 'qt')
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('inline')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'inline')
nt.assert_equal(s.pylab_gui_select, 'qt')
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('qt')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'qt')
nt.assert_equal(s.pylab_gui_select, 'qt')
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('inline')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'inline')
nt.assert_equal(s.pylab_gui_select, 'qt')
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib()
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'qt')
nt.assert_equal(s.pylab_gui_select, 'qt')
def test_inline(self):
s = self.Shell()
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('inline')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'inline')
nt.assert_equal(s.pylab_gui_select, None)
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('inline')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'inline')
nt.assert_equal(s.pylab_gui_select, None)
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('qt')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'qt')
nt.assert_equal(s.pylab_gui_select, 'qt')
Jan Schulz
Prevent reset of matplotlib formatters when enabled again...
r21756 def test_inline_twice(self):
"Using '%matplotlib inline' twice should not reset formatters"
Min RK
fix instantiation of shell in test_inline_twice...
r21765 ip = self.Shell()
Jan Schulz
Prevent reset of matplotlib formatters when enabled again...
r21756 gui, backend = ip.enable_matplotlib('inline')
nt.assert_equal(gui, 'inline')
fmts = {'png'}
active_mimes = {_fmt_mime_map[fmt] for fmt in fmts}
pt.select_figure_formats(ip, fmts)
gui, backend = ip.enable_matplotlib('inline')
nt.assert_equal(gui, 'inline')
for mime, f in ip.display_formatter.formatters.items():
if mime in active_mimes:
nt.assert_in(Figure, f)
else:
nt.assert_not_in(Figure, f)
Ryan May
Add tests of switching logic.
r7966 def test_qt_gtk(self):
s = self.Shell()
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('qt')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'qt')
nt.assert_equal(s.pylab_gui_select, 'qt')
MinRK
update pylabtools tests
r11329 gui, backend = s.enable_matplotlib('gtk')
Ryan May
Add tests of switching logic.
r7966 nt.assert_equal(gui, 'qt')
nt.assert_equal(s.pylab_gui_select, 'qt')
Thomas A Caswell
FIX: Remove the non-interactive backends from pylabtools.backend2gui...
r24290
def test_no_gui_backends():
for k in ['agg', 'svg', 'pdf', 'ps']:
assert k not in pt.backend2gui