def test_progress_column():
    from traitsui.extras.progress_column import ProgressColumn
    progress_view = View(
        Item(
            'values',
            show_label=False,
            editor=TableEditor(
                columns=[
                    ObjectColumn(name='value'),
                    ProgressColumn(name='other_value'),
                ],
            )
        ),
        buttons=['OK'],
    )
    gui = GUI()
    object_list = ObjectList(
        values=[ListItem(value=str(i**2)) for i in range(10)]
    )

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=progress_view)
        gui.process_events()
        press_ok_button(ui)
        gui.process_events()
    def test_tabular_editor_multi_selection_items_changed(self):
        gui = GUI()
        view = get_view(multi_select=True)

        with store_exceptions_on_all_threads(), \
                self.report_and_editor(view) as (report, editor):
            gui.process_events()
            people = report.people

            self.assertEqual(get_selected_rows(editor), [])

            report.selected_rows.extend([0, 1])
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [0, 1])
            self.assertEqual(report.multi_selected, people[:2])

            report.selected_rows[1] = 2
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [0, 2])
            self.assertEqual(report.multi_selected, people[0:3:2])

            report.multi_selected[0] = people[1]
            gui.process_events()

            self.assertEqual(sorted(get_selected_rows(editor)), [1, 2])
            self.assertEqual(sorted(report.selected_rows), [1, 2])

            # If there's a single invalid value, nothing is updated
            report.multi_selected[0] = Person(name="invalid", age=-1)
            gui.process_events()

            self.assertEqual(sorted(get_selected_rows(editor)), [1, 2])
            self.assertEqual(sorted(report.selected_rows), [1, 2])
def test_table_editor_select_cells():
    gui = GUI()
    object_list = ObjectListWithSelection(
        values=[ListItem(value=str(i**2)) for i in range(10)]
    )
    object_list.selected_cells = [
        (object_list.values[5], 'value'),
        (object_list.values[6], 'other value'),
        (object_list.values[8], 'value'),
    ]

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=select_cells_view)
        editor = ui.get_editors('values')[0]
        gui.process_events()
        if is_current_backend_qt4():
            selected = editor.selected
        elif is_current_backend_wx():
            selected = editor.selected_cells

        press_ok_button(ui)
        gui.process_events()

    assert selected == [
        (object_list.values[5], 'value'),
        (object_list.values[6], 'other value'),
        (object_list.values[8], 'value'),
    ]
Beispiel #4
0
    def test_table_editor_select_cells(self):
        gui = GUI()
        object_list = ObjectListWithSelection(
            values=[ListItem(value=str(i**2)) for i in range(10)])
        object_list.selected_cells = [
            (object_list.values[5], "value"),
            (object_list.values[6], "other value"),
            (object_list.values[8], "value"),
        ]

        with store_exceptions_on_all_threads(), \
                create_ui(object_list, dict(view=select_cells_view)) as ui:
            editor = ui.get_editors("values")[0]
            gui.process_events()
            if is_current_backend_qt4():
                selected = editor.selected
            elif is_current_backend_wx():
                selected = editor.selected_cells

            press_ok_button(ui)
            gui.process_events()

        self.assertEqual(selected, [
            (object_list.values[5], "value"),
            (object_list.values[6], "other value"),
            (object_list.values[8], "value"),
        ])
def test_progress_column():
    from traitsui.extras.progress_column import ProgressColumn
    progress_view = View(
        Item(
            'values',
            show_label=False,
            editor=TableEditor(
                columns=[
                    ObjectColumn(name='value'),
                    ProgressColumn(name='other_value'),
                ],
            )
        ),
        buttons=['OK'],
    )
    gui = GUI()
    object_list = ObjectList(
        values=[ListItem(value=str(i**2)) for i in range(10)]
    )

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=progress_view)
        gui.process_events()
        press_ok_button(ui)
        gui.process_events()
    def test_tabular_editor_single_selection_changed(self):
        gui = GUI()

        with store_exceptions_on_all_threads(), \
                self.report_and_editor(get_view()) as (report, editor):
            gui.process_events()
            people = report.people

            self.assertEqual(get_selected_rows(editor), [])

            report.selected_row = 1
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [1])
            self.assertEqual(report.selected, people[1])

            report.selected = people[2]
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [2])
            self.assertEqual(report.selected_row, 2)

            # Selected set to invalid value doesn't change anything
            report.selected = Person(name="invalid", age=-1)
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [2])
            self.assertEqual(report.selected_row, 2)

            # -1 clears selection
            report.selected_row = -1
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [])
            self.assertEqual(report.selected, None)
Beispiel #7
0
 def test_styles(self):
     # simple smoke test of buttons
     gui = GUI()
     button_text_edit = ButtonTextEdit()
     with store_exceptions_on_all_threads():
         ui = button_text_edit.edit_traits()
         self.addCleanup(ui.dispose)
         gui.process_events()
 def test_styles(self):
     # simple smoke test of buttons
     gui = GUI()
     button_text_edit = ButtonTextEdit()
     with store_exceptions_on_all_threads():
         ui = button_text_edit.edit_traits()
         self.addCleanup(ui.dispose)
         gui.process_events()
Beispiel #9
0
    def setup_gui(self, model, view):
        gui = GUI()
        ui = model.edit_traits(view=view)
        self.addCleanup(ui.dispose)

        gui.process_events()
        editor = ui.get_editors("value")[0]

        return gui, editor
def test_table_editor():
    gui = GUI()
    object_list = ObjectList(values=[ListItem(value=str(i ** 2)) for i in range(10)])

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=simple_view)
        gui.process_events()
        press_ok_button(ui)
        gui.process_events()
Beispiel #11
0
 def setUpClass(cls):
     app = QtGui.QApplication.instance() or QtGui.QApplication([])
     person_view = View(body_html=body_html)
     fred = Person(name='Fred', age=42)
     person_view.show(model=fred)
     GUI.process_events()
     cls.person_view = person_view
     cls.fred = fred
     cls.app = app
Beispiel #12
0
    def test_table_editor(self):
        gui = GUI()
        object_list = ObjectListWithSelection(
            values=[ListItem(value=str(i**2)) for i in range(10)])

        with store_exceptions_on_all_threads(), \
                create_ui(object_list, dict(view=simple_view)) as ui:
            gui.process_events()
            press_ok_button(ui)
            gui.process_events()
Beispiel #13
0
def test_table_editor():
    gui = GUI()
    object_list = ObjectList(
        values=[ListItem(value=str(i**2)) for i in range(10)])

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=simple_view)
        gui.process_events()
        press_ok_button(ui)
        gui.process_events()
    def test_tabular_editor_multi_selection(self):
        gui = GUI()
        view = get_view(multi_select=True)

        with store_exceptions_on_all_threads(), \
                self.report_and_editor(view) as (report, editor):
            gui.process_events()
            people = report.people

            self.assertEqual(report.selected_rows, [])
            self.assertEqual(report.multi_selected, [])

            set_selected_multiple(editor, [0, 1])
            gui.process_events()

            self.assertEqual(report.selected_rows, [0, 1])
            self.assertEqual(report.multi_selected, people[:2])

            set_selected_multiple(editor, [2])
            gui.process_events()

            self.assertEqual(report.selected_rows, [2])
            self.assertEqual(report.multi_selected, [people[2]])

            clear_selection(editor)
            gui.process_events()

            self.assertEqual(report.selected_rows, [])
            self.assertEqual(report.multi_selected, [])
