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   QgsPointXY mapPoint = mCanvas->getCoordinateTransform()->transform( 5, 5 );
90   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   QgsFeature f = memoryLayer->getFeature( 1 );
99 
100   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   QgsPointXY mapPoint = mCanvas->getCoordinateTransform()->transform( 6, 6 );
125   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   QgsFeature f = memoryLayer->getFeature( 1 );
135 
136   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