@@ -36,14 +36,19 @@ class DummyAlgorithm : public QgsProcessingAlgorithm
3636{
3737 public:
3838
39- DummyAlgorithm ( const QString &name ) : mName ( name ) {}
39+ DummyAlgorithm ( const QString &name ) : mName ( name ) { mFlags = QgsProcessingAlgorithm::flags (); }
4040
4141 QString name () const override { return mName ; }
4242 QString displayName () const override { return mName ; }
4343 virtual QVariantMap processAlgorithm ( const QVariantMap &,
4444 QgsProcessingContext &, QgsProcessingFeedback * ) const override { return QVariantMap (); }
45+
46+ virtual Flags flags () const override { return mFlags ; }
47+
4548 QString mName ;
4649
50+ Flags mFlags ;
51+
4752 void checkParameterVals ()
4853 {
4954 addParameter ( new QgsProcessingParameterString ( " p1" ) );
@@ -126,6 +131,62 @@ class DummyAlgorithm : public QgsProcessingAlgorithm
126131 QVERIFY ( hasHtmlOutputs () );
127132 }
128133
134+ void runValidateInputCrsChecks ()
135+ {
136+ addParameter ( new QgsProcessingParameterMapLayer ( " p1" ) );
137+ addParameter ( new QgsProcessingParameterMapLayer ( " p2" ) );
138+ QVariantMap parameters;
139+
140+ QgsVectorLayer *layer3111 = new QgsVectorLayer ( " Point?crs=epsg:3111" , " v1" , " memory" );
141+ QgsProject p;
142+ p.addMapLayer ( layer3111 );
143+
144+ QString testDataDir = QStringLiteral ( TEST_DATA_DIR ) + ' /' ; // defined in CmakeLists.txt
145+ QString raster1 = testDataDir + " tenbytenraster.asc" ;
146+ QFileInfo fi1 ( raster1 );
147+ QgsRasterLayer *r1 = new QgsRasterLayer ( fi1.filePath (), " R1" );
148+ QVERIFY ( r1->isValid () );
149+ p.addMapLayer ( r1 );
150+
151+ QgsVectorLayer *layer4326 = new QgsVectorLayer ( " Point?crs=epsg:4326" , " v1" , " memory" );
152+ p.addMapLayer ( layer4326 );
153+
154+ QgsProcessingContext context;
155+ context.setProject ( &p );
156+
157+ // flag not set
158+ mFlags = 0 ;
159+ parameters.insert ( " p1" , QVariant::fromValue ( layer3111 ) );
160+ QVERIFY ( validateInputCrs ( parameters, context ) );
161+ mFlags = FlagRequiresMatchingCrs;
162+ QVERIFY ( validateInputCrs ( parameters, context ) );
163+
164+ // two layers, different crs
165+ parameters.insert ( " p2" , QVariant::fromValue ( layer4326 ) );
166+ // flag not set
167+ mFlags = 0 ;
168+ QVERIFY ( validateInputCrs ( parameters, context ) );
169+ mFlags = FlagRequiresMatchingCrs;
170+ QVERIFY ( !validateInputCrs ( parameters, context ) );
171+
172+ // raster layer
173+ parameters.remove ( " p2" );
174+ addParameter ( new QgsProcessingParameterRasterLayer ( " p3" ) );
175+ parameters.insert ( " p3" , QVariant::fromValue ( r1 ) );
176+ QVERIFY ( !validateInputCrs ( parameters, context ) );
177+
178+ // feature source
179+ parameters.remove ( " p3" );
180+ addParameter ( new QgsProcessingParameterFeatureSource ( " p4" ) );
181+ parameters.insert ( " p4" , layer4326->id () );
182+ QVERIFY ( !validateInputCrs ( parameters, context ) );
183+
184+ parameters.remove ( " p4" );
185+ addParameter ( new QgsProcessingParameterMultipleLayers ( " p5" ) );
186+ parameters.insert ( " p5" , QVariantList () << layer4326->id () << r1->id () );
187+ QVERIFY ( !validateInputCrs ( parameters, context ) );
188+ }
189+
129190};
130191
131192// dummy provider for testing
@@ -228,6 +289,7 @@ class TestQgsProcessing: public QObject
228289 void processingFeatureSource ();
229290 void processingFeatureSink ();
230291 void algorithmScope ();
292+ void validateInputCrs ();
231293
232294 private:
233295
@@ -2640,5 +2702,11 @@ void TestQgsProcessing::algorithmScope()
26402702 QCOMPARE ( exp2.evaluate ( &context ).toInt (), 5 );
26412703}
26422704
2705+ void TestQgsProcessing::validateInputCrs ()
2706+ {
2707+ DummyAlgorithm alg ( " test" );
2708+ alg.runValidateInputCrsChecks ();
2709+ }
2710+
26432711QGSTEST_MAIN ( TestQgsProcessing )
26442712#include " testqgsprocessing.moc"
0 commit comments