def test_filtered_table_editor():
    gui = GUI()
    object_list = ObjectListWithSelection(
        values=[ListItem(value=str(i**2)) for i in range(10)])

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=filtered_view)
        gui.process_events()

        filter = ui.get_editors("values")[0].filter

        press_ok_button(ui)
        gui.process_events()

    assert filter is not None
Beispiel #16
0
    def setup_gui(self, model, view):
        gui = GUI()
        ui = model.edit_traits(view=view)
        self.addCleanup(ui.dispose)

        gui.process_events()
        editor = ui.get_editors("value")[0]
        line_edit = editor.control

        # FIXME issue enthought/traitsui#851
        if is_current_backend_wx():
            import wx
            self.addCleanup(line_edit.Unbind, wx.EVT_KILL_FOCUS)

        return gui, editor, line_edit
Beispiel #17
0
    def test_filtered_table_editor(self):
        gui = GUI()
        object_list = ObjectListWithSelection(
            values=[ListItem(value=str(i**2)) for i in range(10)])

        with store_exceptions_on_all_threads(), \
                create_ui(object_list, dict(view=filtered_view)) as ui:
            gui.process_events()

            filter = ui.get_editors("values")[0].filter

            press_ok_button(ui)
            gui.process_events()

        self.assertIsNotNone(filter)
Beispiel #18
0
    def check_button_text_update(self, view):
        gui = GUI()
        button_text_edit = ButtonTextEdit()

        with store_exceptions_on_all_threads():
            ui = button_text_edit.edit_traits(view=view)
            self.addCleanup(ui.dispose)

            gui.process_events()
            editor, = ui.get_editors("play_button")
            button = editor.control

            self.assertEqual(get_button_text(button), "I'm a play button")

            button_text_edit.play_button_label = "New Label"
            self.assertEqual(get_button_text(button), "New Label")
Beispiel #19
0
def test_filtered_table_editor():
    gui = GUI()
    object_list = ObjectListWithSelection(
        values=[ListItem(value=str(i**2)) for i in range(10)]
    )

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=filtered_view)
        gui.process_events()

        filter = ui.get_editors('values')[0].filter

        press_ok_button(ui)
        gui.process_events()

    assert filter is not None
    def check_button_text_update(self, view):
        gui = GUI()
        button_text_edit = ButtonTextEdit()

        with store_exceptions_on_all_threads():
            ui = button_text_edit.edit_traits(view=view)
            self.addCleanup(ui.dispose)

            gui.process_events()
            editor, = ui.get_editors("play_button")
            button = editor.control

            self.assertEqual(get_button_text(button), "I'm a play button")

            button_text_edit.play_button_label = "New Label"
            self.assertEqual(get_button_text(button), "New Label")
    def test_list_str_editor_item_count(self):
        gui = GUI()
        model = ListStrModel()

        # Without auto_add
        with store_exceptions_on_all_threads(), \
                create_ui(model, dict(view=get_view())) as ui:
            gui.process_events()
            editor = ui.get_editors("value")[0]
            self.assertEqual(editor.item_count, 3)

        # With auto_add
        with store_exceptions_on_all_threads(), \
                create_ui(model, dict(view=get_view(auto_add=True))) as ui:
            gui.process_events()
            editor = ui.get_editors("value")[0]
            self.assertEqual(editor.item_count, 3)
Beispiel #22
0
    def check_enum_text_update(self, view):
        gui = GUI()
        enum_edit = EnumModel()

        with store_exceptions_on_all_threads():
            ui = enum_edit.edit_traits(view=view)
            self.addCleanup(ui.dispose)

            gui.process_events()
            editor = ui.get_editors("value")[0]
            combobox = editor.control

            self.assertEqual(get_combobox_text(combobox), "one")

            enum_edit.value = "two"
            gui.process_events()

            self.assertEqual(get_combobox_text(combobox), "two")
Beispiel #23
0
    def check_enum_text_update(self, view):
        gui = GUI()
        enum_edit = EnumModel()

        with store_exceptions_on_all_threads():
            ui = enum_edit.edit_traits(view=view)
            self.addCleanup(ui.dispose)

            gui.process_events()
            editor = ui.get_editors("value")[0]
            combobox = editor.control

            self.assertEqual(get_combobox_text(combobox), "one")

            enum_edit.value = "two"
            gui.process_events()

            self.assertEqual(get_combobox_text(combobox), "two")
def test_table_editor_select_cell_indices():
    gui = GUI()
    object_list = ObjectListWithSelection(
        values=[ListItem(value=str(i**2)) for i in range(10)])
    object_list.selected_cell_indices = [(5, 0), (6, 1), (8, 0)]

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=select_cell_indices_view)
        editor = ui.get_editors("values")[0]
        gui.process_events()
        if is_current_backend_qt4():
            selected = editor.selected_indices
        elif is_current_backend_wx():
            selected = editor.selected_cell_indices

        press_ok_button(ui)
        gui.process_events()

    assert selected == [(5, 0), (6, 1), (8, 0)]
Beispiel #25
0
    def test_table_editor_select_row_index(self):
        gui = GUI()
        object_list = ObjectListWithSelection(
            values=[ListItem(value=str(i**2)) for i in range(10)])
        object_list.selected_index = 5

        with store_exceptions_on_all_threads(), \
                create_ui(object_list, dict(view=select_row_index_view)) as ui:
            editor = ui.get_editors("values")[0]
            gui.process_events()
            if is_current_backend_qt4():
                selected = editor.selected_indices
            elif is_current_backend_wx():
                selected = editor.selected_row_index

            press_ok_button(ui)
            gui.process_events()

        self.assertEqual(selected, 5)
Beispiel #26
0
def test_table_editor_select_column_index():
    gui = GUI()
    object_list = ObjectListWithSelection(
        values=[ListItem(value=str(i**2)) for i in range(10)]
    )
    object_list.selected_index = 1

    with store_exceptions_on_all_threads():
        ui = object_list.edit_traits(view=select_column_index_view)
        editor = ui.get_editors('values')[0]
        gui.process_events()
        if is_current_backend_qt4():
            selected = editor.selected_indices
        elif is_current_backend_wx():
            selected = editor.selected_column_index

        press_ok_button(ui)
        gui.process_events()

    assert selected == 1
Beispiel #27
0
    def test_progress_column(self):
        from traitsui.extras.progress_column import ProgressColumn

        progress_view = View(
            Item(
                "values",
                show_label=False,
                editor=TableEditor(columns=[
                    ObjectColumn(name="value"),
                    ProgressColumn(name="other_value"),
                ]),
            ),
            buttons=["OK"],
        )
        gui = GUI()
        object_list = ObjectList(
            values=[ListItem(value=str(i**2)) for i in range(10)])

        with store_exceptions_on_all_threads(), \
                create_ui(object_list, dict(view=progress_view)) as ui:
            gui.process_events()
            press_ok_button(ui)
            gui.process_events()
    def test_tabular_editor_multi_selection_changed(self):
        gui = GUI()
        view = get_view(multi_select=True)

        with store_exceptions_on_all_threads(), \
                self.report_and_editor(view) as (report, editor):
            gui.process_events()
            people = report.people

            self.assertEqual(get_selected_rows(editor), [])

            report.selected_rows = [0, 1]
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [0, 1])
            self.assertEqual(report.multi_selected, people[:2])

            report.multi_selected = [people[2], people[0]]
            gui.process_events()

            self.assertEqual(sorted(get_selected_rows(editor)), [0, 2])
            self.assertEqual(sorted(report.selected_rows), [0, 2])

            # If there's a single invalid value, nothing is updated
            invalid_person = Person(name="invalid", age=-1)
            report.multi_selected = [people[2], invalid_person]
            gui.process_events()

            self.assertEqual(sorted(get_selected_rows(editor)), [0, 2])
            self.assertEqual(sorted(report.selected_rows), [0, 2])

            # Empty list clears selection
            report.selected_rows = []
            gui.process_events()

            self.assertEqual(get_selected_rows(editor), [])
            self.assertEqual(report.multi_selected, [])
    def test_tabular_editor_single_selection(self):
        gui = GUI()

        with store_exceptions_on_all_threads(), \
                self.report_and_editor(get_view()) as (report, editor):
            gui.process_events()
            people = report.people

            self.assertEqual(report.selected_row, -1)
            self.assertIsNone(report.selected)

            set_selected_single(editor, 1)
            gui.process_events()

            self.assertEqual(report.selected_row, 1)
            self.assertEqual(report.selected, people[1])

            set_selected_single(editor, 2)
            gui.process_events()

            self.assertEqual(report.selected_row, 2)
            self.assertEqual(report.selected, people[2])
