Beispiel #1
0
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
Beispiel #2
0
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')
Beispiel #3
0
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')
Beispiel #4
0
 def setup(self):
     self.root = RootTask()
     database = self.root.database
     database.set_value('root', 'val1', 1)
     database.create_node('root', 'node1')
     database.set_value('root/node1', 'val2', 10.0)
     database.add_access_exception('root', 'root/node1', 'val2')
Beispiel #5
0
    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'
Beispiel #6
0
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
Beispiel #7
0
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'
Beispiel #8
0
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
Beispiel #9
0
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
Beispiel #10
0
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
Beispiel #11
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'
Beispiel #12
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'
Beispiel #13
0
    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'
Beispiel #14
0
def test_database_update():
    """Test that replacing the database_entries members refreshes the database.

    """
    root = RootTask()
    entries = root.database_entries.copy()
    del entries['default_path']
    entries['name'] = 'Test'
    root.database_entries = entries

    assert root.get_from_database('name') == 'Test'
    with pytest.raises(KeyError):
        root.get_from_database('default_path')
Beispiel #15
0
def test_database_operation():
    """Test setting, getting, deleting a value from the database.

    """
    root = RootTask()
    root.write_in_database('test', 1)
    assert root.get_from_database('test') == 1
    root.remove_from_database('test')
    with pytest.raises(KeyError):
        root.get_from_database('test')
Beispiel #16
0
 def setup(self):
     root = RootTask()
     root.should_pause = Event()
     root.should_stop = Event()
     root.paused = Event()
     root.resumed = Event()
     root.default_path = 'toto'
     root.write_in_database('meas_name', 'M')
     root.write_in_database('meas_id', '001')
     self.root = root
Beispiel #17
0
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')
Beispiel #18
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'
Beispiel #19
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'
Beispiel #20
0
def test_build_root_from_config():
    """Test building a RootTask from config.

    """
    class DummyTask(SimpleTask):

        database_entries = {'test': 1}

    config = {
        'name': 'test',
        'children_0': {
            'name': 'test_child',
            'task_id': 'DummyTask'
        }
    }
    task = RootTask.build_from_config(config,
                                      {'exopy.task': {
                                          'DummyTask': DummyTask
                                      }})
    assert task.name == 'Root'
    assert len(task.children) == 1
    assert task.children[0].name == 'test_child'
    assert task.children[0].root
    assert isinstance(task.children[0], DummyTask)
    assert task.get_from_database('test_child_test')
Beispiel #21
0
def test_create_task2(exopy_qtbot, task_workbench, dialog_sleep, task_config):
    """Test handling user cancellation.

    """
    core = task_workbench.get_plugin('enaml.workbench.core')

    def answer_dialog(exopy_qtbot, dial):
        selector = dial.selector
        qlist = selector.widgets()[-1]
        qlist.selected_item = qlist.items[-1]

        def assert_dial_config():
            assert dial.config

        exopy_qtbot.wait_until(assert_dial_config)
        exopy_qtbot.wait(dialog_sleep)

        dial._choose_config('_dummy_')
        assert not dial.config
        exopy_qtbot.wait(dialog_sleep)

    root = RootTask()
    with handle_dialog(exopy_qtbot, 'reject', answer_dialog):
        res = core.invoke_command('exopy.tasks.create_task',
                                  dict(future_parent=root))

    assert res is None
Beispiel #22
0
 def setup(self):
     self.root = RootTask()
     database = self.root.database
     database.set_value('root', 'val1', 1)
     database.create_node('root', 'node1')
     database.set_value('root/node1', 'val2', 10.0)
     database.add_access_exception('root', 'root/node1', 'val2')
Beispiel #23
0
    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}
Beispiel #24
0
def test_database_operation():
    """Test setting, getting, deleting a value from the database.

    """
    root = RootTask()
    root.write_in_database('test', 1)
    assert root.get_from_database('test') == 1
    root.remove_from_database('test')
    with pytest.raises(KeyError):
        root.get_from_database('test')
Beispiel #25
0
 def setup(self):
     root = RootTask()
     root.should_pause = Event()
     root.should_stop = Event()
     root.paused = Event()
     root.resumed = Event()
     root.default_path = 'toto'
     root.write_in_database('meas_name', 'M')
     root.write_in_database('meas_id', '001')
     self.root = root
Beispiel #26
0
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)
Beispiel #27
0
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))
Beispiel #28
0
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'
Beispiel #29
0
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)
Beispiel #30
0
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))
Beispiel #31
0
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]
Beispiel #32
0
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
Beispiel #33
0
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'
Beispiel #34
0
    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'
