Skip to content

Commit 60a28e3

Browse files
committedJan 5, 2018
Add some unit tests
1 parent 171f402 commit 60a28e3

File tree

4 files changed

+172
-13
lines changed

4 files changed

+172
-13
lines changed
 

‎python/core/layout/qgslayoutatlas.sip

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ atlas page.
7878

7979
.. seealso:: :py:func:`setFilenameExpression()`
8080

81-
.. seealso:: :py:func:`filenameExpressionErrorString()`
81+
.. seealso:: :py:func:`currentFilename()`
8282
%End
8383

8484
bool setFilenameExpression( const QString &expression, QString &errorString /Out/ );
@@ -89,6 +89,17 @@ If an invalid expression is passed, false will be returned and ``errorString``
8989
will be set to the expression error.
9090

9191
.. seealso:: :py:func:`filenameExpression()`
92+
93+
.. seealso:: :py:func:`currentFilename()`
94+
%End
95+
96+
QString currentFilename() const;
97+
%Docstring
98+
Returns the current feature filename.
99+
100+
.. seealso:: :py:func:`filenameExpression()`
101+
102+
.. seealso:: :py:func:`setFilenameExpression()`
92103
%End
93104

94105
QgsVectorLayer *coverageLayer() const;

‎src/core/layout/qgslayoutatlas.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,11 @@ bool QgsLayoutAtlas::setFilenameExpression( const QString &pattern, QString &err
394394
return updateFilenameExpression( errorString );
395395
}
396396

397+
QString QgsLayoutAtlas::currentFilename() const
398+
{
399+
return mCurrentFilename;
400+
}
401+
397402
QgsExpressionContext QgsLayoutAtlas::createExpressionContext()
398403
{
399404
QgsExpressionContext expressionContext;
@@ -408,10 +413,9 @@ QgsExpressionContext QgsLayoutAtlas::createExpressionContext()
408413

409414
if ( mCoverageLayer )
410415
expressionContext.lastScope()->setFields( mCoverageLayer->fields() );
411-
#if 0 //TODO
416+
412417
if ( mLayout && mEnabled )
413418
expressionContext.lastScope()->setFeature( mCurrentFeature );
414-
#endif
415419

416420
return expressionContext;
417421
}
@@ -440,13 +444,8 @@ bool QgsLayoutAtlas::updateFilenameExpression( QString &error )
440444
mFilenameExpression.prepare( &expressionContext );
441445
}
442446

443-
#if 0 //TODO
444-
//if atlas preview is currently enabled, regenerate filename for current feature
445-
if ( mComposition->atlasMode() == QgsComposition::PreviewAtlas )
446-
{
447-
evalFeatureFilename( expressionContext );
448-
}
449-
#endif
447+
// regenerate current filename
448+
evalFeatureFilename( expressionContext );
450449
return true;
451450
}
452451

@@ -496,7 +495,6 @@ bool QgsLayoutAtlas::prepareForFeature( const int featureI )
496495
// generate filename for current feature
497496
if ( !evalFeatureFilename( expressionContext ) )
498497
{
499-
500498
//error evaluating filename
501499
return false;
502500
}

‎src/core/layout/qgslayoutatlas.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class CORE_EXPORT QgsLayoutAtlas : public QObject, public QgsAbstractLayoutItera
7777
* Returns the filename expression used for generating output filenames for each
7878
* atlas page.
7979
* \see setFilenameExpression()
80-
* \see filenameExpressionErrorString()
80+
* \see currentFilename()
8181
*/
8282
QString filenameExpression() const { return mFilenameExpressionString; }
8383

@@ -87,9 +87,17 @@ class CORE_EXPORT QgsLayoutAtlas : public QObject, public QgsAbstractLayoutItera
8787
* If an invalid expression is passed, false will be returned and \a errorString
8888
* will be set to the expression error.
8989
* \see filenameExpression()
90+
* \see currentFilename()
9091
*/
9192
bool setFilenameExpression( const QString &expression, QString &errorString SIP_OUT );
9293

