From 3a77dc7a1e85200b7b8f948bf0b2e4a0a6943146 Mon Sep 17 00:00:00 2001 From: Midhun PM Date: Mon, 6 Apr 2020 15:57:10 -0500 Subject: [PATCH 1/5] Add a GUI test for Enum.create_editor --- traits/tests/test_enum.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/traits/tests/test_enum.py b/traits/tests/test_enum.py index c87de3729..777343a43 100644 --- a/traits/tests/test_enum.py +++ b/traits/tests/test_enum.py @@ -11,6 +11,8 @@ import enum import unittest +from pyface.ui.qt4.util.gui_test_assistant import GuiTestAssistant + from traits.api import ( Any, BaseEnum, Enum, HasTraits, List, Property, TraitError) @@ -110,6 +112,10 @@ class EnumCollectionExample(HasTraits): slow_enum = BaseEnum("yes", "no", "maybe") +class EnumCollectionGUIExample(EnumCollectionExample): + correct_int_set_enum = int_set_enum = Enum("int", "set") + + class EnumTestCase(unittest.TestCase): def test_valid_enum(self): example_model = ExampleModel(root="model1") @@ -296,3 +302,25 @@ def test_base_enum(self): with self.assertRaises(TraitError): obj.slow_enum = "perhaps" self.assertEqual(obj.slow_enum, "no") + + +class TestGui(GuiTestAssistant, unittest.TestCase): + + def test_create_editor(self): + obj = EnumCollectionGUIExample() + traits = obj.class_trait_names() + traits.remove("trait_added") + traits.remove("trait_modified") + + ui = obj.edit_traits() + for t in traits: + + with self.subTest(t=t): + editor = getattr(ui.info, t) + + # Try setting all valid values for the Enum trait + for value in obj.trait(t).trait_type.values: + with self.assertTraitChangesInEventLoop( + obj, t, lambda instance: getattr( + instance, t) == value, 0, 3): + self.gui.set_trait_later(editor, 'value', value) From a142dcaff33a5c59efff96ce96ae0df8b4d4966c Mon Sep 17 00:00:00 2001 From: Midhun PM Date: Tue, 7 Apr 2020 21:10:15 -0500 Subject: [PATCH 2/5] Add a comment --- traits/tests/test_enum.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/traits/tests/test_enum.py b/traits/tests/test_enum.py index 777343a43..496d79775 100644 --- a/traits/tests/test_enum.py +++ b/traits/tests/test_enum.py @@ -113,7 +113,10 @@ class EnumCollectionExample(HasTraits): class EnumCollectionGUIExample(EnumCollectionExample): - correct_int_set_enum = int_set_enum = Enum("int", "set") + # Override attributes that may fail GUI test + # until traitsui #781 is fixed. + int_set_enum = Enum("int", "set") + correct_int_set_enum = Enum("int", "set") class EnumTestCase(unittest.TestCase): From 88c119d3c779f9e4e84be3e36d91ea5fb6df040e Mon Sep 17 00:00:00 2001 From: Midhun PM Date: Tue, 14 Apr 2020 16:13:08 -0500 Subject: [PATCH 3/5] Some cleanup --- traits/tests/test_enum.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/traits/tests/test_enum.py b/traits/tests/test_enum.py index 496d79775..349c2caec 100644 --- a/traits/tests/test_enum.py +++ b/traits/tests/test_enum.py @@ -311,18 +311,19 @@ class TestGui(GuiTestAssistant, unittest.TestCase): def test_create_editor(self): obj = EnumCollectionGUIExample() - traits = obj.class_trait_names() - traits.remove("trait_added") - traits.remove("trait_modified") + user_editable_traits = obj.class_editable_traits() + # Create a UI window ui = obj.edit_traits() - for t in traits: + + for t in user_editable_traits: with self.subTest(t=t): editor = getattr(ui.info, t) + values = obj.trait(t).trait_type.values # Try setting all valid values for the Enum trait - for value in obj.trait(t).trait_type.values: + for value in values: with self.assertTraitChangesInEventLoop( obj, t, lambda instance: getattr( instance, t) == value, 0, 3): From 1961176c2d793204b041d104957505800c5bd0a6 Mon Sep 17 00:00:00 2001 From: Midhun PM Date: Tue, 14 Apr 2020 16:24:31 -0500 Subject: [PATCH 4/5] Make pyface an optional dependency for testing --- traits/testing/optional_dependencies.py | 3 +++ traits/tests/test_enum.py | 12 ++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/traits/testing/optional_dependencies.py b/traits/testing/optional_dependencies.py index e88eadc0f..d2d55743d 100644 --- a/traits/testing/optional_dependencies.py +++ b/traits/testing/optional_dependencies.py @@ -42,6 +42,9 @@ def optional_import(name): numpy = optional_import("numpy") requires_numpy = unittest.skipIf(numpy is None, "NumPy not available") +pyface = optional_import("pyface") +requires_pyface = unittest.skipIf(pyface is None, "Pyface not available") + sphinx = optional_import("sphinx") requires_sphinx = unittest.skipIf(sphinx is None, "Sphinx not available") diff --git a/traits/tests/test_enum.py b/traits/tests/test_enum.py index 349c2caec..ef6eda980 100644 --- a/traits/tests/test_enum.py +++ b/traits/tests/test_enum.py @@ -11,11 +11,18 @@ import enum import unittest -from pyface.ui.qt4.util.gui_test_assistant import GuiTestAssistant - from traits.api import ( Any, BaseEnum, Enum, HasTraits, List, Property, TraitError) +from traits.testing.optional_dependencies import pyface, requires_traitsui + +if pyface is not None: + GuiTestAssistant = pyface.toolkit.toolkit_object( + "util.gui_test_assistant:GuiTestAssistant") +else: + class GuiTestAssistant: + pass + class FooEnum(enum.Enum): foo = 0 @@ -307,6 +314,7 @@ def test_base_enum(self): self.assertEqual(obj.slow_enum, "no") +@requires_traitsui class TestGui(GuiTestAssistant, unittest.TestCase): def test_create_editor(self): From 386ede748923ba1e23437cf980df464506a9fa73 Mon Sep 17 00:00:00 2001 From: Midhun PM Date: Thu, 16 Apr 2020 09:32:28 -0500 Subject: [PATCH 5/5] Use a simpler test --- traits/tests/test_enum.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/traits/tests/test_enum.py b/traits/tests/test_enum.py index ef6eda980..2b14b1a27 100644 --- a/traits/tests/test_enum.py +++ b/traits/tests/test_enum.py @@ -13,7 +13,6 @@ from traits.api import ( Any, BaseEnum, Enum, HasTraits, List, Property, TraitError) - from traits.testing.optional_dependencies import pyface, requires_traitsui if pyface is not None: @@ -319,20 +318,11 @@ class TestGui(GuiTestAssistant, unittest.TestCase): def test_create_editor(self): obj = EnumCollectionGUIExample() - user_editable_traits = obj.class_editable_traits() # Create a UI window ui = obj.edit_traits() - - for t in user_editable_traits: - - with self.subTest(t=t): - editor = getattr(ui.info, t) - values = obj.trait(t).trait_type.values - - # Try setting all valid values for the Enum trait - for value in values: - with self.assertTraitChangesInEventLoop( - obj, t, lambda instance: getattr( - instance, t) == value, 0, 3): - self.gui.set_trait_later(editor, 'value', value) + try: + self.gui.process_events() + finally: + with self.delete_widget(ui.control): + ui.dispose()