test_kernel.py
91 lines
| 3.1 KiB
| text/x-python
|
PythonLexer
epatters
|
r8475 | #------------------------------------------------------------------------------- | ||
# Copyright (C) 2012 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 | ||||
#----------------------------------------------------------------------------- | ||||
from __future__ import print_function | ||||
# Standard library imports | ||||
epatters
|
r8482 | from StringIO import StringIO | ||
import sys | ||||
epatters
|
r8475 | import unittest | ||
# Local imports | ||||
MinRK
|
r10298 | from IPython.kernel.inprocess.blocking import BlockingInProcessKernelClient | ||
from IPython.kernel.inprocess.manager import InProcessKernelManager | ||||
MinRK
|
r9375 | from IPython.kernel.inprocess.ipkernel import InProcessKernel | ||
epatters
|
r8493 | from IPython.testing.decorators import skipif_not_matplotlib | ||
epatters
|
r8475 | from IPython.utils.io import capture_output | ||
Pietro Berkes
|
r8941 | from IPython.utils import py3compat | ||
epatters
|
r8475 | |||
#----------------------------------------------------------------------------- | ||||
# Test case | ||||
#----------------------------------------------------------------------------- | ||||
class InProcessKernelTestCase(unittest.TestCase): | ||||
MinRK
|
r10298 | def setUp(self): | ||
self.km = InProcessKernelManager() | ||||
self.km.start_kernel() | ||||
self.kc = BlockingInProcessKernelClient(kernel=self.km.kernel) | ||||
self.kc.start_channels() | ||||
epatters
|
r8493 | @skipif_not_matplotlib | ||
epatters
|
r8475 | def test_pylab(self): | ||
""" Does pylab work in the in-process kernel? | ||||
""" | ||||
MinRK
|
r10298 | kc = self.kc | ||
kc.execute('%pylab') | ||||
msg = get_stream_message(kc) | ||||
MinRK
|
r11485 | self.assert_('matplotlib' in msg['content']['data']) | ||
epatters
|
r8475 | |||
epatters
|
r8482 | def test_raw_input(self): | ||
""" Does the in-process kernel handle raw_input correctly? | ||||
""" | ||||
io = StringIO('foobar\n') | ||||
sys_stdin = sys.stdin | ||||
sys.stdin = io | ||||
try: | ||||
Pietro Berkes
|
r8941 | if py3compat.PY3: | ||
MinRK
|
r10298 | self.kc.execute('x = input()') | ||
Pietro Berkes
|
r8941 | else: | ||
MinRK
|
r10298 | self.kc.execute('x = raw_input()') | ||
epatters
|
r8482 | finally: | ||
sys.stdin = sys_stdin | ||||
MinRK
|
r10298 | self.assertEqual(self.km.kernel.shell.user_ns.get('x'), 'foobar') | ||
epatters
|
r8482 | |||
epatters
|
r8475 | def test_stdout(self): | ||
""" Does the in-process kernel correctly capture IO? | ||||
""" | ||||
kernel = InProcessKernel() | ||||
with capture_output() as io: | ||||
kernel.shell.run_cell('print("foo")') | ||||
self.assertEqual(io.stdout, 'foo\n') | ||||
MinRK
|
r10298 | kc = BlockingInProcessKernelClient(kernel=kernel) | ||
kernel.frontends.append(kc) | ||||
kc.shell_channel.execute('print("bar")') | ||||
msg = get_stream_message(kc) | ||||
epatters
|
r8475 | self.assertEqual(msg['content']['data'], 'bar\n') | ||
#----------------------------------------------------------------------------- | ||||
# Utility functions | ||||
#----------------------------------------------------------------------------- | ||||
MinRK
|
r10298 | def get_stream_message(kernel_client, timeout=5): | ||
epatters
|
r8475 | """ Gets a single stream message synchronously from the sub channel. | ||
""" | ||||
while True: | ||||
MinRK
|
r10298 | msg = kernel_client.get_iopub_msg(timeout=timeout) | ||
epatters
|
r8475 | if msg['header']['msg_type'] == 'stream': | ||
return msg | ||||
if __name__ == '__main__': | ||||
unittest.main() | ||||