1 /***************************************************************************
2      testqgsmaptoolcircularstring.cpp
3      --------------------------------
4     Date                 : January 2018
5     Copyright            : (C) 2018 by Paul Blottiere
6     Email                : paul.blottiere@oslandia.com
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 
16 #include "qgstest.h"
17 
18 #include "qgisapp.h"
19 #include "qgsgeometry.h"
20 #include "qgsmapcanvas.h"
21 #include "qgssettings.h"
22 #include "qgsvectorlayer.h"
23 #include "qgsmaptooladdfeature.h"
24 
25 #include "testqgsmaptoolutils.h"
26 #include "qgsmaptoolcircularstringcurvepoint.h"
27 #include "qgsmaptoolcircularstringradius.h"
28 
29 
30 class TestQgsMapToolCircularString : public QObject
31 {
32     Q_OBJECT
33 
34   public:
35     TestQgsMapToolCircularString();
36 
37   private slots:
38     void initTestCase();
39     void cleanupTestCase();
40 
41     void testAddCircularStringCurvePoint();
42     void testAddCircularStringRadius();
43     void testAddCircularStringCurvePointWithDeletedVertex();
44     void testAddCircularStringRadiusWithDeletedVertex();
45     void testAddCircularStringAfterClassicDigitizing();
46 
47   private:
48     QgisApp *mQgisApp = nullptr;
49     QgsMapToolCapture *mParentTool = nullptr;
50     QgsMapCanvas *mCanvas = nullptr;
51     QgsVectorLayer *mLayer = nullptr;
52 };
53 
54 TestQgsMapToolCircularString::TestQgsMapToolCircularString() = default;
55 
56 
57 //runs before all tests
initTestCase()58 void TestQgsMapToolCircularString::initTestCase()
59 {
60   QgsApplication::init();
61   QgsApplication::initQgis();
62 
63   mQgisApp = new QgisApp();
64 
65   mCanvas = new QgsMapCanvas();
66   mCanvas->setDestinationCrs( QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:27700" ) ) );
67 
68   // make testing layers
69   mLayer = new QgsVectorLayer( QStringLiteral( "LineStringZ?crs=EPSG:27700" ), QStringLiteral( "layer line Z" ), QStringLiteral( "memory" ) );
70   QVERIFY( mLayer->isValid() );
71   QgsProject::instance()->addMapLayers( QList<QgsMapLayer *>() << mLayer );
72 
73   // set layers in canvas
74   mCanvas->setLayers( QList<QgsMapLayer *>() << mLayer );
75   mCanvas->setCurrentLayer( mLayer );
76 
77   mParentTool = new QgsMapToolAddFeature( mCanvas, QgsMapToolCapture::CaptureLine );
78 }
79 
cleanupTestCase()80 void TestQgsMapToolCircularString::cleanupTestCase()
81 {
82   QgsApplication::exitQgis();
83 }
84 
testAddCircularStringCurvePoint()85 void TestQgsMapToolCircularString::testAddCircularStringCurvePoint()
86 {
87   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 333 );
88   mLayer->startEditing();
89 
90   QgsMapToolCircularStringCurvePoint mapTool( mParentTool, mCanvas );
91   mCanvas->setMapTool( &mapTool );
92 
93   TestQgsMapToolAdvancedDigitizingUtils utils( &mapTool );
94   utils.mouseClick( 0, 0, Qt::LeftButton );
95   utils.mouseClick( 1, 1, Qt::LeftButton );
96   utils.mouseClick( 0, 2, Qt::LeftButton );
97   utils.mouseClick( 0, 2, Qt::RightButton );
98   QgsFeatureId newFid = utils.newFeatureId();
99 
100   QCOMPARE( mLayer->featureCount(), ( long )1 );
101   QgsFeature f = mLayer->getFeature( newFid );
102 
103   QString wkt = "CompoundCurveZ (CircularStringZ (0 0 333, 1 1 333, 0 2 333))";
104   QCOMPARE( f.geometry().asWkt(), wkt );
105 
106   mLayer->rollBack();
107   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 0 );
108 }
109 
testAddCircularStringCurvePointWithDeletedVertex()110 void TestQgsMapToolCircularString::testAddCircularStringCurvePointWithDeletedVertex()
111 {
112   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 333 );
113   mLayer->startEditing();
114 
115   QgsMapToolCircularStringCurvePoint mapTool( mParentTool, mCanvas );
116   mCanvas->setMapTool( &mapTool );
117 
118   TestQgsMapToolAdvancedDigitizingUtils utils( &mapTool );
119   utils.mouseClick( 0, 0, Qt::LeftButton );
120   utils.mouseClick( 4, 1, Qt::LeftButton );
121   utils.keyClick( Qt::Key_Backspace );
122   utils.mouseClick( 1, 1, Qt::LeftButton );
123   utils.mouseClick( 0, 2, Qt::LeftButton );
124   utils.mouseClick( 4, 1, Qt::LeftButton );
125   utils.keyClick( Qt::Key_Backspace );
126   utils.mouseClick( 0, 2, Qt::RightButton );
127   QgsFeatureId newFid = utils.newFeatureId();
128 
129   QCOMPARE( mLayer->featureCount(), ( long )1 );
130   QgsFeature f = mLayer->getFeature( newFid );
131 
132   QString wkt = "CompoundCurveZ (CircularStringZ (0 0 333, 1 1 333, 0 2 333))";
133   QCOMPARE( f.geometry().asWkt(), wkt );
134 
135   mLayer->rollBack();
136   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 0 );
137 }
testAddCircularStringRadius()138 void TestQgsMapToolCircularString::testAddCircularStringRadius()
139 {
140   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 111 );
141   mLayer->startEditing();
142 
143   QgsMapToolCircularStringRadius mapTool( mParentTool, mCanvas );
144   mCanvas->setMapTool( &mapTool );
145 
146   TestQgsMapToolAdvancedDigitizingUtils utils( &mapTool );
147   utils.mouseClick( 0, 0, Qt::LeftButton );
148   utils.mouseClick( 1, 1, Qt::LeftButton );
149   utils.mouseClick( 0, 2, Qt::LeftButton );
150   utils.mouseClick( 0, 2, Qt::RightButton );
151   QgsFeatureId newFid = utils.newFeatureId();
152 
153   QCOMPARE( mLayer->featureCount(), ( long )1 );
154   QgsFeature f = mLayer->getFeature( newFid );
155 
156   QString wkt = "CompoundCurveZ (CircularStringZ (0 0 111, 0.17912878474779187 0.82087121525220819 111, 1 1 111))";
157   QCOMPARE( f.geometry().asWkt(), wkt );
158 
159   mLayer->rollBack();
160   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 0 );
161 }
162 
testAddCircularStringRadiusWithDeletedVertex()163 void TestQgsMapToolCircularString::testAddCircularStringRadiusWithDeletedVertex()
164 {
165   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 111 );
166   mLayer->startEditing();
167 
168   QgsMapToolCircularStringRadius mapTool( mParentTool, mCanvas );
169   mCanvas->setMapTool( &mapTool );
170 
171   TestQgsMapToolAdvancedDigitizingUtils utils( &mapTool );
172   utils.mouseClick( 0, 0, Qt::LeftButton );
173   utils.mouseClick( 1, 1, Qt::LeftButton );
174   utils.mouseClick( 4, 1, Qt::LeftButton );
175   utils.keyClick( Qt::Key_Backspace );
176   utils.mouseClick( 0, 2, Qt::LeftButton );
177   utils.mouseClick( 4, 1, Qt::LeftButton );
178   utils.keyClick( Qt::Key_Backspace );
179   utils.mouseClick( 0, 2, Qt::RightButton );
180   QgsFeatureId newFid = utils.newFeatureId();
181 
182   QCOMPARE( mLayer->featureCount(), ( long )1 );
183   QgsFeature f = mLayer->getFeature( newFid );
184 
185   QString wkt = "CompoundCurveZ (CircularStringZ (0 0 111, 0.17912878474779187 0.82087121525220819 111, 1 1 111))";
186   QCOMPARE( f.geometry().asWkt(), wkt );
187 
188   mLayer->rollBack();
189   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 0 );
190 }
191 
testAddCircularStringAfterClassicDigitizing()192 void TestQgsMapToolCircularString::testAddCircularStringAfterClassicDigitizing()
193 {
194   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 333 );
195   mLayer->startEditing();
196 
197   TestQgsMapToolAdvancedDigitizingUtils utilsClassic( mParentTool );
198 
199   mCanvas->setMapTool( mParentTool );
200   utilsClassic.mouseClick( 2, 1, Qt::LeftButton );
201   utilsClassic.mouseClick( 2, 0, Qt::LeftButton );
202   utilsClassic.mouseClick( 0, 0, Qt::LeftButton );
203 
204   QgsMapToolCircularStringCurvePoint mapTool( mParentTool, mCanvas );
205   mCanvas->setMapTool( &mapTool );
206 
207   TestQgsMapToolAdvancedDigitizingUtils utilsCircular( &mapTool );
208   utilsCircular.mouseClick( 1, 1, Qt::LeftButton );
209   utilsCircular.mouseClick( 0, 2, Qt::LeftButton );
210 
211   mCanvas->setMapTool( mParentTool );
212   utilsClassic.mouseClick( 2, 2, Qt::LeftButton );
213   utilsClassic.mouseClick( 4, 2, Qt::LeftButton );
214 
215   utilsCircular.mouseClick( 4, 2, Qt::RightButton );
216   QgsFeatureId newFid = utilsCircular.newFeatureId();
217 
218   QCOMPARE( mLayer->featureCount(), ( long )1 );
219   QgsFeature f = mLayer->getFeature( newFid );
220 
221   QString wkt = "CompoundCurveZ ((2 1 333, 2 0 333),(2 0 333, 0 0 333),CircularStringZ (0 0 333, 1 1 333, 0 2 333),(0 2 333, 2 2 333),(2 2 333, 4 2 333))";
222   QCOMPARE( f.geometry().asWkt(), wkt );
223 
224   mLayer->rollBack();
225   QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 0 );
226 }
227 QGSTEST_MAIN( TestQgsMapToolCircularString )
228 #include "testqgsmaptoolcircularstring.moc"
229