94+
/**
95+
* Returns the current feature filename.
96+
* \see filenameExpression()
97+
* \see setFilenameExpression()
98+
*/
99+
QString currentFilename() const;
100+
93101
/**
94102
* Returns the coverage layer used for the atlas features.
95103
* \see setCoverageLayer()

‎tests/src/python/test_qgslayoutatlas.py

Lines changed: 143 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
from qgis.PyQt.QtXml import QDomDocument
4444
from utilities import unitTestDataPath
4545
from qgis.testing import start_app, unittest
46+
from qgis.PyQt.QtTest import QSignalSpy
4647

4748
start_app()
4849

@@ -86,7 +87,148 @@ def testReadWriteXml(self):
8687
self.assertTrue(atlas2.filterFeatures())
8788
self.assertEqual(atlas2.filterExpression(), 'filter exp')
8889

89-
def test
90+
def testIteration(self):
91+
p = QgsProject()
92+
vectorFileInfo = QFileInfo(unitTestDataPath() + "/france_parts.shp")
93+
vector_layer = QgsVectorLayer(vectorFileInfo.filePath(), vectorFileInfo.completeBaseName(), "ogr")
94+
self.assertTrue(vector_layer.isValid())
95+
p.addMapLayer(vector_layer)
96+
97+
l = QgsPrintLayout(p)
98+
atlas = l.atlas()
99+
atlas.setEnabled(True)
100+
atlas.setCoverageLayer(vector_layer)
101+
102+
atlas_feature_changed_spy = QSignalSpy(atlas.featureChanged)
103+
context_changed_spy = QSignalSpy(l.context().changed)
104+
105+
self.assertTrue(atlas.beginRender())
106+
self.assertTrue(atlas.first())
107+
self.assertEqual(len(atlas_feature_changed_spy), 1)
108+
self.assertEqual(len(context_changed_spy), 1)
109+
self.assertEqual(atlas.currentFeatureNumber(), 0)
110+
self.assertEqual(l.context().feature()[4], 'Basse-Normandie')
111+
self.assertEqual(l.context().layer(), vector_layer)
112+
113+
self.assertTrue(atlas.next())
114+
self.assertEqual(len(atlas_feature_changed_spy), 2)
115+
self.assertEqual(len(context_changed_spy), 2)
116+
self.assertEqual(atlas.currentFeatureNumber(), 1)
117+
self.assertEqual(l.context().feature()[4], 'Bretagne')
118+
119+
self.assertTrue(atlas.next())
120+
self.assertEqual(len(atlas_feature_changed_spy), 3)
121+
self.assertEqual(len(context_changed_spy), 3)
122+
self.assertEqual(atlas.currentFeatureNumber(), 2)
123+
self.assertEqual(l.context().feature()[4], 'Pays de la Loire')
124+
125+
self.assertTrue(atlas.next())
126+
self.assertEqual(len(atlas_feature_changed_spy), 4)
127+
self.assertEqual(len(context_changed_spy), 4)
128+
self.assertEqual(atlas.currentFeatureNumber(), 3)
129+
self.assertEqual(l.context().feature()[4], 'Centre')
130+
131+
self.assertFalse(atlas.next())
132+
self.assertTrue(atlas.seekTo(2))
133+
self.assertEqual(len(atlas_feature_changed_spy), 5)
134+
self.assertEqual(len(context_changed_spy), 5)
135+
self.assertEqual(atlas.currentFeatureNumber(), 2)
136+
self.assertEqual(l.context().feature()[4], 'Pays de la Loire')
137+
138+
self.assertTrue(atlas.last())
139+
self.assertEqual(len(atlas_feature_changed_spy), 6)
140+
self.assertEqual(len(context_changed_spy), 6)
141+
self.assertEqual(atlas.currentFeatureNumber(), 3)
142+
self.assertEqual(l.context().feature()[4], 'Centre')
143+
144+
self.assertTrue(atlas.previous())
145+
self.assertEqual(len(atlas_feature_changed_spy), 7)
146+
self.assertEqual(len(context_changed_spy), 7)
147+
self.assertEqual(atlas.currentFeatureNumber(), 2)
148+
self.assertEqual(l.context().feature()[4], 'Pays de la Loire')
149+
150+
self.assertTrue(atlas.previous())
151+
self.assertTrue(atlas.previous())
152+
self.assertEqual(len(atlas_feature_changed_spy), 9)
153+
self.assertFalse(atlas.previous())
154+
self.assertEqual(len(atlas_feature_changed_spy), 9)
155+
156+
self.assertTrue(atlas.endRender())
157+
self.assertEqual(len(atlas_feature_changed_spy), 10)
158+
159+
def testUpdateFeature(self):
160+
p = QgsProject()
161+
vectorFileInfo = QFileInfo(unitTestDataPath() + "/france_parts.shp")
162+
vector_layer = QgsVectorLayer(vectorFileInfo.filePath(), vectorFileInfo.completeBaseName(), "ogr")
163+
self.assertTrue(vector_layer.isValid())
164+
p.addMapLayer(vector_layer)
165+
166+
l = QgsPrintLayout(p)
167+
atlas = l.atlas()
168+
atlas.setEnabled(True)
169+
atlas.setCoverageLayer(vector_layer)
170+
171+
self.assertTrue(atlas.beginRender())
172+
self.assertTrue(atlas.first())
173+
self.assertEqual(atlas.currentFeatureNumber(), 0)
174+
self.assertEqual(l.context().feature()[4], 'Basse-Normandie')
175+
self.assertEqual(l.context().layer(), vector_layer)
176+
177+
vector_layer.startEditing()
178+
self.assertTrue(vector_layer.changeAttributeValue(l.context().feature().id(), 4, 'Nah, Canberra mate!'))
179+
self.assertEqual(l.context().feature()[4], 'Basse-Normandie')
180+
l.atlas().refreshCurrentFeature()
181+
self.assertEqual(l.context().feature()[4], 'Nah, Canberra mate!')
182+
vector_layer.rollBack()
183+
184+
def testFileName(self):
185+
p = QgsProject()
186+
vectorFileInfo = QFileInfo(unitTestDataPath() + "/france_parts.shp")
187+
vector_layer = QgsVectorLayer(vectorFileInfo.filePath(), vectorFileInfo.completeBaseName(), "ogr")
188+
self.assertTrue(vector_layer.isValid())
189+
p.addMapLayer(vector_layer)
190+
191+
l = QgsPrintLayout(p)
192+
atlas = l.atlas()
193+
atlas.setEnabled(True)
194+
atlas.setCoverageLayer(vector_layer)
195+
atlas.setFilenameExpression("'output_' || \"NAME_1\"")
196+
197+
self.assertTrue(atlas.beginRender())
198+
self.assertEqual(atlas.count(), 4)
199+
atlas.first()
200+
self.assertEqual(atlas.currentFilename(), 'output_Basse-Normandie')
201+
atlas.next()
202+
self.assertEqual(atlas.currentFilename(), 'output_Bretagne')
203+
atlas.next()
204+
self.assertEqual(atlas.currentFilename(), 'output_Pays de la Loire')
205+
atlas.next()
206+
self.assertEqual(atlas.currentFilename(), 'output_Centre')
207+
208+
# try changing expression, filename should be updated instantly
209+
atlas.setFilenameExpression("'export_' || \"NAME_1\"")
210+
self.assertEqual(atlas.currentFilename(), 'export_Centre')
211+
212+
atlas.endRender()
213+
214+
def testNameForPage(self):
215+
p = QgsProject()
216+
vectorFileInfo = QFileInfo(unitTestDataPath() + "/france_parts.shp")
217+
vector_layer = QgsVectorLayer(vectorFileInfo.filePath(), vectorFileInfo.completeBaseName(), "ogr")
218+
self.assertTrue(vector_layer.isValid())
219+
p.addMapLayer(vector_layer)
220+
221+
l = QgsPrintLayout(p)
222+
atlas = l.atlas()
223+
atlas.setEnabled(True)
224+
atlas.setCoverageLayer(vector_layer)
225+
atlas.setPageNameExpression("\"NAME_1\"")
226+
227+
self.assertTrue(atlas.beginRender())
228+
self.assertEqual(atlas.nameForPage(0), 'Basse-Normandie')
229+
self.assertEqual(atlas.nameForPage(1), 'Bretagne')
230+
self.assertEqual(atlas.nameForPage(2), 'Pays de la Loire')
231+
self.assertEqual(atlas.nameForPage(3), 'Centre')
90232

91233

92234
if __name__ == '__main__':

0 commit comments

Comments
 (0)
Please sign in to comment.