def test_moving_child(): """Test moving a child. """ root = RootTask() task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = SimpleTask(name='task2', database_entries={'val2': 1}, access_exs={'val2': 2}) task3 = ComplexTask(name='task3') task4 = ComplexTask(name='task4') task1.add_child_task(0, task2) task1.add_child_task(1, task4) root.add_child_task(0, task1) root.add_child_task(1, task3) listener = SignalListener() task1.observe('children_changed', listener.listen) assert task1.preferences['children_0']['name'] == 'task2' assert task1.preferences['children_1']['name'] == 'task4' task1.move_child_task(0, 1) assert listener.counter == 1 assert listener.signals[0].moved assert task1.preferences['children_0']['name'] == 'task4' assert task1.preferences['children_1']['name'] == 'task2' assert task3.get_from_database('task2_val2') == 1
class TestLogTask(object): """Test LogTask. """ def setup(self): self.root = RootTask(should_stop=Event(), should_pause=Event()) self.task = LogTask(name='Test') self.root.add_child_task(0, self.task) def test_check1(self): """Test checking that a message that cannot be formatted will result in a fail """ self.task.message = 'TestMessage {aa}' test, traceback = self.task.check() assert not test assert len(traceback) == 1 assert 'root/Test-message' in traceback assert not self.task.get_from_database('Test_message') def test_perform1(self): """Test checking that the message value gets written to the database """ self.task.write_in_database('val', 'World') self.task.message = 'Hello {Test_val}' self.root.prepare() self.task.perform() assert self.task.get_from_database('Test_message') == 'Hello World'
def test_database_update_with_exception(): """Test that replacing the database_entries members refreshes the database. """ root = RootTask() task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = SimpleTask(name='task2', database_entries={'val2': 1}, access_exs={'val2': 1}) task3 = ComplexTask(name='task3') task1.add_child_task(0, task2) root.add_child_task(0, task1) root.add_child_task(1, task3) assert task3.get_from_database('task2_val2') entries = task2.database_entries.copy() del entries['val2'] task2.database_entries = entries with pytest.raises(KeyError): task1.get_from_database('task2_val2') with pytest.raises(KeyError): task3.get_from_database('task2_val2')
def test_moving_through_remove_add_child(): """Test moving a child between different tasks through remove/add. """ root = RootTask() task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = ComplexTask(name='task2', database_entries={'val2': 2.0}) task3 = SimpleTask(name='task3', database_entries={'val3': 1}, access_exs={'val3': 2}) task2.add_child_task(0, task3) task1.add_child_task(1, task2) root.add_child_task(0, task1) task1.remove_child_task(0) assert task2.parent is None assert task2.root is None assert task2.database is None assert task3.parent is not None assert task3.root is None assert task3.database is None root.add_child_task(0, task2) assert len(root.children) == 2
def test_task_renaming(): """Test renaming simple and complex task. """ root = RootTask() task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = ComplexTask(name='task2') task3 = SimpleTask(name='task3', database_entries={'val2': 1}, access_exs={'val2': 2}) task2.add_child_task(0, task3) task1.add_child_task(0, task2) root.add_child_task(0, task1) task3.name = 'worker3' with pytest.raises(KeyError): root.get_from_database('task3_val2') assert root.get_from_database('worker3_val2') == 1 task1.name = 'worker1' with pytest.raises(KeyError): root.get_from_database('task1_val1') assert root.get_from_database('worker1_val1') == 2.0 assert root.get_from_database('worker3_val2') == 1
def test_deleting_child(): """Test deleting a child. """ root = RootTask() task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = SimpleTask(name='task2', database_entries={'val2': 1}, access_exs={'val2': 2}) task3 = ComplexTask(name='task3') task4 = ComplexTask(name='task4') task1.add_child_task(0, task2) task1.add_child_task(1, task4) root.add_child_task(0, task1) root.add_child_task(1, task3) listener = SignalListener() task1.observe('children_changed', listener.listen) task1.remove_child_task(0) assert listener.counter == 1 assert listener.signals[0].removed assert task1.preferences['children_0']['name'] == 'task4' assert 'task2_val2' not in task3.list_accessible_database_entries() root.remove_child_task(0) assert len(root.children) == 1 with pytest.raises(KeyError): root.get_from_database('task1_val1')
def setup(self): r = RootTask() r.run_time = { d_id: { 'd': (object, FalseStarter()) }, p_id: { 'p': { 'connections': { 'c': {}, 'c2': {} }, 'settings': { 's': {} } } } } class InTask(InstrumentTask): feval = Unicode('1').tag(feval=Feval()) self.task = InTask(name='Dummy', selected_instrument=('p', 'd', 'c', 's')) r.add_child_task(0, self.task) self.err_path = 'root/Dummy-instrument'
class TestFormulaTask(object): """Test FormulaTask. """ def setup(self): self.root = RootTask(should_stop=Event(), should_pause=Event()) self.task = FormulaTask(name='Test') self.root.add_child_task(0, self.task) def teardown(self): del self.root.should_pause del self.root.should_stop # Ensure we collect the file descriptor of the events. Otherwise we can # get funny errors on MacOS. gc.collect() def test_perform1(self): """Test checking that the evaluated formula gets written to the database """ self.task.formulas = OrderedDict([('key1', "1.0+3.0"), ('key2', '3.0+4.0')]) self.root.prepare() self.task.perform() assert (self.task.get_from_database('Test_key1') == 4.0 and self.task.get_from_database('Test_key2') == 7.0) def test_perform_from_load(self): """Test checking for correct loading from pref and that we can still recall values from the database """ self.task.write_in_database('pi', 3.1) self.task.formulas = \ ordered_dict_from_pref(self, self.task.formulas, ("[(u'key1', '1.0+3.0'), " "(u'key2', '3.0 + {Test_pi}')]")) self.root.prepare() self.task.perform() assert (self.task.get_from_database('Test_key1') == 4.0 and self.task.get_from_database('Test_key2') == 6.1) def test_check(self): """Test checking that an unformattable formula gives an error """ self.task.formulas = OrderedDict([('key1', "1.0+3.0"), ('key2', '3.0+4.0 + {Test_pi}')]) test, traceback = self.task.check() assert not test assert len(traceback) == 1 assert 'root/Test-key2' in traceback
class TestDefinitionTask(object): """Test DefinitionTask. """ def setup(self): self.root = RootTask(should_stop=Event(), should_pause=Event()) self.task = DefinitionTask(name='Test') self.root.add_child_task(0, self.task) def test_perform1(self): """Test checking that the formatted definition gets written to the database """ self.task.write_in_database('it', 'World') self.task.definitions = OrderedDict([('key1', "2.0+3.0"), ('key2', '"Hello"')]) self.root.prepare() self.task.check() assert self.task.get_from_database('Test_key1') == safe_eval( "1.0+4.0", {}) assert self.task.get_from_database('Test_key2') == "Hello" def test_check_after_load(self): """Test checking for correct loading from pref and that we can still recall values from the database """ self.task.write_in_database('it', 'World') pref = """[(u'key1', u'1.0+3.0'), (u'key2', u'"Hello"')]""" self.task.definitions = ordered_dict_from_pref(self, self.task.definitions, pref) self.root.prepare() self.task.check() assert self.task.get_from_database('Test_key1') == safe_eval( "1.0+3.0", {}) assert self.task.get_from_database('Test_key2') == "Hello" def test_check(self): """Test checking that an unformattable definition gives an error """ self.task.definitions = OrderedDict([('key1', "1.0+3.0"), ('key2', '3.0+4.0 + {Test_pi}')]) test, traceback = self.task.check() assert not test assert len(traceback) == 1 assert 'root/Test-key2' in traceback
def test_build_from_config1(self): """Test building a interfaceable task with no interface from a config. """ aux = RootTask() aux.add_child_task(0, IMixin()) bis = RootTask.build_from_config(aux.preferences, {'exopy.task': {'tasks.IMixin': IMixin, 'exopy.RootTask': RootTask}}) assert type(bis.children[0]).__name__ == 'IMixin'
def setup(self): r = RootTask() r.run_time = {d_id: {'d': (object, FalseStarter())}, p_id: {'p': {'connections': {'c': {}, 'c2': {}}, 'settings': {'s': {}}}}} class InTask(InstrumentTask): feval = Unicode('1').tag(feval=Feval()) self.task = InTask(name='Dummy', selected_instrument=('p', 'd', 'c', 's')) r.add_child_task(0, self.task) self.err_path = 'root/Dummy-instrument'
class TestFormulaTask(object): """Test FormulaTask. """ def setup(self): self.root = RootTask(should_stop=Event(), should_pause=Event()) self.task = FormulaTask(name='Test') self.root.add_child_task(0, self.task) def test_perform1(self): """Test checking that the evaluated formula gets written to the database """ self.task.formulas = OrderedDict([('key1', "1.0+3.0"), ('key2', '3.0+4.0')]) self.root.prepare() self.task.perform() assert (self.task.get_from_database('Test_key1') == 4.0 and self.task.get_from_database('Test_key2') == 7.0) def test_perform_from_load(self): """Test checking for correct loading from pref and that we can still recall values from the database """ self.task.write_in_database('pi', 3.1) self.task.formulas = \ ordered_dict_from_pref(self, self.task.formulas, ("[(u'key1', '1.0+3.0'), " "(u'key2', '3.0 + {Test_pi}')]")) self.root.prepare() self.task.perform() assert (self.task.get_from_database('Test_key1') == 4.0 and self.task.get_from_database('Test_key2') == 6.1) def test_check(self): """Test checking that an unformattable formula gives an error """ self.task.formulas = OrderedDict([('key1', "1.0+3.0"), ('key2', '3.0+4.0 + {Test_pi}')]) test, traceback = self.task.check() assert not test assert len(traceback) == 1 assert 'root/Test-key2' in traceback
def test_build_from_config1(self): """Test building a interfaceable interface with no interface from a config. """ aux = RootTask() mixin = Mixin() mixin.interface = InterfaceTest3() aux.add_child_task(0, mixin) deps = {'exopy.task': {'tasks.Mixin': Mixin, 'exopy.RootTask': RootTask}, 'exopy.tasks.interface': {'tasks.Mixin:tasks.InterfaceTest3': InterfaceTest3}} bis = RootTask.build_from_config(aux.preferences, deps) assert type(bis.children[0].interface).__name__ == 'InterfaceTest3'
def test_swapping(exopy_qtbot, task_workbench, dialog_sleep): """Test moving a view between containers. """ task = RootTask() view = RootTaskView(task=task, core=task_workbench.get_plugin('enaml.workbench.core')) subtask = ComplexTask(name='Test') subview = view.view_for(subtask) task.add_child_task(0, subtask) cont = Container() show_widget(exopy_qtbot, cont) view.set_parent(cont) view.refresh() def assert_children(): assert cont.children == [view] exopy_qtbot.wait_until(assert_children) exopy_qtbot.wait(dialog_sleep) view.set_parent(None) subview.set_parent(cont) subview.refresh() def assert_children(): assert cont.children == [subview] exopy_qtbot.wait_until(assert_children) exopy_qtbot.wait(dialog_sleep) subview.set_parent(None) view.set_parent(cont) view.refresh() def assert_children(): assert cont.children == [view] exopy_qtbot.wait_until(assert_children) assert subview.visible exopy_qtbot.wait(dialog_sleep)
def test_py_task_config(exopy_qtbot, task_workbench): """Test the basic python task configurer. """ plugin = task_workbench.get_plugin('exopy.tasks') root = RootTask() config = PyTaskConfig(manager=plugin, task_class=plugin.get_task('exopy.ComplexTask'), future_parent=root) assert config.task_name assert config.ready assert config.task_doc config.task_name = '' assert not config.ready config.task_name = 'Test' assert config.ready task = config.build_task() assert task.name == 'Test' root.add_child_task(0, task) config2 = PyTaskConfig(manager=plugin, task_class=plugin.get_task('exopy.ComplexTask'), future_parent=root) config2.task_name = 'Test' assert not config2.ready config2.task_name = 'ADifferentName' assert config2.ready plugin.auto_task_names = [] config = PyTaskConfig(manager=plugin, task_class=plugin.get_task('exopy.ComplexTask'), future_parent=root) assert not config.task_name assert not config.ready show_and_close_widget(exopy_qtbot, PyConfigView(config=config)) show_and_close_widget(exopy_qtbot, PyConfigView(config=config, loop=True))
def test_update_preferences_from_members(): """Test updating the preferences. Only operation on the children cause re-registering to ensure the children ordering. """ root = RootTask() task1 = SimpleTask(name='task1') root.add_child_task(0, task1) assert root.preferences['children_0']['name'] == 'task1' task1.name = 'worker1' assert root.preferences['children_0']['name'] == 'task1' root.update_preferences_from_members() assert root.preferences['children_0']['name'] == 'worker1'
def test_traverse(): """Test traversing a task hierarchy to collect infos. """ root = RootTask() task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = SimpleTask(name='task2', database_entries={'val2': 1}, access_exs={'val2': 2}) task3 = ComplexTask(name='task3') task1.add_child_task(0, task2) root.add_child_task(0, task1) root.add_child_task(1, task3) flat = list(root.traverse()) assert flat == [root, task1, task2, task3] flat = list(root.traverse(0)) assert flat == [root, task1, task3]
def test_loop_config(exopy_qtbot, task_workbench): """Test the loop config. """ plugin = task_workbench.get_plugin('exopy.tasks') root = RootTask() config = LoopTaskConfig(manager=plugin, task_class=plugin.get_task('exopy.LoopTask'), future_parent=root) assert config.task_name assert config.ready assert config.task_doc config.task_name = '' assert not config.ready config.task_name = 'Test' assert config.ready task = config.build_task() assert task.name == 'Test' root.add_child_task(0, task) config2 = LoopTaskConfig(manager=plugin, task_class=plugin.get_task('exopy.LoopTask'), future_parent=root) config2.task_name = 'Test' assert not config2.ready config2.task_name = 'ADifferentName' assert config2.ready plugin.auto_task_names = [] config = LoopTaskConfig(manager=plugin, task_class=plugin.get_task('exopy.LoopTask')) assert not config.task_name assert not config.ready show_and_close_widget(exopy_qtbot, LoopConfigView(config=config))
def test_deleting_child(): """Test deleting a child. """ root = RootTask() task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = SimpleTask(name='task2', database_entries={'val2': 1}, access_exs={'val2': 2}) task3 = ComplexTask(name='task3') task4 = ComplexTask(name='task4') task1.add_child_task(0, task2) task1.add_child_task(1, task4) root.add_child_task(0, task1) root.add_child_task(1, task3) listener = SignalListener() task1.observe('children_changed', listener.listen) task1.remove_child_task(0) assert task2.parent is None assert task2.root is None assert task2.database is None assert listener.counter == 1 assert listener.signals[0].removed assert task1.preferences['children_0']['name'] == 'task4' assert 'task2_val2' not in task3.list_accessible_database_entries() root.remove_child_task(0) assert task1.parent is None assert task1.root is None assert task1.database is None assert task4.root is None assert task4.database is None assert len(root.children) == 1 with pytest.raises(KeyError): root.get_from_database('task1_val1')
def test_access_exceptions(): """Test adding, modifying and removing an access exception after creation. """ root = RootTask() listener = SignalListener() root.observe('children_changed', listener.listen) task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = ComplexTask(name='task2') task3 = SimpleTask( name='task3', database_entries={ 'val2': 1, 'val3': 2 }, ) task2.add_child_task(0, task3) task1.add_child_task(0, task2) root.add_child_task(0, task1) with pytest.raises(KeyError): task2.get_from_database('task3_val2') task3.add_access_exception('val2', 1) task3.add_access_exception('val3', 1) assert task2.get_from_database('task3_val2') == 1 assert task2.get_from_database('task3_val2') == 1 with pytest.raises(KeyError): task1.get_from_database('task3_val2') task3.modify_access_exception('val2', 2) task3.modify_access_exception('val3', -1) assert task1.get_from_database('task3_val2') == 1 with pytest.raises(KeyError): task2.get_from_database('task3_val3') task3.remove_access_exception('val2') with pytest.raises(KeyError): task2.get_from_database('task3_val2')
class TestLogTask(object): """Test LogTask. """ def setup(self): self.root = RootTask(should_stop=Event(), should_pause=Event()) self.task = LogTask(name='Test') self.root.add_child_task(0, self.task) def teardown(self): del self.root.should_pause del self.root.should_stop # Ensure we collect the file descriptor of the events. Otherwise we can # get funny errors on MacOS. gc.collect() def test_check1(self): """Test checking that a message that cannot be formatted will result in a fail """ self.task.message = 'TestMessage {aa}' test, traceback = self.task.check() assert not test assert len(traceback) == 1 assert 'root/Test-message' in traceback assert not self.task.get_from_database('Test_message') def test_perform1(self): """Test checking that the message value gets written to the database """ self.task.write_in_database('val', 'World') self.task.message = 'Hello {Test_val}' self.root.prepare() self.task.perform() assert self.task.get_from_database('Test_message') == 'Hello World'
def test_adding_child(): """Test adding children. This test adding a child with and without access_exs to a task which is not root and then to the root. This makes sure that giving the root afterwards does trigger the right updates. """ root = RootTask() listener = SignalListener() root.observe('children_changed', listener.listen) task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = SimpleTask(name='task2', database_entries={'val2': 1}, access_exs={'val2': 2}) task3 = ComplexTask(name='task3') task1.add_child_task(0, task2) root.add_child_task(0, task1) root.add_child_task(1, task3) assert task1.depth == 1 assert task1.path == 'root' assert task1.database is root.database assert task1.root is root assert task1.parent is root assert task2.depth == 2 assert task2.path == 'root/task1' assert task2.database is root.database assert task2.root is root assert task2.parent is task1 assert task1.get_from_database('task1_val1') == 2.0 assert root.get_from_database('task1_val1') == 2.0 assert task3.get_from_database('task2_val2') == 1 assert listener.counter == 2 assert all([bool(c.added) for c in listener.signals])
def test_access_exceptions(): """Test adding, modifying and removing an access exception after creation. """ root = RootTask() listener = SignalListener() root.observe('children_changed', listener.listen) task1 = ComplexTask(name='task1', database_entries={'val1': 2.0}) task2 = ComplexTask(name='task2') task3 = SimpleTask(name='task3', database_entries={'val2': 1, 'val3': 2}, ) task2.add_child_task(0, task3) task1.add_child_task(0, task2) root.add_child_task(0, task1) with pytest.raises(KeyError): task2.get_from_database('task3_val2') task3.add_access_exception('val2', 1) task3.add_access_exception('val3', 1) assert task2.get_from_database('task3_val2') == 1 assert task2.get_from_database('task3_val2') == 1 with pytest.raises(KeyError): task1.get_from_database('task3_val2') task3.modify_access_exception('val2', 2) task3.modify_access_exception('val3', -1) assert task1.get_from_database('task3_val2') == 1 with pytest.raises(KeyError): task2.get_from_database('task3_val3') task3.remove_access_exception('val2') with pytest.raises(KeyError): task2.get_from_database('task3_val2')
class TestDefinitionTask(object): """Test DefinitionTask. """ def setup(self): self.root = RootTask(should_stop=Event(), should_pause=Event()) self.task = DefinitionTask(name='Test') self.root.add_child_task(0, self.task) def teardown(self): del self.root.should_pause del self.root.should_stop # Ensure we collect the file descriptor of the events. Otherwise we can # get funny errors on MacOS. gc.collect() def test_perform1(self): """Test checking that the formatted definition gets written to the database """ self.task.write_in_database('it', 'World') self.task.definitions = OrderedDict([('key1', "2.0+3.0"), ('key2', '"Hello"')]) self.root.prepare() self.task.check() assert self.task.get_from_database('Test_key1') == safe_eval( "1.0+4.0", {}) assert self.task.get_from_database('Test_key2') == "Hello" def test_check_after_load(self): """Test checking for correct loading from pref and that we can still recall values from the database """ self.task.write_in_database('it', 'World') pref = """[(u'key1', u'1.0+3.0'), (u'key2', u'"Hello"')]""" self.task.definitions = ordered_dict_from_pref(self, self.task.definitions, pref) self.root.prepare() self.task.check() assert self.task.get_from_database('Test_key1') == safe_eval( "1.0+3.0", {}) assert self.task.get_from_database('Test_key2') == "Hello" def test_check(self): """Test checking that an unformattable definition gives an error """ self.task.definitions = OrderedDict([('key1', "1.0+3.0"), ('key2', '3.0+4.0 + {Test_pi}')]) test, traceback = self.task.check() assert not test assert len(traceback) == 1 assert 'root/Test-key2' in traceback
class TestInterfaceableInterfaceMixin(object): """Test the capabilities of task interfaces. """ def setup(self): self.root = RootTask() self.mixin = InterfaceTest3() self.root.add_child_task(0, Mixin(name='Simple', interface=self.mixin)) def test_interface_observer(self): """Test changing the interface. """ i1 = IIinterfaceTest1() i2 = IIinterfaceTest2() self.mixin.interface = i1 assert i1.parent is self.mixin assert i1.task is self.mixin.task assert i1.interface_id == (self.mixin.interface_id + ':tasks.' + i1.__class__.__name__) assert self.mixin.task.database_entries == {'test': 2.0, 'itest': 1.0} self.mixin.interface = i2 assert i2.task is self.mixin.task assert i1.parent is None with pytest.raises(AttributeError): i1.task assert self.mixin.task.database_entries == {'test': 2.0, 'itest': 2.0, 'fmt': '', 'feval': 0} def test_check1(self): """Test running checks when the interface is present. """ self.mixin.interface = IIinterfaceTest1(answer=True) res, traceback = self.mixin.check() assert res assert not traceback assert self.mixin.interface.called def test_check2(self): """Test running checks when no interface exist but i_perform is implemented. """ interface = InterfaceTest4() self.root.children[0].interface = interface res, traceback = interface.check() assert res assert not traceback def test_check3(self): """Test handling missing interface. """ res, traceback = self.mixin.check() assert not res assert traceback assert len(traceback) == 1 assert 'root/Simple/InterfaceTest3-interface' in traceback def test_check4(self): """Test handling a non-passing test from the interface. """ self.mixin.interface = IIinterfaceTest1() res, traceback = self.mixin.check() assert not res assert len(traceback) == 1 assert self.mixin.interface.called def test_check5(self): """Check that auto-check of fmt and feavl tagged members works. """ self.mixin.interface = IIinterfaceTest2(fmt='{Simple_test}', feval='2*{Simple_test}') res, traceback = self.mixin.check() assert res assert not traceback assert self.root.get_from_database('Simple_fmt') == '2.0' assert self.root.get_from_database('Simple_feval') == 4.0 def test_check6(self): """Check that auto-check of fmt and feavl handle errors. """ self.mixin.interface = IIinterfaceTest2(fmt='{Simple_test*}', feval='2*{Simple_test}*') res, traceback = self.mixin.check() assert not res assert self.root.get_from_database('Simple_fmt') == '' assert self.root.get_from_database('Simple_feval') == 0 assert len(traceback) == 2 assert 'root/Simple-fmt' in traceback assert 'root/Simple-feval' in traceback def test_perform1(self): """Test perform does call interface if present. """ self.mixin.interface = IIinterfaceTest1() self.root.database.prepare_to_run() self.mixin.perform() assert self.root.get_from_database('Simple_itest') == 2.0 def test_perform2(self): """Test perform use i_perform when no interface exists. """ self.mixin = InterfaceTest4() self.root.children[0].interface = self.mixin self.root.database.prepare_to_run() self.mixin.perform() assert self.root.get_from_database('Simple_test') == 3.0 def test_build_from_config1(self): """Test building a interfaceable interface with no interface from a config. """ aux = RootTask() mixin = Mixin() mixin.interface = InterfaceTest3() aux.add_child_task(0, mixin) deps = {'exopy.task': {'tasks.Mixin': Mixin, 'exopy.RootTask': RootTask}, 'exopy.tasks.interface': {'tasks.Mixin:tasks.InterfaceTest3': InterfaceTest3}} bis = RootTask.build_from_config(aux.preferences, deps) assert type(bis.children[0].interface).__name__ == 'InterfaceTest3' def test_build_from_config2(self): """Test building a interfaceable interface with an interface from a config. """ self.mixin.interface = IIinterfaceTest1(answer=True) self.root.update_preferences_from_members() deps = {'exopy.task': {'tasks.Mixin': Mixin, 'exopy.RootTask': RootTask}, 'exopy.tasks.interface': {'tasks.Mixin:tasks.InterfaceTest3': InterfaceTest3, 'tasks.Mixin:tasks.InterfaceTest3:tasks.IIinterfaceTest1': IIinterfaceTest1 } } bis = RootTask.build_from_config(self.root.preferences, deps) interface = bis.children[0].interface.interface assert type(interface).__name__ == 'IIinterfaceTest1' assert self.root.children[0].database_entries ==\ {'test': 2.0, 'itest': 1.0} def test_traverse(self): """Test traversing a task with an interfaceable interface. """ class Test(InterfaceableInterfaceMixin, IIinterfaceTest2): pass iaux = IIinterfaceTest1() self.mixin.interface = Test() self.mixin.interface.interface = iaux task = self.root.children[0] w = list(task.traverse()) assert w == [task, self.mixin, self.mixin.interface, iaux] w = list(task.traverse(1)) assert w == [task, self.mixin, self.mixin.interface]
class TestInterfaceableTaskMixin(object): """Test the capabilities of task interfaces. """ def setup(self): self.root = RootTask() self.mixin = Mixin(name='Simple') self.root.add_child_task(0, self.mixin) def test_interface_observer(self): """Test changing the interface. """ i1 = InterfaceTest() i2 = InterfaceTest2() self.mixin.interface = i1 assert i1.task is self.mixin assert self.mixin.database_entries == {'test': 2.0, 'itest': 1.0} assert i1.interface_id == (self.mixin.task_id + ':tasks.' + i1.__class__.__name__) self.mixin.interface = i2 assert i2.task is self.mixin assert i1.task is None assert self.mixin.database_entries == {'test': 2.0, 'itest': 2.0, 'fmt': '', 'feval': 0} def test_check1(self): """Test running checks when the interface is present. """ self.mixin.interface = InterfaceTest(answer=True) res, traceback = self.mixin.check() assert res assert not traceback assert self.mixin.interface.called def test_check2(self): """Test running checks when no interface exist but i_perform is implemented. """ res, traceback = IMixin().check() assert res assert not traceback def test_check3(self): """Test handling missing interface. """ res, traceback = self.mixin.check() assert not res assert traceback assert len(traceback) == 1 assert 'root/Simple-interface' in traceback def test_check4(self): """Test handling a non-passing test from the interface. """ self.mixin.interface = InterfaceTest() res, traceback = self.mixin.check() assert not res assert len(traceback) == 1 assert self.mixin.interface.called def test_check5(self): """Check that auto-check of fmt and feval tagged members works. """ self.mixin.interface = InterfaceTest2(fmt='{Simple_test}', feval='2*{Simple_test}') res, traceback = self.mixin.check() assert res assert not traceback assert self.root.get_from_database('Simple_fmt') == '2.0' assert self.root.get_from_database('Simple_feval') == 4.0 self.mixin.interface = InterfaceTest2bis(fmt='{Simple_test}', feval='2*{Simple_test}') res, traceback = self.mixin.check() assert not res assert 'root/Simple-feval' in traceback def test_check6(self): """Check that auto-check of fmt and feavl handle errors. """ self.mixin.interface = InterfaceTest2(fmt='{Simple_test*}', feval='2*{Simple_test}*') res, traceback = self.mixin.check() assert not res assert self.root.get_from_database('Simple_fmt') == '' assert self.root.get_from_database('Simple_feval') == 0 assert len(traceback) == 2 assert 'root/Simple-fmt' in traceback assert 'root/Simple-feval' in traceback def test_prepare(self): """Test that the prepare method does prepare the interface. """ self.mixin.interface = InterfaceTest() self.mixin.prepare() assert self.mixin.interface.called def test_perform1(self): """Test perform does call interface if present. """ self.mixin.interface = InterfaceTest() self.root.database.prepare_to_run() self.mixin.perform() assert self.mixin.get_from_database('Simple_itest') == 2.0 def test_perform2(self): """Test perform use i_perform when no interface exists. """ self.root.remove_child_task(0) self.mixin = IMixin(name='Simple') self.root.add_child_task(0, self.mixin) self.root.database.prepare_to_run() self.mixin.perform() assert self.root.get_from_database('Simple_test') == 3.0 def test_build_from_config1(self): """Test building a interfaceable task with no interface from a config. """ aux = RootTask() aux.add_child_task(0, IMixin()) bis = RootTask.build_from_config(aux.preferences, {'exopy.task': {'tasks.IMixin': IMixin, 'exopy.RootTask': RootTask}}) assert type(bis.children[0]).__name__ == 'IMixin' def test_build_from_config2(self): """Test building a interfaceable task with an interface from a config. """ self.mixin.interface = InterfaceTest(answer=True) self.root.update_preferences_from_members() deps = {'exopy.task': {'tasks.Mixin': Mixin, 'exopy.RootTask': RootTask}, 'exopy.tasks.interface': {'tasks.Mixin:tasks.InterfaceTest': InterfaceTest}} bis = RootTask.build_from_config(self.root.preferences, deps) assert type(bis.children[0].interface).__name__ == 'InterfaceTest' def test_traverse(self): """Test traversing a task with interface. """ self.mixin.interface = InterfaceTest2() w = list(self.mixin.traverse()) assert w == [self.mixin, self.mixin.interface]