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'
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]