def test_view_tabs(qtbot: QtBot): viewspace = ViewSpace() qtbot.addWidget(viewspace) viewspace.show() view = viewspace.activeView() # Creating tabs with qtbot.waitSignal(view.numTabsChanged): view.addTab("1", _TestViewWidget(1, view)) with qtbot.waitSignal(viewspace.numTabsChanged): view.addTab("3", _TestViewWidget(3, view)) with qtbot.waitSignal(view.numTabsChanged): view.insertTab(1, "2", _TestViewWidget(2, view)) assert view.tabs.count() == 3 assert [view.tabs.tabText(i) for i in range(3)] == ["1", "2", "3"] assert [view.stack.widget(i).idx for i in range(3)] == [1, 2, 3] # Moving tabs with qtbot.assertNotEmitted(view.numTabsChanged, wait=100): view.tabs.moveTab(2, 0) assert [view.tabs.tabText(i) for i in range(3)] == ["3", "1", "2"] assert [view.stack.widget(i).idx for i in range(3)] == [3, 1, 2] # Removing tabs with qtbot.waitSignal(viewspace.numTabsChanged): view.removeTab(1) assert view.tabs.count() == 2 assert [view.tabs.tabText(i) for i in range(2)] == ["3", "2"] assert [view.stack.widget(i).idx for i in range(2)] == [3, 2] # view.setTabModified(0, True) # assert view.tabs.tabIcon(0).name() == "document-save" # assert view.tabs.tabIcon(1).name() == "" view.removeTab(0) assert len(view.widgets()) == 1 view.removeTab(0) assert len(view.widgets()) == 0
def test_add_color(self, qtbot: QtBot): widget = ColormapCreator() colormap_edit = widget.show_colormap color1 = QColor(10, 40, 12) color2 = QColor(100, 4, 220) widget.color_picker.setCurrentColor(color1) with qtbot.waitSignal(colormap_edit.double_clicked): qtbot.mouseDClick(colormap_edit, Qt.LeftButton, pos=QPoint(30, widget.height() // 2)) assert len(widget.current_colormap()) == 1 assert widget.current_colormap()[0].color == Color(10, 40, 12) assert isclose(widget.current_colormap()[0].color_position, 20 / (colormap_edit.width() - 20)) widget.color_picker.setCurrentColor(color2) with qtbot.waitSignal(colormap_edit.double_clicked): qtbot.mouseDClick(colormap_edit, Qt.LeftButton, pos=QPoint(80, widget.height() // 2)) assert len(widget.current_colormap()) == 2 assert widget.current_colormap()[0].color == Color(10, 40, 12) assert widget.current_colormap()[1].color == Color(100, 4, 220) assert isclose(widget.current_colormap()[0].color_position, 20 / (colormap_edit.width() - 20)) assert isclose(widget.current_colormap()[1].color_position, 70 / (colormap_edit.width() - 20))
def test_add_color(self, qtbot: QtBot): widget = ColormapCreator() colormap_edit = widget.show_colormap color1 = QColor(10, 40, 12) color2 = QColor(100, 4, 220) widget.color_picker.setCurrentColor(color1) with qtbot.waitSignal(colormap_edit.double_clicked): qtbot.mouseDClick(colormap_edit, Qt.LeftButton, pos=QPoint(30, widget.height() // 2)) assert len(widget.current_colormap().colors) == 3 assert np.allclose(widget.current_colormap().colors[0], Color(10 / 255, 40 / 255, 12 / 255)) assert isclose(widget.current_colormap().controls[1], 20 / (colormap_edit.width() - 20)) widget.color_picker.setCurrentColor(color2) with qtbot.waitSignal(colormap_edit.double_clicked): qtbot.mouseDClick(colormap_edit, Qt.LeftButton, pos=QPoint(80, widget.height() // 2)) assert len(widget.current_colormap().colors) == 4 assert np.allclose(widget.current_colormap().colors[1], Color(10 / 255, 40 / 255, 12 / 255)) assert np.allclose(widget.current_colormap().colors[2], Color(100 / 255, 4 / 255, 220 / 255)) assert isclose(widget.current_colormap().controls[1], 20 / (colormap_edit.width() - 20)) assert isclose(widget.current_colormap().controls[2], 70 / (colormap_edit.width() - 20))
def test_exposure_widget(qtbot: QtBot): CORE.setExposure(15) wdg = DefaultCameraExposureWidget(core=CORE) qtbot.addWidget(wdg) # check that it get's whatever core is set to. assert wdg.spinBox.value() == 15 with qtbot.waitSignal(CORE.events.exposureChanged): CORE.setExposure(30) assert wdg.spinBox.value() == 30 with qtbot.wait_signal(CORE.events.exposureChanged): wdg.spinBox.setValue(45) assert CORE.getExposure() == 45 # test updating cameraDevice CORE.setProperty("Core", "Camera", "") assert not wdg.isEnabled() with pytest.raises(RuntimeError): wdg.setCamera("blarg") # set to an invalid camera name # should now be disabled. wdg.setCamera("blarg", force=True) assert not wdg.isEnabled() # reset the camera to a working one CORE.setProperty("Core", "Camera", "Camera") with qtbot.wait_signal(CORE.events.exposureChanged): wdg.spinBox.setValue(12) assert CORE.getExposure() == 12
def test_mouse_press_redirect_filter(qtbot: QtBot): a = EventTestWidget() b = EventTestWidget() qtbot.addWidget(a) qtbot.addWidget(b) b.installEventFilter(MousePressRedirectFilter(a)) with qtbot.waitSignal(a.eventSuccess): qtbot.mousePress(b, QtCore.Qt.LeftButton) with qtbot.waitSignal(b.eventSuccess): qtbot.mousePress(b, QtCore.Qt.LeftButton) with qtbot.assertNotEmitted(a.eventSuccess): qtbot.keyPress(b, QtCore.Qt.Key_Enter)
def test_leftclick_no_drag(self, qtbot: QtBot, mf_widget: MinefieldWidget): """ Test left-clicks with drag select off. """ assert mf_widget._state.drag_select is False ## Basic left down and release on a cell. with qtbot.waitSignal(mf_widget.at_risk_signal): self.left_press((0, 1)) self.assert_cell_sank((0, 1)) self.left_release() mf_widget._ctrlr.select_cell.assert_called_with((0, 1)) ## Mouse move. self.left_press((1, 0)) # Move one cell away. self.mouse_move((2, 0)) self.assert_cell_sank((2, 0)) self.assert_cell_rose((1, 0)) self.reset_mocks() # Move to corner of adjacent cell. self.mouse_move((3, 0), pos=(0, 0)) self.assert_cell_sank((3, 0)) self.assert_cell_rose((2, 0)) self.reset_mocks() # Move to opposite corner of the same cell. self.mouse_move((3, 0), pos=(self.btn_size - 1, self.btn_size - 1)) self.assert_cells_unchanged() self.reset_mocks() # Move off the board. self.mouse_move((3, -1)) self.assert_cell_rose((3, 0)) self.assert_num_cells_changed(1) self.reset_mocks() # Move back onto the board. self.mouse_move((0, 2)) self.assert_cell_sank((0, 2)) self.assert_num_cells_changed(1) self.reset_mocks() # Jump across board (supported?). self.mouse_move((7, 7)) self.assert_cell_sank((7, 7)) self.assert_cell_rose((0, 2)) self.assert_num_cells_changed(2) self.reset_mocks() # Move off bottom edge. self.mouse_move((7, 8)) self.assert_cell_rose((7, 7)) self.assert_num_cells_changed(1) self.reset_mocks() # Move on at right edge. self.mouse_move((3, 7), pos=(self.btn_size // 2, self.btn_size - 1)) self.assert_cell_sank((3, 7)) self.assert_num_cells_changed(1) self.reset_mocks() # Release. self.left_release() mf_widget._ctrlr.select_cell.assert_called_with((3, 7)) self.reset_mocks()
def test_numpy_array_table_model(qtbot: QtBot): model = NumpyArrayTableModel(np.random.random((5, 3))) assert model.columnCount() == 3 assert model.rowCount() == 5 with qtbot.waitSignal(model.rowsInserted): model.insertRows(1, 1) assert model.array.shape == (6, 3) assert np.all(model.array[1, :] == model.fill_value) with qtbot.waitSignal(model.rowsRemoved): model.removeRows(1, 1) assert model.array.shape == (5, 3) with qtbot.waitSignal(model.columnsInserted): model.insertColumns(0, 2) assert model.array.shape == (5, 5) assert np.all(model.array[:, 0] == model.fill_value) with qtbot.waitSignal(model.columnsRemoved): model.removeColumns(0, 2) assert model.array.shape == (5, 3) assert model.data(model.index(0, 0)) == str(model.array[0, 0]) assert model.data(model.index(0, -1)) is None assert model.data(model.index(0, 4)) is None assert model.data(model.index(10, 0)) is None with qtbot.waitSignal(model.dataChanged): assert model.setData(model.index(0, 0), np.nan) assert not model.setData(model.index(0, -1), np.nan) assert not model.setData(model.index(0, 3), np.nan) assert not model.setData(model.index(0, 0), np.nan, QtCore.Qt.DisplayRole) assert not model.setData(model.index(0, 0), "false") assert model.data(model.index(0, 0)) == "nan" assert model.flags(model.index(0, 0)) & QtCore.Qt.ItemIsEditable != 0 assert model.headerData(0, QtCore.Qt.Vertical, QtCore.Qt.DisplayRole) == "0"
def test_info_dialog(qtbot: QtBot): dialog = dialogs.InformationDialog({"a": "A", "b": "B"}) qtbot.addWidget(dialog) dialog.open() assert dialog.table.rowCount() == 3 dialog.table.item(2, 0).setText("b") assert dialog.table.rowCount() == 4 assert not dialog.isComplete() dialog.table.item(2, 0).setText("c") assert dialog.isComplete() dialog.table.item(2, 1).setText("C") assert dialog.table.rowCount() == 4 with qtbot.waitSignal(dialog.infoChanged) as emit: dialog.accept() assert emit.args[0] == {"a": "A", "b": "B", "c": "C"}
def test_laser_view(qtbot: QtBot): viewspace = LaserViewSpace() qtbot.addWidget(viewspace) viewspace.show() view = viewspace.activeView() laser = view.addLaser(Laser(rand_data(["A1", "B2", "C3"]))) qtbot.waitExposed(laser) view.tabs.setTabText(0, "newname") assert view.stack.widget(0).laserName() == "newname" view.contextMenuEvent( QtGui.QContextMenuEvent(QtGui.QContextMenuEvent.Mouse, QtCore.QPoint(0, 0))) # Drop event drag_mime = QtCore.QMimeData() path = Path(__file__).parent.joinpath("data", "io", "npz", "test.npz") drag_mime.setUrls([QtCore.QUrl.fromLocalFile(str(path.resolve()))]) drag_event = QtGui.QDragEnterEvent( QtCore.QPoint(0, 0), QtCore.Qt.CopyAction, drag_mime, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, ) view.dragEnterEvent(drag_event) assert drag_event.isAccepted() drop_event = QtGui.QDropEvent( QtCore.QPoint(0, 0), QtCore.Qt.CopyAction, drag_mime, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, ) with qtbot.waitSignal(view.numTabsChanged): view.dropEvent(drop_event) assert drop_event.isAccepted() assert len(view.widgets()) == 2 dlg = view.actionOpen() dlg.show() dlg.close()
def test_click(self, qtbot: QtBot): widget = ColormapEdit() qtbot.addWidget(widget) width = widget.width() - 20 with qtbot.waitSignal(widget.double_clicked): qtbot.mouseDClick(widget, Qt.LeftButton, pos=QPoint(30, widget.height() // 2)) pos = 20 / width widget.add_color(ColorPosition(pos, Color(125, 231, 21))) assert len(widget.colormap) == 1 with qtbot.assertNotEmitted(widget.double_clicked): qtbot.mouseDClick(widget, Qt.LeftButton, pos=QPoint(30, widget.height() // 2)) assert len(widget.colormap) == 0
def test_click(self, qtbot: QtBot): widget = ColormapEdit() qtbot.addWidget(widget) width = widget.width() - 20 with qtbot.waitSignal(widget.double_clicked): qtbot.mouseDClick(widget, Qt.LeftButton, pos=QPoint(30, widget.height() // 2)) pos = 20 / width widget.add_color(pos, Color(0.274, 0.02, 0.745)) widget.add_color(pos / 2, Color(0.274, 0.2, 0.745)) assert len(widget.colormap.colors) == 4 with qtbot.assertNotEmitted(widget.double_clicked): qtbot.mouseDClick(widget, Qt.LeftButton, pos=QPoint(30, widget.height() // 2)) assert len(widget.colormap.colors) == 3
def test_wizard_import_path_widget_directory(qtbot: QtBot): widget = options.PathSelectWidget(path, "Agilent Batch", [".b"], "Directory") qtbot.addWidget(widget) assert not widget.isComplete() drag_mime = QtCore.QMimeData() drag_mime.setUrls( [ QtCore.QUrl.fromLocalFile( str(path.joinpath("agilent", "test_ms.b").resolve()) ) ] ) drag_event = QtGui.QDragEnterEvent( QtCore.QPoint(0, 0), QtCore.Qt.CopyAction, drag_mime, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, ) widget.dragEnterEvent(drag_event) assert drag_event.isAccepted() drop_event = QtGui.QDropEvent( QtCore.QPoint(0, 0), QtCore.Qt.CopyAction, drag_mime, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, ) with qtbot.waitSignal(widget.pathChanged): widget.dropEvent(drop_event) assert drop_event.isAccepted() assert Path(widget.lineedit_path.text()).samefile( path.joinpath("agilent", "test_ms.b") ) assert widget.isComplete() dlg = widget.selectPath() assert dlg.fileMode() == QtWidgets.QFileDialog.Directory dlg.close()
def test_wizard_import_text(qtbot: QtBot): wiz = ImportWizard(path.joinpath("textimage", "csv.csv")) qtbot.addWidget(wiz) wiz.show() qtbot.waitExposed(wiz) # Format page = wiz.currentPage() page.radio_text.setChecked(True) wiz.next() assert wiz.currentId() == wiz.page_text # Path and Options wiz.next() # Config page = wiz.currentPage() with qtbot.waitSignal(wiz.laserImported) as emit: wiz.accept() assert emit.args[0].shape == (5, 5)
def test_wizard_srr_import_text(qtbot: QtBot): path = Path(__file__).parent.joinpath("data", "io") wiz = SRRImportWizard([ path.joinpath("textimage", "srr1.csv"), path.joinpath("textimage", "srr2.csv"), ], ) qtbot.addWidget(wiz) wiz.show() qtbot.waitExposed(wiz) # Format page = wiz.currentPage() page.radio_text.setChecked(True) wiz.next() assert wiz.currentId() == wiz.page_text wiz.next() with qtbot.waitSignal(wiz.laserImported) as emit: wiz.accept() assert len(emit.args[0].data) == 2
def test_wizard_import_thermo(qtbot: QtBot): wiz = ImportWizard(path.joinpath("thermo", "icap_columns.csv")) qtbot.addWidget(wiz) wiz.show() qtbot.waitExposed(wiz) # Format page = wiz.currentPage() page.radio_thermo.setChecked(True) wiz.next() assert wiz.currentId() == wiz.page_thermo # Path and Options wiz.next() # Config page = wiz.currentPage() assert page.lineedit_scantime.text() == "1.0049" with qtbot.waitSignal(wiz.laserImported) as emit: wiz.accept() assert emit.args[0].shape == (5, 5)
def test_wizard_import_agilent(qtbot: QtBot): wiz = ImportWizard(path.joinpath("agilent", "test_ms.b")) qtbot.addWidget(wiz) wiz.show() qtbot.waitExposed(wiz) # Format page = wiz.currentPage() page.radio_agilent.setChecked(True) wiz.next() assert wiz.currentId() == wiz.page_agilent # Path and Options wiz.next() # Config page = wiz.currentPage() assert page.lineedit_scantime.text() == "0.5" with qtbot.waitSignal(wiz.laserImported) as emit: wiz.accept() assert emit.args[0].shape == (5, 5)
def test_name_edit_dialog(qtbot: QtBot): dialog = dialogs.NameEditDialog(["a", "b"], allow_remove=True) qtbot.addWidget(dialog) dialog.open() dialog.addName("c") dialog.addNames(["d", "e"]) dialog.list.item(0).setText("A") dialog.list.item(1).setCheckState(QtCore.Qt.Unchecked) assert np.all([ dialog.list.item(i).data(dialog.originalNameRole) for i in range(dialog.list.count()) ] == ["a", "b", "c", "d", "e"], ) assert np.all([ dialog.list.item(i).text() for i in range(dialog.list.count()) ] == ["A", "b", "c", "d", "e"], ) with qtbot.waitSignal(dialog.namesSelected) as emit: dialog.accept() assert np.all(list(emit.args[0].keys()) == ["a", "c", "d", "e"])
def test_wizard_import_perkinelemer(qtbot: QtBot): wiz = ImportWizard(path.joinpath("perkinelmer", "perkinelmer")) qtbot.addWidget(wiz) wiz.show() qtbot.waitExposed(wiz) # Format page = wiz.currentPage() page.radio_perkinelmer.setChecked(True) wiz.next() assert wiz.currentId() == wiz.page_perkinelmer # Path and Options wiz.next() # Config page = wiz.currentPage() assert page.lineedit_speed.text() == "100" assert page.lineedit_scantime.text() == "0.2" assert page.lineedit_spotsize.text() == "300" with qtbot.waitSignal(wiz.laserImported) as emit: wiz.accept() assert emit.args[0].shape == (3, 3)
def test_import_thread(qtbot: QtBot): path = Path(__file__).parent.joinpath("data", "io") paths = [ path.joinpath("agilent", "test_ms.b"), path.joinpath("csv", "generic"), path.joinpath("npz", "test.npz"), path.joinpath("perkinelmer", "perkinelmer"), path.joinpath("textimage", "csv.csv"), path.joinpath("textimage", "text.text"), path.joinpath("thermo", "icap_columns.csv"), ] thread = ImportThread(paths, Config()) signals = [(thread.importFinished, path.name) for path in paths] signals.extend([(thread.progressChanged, path.name) for path in paths]) with qtbot.waitSignals(signals): thread.run() # Failing import paths = [path.joinpath("fake", "data.npz")] thread = ImportThread(paths, Config()) with qtbot.waitSignal(thread.importFailed): thread.run()
def test_view_space_add_remove(qtbot: QtBot): viewspace = ViewSpace() qtbot.addWidget(viewspace) viewspace.show() assert len(viewspace.views) == 1 with qtbot.waitSignal(viewspace.numViewsChanged): viewspace.splitActiveHorizontal() assert len(viewspace.views) == 2 viewspace.setActiveView(viewspace.views[1]) with qtbot.waitSignal(viewspace.numViewsChanged): viewspace.splitActiveVertical() assert len(viewspace.views) == 3 with qtbot.waitSignal(viewspace.numViewsChanged): viewspace.splitView(viewspace.views[2], QtCore.Qt.Horizontal) assert len(viewspace.views) == 4 # Should be 1 view on left, 1 on top right, 2 bottom right assert viewspace.count() == 2 assert isinstance(viewspace.widget(0), View) assert isinstance(viewspace.widget(1), QtWidgets.QSplitter) assert viewspace.widget(1).count() == 2 assert isinstance(viewspace.widget(1).widget(0), View) assert isinstance(viewspace.widget(1).widget(1), QtWidgets.QSplitter) assert viewspace.widget(1).widget(1).count() == 2 assert isinstance(viewspace.widget(1).widget(1).widget(0), View) assert isinstance(viewspace.widget(1).widget(1).widget(1), View) with qtbot.waitSignal(viewspace.numViewsChanged): viewspace.closeView(viewspace.views[0]) assert len(viewspace.views) == 3 # Should be 1 view on top, 1 on bottom left, 1 bottom right # Original splitter changes orientation, inherits children of right splitter assert viewspace.count() == 2 assert viewspace.orientation() == QtCore.Qt.Vertical assert isinstance(viewspace.widget(0), View) assert isinstance(viewspace.widget(1), QtWidgets.QSplitter) assert viewspace.widget(1).count() == 2 assert isinstance(viewspace.widget(1).widget(0), View) assert isinstance(viewspace.widget(1).widget(1), View) # Active widget should be first in latest view for view in viewspace.views: view.addTab("", _ViewWidget(view)) assert viewspace.activeWidget() == viewspace.views[2].widgets()[0] assert viewspace.countViewTabs() == 3 # Close them all with qtbot.waitSignal(viewspace.numViewsChanged): viewspace.closeActiveView() assert len(viewspace.views) == 2 with qtbot.waitSignal(viewspace.numViewsChanged): viewspace.closeActiveView() assert len(viewspace.views) == 1 with qtbot.assertNotEmitted(viewspace.numViewsChanged, wait=100): viewspace.closeActiveView() assert len(viewspace.views) == 1 assert viewspace.countViewTabs() == 1