Beispiel #30
0
class TestFieldAction(unittest.TestCase):
    def setUp(self):
        self.gui = GUI()

        self.parent = Window()
        self.parent._create()
        self.addCleanup(self._destroy_parent)

    def _destroy_parent(self):
        self.parent.destroy()
        self.parent = None

    def test_combo_field_action(self):
        # test whether function is called by updating list
        # XXX should really use mock
        memo = []

        def perform(value):
            memo.append(value)

        action = FieldAction(
            name="Dummy",
            field_type=ComboField,
            field_defaults={
                'values': ['a', 'b', 'c'],
                'value': 'a',
                'tooltip': 'Dummy',
            },
            on_perform=perform,
        )
        control = action.create_control(self.parent.control)
        try:
            self.gui.process_events()

            control._field.value = 'b'
            self.gui.process_events()

            self.assertEqual(memo, ['b'])
        finally:
            control._field.destroy()

    def test_text_field_action(self):
        # test whether function is called by updating list
        # XXX should really use mock
        memo = []

        def perform(value):
            memo.append(value)

        action = FieldAction(
            name="Dummy",
            field_type=TextField,
            field_defaults={
                'value': 'a',
                'tooltip': 'Dummy',
            },
            on_perform=perform,
        )
        control = action.create_control(self.parent.control)

        try:
            self.gui.process_events()

            control._field.value = 'b'
            self.gui.process_events()

            self.assertEqual(memo, ['b'])
        finally:
            control._field.destroy()

    def test_spin_field_action(self):
        # test whether function is called by updating list
        # XXX should really use mock
        memo = []

        def perform(value):
            memo.append(value)

        action = FieldAction(
            name="Dummy",
            field_type=SpinField,
            field_defaults={
                'value': 1,
                'bounds': (0, 100),
                'tooltip': 'Dummy',
            },
            on_perform=perform,
        )
        control = action.create_control(self.parent.control)

        try:
            self.gui.process_events()

            control._field.value = 5
            self.gui.process_events()

            self.assertEqual(memo, [5])
        finally:
            control._field.destroy()
Beispiel #31
0
class DockPaneToggleGroupTestCase(unittest.TestCase):
    @unittest.skipIf(USING_WX, "TaskWindowBackend is not implemented in WX")
    def setUp(self):
        self.gui = GUI()

        # Set up the bogus task with its window.
        self.task = BogusTask()

        self.window = window = TaskWindow()
        window.add_task(self.task)

        self.task_state = window._get_state(self.task)

        # Fish the dock pane toggle group from the menu bar manager.
        dock_pane_toggle_group = []

        def find_doc_pane_toggle(item):
            if item.id == "tests.bogus_task.DockPaneToggleGroup":
                dock_pane_toggle_group.append(item)

        self.task_state.menu_bar_manager.walk(find_doc_pane_toggle)

        self.dock_pane_toggle_group = dock_pane_toggle_group[0]

    def tearDown(self):
        del self.task
        del self.task_state
        del self.dock_pane_toggle_group

        if self.window.control is not None:
            self.window.destroy()
            self.gui.process_events()
        del self.window
        del self.gui

    def get_dock_pane_toggle_action_names(self):
        names = [
            action_item.action.name
            for action_item in self.dock_pane_toggle_group.items
        ]

        return names

    # Tests ----------------------------------------------------------------

    def test_group_content_at_startup(self):
        # Check that there are 2 dock panes in the group at the beginning.
        self.assertEqual(2, len(self.dock_pane_toggle_group.items))

        # Names are sorted by the group.
        names = self.get_dock_pane_toggle_action_names()
        expected_names = ["Dock Pane 1", "Dock Pane 2"]
        self.assertEqual(list(sorted(expected_names)), list(sorted(names)))

    def test_react_to_dock_pane_added(self):
        # Add a dock pane to the task.
        self.task_state.dock_panes.append(
            DockPane(id="tests.bogus_task.dock_pane_0", name="Dock Pane 0")
        )

        # Check that there are 3 dock panes in the group.
        self.assertEqual(3, len(self.dock_pane_toggle_group.items))

        # Names are sorted by the group.
        names = self.get_dock_pane_toggle_action_names()
        expected_names = ["Dock Pane 0", "Dock Pane 1", "Dock Pane 2"]
        self.assertEqual(list(sorted(expected_names)), list(sorted(names)))

    def test_react_to_dock_pane_removed(self):
        # Remove a dock pane from the task.
        self.task_state.dock_panes.remove(self.task.dock_panes[0])

        # Check that there is only 1 dock pane left in the group.
        self.assertEqual(1, len(self.dock_pane_toggle_group.items))

        names = self.get_dock_pane_toggle_action_names()
        expected_names = ["Dock Pane 1"]
        self.assertEqual(list(sorted(expected_names)), list(sorted(names)))
