1 /***************************************************************************
2                          testqgslayoutmapgrid.cpp
3                          ----------------------
4     begin                : October 2017
5     copyright            : (C) 2017 by Nyall Dawson
6     email                : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "qgsapplication.h"
19 #include "qgslayout.h"
20 #include "qgsmultirenderchecker.h"
21 #include "qgslayoutitemmap.h"
22 #include "qgslayoutitemmapgrid.h"
23 #include "qgsmarkersymbollayer.h"
24 #include "qgsfontutils.h"
25 #include "qgsproject.h"
26 #include <QObject>
27 #include "qgstest.h"
28 
29 class TestQgsLayoutMapGrid : public QObject
30 {
31     Q_OBJECT
32 
33   public:
34 
35   private slots:
36     void initTestCase();// will be called before the first testfunction is executed.
37     void cleanupTestCase();// will be called after the last testfunction was executed.
38     void init();// will be called before each testfunction is executed.
39     void cleanup();// will be called after every testfunction.
40 
41     void grid(); //test if grid and grid annotation works
42     void reprojected(); //test if reprojected grid works
43     void crossGrid(); //test if grid "cross" mode works
44     void markerGrid(); //test if grid "marker" mode works
45     void frameOnly(); //test if grid "frame/annotation" mode works
46     void zebraStyle(); //test zebra map border style
47     void zebraStyleSides(); //test zebra border on certain sides
48     void zebraStyleMargin(); //test zebra map border style
49     void zebraStyleNautical(); //test zebra map border style
50     void frameDivisions(); //test filtering frame divisions
51     void annotationFilter(); //test filtering annotations
52     void interiorTicks(); //test interior tick mode
53     void interiorTicksMargin(); //test interior tick mode
54     void interiorTicksAnnotated(); //test interior tick mode with annotations
55     void exteriorTicks(); //test exterior tick mode
56     void exteriorTicksMargin(); //test exterior tick mode
57     void exteriorTicksAnnotated(); //test exterior tick mode with annotations
58     void interiorExteriorTicks(); //test interior & exterior tick mode
59     void interiorExteriorTicksMargin(); //test interior & exterior tick mode
60     void interiorExteriorTicksAnnotated(); //test interior & exterior tick mode with annotations
61     void lineBorder(); //test line border frame mode
62     void lineBorderMargin(); //test line border frame mode
63     void lineBorderNautical(); //test line border frame mode
64     void lineBorderAnnotated(); //test line border frame with annotations
65     void annotationFormats(); //various tests for annotation formats
66     void descendingAnnotations(); //test descending annotation direction
67 
68   private:
69     QString mReport;
70 };
71 
initTestCase()72 void TestQgsLayoutMapGrid::initTestCase()
73 {
74   QgsApplication::init();
75   QgsApplication::initQgis();
76 
77   QgsFontUtils::loadStandardTestFonts( QStringList() << QStringLiteral( "Bold" ) );
78 
79   mReport = QStringLiteral( "<h1>Composer Map Grid Tests</h1>\n" );
80 }
81 
cleanupTestCase()82 void TestQgsLayoutMapGrid::cleanupTestCase()
83 {
84   QString myReportFile = QDir::tempPath() + "/qgistest.html";
85   QFile myFile( myReportFile );
86   if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
87   {
88     QTextStream myQTextStream( &myFile );
89     myQTextStream << mReport;
90     myFile.close();
91   }
92 
93   QgsApplication::exitQgis();
94 }
95 
init()96 void TestQgsLayoutMapGrid::init()
97 {
98 }
99 
cleanup()100 void TestQgsLayoutMapGrid::cleanup()
101 {
102 }
103 
grid()104 void TestQgsLayoutMapGrid::grid()
105 {
106   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
107   QgsProject::instance()->setCrs( crs );
108   QgsLayout l( QgsProject::instance() );
109   l.initializeDefaults();
110 
111   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
112   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
113   map->setFrameEnabled( true );
114   map->setBackgroundColor( QColor( 150, 100, 100 ) );
115 
116   QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) );
117   format.setColor( QColor( 255, 0, 0 ) );
118   format.setOpacity( 150.0 / 255.0 );
119   map->grid()->setAnnotationTextFormat( format );
120   map->grid()->setAnnotationPrecision( 0 );
121   map->grid()->setIntervalX( 2000 );
122   map->grid()->setIntervalY( 2000 );
123   map->grid()->setGridLineWidth( 0.5 );
124   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
125   map->updateBoundingRect();
126   l.addLayoutItem( map );
127 
128   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
129   map->grid()->setEnabled( true );
130 
131   map->grid()->setAnnotationEnabled( true );
132   map->grid()->setGridLineColor( QColor( 0, 255, 0 ) );
133   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::HideAll, QgsLayoutItemMapGrid::Left );
134   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Right );
135   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::HideAll, QgsLayoutItemMapGrid::Top );
136   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Bottom );
137   map->grid()->setAnnotationDirection( QgsLayoutItemMapGrid::Horizontal, QgsLayoutItemMapGrid::Right );
138   map->grid()->setAnnotationDirection( QgsLayoutItemMapGrid::Horizontal, QgsLayoutItemMapGrid::Bottom );
139   map->grid()->setBlendMode( QPainter::CompositionMode_Overlay );
140   map->updateBoundingRect();
141   QgsLayoutChecker checker( QStringLiteral( "composermap_grid" ), &l );
142   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
143 
144   bool testResult = checker.testLayout( mReport, 0, 0 );
145   map->grid()->setEnabled( false );
146   map->grid()->setAnnotationEnabled( false );
147   QVERIFY( testResult );
148 }
149 
reprojected()150 void TestQgsLayoutMapGrid::reprojected()
151 {
152   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
153   QgsProject::instance()->setCrs( crs );
154   QgsLayout l( QgsProject::instance() );
155   l.initializeDefaults();
156 
157   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
158   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
159   map->setFrameEnabled( true );
160   map->setBackgroundColor( QColor( 150, 100, 100 ) );
161   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
162   map->grid()->setAnnotationPrecision( 0 );
163   map->grid()->setIntervalX( 2000 );
164   map->grid()->setIntervalY( 2000 );
165   map->grid()->setGridLineWidth( 0.5 );
166   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
167   map->updateBoundingRect();
168   l.addLayoutItem( map );
169 
170   map->setExtent( QgsRectangle( -243577.565, 2939084.773, 1215622.435, 3668684.773 ) );
171   QgsCoordinateReferenceSystem geographic = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) );
172   map->grid()->setCrs( geographic );
173   map->grid()->setEnabled( true );
174   map->grid()->setIntervalX( 1 );
175   map->grid()->setIntervalY( 1 );
176   map->grid()->setAnnotationEnabled( false );
177   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
178   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::ExteriorTicks );
179   map->grid()->setFrameWidth( 10 );
180   map->setFrameEnabled( false );
181   map->updateBoundingRect();
182   QgsLayoutChecker checker( QStringLiteral( "composermap_gridreprojected" ), &l );
183   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
184 
185   bool testResult = checker.testLayout( mReport, 0, 0 );
186   map->grid()->setEnabled( false );
187   map->grid()->setCrs( crs );
188   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
189   map->setFrameEnabled( true );
190   QVERIFY( testResult );
191 }
192 
crossGrid()193 void TestQgsLayoutMapGrid::crossGrid()
194 {
195   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
196   QgsProject::instance()->setCrs( crs );
197   QgsLayout l( QgsProject::instance() );
198   l.initializeDefaults();
199 
200   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
201   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
202   map->setFrameEnabled( true );
203   map->setBackgroundColor( QColor( 150, 100, 100 ) );
204   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
205   map->grid()->setAnnotationPrecision( 0 );
206   map->grid()->setIntervalX( 2000 );
207   map->grid()->setIntervalY( 2000 );
208   map->grid()->setGridLineWidth( 0.5 );
209   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
210   map->updateBoundingRect();
211   l.addLayoutItem( map );
212 
213   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
214   map->grid()->setEnabled( true );
215   map->grid()->setStyle( QgsLayoutItemMapGrid::Cross );
216   map->grid()->setCrossLength( 2.0 );
217   map->grid()->setAnnotationEnabled( false );
218   map->grid()->setGridLineColor( QColor( 0, 255, 0 ) );
219   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
220   map->updateBoundingRect();
221   QgsLayoutChecker checker( QStringLiteral( "composermap_crossgrid" ), &l );
222   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
223 
224   bool testResult = checker.testLayout( mReport, 0, 0 );
225   map->grid()->setStyle( QgsLayoutItemMapGrid::Solid );
226   map->grid()->setEnabled( false );
227   map->grid()->setAnnotationEnabled( false );
228   QVERIFY( testResult );
229 }
230 
markerGrid()231 void TestQgsLayoutMapGrid::markerGrid()
232 {
233   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
234   QgsProject::instance()->setCrs( crs );
235   QgsLayout l( QgsProject::instance() );
236   l.initializeDefaults();
237 
238   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
239   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
240   map->setFrameEnabled( true );
241   map->setBackgroundColor( QColor( 150, 100, 100 ) );
242   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
243   map->grid()->setAnnotationPrecision( 0 );
244   map->grid()->setIntervalX( 2000 );
245   map->grid()->setIntervalY( 2000 );
246   map->grid()->setGridLineWidth( 0.5 );
247   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
248   static_cast< QgsSimpleMarkerSymbolLayer * >( map->grid()->markerSymbol()->symbolLayer( 0 ) )->setStrokeColor( Qt::black );
249   map->updateBoundingRect();
250   l.addLayoutItem( map );
251 
252   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
253   map->grid()->setEnabled( true );
254   map->grid()->setStyle( QgsLayoutItemMapGrid::Markers );
255   map->grid()->setAnnotationEnabled( false );
256   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
257   map->updateBoundingRect();
258   QgsLayoutChecker checker( QStringLiteral( "composermap_markergrid" ), &l );
259   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
260 
261   bool testResult = checker.testLayout( mReport, 0, 0 );
262   map->grid()->setStyle( QgsLayoutItemMapGrid::Solid );
263   map->grid()->setEnabled( false );
264   map->grid()->setAnnotationEnabled( false );
265   QVERIFY( testResult );
266 }
267 
frameOnly()268 void TestQgsLayoutMapGrid::frameOnly()
269 {
270   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
271   QgsProject::instance()->setCrs( crs );
272   QgsLayout l( QgsProject::instance() );
273   l.initializeDefaults();
274 
275   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
276   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
277   map->setFrameEnabled( true );
278   map->setBackgroundColor( QColor( 150, 100, 100 ) );
279   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
280   map->grid()->setAnnotationPrecision( 0 );
281   map->grid()->setIntervalX( 2000 );
282   map->grid()->setIntervalY( 2000 );
283   map->grid()->setGridLineWidth( 0.5 );
284   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
285   map->updateBoundingRect();
286   l.addLayoutItem( map );
287 
288   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
289   map->grid()->setEnabled( true );
290   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
291   map->grid()->setAnnotationEnabled( false );
292   //set a frame for testing
293   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::Zebra );
294   map->grid()->setFrameWidth( 2.0 );
295   map->grid()->setFramePenSize( 0.5 );
296   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
297   map->updateBoundingRect();
298   QgsLayoutChecker checker( QStringLiteral( "composermap_gridframeonly" ), &l );
299   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
300 
301   bool testResult = checker.testLayout( mReport, 0, 0 );
302   map->grid()->setStyle( QgsLayoutItemMapGrid::Solid );
303   map->grid()->setEnabled( false );
304   map->grid()->setAnnotationEnabled( false );
305   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
306   QVERIFY( testResult );
307 }
308 
zebraStyle()309 void TestQgsLayoutMapGrid::zebraStyle()
310 {
311   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
312   QgsProject::instance()->setCrs( crs );
313   QgsLayout l( QgsProject::instance() );
314   l.initializeDefaults();
315 
316   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
317   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
318   map->setFrameEnabled( true );
319   map->setBackgroundColor( QColor( 150, 100, 100 ) );
320   QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) );
321   format.setColor( QColor( 0, 0, 0, 0 ) );
322   map->grid()->setAnnotationTextFormat( format );
323   map->grid()->setAnnotationPrecision( 0 );
324   map->grid()->setIntervalX( 2000 );
325   map->grid()->setIntervalY( 2000 );
326   map->grid()->setGridLineWidth( 0.5 );
327   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
328   map->updateBoundingRect();
329   l.addLayoutItem( map );
330 
331   map->setExtent( QgsRectangle( 785462.375, 3341423.125, 789262.375, 3343323.125 ) ); //zoom in
332   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
333 
334   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::Zebra );
335   map->grid()->setFrameWidth( 10 );
336   map->grid()->setFramePenSize( 1 );
337   map->grid()->setFramePenColor( QColor( 255, 100, 0, 200 ) );
338   map->grid()->setFrameFillColor1( QColor( 50, 90, 50, 100 ) );
339   map->grid()->setFrameFillColor2( QColor( 200, 220, 100, 60 ) );
340   map->grid()->setEnabled( true );
341   map->updateBoundingRect();
342 
343   QgsLayoutChecker checker( QStringLiteral( "composermap_zebrastyle" ), &l );
344   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
345 
346   bool testResult = checker.testLayout( mReport, 0, 0 );
347   QVERIFY( testResult );
348 }
349 
zebraStyleSides()350 void TestQgsLayoutMapGrid::zebraStyleSides()
351 {
352   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
353   QgsProject::instance()->setCrs( crs );
354   QgsLayout l( QgsProject::instance() );
355   l.initializeDefaults();
356 
357   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
358   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
359   map->setFrameEnabled( true );
360   map->setBackgroundColor( QColor( 150, 100, 100 ) );
361   QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) );
362   format.setColor( QColor( 0, 0, 0, 0 ) );
363   map->grid()->setAnnotationTextFormat( format );
364   map->grid()->setAnnotationPrecision( 0 );
365   map->grid()->setIntervalX( 2000 );
366   map->grid()->setIntervalY( 2000 );
367   map->grid()->setGridLineWidth( 0.5 );
368   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
369   map->updateBoundingRect();
370   l.addLayoutItem( map );
371 
372   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
373   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
374 
375   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::Zebra );
376   map->grid()->setFrameWidth( 10 );
377   map->grid()->setFramePenSize( 1 );
378   map->grid()->setFramePenColor( Qt::black );
379   map->grid()->setFrameFillColor1( Qt::black );
380   map->grid()->setFrameFillColor2( Qt::white );
381   map->grid()->setEnabled( true );
382 
383   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameLeft, true );
384   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameRight, false );
385   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameTop, false );
386   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameBottom, false );
387   map->updateBoundingRect();
388 
389   QgsLayoutChecker checker( QStringLiteral( "composermap_zebrastyle_left" ), &l );
390   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
391   bool testResult = checker.testLayout( mReport, 0, 0 );
392   QVERIFY( testResult );
393 
394   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameTop, true );
395   map->updateBoundingRect();
396   QgsLayoutChecker checker2( QStringLiteral( "composermap_zebrastyle_lefttop" ), &l );
397   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
398   bool testResult2 = checker2.testLayout( mReport, 0, 0 );
399   QVERIFY( testResult2 );
400 
401   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameRight, true );
402   map->updateBoundingRect();
403   QgsLayoutChecker checker3( QStringLiteral( "composermap_zebrastyle_lefttopright" ), &l );
404   checker3.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
405   bool testResult3 = checker3.testLayout( mReport, 0, 0 );
406   QVERIFY( testResult3 );
407 
408   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameBottom, true );
409   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
410 
411 }
412 
zebraStyleMargin()413 void TestQgsLayoutMapGrid::zebraStyleMargin()
414 {
415   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
416   QgsProject::instance()->setCrs( crs );
417   QgsLayout l( QgsProject::instance() );
418   l.initializeDefaults();
419 
420   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
421   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
422   map->setFrameEnabled( true );
423   map->setBackgroundColor( QColor( 150, 100, 100 ) );
424   QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) );
425   format.setColor( QColor( 0, 0, 0, 0 ) );
426   map->grid()->setAnnotationTextFormat( format );
427   map->grid()->setAnnotationPrecision( 0 );
428   map->grid()->setIntervalX( 2000 );
429   map->grid()->setIntervalY( 2000 );
430   map->grid()->setGridLineWidth( 0.5 );
431   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
432   map->updateBoundingRect();
433   l.addLayoutItem( map );
434 
435   map->setExtent( QgsRectangle( 785462.375, 3341423.125, 789262.375, 3343323.125 ) ); //zoom in
436   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
437 
438   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::Zebra );
439   map->grid()->setFrameWidth( 10 );
440   map->grid()->setFramePenSize( 1 );
441   map->grid()->setFrameMargin( 5 );
442   map->grid()->setFramePenColor( QColor( 255, 100, 0, 200 ) );
443   map->grid()->setFrameFillColor1( QColor( 50, 90, 50, 100 ) );
444   map->grid()->setFrameFillColor2( QColor( 200, 220, 100, 60 ) );
445   map->grid()->setEnabled( true );
446   map->updateBoundingRect();
447 
448   QgsLayoutChecker checker( QStringLiteral( "composermap_marginzebrastyle" ), &l );
449   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
450 
451   bool testResult = checker.testLayout( mReport, 0, 0 );
452   QVERIFY( testResult );
453 }
454 
zebraStyleNautical()455 void TestQgsLayoutMapGrid::zebraStyleNautical()
456 {
457   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
458   QgsProject::instance()->setCrs( crs );
459   QgsLayout l( QgsProject::instance() );
460   l.initializeDefaults();
461 
462   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
463   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
464   map->setFrameEnabled( true );
465   map->setBackgroundColor( QColor( 150, 100, 100 ) );
466   QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) );
467   format.setColor( QColor( 0, 0, 0, 0 ) );
468   map->grid()->setAnnotationTextFormat( format );
469   map->grid()->setAnnotationPrecision( 0 );
470   map->grid()->setIntervalX( 2000 );
471   map->grid()->setIntervalY( 2000 );
472   map->grid()->setGridLineWidth( 0.5 );
473   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
474   map->updateBoundingRect();
475   l.addLayoutItem( map );
476 
477   map->setExtent( QgsRectangle( 785462.375, 3341423.125, 789262.375, 3343323.125 ) ); //zoom in
478   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
479 
480   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::ZebraNautical );
481   map->grid()->setFrameWidth( 10 );
482   map->grid()->setFramePenSize( 1 );
483   map->grid()->setFrameMargin( 5 );
484   map->grid()->setFramePenColor( QColor( 255, 100, 0, 200 ) );
485   map->grid()->setFrameFillColor1( QColor( 50, 90, 50, 100 ) );
486   map->grid()->setFrameFillColor2( QColor( 200, 220, 100, 60 ) );
487   map->grid()->setEnabled( true );
488   map->updateBoundingRect();
489 
490   QgsLayoutChecker checker( QStringLiteral( "composermap_zebranauticalstyle" ), &l );
491   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
492 
493   bool testResult = checker.testLayout( mReport, 0, 0 );
494   QVERIFY( testResult );
495 }
496 
frameDivisions()497 void TestQgsLayoutMapGrid::frameDivisions()
498 {
499   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
500   QgsProject::instance()->setCrs( crs );
501   QgsLayout l( QgsProject::instance() );
502   l.initializeDefaults();
503 
504   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
505   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
506   map->setFrameEnabled( true );
507   map->setBackgroundColor( QColor( 150, 100, 100 ) );
508   QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) );
509   format.setColor( QColor( 0, 0, 0, 0 ) );
510   map->grid()->setAnnotationTextFormat( format );
511   map->grid()->setAnnotationPrecision( 0 );
512   map->grid()->setIntervalX( 2000 );
513   map->grid()->setIntervalY( 2000 );
514   map->grid()->setGridLineWidth( 0.5 );
515   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
516   map->updateBoundingRect();
517   l.addLayoutItem( map );
518 
519   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
520   //rotate map, so we mix latitude and longitude coordinates on every map side
521   map->setMapRotation( 45.0 );
522 
523   //setup defaults
524   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
525   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::Zebra );
526   map->grid()->setFrameWidth( 10 );
527   map->grid()->setFramePenSize( 1 );
528   map->grid()->setFramePenColor( Qt::black );
529   map->grid()->setFrameFillColor1( Qt::black );
530   map->grid()->setFrameFillColor2( Qt::white );
531   map->grid()->setEnabled( true );
532   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameLeft, true );
533   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameRight, true );
534   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameTop, true );
535   map->grid()->setFrameSideFlag( QgsLayoutItemMapGrid::FrameBottom, true );
536   map->updateBoundingRect();
537 
538   QgsLayoutChecker checker( QStringLiteral( "composermap_rotatedframe" ), &l );
539   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
540   bool testResult = checker.testLayout( mReport, 0, 0 );
541   QVERIFY( testResult );
542 
543   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::LatitudeOnly, QgsLayoutItemMapGrid::Left );
544   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::LongitudeOnly, QgsLayoutItemMapGrid::Right );
545   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::LatitudeOnly, QgsLayoutItemMapGrid::Top );
546   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::LongitudeOnly, QgsLayoutItemMapGrid::Bottom );
547   map->updateBoundingRect();
548 
549   QgsLayoutChecker checker2( QStringLiteral( "composermap_framedivisions" ), &l );
550   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
551   testResult = checker2.testLayout( mReport, 0, 0 );
552   QVERIFY( testResult );
553 
554   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Left );
555   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Right );
556   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Top );
557   map->grid()->setFrameDivisions( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Bottom );
558   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
559   map->setMapRotation( 0.0 );
560 }
561 
annotationFilter()562 void TestQgsLayoutMapGrid::annotationFilter()
563 {
564   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
565   QgsProject::instance()->setCrs( crs );
566   QgsLayout l( QgsProject::instance() );
567   l.initializeDefaults();
568 
569   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
570   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
571   map->setFrameEnabled( true );
572   map->setBackgroundColor( QColor( 150, 100, 100 ) );
573   QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) );
574   format.setColor( QColor( 0, 0, 0, 0 ) );
575   map->grid()->setAnnotationTextFormat( format );
576   map->grid()->setAnnotationPrecision( 0 );
577   map->grid()->setIntervalX( 2000 );
578   map->grid()->setIntervalY( 2000 );
579   map->grid()->setGridLineWidth( 0.5 );
580   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
581   map->updateBoundingRect();
582   l.addLayoutItem( map );
583 
584   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
585   //rotate map, so we mix latitude and longitude coordinates on every map side
586   map->setMapRotation( 45.0 );
587 
588   //setup defaults
589   map->grid()->setBlendMode( QPainter::CompositionMode_SourceOver );
590   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
591   map->grid()->setEnabled( true );
592   map->grid()->setAnnotationEnabled( true );
593   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Left );
594   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Right );
595   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Top );
596   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Bottom );
597   map->updateBoundingRect();
598 
599   QgsLayoutChecker checker( QStringLiteral( "composermap_rotatedannotations" ), &l );
600   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
601   bool testResult = checker.testLayout( mReport, 0, 0 );
602   QVERIFY( testResult );
603 
604   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::HideAll, QgsLayoutItemMapGrid::Left );
605   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::LongitudeOnly, QgsLayoutItemMapGrid::Right );
606   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::LatitudeOnly, QgsLayoutItemMapGrid::Top );
607   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::LongitudeOnly, QgsLayoutItemMapGrid::Bottom );
608   map->updateBoundingRect();
609 
610   QgsLayoutChecker checker2( QStringLiteral( "composermap_filteredannotations" ), &l );
611   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
612   testResult = checker2.testLayout( mReport, 0, 0 );
613   QVERIFY( testResult );
614 
615   map->grid()->setAnnotationEnabled( false );
616   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Left );
617   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Right );
618   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Top );
619   map->grid()->setAnnotationDisplay( QgsLayoutItemMapGrid::ShowAll, QgsLayoutItemMapGrid::Bottom );
620   map->setMapRotation( 0.0 );
621 }
622 
interiorTicks()623 void TestQgsLayoutMapGrid::interiorTicks()
624 {
625   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
626   QgsProject::instance()->setCrs( crs );
627   QgsLayout l( QgsProject::instance() );
628   l.initializeDefaults();
629 
630   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
631   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
632   map->setFrameEnabled( true );
633   map->setBackgroundColor( QColor( 150, 100, 100 ) );
634   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
635   map->grid()->setAnnotationPrecision( 0 );
636   map->grid()->setIntervalX( 2000 );
637   map->grid()->setIntervalY( 2000 );
638   map->grid()->setGridLineWidth( 0.5 );
639   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
640   map->updateBoundingRect();
641   l.addLayoutItem( map );
642 
643   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
644 
645   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::InteriorTicks );
646   map->grid()->setFrameWidth( 10 );
647   map->grid()->setFramePenSize( 1 );
648   map->grid()->setFramePenColor( Qt::black );
649   map->grid()->setEnabled( true );
650   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
651   map->updateBoundingRect();
652 
653   QgsLayoutChecker checker( QStringLiteral( "composermap_interiorticks" ), &l );
654   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
655   bool testResult = checker.testLayout( mReport, 0, 0 );
656   QVERIFY( testResult );
657 
658   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
659 }
660 
interiorTicksMargin()661 void TestQgsLayoutMapGrid::interiorTicksMargin()
662 {
663   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
664   QgsProject::instance()->setCrs( crs );
665   QgsLayout l( QgsProject::instance() );
666   l.initializeDefaults();
667 
668   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
669   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
670   map->setFrameEnabled( true );
671   map->setBackgroundColor( QColor( 150, 100, 100 ) );
672   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
673   map->grid()->setAnnotationPrecision( 0 );
674   map->grid()->setIntervalX( 2000 );
675   map->grid()->setIntervalY( 2000 );
676   map->grid()->setGridLineWidth( 0.5 );
677   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
678   map->updateBoundingRect();
679   l.addLayoutItem( map );
680 
681   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
682 
683   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::InteriorTicks );
684   map->grid()->setFrameWidth( 10 );
685   map->grid()->setFramePenSize( 1 );
686   map->grid()->setFrameMargin( 5 );
687   map->grid()->setFramePenColor( Qt::black );
688   map->grid()->setEnabled( true );
689   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
690   map->updateBoundingRect();
691 
692   QgsLayoutChecker checker( QStringLiteral( "composermap_margininteriorticks" ), &l );
693   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
694   bool testResult = checker.testLayout( mReport, 0, 0 );
695   QVERIFY( testResult );
696 
697   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
698 }
699 
interiorTicksAnnotated()700 void TestQgsLayoutMapGrid::interiorTicksAnnotated()
701 {
702   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
703   QgsProject::instance()->setCrs( crs );
704   QgsLayout l( QgsProject::instance() );
705   l.initializeDefaults();
706 
707   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
708   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
709   map->setFrameEnabled( true );
710   map->setBackgroundColor( QColor( 150, 100, 100 ) );
711   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
712   map->grid()->setAnnotationPrecision( 0 );
713   map->grid()->setIntervalX( 2000 );
714   map->grid()->setIntervalY( 2000 );
715   map->grid()->setGridLineWidth( 0.5 );
716   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
717   map->updateBoundingRect();
718   l.addLayoutItem( map );
719 
720   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
721 
722   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::InteriorTicks );
723   map->grid()->setFrameWidth( 10 );
724   map->grid()->setFramePenSize( 1 );
725   map->grid()->setFramePenColor( Qt::black );
726   map->grid()->setEnabled( true );
727   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
728   map->grid()->setAnnotationEnabled( true );
729   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Left );
730   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Right );
731   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Top );
732   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Bottom );
733   map->updateBoundingRect();
734 
735   QgsLayoutChecker checker( QStringLiteral( "composermap_interiorticks_annotated" ), &l );
736   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
737   bool testResult = checker.testLayout( mReport, 0, 0 );
738   QVERIFY( testResult );
739 
740   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Left );
741   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Right );
742   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Top );
743   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Bottom );
744   map->updateBoundingRect();
745 
746   QgsLayoutChecker checker2( QStringLiteral( "composermap_interiorticks_annotated2" ), &l );
747   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
748   bool testResult2 = checker2.testLayout( mReport, 0, 0 );
749   QVERIFY( testResult2 );
750 
751   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
752   map->grid()->setAnnotationEnabled( false );
753 }
754 
exteriorTicks()755 void TestQgsLayoutMapGrid::exteriorTicks()
756 {
757   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
758   QgsProject::instance()->setCrs( crs );
759   QgsLayout l( QgsProject::instance() );
760   l.initializeDefaults();
761 
762   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
763   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
764   map->setFrameEnabled( true );
765   map->setBackgroundColor( QColor( 150, 100, 100 ) );
766   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
767   map->grid()->setAnnotationPrecision( 0 );
768   map->grid()->setIntervalX( 2000 );
769   map->grid()->setIntervalY( 2000 );
770   map->grid()->setGridLineWidth( 0.5 );
771   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
772   map->updateBoundingRect();
773   l.addLayoutItem( map );
774 
775   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
776 
777   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::ExteriorTicks );
778   map->grid()->setFrameWidth( 10 );
779   map->grid()->setFramePenSize( 1 );
780   map->grid()->setFramePenColor( Qt::black );
781   map->grid()->setEnabled( true );
782   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
783   map->updateBoundingRect();
784 
785   QgsLayoutChecker checker( QStringLiteral( "composermap_exteriorticks" ), &l );
786   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
787   bool testResult = checker.testLayout( mReport, 0, 0 );
788   QVERIFY( testResult );
789 
790   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
791 }
792 
exteriorTicksMargin()793 void TestQgsLayoutMapGrid::exteriorTicksMargin()
794 {
795   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
796   QgsProject::instance()->setCrs( crs );
797   QgsLayout l( QgsProject::instance() );
798   l.initializeDefaults();
799 
800   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
801   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
802   map->setFrameEnabled( true );
803   map->setBackgroundColor( QColor( 150, 100, 100 ) );
804   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
805   map->grid()->setAnnotationPrecision( 0 );
806   map->grid()->setIntervalX( 2000 );
807   map->grid()->setIntervalY( 2000 );
808   map->grid()->setGridLineWidth( 0.5 );
809   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
810   map->updateBoundingRect();
811   l.addLayoutItem( map );
812 
813   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
814 
815   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::ExteriorTicks );
816   map->grid()->setFrameWidth( 10 );
817   map->grid()->setFramePenSize( 1 );
818   map->grid()->setFrameMargin( 5 );
819   map->grid()->setFramePenColor( Qt::black );
820   map->grid()->setEnabled( true );
821   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
822   map->updateBoundingRect();
823 
824   QgsLayoutChecker checker( QStringLiteral( "composermap_marginexteriorticks" ), &l );
825   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
826   bool testResult = checker.testLayout( mReport, 0, 0 );
827   QVERIFY( testResult );
828 
829   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
830 }
831 
exteriorTicksAnnotated()832 void TestQgsLayoutMapGrid::exteriorTicksAnnotated()
833 {
834   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
835   QgsProject::instance()->setCrs( crs );
836   QgsLayout l( QgsProject::instance() );
837   l.initializeDefaults();
838 
839   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
840   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
841   map->setFrameEnabled( true );
842   map->setBackgroundColor( QColor( 150, 100, 100 ) );
843   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
844   map->grid()->setAnnotationPrecision( 0 );
845   map->grid()->setIntervalX( 2000 );
846   map->grid()->setIntervalY( 2000 );
847   map->grid()->setGridLineWidth( 0.5 );
848   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
849   map->updateBoundingRect();
850   l.addLayoutItem( map );
851 
852   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
853 
854   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::ExteriorTicks );
855   map->grid()->setFrameWidth( 10 );
856   map->grid()->setFramePenSize( 1 );
857   map->grid()->setFramePenColor( Qt::black );
858   map->grid()->setEnabled( true );
859   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
860   map->grid()->setAnnotationEnabled( true );
861   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Left );
862   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Right );
863   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Top );
864   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Bottom );
865   map->updateBoundingRect();
866 
867   QgsLayoutChecker checker( QStringLiteral( "composermap_exteriorticks_annotated" ), &l );
868   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
869   bool testResult = checker.testLayout( mReport, 0, 0 );
870   QVERIFY( testResult );
871 
872   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Left );
873   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Right );
874   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Top );
875   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Bottom );
876   map->updateBoundingRect();
877 
878   QgsLayoutChecker checker2( QStringLiteral( "composermap_exteriorticks_annotated2" ), &l );
879   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
880   bool testResult2 = checker2.testLayout( mReport, 0, 0 );
881   QVERIFY( testResult2 );
882 
883   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
884   map->grid()->setAnnotationEnabled( false );
885 }
886 
interiorExteriorTicks()887 void TestQgsLayoutMapGrid::interiorExteriorTicks()
888 {
889   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
890   QgsProject::instance()->setCrs( crs );
891   QgsLayout l( QgsProject::instance() );
892   l.initializeDefaults();
893 
894   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
895   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
896   map->setFrameEnabled( true );
897   map->setBackgroundColor( QColor( 150, 100, 100 ) );
898   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
899   map->grid()->setAnnotationPrecision( 0 );
900   map->grid()->setIntervalX( 2000 );
901   map->grid()->setIntervalY( 2000 );
902   map->grid()->setGridLineWidth( 0.5 );
903   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
904   map->updateBoundingRect();
905   l.addLayoutItem( map );
906 
907   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
908 
909   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::InteriorExteriorTicks );
910   map->grid()->setFrameWidth( 10 );
911   map->grid()->setFramePenSize( 1 );
912   map->grid()->setFramePenColor( Qt::black );
913   map->grid()->setEnabled( true );
914   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
915   map->updateBoundingRect();
916 
917   QgsLayoutChecker checker( QStringLiteral( "composermap_interiorexteriorticks" ), &l );
918   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
919   bool testResult = checker.testLayout( mReport, 0, 0 );
920   QVERIFY( testResult );
921 
922   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
923 }
924 
interiorExteriorTicksMargin()925 void TestQgsLayoutMapGrid::interiorExteriorTicksMargin()
926 {
927   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
928   QgsProject::instance()->setCrs( crs );
929   QgsLayout l( QgsProject::instance() );
930   l.initializeDefaults();
931 
932   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
933   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
934   map->setFrameEnabled( true );
935   map->setBackgroundColor( QColor( 150, 100, 100 ) );
936   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
937   map->grid()->setAnnotationPrecision( 0 );
938   map->grid()->setIntervalX( 2000 );
939   map->grid()->setIntervalY( 2000 );
940   map->grid()->setGridLineWidth( 0.5 );
941   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
942   map->updateBoundingRect();
943   l.addLayoutItem( map );
944 
945   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
946 
947   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::InteriorExteriorTicks );
948   map->grid()->setFrameWidth( 10 );
949   map->grid()->setFramePenSize( 1 );
950   map->grid()->setFrameMargin( 5 );
951   map->grid()->setFramePenColor( Qt::black );
952   map->grid()->setEnabled( true );
953   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
954   map->updateBoundingRect();
955 
956   QgsLayoutChecker checker( QStringLiteral( "composermap_margininteriorexteriorticks" ), &l );
957   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
958   bool testResult = checker.testLayout( mReport, 0, 0 );
959   QVERIFY( testResult );
960 
961   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
962 }
963 
interiorExteriorTicksAnnotated()964 void TestQgsLayoutMapGrid::interiorExteriorTicksAnnotated()
965 {
966   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
967   QgsProject::instance()->setCrs( crs );
968   QgsLayout l( QgsProject::instance() );
969   l.initializeDefaults();
970 
971   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
972   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
973   map->setFrameEnabled( true );
974   map->setBackgroundColor( QColor( 150, 100, 100 ) );
975   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
976   map->grid()->setAnnotationPrecision( 0 );
977   map->grid()->setIntervalX( 2000 );
978   map->grid()->setIntervalY( 2000 );
979   map->grid()->setGridLineWidth( 0.5 );
980   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
981   map->updateBoundingRect();
982   l.addLayoutItem( map );
983 
984   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
985 
986   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::InteriorExteriorTicks );
987   map->grid()->setFrameWidth( 10 );
988   map->grid()->setFramePenSize( 1 );
989   map->grid()->setFramePenColor( Qt::black );
990   map->grid()->setEnabled( true );
991   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
992   map->grid()->setAnnotationEnabled( true );
993   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Left );
994   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Right );
995   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Top );
996   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Bottom );
997   map->updateBoundingRect();
998 
999   QgsLayoutChecker checker( QStringLiteral( "composermap_interiorexteriorticks_annotated" ), &l );
1000   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1001   bool testResult = checker.testLayout( mReport, 0, 0 );
1002   QVERIFY( testResult );
1003 
1004   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Left );
1005   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Right );
1006   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Top );
1007   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Bottom );
1008   map->updateBoundingRect();
1009 
1010   QgsLayoutChecker checker2( QStringLiteral( "composermap_interiorexteriorticks_annotated2" ), &l );
1011   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1012   bool testResult2 = checker2.testLayout( mReport, 0, 0 );
1013   QVERIFY( testResult2 );
1014 
1015   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
1016   map->grid()->setAnnotationEnabled( false );
1017 }
1018 
lineBorder()1019 void TestQgsLayoutMapGrid::lineBorder()
1020 {
1021   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
1022   QgsProject::instance()->setCrs( crs );
1023   QgsLayout l( QgsProject::instance() );
1024   l.initializeDefaults();
1025 
1026   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
1027   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
1028   map->setFrameEnabled( true );
1029   map->setBackgroundColor( QColor( 150, 100, 100 ) );
1030   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
1031   map->grid()->setAnnotationPrecision( 0 );
1032   map->grid()->setIntervalX( 2000 );
1033   map->grid()->setIntervalY( 2000 );
1034   map->grid()->setGridLineWidth( 0.5 );
1035   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
1036   map->updateBoundingRect();
1037   l.addLayoutItem( map );
1038 
1039   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
1040 
1041   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::LineBorder );
1042   map->grid()->setFrameWidth( 10 );
1043   map->grid()->setFramePenSize( 1 );
1044   map->grid()->setFramePenColor( Qt::black );
1045   map->grid()->setEnabled( true );
1046   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
1047   map->updateBoundingRect();
1048 
1049   QgsLayoutChecker checker( QStringLiteral( "composermap_lineborder" ), &l );
1050   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1051   bool testResult = checker.testLayout( mReport, 0, 0 );
1052   QVERIFY( testResult );
1053 
1054   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
1055 }
1056 
lineBorderMargin()1057 void TestQgsLayoutMapGrid::lineBorderMargin()
1058 {
1059   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
1060   QgsProject::instance()->setCrs( crs );
1061   QgsLayout l( QgsProject::instance() );
1062   l.initializeDefaults();
1063 
1064   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
1065   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
1066   map->setFrameEnabled( true );
1067   map->setBackgroundColor( QColor( 150, 100, 100 ) );
1068   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
1069   map->grid()->setAnnotationPrecision( 0 );
1070   map->grid()->setIntervalX( 2000 );
1071   map->grid()->setIntervalY( 2000 );
1072   map->grid()->setGridLineWidth( 0.5 );
1073   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
1074   map->updateBoundingRect();
1075   l.addLayoutItem( map );
1076 
1077   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
1078 
1079   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::LineBorder );
1080   map->grid()->setFrameWidth( 10 );
1081   map->grid()->setFramePenSize( 1 );
1082   map->grid()->setFrameMargin( 5 );
1083   map->grid()->setFramePenColor( Qt::black );
1084   map->grid()->setEnabled( true );
1085   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
1086   map->updateBoundingRect();
1087 
1088   QgsLayoutChecker checker( QStringLiteral( "composermap_marginlineborder" ), &l );
1089   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1090   bool testResult = checker.testLayout( mReport, 0, 0 );
1091   QVERIFY( testResult );
1092 
1093   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
1094 }
1095 
lineBorderNautical()1096 void TestQgsLayoutMapGrid::lineBorderNautical()
1097 {
1098   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
1099   QgsProject::instance()->setCrs( crs );
1100   QgsLayout l( QgsProject::instance() );
1101   l.initializeDefaults();
1102 
1103   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
1104   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
1105   map->setFrameEnabled( true );
1106   map->setBackgroundColor( QColor( 150, 100, 100 ) );
1107   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
1108   map->grid()->setAnnotationPrecision( 0 );
1109   map->grid()->setIntervalX( 2000 );
1110   map->grid()->setIntervalY( 2000 );
1111   map->grid()->setGridLineWidth( 0.5 );
1112   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
1113   map->updateBoundingRect();
1114   l.addLayoutItem( map );
1115 
1116   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
1117 
1118   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::LineBorderNautical );
1119   map->grid()->setFrameWidth( 10 );
1120   map->grid()->setFramePenSize( 1 );
1121   map->grid()->setFrameMargin( 5 );
1122   map->grid()->setFramePenColor( Qt::black );
1123   map->grid()->setEnabled( true );
1124   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
1125   map->updateBoundingRect();
1126 
1127   QgsLayoutChecker checker( QStringLiteral( "composermap_linebordernautical" ), &l );
1128   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1129   bool testResult = checker.testLayout( mReport, 0, 0 );
1130   QVERIFY( testResult );
1131 
1132   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
1133 }
1134 
lineBorderAnnotated()1135 void TestQgsLayoutMapGrid::lineBorderAnnotated()
1136 {
1137   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
1138   QgsProject::instance()->setCrs( crs );
1139   QgsLayout l( QgsProject::instance() );
1140   l.initializeDefaults();
1141 
1142   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
1143   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
1144   map->setFrameEnabled( true );
1145   map->setBackgroundColor( QColor( 150, 100, 100 ) );
1146   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
1147   map->grid()->setAnnotationPrecision( 0 );
1148   map->grid()->setIntervalX( 2000 );
1149   map->grid()->setIntervalY( 2000 );
1150   map->grid()->setGridLineWidth( 0.5 );
1151   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
1152   map->updateBoundingRect();
1153   l.addLayoutItem( map );
1154 
1155   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
1156 
1157   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::LineBorder );
1158   map->grid()->setFrameWidth( 10 );
1159   map->grid()->setFramePenSize( 1 );
1160   map->grid()->setFramePenColor( Qt::black );
1161   map->grid()->setEnabled( true );
1162   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
1163   map->grid()->setAnnotationEnabled( true );
1164   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Left );
1165   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Right );
1166   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Top );
1167   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Bottom );
1168   map->updateBoundingRect();
1169 
1170   QgsLayoutChecker checker( QStringLiteral( "composermap_lineborder_annotated" ), &l );
1171   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1172   bool testResult = checker.testLayout( mReport, 0, 0 );
1173   QVERIFY( testResult );
1174 
1175   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Left );
1176   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Right );
1177   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Top );
1178   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Bottom );
1179   map->updateBoundingRect();
1180 
1181   QgsLayoutChecker checker2( QStringLiteral( "composermap_lineborder_annotated2" ), &l );
1182   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1183   bool testResult2 = checker2.testLayout( mReport, 0, 0 );
1184   QVERIFY( testResult2 );
1185 
1186   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
1187   map->grid()->setAnnotationEnabled( false );
1188 }
1189 
annotationFormats()1190 void TestQgsLayoutMapGrid::annotationFormats()
1191 {
1192   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
1193   QgsProject::instance()->setCrs( crs );
1194   QgsLayout l( QgsProject::instance() );
1195   l.initializeDefaults();
1196 
1197   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
1198   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
1199   map->setFrameEnabled( true );
1200   map->setBackgroundColor( QColor( 150, 100, 100 ) );
1201   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
1202   map->grid()->setAnnotationPrecision( 0 );
1203   map->grid()->setIntervalX( 2000 );
1204   map->grid()->setIntervalY( 2000 );
1205   map->grid()->setGridLineWidth( 0.5 );
1206   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
1207   map->updateBoundingRect();
1208   l.addLayoutItem( map );
1209 
1210   //create grids in geographic and projected coordinates
1211   QgsCoordinateReferenceSystem projectedCrs( QStringLiteral( "EPSG:3994" ) );
1212   QgsCoordinateReferenceSystem geographicCrs( QStringLiteral( "EPSG:4326" ) );
1213 
1214   QgsLayoutItemMapGrid gridGeographic( QStringLiteral( "geographic grid" ), map );
1215   gridGeographic.setCrs( geographicCrs );
1216   QgsLayoutItemMapGrid gridProjected( QStringLiteral( "projected grid" ), map );
1217   gridProjected.setCrs( projectedCrs );
1218 
1219   //decimal degrees format
1220   gridGeographic.setAnnotationFormat( QgsLayoutItemMapGrid::DecimalWithSuffix );
1221   gridGeographic.setAnnotationPrecision( 1 );
1222   gridProjected.setAnnotationFormat( QgsLayoutItemMapGrid::DecimalWithSuffix );
1223   gridProjected.setAnnotationPrecision( 1 );
1224 
1225   QgsExpressionContext expressionContext = gridGeographic.createExpressionContext();
1226 
1227   //normal e/w
1228   QCOMPARE( gridGeographic.gridAnnotationString( 90, QgsLayoutItemMapGrid::Longitude, expressionContext ), QString( "90.0°E" ) );
1229   QCOMPARE( gridProjected.gridAnnotationString( 90, QgsLayoutItemMapGrid::Longitude, expressionContext ), QString( "90.0E" ) );
1230 
1231   //0 degrees
1232   QCOMPARE( gridGeographic.gridAnnotationString( 0, QgsLayoutItemMapGrid::Longitude, expressionContext ), QString( "0.0°" ) );
1233   QCOMPARE( gridProjected.gridAnnotationString( 0, QgsLayoutItemMapGrid::Longitude, expressionContext ), QString( "0.0E" ) );
1234 
1235   //180 degrees
1236   QCOMPARE( gridGeographic.gridAnnotationString( 180, QgsLayoutItemMapGrid::Longitude, expressionContext ), QString( "180.0°" ) );
1237   QCOMPARE( gridProjected.gridAnnotationString( 180, QgsLayoutItemMapGrid::Longitude, expressionContext ), QString( "180.0E" ) );
1238 
1239   //normal n/s
1240   QCOMPARE( gridGeographic.gridAnnotationString( 45, QgsLayoutItemMapGrid::Latitude, expressionContext ), QString( "45.0°N" ) );
1241   QCOMPARE( gridProjected.gridAnnotationString( 45, QgsLayoutItemMapGrid::Latitude, expressionContext ), QString( "45.0N" ) );
1242 
1243   //0 north/south
1244   QCOMPARE( gridGeographic.gridAnnotationString( 0, QgsLayoutItemMapGrid::Latitude, expressionContext ), QString( "0.0°" ) );
1245   QCOMPARE( gridProjected.gridAnnotationString( 0, QgsLayoutItemMapGrid::Latitude, expressionContext ), QString( "0.0N" ) );
1246 
1247   //Custom format annotations
1248   gridProjected.setAnnotationFormat( QgsLayoutItemMapGrid::CustomFormat );
1249   gridProjected.setAnnotationExpression( QStringLiteral( "(@grid_number/10) || case when @grid_axis ='x' then 'a' else 'b' end" ) );
1250   QCOMPARE( gridProjected.gridAnnotationString( 45, QgsLayoutItemMapGrid::Latitude, expressionContext ), QString( "4.5b" ) );
1251   QCOMPARE( gridProjected.gridAnnotationString( 35, QgsLayoutItemMapGrid::Longitude, expressionContext ), QString( "3.5a" ) );
1252 }
1253 
descendingAnnotations()1254 void TestQgsLayoutMapGrid::descendingAnnotations()
1255 {
1256   QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:32633" ) );
1257   QgsProject::instance()->setCrs( crs );
1258   QgsLayout l( QgsProject::instance() );
1259   l.initializeDefaults();
1260 
1261   QgsLayoutItemMap *map = new QgsLayoutItemMap( &l );
1262   map->attemptSetSceneRect( QRectF( 20, 20, 200, 100 ) );
1263   map->setFrameEnabled( true );
1264   map->setBackgroundColor( QColor( 150, 100, 100 ) );
1265   map->grid()->setAnnotationTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ) );
1266   map->grid()->setAnnotationPrecision( 0 );
1267   map->grid()->setIntervalX( 2000 );
1268   map->grid()->setIntervalY( 2000 );
1269   map->grid()->setGridLineWidth( 0.5 );
1270   map->grid()->setGridLineColor( QColor( 0, 0, 0 ) );
1271   map->updateBoundingRect();
1272   l.addLayoutItem( map );
1273 
1274   map->setExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3345223.125 ) );
1275 
1276   map->grid()->setFrameStyle( QgsLayoutItemMapGrid::NoFrame );
1277   map->grid()->setEnabled( true );
1278   map->grid()->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
1279   map->grid()->setAnnotationEnabled( true );
1280   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Left );
1281   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Right );
1282   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Top );
1283   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::InsideMapFrame, QgsLayoutItemMapGrid::Bottom );
1284   map->grid()->setAnnotationDirection( QgsLayoutItemMapGrid::VerticalDescending, QgsLayoutItemMapGrid::Left );
1285   map->grid()->setAnnotationDirection( QgsLayoutItemMapGrid::VerticalDescending, QgsLayoutItemMapGrid::Right );
1286   map->grid()->setAnnotationDirection( QgsLayoutItemMapGrid::VerticalDescending, QgsLayoutItemMapGrid::Top );
1287   map->grid()->setAnnotationDirection( QgsLayoutItemMapGrid::VerticalDescending, QgsLayoutItemMapGrid::Bottom );
1288   map->updateBoundingRect();
1289 
1290   QgsLayoutChecker checker( QStringLiteral( "composermap_verticaldescending_inside" ), &l );
1291   checker.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1292   bool testResult = checker.testLayout( mReport, 0, 0 );
1293   QVERIFY( testResult );
1294 
1295   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Left );
1296   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Right );
1297   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Top );
1298   map->grid()->setAnnotationPosition( QgsLayoutItemMapGrid::OutsideMapFrame, QgsLayoutItemMapGrid::Bottom );
1299   map->updateBoundingRect();
1300 
1301   QgsLayoutChecker checker2( QStringLiteral( "composermap_verticaldescending_outside" ), &l );
1302   checker2.setControlPathPrefix( QStringLiteral( "composer_mapgrid" ) );
1303   bool testResult2 = checker2.testLayout( mReport, 0, 0 );
1304   QVERIFY( testResult2 );
1305 
1306   map->grid()->setAnnotationEnabled( false );
1307 }
1308 QGSTEST_MAIN( TestQgsLayoutMapGrid )
1309 #include "testqgslayoutmapgrid.moc"
1310