|
|
# encoding: utf-8
|
|
|
"""Tests for IPython.utils.capture"""
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Copyright (C) 2013 The IPython Development Team
|
|
|
#
|
|
|
# Distributed under the terms of the BSD License. The full license is in
|
|
|
# the file COPYING, distributed as part of this software.
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Imports
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
import sys
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
from IPython.testing.decorators import skip_iptest_but_not_pytest
|
|
|
|
|
|
from IPython.utils import capture
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Globals
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
_mime_map = dict(
|
|
|
_repr_png_="image/png",
|
|
|
_repr_jpeg_="image/jpeg",
|
|
|
_repr_svg_="image/svg+xml",
|
|
|
_repr_html_="text/html",
|
|
|
_repr_json_="application/json",
|
|
|
_repr_javascript_="application/javascript",
|
|
|
)
|
|
|
|
|
|
basic_data = {
|
|
|
'image/png' : b'binarydata',
|
|
|
'text/html' : "<b>bold</b>",
|
|
|
}
|
|
|
basic_metadata = {
|
|
|
'image/png' : {
|
|
|
'width' : 10,
|
|
|
'height' : 20,
|
|
|
},
|
|
|
}
|
|
|
|
|
|
full_data = {
|
|
|
'image/png' : b'binarydata',
|
|
|
'image/jpeg' : b'binarydata',
|
|
|
'image/svg+xml' : "<svg>",
|
|
|
'text/html' : "<b>bold</b>",
|
|
|
'application/javascript' : "alert();",
|
|
|
'application/json' : "{}",
|
|
|
}
|
|
|
full_metadata = {
|
|
|
'image/png' : {"png" : "exists"},
|
|
|
'image/jpeg' : {"jpeg" : "exists"},
|
|
|
'image/svg+xml' : {"svg" : "exists"},
|
|
|
'text/html' : {"html" : "exists"},
|
|
|
'application/javascript' : {"js" : "exists"},
|
|
|
'application/json' : {"json" : "exists"},
|
|
|
}
|
|
|
|
|
|
hello_stdout = "hello, stdout"
|
|
|
hello_stderr = "hello, stderr"
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Test Functions
|
|
|
#-----------------------------------------------------------------------------
|
|
|
@pytest.mark.parametrize("method_mime", _mime_map.items())
|
|
|
@skip_iptest_but_not_pytest
|
|
|
def test_rich_output_empty(method_mime):
|
|
|
"""RichOutput with no args"""
|
|
|
rich = capture.RichOutput()
|
|
|
method, mime = method_mime
|
|
|
assert getattr(rich, method)() is None
|
|
|
|
|
|
def test_rich_output():
|
|
|
"""test RichOutput basics"""
|
|
|
data = basic_data
|
|
|
metadata = basic_metadata
|
|
|
rich = capture.RichOutput(data=data, metadata=metadata)
|
|
|
assert rich._repr_html_() == data["text/html"]
|
|
|
assert rich._repr_png_() == (data["image/png"], metadata["image/png"])
|
|
|
assert rich._repr_latex_() is None
|
|
|
assert rich._repr_javascript_() is None
|
|
|
assert rich._repr_svg_() is None
|
|
|
|
|
|
|
|
|
@skip_iptest_but_not_pytest
|
|
|
@pytest.mark.parametrize("method_mime", _mime_map.items())
|
|
|
def test_rich_output_no_metadata(method_mime):
|
|
|
"""test RichOutput with no metadata"""
|
|
|
data = full_data
|
|
|
rich = capture.RichOutput(data=data)
|
|
|
method, mime = method_mime
|
|
|
assert getattr(rich, method)() == data[mime]
|
|
|
|
|
|
|
|
|
@skip_iptest_but_not_pytest
|
|
|
@pytest.mark.parametrize("method_mime", _mime_map.items())
|
|
|
def test_rich_output_metadata(method_mime):
|
|
|
"""test RichOutput with metadata"""
|
|
|
data = full_data
|
|
|
metadata = full_metadata
|
|
|
rich = capture.RichOutput(data=data, metadata=metadata)
|
|
|
method, mime = method_mime
|
|
|
assert getattr(rich, method)() == (data[mime], metadata[mime])
|
|
|
|
|
|
def test_rich_output_display():
|
|
|
"""test RichOutput.display
|
|
|
|
|
|
This is a bit circular, because we are actually using the capture code we are testing
|
|
|
to test itself.
|
|
|
"""
|
|
|
data = full_data
|
|
|
rich = capture.RichOutput(data=data)
|
|
|
with capture.capture_output() as cap:
|
|
|
rich.display()
|
|
|
assert len(cap.outputs) == 1
|
|
|
rich2 = cap.outputs[0]
|
|
|
assert rich2.data == rich.data
|
|
|
assert rich2.metadata == rich.metadata
|
|
|
|
|
|
def test_capture_output():
|
|
|
"""capture_output works"""
|
|
|
rich = capture.RichOutput(data=full_data)
|
|
|
with capture.capture_output() as cap:
|
|
|
print(hello_stdout, end="")
|
|
|
print(hello_stderr, end="", file=sys.stderr)
|
|
|
rich.display()
|
|
|
assert hello_stdout == cap.stdout
|
|
|
assert hello_stderr == cap.stderr
|
|
|
|
|
|
|
|
|
def test_capture_output_no_stdout():
|
|
|
"""test capture_output(stdout=False)"""
|
|
|
rich = capture.RichOutput(data=full_data)
|
|
|
with capture.capture_output(stdout=False) as cap:
|
|
|
print(hello_stdout, end="")
|
|
|
print(hello_stderr, end="", file=sys.stderr)
|
|
|
rich.display()
|
|
|
assert "" == cap.stdout
|
|
|
assert hello_stderr == cap.stderr
|
|
|
assert len(cap.outputs) == 1
|
|
|
|
|
|
|
|
|
def test_capture_output_no_stderr():
|
|
|
"""test capture_output(stderr=False)"""
|
|
|
rich = capture.RichOutput(data=full_data)
|
|
|
# add nested capture_output so stderr doesn't make it to nose output
|
|
|
with capture.capture_output(), capture.capture_output(stderr=False) as cap:
|
|
|
print(hello_stdout, end="")
|
|
|
print(hello_stderr, end="", file=sys.stderr)
|
|
|
rich.display()
|
|
|
assert hello_stdout == cap.stdout
|
|
|
assert "" == cap.stderr
|
|
|
assert len(cap.outputs) == 1
|
|
|
|
|
|
|
|
|
def test_capture_output_no_display():
|
|
|
"""test capture_output(display=False)"""
|
|
|
rich = capture.RichOutput(data=full_data)
|
|
|
with capture.capture_output(display=False) as cap:
|
|
|
print(hello_stdout, end="")
|
|
|
print(hello_stderr, end="", file=sys.stderr)
|
|
|
rich.display()
|
|
|
assert hello_stdout == cap.stdout
|
|
|
assert hello_stderr == cap.stderr
|
|
|
assert cap.outputs == []
|
|
|
|