def test_batch_set_data(self): model = TimePatternModel(TimePattern(['a', 'b', 'c'], [-5.0, 3.0, 7.0])) indexes = [model.index(0, 0), model.index(1, 1), model.index(2, 1)] values = ['A', 55.5, -55.5] model.batch_set_data(indexes, values) expected = TimePattern(['A', 'b', 'c'], [-5.0, 55.5, -55.5]) self.assertEqual(model.value, expected)
def test_insert_multiple_rows_in_the_middle(self): model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0])) self.assertTrue(model.insertRows(1, 3)) self.assertEqual(len(model.value), 5) self.assertEqual(model.value.indexes, ['a', '2', '3', '4', 'b']) numpy.testing.assert_equal(model.value.values, np.array([-5.0, 0.0, 0.0, 0.0, 7.0]))
def test_insert_rows_in_the_end(self): model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0])) self.assertTrue(model.insertRows(2, 1)) self.assertEqual(len(model.value), 3) self.assertEqual(model.value.indexes, ['a', 'b', '3']) numpy.testing.assert_equal(model.value.values, np.array([-5.0, 7.0, 0.0]))
def test_remove_rows_from_the_middle(self): model = TimePatternModel(TimePattern(['a', 'b', 'c'], [-5.0, 3.0, 7.0])) self.assertTrue(model.removeRows(1, 1)) self.assertEqual(len(model.value), 2) self.assertEqual(model.value.indexes, ['a', 'c']) numpy.testing.assert_equal(model.value.values, np.array([-5.0, 7.0]))
def insertRows(self, row, count, parent=QModelIndex()): """ Inserts new time period - value pairs into the pattern. New time periods are initialized to empty strings and the corresponding values to zeros. Args: row (int): an index where to insert the new data count (int): number of time period - value pairs to insert parent (QModelIndex): an index to a parent model Returns: bool: True if the operation was successful """ self.beginInsertRows(parent, row, row + count - 1) old_indexes = self._value.indexes old_values = self._value.values new_indexes = list(old_indexes) for i in range(count): new_indexes.insert(row, str(row + (count - i))) if row == len(old_values): new_values = np.append(old_values, np.zeros(count)) else: new_values = np.insert(old_values, row, np.zeros(count)) self._value = TimePattern(new_indexes, new_values) self.endInsertRows() return True
def removeRows(self, row, count, parent=QModelIndex()): """ Removes time period - value pairs from the pattern. Args: row (int): an index where to remove the data count (int): number of time period - value pairs to remove parent (QModelIndex): an index to a parent model Returns: bool: True if the operation was successful """ if len(self._value) == 1: return False if count == len(self._value): count = len(self._value) - 1 row = 1 self.beginRemoveRows(parent, row, row + count - 1) old_indexes = self._value.indexes old_values = self._value.values new_indexes = list(old_indexes) del new_indexes[row:row + count] remove_indexes = range(row, row + count) if count > 1 else row new_values = np.delete(old_values, remove_indexes) self._value = TimePattern(new_indexes, new_values) self.endRemoveRows() return True
def test_flags(self): model = TimePatternModel(TimePattern(["", ""], [0.0, 0.0])) for row in range(len(model.value)): for column in range(2): model_index = model.index(row, column) self.assertEqual( model.flags(model_index), Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
def __init__(self, parent=None): from ..ui.time_pattern_editor import Ui_TimePatternEditor # pylint: disable=import-outside-toplevel super().__init__(parent) self._model = TimePatternModel(TimePattern(["1-7d"], [0.0])) self._ui = Ui_TimePatternEditor() self._ui.setupUi(self) self._ui.pattern_edit_table.setModel(self._model) self._ui.pattern_edit_table.setContextMenuPolicy(Qt.CustomContextMenu) self._ui.pattern_edit_table.customContextMenuRequested.connect(self._show_table_context_menu)
def __init__(self, parent=None): from ..ui.time_pattern_editor import Ui_TimePatternEditor super().__init__(parent) self._model = TimePatternModel(TimePattern(["1-7d"], [0.0])) self._ui = Ui_TimePatternEditor() self._ui.setupUi(self) self._pattern_edit_table = IndexedValueTableView(self) self.layout().addWidget(self._pattern_edit_table) self._pattern_edit_table.setModel(self._model) self._pattern_edit_table.setContextMenuPolicy(Qt.CustomContextMenu) self._pattern_edit_table.customContextMenuRequested.connect(self._show_table_context_menu)
def test_remove_rows_with_time_pattern_editor(self): editor = TimePatternEditor() editor.set_value(TimePattern(["1d", "2d"], [-1.1, -2.2])) table_view = editor._ui.pattern_edit_table table_view.selectRow(0) model = table_view.model() rect = table_view.visualRect(model.index(0, 0)) menu = ArrayTableContextMenu(editor, table_view, rect.center()) remove_action = _find_action(menu, "Remove rows") self.assertIsNotNone(remove_action) remove_action.trigger() self.assertEqual(model.rowCount(), 1 + 1) self.assertEqual(model.index(0, 0).data(), "2d") self.assertEqual(model.index(0, 1).data(), -2.2)
def test_insert_row_before_with_time_pattern_editor(self): editor = TimePatternEditor() editor.set_value(TimePattern(["1d"], [-1.1])) table_view = editor._ui.pattern_edit_table table_view.selectRow(0) model = table_view.model() rect = table_view.visualRect(model.index(0, 0)) menu = IndexedValueTableContextMenu(table_view, rect.center()) insert_action = _find_action(menu, "Insert row before") self.assertIsNotNone(insert_action) insert_action.trigger() self.assertEqual(model.rowCount(), 2 + 1) self.assertEqual(model.index(0, 0).data(), "1") self.assertEqual(model.index(0, 1).data(), 0.0) self.assertEqual(model.index(1, 0).data(), "1d") self.assertEqual(model.index(1, 1).data(), -1.1)
def _create_database(directory): """Creates a database with objects, relationship, parameters and values.""" url = TestExcelIntegration._sqlite_url(_TEMP_SQLITE_FILENAME, directory) create_new_spine_database(url) db_map = DiffDatabaseMapping(url, username='******', upgrade=True) # create empty database for loading excel into url = TestExcelIntegration._sqlite_url(_TEMP_SQLITE_TEST_FILENAME, directory) create_new_spine_database(url) db_map_test = DiffDatabaseMapping(url, username='******', upgrade=True) # delete all object_classes to empty database oc = set(oc.id for oc in db_map_test.object_class_list().all()) if oc: db_map_test.remove_items(object_class_ids=oc) db_map_test.commit_session('empty database') oc = set(oc.id for oc in db_map.object_class_list().all()) if oc: db_map.remove_items(object_class_ids=oc) db_map.commit_session('empty database') # create object classes oc_1 = db_map.add_object_class(**{'name': 'object_class_1'}) oc_2 = db_map.add_object_class(**{'name': 'object_class_2'}) oc_3 = db_map.add_object_class(**{'name': 'object_class_3'}) # create relationship classes relc1 = db_map.add_wide_relationship_class( **{ 'name': 'relationship_class', 'object_class_id_list': [oc_1.id, oc_2.id] }) relc2 = db_map.add_wide_relationship_class( **{ 'name': 'relationship_class2', 'object_class_id_list': [oc_1.id, oc_2.id] }) # create objects oc1_obj1 = db_map.add_object(**{ 'name': 'oc1_obj1', 'class_id': oc_1.id }) oc1_obj2 = db_map.add_object(**{ 'name': 'oc1_obj2', 'class_id': oc_1.id }) oc2_obj1 = db_map.add_object(**{ 'name': 'oc2_obj1', 'class_id': oc_2.id }) oc2_obj2 = db_map.add_object(**{ 'name': 'oc2_obj2', 'class_id': oc_2.id }) oc3_obj1 = db_map.add_object(**{ 'name': 'oc3_obj1', 'class_id': oc_3.id }) # add relationships rel1 = db_map.add_wide_relationship( **{ 'name': 'rel1', 'class_id': relc1.id, 'object_id_list': [oc1_obj1.id, oc2_obj1.id] }) rel2 = db_map.add_wide_relationship( **{ 'name': 'rel2', 'class_id': relc1.id, 'object_id_list': [oc1_obj2.id, oc2_obj2.id] }) # create parameters p1 = db_map.add_parameter_definitions(*[{ 'name': 'parameter1', 'object_class_id': oc_1.id }])[0].first() p2 = db_map.add_parameter_definitions(*[{ 'name': 'parameter2', 'object_class_id': oc_1.id }])[0].first() p3 = db_map.add_parameter_definitions(*[{ 'name': 'parameter3', 'object_class_id': oc_2.id }])[0].first() p4 = db_map.add_parameter_definitions(*[{ 'name': 'parameter4', 'object_class_id': oc_2.id }])[0].first() p5 = db_map.add_parameter_definitions(*[{ 'name': 'parameter5', 'object_class_id': oc_3.id }])[0].first() p6 = db_map.add_parameter_definitions(*[{ 'name': 'parameter6', 'object_class_id': oc_3.id }])[0].first() rel_p1 = db_map.add_parameter_definitions( *[{ 'name': 'rel_parameter1', 'relationship_class_id': relc1.id }])[0].first() rel_p2 = db_map.add_parameter_definitions( *[{ 'name': 'rel_parameter2', 'relationship_class_id': relc1.id }])[0].first() rel_p3 = db_map.add_parameter_definitions( *[{ 'name': 'rel_parameter3', 'relationship_class_id': relc1.id }])[0].first() rel_p4 = db_map.add_parameter_definitions( *[{ 'name': 'rel_parameter4', 'relationship_class_id': relc1.id }])[0].first() # add parameter values db_map.add_parameter_value( **{ 'parameter_definition_id': p1.id, 'object_id': oc1_obj1.id, 'object_class_id': oc_1.id, 'value': '0' }) db_map.add_parameter_value( **{ 'parameter_definition_id': p2.id, 'object_id': oc1_obj2.id, 'object_class_id': oc_1.id, 'value': '3.5' }) db_map.add_parameter_value( **{ 'parameter_definition_id': p3.id, 'object_id': oc2_obj1.id, 'object_class_id': oc_2.id, 'value': '[1, 2, 3, 4]', }) db_map.add_parameter_value( **{ 'parameter_definition_id': p4.id, 'object_id': oc2_obj2.id, 'object_class_id': oc_2.id, 'value': '[5, 6, 7]', }) db_map.add_parameter_value( **{ 'parameter_definition_id': rel_p1.id, 'relationship_id': rel1.id, 'relationship_class_id': relc1.id, 'value': '0', }) db_map.add_parameter_value( **{ 'parameter_definition_id': rel_p2.id, 'relationship_id': rel2.id, 'relationship_class_id': relc1.id, 'value': '4', }) db_map.add_parameter_value( **{ 'parameter_definition_id': rel_p3.id, 'relationship_id': rel1.id, 'relationship_class_id': relc1.id, 'value': '[5, 6, 7]', }) db_map.add_parameter_value( **{ 'parameter_definition_id': rel_p4.id, 'relationship_id': rel2.id, 'relationship_class_id': relc1.id, 'value': '[1, 2, 3, 4]', }) time = [ np.datetime64('2005-02-25T00:00'), np.datetime64('2005-02-25T01:00'), np.datetime64('2005-02-25T02:00') ] value = [1, 2, 3] ts_val = to_database( TimeSeriesVariableResolution(time, value, False, False)) db_map.add_parameter_value( **{ 'parameter_definition_id': p5.id, 'object_id': oc3_obj1.id, 'object_class_id': oc_3.id, 'value': ts_val }) timepattern = ['m1', 'm2', 'm3'] value = [1.1, 2.2, 3.3] ts_val = to_database(TimePattern(timepattern, value)) db_map.add_parameter_value( **{ 'parameter_definition_id': p6.id, 'object_id': oc3_obj1.id, 'object_class_id': oc_3.id, 'value': ts_val }) # commit db_map.commit_session('test') return db_map, db_map_test
def test_value_access(self): editor = TimePatternEditor() editor.set_value(TimePattern(["1,5d", "2-4,6,7d"], [2.2, 2.1])) self.assertEqual(editor.value(), TimePattern(["1,5d", "2-4,6,7d"], [2.2, 2.1]))
def test_time_pattern_in_edit_role(self): value = TimePattern(["1-12m"], [5.0]) self.db_mngr.get_item.return_value = {"value": to_database(value)} formatted = self.get_value(Qt.EditRole) self.assertEqual(formatted, to_database(value))
def test_editor_sets_time_pattern_in_parent_model(self): indexes = ["1-3m", "4-12m"] values = np.array([23.0, 5.0]) pattern = TimePattern(indexes, values) self._check_parent_model_updated_when_closed(pattern)
def test_cannot_remove_all_rows(self): model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0])) self.assertTrue(model.removeRows(0, 2)) self.assertEqual(len(model.value), 1) self.assertEqual(model.value.indexes, ['a']) numpy.testing.assert_equal(model.value.values, [-5.0])
def test_time_pattern_in_tool_tip_role(self): value = TimePattern(["1-12m"], [5.0]) self.db_mngr.get_item.return_value = {"value": to_database(value)} self.assertIsNone(self.get_value(Qt.ToolTipRole))
def test_remove_rows_from_the_beginning(self): model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0])) self.assertTrue(model.removeRows(0, 1)) self.assertEqual(len(model.value), 1) self.assertEqual(model.value.indexes, ['b']) numpy.testing.assert_equal(model.value.values, np.array([7.0]))
def test_initial_value(self): editor = TimePatternEditor() value = editor.value() self.assertEqual(value, TimePattern(["1-7d"], [0.0]))
def test_removing_last_row_fails(self): model = TimePatternModel(TimePattern(['a'], [-5.0])) self.assertFalse(model.removeRows(0, 1))
def test_setData(self): model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0])) model_index = model.index(1, 1) model.setData(model_index, 2.3) self.assertEqual(model.value.indexes, ['a', 'b']) numpy.testing.assert_equal(model.value.values, [-5.0, 2.3])