def test_simple_editor_popup_editor(self):
        enum_edit = EnumModel()

        with reraise_exceptions(), self.setup_gui(
                enum_edit, get_view("simple")) as editor:

            self.assertEqual(enum_edit.value, 'top left')

            # Set up ImageEnumDialog
            click_on_image(editor.control)
            process_cascade_events()

            # Check created buttons
            image_grid_control = editor.control.GetChildren()[0].GetChildren(
            )[0]
            self.assertEqual(
                get_button_strings(image_grid_control),
                ['top left', 'top right', 'bottom left', 'bottom right'],
            )

            # Select new image
            click_on_image(get_button_control(image_grid_control, 1))
            process_cascade_events()

            self.assertEqual(enum_edit.value, 'top right')

            # Check that dialog window is closed
            self.assertEqual(list(editor.control.GetChildren()), [])
Example #2
0
    def test_table_editor(self):
        object_list = ObjectListWithSelection(
            values=[ListItem(value=str(i**2)) for i in range(10)])

        with reraise_exceptions(), \
                create_ui(object_list, dict(view=simple_view)):
            process_cascade_events()
Example #3
0
    def test_datetime_editor_mutate_minimum_datetime_after_init(self):
        # Test if the minimum_datetime on the editor is mutated after init,
        # the values on the edited object and the view are synchronized.
        editor_factory = DatetimeEditor(minimum_datetime=datetime.datetime(
            2000, 1, 1), )
        view = get_date_time_simple_view(editor_factory)
        instance = InstanceWithDatetime()
        with reraise_exceptions(), \
                self.launch_editor(instance, view) as editor:

            # This value is in-range
            instance.date_time = datetime.datetime(2001, 1, 1)

            # Now change the editor's minimum datetime such that the original
            # value is out-of-range
            new_minimum_datetime = datetime.datetime(2010, 1, 1)
            editor.minimum_datetime = new_minimum_datetime

            # does not seem needed to flush the event loop, but just in case.
            process_cascade_events()

            displayed_value = to_datetime(editor.control.dateTime())

        self.assertEqual(instance.date_time, displayed_value)
        self.assertEqual(displayed_value, new_minimum_datetime)
Example #4
0
    def test_simple_set_editor_use_ordered_selected(self):
        # Initiate with non-alphabetical list
        model = ListModel(value=["two", "one"])
        with reraise_exceptions(), self.setup_gui(
                model, get_view(ordered=True)) as editor:

            self.assertEqual(get_list_items(editor._unused), ["four", "three"])
            # Used list maintains the order
            self.assertEqual(get_list_items(editor._used), ["two", "one"])

            click_on_item(editor, 1, in_used=False)
            process_cascade_events()

            self.assertTrue(is_control_enabled(editor._use))
            self.assertFalse(is_control_enabled(editor._unuse))

            click_button(editor._use)
            process_cascade_events()

            self.assertEqual(get_list_items(editor._unused), ["four"])
            # Button inserts at the top
            self.assertEqual(get_list_items(editor._used),
                             ["three", "two", "one"])
            self.assertEqual(editor._get_selected_strings(editor._used),
                             ["three"])
Example #5
0
    def test_custom_check_list_editor_button_update(self):
        list_edit = ListModel()

        with reraise_exceptions(), self.setup_gui(
                list_edit, get_view("custom")) as editor:

            self.assertEqual(
                get_all_button_status(editor.control),
                [False, False, False, False],
            )

            list_edit.value = ["two", "four"]
            process_cascade_events()

            self.assertEqual(
                get_all_button_status(editor.control),
                [False, True, False, True],
            )

            list_edit.value = ["one", "four"]
            process_cascade_events()

            self.assertEqual(
                get_all_button_status(editor.control),
                [True, False, False, True],
            )
Example #6
0
    def test_run(self):
        accepted_files, skipped_files = SEARCHER.get_python_files()

        for file_path in accepted_files:
            with self.subTest(file_path=file_path):
                try:
                    run_file(file_path)
                except Exception as exc:
                    message = "".join(
                        traceback.format_exception(*sys.exc_info()))
                    self.fail(
                        "Executing {} failed with exception {}\n {}".format(
                            file_path, exc, message))
                finally:
                    # Whatever failure, always flush the GUI event queue
                    # before running the next one.
                    process_cascade_events()

        # Report skipped files
        for file_path, reason in skipped_files:
            with self.subTest(file_path=file_path):
                # make up for unittest not reporting the parameter in skip
                # message.
                raise unittest.SkipTest("{reason} (File: {file_path})".format(
                    reason=reason, file_path=file_path))
