diff --git a/src/gui/qgsadvanceddigitizingdockwidget.h b/src/gui/qgsadvanceddigitizingdockwidget.h index 34eb02c2916..b334a88b3d4 100644 --- a/src/gui/qgsadvanceddigitizingdockwidget.h +++ b/src/gui/qgsadvanceddigitizingdockwidget.h @@ -973,6 +973,8 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private #endif //! Convenient method to convert a 2D Point to a QgsPoint QgsPoint pointXYToPoint( const QgsPointXY &point ) const; + + friend class TestQgsAdvancedDigitizing; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QgsAdvancedDigitizingDockWidget::CadCapacities ) diff --git a/tests/src/app/CMakeLists.txt b/tests/src/app/CMakeLists.txt index 9da78d504ab..567626e9968 100644 --- a/tests/src/app/CMakeLists.txt +++ b/tests/src/app/CMakeLists.txt @@ -13,6 +13,7 @@ set(TESTS testqgsappbrowserproviders.cpp testqgisappclipboard.cpp testqgisappdockwidgets.cpp + testqgsadvanceddigitizing.cpp testqgsattributetable.cpp testqgsapplocatorfilters.cpp testqgsdecorationscalebar.cpp diff --git a/tests/src/app/testqgsadvanceddigitizing.cpp b/tests/src/app/testqgsadvanceddigitizing.cpp new file mode 100644 index 00000000000..5efb4ab1d5f --- /dev/null +++ b/tests/src/app/testqgsadvanceddigitizing.cpp @@ -0,0 +1,557 @@ +/*************************************************************************** + testqgsadvanceddigitizing.cpp + ---------------------- + Date : December 2021 + Copyright : (C) 2021 Antoine Facchini + Email : antoine dot facchini at oslandia dot 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 "qgsadvanceddigitizingdockwidget.h" +#include "qgsguiutils.h" +#include "qgsapplication.h" +#include "qgsmapcanvas.h" +#include "qgsvectorlayer.h" +#include "qgsmaptooladdfeature.h" +#include "qgssettingsregistrycore.h" + +#include "testqgsmaptoolutils.h" + + +class TestQgsAdvancedDigitizing: public QObject +{ + Q_OBJECT + private slots: + void initTestCase(); // will be called before the first testfunction is executed. + void cleanupTestCase(); // will be called after the last testfunction was executed. + void init(); // will be called before each testfunction is executed. + void cleanup(); // will be called after every testfunction. + + TestQgsMapToolAdvancedDigitizingUtils getMapToolDigitizingUtils( QgsVectorLayer *layer ); + QString getWktFromLastAddedFeature( TestQgsMapToolAdvancedDigitizingUtils utils, QSet oldFeatures ); + void setCanvasCrs( QString crsString ); + + void distance(); + void distanceDiffCrs(); + void angle(); + void angleWithGeographicCrs(); + void distanceWithAngle(); + void coordinates(); + void coordinatesWithZM(); + void valuesWhenSnapping(); + + private: + QgisApp *mQgisApp = nullptr; + QgsMapToolAddFeature *mCaptureTool = nullptr; + QgsMapCanvas *mCanvas = nullptr; + QgsVectorLayer *mLayer3950 = nullptr; + QgsVectorLayer *mLayer3950ZM = nullptr; + QgsVectorLayer *mLayer4326 = nullptr; + QgsVectorLayer *mLayer4326ZM = nullptr; + QgsAdvancedDigitizingDockWidget *mAdvancedDigitizingDockWidget = nullptr; + QgsSnappingUtils *mSnappingUtils = nullptr; + + const double WKT_PRECISION = 2; +}; + +void TestQgsAdvancedDigitizing::initTestCase() +{ + QgsApplication::init(); + QgsApplication::initQgis(); + + mQgisApp = new QgisApp(); + + mCanvas = new QgsMapCanvas(); + setCanvasCrs( QStringLiteral( "EPSG:3950" ) ); + + QgsSettingsRegistryCore::settingsDigitizingDefaultZValue.setValue( 33 ); + QgsSettingsRegistryCore::settingsDigitizingDefaultMValue.setValue( 66 ); + + // make test layers + QList layers; + + mLayer3950 = new QgsVectorLayer( QStringLiteral( "LineString?crs=EPSG:3950" ), + QStringLiteral( "line layer" ), QStringLiteral( "memory" ) ); + QVERIFY( mLayer3950->isValid() ); + layers << mLayer3950; + + mLayer3950ZM = new QgsVectorLayer( QStringLiteral( "LineStringZM?crs=EPSG:3950" ), + QStringLiteral( "ZM line layer" ), QStringLiteral( "memory" ) ); + QVERIFY( mLayer3950ZM->isValid() ); + layers << mLayer3950ZM; + + mLayer4326 = new QgsVectorLayer( QStringLiteral( "LineString?crs=EPSG:4326" ), + QStringLiteral( "line layer diff crs" ), QStringLiteral( "memory" ) ); + QVERIFY( mLayer4326->isValid() ); + layers << mLayer4326; + + mLayer4326ZM = new QgsVectorLayer( QStringLiteral( "LineStringZM?crs=EPSG:4326" ), + QStringLiteral( "ZM line layer diff crs" ), QStringLiteral( "memory" ) ); + QVERIFY( mLayer4326ZM->isValid() ); + layers << mLayer4326ZM; + + // set layers in canvas + QgsProject::instance()->addMapLayers( layers ); + mCanvas->setLayers( layers ); + mCanvas->setCurrentLayer( mLayer3950 ); + + // create advanced digitizing dock widget + mAdvancedDigitizingDockWidget = new QgsAdvancedDigitizingDockWidget( mCanvas ); + + // create snapping + QgsSnappingConfig snapConfig; + snapConfig.setEnabled( false ); + snapConfig.setMode( QgsSnappingConfig::AllLayers ); + snapConfig.setTypeFlag( QgsSnappingConfig::VertexFlag ); + snapConfig.setTolerance( 1.0 ); + + QgsMapSettings mapSettings; + mapSettings.setExtent( QgsRectangle( 0, 0, 8, 8 ) ); + mapSettings.setOutputSize( QSize( 512, 512 ) ); + mapSettings.setLayers( layers ); + + mSnappingUtils = new QgsSnappingUtils; + mSnappingUtils->setConfig( snapConfig ); + mSnappingUtils->setMapSettings( mapSettings ); + + mSnappingUtils->locatorForLayer( mLayer3950 )->init(); + mSnappingUtils->locatorForLayer( mLayer3950ZM )->init(); + mSnappingUtils->locatorForLayer( mLayer4326 )->init(); + mSnappingUtils->locatorForLayer( mLayer4326ZM )->init(); + + // create base map tool + mCaptureTool = new QgsMapToolAddFeature( mCanvas, mAdvancedDigitizingDockWidget, QgsMapToolCapture::CaptureLine ); + mCanvas->setMapTool( mCaptureTool ); +} + +void TestQgsAdvancedDigitizing::cleanupTestCase() +{ + QgsSettingsRegistryCore::settingsDigitizingDefaultZValue.setValue( 0 ); + QgsSettingsRegistryCore::settingsDigitizingDefaultMValue.setValue( 0 ); + + delete mAdvancedDigitizingDockWidget; + delete mSnappingUtils; + delete mCaptureTool; + delete mCanvas; + QgsApplication::exitQgis(); +} + +void TestQgsAdvancedDigitizing::init() +{ +} + +void TestQgsAdvancedDigitizing::cleanup() +{ + mAdvancedDigitizingDockWidget->releaseLocks(); + mAdvancedDigitizingDockWidget->enableAction()->trigger(); + QVERIFY( !mAdvancedDigitizingDockWidget->cadEnabled() ); + + QgsSnappingConfig snapConfig = mSnappingUtils->config(); + snapConfig.setEnabled( false ); + mSnappingUtils->setConfig( snapConfig ); + + mLayer3950->rollBack(); + mLayer3950ZM->rollBack(); + mLayer4326->rollBack(); + mLayer4326ZM->rollBack(); +} + +TestQgsMapToolAdvancedDigitizingUtils TestQgsAdvancedDigitizing::getMapToolDigitizingUtils( QgsVectorLayer *layer ) +{ + mCanvas->setCurrentLayer( layer ); + layer->startEditing(); + mCaptureTool->setLayer( layer ); + + mAdvancedDigitizingDockWidget->enableAction()->trigger(); + + return TestQgsMapToolAdvancedDigitizingUtils( mCaptureTool ); +} + +QString TestQgsAdvancedDigitizing::getWktFromLastAddedFeature( TestQgsMapToolAdvancedDigitizingUtils utils, QSet oldFeatures ) +{ + const QgsFeatureId newFid = utils.newFeatureId( oldFeatures ); + auto layer = qobject_cast( mCanvas->currentLayer() ); + + const QgsCoordinateTransform transform( layer->sourceCrs(), mCanvas->mapSettings().destinationCrs(), + QgsProject::instance() ); + + QgsGeometry geom = layer->getFeature( newFid ).geometry(); + geom.transform( transform, Qgis::TransformDirection::Forward ); + + return geom.asWkt( WKT_PRECISION ); +} + +void TestQgsAdvancedDigitizing::setCanvasCrs( QString crsString ) +{ + const QgsCoordinateReferenceSystem crs( crsString ); + QVERIFY( crs.isValid() ); + + mCanvas->setDestinationCrs( crs ); + mCanvas->setFrameStyle( QFrame::NoFrame ); + mCanvas->resize( 512, 512 ); + mCanvas->setExtent( QgsRectangle( 0, 0, 8, 8 ) ); + mCanvas->show(); // to make the canvas resize + mCanvas->hide(); +} + +void TestQgsAdvancedDigitizing::distance() +{ + auto utils = getMapToolDigitizingUtils( mLayer3950 ); + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + QSet oldFeatures = utils.existingFeatureIds(); + + // with no digitized vertex + auto capacities = mAdvancedDigitizingDockWidget->capacities(); + QVERIFY( !capacities.testFlag( QgsAdvancedDigitizingDockWidget::Distance ) ); + + QVERIFY( !mAdvancedDigitizingDockWidget->mAngleLineEdit->isEnabled() ); + QVERIFY( !mAdvancedDigitizingDockWidget->mDistanceLineEdit->isEnabled() ); + + // activate contrainst on seconde point (one digitized vertex) + utils.mouseClick( 1, 1, Qt::LeftButton ); + + capacities = mAdvancedDigitizingDockWidget->capacities(); + QVERIFY( capacities.testFlag( QgsAdvancedDigitizingDockWidget::Distance ) ); + + mAdvancedDigitizingDockWidget->setDistance( QStringLiteral( "10" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 2, 2, Qt::LeftButton ); + utils.mouseClick( 1, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 8.07 8.07)" ) ); + + // activate contrainst on third point + oldFeatures = utils.existingFeatureIds(); + + utils.mouseClick( 1, 1, Qt::LeftButton ); + utils.mouseClick( 2, 2, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setDistance( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 3, 2, Qt::LeftButton ); + utils.mouseClick( 1, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 2 2, 7 2)" ) ); + + capacities = mAdvancedDigitizingDockWidget->capacities(); + QVERIFY( !capacities.testFlag( QgsAdvancedDigitizingDockWidget::Distance ) ); +} + +void TestQgsAdvancedDigitizing::distanceDiffCrs() +{ + auto utils = getMapToolDigitizingUtils( mLayer4326 ); + QSet oldFeatures = utils.existingFeatureIds(); + + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + utils.mouseClick( 1, 1, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setDistance( QStringLiteral( "10" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 2, 2, Qt::LeftButton ); + utils.mouseClick( 1, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 8.07 8.07)" ) ); + + // activate contrainst on third point + oldFeatures = utils.existingFeatureIds(); + + utils.mouseClick( 1, 1, Qt::LeftButton ); + utils.mouseClick( 2, 2, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setDistance( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 3, 2, Qt::LeftButton ); + utils.mouseClick( 1, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 2 2, 7 2)" ) ); +} + +void TestQgsAdvancedDigitizing::angle() +{ + auto utils = getMapToolDigitizingUtils( mLayer3950 ); + QSet oldFeatures = utils.existingFeatureIds(); + + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + // with no digitized vertex + auto capacities = mAdvancedDigitizingDockWidget->capacities(); + QVERIFY( !capacities.testFlag( QgsAdvancedDigitizingDockWidget::AbsoluteAngle ) ); + + // try angle hard lock in a side + utils.mouseClick( 1, 1, Qt::LeftButton ); + + capacities = mAdvancedDigitizingDockWidget->capacities(); + QVERIFY( capacities.testFlag( QgsAdvancedDigitizingDockWidget::AbsoluteAngle ) ); + + mAdvancedDigitizingDockWidget->setAngle( QStringLiteral( "90" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 2, 2, Qt::LeftButton ); + utils.mouseClick( 2, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 1 2)" ) ); + + // and in the other side + oldFeatures = utils.existingFeatureIds(); + + utils.mouseClick( 1, 1, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setAngle( QStringLiteral( "90" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 2, -2, Qt::LeftButton ); + utils.mouseClick( 2, -2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 1 -2)" ) ); + + // try with an angle of 45° + oldFeatures = utils.existingFeatureIds(); + + utils.mouseClick( 0, 0, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setAngle( QStringLiteral( "45" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 0, 2, Qt::LeftButton ); + utils.mouseClick( 0, 2, Qt::RightButton ); + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (0 0, 1 1)" ) ); +} + +void TestQgsAdvancedDigitizing::angleWithGeographicCrs() +{ + setCanvasCrs( QStringLiteral( "EPSG:4326" ) ); + + QVERIFY( mCanvas->mapSettings().destinationCrs().isGeographic() ); + + auto utils = getMapToolDigitizingUtils( mLayer3950 ); + QSet oldFeatures = utils.existingFeatureIds(); + + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + utils.mouseClick( 1, 1, Qt::LeftButton ); + + auto capacities = mAdvancedDigitizingDockWidget->capacities(); + QVERIFY( !capacities.testFlag( QgsAdvancedDigitizingDockWidget::AbsoluteAngle ) ); + + QVERIFY( !mAdvancedDigitizingDockWidget->constraintAngle()->isLocked() ); + + utils.mouseClick( 0, 2, Qt::RightButton ); + + utils.mouseClick( 1, 1, Qt::LeftButton ); + + // constraint angle can be forced even with geographical + // should be normal ? + mAdvancedDigitizingDockWidget->setAngle( QStringLiteral( "90" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + QVERIFY( mAdvancedDigitizingDockWidget->constraintAngle()->isLocked() ); + + utils.mouseClick( 2, 2, Qt::LeftButton ); + utils.mouseClick( 2, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 1 2)" ) ); + + setCanvasCrs( QStringLiteral( "EPSG:3950" ) ); +} + +void TestQgsAdvancedDigitizing::distanceWithAngle() +{ + auto utils = getMapToolDigitizingUtils( mLayer3950 ); + QSet oldFeatures = utils.existingFeatureIds(); + + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + // with these 2 next locks, there are only 2 posssibilities + // first + utils.mouseClick( 0, 0, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setDistance( QStringLiteral( "10" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + mAdvancedDigitizingDockWidget->setAngle( QStringLiteral( "45" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( 0, 2, Qt::LeftButton ); + utils.mouseClick( 0, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (0 0, 7.07 7.07)" ) ); + + // second + oldFeatures = utils.existingFeatureIds(); + + utils.mouseClick( 0, 0, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setDistance( QStringLiteral( "10" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + mAdvancedDigitizingDockWidget->setAngle( QStringLiteral( "45" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + + utils.mouseClick( -1000, 59, Qt::LeftButton ); + utils.mouseClick( 0, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (0 0, -7.07 -7.07)" ) ); +} + + +void TestQgsAdvancedDigitizing::coordinates() +{ + auto utils = getMapToolDigitizingUtils( mLayer3950 ); + QSet oldFeatures = utils.existingFeatureIds(); + + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + mAdvancedDigitizingDockWidget->setX( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 0, 0, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setY( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 3, 9, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setX( QStringLiteral( "6" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + mAdvancedDigitizingDockWidget->setY( QStringLiteral( "7" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 0, 0, Qt::LeftButton ); + + utils.mouseClick( 0, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (5 0, 3 5, 6 7)" ) ); + + // set Z/M constraints should have no effect + oldFeatures = utils.existingFeatureIds(); + utils.mouseClick( 0, 0, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setZ( QStringLiteral( "3" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + mAdvancedDigitizingDockWidget->setM( QStringLiteral( "3" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 0, 2, Qt::LeftButton ); + + utils.mouseClick( 0, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (5 0, 0 2)" ) ); +} + + +void TestQgsAdvancedDigitizing::coordinatesWithZM() +{ + auto utils = getMapToolDigitizingUtils( mLayer3950ZM ); + QSet oldFeatures = utils.existingFeatureIds(); + + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + mAdvancedDigitizingDockWidget->setX( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 0, 0, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setY( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 3, 9, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setZ( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 4, 4, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setM( QStringLiteral( "5" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 6, 6, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setX( QStringLiteral( "9" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + mAdvancedDigitizingDockWidget->setY( QStringLiteral( "9" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + mAdvancedDigitizingDockWidget->setZ( QStringLiteral( "9" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + mAdvancedDigitizingDockWidget->setM( QStringLiteral( "9" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 0, 0, Qt::LeftButton ); + + utils.mouseClick( 0, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineStringZM (5 0 33 66, 3 5 33 66, 4 4 5 66, 6 6 33 5, 9 9 9 9)" ) ); +} + +void TestQgsAdvancedDigitizing::valuesWhenSnapping() +{ + auto utils = getMapToolDigitizingUtils( mLayer3950 ); + + QSet oldFeatures = utils.existingFeatureIds(); + + QVERIFY( mAdvancedDigitizingDockWidget->cadEnabled() ); + + utils.mouseClick( 1, 1, Qt::LeftButton ); + utils.mouseClick( 2, 2, Qt::LeftButton ); + utils.mouseClick( 2, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (1 1, 2 2)" ) ); + + oldFeatures = utils.existingFeatureIds(); + + QgsSnappingConfig snapConfig = mSnappingUtils->config(); + snapConfig.setEnabled( true ); + mSnappingUtils->setConfig( snapConfig ); + + mSnappingUtils->setCurrentLayer( mLayer3950 ); + mCanvas->setSnappingUtils( mSnappingUtils ); + + utils.mouseClick( 0, 2, Qt::LeftButton ); + utils.mouseClick( 2.02, 2, Qt::LeftButton ); + utils.mouseClick( 2, 2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (0 2, 2 2)" ) ); + + oldFeatures = utils.existingFeatureIds(); + + utils.mouseClick( 0, -2, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setX( QStringLiteral( "0" ), + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 2.02, 2, Qt::LeftButton ); // shouldn't snap to (2 2) + utils.mouseClick( -2, -2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (0 -2, 0 2)" ) ); + + oldFeatures = utils.existingFeatureIds(); + + utils.mouseClick( 0, -2, Qt::LeftButton ); + + mAdvancedDigitizingDockWidget->setX( QStringLiteral( "2.02" ), // shouldn't snap to (2 2) + QgsAdvancedDigitizingDockWidget::ReturnPressed ); + utils.mouseClick( 0, 2, Qt::LeftButton ); + utils.mouseClick( -2, -2, Qt::RightButton ); + + QCOMPARE( getWktFromLastAddedFeature( utils, oldFeatures ), + QStringLiteral( "LineString (0 -2, 2.02 2)" ) ); +} + +QGSTEST_MAIN( TestQgsAdvancedDigitizing ) +#include "testqgsadvanceddigitizing.moc"