class TestTraitsUIWidgetAction(unittest.TestCase, UnittestTools):

    def setUp(self):
        self.gui = GUI()
        self.parent = Window()
        self.parent._create()
        self.parent.open()
        self.addCleanup(self._destroy_parent)
        self.gui.process_events()

    def _destroy_parent(self):
        self.parent.destroy()
        self.gui.process_events()
        self.parent = None

    def create_model(self):
        from traitsui.api import View, Item

        class SimpleEnum(HasTraits):
            value = Enum('a', 'b', 'c')
            view = View(Item('value'))

        return SimpleEnum()

    def test_traitsui_widget_action(self):
        from traitsui.api import View, Item

        class SimpleEnumAction(TraitsUIWidgetAction):
            value = Enum('a', 'b', 'c')
            view = View(Item('value'))

        action = SimpleEnumAction(name="Simple")
        control = action.create_control(self.parent.control)
        self.gui.process_events()

        editor = control._ui.get_editors('value')[0]

        with self.assertTraitChanges(action, 'value', count=1):
            if toolkit.toolkit in {'qt', 'qt4'}:
                editor.control.setCurrentIndex(1)
                editor.control.activated.emit(1)
            elif toolkit.toolkit == 'wx':
                import wx
                event = wx.CommandEvent(wx.EVT_CHOICE.typeId,
                                        editor.control.GetId())
                event.SetString('b')
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(action.value, 'b')

    def test_traitsui_widget_action_model(self):
        from traitsui.api import View, Item

        class SimpleEnumAction(TraitsUIWidgetAction):
            view = View(Item('value'))

        model = self.create_model()
        action = SimpleEnumAction(name="Simple", model=model)
        control = action.create_control(self.parent.control)
        self.gui.process_events()

        editor = control._ui.get_editors('value')[0]

        with self.assertTraitChanges(model, 'value', count=1):
            if toolkit.toolkit in {'qt', 'qt4'}:
                editor.control.setCurrentIndex(1)
                editor.control.activated.emit(1)
            elif toolkit.toolkit == 'wx':
                import wx
                event = wx.CommandEvent(wx.EVT_CHOICE.typeId,
                                        editor.control.GetId())
                event.SetString('b')
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(model.value, 'b')

    def test_traitsui_widget_action_model_view(self):
        from traitsui.api import HGroup, View, Item

        class ComplexEnumAction(TraitsUIWidgetAction):
            value = Enum('a', 'b', 'c')

            view = View(
                HGroup(
                    Item('value'),
                    Item('action.value'),
                )
            )

        model = self.create_model()
        action = ComplexEnumAction(name="Simple", model=model)
        control = action.create_control(self.parent.control)
        self.gui.process_events()

        editor = control._ui.get_editors('value')[0]

        with self.assertTraitChanges(model, 'value', count=1):
            if toolkit.toolkit in {'qt', 'qt4'}:
                editor.control.setCurrentIndex(1)
                editor.control.activated.emit(1)
            elif toolkit.toolkit == 'wx':
                import wx
                event = wx.CommandEvent(wx.EVT_CHOICE.typeId,
                                        editor.control.GetId())
                event.SetString('b')
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(model.value, 'b')

        editor = control._ui.get_editors('value')[1]

        with self.assertTraitChanges(action, 'value', count=1):
            if toolkit.toolkit in {'qt', 'qt4'}:
                editor.control.setCurrentIndex(2)
                editor.control.activated.emit(2)
            elif toolkit.toolkit == 'wx':
                event = wx.CommandEvent(wx.EVT_CHOICE.typeId,
                                        editor.control.GetId())
                event.SetString('c')
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(action.value, 'c')
Beispiel #33
0
class TestWindow(unittest.TestCase, UnittestTools):
    def setUp(self):
        self.gui = GUI()
        self.window = SplashScreen()

    def test_destroy(self):
        # test that destroy works even when no control
        self.window.destroy()

    def test_open_close(self):
        # test that opening and closing works as expected
        with self.assertTraitChanges(self.window, 'opening', count=1):
            with self.assertTraitChanges(self.window, 'opened', count=1):
                self.window.open()
        self.gui.process_events()
        with self.assertTraitChanges(self.window, 'closing', count=1):
            with self.assertTraitChanges(self.window, 'closed', count=1):
                self.window.close()
        self.gui.process_events()

    def test_show(self):
        # test that show works as expected
        self.window._create()
        self.window.show(True)
        self.gui.process_events()
        self.window.show(False)
        self.gui.process_events()
        self.window.destroy()

    def test_image(self):
        # test that images work
        self.window.image = ImageResource('core')
        with self.assertTraitChanges(self.window, 'opening', count=1):
            with self.assertTraitChanges(self.window, 'opened', count=1):
                self.window.open()
        self.gui.process_events()
        with self.assertTraitChanges(self.window, 'closing', count=1):
            with self.assertTraitChanges(self.window, 'closed', count=1):
                self.window.close()
        self.gui.process_events()

    def test_text(self):
        # test that images work
        self.window.text = "Splash screen"
        with self.assertTraitChanges(self.window, 'opening', count=1):
            with self.assertTraitChanges(self.window, 'opened', count=1):
                self.window.open()
        self.gui.process_events()
        with self.assertTraitChanges(self.window, 'closing', count=1):
            with self.assertTraitChanges(self.window, 'closed', count=1):
                self.window.close()
        self.gui.process_events()

    def test_text_changed(self):
        # test that images work
        # XXX this throws a non-failing exception on wx
        #     - probably the way the test is written.
        with self.assertTraitChanges(self.window, 'opening', count=1):
            with self.assertTraitChanges(self.window, 'opened', count=1):
                self.window.open()
        self.gui.process_events()
        self.window.text = "Splash screen"
        self.gui.process_events()
        with self.assertTraitChanges(self.window, 'closing', count=1):
            with self.assertTraitChanges(self.window, 'closed', count=1):
                self.window.close()
        self.gui.process_events()
Beispiel #34
0
class TestDialog(unittest.TestCase):

    def setUp(self):
        self.gui = GUI()
        self.dialog = ProgressDialog()

    def test_create(self):
        # test that creation and destruction works as expected
        self.dialog._create()
        self.gui.process_events()
        self.assertIsNotNone(self.dialog.control)
        self.assertIsNotNone(self.dialog.progress_bar)
        self.assertIsNotNone(self.dialog._message_control)
        self.assertIsNone(self.dialog._elapsed_control)
        self.assertIsNone(self.dialog._estimated_control)
        self.assertIsNone(self.dialog._remaining_control)
        self.dialog.destroy()

    def test_show_time(self):
        # test that creation works with show_time
        self.dialog.show_time =  True
        self.dialog._create()
        self.gui.process_events()
        self.assertIsNotNone(self.dialog._elapsed_control)
        self.assertIsNotNone(self.dialog._estimated_control)
        self.assertIsNotNone(self.dialog._remaining_control)
        self.dialog.destroy()

    def test_show_percent(self):
        # test that creation works with show_percent
        self.dialog.show_percent =  True
        self.dialog._create()
        self.gui.process_events()
        self.assertEqual(self.dialog.progress_bar.format(), "%p%")
        self.dialog.destroy()

    def test_update(self):
        self.dialog.min = 0
        self.dialog.max = 10
        self.dialog.open()
        for i in range(11):
            result = self.dialog.update(i)
            self.gui.process_events()
            self.assertEqual(result, (True, False))
            if i < 10:
                self.assertEqual(self.dialog.progress_bar.value(), i)
        self.assertIsNone(self.dialog.control)

    def test_update_no_control(self):
        # note: inconsistent implementation with Wx
        self.dialog.min = 0
        self.dialog.max = 10
        result = self.dialog.update(1)
        self.assertEqual(result, (None, None))

    def test_change_message(self):
        self.dialog.min = 0
        self.dialog.max = 10
        self.dialog.open()
        for i in range(11):
            self.dialog.change_message('Updating {}'.format(i))
            result = self.dialog.update(i)
            self.gui.process_events()
            self.assertEqual(result, (True, False))
            self.assertEqual(self.dialog.message, 'Updating {}'.format(i))
            self.assertEqual(self.dialog._message_control.text(),
                             'Updating {}'.format(i))
        self.assertIsNone(self.dialog.control)

    def test_change_message_trait(self):
        self.dialog.min = 0
        self.dialog.max = 10
        self.dialog.open()
        for i in range(11):
            self.dialog.message = 'Updating {}'.format(i)
            result = self.dialog.update(i)
            self.gui.process_events()
            self.assertEqual(result, (True, False))
            self.assertEqual(self.dialog.message, 'Updating {}'.format(i))
            self.assertEqual(self.dialog._message_control.text(),
                             'Updating {}'.format(i))
        self.assertIsNone(self.dialog.control)

    def test_update_show_time(self):
        self.dialog.min = 0
        self.dialog.max = 10
        self.dialog.show_time = True
        self.dialog.open()
        for i in range(11):
            result = self.dialog.update(i)
            self.gui.process_events()
            self.assertEqual(result, (True, False))
            self.assertNotEqual(self.dialog._elapsed_control.text(), "")
            self.assertNotEqual(self.dialog._estimated_control.text(), "")
            self.assertNotEqual(self.dialog._remaining_control.text(), "")
        self.assertIsNone(self.dialog.control)
