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()), [])
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()
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)
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"])
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], )
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()
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)
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"), ])
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)
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"])
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])
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")
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")
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")
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"])
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)
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")
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, [])
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)
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])
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"])
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"])
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()
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])
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")