test_asyncfrontendbase.py
106 lines
| 4.1 KiB
| text/x-python
|
PythonLexer
Gael Varoquaux
|
r1710 | # encoding: utf-8 | ||
Brian Granger
|
r1937 | """This file contains unittests for the asyncfrontendbase module.""" | ||
Gael Varoquaux
|
r1710 | |||
#--------------------------------------------------------------------------- | ||||
Bernardo B. Marques
|
r4872 | # Copyright (C) 2008-2009 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. | ||||
Gael Varoquaux
|
r1710 | #--------------------------------------------------------------------------- | ||
Fernando Perez
|
r2133 | |||
Gael Varoquaux
|
r1710 | #--------------------------------------------------------------------------- | ||
Bernardo B. Marques
|
r4872 | # Imports | ||
Gael Varoquaux
|
r1710 | #--------------------------------------------------------------------------- | ||
Brian Granger
|
r1960 | from twisted.trial import unittest | ||
Bernardo B. Marques
|
r4872 | |||
Brian Granger
|
r1960 | from IPython.frontend.asyncfrontendbase import AsyncFrontEndBase | ||
Bernardo B. Marques
|
r4872 | from IPython.frontend import frontendbase | ||
Brian Granger
|
r1960 | from IPython.kernel.engineservice import EngineService | ||
from IPython.testing.parametric import Parametric, parametric | ||||
Gael Varoquaux
|
r1710 | |||
Fernando Perez
|
r2133 | #----------------------------------------------------------------------------- | ||
# Classes and functions | ||||
#----------------------------------------------------------------------------- | ||||
Gael Varoquaux
|
r1710 | |||
class FrontEndCallbackChecker(AsyncFrontEndBase): | ||||
"""FrontEndBase subclass for checking callbacks""" | ||||
def __init__(self, engine=None, history=None): | ||||
Bernardo B. Marques
|
r4872 | super(FrontEndCallbackChecker, self).__init__(engine=engine, | ||
Gael Varoquaux
|
r1710 | history=history) | ||
self.updateCalled = False | ||||
self.renderResultCalled = False | ||||
self.renderErrorCalled = False | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def update_cell_prompt(self, result, blockID=None): | ||
self.updateCalled = True | ||||
return result | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def render_result(self, result): | ||
self.renderResultCalled = True | ||||
return result | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def render_error(self, failure): | ||
self.renderErrorCalled = True | ||||
return failure | ||||
class TestAsyncFrontendBase(unittest.TestCase): | ||||
def setUp(self): | ||||
"""Setup the EngineService and FrontEndBase""" | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | self.fb = FrontEndCallbackChecker(engine=EngineService()) | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_implements_IFrontEnd(self): | ||
Brian Granger
|
r1937 | self.assert_(frontendbase.IFrontEnd.implementedBy( | ||
Gael Varoquaux
|
r1710 | AsyncFrontEndBase)) | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_is_complete_returns_False_for_incomplete_block(self): | ||
block = """def test(a):""" | ||||
Brian Granger
|
r1937 | self.assert_(self.fb.is_complete(block) == False) | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_is_complete_returns_True_for_complete_block(self): | ||
block = """def test(a): pass""" | ||||
Brian Granger
|
r1937 | self.assert_(self.fb.is_complete(block)) | ||
Gael Varoquaux
|
r1710 | block = """a=3""" | ||
Brian Granger
|
r1937 | self.assert_(self.fb.is_complete(block)) | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_blockID_added_to_result(self): | ||
block = """3+3""" | ||||
d = self.fb.execute(block, blockID='TEST_ID') | ||||
Brian Granger
|
r1937 | d.addCallback(lambda r: self.assert_(r['blockID']=='TEST_ID')) | ||
return d | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_blockID_added_to_failure(self): | ||
block = "raise Exception()" | ||||
d = self.fb.execute(block,blockID='TEST_ID') | ||||
Brian Granger
|
r1937 | d.addErrback(lambda f: self.assert_(f.blockID=='TEST_ID')) | ||
return d | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_callbacks_added_to_execute(self): | ||
d = self.fb.execute("10+10") | ||||
Brian Granger
|
r1937 | d.addCallback(lambda r: self.assert_(self.fb.updateCalled and self.fb.renderResultCalled)) | ||
return d | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_error_callback_added_to_execute(self): | ||
Brian Granger
|
r1937 | """Test that render_error called on execution error.""" | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | d = self.fb.execute("raise Exception()") | ||
Brian Granger
|
r1937 | d.addErrback(lambda f: self.assert_(self.fb.renderErrorCalled)) | ||
return d | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | def test_history_returns_expected_block(self): | ||
Brian Granger
|
r1937 | """Make sure history browsing doesn't fail.""" | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1710 | blocks = ["a=1","a=2","a=3"] | ||
Brian Granger
|
r1937 | d = self.fb.execute(blocks[0]) | ||
d.addCallback(lambda _: self.fb.execute(blocks[1])) | ||||
d.addCallback(lambda _: self.fb.execute(blocks[2])) | ||||
d.addCallback(lambda _: self.assert_(self.fb.get_history_previous("")==blocks[-2])) | ||||
d.addCallback(lambda _: self.assert_(self.fb.get_history_previous("")==blocks[-3])) | ||||
d.addCallback(lambda _: self.assert_(self.fb.get_history_next()==blocks[-2])) | ||||
return d | ||||
Bernardo B. Marques
|
r4872 | |||
def test_history_returns_none_at_startup(self): | ||||
Brian Granger
|
r1937 | self.assert_(self.fb.get_history_previous("")==None) | ||
self.assert_(self.fb.get_history_next()==None) | ||||