Beispiel #35
0
class TestTraitsUIWidgetAction(unittest.TestCase, UnittestTools):
    def setUp(self):
        self.gui = GUI()
        self.parent = Window()
        self.parent._create()
        self.parent.open()
        self.addCleanup(self._destroy_parent)
        self.gui.process_events()

    def _destroy_parent(self):
        self.parent.destroy()
        self.gui.process_events()
        self.parent = None

    def create_model(self):
        from traitsui.api import View, Item

        class SimpleEnum(HasTraits):
            value = Enum("a", "b", "c")
            view = View(Item("value"))

        return SimpleEnum()

    def test_traitsui_widget_action(self):
        from traitsui.api import View, Item

        class SimpleEnumAction(TraitsUIWidgetAction):
            value = Enum("a", "b", "c")
            view = View(Item("value"))

        action = SimpleEnumAction(name="Simple")
        control = action.create_control(self.parent.control)
        self.gui.process_events()

        editor = control._ui.get_editors("value")[0]

        with self.assertTraitChanges(action, "value", count=1):
            if toolkit.toolkit in {"qt", "qt4"}:
                editor.control.setCurrentIndex(1)
                editor.control.activated.emit(1)
            elif toolkit.toolkit == "wx":
                import wx

                event = wx.CommandEvent(
                    wx.EVT_CHOICE.typeId, editor.control.GetId()
                )
                event.SetString("b")
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(action.value, "b")

    def test_traitsui_widget_action_model(self):
        from traitsui.api import View, Item

        class SimpleEnumAction(TraitsUIWidgetAction):
            view = View(Item("value"))

        model = self.create_model()
        action = SimpleEnumAction(name="Simple", model=model)
        control = action.create_control(self.parent.control)
        self.gui.process_events()

        editor = control._ui.get_editors("value")[0]

        with self.assertTraitChanges(model, "value", count=1):
            if toolkit.toolkit in {"qt", "qt4"}:
                editor.control.setCurrentIndex(1)
                editor.control.activated.emit(1)
            elif toolkit.toolkit == "wx":
                import wx

                event = wx.CommandEvent(
                    wx.EVT_CHOICE.typeId, editor.control.GetId()
                )
                event.SetString("b")
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(model.value, "b")

    def test_traitsui_widget_action_model_view(self):
        from traitsui.api import HGroup, View, Item

        class ComplexEnumAction(TraitsUIWidgetAction):
            value = Enum("a", "b", "c")

            view = View(HGroup(Item("value"), Item("action.value")))

        model = self.create_model()
        action = ComplexEnumAction(name="Simple", model=model)
        control = action.create_control(self.parent.control)
        self.gui.process_events()

        editor = control._ui.get_editors("value")[0]

        with self.assertTraitChanges(model, "value", count=1):
            if toolkit.toolkit in {"qt", "qt4"}:
                editor.control.setCurrentIndex(1)
                editor.control.activated.emit(1)
            elif toolkit.toolkit == "wx":
                import wx

                event = wx.CommandEvent(
                    wx.EVT_CHOICE.typeId, editor.control.GetId()
                )
                event.SetString("b")
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(model.value, "b")

        editor = control._ui.get_editors("value")[1]

        with self.assertTraitChanges(action, "value", count=1):
            if toolkit.toolkit in {"qt", "qt4"}:
                editor.control.setCurrentIndex(2)
                editor.control.activated.emit(2)
            elif toolkit.toolkit == "wx":
                event = wx.CommandEvent(
                    wx.EVT_CHOICE.typeId, editor.control.GetId()
                )
                event.SetString("c")
                wx.PostEvent(editor.control.GetEventHandler(), event)
            else:
                self.skipTest("Unknown toolkit")
            self.gui.process_events()

        self.assertEqual(action.value, "c")
Beispiel #36
0
 def execute_js(self, js):
     GUI.process_events()
     result = self.bridge.widget.execute_js(js)
     GUI.process_events()
     return result
Beispiel #37
0
class WidgetMixin(UnittestTools):
    """ Mixin which provides standard methods for all widgets. """
    def setUp(self):
        self.gui = GUI()

        self.parent = self._create_parent()
        self.parent._create()
        self.addCleanup(self._destroy_parent)
        self.gui.process_events()

        self.widget = self._create_widget()

        self.parent.open()
        self.gui.process_events()

    def _create_parent(self):
        return Window()

    def _create_widget(self):
        raise NotImplementedError()

    def _create_widget_control(self):
        self.widget._create()
        self.addCleanup(self._destroy_widget)
        self.widget.show(True)
        self.gui.process_events()

    def _destroy_parent(self):
        self.parent.destroy()
        self.gui.process_events()
        self.parent = None

    def _destroy_widget(self):
        self.widget.destroy()
        self.gui.process_events()
        self.widget = None

    def test_widget_tooltip(self):
        self._create_widget_control()
        self.widget.tooltip = "New tooltip."
        self.gui.process_events()

        self.assertEqual(self.widget._get_control_tooltip(), "New tooltip.")

    def test_widget_tooltip_cleanup(self):
        widget = self._create_widget()
        with patch.object(widget, '_tooltip_updated',
                          return_value=None) as updated:
            widget._create()
            try:
                widget.show(True)
                self.gui.process_events()
            finally:
                widget.destroy()
                self.gui.process_events()

            widget.tooltip = "New tooltip."

            updated.assert_not_called()

        widget = None

    def test_widget_menu(self):
        self._create_widget_control()
        self.widget.context_menu = MenuManager(Action(name="Test"),
                                               name="Test")

        self.gui.process_events()

    def test_widget_context_menu_cleanup(self):
        widget = self._create_widget()
        with patch.object(widget, '_context_menu_updated',
                          return_value=None) as updated:
            widget._create()
            try:
                widget.show(True)
                self.gui.process_events()
            finally:
                widget.destroy()
                self.gui.process_events()

            widget.context_menu = MenuManager(Action(name="Test"), name="Test")

            updated.assert_not_called()

        widget = None