Beispiel #35
0
    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'
Beispiel #36
0
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'
Beispiel #37
0
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')
Beispiel #38
0
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
Beispiel #39
0
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
Beispiel #40
0
def test_template_task_config(exopy_qtbot, task_workbench):
    """Test the template task configurer.

    """
    plugin = task_workbench.get_plugin('exopy.tasks')

    path = os.path.join(os.path.dirname(__file__), 'test_template.task.ini')
    root = RootTask()
    config = TemplateTaskConfig(manager=plugin,
                                template_path=path,
                                future_parent=root)
    assert config.template_doc
    task = config.build_task()
    assert len(task.children) == 1

    show_and_close_widget(exopy_qtbot, TemplateConfigView(config=config))
Beispiel #41
0
def test_root_registering():
    """Check that the root task does write its default entries in the database
    when instantiated.

    """
    root = RootTask()
    assert root.get_from_database('default_path') == ''
    root.children = [
        SimpleTask(name='task2',
                   database_entries={'val2': 1},
                   root=root,
                   parent=root,
                   database=root.database)
    ]
    root.register_in_database()
    assert root.get_from_database('task2_val2') == 1
Beispiel #42
0
def test_database_update():
    """Test that replacing the database_entries members refreshes the database.

    """
    root = RootTask()
    entries = root.database_entries.copy()
    del entries['default_path']
    entries['name'] = 'Test'
    root.database_entries = entries

    assert root.get_from_database('name') == 'Test'
    with pytest.raises(KeyError):
        root.get_from_database('default_path')
Beispiel #43
0
def test_root_registering():
    """Check that the root task does write its default entries in the database
    when instantiated.

    """
    root = RootTask()
    assert root.get_from_database('default_path') == ''
    root.children = [SimpleTask(name='task2',
                                database_entries={'val2': 1},
                                root=root, parent=root,
                                database=root.database)]
    root.register_in_database()
    assert root.get_from_database('task2_val2') == 1
Beispiel #44
0
def test_loop_config_with_subtask(task_workbench, exopy_qtbot, dialog_sleep,
                                  monkeypatch):
    """Test the loop config.

    """
    plugin = task_workbench.get_plugin('exopy.tasks')

    config = LoopTaskConfig(manager=plugin,
                            task_class=plugin.get_task('exopy.LoopTask'),
                            future_parent=RootTask(),
                            task_name='Test')

    show_widget(exopy_qtbot, LoopConfigView(config=config))
    assert config.ready
    exopy_qtbot.wait(dialog_sleep)

    config.use_subtask = True
    assert not config.ready
    exopy_qtbot.wait(dialog_sleep + 100)

    config.subtask = 'exopy.BreakTask'
    assert config.ready
    exopy_qtbot.wait(dialog_sleep + 100)

    def dummy(self):
        self.ready = False

    monkeypatch.setattr(type(config.subconfig), 'check_parameters',
                        dummy)
    config.task_name = 'Bis'
    assert config.subconfig.task_name == 'Bis'  # Check sync
    assert not config.ready  # Result from the monkeypatch
    exopy_qtbot.wait(dialog_sleep + 100)

    config.use_subtask = False
    assert config.ready
    exopy_qtbot.wait(dialog_sleep + 100)

    config.use_subtask = True
    config.subtask = 'exopy.ContinueTask'
    task = config.build_task()
    assert task.name == 'Bis'
    assert type(task.task).__name__ == 'ContinueTask'
Beispiel #45
0
def test_build_root_from_config():
    """Test building a RootTask from config.

    """
    class DummyTask(SimpleTask):

        database_entries = {'test': 1}

    config = {'name': 'test',
              'children_0': {'name': 'test_child',
                             'task_id': 'DummyTask'}}
    task = RootTask.build_from_config(config,
                                      {'exopy.task':
                                          {'DummyTask': DummyTask}})
    assert task.name == 'Root'
    assert len(task.children) == 1
    assert task.children[0].name == 'test_child'
    assert task.children[0].root
    assert isinstance(task.children[0], DummyTask)
    assert task.get_from_database('test_child_test')
Beispiel #46
0
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
Beispiel #47
0
    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}
