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