def replaced_configure_traits(instance,
                              filename=None,
                              view=None,
                              kind=None,
                              edit=True,
                              context=None,
                              handler=None,
                              id="",
                              scrollable=None,
                              **args):
    """ Mocked configure_traits to launch then close the GUI.
    """
    ui = instance.edit_traits(
        view=view,
        parent=None,
        kind="live",  # other options may block the test
        context=context,
        handler=handler,
        id=id,
        scrollable=scrollable,
        **args,
    )
    with reraise_exceptions():
        process_cascade_events()

        # Temporary fix for enthought/traitsui#907
        if is_qt():
            ui.control.hide()
        if is_wx():
            ui.control.Hide()

        ui.dispose()
        process_cascade_events()
Example #8
0
    def test_dispose_inner_ui(self):
        obj = DummyObject()
        view = View(
            Group(
                Item(
                    "number",
                    editor=BasicEditorFactory(klass=EditorWithCustomWidget),
                ), ), )
        ui = obj.edit_traits(view=view)
        editor, = ui.get_editors("number")

        gui = GUI()
        with ensure_destroyed(ui):
            # This represents an event handler that causes a nested UI to be
            # disposed.
            gui.invoke_later(editor.dispose_inner_ui)

            # Allowing GUI to process the disposal requests is crucial.
            # This requirement should be satisfied in production setting
            # where the dispose method is part of an event handler.
            # Not doing so before disposing the main UI would be a programming
            # error in tests settings.
            with reraise_exceptions():
                process_cascade_events()

            gui.invoke_later(close_control, ui.control)
            with reraise_exceptions():
                process_cascade_events()

            self.assertIsNone(ui.control)
Example #9
0
    def test_table_editor_select_cells(self):
        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 reraise_exceptions(), \
                create_ui(object_list, dict(view=select_cells_view)) as ui:
            editor = ui.get_editors("values")[0]
            process_cascade_events()
            if is_qt():
                selected = editor.selected
            elif is_wx():
                selected = editor.selected_cells

            process_cascade_events()

        self.assertEqual(selected, [
            (object_list.values[5], "value"),
            (object_list.values[6], "other value"),
            (object_list.values[8], "value"),
        ])
Example #10
0
    def test_tabular_editor_single_selection_changed(self):

        with reraise_exceptions(), \
                self.report_and_editor(get_view()) as (report, editor):
            process_cascade_events()
            people = report.people

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

            report.selected_row = 1
            process_cascade_events()

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

            report.selected = people[2]
            process_cascade_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)
            process_cascade_events()

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

            # -1 clears selection
            report.selected_row = -1
            process_cascade_events()

            self.assertEqual(get_selected_rows(editor), [])
            self.assertEqual(report.selected, None)
Example #11
0
    def test_simple_set_editor_deleted_valid_values(self):
        editor_factory = SetEditor(values=["one", "two", "three", "four"])
        view = View(UItem(
            "value",
            editor=editor_factory,
            style="simple",
        ))
        list_edit = ListModel()

        with reraise_exceptions(), self.setup_gui(list_edit, view) as editor:

            self.assertEqual(get_list_items(editor._unused), ["four", "three"])
            self.assertEqual(get_list_items(editor._used), ["one", "two"])

            editor_factory.values = ["two", "three", "four"]
            process_cascade_events()

            self.assertEqual(get_list_items(editor._unused), ["four", "three"])
            # FIXME issue enthought/traitsui#840
            if is_wx():
                with self.assertRaises(AssertionError):
                    self.assertEqual(get_list_items(editor._used), ["two"])
                self.assertEqual(get_list_items(editor._used), ["one", "two"])
            else:
                self.assertEqual(get_list_items(editor._used), ["two"])
            self.assertEqual(list_edit.value, ["two"])
Example #12
0
    def test_tabular_editor_multi_selection_items_changed(self):
        view = get_view(multi_select=True)

        with reraise_exceptions(), \
                self.report_and_editor(view) as (report, editor):
            process_cascade_events()
            people = report.people

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

            report.selected_rows.extend([0, 1])
            process_cascade_events()

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

            report.selected_rows[1] = 2
            process_cascade_events()

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

            report.multi_selected[0] = people[1]
            process_cascade_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)
            process_cascade_events()

            self.assertEqual(sorted(get_selected_rows(editor)), [1, 2])
            self.assertEqual(sorted(report.selected_rows), [1, 2])
