PageRenderTime 54ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/src/core/testqgsdiagram.cpp

http://github.com/qgis/Quantum-GIS
C++ | 919 lines | 734 code | 135 blank | 50 comment | 1 complexity | a247a4d8443fe2449874e13e3838de2e MD5 | raw file
Possible License(s): LGPL-2.0, GPL-3.0, GPL-2.0, CC-BY-SA-3.0, MIT, 0BSD, BSD-3-Clause
  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. //qgis includes...
  25. // #include <qgisapp.h>
  26. #include "diagram/qgspiediagram.h"
  27. #include "diagram/qgstextdiagram.h"
  28. #include "diagram/qgsstackedbardiagram.h"
  29. #include "diagram/qgshistogramdiagram.h"
  30. #include "qgsdiagramrenderer.h"
  31. #include "qgsmaplayer.h"
  32. #include "qgsvectordataprovider.h"
  33. #include "qgsvectorlayer.h"
  34. #include "qgsapplication.h"
  35. #include "qgsproviderregistry.h"
  36. #include "qgsrenderer.h"
  37. #include "qgssinglesymbolrenderer.h"
  38. //qgis test includes
  39. #include "qgsmultirenderchecker.h"
  40. #include "qgspallabeling.h"
  41. #include "qgsproject.h"
  42. #include "qgsshadoweffect.h"
  43. /**
  44. * \ingroup UnitTests
  45. * Unit tests for the diagram renderer
  46. */
  47. class TestQgsDiagram : public QObject
  48. {
  49. Q_OBJECT
  50. public:
  51. TestQgsDiagram() = default;
  52. private:
  53. bool mTestHasError = false ;
  54. QgsMapSettings *mMapSettings = nullptr;
  55. QgsVectorLayer *mPointsLayer = nullptr;
  56. QString mTestDataDir;
  57. QString mReport;
  58. bool imageCheck( const QString &testType );
  59. private slots:
  60. // will be called before the first testfunction is executed.
  61. void initTestCase()
  62. {
  63. mTestHasError = false;
  64. QgsApplication::init();
  65. QgsApplication::initQgis();
  66. QgsApplication::showSettings();
  67. mMapSettings = new QgsMapSettings();
  68. //create some objects that will be used in all tests...
  69. //
  70. //create a non spatial layer that will be used in all tests...
  71. //
  72. QString myDataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt
  73. mTestDataDir = myDataDir + '/';
  74. //
  75. //create a point layer that will be used in all tests...
  76. //
  77. QString myPointsFileName = mTestDataDir + "points.shp";
  78. QFileInfo myPointFileInfo( myPointsFileName );
  79. mPointsLayer = new QgsVectorLayer( myPointFileInfo.filePath(),
  80. myPointFileInfo.completeBaseName(), QStringLiteral( "ogr" ) );
  81. //we don't want to render the points themselves, just the diagrams
  82. QgsStringMap symbolProps;
  83. symbolProps.insert( QStringLiteral( "color" ), QStringLiteral( "0,0,0,0" ) );
  84. symbolProps.insert( QStringLiteral( "outline_style" ), QStringLiteral( "no" ) );
  85. QgsMarkerSymbol *symbol = QgsMarkerSymbol::createSimple( symbolProps );
  86. QgsSingleSymbolRenderer *symbolRenderer = new QgsSingleSymbolRenderer( symbol );
  87. mPointsLayer->setRenderer( symbolRenderer );
  88. // Create map composition to draw on
  89. QgsProject::instance()->addMapLayer( mPointsLayer );
  90. mMapSettings->setLayers( QList<QgsMapLayer *>() << mPointsLayer );
  91. mReport += QLatin1String( "<h1>Diagram Tests</h1>\n" );
  92. }
  93. // will be called after the last testfunction was executed.
  94. void cleanupTestCase()
  95. {
  96. delete mMapSettings;
  97. delete mPointsLayer;
  98. QString myReportFile = QDir::tempPath() + "/qgistest.html";
  99. QFile myFile( myReportFile );
  100. if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
  101. {
  102. QTextStream myQTextStream( &myFile );
  103. myQTextStream << mReport;
  104. myFile.close();
  105. //QDesktopServices::openUrl( "file:///" + myReportFile );
  106. }
  107. QgsApplication::exitQgis();
  108. }
  109. // will be called before each testfunction is executed
  110. void init()
  111. {
  112. mPointsLayer->setDiagramRenderer( nullptr );
  113. QgsDiagramLayerSettings dls;
  114. mPointsLayer->setDiagramLayerSettings( dls );
  115. }
  116. // will be called after every testfunction.
  117. void cleanup()
  118. {
  119. }
  120. void testPieDiagram()
  121. {
  122. QgsDiagramSettings ds;
  123. QColor col1 = Qt::red;
  124. QColor col2 = Qt::yellow;
  125. col1.setAlphaF( 0.5 );
  126. col2.setAlphaF( 0.5 );
  127. ds.categoryColors = QList<QColor>() << col1 << col2;
  128. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  129. ds.minimumScale = -1;
  130. ds.maximumScale = -1;
  131. ds.minimumSize = 0;
  132. ds.penColor = Qt::green;
  133. ds.penWidth = .5;
  134. ds.scaleByArea = true;
  135. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  136. ds.size = QSizeF( 5, 5 );
  137. ds.rotationOffset = 0;
  138. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  139. dr->setLowerValue( 0.0 );
  140. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  141. dr->setUpperValue( 10 );
  142. dr->setUpperSize( QSizeF( 40, 40 ) );
  143. dr->setClassificationField( QStringLiteral( "Staff" ) );
  144. dr->setDiagram( new QgsPieDiagram() );
  145. dr->setDiagramSettings( ds );
  146. mPointsLayer->setDiagramRenderer( dr );
  147. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  148. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  149. dls.setShowAllDiagrams( true );
  150. mPointsLayer->setDiagramLayerSettings( dls );
  151. QVERIFY( imageCheck( "piediagram" ) );
  152. }
  153. void testPaintEffect()
  154. {
  155. QgsDiagramSettings ds;
  156. QColor col1 = Qt::red;
  157. QColor col2 = Qt::yellow;
  158. col1.setAlphaF( 0.5 );
  159. col2.setAlphaF( 0.5 );
  160. ds.categoryColors = QList<QColor>() << col1 << col2;
  161. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  162. ds.minimumScale = -1;
  163. ds.maximumScale = -1;
  164. ds.minimumSize = 0;
  165. ds.penColor = Qt::green;
  166. ds.penWidth = .5;
  167. ds.scaleByArea = true;
  168. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  169. ds.size = QSizeF( 5, 5 );
  170. ds.rotationOffset = 0;
  171. ds.setPaintEffect( new QgsDropShadowEffect() );
  172. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  173. dr->setLowerValue( 0.0 );
  174. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  175. dr->setUpperValue( 10 );
  176. dr->setUpperSize( QSizeF( 40, 40 ) );
  177. dr->setClassificationField( QStringLiteral( "Staff" ) );
  178. dr->setDiagram( new QgsPieDiagram() );
  179. dr->setDiagramSettings( ds );
  180. mPointsLayer->setDiagramRenderer( dr );
  181. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  182. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  183. dls.setShowAllDiagrams( true );
  184. mPointsLayer->setDiagramLayerSettings( dls );
  185. QVERIFY( imageCheck( "diagram_effects" ) );
  186. }
  187. void testHistogram()
  188. {
  189. QgsDiagramSettings ds;
  190. QColor col1 = Qt::red;
  191. QColor col2 = Qt::yellow;
  192. col1.setAlphaF( 0.5 );
  193. col2.setAlphaF( 0.5 );
  194. ds.categoryColors = QList<QColor>() << col1 << col2;
  195. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  196. ds.minimumScale = -1;
  197. ds.maximumScale = -1;
  198. ds.minimumSize = 0;
  199. ds.penColor = Qt::green;
  200. ds.penWidth = .5;
  201. ds.scaleByArea = true;
  202. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  203. ds.size = QSizeF( 5, 5 );
  204. ds.rotationOffset = 0;
  205. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  206. dr->setLowerValue( 0.0 );
  207. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  208. dr->setUpperValue( 10 );
  209. dr->setUpperSize( QSizeF( 40, 40 ) );
  210. dr->setClassificationField( QStringLiteral( "Staff" ) );
  211. dr->setDiagram( new QgsHistogramDiagram() );
  212. dr->setDiagramSettings( ds );
  213. mPointsLayer->setDiagramRenderer( dr );
  214. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  215. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  216. dls.setShowAllDiagrams( true );
  217. mPointsLayer->setDiagramLayerSettings( dls );
  218. QVERIFY( imageCheck( "histogram" ) );
  219. }
  220. void testHistogramSpacing()
  221. {
  222. QgsDiagramSettings ds;
  223. QColor col1 = Qt::red;
  224. QColor col2 = Qt::yellow;
  225. col1.setAlphaF( 0.5 );
  226. col2.setAlphaF( 0.5 );
  227. ds.categoryColors = QList<QColor>() << col1 << col2;
  228. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  229. ds.minimumScale = -1;
  230. ds.maximumScale = -1;
  231. ds.minimumSize = 0;
  232. ds.penColor = Qt::green;
  233. ds.penWidth = .5;
  234. ds.scaleByArea = true;
  235. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  236. ds.size = QSizeF( 5, 5 );
  237. ds.rotationOffset = 0;
  238. ds.setSpacing( 17 );
  239. ds.setSpacingUnit( QgsUnitTypes::RenderPoints );
  240. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  241. dr->setLowerValue( 0.0 );
  242. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  243. dr->setUpperValue( 10 );
  244. dr->setUpperSize( QSizeF( 40, 40 ) );
  245. dr->setClassificationField( QStringLiteral( "Staff" ) );
  246. dr->setDiagram( new QgsHistogramDiagram() );
  247. dr->setDiagramSettings( ds );
  248. mPointsLayer->setDiagramRenderer( dr );
  249. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  250. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  251. dls.setShowAllDiagrams( true );
  252. mPointsLayer->setDiagramLayerSettings( dls );
  253. QVERIFY( imageCheck( "histogram_spacing" ) );
  254. }
  255. void testHistogramAxis()
  256. {
  257. QgsDiagramSettings ds;
  258. QColor col1 = Qt::red;
  259. QColor col2 = Qt::yellow;
  260. col1.setAlphaF( 0.5 );
  261. col2.setAlphaF( 0.5 );
  262. ds.categoryColors = QList<QColor>() << col1 << col2;
  263. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  264. ds.minimumScale = -1;
  265. ds.maximumScale = -1;
  266. ds.minimumSize = 0;
  267. ds.penColor = Qt::green;
  268. ds.penWidth = .5;
  269. ds.scaleByArea = true;
  270. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  271. ds.size = QSizeF( 5, 5 );
  272. ds.rotationOffset = 0;
  273. ds.setShowAxis( true );
  274. QgsStringMap props;
  275. props.insert( QStringLiteral( "width" ), QStringLiteral( "2" ) );
  276. props.insert( QStringLiteral( "color" ), QStringLiteral( "#ff00ff" ) );
  277. ds.setAxisLineSymbol( QgsLineSymbol::createSimple( props ) );
  278. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  279. dr->setLowerValue( 0.0 );
  280. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  281. dr->setUpperValue( 10 );
  282. dr->setUpperSize( QSizeF( 40, 40 ) );
  283. dr->setClassificationField( QStringLiteral( "Staff" ) );
  284. dr->setDiagram( new QgsHistogramDiagram() );
  285. dr->setDiagramSettings( ds );
  286. mPointsLayer->setDiagramRenderer( dr );
  287. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  288. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  289. dls.setShowAllDiagrams( true );
  290. mPointsLayer->setDiagramLayerSettings( dls );
  291. QVERIFY( imageCheck( "histogram_axis_top" ) );
  292. ds.diagramOrientation = QgsDiagramSettings::Down;
  293. dr->setDiagramSettings( ds );
  294. QVERIFY( imageCheck( "histogram_axis_bottom" ) );
  295. ds.diagramOrientation = QgsDiagramSettings::Left;
  296. dr->setDiagramSettings( ds );
  297. QVERIFY( imageCheck( "histogram_axis_left" ) );
  298. ds.diagramOrientation = QgsDiagramSettings::Right;
  299. dr->setDiagramSettings( ds );
  300. QVERIFY( imageCheck( "histogram_axis_right" ) );
  301. }
  302. void testHistogramOrientation()
  303. {
  304. QgsDiagramSettings ds;
  305. QColor col1 = Qt::red;
  306. QColor col2 = Qt::yellow;
  307. col1.setAlphaF( 0.5 );
  308. col2.setAlphaF( 0.5 );
  309. ds.categoryColors = QList<QColor>() << col1 << col2;
  310. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  311. ds.minimumScale = -1;
  312. ds.maximumScale = -1;
  313. ds.minimumSize = 0;
  314. ds.penColor = Qt::green;
  315. ds.penWidth = .5;
  316. ds.scaleByArea = true;
  317. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  318. ds.size = QSizeF( 5, 5 );
  319. ds.rotationOffset = 0;
  320. ds.diagramOrientation = QgsDiagramSettings::Right;
  321. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  322. dr->setLowerValue( 0.0 );
  323. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  324. dr->setUpperValue( 10 );
  325. dr->setUpperSize( QSizeF( 40, 40 ) );
  326. dr->setClassificationField( QStringLiteral( "Staff" ) );
  327. dr->setDiagram( new QgsHistogramDiagram() );
  328. dr->setDiagramSettings( ds );
  329. mPointsLayer->setDiagramRenderer( dr );
  330. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  331. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  332. dls.setShowAllDiagrams( true );
  333. mPointsLayer->setDiagramLayerSettings( dls );
  334. QVERIFY( imageCheck( "histogram_right" ) );
  335. ds.diagramOrientation = QgsDiagramSettings::Left;
  336. dr->setDiagramSettings( ds );
  337. QVERIFY( imageCheck( "histogram_left" ) );
  338. ds.diagramOrientation = QgsDiagramSettings::Down;
  339. dr->setDiagramSettings( ds );
  340. QVERIFY( imageCheck( "histogram_down" ) );
  341. }
  342. void testStackedFixSize()
  343. {
  344. QgsDiagramSettings ds;
  345. QColor col1 = Qt::red;
  346. QColor col2 = Qt::yellow;
  347. col1.setAlphaF( 0.5 );
  348. col2.setAlphaF( 0.5 );
  349. ds.categoryColors = QList<QColor>() << col1 << col2;
  350. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  351. ds.minimumScale = -1;
  352. ds.maximumScale = -1;
  353. ds.minimumSize = 0;
  354. ds.penColor = Qt::green;
  355. ds.penWidth = .5;
  356. ds.scaleByArea = true;
  357. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  358. ds.size = QSizeF( 15, 15 );
  359. ds.rotationOffset = 0;
  360. ds.diagramOrientation = QgsDiagramSettings::Up;
  361. ds.setSpacing( 3 );
  362. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  363. dr->setDiagram( new QgsStackedBarDiagram() );
  364. dr->setDiagramSettings( ds );
  365. mPointsLayer->setDiagramRenderer( dr );
  366. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  367. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  368. dls.setShowAllDiagrams( true );
  369. mPointsLayer->setDiagramLayerSettings( dls );
  370. QVERIFY( imageCheck( "stacked_up" ) );
  371. ds.diagramOrientation = QgsDiagramSettings::Right;
  372. dr->setDiagramSettings( ds );
  373. QVERIFY( imageCheck( "stacked_right" ) );
  374. ds.diagramOrientation = QgsDiagramSettings::Left;
  375. dr->setDiagramSettings( ds );
  376. QVERIFY( imageCheck( "stacked_left" ) );
  377. ds.diagramOrientation = QgsDiagramSettings::Down;
  378. dr->setDiagramSettings( ds );
  379. QVERIFY( imageCheck( "stacked_down" ) );
  380. }
  381. void testStackedVaryingFixSize()
  382. {
  383. QgsDiagramSettings ds;
  384. QColor col1 = Qt::red;
  385. QColor col2 = Qt::yellow;
  386. col1.setAlphaF( 0.5 );
  387. col2.setAlphaF( 0.5 );
  388. ds.categoryColors = QList<QColor>() << col1 << col2;
  389. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  390. ds.minimumScale = -1;
  391. ds.maximumScale = -1;
  392. ds.minimumSize = 0;
  393. ds.penColor = Qt::green;
  394. ds.penWidth = .5;
  395. ds.scaleByArea = true;
  396. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  397. ds.size = QSizeF( 5, 5 );
  398. ds.rotationOffset = 0;
  399. ds.diagramOrientation = QgsDiagramSettings::Up;
  400. ds.setSpacing( 3 );
  401. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  402. dr->setLowerValue( 0.0 );
  403. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  404. dr->setUpperValue( 10 );
  405. dr->setUpperSize( QSizeF( 40, 40 ) );
  406. dr->setClassificationField( QStringLiteral( "Staff" ) );
  407. dr->setDiagram( new QgsStackedBarDiagram() );
  408. dr->setDiagramSettings( ds );
  409. mPointsLayer->setDiagramRenderer( dr );
  410. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  411. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  412. dls.setShowAllDiagrams( true );
  413. mPointsLayer->setDiagramLayerSettings( dls );
  414. QVERIFY( imageCheck( "stacked_varying_up" ) );
  415. ds.diagramOrientation = QgsDiagramSettings::Right;
  416. dr->setDiagramSettings( ds );
  417. QVERIFY( imageCheck( "stacked_varying_right" ) );
  418. ds.diagramOrientation = QgsDiagramSettings::Left;
  419. dr->setDiagramSettings( ds );
  420. QVERIFY( imageCheck( "stacked_varying_left" ) );
  421. ds.diagramOrientation = QgsDiagramSettings::Down;
  422. dr->setDiagramSettings( ds );
  423. QVERIFY( imageCheck( "stacked_varying_down" ) );
  424. }
  425. void testPieDiagramExpression()
  426. {
  427. QgsDiagramSettings ds;
  428. QColor col1 = Qt::red;
  429. QColor col2 = Qt::yellow;
  430. col1.setAlphaF( 0.5 );
  431. col2.setAlphaF( 0.5 );
  432. ds.categoryColors = QList<QColor>() << col1 << col2;
  433. ds.categoryAttributes = QList<QString>() << QStringLiteral( "ln(Pilots + 1)" ) << QStringLiteral( "ln(\"Cabin Crew\" + 1)" );
  434. ds.minimumScale = -1;
  435. ds.maximumScale = -1;
  436. ds.minimumSize = 0;
  437. ds.penColor = Qt::green;
  438. ds.penWidth = .5;
  439. ds.scaleByArea = true;
  440. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  441. ds.size = QSizeF( 5, 5 );
  442. ds.rotationOffset = 0;
  443. QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
  444. dr->setLowerValue( 0.0 );
  445. dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
  446. dr->setUpperValue( 10 );
  447. dr->setUpperSize( QSizeF( 40, 40 ) );
  448. dr->setClassificationAttributeIsExpression( true );
  449. dr->setClassificationAttributeExpression( QStringLiteral( "ln(Staff + 1)" ) );
  450. dr->setDiagram( new QgsPieDiagram() );
  451. dr->setDiagramSettings( ds );
  452. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  453. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  454. dls.setShowAllDiagrams( true );
  455. // dls.setRenderer( dr );
  456. mPointsLayer->setDiagramRenderer( dr );
  457. mPointsLayer->setDiagramLayerSettings( dls );
  458. QVERIFY( imageCheck( "piediagram_expression" ) );
  459. mPointsLayer->setDiagramRenderer( nullptr );
  460. }
  461. void testPieDiagramDirection()
  462. {
  463. QgsDiagramSettings ds;
  464. QColor col1 = Qt::red;
  465. QColor col2 = Qt::yellow;
  466. col1.setAlphaF( 0.5 );
  467. col2.setAlphaF( 0.5 );
  468. ds.categoryColors = QList<QColor>() << col1 << col2;
  469. ds.categoryAttributes = QList<QString>() << QStringLiteral( "ln(Pilots + 1)" ) << QStringLiteral( "ln(\"Cabin Crew\" + 1)" );
  470. ds.minimumScale = -1;
  471. ds.maximumScale = -1;
  472. ds.minimumSize = 0;
  473. ds.penColor = Qt::green;
  474. ds.penWidth = .5;
  475. ds.scaleByArea = true;
  476. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  477. ds.size = QSizeF( 15, 15 );
  478. ds.rotationOffset = 90;
  479. ds.setDirection( QgsDiagramSettings::Clockwise );
  480. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  481. dr->setDiagram( new QgsPieDiagram() );
  482. dr->setDiagramSettings( ds );
  483. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  484. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  485. dls.setShowAllDiagrams( true );
  486. // dls.setRenderer( dr );
  487. mPointsLayer->setDiagramRenderer( dr );
  488. mPointsLayer->setDiagramLayerSettings( dls );
  489. QVERIFY( imageCheck( "piediagram_clockwise" ) );
  490. mPointsLayer->setDiagramRenderer( nullptr );
  491. }
  492. void testDataDefinedPosition()
  493. {
  494. QgsDiagramSettings ds;
  495. QColor col1 = Qt::red;
  496. QColor col2 = Qt::yellow;
  497. col1.setAlphaF( 0.5 );
  498. col2.setAlphaF( 0.5 );
  499. ds.categoryColors = QList<QColor>() << col1 << col2;
  500. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  501. ds.minimumScale = -1;
  502. ds.maximumScale = -1;
  503. ds.minimumSize = 0;
  504. ds.penColor = Qt::green;
  505. ds.penWidth = .5;
  506. ds.scaleByArea = true;
  507. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  508. ds.size = QSizeF( 15, 15 );
  509. ds.rotationOffset = 0;
  510. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  511. dr->setDiagram( new QgsPieDiagram() );
  512. dr->setDiagramSettings( ds );
  513. mPointsLayer->setDiagramRenderer( dr );
  514. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  515. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  516. dls.setShowAllDiagrams( true );
  517. //Set data defined position
  518. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::PositionX, QgsProperty::fromExpression( QStringLiteral( "$x + -5" ), true ) );
  519. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::PositionY, QgsProperty::fromExpression( QStringLiteral( "$y + 5" ), true ) );
  520. mPointsLayer->setDiagramLayerSettings( dls );
  521. QVERIFY( imageCheck( "piediagram_datadefined_position" ) );
  522. }
  523. void testDataDefinedStroke()
  524. {
  525. QgsDiagramSettings ds;
  526. QColor col1 = Qt::red;
  527. QColor col2 = Qt::yellow;
  528. col1.setAlphaF( 0.5 );
  529. col2.setAlphaF( 0.5 );
  530. ds.categoryColors = QList<QColor>() << col1 << col2;
  531. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  532. ds.minimumScale = -1;
  533. ds.maximumScale = -1;
  534. ds.minimumSize = 0;
  535. ds.penColor = Qt::green;
  536. ds.penWidth = .5;
  537. ds.scaleByArea = true;
  538. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  539. ds.size = QSizeF( 15, 15 );
  540. ds.rotationOffset = 0;
  541. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  542. dr->setDiagram( new QgsPieDiagram() );
  543. dr->setDiagramSettings( ds );
  544. mPointsLayer->setDiagramRenderer( dr );
  545. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  546. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  547. dls.setShowAllDiagrams( true );
  548. //setup data defined stroke
  549. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::StrokeColor, QgsProperty::fromExpression( QStringLiteral( "if(\"Pilots\">1,'0,0,0,255','255,0,0,255')" ), true ) );
  550. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::StrokeWidth, QgsProperty::fromExpression( QStringLiteral( "\"Staff\" / 2.0" ), true ) );
  551. mPointsLayer->setDiagramLayerSettings( dls );
  552. QVERIFY( imageCheck( "piediagram_datadefined_outline" ) );
  553. }
  554. void testDataDefinedStartAngle()
  555. {
  556. QgsDiagramSettings ds;
  557. QColor col1 = Qt::red;
  558. QColor col2 = Qt::yellow;
  559. col1.setAlphaF( 0.5 );
  560. col2.setAlphaF( 0.5 );
  561. ds.categoryColors = QList<QColor>() << col1 << col2;
  562. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  563. ds.minimumScale = -1;
  564. ds.maximumScale = -1;
  565. ds.minimumSize = 0;
  566. ds.penColor = Qt::green;
  567. ds.penWidth = .5;
  568. ds.scaleByArea = true;
  569. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  570. ds.size = QSizeF( 15, 15 );
  571. ds.rotationOffset = 0;
  572. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  573. dr->setDiagram( new QgsPieDiagram() );
  574. dr->setDiagramSettings( ds );
  575. mPointsLayer->setDiagramRenderer( dr );
  576. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  577. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  578. dls.setShowAllDiagrams( true );
  579. //setup data defined start angle
  580. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::StartAngle, QgsProperty::fromExpression( QStringLiteral( "360.0-\"Importance\"/20.0 * 360.0" ), true ) );
  581. mPointsLayer->setDiagramLayerSettings( dls );
  582. QVERIFY( imageCheck( "piediagram_datadefined_startangle" ) );
  583. }
  584. void testDataDefinedDistance()
  585. {
  586. QgsDiagramSettings ds;
  587. QColor col1 = Qt::red;
  588. QColor col2 = Qt::yellow;
  589. col1.setAlphaF( 0.5 );
  590. col2.setAlphaF( 0.5 );
  591. ds.categoryColors = QList<QColor>() << col1 << col2;
  592. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  593. ds.minimumScale = -1;
  594. ds.maximumScale = -1;
  595. ds.minimumSize = 0;
  596. ds.penColor = Qt::green;
  597. ds.penWidth = .5;
  598. ds.scaleByArea = true;
  599. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  600. ds.size = QSizeF( 15, 15 );
  601. ds.rotationOffset = 0;
  602. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  603. dr->setDiagram( new QgsPieDiagram() );
  604. dr->setDiagramSettings( ds );
  605. mPointsLayer->setDiagramRenderer( dr );
  606. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  607. dls.setPlacement( QgsDiagramLayerSettings::AroundPoint );
  608. dls.setShowAllDiagrams( true );
  609. //setup data defined distance
  610. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Distance, QgsProperty::fromExpression( QStringLiteral( "\"Staff\"*2" ), true ) );
  611. mPointsLayer->setDiagramLayerSettings( dls );
  612. QVERIFY( imageCheck( "piediagram_datadefined_distance" ) );
  613. }
  614. void testDataDefinedShow()
  615. {
  616. QgsDiagramSettings ds;
  617. QColor col1 = Qt::red;
  618. QColor col2 = Qt::yellow;
  619. col1.setAlphaF( 0.5 );
  620. col2.setAlphaF( 0.5 );
  621. ds.categoryColors = QList<QColor>() << col1 << col2;
  622. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  623. ds.minimumScale = -1;
  624. ds.maximumScale = -1;
  625. ds.minimumSize = 0;
  626. ds.penColor = Qt::green;
  627. ds.penWidth = .5;
  628. ds.scaleByArea = true;
  629. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  630. ds.size = QSizeF( 15, 15 );
  631. ds.rotationOffset = 0;
  632. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  633. dr->setDiagram( new QgsPieDiagram() );
  634. dr->setDiagramSettings( ds );
  635. mPointsLayer->setDiagramRenderer( dr );
  636. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  637. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  638. dls.setShowAllDiagrams( true );
  639. //setup data defined show
  640. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Show, QgsProperty::fromExpression( QStringLiteral( "\"Pilots\"=1" ), true ) );
  641. mPointsLayer->setDiagramLayerSettings( dls );
  642. QVERIFY( imageCheck( "piediagram_datadefined_show" ) );
  643. }
  644. void testDataDefinedPriority()
  645. {
  646. QgsDiagramSettings ds;
  647. QColor col1 = Qt::red;
  648. QColor col2 = Qt::yellow;
  649. col1.setAlphaF( 0.5 );
  650. col2.setAlphaF( 0.5 );
  651. ds.categoryColors = QList<QColor>() << col1 << col2;
  652. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  653. ds.minimumScale = -1;
  654. ds.maximumScale = -1;
  655. ds.minimumSize = 0;
  656. ds.penColor = Qt::green;
  657. ds.penWidth = .5;
  658. ds.scaleByArea = true;
  659. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  660. ds.size = QSizeF( 50, 50 );
  661. ds.rotationOffset = 0;
  662. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  663. dr->setDiagram( new QgsPieDiagram() );
  664. dr->setDiagramSettings( ds );
  665. mPointsLayer->setDiagramRenderer( dr );
  666. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  667. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  668. dls.setShowAllDiagrams( false );
  669. //setup data defined priority
  670. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Priority, QgsProperty::fromExpression( QStringLiteral( "\"importance\"/2" ), true ) );
  671. mPointsLayer->setDiagramLayerSettings( dls );
  672. QVERIFY( imageCheck( "piediagram_datadefined_priority" ) );
  673. }
  674. void testDataDefinedZIndex()
  675. {
  676. QgsDiagramSettings ds;
  677. QColor col1 = Qt::red;
  678. QColor col2 = Qt::yellow;
  679. ds.categoryColors = QList<QColor>() << col1 << col2;
  680. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  681. ds.minimumScale = -1;
  682. ds.maximumScale = -1;
  683. ds.minimumSize = 0;
  684. ds.penColor = Qt::green;
  685. ds.penWidth = .5;
  686. ds.scaleByArea = true;
  687. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  688. ds.size = QSizeF( 50, 50 );
  689. ds.rotationOffset = 0;
  690. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  691. dr->setDiagram( new QgsPieDiagram() );
  692. dr->setDiagramSettings( ds );
  693. mPointsLayer->setDiagramRenderer( dr );
  694. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  695. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  696. dls.setShowAllDiagrams( true );
  697. //setup data defined z index
  698. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::ZIndex, QgsProperty::fromExpression( QStringLiteral( "\"importance\"/2" ), true ) );
  699. mPointsLayer->setDiagramLayerSettings( dls );
  700. QVERIFY( imageCheck( "piediagram_datadefined_zindex" ) );
  701. }
  702. void testDataDefinedAlwaysShow()
  703. {
  704. QgsDiagramSettings ds;
  705. QColor col1 = Qt::red;
  706. QColor col2 = Qt::yellow;
  707. col1.setAlphaF( 0.5 );
  708. col2.setAlphaF( 0.5 );
  709. ds.categoryColors = QList<QColor>() << col1 << col2;
  710. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  711. ds.minimumScale = -1;
  712. ds.maximumScale = -1;
  713. ds.minimumSize = 0;
  714. ds.penColor = Qt::green;
  715. ds.penWidth = .5;
  716. ds.scaleByArea = true;
  717. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  718. ds.size = QSizeF( 50, 50 );
  719. ds.rotationOffset = 0;
  720. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  721. dr->setDiagram( new QgsPieDiagram() );
  722. dr->setDiagramSettings( ds );
  723. mPointsLayer->setDiagramRenderer( dr );
  724. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  725. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  726. dls.setShowAllDiagrams( false );
  727. //setup data defined priority (required to only show certain diagrams)
  728. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::Priority, QgsProperty::fromExpression( QStringLiteral( "\"importance\"/2" ), true ) );
  729. //setup data defined "always show"
  730. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::AlwaysShow, QgsProperty::fromExpression( QStringLiteral( "\"Staff\">=6" ), true ) );
  731. mPointsLayer->setDiagramLayerSettings( dls );
  732. QVERIFY( imageCheck( "piediagram_datadefined_alwaysshow" ) );
  733. }
  734. void testDataDefinedBackgroundColor()
  735. {
  736. QgsDiagramSettings ds;
  737. QColor col1 = Qt::red;
  738. QColor col2 = Qt::yellow;
  739. //hide the text so we are just testing the background color
  740. col1.setAlphaF( 0 );
  741. col2.setAlphaF( 0 );
  742. ds.categoryColors = QList<QColor>() << col1 << col2;
  743. ds.categoryAttributes = QList<QString>() << QStringLiteral( "\"Pilots\"" ) << QStringLiteral( "\"Cabin Crew\"" );
  744. ds.minimumScale = -1;
  745. ds.maximumScale = -1;
  746. ds.minimumSize = 0;
  747. ds.penColor = Qt::green;
  748. ds.penWidth = .5;
  749. ds.scaleByArea = true;
  750. ds.sizeType = QgsUnitTypes::RenderMillimeters;
  751. ds.size = QSizeF( 15, 15 );
  752. ds.rotationOffset = 0;
  753. QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
  754. dr->setDiagram( new QgsTextDiagram() );
  755. dr->setDiagramSettings( ds );
  756. mPointsLayer->setDiagramRenderer( dr );
  757. QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
  758. dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
  759. dls.setShowAllDiagrams( true );
  760. //setup data defined stroke
  761. dls.dataDefinedProperties().setProperty( QgsDiagramLayerSettings::BackgroundColor, QgsProperty::fromExpression( QStringLiteral( "if(\"Pilots\">1,'0,0,255,150','255,0,0,150')" ), true ) );
  762. mPointsLayer->setDiagramLayerSettings( dls );
  763. QVERIFY( imageCheck( "textdiagram_datadefined_background" ) );
  764. }
  765. };
  766. bool TestQgsDiagram::imageCheck( const QString &testType )
  767. {
  768. //use the QgsRenderChecker test utility class to
  769. //ensure the rendered output matches our control image
  770. QgsRectangle extent( -126, 23, -70, 47 );
  771. mMapSettings->setExtent( extent );
  772. mMapSettings->setFlag( QgsMapSettings::ForceVectorOutput );
  773. mMapSettings->setOutputDpi( 96 );
  774. QgsMultiRenderChecker checker;
  775. checker.setControlPathPrefix( QStringLiteral( "diagrams" ) );
  776. checker.setControlName( "expected_" + testType );
  777. checker.setMapSettings( *mMapSettings );
  778. checker.setColorTolerance( 15 );
  779. bool resultFlag = checker.runTest( testType, 200 );
  780. mReport += checker.report();
  781. return resultFlag;
  782. }
  783. QGSTEST_MAIN( TestQgsDiagram )
  784. #include "testqgsdiagram.moc"