Beispiel #38
0
class ScrollBarTest(unittest.TestCase):

    def setUp(self):
        if NativeScrollBar is None:
            raise unittest.SkipTest("Qt4 NativeScrollbar not available.")
        self.gui = GUI()
        self.container = Container(position=[0, 0], bounds=[600, 600])
        self.window = Window(None, size=(600, 600), component=self.container)

    @contextmanager
    def setup_window(self, window):
        window.control.show()
        window._size = window._get_control_size()
        self.gui.process_events()
        try:
            yield
        finally:
            window.control.destroy()

    @contextmanager
    def setup_scrollbar(self, scrollbar, window):
        scrollbar._draw_mainlayer(window._gc)
        try:
            yield
        finally:
            scrollbar.destroy()

    def test_scroll_position_horizontal(self):
        bounds = [600.0, 30.0]
        position = [0.0, 0.0]
        range = [600, 0.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='horizontal',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 0)
                self.assertEqual(scrollbar.scroll_position, 0)

                # move the scrollbar
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 100)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 200)

    def test_scroll_position_vertical(self):
        bounds = [30.0, 600.0]
        position = [0.0, 0.0]
        range = [600, 0.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='vertical',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 600-375)
                self.assertEqual(scrollbar.scroll_position, 0)

                # move the scrollbar
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 600-375-100)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 600-375-200)

    def test_minumum_horizontal(self):
        bounds = [600.0, 30.0]
        position = [0.0, 0.0]
        range = [700, 100.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='horizontal',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 100)
                self.assertEqual(scrollbar.scroll_position, 100)

                # move the scrollbar
                scrollbar._control.setValue(200)
                self.assertEqual(scrollbar.scroll_position, 200)

                # set the scroll & redraw
                scrollbar.scroll_position = 300
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 300)

    def test_minimum_vertical(self):
        bounds = [30.0, 600.0]
        position = [0.0, 0.0]
        range = [700, 100.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='vertical',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                # control should be at top
                self.assertEqual(scrollbar._control.value(), 700-375)
                self.assertEqual(scrollbar.scroll_position, 100)

                # move the scrollbar to the bottom
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 700-375)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 700-375-(200-100))
Beispiel #39
0
class TestFieldAction(unittest.TestCase):

    def setUp(self):
        self.gui = GUI()

        self.parent = Window()
        self.parent._create()
        self.addCleanup(self._destroy_parent)

    def _destroy_parent(self):
        self.parent.destroy()
        self.parent = None

    def test_combo_field_action(self):
        # test whether function is called by updating list
        # XXX should really use mock
        memo = []

        def perform(value):
            memo.append(value)

        action = FieldAction(
            name="Dummy",
            field_type=ComboField,
            field_defaults={
                'values': ['a', 'b', 'c'],
                'value': 'a',
                'tooltip': 'Dummy',
            },
            on_perform=perform,
        )
        control = action.create_control(self.parent.control)
        try:
            self.gui.process_events()

            control._field.value = 'b'
            self.gui.process_events()

            self.assertEqual(memo, ['b'])
        finally:
            control._field.destroy()

    def test_text_field_action(self):
        # test whether function is called by updating list
        # XXX should really use mock
        memo = []

        def perform(value):
            memo.append(value)

        action = FieldAction(
            name="Dummy",
            field_type=TextField,
            field_defaults={
                'value': 'a',
                'tooltip': 'Dummy',
            },
            on_perform=perform,
        )
        control = action.create_control(self.parent.control)

        try:
            self.gui.process_events()

            control._field.value = 'b'
            self.gui.process_events()

            self.assertEqual(memo, ['b'])
        finally:
            control._field.destroy()

    def test_spin_field_action(self):
        # test whether function is called by updating list
        # XXX should really use mock
        memo = []

        def perform(value):
            memo.append(value)

        action = FieldAction(
            name="Dummy",
            field_type=SpinField,
            field_defaults={
                'value': 1,
                'bounds': (0, 100),
                'tooltip': 'Dummy',
            },
            on_perform=perform,
        )
        control = action.create_control(self.parent.control)

        try:
            self.gui.process_events()

            control._field.value = 5
            self.gui.process_events()

            self.assertEqual(memo, [5])
        finally:
            control._field.destroy()
