1 /***************************************************************************
2 TestQgsMapToolReverseLine.cpp
3 --------------------------------
4 Date : May 2018
5 Copyright : (C) 2018 by Loïc Bartoletti
6 Email : loic dot bartoletti at oslandia dot 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 "qgsmaptoolreverseline.h"
27 #include "qgsmapmouseevent.h"
28 #include "qgssnappingutils.h"
29
30 class TestQgsMapToolReverseLine : public QObject
31 {
32 Q_OBJECT
33
34 public:
35 TestQgsMapToolReverseLine();
36
37 private slots:
38 void initTestCase();
39 void cleanupTestCase();
40
41 void testReverseCurve();
42 void testReverseLineString();
43 void testReverseMultiLineString();
44
45 private:
46 QgisApp *mQgisApp = nullptr;
47 QgsMapCanvas *mCanvas = nullptr;
48 };
49
50 TestQgsMapToolReverseLine::TestQgsMapToolReverseLine() = default;
51
52
53 //runs before all tests
initTestCase()54 void TestQgsMapToolReverseLine::initTestCase()
55 {
56 QgsApplication::init();
57 QgsApplication::initQgis();
58
59 mQgisApp = new QgisApp();
60
61 mCanvas = new QgsMapCanvas();
62 mCanvas->setDestinationCrs( QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3946" ) ) );
63 }
64
cleanupTestCase()65 void TestQgsMapToolReverseLine::cleanupTestCase()
66 {
67 QgsApplication::exitQgis();
68 }
69
testReverseCurve()70 void TestQgsMapToolReverseLine::testReverseCurve()
71 {
72 //create a temporary layer
73 std::unique_ptr< QgsVectorLayer > memoryLayer( new QgsVectorLayer( QStringLiteral( "LineString?crs=EPSG:3946&field=pk:int" ), QStringLiteral( "vl" ), QStringLiteral( "memory" ) ) );
74 QVERIFY( memoryLayer->isValid() );
75 QgsFeature curve( memoryLayer->dataProvider()->fields(), 1 );
76
77 curve.setAttribute( QStringLiteral( "pk" ), 1 );
78 curve.setGeometry( QgsGeometry::fromWkt( QStringLiteral(
79 "CircularString(10 10, 5 5)" ) ) );
80
81 memoryLayer->dataProvider()->addFeatures( QgsFeatureList() << curve );
82
83 mCanvas->setLayers( QList<QgsMapLayer *>() << memoryLayer.get() );
84 mCanvas->setCurrentLayer( memoryLayer.get() );
85
86 std::unique_ptr< QgsMapToolReverseLine > tool( new QgsMapToolReverseLine( mCanvas ) );
87
88 memoryLayer->startEditing();
89 const QgsPointXY mapPoint = mCanvas->getCoordinateTransform()->transform( 5, 5 );
90 const std::unique_ptr< QgsMapMouseEvent > event( new QgsMapMouseEvent(
91 mCanvas,
92 QEvent::MouseButtonRelease,
93 QPoint( mapPoint.x(), mapPoint.y() )
94 ) );
95 // trigger mouseRelease handler
96 tool->canvasPressEvent( event.get() );
97 tool->canvasReleaseEvent( event.get() );
98 const QgsFeature f = memoryLayer->getFeature( 1 );
99
100 const QString wkt = "CircularString (5 5, 10 10)";
101 QCOMPARE( f.geometry().asWkt(), wkt );
102 memoryLayer->rollBack();
103
104 }
105
testReverseLineString()106 void TestQgsMapToolReverseLine::testReverseLineString()
107 {
108 //create a temporary layer
109 std::unique_ptr< QgsVectorLayer > memoryLayer( new QgsVectorLayer( QStringLiteral( "LineStringZ?crs=EPSG:3946&field=pk:int" ), QStringLiteral( "vl" ), QStringLiteral( "memory" ) ) );
110 QVERIFY( memoryLayer->isValid() );
111 QgsFeature line( memoryLayer->dataProvider()->fields(), 1 );
112
113 line.setAttribute( QStringLiteral( "pk" ), 1 );
114 line.setGeometry( QgsGeometry::fromWkt( QStringLiteral(
115 "LineStringZ(0 0 0, 10 10 10, 5 5 5)" ) ) );
116
117 memoryLayer->dataProvider()->addFeatures( QgsFeatureList() << line );
118 mCanvas->setLayers( QList<QgsMapLayer *>() << memoryLayer.get() );
119 mCanvas->setCurrentLayer( memoryLayer.get() );
120
121
122 std::unique_ptr< QgsMapToolReverseLine > tool( new QgsMapToolReverseLine( mCanvas ) );
123 memoryLayer->startEditing();
124 const QgsPointXY mapPoint = mCanvas->getCoordinateTransform()->transform( 6, 6 );
125 const std::unique_ptr< QgsMapMouseEvent > event( new QgsMapMouseEvent(
126 mCanvas,
127 QEvent::MouseButtonRelease,
128 QPoint( mapPoint.x(), mapPoint.y() )
129 ) );
130 // trigger mouseRelease handler
131 tool->canvasPressEvent( event.get() );
132 tool->canvasReleaseEvent( event.get() );
133
134 const QgsFeature f = memoryLayer->getFeature( 1 );
135
136 const QString wkt = "LineStringZ (5 5 5, 10 10 10, 0 0 0)";
137 QCOMPARE( f.geometry().asWkt(), wkt );
138
139 memoryLayer->rollBack();
140 }
141
testReverseMultiLineString()142 void TestQgsMapToolReverseLine::testReverseMultiLineString()
143 {
144 //create a temporary layer
145 std::unique_ptr< QgsVectorLayer > memoryLayer( new QgsVectorLayer( QStringLiteral( "MultiLineStringZ?crs=EPSG:3946&field=pk:int" ), QStringLiteral( "vl" ), QStringLiteral( "memory" ) ) );
146 QVERIFY( memoryLayer->isValid() );
147 QgsFeature multi( memoryLayer->dataProvider()->fields(), 1 );
148
149 multi.setAttribute( QStringLiteral( "pk" ), 1 );
150 multi.setGeometry( QgsGeometry::fromWkt( QStringLiteral(
151 "MultiLineStringZ((0 0 0, 10 10 10, 5 5 5), (100 100 100, 120 120 120))" ) ) );
152
153 memoryLayer->dataProvider()->addFeatures( QgsFeatureList() << multi );
154 mCanvas->setLayers( QList<QgsMapLayer *>() << memoryLayer.get() );
155 mCanvas->setCurrentLayer( memoryLayer.get() );
156
157 std::unique_ptr< QgsMapToolReverseLine > tool( new QgsMapToolReverseLine( mCanvas ) );
158
159 memoryLayer->startEditing();
160 QgsPointXY mapPoint = mCanvas->getCoordinateTransform()->transform( 6, 6 );
161 std::unique_ptr< QgsMapMouseEvent > event( new QgsMapMouseEvent(
162 mCanvas,
163 QEvent::MouseButtonRelease,
164 QPoint( mapPoint.x(), mapPoint.y() )
165 ) );
166 // trigger mouseRelease handler
167 tool->canvasPressEvent( event.get() );
168 tool->canvasReleaseEvent( event.get() );
169 QgsFeature f = memoryLayer->getFeature( 1 );
170
171 QString wkt = "MultiLineStringZ ((5 5 5, 10 10 10, 0 0 0),(100 100 100, 120 120 120))";
172 QCOMPARE( f.geometry().asWkt(), wkt );
173
174 mapPoint = mCanvas->getCoordinateTransform()->transform( 110, 110 );
175 event.reset( new QgsMapMouseEvent(
176 mCanvas,
177 QEvent::MouseButtonRelease,
178 QPoint( mapPoint.x(), mapPoint.y() )
179 ) );
180 // trigger mouseRelease handler
181 tool->canvasPressEvent( event.get() );
182 tool->canvasReleaseEvent( event.get() );
183 f = memoryLayer->getFeature( 1 );
184
185 wkt = "MultiLineStringZ ((5 5 5, 10 10 10, 0 0 0),(120 120 120, 100 100 100))";
186 QCOMPARE( f.geometry().asWkt(), wkt );
187 memoryLayer->rollBack();
188 }
189 QGSTEST_MAIN( TestQgsMapToolReverseLine )
190 #include "testqgsmaptoolreverseline.moc"
191