|
16 | 16 |
|
17 | 17 | import os
|
18 | 18 |
|
19 |
| -from qgis.core import QgsVectorLayer, QgsFeatureRequest, QgsFeature |
| 19 | +from qgis.core import QgsVectorLayer, QgsFeatureRequest, QgsFeature, QgsField, NULL |
20 | 20 | from qgis.testing import start_app, unittest
|
| 21 | +from qgis.PyQt.QtCore import QVariant |
| 22 | + |
21 | 23 | from utilities import unitTestDataPath
|
22 | 24 | start_app()
|
23 | 25 | TEST_DATA_DIR = unitTestDataPath()
|
@@ -108,5 +110,52 @@ def addFeatures(self, vl):
|
108 | 110 | feat['Staff'] = 2
|
109 | 111 | vl.addFeature(feat)
|
110 | 112 |
|
| 113 | + def test_ExpressionFieldNested(self): |
| 114 | + myShpFile = os.path.join(TEST_DATA_DIR, 'points.shp') |
| 115 | + layer = QgsVectorLayer(myShpFile, 'Points', 'ogr') |
| 116 | + self.assertTrue(layer.isValid()) |
| 117 | + |
| 118 | + cnt = layer.pendingFields().count() |
| 119 | + idx = layer.addExpressionField('"Staff"*2', QgsField('exp1', QVariant.LongLong)) |
| 120 | + idx = layer.addExpressionField('"exp1"-1', QgsField('exp2', QVariant.LongLong)) |
| 121 | + |
| 122 | + fet = next(layer.getFeatures(QgsFeatureRequest().setSubsetOfAttributes(['exp2'], layer.fields()))) |
| 123 | + self.assertEqual(fet['Class'], NULL) |
| 124 | + # nested virtual fields should make all these attributes be fetched |
| 125 | + self.assertEqual(fet['Staff'], 2) |
| 126 | + self.assertEqual(fet['exp2'], 3) |
| 127 | + self.assertEqual(fet['exp1'], 4) |
| 128 | + |
| 129 | + def test_ExpressionFieldNestedGeometry(self): |
| 130 | + myShpFile = os.path.join(TEST_DATA_DIR, 'points.shp') |
| 131 | + layer = QgsVectorLayer(myShpFile, 'Points', 'ogr') |
| 132 | + self.assertTrue(layer.isValid()) |
| 133 | + |
| 134 | + cnt = layer.pendingFields().count() |
| 135 | + idx = layer.addExpressionField('$x*2', QgsField('exp1', QVariant.LongLong)) |
| 136 | + idx = layer.addExpressionField('"exp1"/1.5', QgsField('exp2', QVariant.LongLong)) |
| 137 | + |
| 138 | + fet = next(layer.getFeatures(QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes(['exp2'], layer.fields()))) |
| 139 | + # nested virtual fields should have made geometry be fetched |
| 140 | + self.assertEqual(fet['exp2'], -156) |
| 141 | + self.assertEqual(fet['exp1'], -234) |
| 142 | + |
| 143 | + def test_ExpressionFieldNestedCircular(self): |
| 144 | + """ test circular virtual field definitions """ |
| 145 | + |
| 146 | + myShpFile = os.path.join(TEST_DATA_DIR, 'points.shp') |
| 147 | + layer = QgsVectorLayer(myShpFile, 'Points', 'ogr') |
| 148 | + self.assertTrue(layer.isValid()) |
| 149 | + |
| 150 | + cnt = layer.pendingFields().count() |
| 151 | + idx = layer.addExpressionField('"exp3"*2', QgsField('exp1', QVariant.LongLong)) |
| 152 | + idx = layer.addExpressionField('"exp1"-1', QgsField('exp2', QVariant.LongLong)) |
| 153 | + idx = layer.addExpressionField('"exp2"*3', QgsField('exp3', QVariant.LongLong)) |
| 154 | + |
| 155 | + # really just testing that this doesn't hang/crash... there's no good result here! |
| 156 | + fet = next(layer.getFeatures(QgsFeatureRequest().setSubsetOfAttributes(['exp2'], layer.fields()))) |
| 157 | + self.assertEqual(fet['Class'], NULL) |
| 158 | + |
| 159 | + |
111 | 160 | if __name__ == '__main__':
|
112 | 161 | unittest.main()
|
0 commit comments