Beispiel #48
0
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')
Beispiel #49
0
def test_root_path_edition(exopy_qtbot, task_workbench, dialog_sleep,
                           monkeypatch):
    """Test the behavior of the root task view.

    """
    task = RootTask()
    view = RootTaskView(task=task,
                        core=task_workbench.get_plugin('enaml.workbench.core'))

    butt = view.widgets()[2]

    @classmethod
    def choose_path(cls, **kwargs):
        return 'test/path'

    with enaml.imports():
        from exopy.tasks.tasks.base_views import FileDialogEx
    monkeypatch.setattr(FileDialogEx, 'get_existing_directory', choose_path)

    butt.clicked = True
    assert task.default_path == 'test/path'

    @classmethod
    def choose_path(cls, **kwargs):
        return ''

    monkeypatch.setattr(FileDialogEx, 'get_existing_directory', choose_path)

    butt.clicked = True
    assert task.default_path == 'test/path'

    @classmethod
    def choose_path(cls, **kwargs):
        return ''

    monkeypatch.setattr(FileDialogEx, 'get_existing_directory', choose_path)
Beispiel #50
0
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]
Beispiel #51
0
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])
Beispiel #52
0
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'
Beispiel #53
0
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])
Beispiel #54
0
class TestEvaluation(object):
    """Test evaluating strings and caching in running mode.

    """

    def setup(self):
        self.root = RootTask()
        database = self.root.database
        database.set_value('root', 'val1', 1)
        database.create_node('root', 'node1')
        database.set_value('root/node1', 'val2', 10.0)
        database.add_access_exception('root', 'root/node1', 'val2')

    def test_eval_editing_mode1(self):
        """Test eval expression with only standard operators.

        """
        test = '{val1}/{val2}'
        formatted = self.root.format_and_eval_string(test)
        assert formatted == 0.1
        assert not self.root._eval_cache

    def test_eval_editing_mode2(self):
        """Test eval expression containing a math function.

        """
        test = 'cos({val1}/{val2})'
        formatted = self.root.format_and_eval_string(test)
        assert formatted == cos(0.1)
        assert not self.root._eval_cache

    def test_eval_editing_mode3(self):
        """Test eval expression containing a cmath function.

        """
        self.root.database.set_value('root', 'val1', 10.0)
        test = 'cm.sqrt({val1}/{val2})'
        formatted = self.root.format_and_eval_string(test)
        assert formatted == 1+0j
        assert not self.root._eval_cache

    def test_eval_editing_mode4(self):
        """Test eval expression containing a numpy function.

        """
        self.root.database.set_value('root', 'val1', [1.0, -1.0])
        test = 'np.abs({val1})'
        formatted = self.root.format_and_eval_string(test)
        assert_array_equal(formatted, numpy.array((1.0, 1.0)))
        assert not self.root._eval_cache

    def test_eval_running_mode1(self):
        """Test eval expression with only standard operators.

        """
        self.root.database.prepare_to_run()
        test = '{val1}/{val2}'
        formatted = self.root.format_and_eval_string(test)
        assert formatted == 0.1
        assert self.root._eval_cache
        assert test in self.root._eval_cache
        self.root.database.set_value('root', 'val1', 2)
        formatted = self.root.format_and_eval_string(test)
        assert formatted == 0.2

    def test_eval_running_mode2(self):
        """Test eval expression containing a math function.

        """
        self.root.database.prepare_to_run()
        test = 'cos({val1}/{val2})'
        formatted = self.root.format_and_eval_string(test)
        assert formatted == cos(0.1)
        assert self.root._eval_cache
        assert test in self.root._eval_cache
        self.root.database.set_value('root', 'val1', 2)
        formatted = self.root.format_and_eval_string(test)
        assert formatted == cos(0.2)

    def test_eval_running_mode3(self):
        """Test eval expression containing a cmath function.

        """
        self.root.database.prepare_to_run()
        self.root.database.set_value('root', 'val1', 10.0)
        test = 'cm.sqrt({val1}/{val2})'
        formatted = self.root.format_and_eval_string(test)
        assert formatted == (1+0j)
        assert self.root._eval_cache
        assert test in self.root._eval_cache
        self.root.database.set_value('root', 'val1', 40.0)
        formatted = self.root.format_and_eval_string(test)
        assert formatted == (2+0j)

    def test_eval_running_mode4(self):
        """Test eval expression containing a numpy function.

        """
        self.root.database.prepare_to_run()
        self.root.database.set_value('root', 'val1', [1.0, -1.0])
        test = 'np.abs({val1})'
        formatted = self.root.format_and_eval_string(test)
        assert_array_equal(formatted, numpy.array((1.0, 1.0)))
        assert self.root._eval_cache
        assert test in self.root._eval_cache
        self.root.database.set_value('root', 'val1', [2.0, -1.0])
        self.root.database.set_value('root', 'val2', 0)
        test = 'np.abs({val1})[{val2}]'
        formatted = self.root.format_and_eval_string(test)
        assert formatted == 2.0
