test_embed.py
135 lines
| 4.7 KiB
| text/x-python
|
PythonLexer
Paul Ivanov
|
r14184 | """Test embedding of IPython""" | ||
#----------------------------------------------------------------------------- | ||||
# 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 | ||||
#----------------------------------------------------------------------------- | ||||
Thomas Kluyver
|
r14840 | import os | ||
Thomas Kluyver
|
r22132 | import subprocess | ||
Paul Ivanov
|
r14184 | import sys | ||
import nose.tools as nt | ||||
Paul Ivanov
|
r14707 | from IPython.utils.tempdir import NamedFileInTemporaryDirectory | ||
Jason Newton
|
r18764 | from IPython.testing.decorators import skip_win32 | ||
Paul Ivanov
|
r14184 | |||
#----------------------------------------------------------------------------- | ||||
# Tests | ||||
#----------------------------------------------------------------------------- | ||||
Jason Newton
|
r18764 | |||
Paul Ivanov
|
r14731 | _sample_embed = b""" | ||
Paul Ivanov
|
r14184 | from __future__ import print_function | ||
import IPython | ||||
a = 3 | ||||
b = 14 | ||||
print(a, '.', b) | ||||
IPython.embed() | ||||
Paul Ivanov
|
r14707 | print('bye!') | ||
Paul Ivanov
|
r14184 | """ | ||
Paul Ivanov
|
r14731 | _exit = b"exit\r" | ||
Paul Ivanov
|
r14712 | |||
Paul Ivanov
|
r14184 | def test_ipython_embed(): | ||
Paul Ivanov
|
r14707 | """test that `IPython.embed()` works""" | ||
with NamedFileInTemporaryDirectory('file_with_embed.py') as f: | ||||
Paul Ivanov
|
r14731 | f.write(_sample_embed) | ||
Paul Ivanov
|
r14707 | f.flush() | ||
Paul Ivanov
|
r14802 | f.close() # otherwise msft won't be able to read the file | ||
Paul Ivanov
|
r14707 | |||
# run `python file_with_embed.py` | ||||
cmd = [sys.executable, f.name] | ||||
Thomas Kluyver
|
r22132 | env = os.environ.copy() | ||
env['IPY_TEST_SIMPLE_PROMPT'] = '1' | ||||
p = subprocess.Popen(cmd, env=env, stdin=subprocess.PIPE, | ||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE) | ||||
out, err = p.communicate(_exit) | ||||
std = out.decode('UTF-8') | ||||
Paul Ivanov
|
r14707 | |||
nt.assert_equal(p.returncode, 0) | ||||
Paul Ivanov
|
r14712 | nt.assert_in('3 . 14', std) | ||
Thomas Kluyver
|
r14840 | if os.name != 'nt': | ||
# TODO: Fix up our different stdout references, see issue gh-14 | ||||
nt.assert_in('IPython', std) | ||||
Paul Ivanov
|
r14712 | nt.assert_in('bye!', std) | ||
Paul Ivanov
|
r14184 | |||
Jason Newton
|
r18764 | @skip_win32 | ||
def test_nest_embed(): | ||||
"""test that `IPython.embed()` is nestable""" | ||||
MinRK
|
r20815 | import pexpect | ||
Jason Newton
|
r18764 | ipy_prompt = r']:' #ansi color codes give problems matching beyond this | ||
Thomas Kluyver
|
r22132 | env = os.environ.copy() | ||
env['IPY_TEST_SIMPLE_PROMPT'] = '1' | ||||
Jason Newton
|
r18764 | |||
Thomas Kluyver
|
r22132 | child = pexpect.spawn(sys.executable, ['-m', 'IPython', '--colors=nocolor'], | ||
env=env) | ||||
Jason Newton
|
r18764 | child.expect(ipy_prompt) | ||
child.sendline("from __future__ import print_function") | ||||
child.expect(ipy_prompt) | ||||
child.sendline("import IPython") | ||||
child.expect(ipy_prompt) | ||||
child.sendline("ip0 = get_ipython()") | ||||
#enter first nested embed | ||||
child.sendline("IPython.embed()") | ||||
#skip the banner until we get to a prompt | ||||
try: | ||||
prompted = -1 | ||||
while prompted != 0: | ||||
prompted = child.expect([ipy_prompt, '\r\n']) | ||||
except pexpect.TIMEOUT as e: | ||||
print(e) | ||||
#child.interact() | ||||
child.sendline("embed1 = get_ipython()"); child.expect(ipy_prompt) | ||||
child.sendline("print('true' if embed1 is not ip0 else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
child.sendline("print('true' if IPython.get_ipython() is embed1 else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
#enter second nested embed | ||||
child.sendline("IPython.embed()") | ||||
#skip the banner until we get to a prompt | ||||
try: | ||||
prompted = -1 | ||||
while prompted != 0: | ||||
prompted = child.expect([ipy_prompt, '\r\n']) | ||||
except pexpect.TIMEOUT as e: | ||||
print(e) | ||||
#child.interact() | ||||
child.sendline("embed2 = get_ipython()"); child.expect(ipy_prompt) | ||||
child.sendline("print('true' if embed2 is not embed1 else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
child.sendline("print('true' if embed2 is IPython.get_ipython() else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
child.sendline('exit') | ||||
#back at first embed | ||||
child.expect(ipy_prompt) | ||||
child.sendline("print('true' if get_ipython() is embed1 else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
child.sendline("print('true' if IPython.get_ipython() is embed1 else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
child.sendline('exit') | ||||
#back at launching scope | ||||
child.expect(ipy_prompt) | ||||
child.sendline("print('true' if get_ipython() is ip0 else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
child.sendline("print('true' if IPython.get_ipython() is ip0 else 'false')") | ||||
assert(child.expect(['true\r\n', 'false\r\n']) == 0) | ||||
child.expect(ipy_prompt) | ||||
Matthias Bussonnier
|
r22081 | child.sendline('exit') | ||
child.close() | ||||