Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
with
240 additions
and 3 deletions.
- +1 −0 src/app/qgisapp.cpp
- +2 −1 src/app/qgsmaptooladdcircularstring.h
- +2 −1 src/app/qgsmaptoolcircularstringcurvepoint.h
- +2 −1 src/app/qgsmaptoolcircularstringradius.h
- +1 −0 tests/src/app/CMakeLists.txt
- +133 −0 tests/src/app/testqgsmaptoolcircularstring.cpp
- +99 −0 tests/src/app/testqgsmaptoolutils.h
@@ -0,0 +1,133 @@ | ||
/*************************************************************************** | ||
testqgsmaptoolcircularstring.cpp | ||
-------------------------------- | ||
Date : January 2018 | ||
Copyright : (C) 2018 by Paul Blottiere | ||
Email : paul.blottiere@oslandia.com | ||
*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#include "qgstest.h" | ||
|
||
#include "qgisapp.h" | ||
#include "qgsgeometry.h" | ||
#include "qgsmapcanvas.h" | ||
#include "qgssettings.h" | ||
#include "qgsvectorlayer.h" | ||
#include "qgsmaptooladdfeature.h" | ||
|
||
#include "testqgsmaptoolutils.h" | ||
#include "qgsmaptoolcircularstringcurvepoint.h" | ||
#include "qgsmaptoolcircularstringradius.h" | ||
|
||
|
||
class TestQgsMapToolCircularString : public QObject | ||
{ | ||
Q_OBJECT | ||
|
||
public: | ||
TestQgsMapToolCircularString(); | ||
|
||
private slots: | ||
void initTestCase(); | ||
void cleanupTestCase(); | ||
|
||
void testAddCircularStringCurvePoint(); | ||
void testAddCircularStringRadius(); | ||
|
||
private: | ||
QgisApp *mQgisApp = nullptr; | ||
QgsMapToolCapture *mParentTool = nullptr; | ||
QgsMapCanvas *mCanvas = nullptr; | ||
QgsVectorLayer *mLayer = nullptr; | ||
}; | ||
|
||
TestQgsMapToolCircularString::TestQgsMapToolCircularString() = default; | ||
|
||
|
||
//runs before all tests | ||
void TestQgsMapToolCircularString::initTestCase() | ||
{ | ||
QgsApplication::init(); | ||
QgsApplication::initQgis(); | ||
|
||
mQgisApp = new QgisApp(); | ||
|
||
mCanvas = new QgsMapCanvas(); | ||
mCanvas->setDestinationCrs( QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:27700" ) ) ); | ||
|
||
// make testing layers | ||
mLayer = new QgsVectorLayer( QStringLiteral( "LineStringZ?crs=EPSG:27700" ), QStringLiteral( "layer line Z" ), QStringLiteral( "memory" ) ); | ||
QVERIFY( mLayer->isValid() ); | ||
QgsProject::instance()->addMapLayers( QList<QgsMapLayer *>() << mLayer ); | ||
|
||
// set layers in canvas | ||
mCanvas->setLayers( QList<QgsMapLayer *>() << mLayer ); | ||
mCanvas->setCurrentLayer( mLayer ); | ||
|
||
mParentTool = new QgsMapToolAddFeature( mCanvas, QgsMapToolCapture::CaptureLine ); | ||
} | ||
|
||
void TestQgsMapToolCircularString::cleanupTestCase() | ||
{ | ||
QgsApplication::exitQgis(); | ||
} | ||
|
||
void TestQgsMapToolCircularString::testAddCircularStringCurvePoint() | ||
{ | ||
QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 333 ); | ||
mLayer->startEditing(); | ||
|
||
QgsMapToolCircularStringCurvePoint mapTool( mParentTool, mCanvas ); | ||
mCanvas->setMapTool( &mapTool ); | ||
|
||
TestQgsMapToolAdvancedDigitizingUtils utils( &mapTool ); | ||
utils.mouseClick( 0, 0, Qt::LeftButton ); | ||
utils.mouseClick( 1, 1, Qt::LeftButton ); | ||
utils.mouseClick( 0, 2, Qt::LeftButton ); | ||
utils.mouseClick( 0, 2, Qt::RightButton ); | ||
QgsFeatureId newFid = utils.newFeatureId(); | ||
|
||
QCOMPARE( mLayer->featureCount(), ( long )1 ); | ||
QgsFeature f = mLayer->getFeature( newFid ); | ||
|
||
QString wkt = "CompoundCurveZ (CircularStringZ (0 0 333, 1 1 333, 0 2 333))"; | ||
QCOMPARE( f.geometry().asWkt(), wkt ); | ||
|
||
mLayer->rollBack(); | ||
QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 0 ); | ||
} | ||
|
||
void TestQgsMapToolCircularString::testAddCircularStringRadius() | ||
{ | ||
QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 111 ); | ||
mLayer->startEditing(); | ||
|
||
QgsMapToolCircularStringRadius mapTool( mParentTool, mCanvas ); | ||
mCanvas->setMapTool( &mapTool ); | ||
|
||
TestQgsMapToolAdvancedDigitizingUtils utils( &mapTool ); | ||
utils.mouseClick( 0, 0, Qt::LeftButton ); | ||
utils.mouseClick( 1, 1, Qt::LeftButton ); | ||
utils.mouseClick( 0, 2, Qt::LeftButton ); | ||
utils.mouseClick( 0, 2, Qt::RightButton ); | ||
QgsFeatureId newFid = utils.newFeatureId(); | ||
|
||
QCOMPARE( mLayer->featureCount(), ( long )1 ); | ||
QgsFeature f = mLayer->getFeature( newFid ); | ||
|
||
QString wkt = "CompoundCurveZ (CircularStringZ (0 0 111, 0.17912878474779187 0.82087121525220819 111, 1 1 111))"; | ||
QCOMPARE( f.geometry().asWkt(), wkt ); | ||
|
||
mLayer->rollBack(); | ||
QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/default_z_value" ), 0 ); | ||
} | ||
|
||
QGSTEST_MAIN( TestQgsMapToolCircularString ) | ||
#include "testqgsmaptoolcircularstring.moc" |
@@ -0,0 +1,99 @@ | ||
/*************************************************************************** | ||
testqgsmaptoolutils.h | ||
--------------------- | ||
Date : January 2018 | ||
Copyright : (C) 2018 by Paul Blottiere | ||
Email : paul.blottiere@oslandia.com | ||
*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#include "qgstest.h" | ||
|
||
#include "qgisapp.h" | ||
#include "qgsgeometry.h" | ||
#include "qgsmapcanvas.h" | ||
#include "qgsvectorlayer.h" | ||
|
||
/** | ||
* \ingroup UnitTests | ||
*/ | ||
class TestQgsMapToolAdvancedDigitizingUtils | ||
{ | ||
public: | ||
TestQgsMapToolAdvancedDigitizingUtils( QgsMapToolAdvancedDigitizing *mapTool ) | ||
: mMapTool( mapTool ) | ||
{ | ||
} | ||
|
||
QSet<QgsFeatureId> existingFeatureIds() | ||
{ | ||
QSet<QgsFeatureId> fids; | ||
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mMapTool->canvas()->currentLayer() ); | ||
|
||
if ( vl ) | ||
{ | ||
QgsFeature f; | ||
QgsFeatureIterator it = vl->getFeatures(); | ||
while ( it.nextFeature( f ) ) | ||
fids << f.id(); | ||
} | ||
|
||
return fids; | ||
} | ||
|
||
QgsFeatureId newFeatureId( QSet<QgsFeatureId> oldFids = QSet<QgsFeatureId>() ) | ||
{ | ||
QSet<QgsFeatureId> newFids = existingFeatureIds(); | ||
QSet<QgsFeatureId> diffFids = newFids.subtract( oldFids ); | ||
Q_ASSERT( diffFids.count() == 1 ); | ||
return *diffFids.constBegin(); | ||
} | ||
|
||
QPoint mapToScreen( double mapX, double mapY ) | ||
{ | ||
QgsPointXY pt = mMapTool->canvas()->mapSettings().mapToPixel().transform( mapX, mapY ); | ||
return QPoint( std::round( pt.x() ), std::round( pt.y() ) ); | ||
} | ||
|
||
void mouseMove( double mapX, double mapY ) | ||
{ | ||
QgsMapMouseEvent e( mMapTool->canvas(), QEvent::MouseMove, mapToScreen( mapX, mapY ) ); | ||
mMapTool->cadCanvasMoveEvent( &e ); | ||
} | ||
|
||
void mousePress( double mapX, double mapY, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers() ) | ||
{ | ||
QgsMapMouseEvent e1( mMapTool->canvas(), QEvent::MouseButtonPress, mapToScreen( mapX, mapY ), button, button, stateKey ); | ||
mMapTool->cadCanvasPressEvent( &e1 ); | ||
} | ||
|
||
void mouseRelease( double mapX, double mapY, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers() ) | ||
{ | ||
QgsMapMouseEvent e2( mMapTool->canvas(), QEvent::MouseButtonRelease, mapToScreen( mapX, mapY ), button, Qt::MouseButton(), stateKey ); | ||
mMapTool->cadCanvasReleaseEvent( &e2 ); | ||
} | ||
|
||
void mouseClick( double mapX, double mapY, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers() ) | ||
{ | ||
mousePress( mapX, mapY, button, stateKey ); | ||
mouseRelease( mapX, mapY, button, stateKey ); | ||
} | ||
|
||
void keyClick( int key ) | ||
{ | ||
QKeyEvent e1( QEvent::KeyPress, key, Qt::KeyboardModifiers() ); | ||
mMapTool->keyPressEvent( &e1 ); | ||
|
||
QKeyEvent e2( QEvent::KeyRelease, key, Qt::KeyboardModifiers() ); | ||
mMapTool->keyReleaseEvent( &e2 ); | ||
} | ||
|
||
private: | ||
QgsMapToolAdvancedDigitizing *mMapTool = nullptr; | ||
}; |