test_kernel.py
83 lines
| 2.6 KiB
| text/x-python
|
PythonLexer
MinRK
|
r18104 | # Copyright (c) IPython Development Team. | ||
# Distributed under the terms of the Modified BSD License. | ||||
epatters
|
r8475 | |||
from __future__ import print_function | ||||
epatters
|
r8482 | import sys | ||
epatters
|
r8475 | import unittest | ||
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 | |||
Thomas Kluyver
|
r13366 | if py3compat.PY3: | ||
from io import StringIO | ||||
else: | ||||
from StringIO import StringIO | ||||
epatters
|
r8475 | |||
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() | ||||
Thomas Kluyver
|
r19223 | self.kc.wait_for_ready() | ||
MinRK
|
r10298 | |||
epatters
|
r8493 | @skipif_not_matplotlib | ||
epatters
|
r8475 | def test_pylab(self): | ||
MinRK
|
r18104 | """Does %pylab work in the in-process kernel?""" | ||
MinRK
|
r10298 | kc = self.kc | ||
kc.execute('%pylab') | ||||
msg = get_stream_message(kc) | ||||
MinRK
|
r18104 | self.assertIn('matplotlib', msg['content']['text']) | ||
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) | ||||
Thomas Kluyver
|
r19213 | kc.execute('print("bar")') | ||
MinRK
|
r10298 | msg = get_stream_message(kc) | ||
MinRK
|
r18104 | self.assertEqual(msg['content']['text'], 'bar\n') | ||
epatters
|
r8475 | |||
#----------------------------------------------------------------------------- | ||||
# 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() | ||||