summaryrefslogtreecommitdiff
path: root/python/helpers/pydev/tests/test_pydev_ipython_011.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/helpers/pydev/tests/test_pydev_ipython_011.py')
-rw-r--r--python/helpers/pydev/tests/test_pydev_ipython_011.py217
1 files changed, 132 insertions, 85 deletions
diff --git a/python/helpers/pydev/tests/test_pydev_ipython_011.py b/python/helpers/pydev/tests/test_pydev_ipython_011.py
index 3cfa70fd0112..dc4684f35f3d 100644
--- a/python/helpers/pydev/tests/test_pydev_ipython_011.py
+++ b/python/helpers/pydev/tests/test_pydev_ipython_011.py
@@ -7,81 +7,87 @@ from pydev_imports import StringIO, SimpleXMLRPCServer
from pydev_localhost import get_localhost
from pydev_console_utils import StdIn
import socket
+from pydev_ipython_console_011 import get_pydev_frontend
+import time
-# make it as if we were executing from the directory above this one
-sys.argv[0] = os.path.dirname(sys.argv[0])
-# twice the dirname to get the previous level from this file.
-sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0])))
+try:
+ xrange
+except:
+ xrange = range
-# PyDevFrontEnd depends on singleton in IPython, so you
-# can't make multiple versions. So we reuse front_end for
-# all the tests
-
-orig_stdout = sys.stdout
-orig_stderr = sys.stderr
-
-stdout = sys.stdout = StringIO()
-stderr = sys.stderr = StringIO()
-
-from pydev_ipython_console_011 import PyDevFrontEnd
-s = socket.socket()
-s.bind(('', 0))
-client_port = s.getsockname()[1]
-s.close()
-front_end = PyDevFrontEnd(get_localhost(), client_port)
-
-
-def addExec(code, expected_more=False):
- more = front_end.addExec(code)
- eq_(expected_more, more)
class TestBase(unittest.TestCase):
+
+
def setUp(self):
- front_end.input_splitter.reset()
- stdout.truncate(0)
- stdout.seek(0)
- stderr.truncate(0)
- stderr.seek(0)
+ # PyDevFrontEnd depends on singleton in IPython, so you
+ # can't make multiple versions. So we reuse self.front_end for
+ # all the tests
+ self.front_end = get_pydev_frontend(get_localhost(), 0)
+
+ from pydev_ipython.inputhook import set_return_control_callback
+ set_return_control_callback(lambda:True)
+ self.front_end.clearBuffer()
+
def tearDown(self):
pass
+
+ def addExec(self, code, expected_more=False):
+ more = self.front_end.addExec(code)
+ eq_(expected_more, more)
+
+ def redirectStdout(self):
+ from IPython.utils import io
+
+ self.original_stdout = sys.stdout
+ sys.stdout = io.stdout = StringIO()
+
+ def restoreStdout(self):
+ from IPython.utils import io
+ io.stdout = sys.stdout = self.original_stdout
class TestPyDevFrontEnd(TestBase):
+
def testAddExec_1(self):
- addExec('if True:', True)
+ self.addExec('if True:', True)
+
def testAddExec_2(self):
- addExec('if True:\n testAddExec_a = 10\n', True)
+ #Change: 'more' must now be controlled in the client side after the initial 'True' returned.
+ self.addExec('if True:\n testAddExec_a = 10\n', False)
+ assert 'testAddExec_a' in self.front_end.getNamespace()
+
def testAddExec_3(self):
- assert 'testAddExec_a' not in front_end.getNamespace()
- addExec('if True:\n testAddExec_a = 10\n\n')
- assert 'testAddExec_a' in front_end.getNamespace()
- eq_(front_end.getNamespace()['testAddExec_a'], 10)
+ assert 'testAddExec_x' not in self.front_end.getNamespace()
+ self.addExec('if True:\n testAddExec_x = 10\n\n')
+ assert 'testAddExec_x' in self.front_end.getNamespace()
+ eq_(self.front_end.getNamespace()['testAddExec_x'], 10)
def testGetNamespace(self):
- assert 'testGetNamespace_a' not in front_end.getNamespace()
- addExec('testGetNamespace_a = 10')
- assert 'testGetNamespace_a' in front_end.getNamespace()
- eq_(front_end.getNamespace()['testGetNamespace_a'], 10)
+ assert 'testGetNamespace_a' not in self.front_end.getNamespace()
+ self.addExec('testGetNamespace_a = 10')
+ assert 'testGetNamespace_a' in self.front_end.getNamespace()
+ eq_(self.front_end.getNamespace()['testGetNamespace_a'], 10)
def testComplete(self):
- unused_text, matches = front_end.complete('%')
+ unused_text, matches = self.front_end.complete('%')
assert len(matches) > 1, 'at least one magic should appear in completions'
def testCompleteDoesNotDoPythonMatches(self):
# Test that IPython's completions do not do the things that
# PyDev's completions will handle
- addExec('testComplete_a = 5')
- addExec('testComplete_b = 10')
- addExec('testComplete_c = 15')
- unused_text, matches = front_end.complete('testComplete_')
+ self.addExec('testComplete_a = 5')
+ self.addExec('testComplete_b = 10')
+ self.addExec('testComplete_c = 15')
+ unused_text, matches = self.front_end.complete('testComplete_')
assert len(matches) == 0
def testGetCompletions_1(self):
# Test the merged completions include the standard completions
- addExec('testComplete_a = 5')
- addExec('testComplete_b = 10')
- addExec('testComplete_c = 15')
- res = front_end.getCompletions('testComplete_', 'testComplete_')
+ self.addExec('testComplete_a = 5')
+ self.addExec('testComplete_b = 10')
+ self.addExec('testComplete_c = 15')
+ res = self.front_end.getCompletions('testComplete_', 'testComplete_')
matches = [f[0] for f in res]
assert len(matches) == 3
eq_(set(['testComplete_a', 'testComplete_b', 'testComplete_c']), set(matches))
@@ -90,60 +96,80 @@ class TestPyDevFrontEnd(TestBase):
# Test that we get IPython completions in results
# we do this by checking kw completion which PyDev does
# not do by default
- addExec('def ccc(ABC=123): pass')
- res = front_end.getCompletions('ccc(', '')
+ self.addExec('def ccc(ABC=123): pass')
+ res = self.front_end.getCompletions('ccc(', '')
matches = [f[0] for f in res]
assert 'ABC=' in matches
def testGetCompletions_3(self):
# Test that magics return IPYTHON magic as type
- res = front_end.getCompletions('%cd', '%cd')
+ res = self.front_end.getCompletions('%cd', '%cd')
assert len(res) == 1
eq_(res[0][3], '12') # '12' == IToken.TYPE_IPYTHON_MAGIC
assert len(res[0][1]) > 100, 'docstring for %cd should be a reasonably long string'
class TestRunningCode(TestBase):
def testPrint(self):
- addExec('print("output")')
- eq_(stdout.getvalue(), 'output\n')
+ self.redirectStdout()
+ try:
+ self.addExec('print("output")')
+ eq_(sys.stdout.getvalue(), 'output\n')
+ finally:
+ self.restoreStdout()
def testQuestionMark_1(self):
- addExec('?')
- assert len(stdout.getvalue()) > 1000, 'IPython help should be pretty big'
+ self.redirectStdout()
+ try:
+ self.addExec('?')
+ assert len(sys.stdout.getvalue()) > 1000, 'IPython help should be pretty big'
+ finally:
+ self.restoreStdout()
def testQuestionMark_2(self):
- addExec('int?')
- assert stdout.getvalue().find('Convert') != -1
+ self.redirectStdout()
+ try:
+ self.addExec('int?')
+ assert sys.stdout.getvalue().find('Convert') != -1
+ finally:
+ self.restoreStdout()
def testGui(self):
- from pydev_ipython.inputhook import get_inputhook, set_stdin_file
- set_stdin_file(sys.stdin)
- assert get_inputhook() is None
- addExec('%gui tk')
- # we can't test the GUI works here because we aren't connected to XML-RPC so
- # nowhere for hook to run
- assert get_inputhook() is not None
- addExec('%gui none')
- assert get_inputhook() is None
+ try:
+ import Tkinter
+ except:
+ return
+ else:
+ from pydev_ipython.inputhook import get_inputhook
+ assert get_inputhook() is None
+ self.addExec('%gui tk')
+ # we can't test the GUI works here because we aren't connected to XML-RPC so
+ # nowhere for hook to run
+ assert get_inputhook() is not None
+ self.addExec('%gui none')
+ assert get_inputhook() is None
def testHistory(self):
''' Make sure commands are added to IPython's history '''
- addExec('a=1')
- addExec('b=2')
- _ih = front_end.getNamespace()['_ih']
- eq_(_ih[-1], 'b=2')
- eq_(_ih[-2], 'a=1')
-
- addExec('history')
- hist = stdout.getvalue().split('\n')
- eq_(hist[-1], '')
- eq_(hist[-2], 'history')
- eq_(hist[-3], 'b=2')
- eq_(hist[-4], 'a=1')
+ self.redirectStdout()
+ try:
+ self.addExec('a=1')
+ self.addExec('b=2')
+ _ih = self.front_end.getNamespace()['_ih']
+ eq_(_ih[-1], 'b=2')
+ eq_(_ih[-2], 'a=1')
+
+ self.addExec('history')
+ hist = sys.stdout.getvalue().split('\n')
+ eq_(hist[-1], '')
+ eq_(hist[-2], 'history')
+ eq_(hist[-3], 'b=2')
+ eq_(hist[-4], 'a=1')
+ finally:
+ self.restoreStdout()
def testEdit(self):
- ''' Make sure we can issue an edit command '''
+ ''' Make sure we can issue an edit command'''
called_RequestInput = [False]
called_IPythonEditor = [False]
def startClientThread(client_port):
@@ -163,26 +189,47 @@ class TestRunningCode(TestBase):
handle_request_input = HandleRequestInput()
import pydev_localhost
- client_server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), self.client_port), logRequests=False)
+ self.client_server = client_server = SimpleXMLRPCServer(
+ (pydev_localhost.get_localhost(), self.client_port), logRequests=False)
client_server.register_function(handle_request_input.RequestInput)
client_server.register_function(handle_request_input.IPythonEditor)
client_server.serve_forever()
+
+ def shutdown(self):
+ return
+ self.client_server.shutdown()
client_thread = ClientThread(client_port)
client_thread.setDaemon(True)
client_thread.start()
return client_thread
- startClientThread(client_port)
+ # PyDevFrontEnd depends on singleton in IPython, so you
+ # can't make multiple versions. So we reuse self.front_end for
+ # all the tests
+ s = socket.socket()
+ s.bind(('', 0))
+ self.client_port = client_port = s.getsockname()[1]
+ s.close()
+ self.front_end = get_pydev_frontend(get_localhost(), client_port)
+
+ client_thread = startClientThread(self.client_port)
orig_stdin = sys.stdin
- sys.stdin = StdIn(self, get_localhost(), client_port)
+ sys.stdin = StdIn(self, get_localhost(), self.client_port)
try:
filename = 'made_up_file.py'
- addExec('%edit ' + filename)
- eq_(called_IPythonEditor[0], (os.path.abspath(filename), 0))
+ self.addExec('%edit ' + filename)
+
+ for i in xrange(10):
+ if called_IPythonEditor[0] == (os.path.abspath(filename), '0'):
+ break
+ time.sleep(.1)
+
+ eq_(called_IPythonEditor[0], (os.path.abspath(filename), '0'))
assert called_RequestInput[0], "Make sure the 'wait' parameter has been respected"
finally:
sys.stdin = orig_stdin
+ client_thread.shutdown()
if __name__ == '__main__':