Beispiel #40
0
class ScrollBarTest(unittest.TestCase):
    def setUp(self):
        from pyface.qt.QtGui import QApplication
        from pyface.ui.qt4.util.event_loop_helper import EventLoopHelper

        qt_app = QApplication.instance()
        if qt_app is None:
            qt_app = QApplication([])
        self.qt_app = qt_app

        if NativeScrollBar is None:
            raise unittest.SkipTest("Qt4 NativeScrollbar not available.")
        self.gui = GUI()
        self.event_loop_helper = EventLoopHelper(gui=self.gui, qt_app=qt_app)
        self.container = Container(position=[0, 0], bounds=[600, 600])
        self.window = Window(None, size=(600, 600), component=self.container)

    @contextmanager
    def setup_window(self, window):
        window.control.show()
        window._size = window._get_control_size()
        self.gui.process_events()
        try:
            yield
        finally:
            self.gui.process_events()
            with self.event_loop_helper.delete_widget(window.control, timeout=1.0):
                window.control.deleteLater()

    @contextmanager
    def setup_scrollbar(self, scrollbar, window):
        scrollbar._draw_mainlayer(window._gc)
        try:
            yield
        finally:
            scrollbar.destroy()

    def test_scroll_position_horizontal(self):
        bounds = [600.0, 30.0]
        position = [0.0, 0.0]
        range = [600, 0.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(orientation="horizontal", bounds=bounds, position=position, range=range)
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 0)
                self.assertEqual(scrollbar.scroll_position, 0)

                # move the scrollbar
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 100)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 200)

    def test_scroll_position_vertical(self):
        bounds = [30.0, 600.0]
        position = [0.0, 0.0]
        range = [600, 0.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(orientation="vertical", bounds=bounds, position=position, range=range)
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 600 - 375)
                self.assertEqual(scrollbar.scroll_position, 0)

                # move the scrollbar
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 600 - 375 - 100)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 600 - 375 - 200)

    def test_minumum_horizontal(self):
        bounds = [600.0, 30.0]
        position = [0.0, 0.0]
        range = [700, 100.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(orientation="horizontal", bounds=bounds, position=position, range=range)
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 100)
                self.assertEqual(scrollbar.scroll_position, 100)

                # move the scrollbar
                scrollbar._control.setValue(200)
                self.assertEqual(scrollbar.scroll_position, 200)

                # set the scroll & redraw
                scrollbar.scroll_position = 300
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 300)

    def test_minimum_vertical(self):
        bounds = [30.0, 600.0]
        position = [0.0, 0.0]
        range = [700, 100.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(orientation="vertical", bounds=bounds, position=position, range=range)
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                # control should be at top
                self.assertEqual(scrollbar._control.value(), 700 - 375)
                self.assertEqual(scrollbar.scroll_position, 100)

                # move the scrollbar to the bottom
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 700 - 375)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 700 - 375 - (200 - 100))
Beispiel #41
0
class TestWidget(unittest.TestCase, UnittestTools):
    def setUp(self):
        self.gui = GUI()

        self.parent = Window()
        self.parent._create()
        self.addCleanup(self._destroy_parent)
        self.gui.process_events()

        self.widget = self._create_widget()

        self.parent.open()
        self.gui.process_events()

    def _create_widget(self):
        self.data = np.arange(120.0).reshape(4, 5, 6)
        self.model = ArrayDataModel(data=self.data, value_type=FloatValue())
        return DataViewWidget(parent=self.parent.control,
                              data_model=self.model)

    def _create_widget_control(self):
        self.widget._create()
        self.addCleanup(self._destroy_widget)
        self.parent.show(True)
        self.gui.process_events()

    def _destroy_parent(self):
        self.parent.destroy()
        self.gui.process_events()
        self.parent = None

    def _destroy_widget(self):
        self.widget.destroy()
        self.gui.process_events()
        self.widget = None

    def test_defaults(self):
        self.assertTrue(self.widget.header_visible)

    def test_lifecycle(self):
        self._create_widget_control()

    def test_header_visible(self):
        self._create_widget_control()

        self.assertTrue(self.widget._get_control_header_visible())

        self.widget.header_visible = False
        self.gui.process_events()

        self.assertFalse(self.widget._get_control_header_visible())

    def test_header_visible_before_control(self):
        self.widget.header_visible = False

        self._create_widget_control()
        self.assertFalse(self.widget._get_control_header_visible())

    def test_init_selection(self):
        self.widget.selection = [((1, ), ())]
        self._create_widget_control()

        self.assertEqual(self.widget._get_control_selection(), [((1, ), ())])

    def test_selection_mode_change(self):
        self._create_widget_control()
        self.widget.selection = [((1, 4), ()), ((2, 0), ())]

        self.widget.selection_mode = "single"

        self.assertEqual(self.widget._get_control_selection_mode(), "single")
        self.assertEqual(self.widget.selection, [])

        self.widget.selection = [((1, 4), ())]
        if "none" in selection_modes:
            self.widget.selection_mode = "none"

            self.assertEqual(self.widget._get_control_selection_mode(), "none")
            self.assertEqual(self.widget.selection, [])

        self.widget.selection_mode = "extended"

        self.assertEqual(self.widget._get_control_selection_mode(), "extended")
        self.assertEqual(self.widget.selection, [])

    @unittest.skipIf(
        len(selection_types) <= 1,
        "Changing selection types not supported",
    )
    def test_selection_type_change(self):
        self._create_widget_control()

        if "column" in selection_types:
            self.widget.selection_type = "column"
            self.assertEqual(
                self.widget._get_control_selection_type(),
                "column",
            )
            self.assertEqual(self.widget.selection, [])

        if "item" in selection_types:
            self.widget.selection_type = "item"
            self.assertEqual(self.widget._get_control_selection_type(), "item")
            self.assertEqual(self.widget.selection, [])

        if "row" in selection_types:
            self.widget.selection_type = "row"

            self.assertEqual(self.widget._get_control_selection_type(), "row")
            self.assertEqual(self.widget.selection, [])

    @unittest.skipIf(
        "none" not in selection_modes,
        "Selection mode 'none' not supported",
    )
    def test_selection_mode_none(self):
        self.widget.selection_mode = "none"
        self._create_widget_control()

        self.assertEqual(self.widget._get_control_selection_mode(), "none")

        self.widget.selection = []
        self.gui.process_events()

        self.assertEqual(self.widget.selection, [])
        self.assertEqual(self.widget._get_control_selection(), [])

    @unittest.skipIf(
        "none" not in selection_modes,
        "Selection mode 'none' not supported",
    )
    def test_selection_mode_none_invalid(self):
        self.widget.selection_mode = "none"
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 4), ()), (2, 1), ()]

    def test_selection_mode_single(self):
        self.widget.selection_mode = "single"
        self._create_widget_control()

        self.assertEqual(self.widget._get_control_selection_mode(), "single")

        self.widget.selection = [((1, 4), ())]
        self.gui.process_events()

        self.assertEqual(self.widget.selection, [((1, 4), ())])
        self.assertEqual(self.widget._get_control_selection(), [((1, 4), ())])

    def test_selection_mode_single_invalid(self):
        self.widget.selection_mode = "single"
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 4), ()), (2, 1), ()]

    @unittest.skipIf(
        is_wx and is_linux,
        "Selection mode 'extended' not working on Linux",
    )
    def test_selection_mode_extended(self):
        self._create_widget_control()

        self.assertEqual(self.widget._get_control_selection_mode(), "extended")

        self.widget.selection = [((1, 4), ()), ((2, 0), ())]
        self.gui.process_events()

        self.assertEqual(self.widget.selection, [((1, 4), ()), ((2, 0), ())])
        self.assertEqual(
            self.widget._get_control_selection(),
            [((1, 4), ()), ((2, 0), ())],
        )

    @unittest.skipIf(
        'column' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_column(self):
        self.widget.selection_type = "column"
        self._create_widget_control()

        self.assertEqual(self.widget._get_control_selection_type(), "column")

        self.widget.selection = [((0, ), (2, )), ((1, ), (4, ))]

        self.gui.process_events()

        self.assertEqual(self.widget.selection, [((0, ), (2, )),
                                                 ((1, ), (4, ))])
        self.assertEqual(self.widget._get_control_selection(),
                         [((0, ), (2, )), ((1, ), (4, ))])

    @unittest.skipIf(
        'item' not in selection_types,
        "Selection type 'item' not supported",
    )
    def test_selection_type_item(self):
        self.widget.selection_type = "item"
        self._create_widget_control()

        self.assertEqual(self.widget._get_control_selection_type(), "item")

        self.widget.selection = [((1, 4), (2, )), ((2, 0), (4, ))]
        self.gui.process_events()

        self.assertEqual(self.widget.selection, [((1, 4), (2, )),
                                                 ((2, 0), (4, ))])
        self.assertEqual(
            self.widget._get_control_selection(),
            [((1, 4), (2, )), ((2, 0), (4, ))],
        )

    def test_selection_type_row_invalid_row_big(self):
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((10, ), ())]

    def test_selection_type_row_invalid_row_long(self):
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 1, 1), ())]

    def test_selection_type_row_invalid_column(self):
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 2), (2, ))]

    @unittest.skipIf(
        'item' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_item_invalid_row_too_big(self):
        self.widget.selection_type = 'item'
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 10), (2, ))]

    @unittest.skipIf(
        'item' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_item_invalid_row_too_long(self):
        self.widget.selection_type = 'item'
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 4, 5, 6), (2, ))]

    @unittest.skipIf(
        'item' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_item_invalid_column(self):
        self.widget.selection_type = 'item'
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 2), (10, ))]

    @unittest.skipIf(
        'column' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_column_invalid_row_too_long(self):
        self.widget.selection_type = 'column'
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 4, 5, 6), (2, ))]

    @unittest.skipIf(
        'column' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_column_invalid_row_too_big(self):
        self.widget.selection_type = 'column'
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((10, ), (2, ))]

    @unittest.skipIf(
        'column' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_column_invalid_row_not_parent(self):
        self.widget.selection_type = 'column'
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((1, 2), (2, ))]

    @unittest.skipIf(
        'column' not in selection_types,
        "Selection type 'column' not supported",
    )
    def test_selection_type_column_invalid_column(self):
        self.widget.selection_type = 'column'
        self._create_widget_control()

        with self.assertRaises(TraitError):
            self.widget.selection = [((), (10, ))]

    def test_selection_updated(self):
        self._create_widget_control()

        with self.assertTraitChanges(self.widget, 'selection'):
            self.widget._set_control_selection([((1, 4), ())])
            self.gui.process_events()

        self.assertEqual(self.widget.selection, [((1, 4), ())])
        self.assertEqual(
            self.widget._get_control_selection(),
            [((1, 4), ())],
        )

    def test_selection_updating_context_manager(self):
        self.assertFalse(self.widget._selection_updating_flag)

        with self.widget._selection_updating():
            self.assertTrue(self.widget._selection_updating_flag)
            with self.widget._selection_updating():
                self.assertTrue(self.widget._selection_updating_flag)
            self.assertTrue(self.widget._selection_updating_flag)

        self.assertFalse(self.widget._selection_updating_flag)

    def test_selection_updating_context_manager_exception(self):
        with self.assertRaises(ZeroDivisionError):
            with self.widget._selection_updating():
                with self.widget._selection_updating():
                    1 / 0

        self.assertFalse(self.widget._selection_updating_flag)
