|
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 | QgsWkbTypes,
|
|
36 | 37 | QgsCoordinateReferenceSystem,
|
37 | 38 | QgsProject,
|
38 | 39 | QgsUnitTypes,
|
39 |
| - QgsAggregateCalculator) |
| 40 | + QgsAggregateCalculator, |
| 41 | + QgsPointV2, |
| 42 | + QgsExpressionContext, |
| 43 | + QgsExpressionContextScope, |
| 44 | + QgsExpressionContextUtils) |
40 | 45 | from qgis.testing import start_app, unittest
|
41 | 46 | from utilities import unitTestDataPath
|
42 | 47 | start_app()
|
@@ -1602,6 +1607,94 @@ def test_setRenderer(self):
|
1602 | 1607 | self.assertTrue(self.rendererChanged)
|
1603 | 1608 | self.assertEqual(layer.renderer(), r)
|
1604 | 1609 |
|
| 1610 | + def testGetSetDefaults(self): |
| 1611 | + """ test getting and setting default expressions """ |
| 1612 | + layer = createLayerWithOnePoint() |
| 1613 | + |
| 1614 | + self.assertFalse(layer.defaultValueExpression(0)) |
| 1615 | + self.assertFalse(layer.defaultValueExpression(1)) |
| 1616 | + self.assertFalse(layer.defaultValueExpression(2)) |
| 1617 | + |
| 1618 | + layer.setDefaultValueExpression(0, "'test'") |
| 1619 | + self.assertEqual(layer.defaultValueExpression(0), "'test'") |
| 1620 | + self.assertFalse(layer.defaultValueExpression(1)) |
| 1621 | + self.assertFalse(layer.defaultValueExpression(2)) |
| 1622 | + |
| 1623 | + layer.setDefaultValueExpression(1, "2+2") |
| 1624 | + self.assertEqual(layer.defaultValueExpression(0), "'test'") |
| 1625 | + self.assertEqual(layer.defaultValueExpression(1), "2+2") |
| 1626 | + self.assertFalse(layer.defaultValueExpression(2)) |
| 1627 | + |
| 1628 | + def testSaveRestoreDefaults(self): |
| 1629 | + """ test saving and restoring default expressions from xml""" |
| 1630 | + layer = createLayerWithOnePoint() |
| 1631 | + |
| 1632 | + # no default expressions |
| 1633 | + doc = QDomDocument("testdoc") |
| 1634 | + elem = doc.createElement("maplayer") |
| 1635 | + self.assertTrue(layer.writeXml(elem, doc)) |
| 1636 | + |
| 1637 | + layer2 = createLayerWithOnePoint() |
| 1638 | + self.assertTrue(layer2.readXml(elem)) |
| 1639 | + self.assertFalse(layer2.defaultValueExpression(0)) |
| 1640 | + self.assertFalse(layer2.defaultValueExpression(1)) |
| 1641 | + |
| 1642 | + # set some default expressions |
| 1643 | + layer.setDefaultValueExpression(0, "'test'") |
| 1644 | + layer.setDefaultValueExpression(1, "2+2") |
| 1645 | + |
| 1646 | + doc = QDomDocument("testdoc") |
| 1647 | + elem = doc.createElement("maplayer") |
| 1648 | + self.assertTrue(layer.writeXml(elem, doc)) |
| 1649 | + |
| 1650 | + layer3 = createLayerWithOnePoint() |
| 1651 | + self.assertTrue(layer3.readXml(elem)) |
| 1652 | + self.assertEqual(layer3.defaultValueExpression(0), "'test'") |
| 1653 | + self.assertEqual(layer3.defaultValueExpression(1), "2+2") |
| 1654 | + |
| 1655 | + def testEvaluatingDefaultExpressions(self): |
| 1656 | + """ tests calculation of default values""" |
| 1657 | + layer = createLayerWithOnePoint() |
| 1658 | + layer.setDefaultValueExpression(0, "'test'") |
| 1659 | + layer.setDefaultValueExpression(1, "2+2") |
| 1660 | + self.assertEqual(layer.defaultValue(0), 'test') |
| 1661 | + self.assertEqual(layer.defaultValue(1), 4) |
| 1662 | + |
| 1663 | + # using feature |
| 1664 | + layer.setDefaultValueExpression(1, '$id * 2') |
| 1665 | + feature = QgsFeature(4) |
| 1666 | + feature.setValid(True) |
| 1667 | + feature.setFields(layer.fields()) |
| 1668 | + # no feature: |
| 1669 | + self.assertFalse(layer.defaultValue(1)) |
| 1670 | + # with feature: |
| 1671 | + self.assertEqual(layer.defaultValue(0, feature), 'test') |
| 1672 | + self.assertEqual(layer.defaultValue(1, feature), 8) |
| 1673 | + |
| 1674 | + # using feature geometry |
| 1675 | + layer.setDefaultValueExpression(1, '$x * 2') |
| 1676 | + feature.setGeometry(QgsGeometry(QgsPointV2(6, 7))) |
| 1677 | + self.assertEqual(layer.defaultValue(1, feature), 12) |
| 1678 | + |
| 1679 | + # using contexts |
| 1680 | + scope = QgsExpressionContextScope() |
| 1681 | + scope.setVariable('var1', 16) |
| 1682 | + context = QgsExpressionContext() |
| 1683 | + context.appendScope(scope) |
| 1684 | + layer.setDefaultValueExpression(1, '$id + @var1') |
| 1685 | + self.assertEqual(layer.defaultValue(1, feature, context), 20) |
| 1686 | + |
| 1687 | + # if no scope passed, should use a default constructed one including layer variables |
| 1688 | + QgsExpressionContextUtils.setLayerVariable(layer, 'var2', 4) |
| 1689 | + QgsExpressionContextUtils.setProjectVariable('var3', 8) |
| 1690 | + layer.setDefaultValueExpression(1, 'to_int(@var2) + to_int(@var3) + $id') |
| 1691 | + self.assertEqual(layer.defaultValue(1, feature), 16) |
| 1692 | + |
| 1693 | + # bad expression |
| 1694 | + layer.setDefaultValueExpression(1, 'not a valid expression') |
| 1695 | + self.assertFalse(layer.defaultValue(1)) |
| 1696 | + |
| 1697 | + |
1605 | 1698 | # TODO:
|
1606 | 1699 | # - fetch rect: feat with changed geometry: 1. in rect, 2. out of rect
|
1607 | 1700 | # - more join tests
|
|
0 commit comments