|
18 | 18 |
|
19 | 19 | from qgis.PyQt.QtCore import QVariant
|
20 | 20 | from qgis.PyQt.QtGui import QPainter
|
| 21 | +from qgis.PyQt.QtXml import (QDomDocument, QDomElement) |
21 | 22 |
|
22 | 23 | from qgis.core import (QGis,
|
23 | 24 | QgsVectorLayer,
|
|
35 | 36 | QgsCoordinateReferenceSystem,
|
36 | 37 | QgsProject,
|
37 | 38 | QgsUnitTypes,
|
38 |
| - QgsAggregateCalculator) |
| 39 | + QgsAggregateCalculator, |
| 40 | + QgsPointV2, |
| 41 | + QgsExpressionContext, |
| 42 | + QgsExpressionContextScope, |
| 43 | + QgsExpressionContextUtils) |
39 | 44 | from qgis.testing import start_app, unittest
|
40 | 45 | from utilities import unitTestDataPath
|
41 | 46 | start_app()
|
@@ -1455,6 +1460,94 @@ def test_setRendererV2(self):
|
1455 | 1460 | self.assertTrue(self.rendererChanged)
|
1456 | 1461 | self.assertEqual(layer.rendererV2(), r)
|
1457 | 1462 |
|
| 1463 | + def testGetSetDefaults(self): |
| 1464 | + """ test getting and setting default expressions """ |
| 1465 | + layer = createLayerWithOnePoint() |
| 1466 | + |
| 1467 | + self.assertFalse(layer.defaultValueExpression(0)) |
| 1468 | + self.assertFalse(layer.defaultValueExpression(1)) |
| 1469 | + self.assertFalse(layer.defaultValueExpression(2)) |
| 1470 | + |
| 1471 | + layer.setDefaultValueExpression(0, "'test'") |
| 1472 | + self.assertEqual(layer.defaultValueExpression(0), "'test'") |
| 1473 | + self.assertFalse(layer.defaultValueExpression(1)) |
| 1474 | + self.assertFalse(layer.defaultValueExpression(2)) |
| 1475 | + |
| 1476 | + layer.setDefaultValueExpression(1, "2+2") |
| 1477 | + self.assertEqual(layer.defaultValueExpression(0), "'test'") |
| 1478 | + self.assertEqual(layer.defaultValueExpression(1), "2+2") |
| 1479 | + self.assertFalse(layer.defaultValueExpression(2)) |
| 1480 | + |
| 1481 | + def testSaveRestoreDefaults(self): |
| 1482 | + """ test saving and restoring default expressions from xml""" |
| 1483 | + layer = createLayerWithOnePoint() |
| 1484 | + |
| 1485 | + # no default expressions |
| 1486 | + doc = QDomDocument("testdoc") |
| 1487 | + elem = doc.createElement("maplayer") |
| 1488 | + self.assertTrue(layer.writeXml(elem, doc)) |
| 1489 | + |
| 1490 | + layer2 = createLayerWithOnePoint() |
| 1491 | + self.assertTrue(layer2.readXml(elem)) |
| 1492 | + self.assertFalse(layer2.defaultValueExpression(0)) |
| 1493 | + self.assertFalse(layer2.defaultValueExpression(1)) |
| 1494 | + |
| 1495 | + # set some default expressions |
| 1496 | + layer.setDefaultValueExpression(0, "'test'") |
| 1497 | + layer.setDefaultValueExpression(1, "2+2") |
| 1498 | + |
| 1499 | + doc = QDomDocument("testdoc") |
| 1500 | + elem = doc.createElement("maplayer") |
| 1501 | + self.assertTrue(layer.writeXml(elem, doc)) |
| 1502 | + |
| 1503 | + layer3 = createLayerWithOnePoint() |
| 1504 | + self.assertTrue(layer3.readXml(elem)) |
| 1505 | + self.assertEqual(layer3.defaultValueExpression(0), "'test'") |
| 1506 | + self.assertEqual(layer3.defaultValueExpression(1), "2+2") |
| 1507 | + |
| 1508 | + def testEvaluatingDefaultExpressions(self): |
| 1509 | + """ tests calculation of default values""" |
| 1510 | + layer = createLayerWithOnePoint() |
| 1511 | + layer.setDefaultValueExpression(0, "'test'") |
| 1512 | + layer.setDefaultValueExpression(1, "2+2") |
| 1513 | + self.assertEqual(layer.defaultValue(0), 'test') |
| 1514 | + self.assertEqual(layer.defaultValue(1), 4) |
| 1515 | + |
| 1516 | + # using feature |
| 1517 | + layer.setDefaultValueExpression(1, '$id * 2') |
| 1518 | + feature = QgsFeature(4) |
| 1519 | + feature.setValid(True) |
| 1520 | + feature.setFields(layer.fields()) |
| 1521 | + # no feature: |
| 1522 | + self.assertFalse(layer.defaultValue(1)) |
| 1523 | + # with feature: |
| 1524 | + self.assertEqual(layer.defaultValue(0, feature), 'test') |
| 1525 | + self.assertEqual(layer.defaultValue(1, feature), 8) |
| 1526 | + |
| 1527 | + # using feature geometry |
| 1528 | + layer.setDefaultValueExpression(1, '$x * 2') |
| 1529 | + feature.setGeometry(QgsGeometry(QgsPointV2(6, 7))) |
| 1530 | + self.assertEqual(layer.defaultValue(1, feature), 12) |
| 1531 | + |
| 1532 | + # using contexts |
| 1533 | + scope = QgsExpressionContextScope() |
| 1534 | + scope.setVariable('var1', 16) |
| 1535 | + context = QgsExpressionContext() |
| 1536 | + context.appendScope(scope) |
| 1537 | + layer.setDefaultValueExpression(1, '$id + @var1') |
| 1538 | + self.assertEqual(layer.defaultValue(1, feature, context), 20) |
| 1539 | + |
| 1540 | + # if no scope passed, should use a default constructed one including layer variables |
| 1541 | + QgsExpressionContextUtils.setLayerVariable(layer, 'var2', 4) |
| 1542 | + QgsExpressionContextUtils.setProjectVariable('var3', 8) |
| 1543 | + layer.setDefaultValueExpression(1, 'to_int(@var2) + to_int(@var3) + $id') |
| 1544 | + self.assertEqual(layer.defaultValue(1, feature), 16) |
| 1545 | + |
| 1546 | + # bad expression |
| 1547 | + layer.setDefaultValueExpression(1, 'not a valid expression') |
| 1548 | + self.assertFalse(layer.defaultValue(1)) |
| 1549 | + |
| 1550 | + |
1458 | 1551 | # TODO:
|
1459 | 1552 | # - fetch rect: feat with changed geometry: 1. in rect, 2. out of rect
|
1460 | 1553 | # - more join tests
|
|
0 commit comments