def _edit_line_edit(self, key_entry): QTest.mouseClick(self.line_edit, Qt.LeftButton) self.line_edit.selectAll() QTest.keyClick(self.line_edit, Qt.Key_Backspace) QTest.keyClicks(self.line_edit, key_entry) QTest.keyClick(self.line_edit, Qt.Key_Enter) QApplication.sendPostedEvents()
def test_widget_connections_exist(self): mock_mfp = MockMultiFileInterpreter() view = CodeEditorTabWidget(mock_mfp) self.assert_widget_created() self.assert_object_connected_once( view, view.SHOW_IN_EXPLORER_ACTION_OBJECT_NAME, QAction, "triggered") self.assert_object_connected_once(view, view.ABORT_BUTTON_OBJECT_NAME) self.assert_object_connected_once(view, view.NEW_EDITOR_PLUS_BTN_OBJECT_NAME) self.assert_object_connected_once(view, view.RUN_BUTTON_OBJECT_NAME) # options button is not connected because it uses the internal Qt triggers # to show the popup menu self.assert_object_not_connected(view, view.OPTIONS_BUTTON_OBJECT_NAME) view.close() QApplication.sendPostedEvents() self.assert_widget_not_present(CodeEditorTabWidget.__name__) # closing our local mock should leave the QApplication without any widgets mock_mfp.close() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def test_view_closes_on_ADS_cleared(self): ws = CreateSampleWorkspace() SliceViewer(ws) AnalysisDataService.clear() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def test_view_closes_on_replace_when_model_properties_change(self): ws = CreateSampleWorkspace() pres = SliceViewer(ws) ConvertToDistribution(ws) QApplication.sendPostedEvents() self.assert_no_toplevel_widgets() self.assertEqual(pres.ads_observer, None)
def test_view_closes_on_shown_workspace_deleted(self): ws = CreateSampleWorkspace() pres = SliceViewer(ws) DeleteWorkspace(ws) QApplication.sendPostedEvents() self.assert_no_toplevel_widgets() self.assertEqual(pres.ads_observer, None)
def test_deleted_on_close(self): pres = SliceViewer(self.histo_ws) self.assert_widget_created() pres.view.close() QApplication.sendPostedEvents() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def test_deleted_on_close(self): ws = CreateSampleWorkspace() pres = SampleLogs(ws) self.assert_widget_created() pres.view.close() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def test_close_event(self): ws = CreateSampleWorkspace() pres = SliceViewer(ws) self.assert_widget_created() pres.view.close() pres = None QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def test_that_the_workspace_display_opens_and_closes_ok_with_a_ragged_workspace( self): self.presenter = MatrixWorkspaceDisplay(self.ragged_workspace) self.presenter.show_view() self.assert_widget_created() self.presenter.container.close() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def runTest(self): try: self.fsg_presenter.openFitScriptGenerator() QApplication.sendPostedEvents() self.assert_widget_created() self.assertTrue(self.fsg_view.close()) QApplication.sendPostedEvents() except Exception as ex: self.fail(f"Exception thrown when attempting to open the Fit Script Generator interface: {ex}.")
def test_deletes_on_close(self): with MockWorkspaceWidget() as temp_widget: widget = SettingsPresenter(temp_widget) self.assert_widget_created() self.assert_widget_exists("GeneralSettings", expected_count=1) widget.view.close() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def test_window_force_deleted_correctly(self): ws = CreateEmptyTableWorkspace() p = TableWorkspaceDisplay(ws) self.assert_widget_created() p.force_close() QApplication.sendPostedEvents() self.assertEqual(None, p.ads_observer) self.assert_widget_not_present("work") self.assert_no_toplevel_widgets()
def test_window_force_deleted_correctly(self): ws = CreateSampleWorkspace() LoadInstrument(ws, InstrumentName='MARI', RewriteSpectraMap=False) p = InstrumentViewPresenter(ws) self.assert_widget_created() p.force_close() QApplication.sendPostedEvents() self.assertEqual(None, p.ads_observer) self.assert_widget_not_present("instr") self.assert_no_toplevel_widgets()
def test_deleted_on_close(self): mock_mfp = MockMultiFileInterpreter() view = CodeEditorTabWidget(mock_mfp) self.assert_widget_created() view.close() QApplication.sendPostedEvents() self.assert_widget_not_present(CodeEditorTabWidget.__name__) # closing our local mock should leave the QApplication without any widgets mock_mfp.close() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()
def test_correct_exception_is_raised_when_called_on_other_thread(self): self.exc = None self.exit_code = None def collect_error(e): self.exc = e thread = AsyncTask(self.task, error_cb=collect_error) thread.start() while thread.is_alive(): QApplication.sendPostedEvents() thread.join(0.5) self.assertTrue(isinstance(self.exc.exc_value, CustomException)) self.assertEqual(TaskExitCode.ERROR, thread.exit_code)
def test_window_deleted_correctly(self): ws = CreateSampleWorkspace() p = MatrixWorkspaceDisplay(ws) self.assert_widget_created() p.close(ws.name()) self.assert_widget_created() QApplication.sendPostedEvents() self.assertEqual(None, p.ads_observer) self.assert_widget_not_present("work") self.assert_no_toplevel_widgets()
def test_editor_widget_not_leaked(self): widget = MultiPythonFileInterpreter() self.assertEqual(1, widget.editor_count) widget.append_new_editor() self.assertEqual(2, widget.editor_count) widget.append_new_editor() self.assertEqual(3, widget.editor_count) widget.close_tab(0) QApplication.sendPostedEvents() self.assert_number_of_widgets_matching( ".interpreter.PythonFileInterpreter", 2) widget.close_tab(0) QApplication.sendPostedEvents() self.assert_number_of_widgets_matching( ".interpreter.PythonFileInterpreter", 1) widget.close_all() QApplication.sendPostedEvents() # there should be zero interpreters self.assert_number_of_widgets_matching( ".interpreter.PythonFileInterpreter", 0) # close the whole widget, this should delete everything from the QApplication widget.close() QApplication.sendPostedEvents() self.assert_number_of_widgets_matching( ".interpreter.PythonFileInterpreter", 0) self.assert_no_toplevel_widgets()
def test_disable_lineplots_disables_region_selector(self): pres = SliceViewer(self.hkl_ws) line_plots_action, region_sel_action = toolbar_actions( pres, (ToolItemText.LINEPLOTS, ToolItemText.REGIONSELECTION)) line_plots_action.trigger() region_sel_action.trigger() QApplication.sendPostedEvents() line_plots_action.trigger() QApplication.sendPostedEvents() self.assertFalse(line_plots_action.isChecked()) self.assertFalse(region_sel_action.isChecked()) pres.view.close()
def test_view_does_not_close_on_other_workspace_deleted(self): ws = CreateSampleWorkspace() pres = SliceViewer(ws) other_ws = CreateSampleWorkspace() DeleteWorkspace(other_ws) QApplication.sendPostedEvents() # Strange behaviour between tests where views don't close properly means # we cannot use self.assert_widget_exists, as many instances of SliceViewerView # may be active at this time. As long as this view hasn't closed we are OK. self.assertTrue( pres.view in self.find_widgets_of_type(str(type(pres.view)))) self.assertNotEqual(pres.ads_observer, None) pres.view.close()
def test_view_updates_on_replace_when_model_properties_dont_change_matrixws( self): def scale_ws(ws): ws = Scale(ws, 100, "Multiply") ws = CreateSampleWorkspace() pres = SliceViewer(ws) self._assertNoErrorInADSHandlerFromSeparateThread(partial( scale_ws, ws)) QApplication.sendPostedEvents() self.assertTrue( pres.view in self.find_widgets_of_type(str(type(pres.view)))) self.assertNotEqual(pres.ads_observer, None) pres.view.close()
def test_enable_nonorthogonal_view_disables_lineplots_if_enabled(self): pres = SliceViewer(self.hkl_ws) line_plots_action, region_sel_action, non_ortho_action = toolbar_actions( pres, (ToolItemText.LINEPLOTS, ToolItemText.REGIONSELECTION, ToolItemText.NONORTHOGONAL_AXES)) line_plots_action.trigger() QApplication.sendPostedEvents() non_ortho_action.trigger() QApplication.sendPostedEvents() self.assertTrue(non_ortho_action.isChecked()) self.assertFalse(line_plots_action.isChecked()) self.assertFalse(line_plots_action.isEnabled()) self.assertFalse(region_sel_action.isChecked()) self.assertFalse(region_sel_action.isEnabled()) pres.view.close()
def test_view_title_correct_and_view_didnt_close_on_workspace_rename(self): ws = CreateSampleWorkspace() pres = SliceViewer(ws) old_title = pres.model.get_title() renamed = RenameWorkspace(ws) # noqa F841 QApplication.sendPostedEvents() # View didn't close self.assertTrue( pres.view in self.find_widgets_of_type(str(type(pres.view)))) self.assertNotEqual(pres.ads_observer, None) # Window title correct self.assertNotEqual(pres.model.get_title(), old_title) self.assertEqual(pres.view.windowTitle(), pres.model.get_title()) pres.view.close()
def test_editor_widget_doesnt_create_find_replace_unless_requested(self): widget = MultiPythonFileInterpreter() self.assertEqual(1, widget.editor_count) widget.append_new_editor() self.assert_number_of_widgets_matching( ".interpreter.PythonFileInterpreter", 2) self.assert_number_of_widgets_matching("Embedded", 0) widget.close_tab(1) QApplication.sendPostedEvents() # there will always be 1, because we never allow an empty editor widget self.assert_number_of_widgets_matching( ".interpreter.PythonFileInterpreter", 1) self.assert_number_of_widgets_matching("Embedded", 0) # close the whole widget, this should delete everything from the QApplication widget.close() QApplication.sendPostedEvents() self.assert_number_of_widgets_matching( ".interpreter.PythonFileInterpreter", 0) self.assert_no_toplevel_widgets()
def test_view_updates_on_replace_when_model_properties_dont_change_mdeventws( self): def scale_ws(ws): ws = ws * 100 ws = CreateMDWorkspace(Dimensions='3', EventType='MDEvent', Extents='-10,10,-5,5,-1,1', Names='Q_lab_x,Q_lab_y,Q_lab_z', Units='1\\A,1\\A,1\\A') FakeMDEventData(ws, UniformParams="1000000") pres = SliceViewer(ws) self._assertNoErrorInADSHandlerFromSeparateThread(partial( scale_ws, ws)) QApplication.sendPostedEvents() self.assertTrue( pres.view in self.find_widgets_of_type(str(type(pres.view)))) self.assertNotEqual(pres.ads_observer, None) pres.view.close()
def wait_for_thread(self, thread_model): if thread_model: thread_model._thread.wait() QApplication.sendPostedEvents()
def tearDown(self): self.assertTrue(self.view.close()) QApplication.sendPostedEvents()
def wait_for_thread(thread_model): if thread_model and thread_model.worker: while thread_model.worker.is_alive(): time.sleep(0.1) QApplication.sendPostedEvents()
def tearDown(self): if not sip.isdeleted(self.presenter.container): self.presenter.container.close() QApplication.sendPostedEvents()
def wait_for_thread(self, thread_model): while (thread_model._thread.isRunning()): QApplication.sendPostedEvents() time.sleep(0.1) QApplication.sendPostedEvents()
def tearDown(self): for ii in QApplication.topLevelWidgets(): ii.close() QApplication.sendPostedEvents() QApplication.sendPostedEvents() self.assert_no_toplevel_widgets()