Beispiel #55
0
class TestFormatting(object):
    """Test formatting strings and caching in running mode.

    """

    def setup(self):
        self.root = RootTask()
        database = self.root.database
        database.set_value('root', 'val1', 1)
        database.create_node('root', 'node1')
        database.set_value('root/node1', 'val2', 10.0)
        database.add_access_exception('root', 'root/node1', 'val2')

    def test_formatting_editing_mode1(self):
        """Test formatting values with text on both sides of expression.

        """
        test = 'progress is {val1}/{val2}, it is good.'
        formatted = self.root.format_string(test)
        assert formatted == 'progress is 1/10.0, it is good.'
        assert not self.root._format_cache

    def test_formatting_editing_mode2(self):
        """Test formatting values with text only on the left of expression.

        """
        test = 'progress is {val1}/{val2}'
        formatted = self.root.format_string(test)
        assert formatted == 'progress is 1/10.0'
        assert not self.root._format_cache

    def test_formatting_editing_mode3(self):
        """Test formatting values with text only on the right of expression.

        """
        test = '{val1}/{val2}, it is good.'
        formatted = self.root.format_string(test)
        assert formatted == '1/10.0, it is good.'
        assert not self.root._format_cache

    def test_formatting_editing_mode4(self):
        """Test formatting values with no other text.

        """
        test = '{val1}/{val2}'
        formatted = self.root.format_string(test)
        assert formatted == '1/10.0'
        assert not self.root._format_cache

    def test_formatting_editing_mode5(self):
        """Test formatting when there is only text.

        """
        test = 'test'
        formatted = self.root.format_string(test)
        assert formatted == 'test'
        assert not self.root._format_cache

    def test_formatting_running_mode1(self):
        """Test formatting values with text on both sides of expression.

        """
        self.root.database.prepare_to_run()
        test = 'progress is {val1}/{val2}, it is good.'
        formatted = self.root.format_string(test)
        assert formatted == 'progress is 1/10.0, it is good.'
        assert self.root._format_cache
        assert test in self.root._format_cache
        self.root.database.set_value('root', 'val1', 2)
        formatted = self.root.format_string(test)
        assert formatted == 'progress is 2/10.0, it is good.'

    def test_formatting_running_mode2(self):
        """Test formatting values with text only on the left of expression.

        """
        self.root. database.prepare_to_run()
        test = 'progress is {val1}/{val2}'
        formatted = self.root.format_string(test)
        assert formatted == 'progress is 1/10.0'
        assert self.root._format_cache
        assert test in self.root._format_cache
        self.root.database.set_value('root', 'val1', 2)
        formatted = self.root.format_string(test)
        assert formatted == 'progress is 2/10.0'

    def test_formatting_running_mode3(self):
        """Test formatting values with text only on the right of expression.

        """
        self.root.database.prepare_to_run()
        test = '{val1}/{val2}, it is good.'
        formatted = self.root.format_string(test)
        assert formatted == '1/10.0, it is good.'
        assert self.root._format_cache
        assert test in self.root._format_cache
        self.root.database.set_value('root', 'val1', 2)
        formatted = self.root.format_string(test)
        assert formatted == '2/10.0, it is good.'

    def test_formatting_running_mode4(self):
        """Test formatting values with no other text.

        """
        self.root.database.prepare_to_run()
        test = '{val1}/{val2}'
        formatted = self.root.format_string(test)
        assert formatted == '1/10.0'
        assert self.root._format_cache
        assert test in self.root._format_cache
        self.root.database.set_value('root', 'val1', 2)
        formatted = self.root.format_string(test)
        assert formatted == '2/10.0'

    def test_formatting_running_mode5(self):
        """Test formatting when there is only text.

        """
        self.root.database.prepare_to_run()
        test = 'test'
        formatted = self.root.format_string(test)
        assert formatted == 'test'
        assert self.root._format_cache
        assert test in self.root._format_cache
Beispiel #56
0
 def setup(self):
     self.root = RootTask()
     self.mixin = Mixin(name='Simple')
     self.root.add_child_task(0, self.mixin)
Beispiel #57
0
 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)
Beispiel #58
0
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]
Beispiel #59
0
 def setup(self):
     self.root = RootTask()
     self.mixin = InterfaceTest3()
     self.root.add_child_task(0, Mixin(name='Simple', interface=self.mixin))