def testProperties(self): model = QgsAggregateMappingModel(self.source_fields) mapping = model.mapping() self.assertEqual(mapping[0].field.name(), 'source_field1') self.assertEqual(mapping[0].source, '"source_field1"') self.assertEqual(mapping[0].aggregate, 'concatenate') self.assertEqual(mapping[0].delimiter, ',') self.assertEqual(mapping[1].field.name(), 'source_field2') self.assertEqual(mapping[1].source, '"source_field2"') self.assertEqual(mapping[1].aggregate, 'sum') self.assertEqual(mapping[1].delimiter, ',') mapping[0].source = 'upper("source_field2")' mapping[0].aggregate = 'first_value' mapping[0].delimiter = '|' new_aggregate = QgsAggregateMappingModel.Aggregate() new_aggregate.field = QgsField('output_field3', QVariant.Double, len=4, prec=2) new_aggregate.source = 'randf(1,2)' new_aggregate.aggregate = 'mean' new_aggregate.delimiter = '*' mapping.append(new_aggregate) model.setMapping(mapping) self.assertEqual(model.rowCount(), 3) self.assertEqual(model.data(model.index(0, 0), Qt.DisplayRole), 'upper("source_field2")') self.assertEqual(model.data(model.index(0, 1), Qt.DisplayRole), 'first_value') self.assertEqual(model.data(model.index(0, 2), Qt.DisplayRole), '|') self.assertEqual(model.data(model.index(0, 3), Qt.DisplayRole), 'source_field1') self.assertEqual(model.data(model.index(0, 4), Qt.DisplayRole), QVariant.String) self.assertEqual(model.data(model.index(0, 5), Qt.DisplayRole), 0) self.assertEqual(model.data(model.index(0, 6), Qt.DisplayRole), 0) self.assertEqual(model.data(model.index(1, 0), Qt.DisplayRole), '"source_field2"') self.assertEqual(model.data(model.index(1, 1), Qt.DisplayRole), 'sum') self.assertEqual(model.data(model.index(1, 2), Qt.DisplayRole), ',') self.assertEqual(model.data(model.index(1, 3), Qt.DisplayRole), 'source_field2') self.assertEqual(model.data(model.index(1, 4), Qt.DisplayRole), QVariant.Int) self.assertEqual(model.data(model.index(1, 5), Qt.DisplayRole), 10) self.assertEqual(model.data(model.index(1, 6), Qt.DisplayRole), 8) self.assertEqual(model.data(model.index(2, 0), Qt.DisplayRole), 'randf(1,2)') self.assertEqual(model.data(model.index(2, 1), Qt.DisplayRole), 'mean') self.assertEqual(model.data(model.index(2, 2), Qt.DisplayRole), '*') self.assertEqual(model.data(model.index(2, 3), Qt.DisplayRole), 'output_field3') self.assertEqual(model.data(model.index(2, 4), Qt.DisplayRole), QVariant.Double) self.assertEqual(model.data(model.index(2, 5), Qt.DisplayRole), 4) self.assertEqual(model.data(model.index(2, 6), Qt.DisplayRole), 2)
def testModel(self): """Test the mapping model""" model = QgsAggregateMappingModel(self.source_fields) self.assertEqual(model.rowCount(QModelIndex()), 2) self.assertIsNone(model.data(model.index(9999, 0), Qt.DisplayRole)) self.assertEqual(model.data(model.index(0, 0), Qt.DisplayRole), '"source_field1"') self.assertEqual(model.data(model.index(0, 1), Qt.DisplayRole), 'concatenate') self.assertEqual(model.data(model.index(0, 2), Qt.DisplayRole), ',') self.assertEqual(model.data(model.index(0, 3), Qt.DisplayRole), 'source_field1') self.assertEqual(model.data(model.index(0, 4), Qt.DisplayRole), QVariant.String) self.assertEqual(model.data(model.index(0, 5), Qt.DisplayRole), 0) self.assertEqual(model.data(model.index(0, 6), Qt.DisplayRole), 0) self.assertEqual(model.data(model.index(1, 0), Qt.DisplayRole), '"source_field2"') self.assertEqual(model.data(model.index(1, 1), Qt.DisplayRole), 'sum') self.assertEqual(model.data(model.index(1, 2), Qt.DisplayRole), ',') self.assertEqual(model.data(model.index(1, 3), Qt.DisplayRole), 'source_field2') self.assertEqual(model.data(model.index(1, 4), Qt.DisplayRole), QVariant.Int) self.assertEqual(model.data(model.index(1, 5), Qt.DisplayRole), 10) self.assertEqual(model.data(model.index(1, 6), Qt.DisplayRole), 8) # Test expression scope ctx = model.contextGenerator().createExpressionContext() self.assertTrue('source_field1' in ctx.fields().names()) # Test add fields model.appendField(QgsField('field3', QVariant.String), 'upper("field3")', 'first_value') self.assertEqual(model.rowCount(QModelIndex()), 3) self.assertEqual(model.data(model.index(2, 0), Qt.DisplayRole), 'upper("field3")') self.assertEqual(model.data(model.index(2, 1), Qt.DisplayRole), 'first_value') self.assertEqual(model.data(model.index(2, 2), Qt.DisplayRole), ',') self.assertEqual(model.data(model.index(2, 3), Qt.DisplayRole), 'field3') self.assertEqual(model.data(model.index(2, 4), Qt.DisplayRole), QVariant.String) self.assertEqual(model.data(model.index(2, 5), Qt.DisplayRole), 0) self.assertEqual(model.data(model.index(2, 6), Qt.DisplayRole), 0) # Test remove field model.removeField(model.index(1, 0)) self.assertEqual(model.rowCount(QModelIndex()), 2) self.assertEqual(model.data(model.index(0, 0), Qt.DisplayRole), '"source_field1"') self.assertEqual(model.data(model.index(1, 0), Qt.DisplayRole), 'upper("field3")') # Test edit fields mapping = model.mapping() self.assertEqual(mapping[0].field.name(), 'source_field1') self.assertEqual(mapping[0].aggregate, 'concatenate') self.assertEqual(mapping[0].delimiter, ',') self.assertEqual(mapping[0].source, '"source_field1"') self.assertEqual(mapping[1].field.name(), 'field3') self.assertEqual(mapping[1].aggregate, 'first_value') self.assertEqual(mapping[1].delimiter, ',') self.assertEqual(mapping[1].source, 'upper("field3")') # Test move up or down self.assertFalse(model.moveUp(model.index(0, 0))) self.assertFalse(model.moveUp(model.index(100, 0))) self.assertFalse(model.moveDown(model.index(1, 0))) self.assertFalse(model.moveDown(model.index(100, 0))) self.assertTrue(model.moveDown(model.index(0, 0))) mapping = model.mapping() self.assertEqual(mapping[0].field.name(), 'field3') self.assertEqual(mapping[1].field.name(), 'source_field1') self.assertTrue(model.moveUp(model.index(1, 0))) mapping = model.mapping() self.assertEqual(mapping[0].field.name(), 'source_field1') self.assertEqual(mapping[1].field.name(), 'field3')
def testSetSourceFields(self): """Test that changing source fields also empty expressions are updated""" model = QgsAggregateMappingModel(self.source_fields) self.assertEqual(model.data(model.index(0, 0), Qt.DisplayRole), '"source_field1"') self.assertEqual(model.data(model.index(0, 3), Qt.DisplayRole), 'source_field1') self.assertEqual(model.data(model.index(1, 0), Qt.DisplayRole), '"source_field2"') self.assertEqual(model.data(model.index(1, 3), Qt.DisplayRole), 'source_field2') f = QgsField('source_field3', QVariant.String) fields = self.source_fields fields.append(f) model.setSourceFields(fields) self.assertEqual(model.rowCount(), 3) self.assertEqual(model.data(model.index(0, 0), Qt.DisplayRole), '"source_field1"') self.assertEqual(model.data(model.index(0, 3), Qt.DisplayRole), 'source_field1') self.assertEqual(model.data(model.index(1, 0), Qt.DisplayRole), '"source_field2"') self.assertEqual(model.data(model.index(1, 3), Qt.DisplayRole), 'source_field2') self.assertEqual(model.data(model.index(2, 0), Qt.DisplayRole), '"source_field3"') self.assertEqual(model.data(model.index(2, 3), Qt.DisplayRole), 'source_field3')
def testWidget(self): """Test widget operations""" widget = QgsAggregateMappingWidget() for i in range(10): widget.appendField(QgsField(str(i)), source=str(i)) self.assertTrue(widget.model().rowCount(QModelIndex()), 10) def _compare(widget, expected): actual = [] for aggregate in widget.mapping(): actual.append(int(aggregate.source)) self.assertEqual(actual, expected) _compare(widget, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) selection_model = widget.selectionModel() selection_model.clear() for i in range(0, 10, 2): selection_model.select(widget.model().index(i, 0), QItemSelectionModel.Select) self.assertTrue(widget.moveSelectedFieldsDown()) _compare(widget, [1, 0, 3, 2, 5, 4, 7, 6, 9, 8]) selection_model.clear() for i in range(1, 10, 2): selection_model.select(widget.model().index(i, 0), QItemSelectionModel.Select) self.assertTrue(widget.moveSelectedFieldsUp()) _compare(widget, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) selection_model.clear() for i in range(0, 10, 2): selection_model.select(widget.model().index(i, 0), QItemSelectionModel.Select) self.assertTrue(widget.removeSelectedFields()) _compare(widget, [1, 3, 5, 7, 9]) widget.setSourceFields(self.source_fields) mapping = widget.mapping() self.assertEqual(mapping[0].field.name(), 'source_field1') self.assertEqual(mapping[0].source, '"source_field1"') self.assertEqual(mapping[0].aggregate, 'concatenate') self.assertEqual(mapping[0].delimiter, ',') self.assertEqual(mapping[1].field.name(), 'source_field2') self.assertEqual(mapping[1].source, '"source_field2"') self.assertEqual(mapping[1].aggregate, 'sum') self.assertEqual(mapping[1].delimiter, ',') mapping[0].source = 'upper("source_field2")' mapping[0].aggregate = 'first_value' mapping[0].delimiter = '|' new_aggregate = QgsAggregateMappingModel.Aggregate() new_aggregate.field = QgsField('output_field3', QVariant.Double, len=4, prec=2) new_aggregate.source = 'randf(1,2)' new_aggregate.aggregate = 'mean' new_aggregate.delimiter = '*' mapping.append(new_aggregate) widget.setMapping(mapping) mapping = widget.mapping() self.assertEqual(mapping[0].field.name(), 'source_field1') self.assertEqual(mapping[0].source, 'upper("source_field2")') self.assertEqual(mapping[0].aggregate, 'first_value') self.assertEqual(mapping[0].delimiter, '|') self.assertEqual(mapping[1].field.name(), 'source_field2') self.assertEqual(mapping[1].source, '"source_field2"') self.assertEqual(mapping[1].aggregate, 'sum') self.assertEqual(mapping[1].delimiter, ',') self.assertEqual(mapping[2].field.name(), 'output_field3') self.assertEqual(mapping[2].source, 'randf(1,2)') self.assertEqual(mapping[2].aggregate, 'mean') self.assertEqual(mapping[2].delimiter, '*')