def setUp(self): app_settings = MagicMock() self._temp_dir = TemporaryDirectory() url = "sqlite:///" + os.path.join(self._temp_dir.name, "db.sqlite") db_map = DiffDatabaseMapping(url, create=True) import_object_classes(db_map, ("class1",)) import_object_parameters(db_map, (("class1", "parameter1"), ("class1", "parameter2"))) import_objects(db_map, (("class1", "object1"), ("class1", "object2"))) import_object_parameter_values( db_map, ( ("class1", "object1", "parameter1", Map(["A", "B"], [1.1, 2.1])), ("class1", "object2", "parameter1", Map(["C", "D"], [1.2, 2.2])), ("class1", "object1", "parameter2", Map(["C", "D"], [-1.1, -2.1])), ("class1", "object2", "parameter2", Map(["A", "B"], [-1.2, -2.2])), ), ) db_map.commit_session("Add test data.") db_map.connection.close() with patch("spinetoolbox.spine_db_manager.SpineDBManager.thread", new_callable=PropertyMock) as mock_thread: mock_thread.return_value = QApplication.instance().thread() self._db_mngr = SpineDBManager(app_settings, None) with patch.object(SpineDBEditor, "restore_ui"): self._editor = SpineDBEditor(self._db_mngr, {url: db_map.codename}) object_class_index = self._editor.object_tree_model.index(0, 0) self._editor.object_tree_model.fetchMore(object_class_index) index = self._editor.object_tree_model.index(0, 0, object_class_index) for action in self._editor.pivot_action_group.actions(): if action.text() == self._editor._INDEX_EXPANSION: action.trigger() break self._editor.reload_pivot_table(index) self._model = self._editor.pivot_table_model self._model.start_fetching()
def test_data_nested_maps_BackgroundRole(self): nested_map = Map(["a", "b"], [1.1, 2.2]) map_value = Map(["A", "B"], [-1.1, nested_map]) model = MapModel(map_value) self.assertEqual(model.index(0, 0).data(Qt.BackgroundRole), None) self.assertEqual(model.index(1, 0).data(Qt.BackgroundRole), None) self.assertEqual(model.index(2, 0).data(Qt.BackgroundRole), None) self.assertEqual( model.index(3, 0).data(Qt.BackgroundRole), QColor(245, 245, 245)) self.assertEqual(model.index(0, 1).data(Qt.BackgroundRole), None) self.assertEqual(model.index(1, 1).data(Qt.BackgroundRole), None) self.assertEqual(model.index(2, 1).data(Qt.BackgroundRole), None) self.assertEqual( model.index(3, 1).data(Qt.BackgroundRole), QColor(245, 245, 245)) self.assertEqual( model.index(0, 2).data(Qt.BackgroundRole), QColor(255, 240, 240)) self.assertEqual(model.index(1, 2).data(Qt.BackgroundRole), None) self.assertEqual(model.index(2, 2).data(Qt.BackgroundRole), None) self.assertEqual( model.index(3, 2).data(Qt.BackgroundRole), QColor(245, 245, 245)) self.assertEqual( model.index(0, 3).data(Qt.BackgroundRole), QColor(245, 245, 245)) self.assertEqual( model.index(1, 3).data(Qt.BackgroundRole), QColor(245, 245, 245)) self.assertEqual( model.index(2, 3).data(Qt.BackgroundRole), QColor(245, 245, 245)) self.assertEqual( model.index(3, 3).data(Qt.BackgroundRole), QColor(245, 245, 245))
def test_headerData(self): nested_map = Map(["a", "b"], [1.1, 2.2]) map_value = Map(["A"], [nested_map]) model = MapModel(map_value) self.assertEqual(model.headerData(0, Qt.Horizontal), "Index") self.assertEqual(model.headerData(1, Qt.Horizontal), "Index or value") self.assertEqual(model.headerData(2, Qt.Horizontal), "Value") self.assertEqual(model.headerData(0, Qt.Vertical), 1)
def test_value_single_row_nested_map(self): nested_map = Map(["a"], [1.1]) map_value = Map(["A", "B"], [-1.1, nested_map]) model = MapModel(map_value) value_from_model = model.value() self.assertEqual(value_from_model.indexes, ["A", "B"]) self.assertEqual(value_from_model.values[0], -1.1) self.assertEqual(value_from_model.values[1].indexes, ["a"]) self.assertEqual(value_from_model.values[1].values, [1.1])
def test_value_shortening_rows(self): original = Map( ["a", "b", "c"], [0.0, Map(["bb"], [Map(["bbb"], [Array([-1.0])])]), Array([-2.0])]) model = MapModel(original) map_ = model.value() self.assertEqual(map_, original)
def test_data_DisplayRole_repeated_indexes_do_not_show(self): leaf_map = Map(["a", "b"], [1.1, 2.2]) nested_map = Map(["A"], [leaf_map]) root_map = Map(["root"], [nested_map]) model = MapModel(root_map) expected_data = [["root", "A", "a", 1.1], ["root", "A", "b", 2.2]] for row in range(2): for column in range(4): index = model.index(row, column) self.assertEqual(index.data(), expected_data[row][column])
def test_paste_to_empty_table(self): model = MapModel(Map([], [], str)) table_view = MapTableView() table_view.setModel(model) table_view.selectionModel().select(model.index(0, 0), QItemSelectionModel.Select) self._write_to_clipboard([["A", 2.3]]) self.assertTrue(table_view.paste()) self.assertEqual(model.rowCount(), 2) self.assertEqual(model.columnCount(), 3) self.assertEqual(model.value(), Map(["A"], [2.3]))
def test_removeRows_middle_row_in_nested_map(self): nested_map = Map(["a", "b", "c"], [1.1, 2.2, 3.3]) map_value = Map(["A"], [nested_map]) model = MapModel(map_value) self.assertTrue(model.removeRows(1, 1)) self.assertEqual(model.rowCount(), 3) expected_table = [["A", "a", 1.1, ""], ["A", "c", 3.3, ""], ["", "", "", ""]] for y, row in enumerate(expected_table): for x, expected in enumerate(row): self.assertEqual(model.index(y, x).data(), expected)
def test_paste_to_single_cell_pastes_everything(self): model = MapModel(Map(["A"], [2.3])) table_view = MapTableView() table_view.setModel(model) table_view.selectionModel().select(model.index(0, 0), QItemSelectionModel.Select) self._write_to_clipboard([["V", -5.5], ["W", -6.6]]) self.assertTrue(table_view.paste()) self.assertEqual(model.rowCount(), 3) self.assertEqual(model.columnCount(), 3) self.assertEqual(model.value(), Map(["V", "W"], [-5.5, -6.6]))
def test_data_nested_maps_FontRole(self): nested_map = Map(["a", "b"], [1.1, 2.2]) map_value = Map(["A", "B"], [-1.1, nested_map]) model = MapModel(map_value) self.assertEqual(model.index(0, 0).data(Qt.FontRole), None) self.assertEqual(model.index(1, 0).data(Qt.FontRole), None) self.assertEqual(model.index(2, 0).data(Qt.FontRole), None) self.assertTrue(model.index(0, 1).data(Qt.FontRole).bold()) self.assertEqual(model.index(1, 1).data(Qt.FontRole), None) self.assertEqual(model.index(2, 1).data(Qt.FontRole), None) self.assertEqual(model.index(0, 2).data(Qt.FontRole), None) self.assertTrue(model.index(1, 2).data(Qt.FontRole).bold()) self.assertTrue(model.index(2, 2).data(Qt.FontRole).bold())
def test_data_nested_maps_EditRole(self): nested_map = Map(["a", "b"], [1.1, 2.2]) map_value = Map(["A", "B"], [-1.1, nested_map]) model = MapModel(map_value) self.assertEqual(model.index(0, 0).data(Qt.EditRole), "A") self.assertEqual(model.index(1, 0).data(Qt.EditRole), "B") self.assertEqual(model.index(2, 0).data(Qt.EditRole), "B") self.assertEqual(model.index(0, 1).data(Qt.EditRole), -1.1) self.assertEqual(model.index(1, 1).data(Qt.EditRole), "a") self.assertEqual(model.index(2, 1).data(Qt.EditRole), "b") self.assertEqual(model.index(0, 2).data(Qt.EditRole), None) self.assertEqual(model.index(1, 2).data(Qt.EditRole), 1.1) self.assertEqual(model.index(2, 2).data(Qt.EditRole), 2.2)
def test_paste_large_data_to_small_selection_cuts_data(self): model = MapModel(Map(["A", "B", "C"], [2.3, 3.2, 4.3])) table_view = MapTableView() table_view.setModel(model) for row in (0, 1): table_view.selectionModel().select(model.index(row, 0), QItemSelectionModel.Select) self._write_to_clipboard([["Q", -4.4], ["V", -5.5], ["W", -6.6]]) self.assertTrue(table_view.paste()) self.assertEqual(model.rowCount(), 4) self.assertEqual(model.columnCount(), 3) m = model.value() self.assertEqual(model.value(), Map(["Q", "V", "C"], [2.3, 3.2, 4.3]))
def test_convert_leaf_maps(self): nested_map = Map( [DateTime("2020-07-03 12:00:00"), DateTime("2020-07-03 12:00:00")], [22.2, 23.3]) map_ = Map([1.0], [nested_map]) model = MapModel(map_) model.convert_leaf_maps() self.assertEqual(model.columnCount(), 3) self.assertEqual(model.rowCount(), 2) self.assertEqual(model.index(0, 0).data(), 1.0) self.assertEqual(model.index(0, 1).data(), "Time series") self.assertEqual(model.index(0, 2).data(), "") self.assertEqual(model.index(1, 0).data(), "") self.assertEqual(model.index(1, 1).data(), "") self.assertEqual(model.index(1, 2).data(), "")
def test_data_EditRole(self): map_value = Map(["a", "b"], [1.1, 2.2]) model = MapModel(map_value) self.assertEqual(model.index(0, 0).data(Qt.EditRole), "a") self.assertEqual(model.index(1, 0).data(Qt.EditRole), "b") self.assertEqual(model.index(0, 1).data(Qt.EditRole), 1.1) self.assertEqual(model.index(1, 1).data(Qt.EditRole), 2.2)
def test_flags(self): map_value = Map(["a"], [1.1]) model = MapModel(map_value) index = model.index(0, 0) self.assertEqual( model.flags(index), Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
def test_value_interleaved_rows_nested_maps_with_same_indexes(self): model = MapModel(Map(["a"], [0.0])) model.insertRows(1, 3) self.assertEqual(model.rowCount(), 5) model.append_column() self.assertEqual(model.columnCount(), 4) model.setData(model.index(0, 0), "key1") model.setData(model.index(0, 1), "kkey1") model.setData(model.index(0, 2), "value11") model.setData(model.index(1, 0), "key2") model.setData(model.index(1, 1), "kkey1") model.setData(model.index(1, 2), "value21") model.setData(model.index(2, 0), "key1") model.setData(model.index(2, 1), "kkey2") model.setData(model.index(2, 2), "value12") model.setData(model.index(3, 0), "key2") model.setData(model.index(3, 1), "kkey2") model.setData(model.index(3, 2), "value22") map_ = model.value() self.assertEqual(map_.indexes, ["key1", "key2"]) self.assertIsInstance(map_.values[0], Map) self.assertEqual(map_.values[0].indexes, ["kkey1", "kkey2"]) self.assertEqual(map_.values[0].values, ["value11", "value12"]) self.assertIsInstance(map_.values[1], Map) self.assertEqual(map_.values[1].indexes, ["kkey1", "kkey2"]) self.assertEqual(map_.values[1].values, ["value21", "value22"])
def test_add_dictionary_plot(self): plot_widget = PlotWidget() dictionary = Map(["key 1 ", "key 2"], [2.3, 5.5]) add_map_plot(plot_widget, dictionary) lines = plot_widget.canvas.axes.get_lines() self.assertEqual(len(lines), 1) self.assertEqual(list(lines[0].get_ydata(orig=True)), [2.3, 5.5])
def test_removeRows_single_row(self): map_value = Map(["a"], [1.1]) model = MapModel(map_value) self.assertTrue(model.removeRows(0, 1)) self.assertEqual(model.rowCount(), 1) self.assertEqual(model.columnCount(), 1) self.assertEqual(model.index(0, 0).data(), "")
def test_append_column(self): nested_map = Map(["a", "b"], [1.1, 2.2]) map_value = Map(["A", "B"], [-1.1, nested_map]) model = MapModel(map_value) model.append_column() self.assertEqual(model.columnCount(), 5) expected_table = [ ["A", -1.1, None, None, ""], ["B", "a", 1.1, None, ""], ["B", "b", 2.2, None, ""], ["", "", "", "", ""], ] for y, row in enumerate(expected_table): for x, expected in enumerate(row): index = model.index(y, x) self.assertEqual(index.data(), expected)
def test_setData_does_not_clear_value_if_it_is_zero(self): model = MapModel(Map([], [], str)) model.setData(model.index(0, 0), "idx") model.setData(model.index(0, 1), 0.0) self.assertEqual(model.rowCount(), 1 + 1) self.assertEqual(model.columnCount(), 2 + 1) self.assertEqual(model.index(0, 0).data(), "idx") self.assertEqual(model.index(0, 1).data(), 0.0)
def test_data_FontRole(self): map_value = Map(["a"], [1.1]) model = MapModel(map_value) self.assertEqual(model.index(0, 0).data(Qt.FontRole), None) self.assertEqual(model.index(1, 0).data(Qt.FontRole), None) self.assertTrue(model.index(0, 1).data(Qt.FontRole).bold()) self.assertEqual(model.index(1, 1).data(Qt.FontRole), None) self.assertEqual(model.index(0, 2).data(Qt.FontRole), None) self.assertEqual(model.index(1, 2).data(Qt.FontRole), None)
def test_data_BackgroundRole(self): map_value = Map(["a"], [1.1]) model = MapModel(map_value) expected = QColor(245, 245, 245) self.assertEqual(model.index(0, 0).data(Qt.BackgroundRole), None) self.assertEqual(model.index(1, 0).data(Qt.BackgroundRole), expected) self.assertEqual(model.index(0, 1).data(Qt.BackgroundRole), None) self.assertEqual(model.index(1, 1).data(Qt.BackgroundRole), expected) self.assertEqual(model.index(0, 2).data(Qt.BackgroundRole), expected) self.assertEqual(model.index(1, 2).data(Qt.BackgroundRole), expected)
def _reconstruct_map(rows, first_row, last_row, column_index): if not rows: return Map([], []) block_start_row = first_row index = None indexes = list() values = list() for row_index in range(first_row, last_row + 1): row = rows[row_index][column_index:] if index is None: index = row[0] if index is None: raise ParameterValueFormatError( f"Index missing on row {first_row + row_index} column {column_index}." ) is_leaf = len(row) == 2 or row[2] is None if is_leaf: indexes.append(index) value = row[1] if value is None: raise ParameterValueFormatError( f"Value missing on row {first_row + row_index} column {column_index}." ) values.append(value) index = None block_start_row = row_index + 1 continue if row_index < last_row: next_index = rows[row_index + 1][column_index] if next_index == index: continue value = _reconstruct_map(rows, block_start_row, row_index, column_index + 1) indexes.append(index) values.append(value) index = None block_start_row = row_index + 1 continue value = _reconstruct_map(rows, block_start_row, row_index, column_index + 1) indexes.append(index) values.append(value) return Map(indexes, values)
def test_removeRows_last_row(self): map_value = Map(["a", "b"], [1.1, 2.2]) model = MapModel(map_value) self.assertTrue(model.removeRows(0, 1)) self.assertEqual(model.rowCount(), 2) self.assertEqual(model.index(0, 0).data(), "b") self.assertEqual(model.index(0, 1).data(), 2.2) self.assertEqual(model.index(0, 2).data(), "") self.assertEqual(model.index(1, 0).data(), "") self.assertEqual(model.index(1, 1).data(), "") self.assertEqual(model.index(1, 2).data(), "")
def test_insertRows_to_end(self): map_value = Map(["a"], [1.1]) model = MapModel(map_value) self.assertTrue(model.insertRows(1, 1)) self.assertEqual(model.rowCount(), 3) self.assertEqual(model.index(0, 0).data(), "a") self.assertEqual(model.index(0, 1).data(), 1.1) self.assertEqual(model.index(0, 2).data(), "") self.assertEqual(model.index(1, 0).data(), "a") self.assertEqual(model.index(1, 1).data(), 1.1) self.assertEqual(model.index(1, 2).data(), "")
def test_copy_selection(self): model = MapModel(Map(["A"], [2.3])) table_view = MapTableView() table_view.setModel(model) for column in (0, 1): table_view.selectionModel().select(model.index(0, column), QItemSelectionModel.Select) self.assertTrue(table_view.copy()) clip = StringIO(QApplication.clipboard().text()) table = [row for row in csv.reader(clip, delimiter="\t")] self.assertEqual(table, [["A", "2.3"]])
def __init__(self, parent=None): from ..ui.map_editor import Ui_MapEditor # pylint: disable=import-outside-toplevel super().__init__(parent) self._model = MapModel(Map(["key_1"], [0.0])) self._ui = Ui_MapEditor() self._ui.setupUi(self) self._ui.map_table_view.setModel(self._model) self._ui.map_table_view.setContextMenuPolicy(Qt.CustomContextMenu) self._ui.map_table_view.customContextMenuRequested.connect( self._show_table_context_menu)
def test_insertRows_to_empty_model(self): map_value = Map([], [], str) model = MapModel(map_value) self.assertEqual(model.rowCount(), 1) self.assertTrue(model.insertRows(0, 1)) self.assertEqual(model.rowCount(), 2) self.assertEqual(model.index(0, 0).data(), None) self.assertEqual(model.index(0, 1).data(), None) self.assertEqual(model.index(0, 2).data(), "") self.assertEqual(model.index(1, 0).data(), "") self.assertEqual(model.index(1, 1).data(), "") self.assertEqual(model.index(1, 2).data(), "")
def test_show_value_editor(self): editor = MapEditor() editor.set_value(Map(["a"], [-1.0])) table_view = editor._ui.map_table_view model = table_view.model() rect = table_view.visualRect(model.index(0, 0)) editor.open_value_editor = MagicMock() menu = MapTableContextMenu(editor, table_view, rect.center()) open_action = _find_action(menu, "Open value editor...") self.assertIsNotNone(open_action) open_action.trigger() editor.open_value_editor.assert_called_once_with(model.index(0, 0))
def test_data_DisplayRole(self): map_value = Map(["a", "b"], [1.1, 2.2]) model = MapModel(map_value) self.assertEqual(model.index(0, 0).data(), "a") self.assertEqual(model.index(1, 0).data(), "b") self.assertEqual(model.index(2, 0).data(), "") self.assertEqual(model.index(0, 1).data(), 1.1) self.assertEqual(model.index(1, 1).data(), 2.2) self.assertEqual(model.index(2, 1).data(), "") self.assertEqual(model.index(0, 2).data(), "") self.assertEqual(model.index(1, 2).data(), "") self.assertEqual(model.index(2, 2).data(), "")