Example #13
0
def ensure_destroyed(ui):
    """ Ensure the widget is destroyed in the event when test fails."""
    try:
        yield
    finally:
        if ui.control is not None:
            toolkit().destroy_control(ui.control)
        with reraise_exceptions():
            process_cascade_events()
 def test_list_str_editor_refresh_editor(self):
     # Smoke test for refresh_editor/refresh_
     with reraise_exceptions(), \
             self.setup_gui(ListStrModel(), get_view()) as editor:
         if is_qt():
             editor.refresh_editor()
         elif is_wx():
             editor._refresh()
         process_cascade_events()
    def test_simple_check_list_editor_text(self):
        list_edit = ListModel(value=["one"])

        with reraise_exceptions(), \
                self.setup_gui(list_edit, get_view("simple")) as editor:

            self.assertEqual(get_combobox_text(editor.control), "One")

            list_edit.value = ["two"]
            process_cascade_events()

            self.assertEqual(get_combobox_text(editor.control), "Two")
Example #16
0
    def check_enum_index_update(self, view):
        enum_edit = EnumModel()

        with reraise_exceptions(), \
                self.setup_gui(enum_edit, view) as editor:

            self.assertEqual(enum_edit.value, "one")

            set_list_widget_selected_index(editor.control, 1)
            process_cascade_events()

            self.assertEqual(enum_edit.value, "two")
Example #17
0
    def check_enum_text_update(self, view):
        enum_edit = EnumModel()

        with reraise_exceptions(), \
                self.setup_gui(enum_edit, view) as editor:

            self.assertEqual(get_list_widget_text(editor.control), "one")

            enum_edit.value = "two"
            process_cascade_events()

            self.assertEqual(get_list_widget_text(editor.control), "two")
Example #18
0
    def check_enum_text_bad_update(self, view):
        enum_edit = EnumModel()

        with reraise_exceptions(), \
                self.setup_gui(enum_edit, view) as editor:

            self.assertEqual(enum_edit.value, "one")

            set_combobox_text(editor.control, "t")
            process_cascade_events()

            self.assertEqual(enum_edit.value, "one")
    def test_text_check_list_object_list(self):
        list_edit = ListModel()

        with reraise_exceptions(), \
                self.setup_gui(list_edit, get_view("text")) as editor:

            self.assertEqual(list_edit.value, [])

            set_text_in_line_edit(editor.control, "['one', 'two']")
            process_cascade_events()

            self.assertEqual(list_edit.value, ["one", "two"])
Example #20
0
    def test_filtered_table_editor(self):
        object_list = ObjectListWithSelection(
            values=[ListItem(value=str(i**2)) for i in range(10)])

        with reraise_exceptions(), \
                create_ui(object_list, dict(view=filtered_view)) as ui:
            process_cascade_events()

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

            process_cascade_events()

        self.assertIsNotNone(filter)
Example #21
0
    def test_radio_enum_editor_pick(self):
        enum_edit = EnumModel()

        with reraise_exceptions(), \
                self.setup_gui(enum_edit, get_view("custom")) as editor:

            self.assertEqual(enum_edit.value, "one")

            # The layout is: one, three, four \n two
            click_radio_button(editor.control, 3)
            process_cascade_events()

            self.assertEqual(enum_edit.value, "two")
Example #22
0
    def test_tabular_editor_multi_selection(self):
        view = get_view(multi_select=True)

        with reraise_exceptions(), \
                self.report_and_editor(view) as (report, editor):
            process_cascade_events()
            people = report.people

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

            set_selected_multiple(editor, [0, 1])
            process_cascade_events()

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

            set_selected_multiple(editor, [2])
            process_cascade_events()

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

            clear_selection(editor)
            process_cascade_events()

            self.assertEqual(report.selected_rows, [])
            self.assertEqual(report.multi_selected, [])
Example #23
0
    def test_reset_with_destroy_wx(self):
        # Characterization test:
        # UI.reset(destroy=True) destroys all ui children of the top control

        foo = FooDialog()
        with create_ui(foo) as ui:

            ui.reset(destroy=True)

            process_cascade_events()
            # the top control is still there
            self.assertIsNotNone(ui.control)
            # but its children are gone
            self.assertEqual(len(ui.control.GetChildren()), 0)
