diff --git a/python/plugins/processing/tests/AlgorithmsTestBase.py b/python/plugins/processing/tests/AlgorithmsTestBase.py index af475f8fa97..0f0d4e3b82b 100644 --- a/python/plugins/processing/tests/AlgorithmsTestBase.py +++ b/python/plugins/processing/tests/AlgorithmsTestBase.py @@ -59,6 +59,7 @@ from processing.preconfigured.PreconfiguredAlgorithmProvider import Preconfigure from qgis.core import (QgsVectorLayer, QgsRasterLayer, + QgsMapLayer, QgsProject, QgsApplication, QgsProcessingContext, @@ -241,7 +242,10 @@ class AlgorithmsTest(object): if expected_result['type'] in ('vector', 'table'): if 'compare' in expected_result and not expected_result['compare']: # skipping the comparison, so just make sure output is valid - result_lyr = QgsProcessingUtils.mapLayerFromString(results[id], context) + if isinstance(results[id], QgsMapLayer): + result_lyr = results[id] + else: + result_lyr = QgsProcessingUtils.mapLayerFromString(results[id], context) self.assertTrue(result_lyr.isValid()) continue @@ -254,7 +258,11 @@ class AlgorithmsTest(object): except KeyError as e: raise KeyError('Expected result {} does not exist in {}'.format(str(e), list(results.keys()))) - result_lyr = QgsProcessingUtils.mapLayerFromString(results[id], context) + if isinstance(results[id], QgsMapLayer): + assert False + result_lyr = results[id] + else: + result_lyr = QgsProcessingUtils.mapLayerFromString(results[id], context) compare = expected_result.get('compare', {}) diff --git a/src/core/processing/qgsprocessingparameters.cpp b/src/core/processing/qgsprocessingparameters.cpp index cc06747a079..65b2512a609 100644 --- a/src/core/processing/qgsprocessingparameters.cpp +++ b/src/core/processing/qgsprocessingparameters.cpp @@ -277,6 +277,11 @@ QgsProcessingFeatureSource *QgsProcessingParameters::parameterAsSource( const Qg val = fromVar.source; } + if ( QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast( val ) ) ) + { + return new QgsProcessingFeatureSource( layer, context ); + } + QString layerRef; if ( val.canConvert() ) { @@ -285,6 +290,11 @@ QgsProcessingFeatureSource *QgsProcessingParameters::parameterAsSource( const Qg else if ( !val.isValid() || val.toString().isEmpty() ) { // fall back to default + if ( QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast( definition->defaultValue() ) ) ) + { + return new QgsProcessingFeatureSource( layer, context ); + } + layerRef = definition->defaultValue().toString(); } else diff --git a/tests/src/core/testqgsprocessing.cpp b/tests/src/core/testqgsprocessing.cpp index 94817a099ac..fa7f07c1573 100644 --- a/tests/src/core/testqgsprocessing.cpp +++ b/tests/src/core/testqgsprocessing.cpp @@ -3924,6 +3924,15 @@ void TestQgsProcessing::processingFeatureSource() QVERIFY( source->getFeatures().nextFeature( f2 ) ); QCOMPARE( f2.geometry(), f.geometry() ); + // direct map layer + params.insert( QStringLiteral( "layer" ), QVariant::fromValue( layer ) ); + source.reset( QgsProcessingParameters::parameterAsSource( def.get(), params, context ) ); + // can't directly match it to layer, so instead just get the feature and test that it matches what we expect + QVERIFY( source.get() ); + QVERIFY( source->getFeatures().nextFeature( f2 ) ); + QCOMPARE( f2.geometry(), f.geometry() ); + + // next using property based definition params.insert( QStringLiteral( "layer" ), QgsProcessingFeatureSourceDefinition( QgsProperty::fromExpression( QStringLiteral( "trim('%1' + ' ')" ).arg( layer->id() ) ), false ) ); source.reset( QgsProcessingParameters::parameterAsSource( def.get(), params, context ) );