1 /***************************************************************************
2      testqgsdiagram.cpp
3      --------------------------------------
4     Date                 : Sep 7 2012
5     Copyright            : (C) 2012 by Matthias Kuhn
6     Email                : matthias at opengis dot ch
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 #include "qgstest.h"
16 #include <QObject>
17 #include <QString>
18 #include <QStringList>
19 #include <QApplication>
20 #include <QFileInfo>
21 #include <QDir>
22 #include <QDesktopServices>
23 #include <QPainter>
24 
25 //qgis includes...
26 // #include <qgisapp.h>
27 #include "diagram/qgspiediagram.h"
28 #include "diagram/qgstextdiagram.h"
29 #include "diagram/qgsstackedbardiagram.h"
30 #include "diagram/qgshistogramdiagram.h"
31 #include "qgsdiagramrenderer.h"
32 #include "qgsmaplayer.h"
33 #include "qgsvectordataprovider.h"
34 #include "qgsvectorlayer.h"
35 #include "qgsapplication.h"
36 #include "qgsproviderregistry.h"
37 #include "qgsrenderer.h"
38 #include "qgssinglesymbolrenderer.h"
39 //qgis test includes
40 #include "qgsmultirenderchecker.h"
41 #include "qgspallabeling.h"
42 #include "qgsproject.h"
43 #include "qgsshadoweffect.h"
44 
45 /**
46  * \ingroup UnitTests
47  * Unit tests for the diagram renderer
48  */
49 class TestQgsDiagram : public QObject
50 {
51     Q_OBJECT
52 
53   public:
54     TestQgsDiagram() = default;
55 
56   private:
57     bool mTestHasError =  false ;
58     QgsMapSettings *mMapSettings = nullptr;
59     QgsVectorLayer *mPointsLayer = nullptr;
60     QString mTestDataDir;
61     QString mReport;
62 
63     bool imageCheck( const QString &testType );
64 
65   private slots:
66     // will be called before the first testfunction is executed.
initTestCase()67     void initTestCase()
68     {
69       mTestHasError = false;
70       QgsApplication::init();
71       QgsApplication::initQgis();
72       QgsApplication::showSettings();
73 
74       mMapSettings = new QgsMapSettings();
75 
76       //create some objects that will be used in all tests...
77 
78       //
79       //create a non spatial layer that will be used in all tests...
80       //
81       QString myDataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt
82       mTestDataDir = myDataDir + '/';
83 
84       //
85       //create a point layer that will be used in all tests...
86       //
87       QString myPointsFileName = mTestDataDir + "points.shp";
88       QFileInfo myPointFileInfo( myPointsFileName );
89       mPointsLayer = new QgsVectorLayer( myPointFileInfo.filePath(),
90                                          myPointFileInfo.completeBaseName(), QStringLiteral( "ogr" ) );
91 
92       //we don't want to render the points themselves, just the diagrams
93       QgsStringMap symbolProps;
94       symbolProps.insert( QStringLiteral( "color" ), QStringLiteral( "0,0,0,0" ) );
95       symbolProps.insert( QStringLiteral( "outline_style" ), QStringLiteral( "no" ) );
96       QgsMarkerSymbol *symbol = QgsMarkerSymbol::createSimple( symbolProps );
97       QgsSingleSymbolRenderer *symbolRenderer = new QgsSingleSymbolRenderer( symbol );
98       mPointsLayer->setRenderer( symbolRenderer );
99 
100       // Create map composition to draw on
101       QgsProject::instance()->addMapLayer( mPointsLayer );
102       mMapSettings->setLayers( QList<QgsMapLayer *>() << mPointsLayer );
103 
104       mReport += QLatin1String( "<h1>Diagram Tests</h1>\n" );
105     }
106 
107     // will be called after the last testfunction was executed.
cleanupTestCase()108     void cleanupTestCase()
109     {
110       delete mMapSettings;
111       delete mPointsLayer;
112 
113       QString myReportFile = QDir::tempPath() + "/qgistest.html";
114       QFile myFile( myReportFile );
115       if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
116       {
117         QTextStream myQTextStream( &myFile );
118         myQTextStream << mReport;
119         myFile.close();
120         //QDesktopServices::openUrl( "file:///" + myReportFile );
121       }
122       QgsApplication::exitQgis();
123     }
124 
125     // will be called before each testfunction is executed
init()126     void init()
127     {
128       mPointsLayer->setDiagramRenderer( nullptr );
129       QgsDiagramLayerSettings dls;
130       mPointsLayer->setDiagramLayerSettings( dls );
131     }
132 
133     // will be called after every testfunction.
cleanup()134     void cleanup()
135     {
136 
137     }
138 
testPieDiagram()139     void testPieDiagram()
140     {
141       QgsDiagramSettings ds;
142       QColor col1 = Qt::red;
143       QColor col2 = Qt::yellow;
144       col1.setAlphaF( 0.5 );
145       col2.setAlphaF( 0.5 );
146       ds.categoryColors = QList<QColor>() << col1 << col2;
147       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
148       ds.minimumScale = -1;
149       ds.maximumScale = -1;
150       ds.minimumSize = 0;
151       ds.penColor = Qt::green;
152       ds.penWidth = .5;
153       ds.scaleByArea = true;
154       ds.sizeType = QgsUnitTypes::RenderMillimeters;
155       ds.size = QSizeF( 5, 5 );
156       ds.rotationOffset = 0;
157 
158       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
159       dr->setLowerValue( 0.0 );
160       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
161       dr->setUpperValue( 10 );
162       dr->setUpperSize( QSizeF( 40, 40 ) );
163       dr->setClassificationField( QStringLiteral( "Staff" ) );
164       dr->setDiagram( new QgsPieDiagram() );
165       dr->setDiagramSettings( ds );
166       mPointsLayer->setDiagramRenderer( dr );
167 
168       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
169       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
170       dls.setShowAllDiagrams( true );
171       mPointsLayer->setDiagramLayerSettings( dls );
172 
173       QVERIFY( imageCheck( "piediagram" ) );
174     }
175 
testPaintEffect()176     void testPaintEffect()
177     {
178       QgsDiagramSettings ds;
179       QColor col1 = Qt::red;
180       QColor col2 = Qt::yellow;
181       col1.setAlphaF( 0.5 );
182       col2.setAlphaF( 0.5 );
183       ds.categoryColors = QList<QColor>() << col1 << col2;
184       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
185       ds.minimumScale = -1;
186       ds.maximumScale = -1;
187       ds.minimumSize = 0;
188       ds.penColor = Qt::green;
189       ds.penWidth = .5;
190       ds.scaleByArea = true;
191       ds.sizeType = QgsUnitTypes::RenderMillimeters;
192       ds.size = QSizeF( 5, 5 );
193       ds.rotationOffset = 0;
194       ds.setPaintEffect( new QgsDropShadowEffect() );
195 
196       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
197       dr->setLowerValue( 0.0 );
198       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
199       dr->setUpperValue( 10 );
200       dr->setUpperSize( QSizeF( 40, 40 ) );
201       dr->setClassificationField( QStringLiteral( "Staff" ) );
202       dr->setDiagram( new QgsPieDiagram() );
203       dr->setDiagramSettings( ds );
204       mPointsLayer->setDiagramRenderer( dr );
205 
206       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
207       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
208       dls.setShowAllDiagrams( true );
209       mPointsLayer->setDiagramLayerSettings( dls );
210 
211       QVERIFY( imageCheck( "diagram_effects" ) );
212     }
213 
testHistogram()214     void testHistogram()
215     {
216       QgsDiagramSettings ds;
217       QColor col1 = Qt::red;
218       QColor col2 = Qt::yellow;
219       col1.setAlphaF( 0.5 );
220       col2.setAlphaF( 0.5 );
221       ds.categoryColors = QList<QColor>() << col1 << col2;
222       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
223       ds.minimumScale = -1;
224       ds.maximumScale = -1;
225       ds.minimumSize = 0;
226       ds.penColor = Qt::green;
227       ds.penWidth = .5;
228       ds.scaleByArea = true;
229       ds.sizeType = QgsUnitTypes::RenderMillimeters;
230       ds.size = QSizeF( 5, 5 );
231       ds.rotationOffset = 0;
232 
233       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
234       dr->setLowerValue( 0.0 );
235       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
236       dr->setUpperValue( 10 );
237       dr->setUpperSize( QSizeF( 40, 40 ) );
238       dr->setClassificationField( QStringLiteral( "Staff" ) );
239       dr->setDiagram( new QgsHistogramDiagram() );
240       dr->setDiagramSettings( ds );
241       mPointsLayer->setDiagramRenderer( dr );
242 
243       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
244       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
245       dls.setShowAllDiagrams( true );
246       mPointsLayer->setDiagramLayerSettings( dls );
247 
248       QVERIFY( imageCheck( "histogram" ) );
249     }
250 
testHistogramSpacing()251     void testHistogramSpacing()
252     {
253       QgsDiagramSettings ds;
254       QColor col1 = Qt::red;
255       QColor col2 = Qt::yellow;
256       col1.setAlphaF( 0.5 );
257       col2.setAlphaF( 0.5 );
258       ds.categoryColors = QList<QColor>() << col1 << col2;
259       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
260       ds.minimumScale = -1;
261       ds.maximumScale = -1;
262       ds.minimumSize = 0;
263       ds.penColor = Qt::green;
264       ds.penWidth = .5;
265       ds.scaleByArea = true;
266       ds.sizeType = QgsUnitTypes::RenderMillimeters;
267       ds.size = QSizeF( 5, 5 );
268       ds.rotationOffset = 0;
269       ds.setSpacing( 17 );
270       ds.setSpacingUnit( QgsUnitTypes::RenderPoints );
271 
272       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
273       dr->setLowerValue( 0.0 );
274       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
275       dr->setUpperValue( 10 );
276       dr->setUpperSize( QSizeF( 40, 40 ) );
277       dr->setClassificationField( QStringLiteral( "Staff" ) );
278       dr->setDiagram( new QgsHistogramDiagram() );
279       dr->setDiagramSettings( ds );
280       mPointsLayer->setDiagramRenderer( dr );
281 
282       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
283       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
284       dls.setShowAllDiagrams( true );
285       mPointsLayer->setDiagramLayerSettings( dls );
286 
287       QVERIFY( imageCheck( "histogram_spacing" ) );
288     }
289 
testHistogramAxis()290     void testHistogramAxis()
291     {
292       QgsDiagramSettings ds;
293       QColor col1 = Qt::red;
294       QColor col2 = Qt::yellow;
295       col1.setAlphaF( 0.5 );
296       col2.setAlphaF( 0.5 );
297       ds.categoryColors = QList<QColor>() << col1 << col2;
298       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
299       ds.minimumScale = -1;
300       ds.maximumScale = -1;
301       ds.minimumSize = 0;
302       ds.penColor = Qt::green;
303       ds.penWidth = .5;
304       ds.scaleByArea = true;
305       ds.sizeType = QgsUnitTypes::RenderMillimeters;
306       ds.size = QSizeF( 5, 5 );
307       ds.rotationOffset = 0;
308       ds.setShowAxis( true );
309 
310       QgsStringMap props;
311       props.insert( QStringLiteral( "width" ), QStringLiteral( "2" ) );
312       props.insert( QStringLiteral( "color" ), QStringLiteral( "#ff00ff" ) );
313       ds.setAxisLineSymbol( QgsLineSymbol::createSimple( props ) );
314 
315       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
316       dr->setLowerValue( 0.0 );
317       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
318       dr->setUpperValue( 10 );
319       dr->setUpperSize( QSizeF( 40, 40 ) );
320       dr->setClassificationField( QStringLiteral( "Staff" ) );
321       dr->setDiagram( new QgsHistogramDiagram() );
322       dr->setDiagramSettings( ds );
323       mPointsLayer->setDiagramRenderer( dr );
324 
325       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
326       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
327       dls.setShowAllDiagrams( true );
328       mPointsLayer->setDiagramLayerSettings( dls );
329 
330       QVERIFY( imageCheck( "histogram_axis_top" ) );
331 
332       ds.diagramOrientation = QgsDiagramSettings::Down;
333       dr->setDiagramSettings( ds );
334       QVERIFY( imageCheck( "histogram_axis_bottom" ) );
335 
336       ds.diagramOrientation = QgsDiagramSettings::Left;
337       dr->setDiagramSettings( ds );
338       QVERIFY( imageCheck( "histogram_axis_left" ) );
339 
340       ds.diagramOrientation = QgsDiagramSettings::Right;
341       dr->setDiagramSettings( ds );
342       QVERIFY( imageCheck( "histogram_axis_right" ) );
343     }
344 
testHistogramOrientation()345     void testHistogramOrientation()
346     {
347       QgsDiagramSettings ds;
348       QColor col1 = Qt::red;
349       QColor col2 = Qt::yellow;
350       col1.setAlphaF( 0.5 );
351       col2.setAlphaF( 0.5 );
352       ds.categoryColors = QList<QColor>() << col1 << col2;
353       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
354       ds.minimumScale = -1;
355       ds.maximumScale = -1;
356       ds.minimumSize = 0;
357       ds.penColor = Qt::green;
358       ds.penWidth = .5;
359       ds.scaleByArea = true;
360       ds.sizeType = QgsUnitTypes::RenderMillimeters;
361       ds.size = QSizeF( 5, 5 );
362       ds.rotationOffset = 0;
363       ds.diagramOrientation = QgsDiagramSettings::Right;
364 
365       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
366       dr->setLowerValue( 0.0 );
367       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
368       dr->setUpperValue( 10 );
369       dr->setUpperSize( QSizeF( 40, 40 ) );
370       dr->setClassificationField( QStringLiteral( "Staff" ) );
371       dr->setDiagram( new QgsHistogramDiagram() );
372       dr->setDiagramSettings( ds );
373       mPointsLayer->setDiagramRenderer( dr );
374 
375       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
376       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
377       dls.setShowAllDiagrams( true );
378       mPointsLayer->setDiagramLayerSettings( dls );
379 
380       QVERIFY( imageCheck( "histogram_right" ) );
381 
382       ds.diagramOrientation = QgsDiagramSettings::Left;
383       dr->setDiagramSettings( ds );
384       QVERIFY( imageCheck( "histogram_left" ) );
385 
386       ds.diagramOrientation = QgsDiagramSettings::Down;
387       dr->setDiagramSettings( ds );
388       QVERIFY( imageCheck( "histogram_down" ) );
389 
390     }
391 
testStackedFixSize()392     void testStackedFixSize()
393     {
394       QgsDiagramSettings ds;
395       QColor col1 = Qt::red;
396       QColor col2 = Qt::yellow;
397       col1.setAlphaF( 0.5 );
398       col2.setAlphaF( 0.5 );
399       ds.categoryColors = QList<QColor>() << col1 << col2;
400       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
401       ds.minimumScale = -1;
402       ds.maximumScale = -1;
403       ds.minimumSize = 0;
404       ds.penColor = Qt::green;
405       ds.penWidth = .5;
406       ds.scaleByArea = true;
407       ds.sizeType = QgsUnitTypes::RenderMillimeters;
408       ds.size = QSizeF( 15, 15 );
409       ds.rotationOffset = 0;
410       ds.diagramOrientation = QgsDiagramSettings::Up;
411       ds.setSpacing( 3 );
412 
413       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
414       dr->setDiagram( new QgsStackedBarDiagram() );
415       dr->setDiagramSettings( ds );
416       mPointsLayer->setDiagramRenderer( dr );
417 
418       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
419       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
420       dls.setShowAllDiagrams( true );
421       mPointsLayer->setDiagramLayerSettings( dls );
422       QVERIFY( imageCheck( "stacked_up" ) );
423 
424       ds.diagramOrientation = QgsDiagramSettings::Right;
425       dr->setDiagramSettings( ds );
426       QVERIFY( imageCheck( "stacked_right" ) );
427 
428       ds.diagramOrientation = QgsDiagramSettings::Left;
429       dr->setDiagramSettings( ds );
430       QVERIFY( imageCheck( "stacked_left" ) );
431 
432       ds.diagramOrientation = QgsDiagramSettings::Down;
433       dr->setDiagramSettings( ds );
434       QVERIFY( imageCheck( "stacked_down" ) );
435 
436     }
437 
testStackedVaryingFixSize()438     void testStackedVaryingFixSize()
439     {
440       QgsDiagramSettings ds;
441       QColor col1 = Qt::red;
442       QColor col2 = Qt::yellow;
443       col1.setAlphaF( 0.5 );
444       col2.setAlphaF( 0.5 );
445       ds.categoryColors = QList<QColor>() << col1 << col2;
446       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
447       ds.minimumScale = -1;
448       ds.maximumScale = -1;
449       ds.minimumSize = 0;
450       ds.penColor = Qt::green;
451       ds.penWidth = .5;
452       ds.scaleByArea = true;
453       ds.sizeType = QgsUnitTypes::RenderMillimeters;
454       ds.size = QSizeF( 5, 5 );
455       ds.rotationOffset = 0;
456       ds.diagramOrientation = QgsDiagramSettings::Up;
457       ds.setSpacing( 3 );
458 
459       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
460       dr->setLowerValue( 0.0 );
461       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
462       dr->setUpperValue( 10 );
463       dr->setUpperSize( QSizeF( 40, 40 ) );
464       dr->setClassificationField( QStringLiteral( "Staff" ) );
465       dr->setDiagram( new QgsStackedBarDiagram() );
466       dr->setDiagramSettings( ds );
467       mPointsLayer->setDiagramRenderer( dr );
468 
469       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
470       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
471       dls.setShowAllDiagrams( true );
472       mPointsLayer->setDiagramLayerSettings( dls );
473       QVERIFY( imageCheck( "stacked_varying_up" ) );
474 
475       ds.diagramOrientation = QgsDiagramSettings::Right;
476       dr->setDiagramSettings( ds );
477       QVERIFY( imageCheck( "stacked_varying_right" ) );
478 
479       ds.diagramOrientation = QgsDiagramSettings::Left;
480       dr->setDiagramSettings( ds );
481       QVERIFY( imageCheck( "stacked_varying_left" ) );
482 
483       ds.diagramOrientation = QgsDiagramSettings::Down;
484       dr->setDiagramSettings( ds );
485       QVERIFY( imageCheck( "stacked_varying_down" ) );
486 
487     }
488 
testStackedAxis()489     void testStackedAxis()
490     {
491       QgsDiagramSettings ds;
492       QColor col1 = Qt::red;
493       QColor col2 = Qt::yellow;
494       col1.setAlphaF( 0.5 );
495       col2.setAlphaF( 0.5 );
496       ds.categoryColors = QList<QColor>() << col1 << col2;
497       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
498       ds.minimumScale = -1;
499       ds.maximumScale = -1;
500       ds.minimumSize = 0;
501       ds.penColor = Qt::green;
502       ds.penWidth = .5;
503       ds.scaleByArea = true;
504       ds.sizeType = QgsUnitTypes::RenderMillimeters;
505       ds.size = QSizeF( 5, 5 );
506       ds.rotationOffset = 0;
507       ds.setSpacing( 3 );
508       ds.setShowAxis( true );
509 
510       QgsStringMap props;
511       props.insert( QStringLiteral( "width" ), QStringLiteral( "2" ) );
512       props.insert( QStringLiteral( "color" ), QStringLiteral( "#ff00ff" ) );
513       ds.setAxisLineSymbol( QgsLineSymbol::createSimple( props ) );
514 
515       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
516       dr->setLowerValue( 0.0 );
517       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
518       dr->setUpperValue( 10 );
519       dr->setUpperSize( QSizeF( 40, 40 ) );
520       dr->setClassificationField( QStringLiteral( "Staff" ) );
521       dr->setDiagram( new QgsStackedBarDiagram() );
522       dr->setDiagramSettings( ds );
523       mPointsLayer->setDiagramRenderer( dr );
524 
525       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
526       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
527       dls.setShowAllDiagrams( true );
528       mPointsLayer->setDiagramLayerSettings( dls );
529 
530       QVERIFY( imageCheck( "stacked_axis_up" ) );
531 
532       ds.diagramOrientation = QgsDiagramSettings::Down;
533       dr->setDiagramSettings( ds );
534       QVERIFY( imageCheck( "stacked_axis_down" ) );
535 
536       ds.diagramOrientation = QgsDiagramSettings::Left;
537       dr->setDiagramSettings( ds );
538       QVERIFY( imageCheck( "stacked_axis_left" ) );
539 
540       ds.diagramOrientation = QgsDiagramSettings::Right;
541       dr->setDiagramSettings( ds );
542       QVERIFY( imageCheck( "stacked_axis_right" ) );
543     }
544 
testStackedNegative()545     void testStackedNegative()
546     {
547       QgsDiagramSettings ds;
548       QColor col1 = Qt::red;
549       QColor col2 = Qt::yellow;
550       col1.setAlphaF( 0.5 );
551       col2.setAlphaF( 0.5 );
552       ds.categoryColors = QList<QColor>() << col1 << col2;
553       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "-\"Cabin Crew\"" );
554       ds.minimumScale = -1;
555       ds.maximumScale = -1;
556       ds.minimumSize = 0;
557       ds.penColor = Qt::green;
558       ds.penWidth = .5;
559       ds.scaleByArea = true;
560       ds.sizeType = QgsUnitTypes::RenderMillimeters;
561       ds.size = QSizeF( 5, 5 );
562       ds.rotationOffset = 0;
563       ds.setSpacing( 3 );
564       ds.setShowAxis( true );
565 
566       QgsStringMap props;
567       props.insert( QStringLiteral( "width" ), QStringLiteral( "2" ) );
568       props.insert( QStringLiteral( "color" ), QStringLiteral( "#ff00ff" ) );
569       ds.setAxisLineSymbol( QgsLineSymbol::createSimple( props ) );
570 
571       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
572       dr->setLowerValue( 0.0 );
573       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
574       dr->setUpperValue( 10 );
575       dr->setUpperSize( QSizeF( 40, 40 ) );
576       dr->setClassificationField( QStringLiteral( "Staff" ) );
577       dr->setDiagram( new QgsStackedBarDiagram() );
578       dr->setDiagramSettings( ds );
579       mPointsLayer->setDiagramRenderer( dr );
580 
581       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
582       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
583       dls.setShowAllDiagrams( true );
584       mPointsLayer->setDiagramLayerSettings( dls );
585 
586       QVERIFY( imageCheck( "stacked_negative_up" ) );
587 
588       ds.diagramOrientation = QgsDiagramSettings::Down;
589       dr->setDiagramSettings( ds );
590       QVERIFY( imageCheck( "stacked_negative_down" ) );
591 
592       ds.diagramOrientation = QgsDiagramSettings::Left;
593       dr->setDiagramSettings( ds );
594       QVERIFY( imageCheck( "stacked_negative_left" ) );
595 
596       ds.diagramOrientation = QgsDiagramSettings::Right;
597       dr->setDiagramSettings( ds );
598       QVERIFY( imageCheck( "stacked_negative_right" ) );
599     }
600 
testPieDiagramExpression()601     void testPieDiagramExpression()
602     {
603       QgsDiagramSettings ds;
604       QColor col1 = Qt::red;
605       QColor col2 = Qt::yellow;
606       col1.setAlphaF( 0.5 );
607       col2.setAlphaF( 0.5 );
608       ds.categoryColors = QList<QColor>() << col1 << col2;
609       ds.categoryAttributes = QList<QString>() << QStringLiteral( "ln(Pilots + 1)" ) << QStringLiteral( "ln(\"Cabin Crew\" + 1)" );
610       ds.minimumScale = -1;
611       ds.maximumScale = -1;
612       ds.minimumSize = 0;
613       ds.penColor = Qt::green;
614       ds.penWidth = .5;
615       ds.scaleByArea = true;
616       ds.sizeType = QgsUnitTypes::RenderMillimeters;
617       ds.size = QSizeF( 5, 5 );
618       ds.rotationOffset = 0;
619 
620       QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
621       dr->setLowerValue( 0.0 );
622       dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
623       dr->setUpperValue( 10 );
624       dr->setUpperSize( QSizeF( 40, 40 ) );
625       dr->setClassificationAttributeIsExpression( true );
626       dr->setClassificationAttributeExpression( QStringLiteral( "ln(Staff + 1)" ) );
627       dr->setDiagram( new QgsPieDiagram() );
628       dr->setDiagramSettings( ds );
629 
630       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
631       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
632       dls.setShowAllDiagrams( true );
633       // dls.setRenderer( dr );
634 
635       mPointsLayer->setDiagramRenderer( dr );
636       mPointsLayer->setDiagramLayerSettings( dls );
637 
638       QVERIFY( imageCheck( "piediagram_expression" ) );
639 
640       mPointsLayer->setDiagramRenderer( nullptr );
641     }
642 
testPieDiagramDirection()643     void testPieDiagramDirection()
644     {
645       QgsDiagramSettings ds;
646       QColor col1 = Qt::red;
647       QColor col2 = Qt::yellow;
648       col1.setAlphaF( 0.5 );
649       col2.setAlphaF( 0.5 );
650       ds.categoryColors = QList<QColor>() << col1 << col2;
651       ds.categoryAttributes = QList<QString>() << QStringLiteral( "ln(Pilots + 1)" ) << QStringLiteral( "ln(\"Cabin Crew\" + 1)" );
652       ds.minimumScale = -1;
653       ds.maximumScale = -1;
654       ds.minimumSize = 0;
655       ds.penColor = Qt::green;
656       ds.penWidth = .5;
657       ds.scaleByArea = true;
658       ds.sizeType = QgsUnitTypes::RenderMillimeters;
659       ds.size = QSizeF( 15, 15 );
660       ds.rotationOffset = 90;
661       ds.setDirection( QgsDiagramSettings::Clockwise );
662 
663       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
664       dr->setDiagram( new QgsPieDiagram() );
665       dr->setDiagramSettings( ds );
666 
667       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
668       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
669       dls.setShowAllDiagrams( true );
670       // dls.setRenderer( dr );
671 
672       mPointsLayer->setDiagramRenderer( dr );
673       mPointsLayer->setDiagramLayerSettings( dls );
674 
675       QVERIFY( imageCheck( "piediagram_clockwise" ) );
676 
677       mPointsLayer->setDiagramRenderer( nullptr );
678     }
679 
testDataDefinedPosition()680     void testDataDefinedPosition()
681     {
682       QgsDiagramSettings ds;
683       QColor col1 = Qt::red;
684       QColor col2 = Qt::yellow;
685       col1.setAlphaF( 0.5 );
686       col2.setAlphaF( 0.5 );
687       ds.categoryColors = QList<QColor>() << col1 << col2;
688       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
689       ds.minimumScale = -1;
690       ds.maximumScale = -1;
691       ds.minimumSize = 0;
692       ds.penColor = Qt::green;
693       ds.penWidth = .5;
694       ds.scaleByArea = true;
695       ds.sizeType = QgsUnitTypes::RenderMillimeters;
696       ds.size = QSizeF( 15, 15 );
697       ds.rotationOffset = 0;
698 
699       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
700       dr->setDiagram( new QgsPieDiagram() );
701       dr->setDiagramSettings( ds );
702       mPointsLayer->setDiagramRenderer( dr );
703 
704       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
705       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
706       dls.setShowAllDiagrams( true );
707 
708       //Set data defined position
709       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::PositionX, QgsProperty::fromExpression( QStringLiteral( "$x + -5" ), true ) );
710       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::PositionY, QgsProperty::fromExpression( QStringLiteral( "$y + 5" ), true ) );
711 
712       mPointsLayer->setDiagramLayerSettings( dls );
713 
714       QVERIFY( imageCheck( "piediagram_datadefined_position" ) );
715     }
716 
testDataDefinedStroke()717     void testDataDefinedStroke()
718     {
719       QgsDiagramSettings ds;
720       QColor col1 = Qt::red;
721       QColor col2 = Qt::yellow;
722       col1.setAlphaF( 0.5 );
723       col2.setAlphaF( 0.5 );
724       ds.categoryColors = QList<QColor>() << col1 << col2;
725       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
726       ds.minimumScale = -1;
727       ds.maximumScale = -1;
728       ds.minimumSize = 0;
729       ds.penColor = Qt::green;
730       ds.penWidth = .5;
731       ds.scaleByArea = true;
732       ds.sizeType = QgsUnitTypes::RenderMillimeters;
733       ds.size = QSizeF( 15, 15 );
734       ds.rotationOffset = 0;
735 
736       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
737       dr->setDiagram( new QgsPieDiagram() );
738       dr->setDiagramSettings( ds );
739       mPointsLayer->setDiagramRenderer( dr );
740 
741       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
742       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
743       dls.setShowAllDiagrams( true );
744 
745       //setup data defined stroke
746       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::StrokeColor, QgsProperty::fromExpression( QStringLiteral( "if(\"Pilots\">1,'0,0,0,255','255,0,0,255')" ), true ) );
747       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::StrokeWidth, QgsProperty::fromExpression( QStringLiteral( "\"Staff\" / 2.0" ), true ) );
748 
749       mPointsLayer->setDiagramLayerSettings( dls );
750 
751       QVERIFY( imageCheck( "piediagram_datadefined_outline" ) );
752     }
753 
testDataDefinedStartAngle()754     void testDataDefinedStartAngle()
755     {
756       QgsDiagramSettings ds;
757       QColor col1 = Qt::red;
758       QColor col2 = Qt::yellow;
759       col1.setAlphaF( 0.5 );
760       col2.setAlphaF( 0.5 );
761       ds.categoryColors = QList<QColor>() << col1 << col2;
762       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
763       ds.minimumScale = -1;
764       ds.maximumScale = -1;
765       ds.minimumSize = 0;
766       ds.penColor = Qt::green;
767       ds.penWidth = .5;
768       ds.scaleByArea = true;
769       ds.sizeType = QgsUnitTypes::RenderMillimeters;
770       ds.size = QSizeF( 15, 15 );
771       ds.rotationOffset = 0;
772 
773       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
774       dr->setDiagram( new QgsPieDiagram() );
775       dr->setDiagramSettings( ds );
776       mPointsLayer->setDiagramRenderer( dr );
777 
778       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
779       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
780       dls.setShowAllDiagrams( true );
781 
782       //setup data defined start angle
783       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::StartAngle, QgsProperty::fromExpression( QStringLiteral( "360.0-\"Importance\"/20.0 * 360.0" ), true ) );
784 
785       mPointsLayer->setDiagramLayerSettings( dls );
786 
787       QVERIFY( imageCheck( "piediagram_datadefined_startangle" ) );
788     }
789 
testDataDefinedDistance()790     void testDataDefinedDistance()
791     {
792       QgsDiagramSettings ds;
793       QColor col1 = Qt::red;
794       QColor col2 = Qt::yellow;
795       col1.setAlphaF( 0.5 );
796       col2.setAlphaF( 0.5 );
797       ds.categoryColors = QList<QColor>() << col1 << col2;
798       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
799       ds.minimumScale = -1;
800       ds.maximumScale = -1;
801       ds.minimumSize = 0;
802       ds.penColor = Qt::green;
803       ds.penWidth = .5;
804       ds.scaleByArea = true;
805       ds.sizeType = QgsUnitTypes::RenderMillimeters;
806       ds.size = QSizeF( 15, 15 );
807       ds.rotationOffset = 0;
808 
809       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
810       dr->setDiagram( new QgsPieDiagram() );
811       dr->setDiagramSettings( ds );
812       mPointsLayer->setDiagramRenderer( dr );
813 
814       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
815       dls.setPlacement( QgsDiagramLayerSettings::AroundPoint );
816       dls.setShowAllDiagrams( true );
817 
818       //setup data defined distance
819       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Distance, QgsProperty::fromExpression( QStringLiteral( "\"Staff\"*2" ), true ) );
820 
821       mPointsLayer->setDiagramLayerSettings( dls );
822 
823       QVERIFY( imageCheck( "piediagram_datadefined_distance" ) );
824     }
825 
testDataDefinedShow()826     void testDataDefinedShow()
827     {
828       QgsDiagramSettings ds;
829       QColor col1 = Qt::red;
830       QColor col2 = Qt::yellow;
831       col1.setAlphaF( 0.5 );
832       col2.setAlphaF( 0.5 );
833       ds.categoryColors = QList<QColor>() << col1 << col2;
834       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
835       ds.minimumScale = -1;
836       ds.maximumScale = -1;
837       ds.minimumSize = 0;
838       ds.penColor = Qt::green;
839       ds.penWidth = .5;
840       ds.scaleByArea = true;
841       ds.sizeType = QgsUnitTypes::RenderMillimeters;
842       ds.size = QSizeF( 15, 15 );
843       ds.rotationOffset = 0;
844 
845       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
846       dr->setDiagram( new QgsPieDiagram() );
847       dr->setDiagramSettings( ds );
848       mPointsLayer->setDiagramRenderer( dr );
849 
850       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
851       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
852       dls.setShowAllDiagrams( true );
853 
854       //setup data defined show
855       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Show, QgsProperty::fromExpression( QStringLiteral( "\"Pilots\"=1" ), true ) );
856 
857       mPointsLayer->setDiagramLayerSettings( dls );
858 
859       QVERIFY( imageCheck( "piediagram_datadefined_show" ) );
860     }
861 
testDataDefinedPriority()862     void testDataDefinedPriority()
863     {
864       QgsDiagramSettings ds;
865       QColor col1 = Qt::red;
866       QColor col2 = Qt::yellow;
867       col1.setAlphaF( 0.5 );
868       col2.setAlphaF( 0.5 );
869       ds.categoryColors = QList<QColor>() << col1 << col2;
870       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
871       ds.minimumScale = -1;
872       ds.maximumScale = -1;
873       ds.minimumSize = 0;
874       ds.penColor = Qt::green;
875       ds.penWidth = .5;
876       ds.scaleByArea = true;
877       ds.sizeType = QgsUnitTypes::RenderMillimeters;
878       ds.size = QSizeF( 50, 50 );
879       ds.rotationOffset = 0;
880 
881       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
882       dr->setDiagram( new QgsPieDiagram() );
883       dr->setDiagramSettings( ds );
884       mPointsLayer->setDiagramRenderer( dr );
885 
886       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
887       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
888       dls.setShowAllDiagrams( false );
889 
890       //setup data defined priority
891       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Priority, QgsProperty::fromExpression( QStringLiteral( "\"importance\"/2" ), true ) );
892 
893       mPointsLayer->setDiagramLayerSettings( dls );
894 
895       QVERIFY( imageCheck( "piediagram_datadefined_priority" ) );
896     }
897 
testDataDefinedZIndex()898     void testDataDefinedZIndex()
899     {
900       QgsDiagramSettings ds;
901       QColor col1 = Qt::red;
902       QColor col2 = Qt::yellow;
903       ds.categoryColors = QList<QColor>() << col1 << col2;
904       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
905       ds.minimumScale = -1;
906       ds.maximumScale = -1;
907       ds.minimumSize = 0;
908       ds.penColor = Qt::green;
909       ds.penWidth = .5;
910       ds.scaleByArea = true;
911       ds.sizeType = QgsUnitTypes::RenderMillimeters;
912       ds.size = QSizeF( 50, 50 );
913       ds.rotationOffset = 0;
914 
915       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
916       dr->setDiagram( new QgsPieDiagram() );
917       dr->setDiagramSettings( ds );
918       mPointsLayer->setDiagramRenderer( dr );
919 
920       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
921       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
922       dls.setShowAllDiagrams( true );
923 
924       //setup data defined z index
925       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::ZIndex, QgsProperty::fromExpression( QStringLiteral( "\"importance\"/2" ), true ) );
926 
927       mPointsLayer->setDiagramLayerSettings( dls );
928 
929       QVERIFY( imageCheck( "piediagram_datadefined_zindex" ) );
930     }
931 
testDataDefinedAlwaysShow()932     void testDataDefinedAlwaysShow()
933     {
934       QgsDiagramSettings ds;
935       QColor col1 = Qt::red;
936       QColor col2 = Qt::yellow;
937       col1.setAlphaF( 0.5 );
938       col2.setAlphaF( 0.5 );
939       ds.categoryColors = QList<QColor>() << col1 << col2;
940       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
941       ds.minimumScale = -1;
942       ds.maximumScale = -1;
943       ds.minimumSize = 0;
944       ds.penColor = Qt::green;
945       ds.penWidth = .5;
946       ds.scaleByArea = true;
947       ds.sizeType = QgsUnitTypes::RenderMillimeters;
948       ds.size = QSizeF( 50, 50 );
949       ds.rotationOffset = 0;
950 
951       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
952       dr->setDiagram( new QgsPieDiagram() );
953       dr->setDiagramSettings( ds );
954       mPointsLayer->setDiagramRenderer( dr );
955 
956       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
957       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
958       dls.setShowAllDiagrams( false );
959 
960       //setup data defined priority (required to only show certain diagrams)
961       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Priority, QgsProperty::fromExpression( QStringLiteral( "\"importance\"/2" ), true ) );
962       //setup data defined "always show"
963       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::AlwaysShow, QgsProperty::fromExpression( QStringLiteral( "\"Staff\">=6" ), true ) );
964 
965 
966       mPointsLayer->setDiagramLayerSettings( dls );
967 
968       QVERIFY( imageCheck( "piediagram_datadefined_alwaysshow" ) );
969     }
970 
971 
testDataDefinedBackgroundColor()972     void testDataDefinedBackgroundColor()
973     {
974       QgsDiagramSettings ds;
975       QColor col1 = Qt::red;
976       QColor col2 = Qt::yellow;
977       //hide the text so we are just testing the background color
978       col1.setAlphaF( 0 );
979       col2.setAlphaF( 0 );
980       ds.categoryColors = QList<QColor>() << col1 << col2;
981       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
982       ds.minimumScale = -1;
983       ds.maximumScale = -1;
984       ds.minimumSize = 0;
985       ds.penColor = Qt::green;
986       ds.penWidth = .5;
987       ds.scaleByArea = true;
988       ds.sizeType = QgsUnitTypes::RenderMillimeters;
989       ds.size = QSizeF( 15, 15 );
990       ds.rotationOffset = 0;
991 
992       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
993       dr->setDiagram( new QgsTextDiagram() );
994       dr->setDiagramSettings( ds );
995       mPointsLayer->setDiagramRenderer( dr );
996 
997       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
998       dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
999       dls.setShowAllDiagrams( true );
1000 
1001       //setup data defined stroke
1002       dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::BackgroundColor, QgsProperty::fromExpression( QStringLiteral( "if(\"Pilots\">1,'0,0,255,150','255,0,0,150')" ), true ) );
1003 
1004       mPointsLayer->setDiagramLayerSettings( dls );
1005 
1006       QVERIFY( imageCheck( "textdiagram_datadefined_background" ) );
1007     }
1008 
testClipping()1009     void testClipping()
1010     {
1011       const QString filename = QStringLiteral( TEST_DATA_DIR ) + "/lines.shp";
1012       std::unique_ptr< QgsVectorLayer> vl2( new QgsVectorLayer( filename, QStringLiteral( "lines" ), QStringLiteral( "ogr" ) ) );
1013 
1014       QgsStringMap props;
1015       props.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#487bb6" ) );
1016       props.insert( QStringLiteral( "outline_width" ), QStringLiteral( "1" ) );
1017       std::unique_ptr< QgsLineSymbol > symbol( QgsLineSymbol::createSimple( props ) );
1018       vl2->setRenderer( new QgsSingleSymbolRenderer( symbol.release() ) );
1019 
1020       QgsDiagramSettings ds;
1021       QColor col1 = Qt::red;
1022       QColor col2 = Qt::yellow;
1023       col1.setAlphaF( 0.5 );
1024       col2.setAlphaF( 0.5 );
1025       ds.categoryColors = QList<QColor>() << col1;
1026       ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Value\"" );
1027       ds.minimumScale = -1;
1028       ds.maximumScale = -1;
1029       ds.minimumSize = 0;
1030       ds.penColor = Qt::green;
1031       ds.penWidth = .5;
1032       ds.scaleByArea = true;
1033       ds.sizeType = QgsUnitTypes::RenderMillimeters;
1034       ds.size = QSizeF( 5, 5 );
1035       ds.rotationOffset = 0;
1036 
1037       QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
1038       dr->setDiagram( new QgsPieDiagram() );
1039       dr->setDiagramSettings( ds );
1040       vl2->setDiagramRenderer( dr );
1041 
1042       QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
1043       dls.setPlacement( QgsDiagramLayerSettings::Line );
1044       dls.setShowAllDiagrams( true );
1045       vl2->setDiagramLayerSettings( dls );
1046 
1047       mMapSettings->setLayers( QList<QgsMapLayer *>() << vl2.get() );
1048 
1049       QgsMapClippingRegion region1( QgsGeometry::fromWkt( "Polygon ((-92 45, -99 36, -94 29, -82 29, -81 45, -92 45))" ) );
1050       region1.setFeatureClip( QgsMapClippingRegion::FeatureClippingType::ClipToIntersection );
1051       mMapSettings->addClippingRegion( region1 );
1052 
1053       QgsMapClippingRegion region2( QgsGeometry::fromWkt( "Polygon ((-85 36, -85 46, -107 47, -108 28, -85 28, -85 36))" ) );
1054       region2.setFeatureClip( QgsMapClippingRegion::FeatureClippingType::ClipPainterOnly );
1055       mMapSettings->addClippingRegion( region2 );
1056 
1057       const bool res = imageCheck( QStringLiteral( "diagram_clipping" ) );
1058       mMapSettings->setClippingRegions( QList< QgsMapClippingRegion >() );
1059       mMapSettings->setLayers( QList<QgsMapLayer *>() << mPointsLayer );
1060 
1061       QVERIFY( res );
1062     }
1063 
1064 
1065 
1066 };
1067 
imageCheck(const QString & testType)1068 bool TestQgsDiagram::imageCheck( const QString &testType )
1069 {
1070   //use the QgsRenderChecker test utility class to
1071   //ensure the rendered output matches our control image
1072 
1073   QgsRectangle extent( -126, 23, -70, 47 );
1074   mMapSettings->setExtent( extent );
1075   mMapSettings->setFlag( QgsMapSettings::ForceVectorOutput );
1076   mMapSettings->setOutputDpi( 96 );
1077   QgsMultiRenderChecker checker;
1078   checker.setControlPathPrefix( QStringLiteral( "diagrams" ) );
1079   checker.setControlName( "expected_" + testType );
1080   checker.setMapSettings( *mMapSettings );
1081   checker.setColorTolerance( 15 );
1082   bool resultFlag = checker.runTest( testType, 200 );
1083   mReport += checker.report();
1084   return resultFlag;
1085 }
1086 
1087 QGSTEST_MAIN( TestQgsDiagram )
1088 #include "testqgsdiagram.moc"
1089