diff options
Diffstat (limited to 'python/helpers/pydev/tests/test_pydev_ipython_011.py')
-rw-r--r-- | python/helpers/pydev/tests/test_pydev_ipython_011.py | 217 |
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__': |