Example #24
0
    def test_list_str_editor_multi_selection_items_changed(self):
        view = get_view(multi_select=True)

        with reraise_exceptions(), self.setup_gui(
            ListStrModel(), view
        ) as editor:

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

            editor.multi_selected_indices.extend([0, 1])
            process_cascade_events()

            self.assertEqual(get_selected_indices(editor), [0, 1])
            self.assertEqual(editor.multi_selected, ["one", "two"])

            editor.multi_selected_indices[1] = 2
            process_cascade_events()

            self.assertEqual(get_selected_indices(editor), [0, 2])
            self.assertEqual(editor.multi_selected, ["one", "three"])

            editor.multi_selected[0] = "two"
            process_cascade_events()

            self.assertEqual(sorted(get_selected_indices(editor)), [1, 2])
            self.assertEqual(sorted(editor.multi_selected_indices), [1, 2])

            # If a change in multi_selected involves an invalid value, nothing
            # is changed
            editor.multi_selected[0] = "four"
            process_cascade_events()

            self.assertEqual(sorted(get_selected_indices(editor)), [1, 2])
            self.assertEqual(sorted(editor.multi_selected_indices), [1, 2])
Example #25
0
    def test_simple_set_editor_unuse_dclick(self):
        with reraise_exceptions(), self.setup_gui(ListModel(),
                                                  get_view()) as editor:

            self.assertEqual(get_list_items(editor._unused), ["four", "three"])
            self.assertEqual(get_list_items(editor._used), ["one", "two"])

            double_click_on_item(editor, 0, in_used=True)
            process_cascade_events()

            # Inserts at the top
            self.assertEqual(get_list_items(editor._unused),
                             ["one", "four", "three"])
            self.assertEqual(get_list_items(editor._used), ["two"])
Example #26
0
    def test_simple_set_editor_default_selection_unused(self):
        with reraise_exceptions(), self.setup_gui(ListModel(),
                                                  get_view()) as editor:

            self.assertEqual(get_list_items(editor._unused), ["four", "three"])
            self.assertEqual(get_list_items(editor._used), ["one", "two"])

            click_button(editor._use)
            process_cascade_events()

            # Button inserts at the top
            self.assertEqual(get_list_items(editor._unused), ["three"])
            self.assertEqual(get_list_items(editor._used),
                             ["four", "one", "two"])
Example #27
0
    def test_adapter_columns_changes(self):
        # Regression test for enthought/traitsui#894
        with reraise_exceptions(), \
                self.report_and_editor(get_view()) as (report, editor):

            # Reproduce the scenario when the column count is reduced.
            editor.adapter.columns = [
                ("Name", "name"), ("Age", "age"),
            ]
            # Recalculating column widths take into account the user defined
            # widths, cached in the view. The cache should be invalidated
            # when the columns is updated such that recalculation does not
            # fail.
            editor.adapter.columns = [("Name", "name")]
            process_cascade_events()
Example #28
0
    def test_radio_enum_editor_button_update(self):
        enum_edit = EnumModel()

        with reraise_exceptions(), \
                self.setup_gui(enum_edit, get_view("custom")) as editor:

            # The layout is: one, three, four \n two
            self.assertEqual(get_all_button_status(editor.control),
                             [True, False, False, False])

            enum_edit.value = "two"
            process_cascade_events()

            self.assertEqual(get_all_button_status(editor.control),
                             [False, False, False, True])
Example #29
0
    def test_on_perform_action(self):
        # A test for issue #741, where actions with an on_perform function set
        # would get called twice
        object_list = ObjectList(
            values=[ListItem(value=str(i**2)) for i in range(10)])
        mock_function = Mock()
        action = Action(on_perform=mock_function)

        with reraise_exceptions(), \
                create_ui(object_list, dict(view=simple_view)) as ui:
            editor = ui.get_editors("values")[0]
            process_cascade_events()
            editor.set_menu_context(None, None, None)
            editor.perform(action)
        mock_function.assert_called_once()
    def test_text_check_list_object_str(self):
        class StrModel(HasTraits):
            value = Str()

        str_edit = StrModel(value="three, four")

        with reraise_exceptions(), \
                self.setup_gui(str_edit, get_view("text")) as editor:

            self.assertEqual(str_edit.value, "three, four")

            set_text_in_line_edit(editor.control, "one, two")
            process_cascade_events()

            self.assertEqual(str_edit.value, "one, two")