Beispiel #42
0
class ScrollBarTest(unittest.TestCase):
    def setUp(self):
        from pyface.qt.QtGui import QApplication
        from pyface.ui.qt4.util.event_loop_helper import EventLoopHelper

        qt_app = QApplication.instance()
        if qt_app is None:
            qt_app = QApplication([])
        self.qt_app = qt_app

        if NativeScrollBar is None:
            raise unittest.SkipTest("Qt4 NativeScrollbar not available.")
        self.gui = GUI()
        self.event_loop_helper = EventLoopHelper(gui=self.gui, qt_app=qt_app)
        self.container = Container(position=[0, 0], bounds=[600, 600])
        self.window = Window(None, size=(600, 600), component=self.container)

    @contextmanager
    def setup_window(self, window):
        window.control.show()
        window._size = window._get_control_size()
        self.gui.process_events()
        try:
            yield
        finally:
            self.gui.process_events()
            with self.event_loop_helper.delete_widget(window.control,
                                                      timeout=1.0):
                window.control.deleteLater()

    @contextmanager
    def setup_scrollbar(self, scrollbar, window):
        scrollbar._draw_mainlayer(window._gc)
        try:
            yield
        finally:
            scrollbar.destroy()

    def test_scroll_position_horizontal(self):
        bounds = [600.0, 30.0]
        position = [0.0, 0.0]
        range = [600, 0.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='horizontal',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 0)
                self.assertEqual(scrollbar.scroll_position, 0)

                # move the scrollbar
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 100)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 200)

    def test_scroll_position_vertical(self):
        bounds = [30.0, 600.0]
        position = [0.0, 0.0]
        range = [600, 0.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='vertical',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 600 - 375)
                self.assertEqual(scrollbar.scroll_position, 0)

                # move the scrollbar
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 600 - 375 - 100)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 600 - 375 - 200)

    def test_minumum_horizontal(self):
        bounds = [600.0, 30.0]
        position = [0.0, 0.0]
        range = [700, 100.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='horizontal',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                self.assertEqual(scrollbar._control.value(), 100)
                self.assertEqual(scrollbar.scroll_position, 100)

                # move the scrollbar
                scrollbar._control.setValue(200)
                self.assertEqual(scrollbar.scroll_position, 200)

                # set the scroll & redraw
                scrollbar.scroll_position = 300
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(), 300)

    def test_minimum_vertical(self):
        bounds = [30.0, 600.0]
        position = [0.0, 0.0]
        range = [700, 100.0, 375.0, 20.454545454545453]
        scrollbar = NativeScrollBar(
            orientation='vertical',
            bounds=bounds,
            position=position,
            range=range,
        )
        self.container.add(scrollbar)
        with self.setup_window(self.window):
            with self.setup_scrollbar(scrollbar, self.window):
                # control should be at top
                self.assertEqual(scrollbar._control.value(), 700 - 375)
                self.assertEqual(scrollbar.scroll_position, 100)

                # move the scrollbar to the bottom
                scrollbar._control.setValue(100)
                self.assertEqual(scrollbar.scroll_position, 700 - 375)

                # set the scroll & redraw
                scrollbar.scroll_position = 200
                scrollbar._draw_mainlayer(self, self.window._gc)
                self.assertEqual(scrollbar._control.value(),
                                 700 - 375 - (200 - 100))
Beispiel #43
0
class FieldMixin(UnittestTools):
    """ Mixin which provides standard methods for all fields. """
    def setUp(self):
        self.gui = GUI()

        self.parent = Window()
        self.parent._create()
        self.addCleanup(self._destroy_parent)
        self.gui.process_events()

        self.widget = self._create_widget()

        self.parent.open()
        self.gui.process_events()

    def _create_widget(self):
        raise NotImplementedError()

    def _create_widget_control(self):
        self.widget._create()
        self.addCleanup(self._destroy_widget)
        self.widget.show(True)
        self.gui.process_events()

    def _destroy_parent(self):
        self.parent.destroy()
        self.gui.process_events()
        self.parent = None

    def _destroy_widget(self):
        self.widget.destroy()
        self.gui.process_events()
        self.widget = None

    # Tests ------------------------------------------------------------------

    def test_field_tooltip(self):
        self._create_widget_control()
        self.widget.tooltip = "New tooltip."
        self.gui.process_events()

        self.assertEqual(self.widget._get_control_tooltip(), "New tooltip.")

    def test_field_menu(self):
        self._create_widget_control()
        self.widget.menu = MenuManager(Action(name="Test"), name="Test")
        self.gui.process_events()
class DockPaneToggleGroupTestCase(unittest.TestCase):

    @unittest.skipIf(USING_WX, "TaskWindowBackend is not implemented in WX")
    def setUp(self):
        self.gui = GUI()

        # Set up the bogus task with its window.
        self.task = BogusTask()

        self.window = window = TaskWindow()
        window.add_task(self.task)

        self.task_state = window._get_state(self.task)

        # Fish the dock pane toggle group from the menu bar manager.
        dock_pane_toggle_group = []
        def find_doc_pane_toggle(item):
            if item.id == 'tests.bogus_task.DockPaneToggleGroup':
                dock_pane_toggle_group.append(item)

        self.task_state.menu_bar_manager.walk(find_doc_pane_toggle)

        self.dock_pane_toggle_group = dock_pane_toggle_group[0]

    def tearDown(self):
        del self.task
        del self.task_state
        del self.dock_pane_toggle_group

        if self.window.control is not None:
            self.window.destroy()
            self.gui.process_events()
        del self.window
        del self.gui


    def get_dock_pane_toggle_action_names(self):
        names =  [
            action_item.action.name
            for action_item in self.dock_pane_toggle_group.items
        ]

        return names

    #### Tests ################################################################

    def test_group_content_at_startup(self):
        # Check that there are 2 dock panes in the group at the beginning.
        self.assertEqual(2, len(self.dock_pane_toggle_group.items))

        # Names are sorted by the group.
        names = self.get_dock_pane_toggle_action_names()
        expected_names = ['Dock Pane 1', 'Dock Pane 2']
        self.assertEqual(list(sorted(expected_names)), list(sorted(names)))

    def test_react_to_dock_pane_added(self):
        # Add a dock pane to the task.
        self.task_state.dock_panes.append(
            DockPane(id='tests.bogus_task.dock_pane_0', name='Dock Pane 0')
        )

        # Check that there are 3 dock panes in the group.
        self.assertEqual(3, len(self.dock_pane_toggle_group.items))

        # Names are sorted by the group.
        names = self.get_dock_pane_toggle_action_names()
        expected_names = ['Dock Pane 0', 'Dock Pane 1', 'Dock Pane 2']
        self.assertEqual(list(sorted(expected_names)), list(sorted(names)))

    def test_react_to_dock_pane_removed(self):
        # Remove a dock pane from the task.
        self.task_state.dock_panes.remove(self.task.dock_panes[0])

        # Check that there is only 1 dock pane left in the group.
        self.assertEqual(1, len(self.dock_pane_toggle_group.items))

        names = self.get_dock_pane_toggle_action_names()
        expected_names = ['Dock Pane 1']
        self.assertEqual(list(sorted(expected_names)), list(sorted(names)))
Beispiel #45
0
class FieldMixin(UnittestTools):
    """ Mixin which provides standard methods for all fields. """

    def setUp(self):
        self.gui = GUI()

        self.parent = Window()
        self.parent._create()
        self.addCleanup(self._destroy_parent)
        self.gui.process_events()

        self.widget = self._create_widget()

        self.parent.open()
        self.gui.process_events()

    def _create_widget(self):
        raise NotImplementedError()

    def _create_widget_control(self):
        self.widget._create()
        self.addCleanup(self._destroy_widget)
        self.widget.show(True)
        self.gui.process_events()

    def _destroy_parent(self):
        self.parent.destroy()
        self.gui.process_events()
        self.parent = None

    def _destroy_widget(self):
        self.widget.destroy()
        self.gui.process_events()
        self.widget = None

    # Tests ------------------------------------------------------------------

    def test_field_tooltip(self):
        self._create_widget_control()
        self.widget.tooltip = "New tooltip."
        self.gui.process_events()

        self.assertEqual(self.widget._get_control_tooltip(), "New tooltip.")

    def test_field_menu(self):
        self._create_widget_control()
        self.widget.menu = MenuManager(Action(name='Test'), name='Test')
        self.gui.process_events()