Exemple #1
0
class TestWindow(unittest.TestCase, GuiTestAssistant):
    def setUp(self):
        GuiTestAssistant.setUp(self)
        self.window = Window()

    def tearDown(self):
        if self.window.control is not None:
            with self.delete_widget(self.window.control):
                self.window.destroy()
        self.window = None
        GuiTestAssistant.tearDown(self)

    def test_destroy(self):
        # test that destroy works even when no control
        with self.event_loop():
            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):
                with self.event_loop():
                    self.window.open()

        with self.assertTraitChanges(self.window, "closing", count=1):
            with self.assertTraitChanges(self.window, "closed", count=1):
                with self.event_loop():
                    self.window.close()

    def test_show(self):
        # test that showing works as expected
        with self.event_loop():
            self.window._create()
        with self.event_loop():
            self.window.show(True)
        with self.event_loop():
            self.window.show(False)
        with self.event_loop():
            self.window.destroy()

    def test_activate(self):
        # test that activation works as expected
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.activate()
        with self.event_loop():
            self.window.close()

    def test_position(self):
        # test that default position works as expected
        self.window.position = (100, 100)
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.close()

    def test_reposition(self):
        # test that changing position works as expected
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.position = (100, 100)
        with self.event_loop():
            self.window.close()

    def test_size(self):
        # test that default size works as expected
        self.window.size = (100, 100)
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.close()

    def test_resize(self):
        # test that changing size works as expected
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.size = (100, 100)
        with self.event_loop():
            self.window.close()

    def test_title(self):
        # test that default title works as expected
        self.window.title = "Test Title"
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.close()

    def test_retitle(self):
        # test that changing title works as expected
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.title = "Test Title"
        with self.event_loop():
            self.window.close()

    def test_show_event(self):
        with self.event_loop():
            self.window.open()
        with self.event_loop():
            self.window.visible = False

        with self.assertTraitChanges(self.window, "visible", count=1):
            with self.event_loop():
                self.window.control.show()

        self.assertTrue(self.window.visible)

    def test_hide_event(self):
        with self.event_loop():
            self.window.open()

        with self.assertTraitChanges(self.window, "visible", count=1):
            with self.event_loop():
                self.window.control.hide()

        self.assertFalse(self.window.visible)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    @unittest.skipIf(is_pyqt5,
                     "Confirmation dialog click tests don't work on pyqt5.")
    @unittest.skipIf(
        is_pyqt4_linux,
        "Confirmation dialog click tests don't work reliably on linux.  Issue #282.",
    )
    def test_confirm_reject(self):
        # test that cancel works as expected
        tester = ModalDialogTester(
            lambda: self.window.confirm("message", cancel=True))
        tester.open_and_run(when_opened=lambda x: x.close(accept=False))

        self.assertEqual(tester.result, CANCEL)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    @unittest.skipIf(is_pyqt5,
                     "Confirmation dialog click tests don't work on pyqt5.")
    @unittest.skipIf(
        is_pyqt4_linux,
        "Confirmation dialog click tests don't work reliably on linux.  Issue #282.",
    )
    def test_confirm_yes(self):
        # test that yes works as expected
        tester = ModalDialogTester(lambda: self.window.confirm("message"))
        tester.open_and_wait(when_opened=lambda x: x.click_button(YES))

        self.assertEqual(tester.result, YES)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    @unittest.skipIf(is_pyqt5,
                     "Confirmation dialog click tests don't work on pyqt5.")
    @unittest.skipIf(
        is_pyqt4_linux,
        "Confirmation dialog click tests don't work reliably on linux.  Issue #282.",
    )
    def test_confirm_no(self):
        # test that no works as expected
        tester = ModalDialogTester(lambda: self.window.confirm("message"))
        tester.open_and_wait(when_opened=lambda x: x.click_button(NO))

        self.assertEqual(tester.result, NO)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    @unittest.skipIf(is_pyqt5,
                     "Confirmation dialog click tests don't work on pyqt5.")
    @unittest.skipIf(
        is_pyqt4_linux,
        "Confirmation dialog click tests don't work reliably on linux.  Issue #282.",
    )
    def test_confirm_cancel(self):
        # test that cncel works as expected
        tester = ModalDialogTester(
            lambda: self.window.confirm("message", cancel=True))
        tester.open_and_wait(when_opened=lambda x: x.click_button(CANCEL))

        self.assertEqual(tester.result, CANCEL)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    def test_information_accept(self):
        self._check_message_dialog_accept(self.window.information)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    @unittest.skipIf(is_pyqt5,
                     "Message dialog click tests don't work on pyqt5.")
    @unittest.skipIf(
        is_pyqt4_linux,
        "Message dialog click tests don't work reliably on linux.  Issue #282.",
    )
    def test_information_ok(self):
        self._check_message_dialog_ok(self.window.information)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    def test_warning_accept(self):
        self._check_message_dialog_accept(self.window.warning)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    @unittest.skipIf(is_pyqt5,
                     "Message dialog click tests don't work on pyqt5.")
    @unittest.skipIf(
        is_pyqt4_linux,
        "Message dialog click tests don't work reliably on linux.  Issue #282.",
    )
    def test_warning_ok(self):
        self._check_message_dialog_ok(self.window.warning)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    def test_error_accept(self):
        self._check_message_dialog_accept(self.window.error)

    @unittest.skipIf(no_modal_dialog_tester, "ModalDialogTester unavailable")
    @unittest.skipIf(is_pyqt5,
                     "Message dialog click tests don't work on pyqt5.")
    @unittest.skipIf(
        is_pyqt4_linux,
        "Message dialog click tests don't work reliably on linux.  Issue #282.",
    )
    def test_error_ok(self):
        self._check_message_dialog_ok(self.window.error)

    def _check_message_dialog_ok(self, method):
        tester = self._setup_tester(method)
        tester.open_and_wait(when_opened=lambda x: x.click_button(OK))

        self.assertIsNone(tester.result)

    def _check_message_dialog_accept(self, method):
        tester = self._setup_tester(method)
        tester.open_and_run(when_opened=lambda x: x.close(accept=True))

        self.assertIsNone(tester.result)

    def _setup_tester(self, method):
        kwargs = {
            "title": "Title",
            "detail": "Detail",
            "informative": "Informative",
        }
        tester = ModalDialogTester(lambda: method("message", **kwargs))
        return tester
Exemple #2
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)