From 567d13d7ce61763a5720613815ac6814cf21d17e Mon Sep 17 00:00:00 2001 From: N_Strahl Date: Sat, 10 Feb 2024 17:26:06 +0000 Subject: [PATCH] Add new tests for meshlayer node renderer (Scalar and Vector datasets) --- tests/src/core/testqgslayertree.cpp | 5 +- tests/src/core/testqgslegendrenderer.cpp | 72 ++++++++++++++++++ .../src/python/test_qgscolorramplegendnode.py | 6 +- ..._legend_mesh_diagram_color_ramp_vector.png | Bin 0 -> 11948 bytes ...expected_legend_mesh_diagram_no_vector.png | Bin 0 -> 6911 bytes ...xpected_legend_mesh_diagram_red_vector.png | Bin 0 -> 9087 bytes 6 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 tests/testdata/control_images/legend/expected_legend_mesh_diagram_color_ramp_vector/expected_legend_mesh_diagram_color_ramp_vector.png create mode 100644 tests/testdata/control_images/legend/expected_legend_mesh_diagram_no_vector/expected_legend_mesh_diagram_no_vector.png create mode 100644 tests/testdata/control_images/legend/expected_legend_mesh_diagram_red_vector/expected_legend_mesh_diagram_red_vector.png diff --git a/tests/src/core/testqgslayertree.cpp b/tests/src/core/testqgslayertree.cpp index 35a7c2dfc14f5..1f87ee808d432 100644 --- a/tests/src/core/testqgslayertree.cpp +++ b/tests/src/core/testqgslayertree.cpp @@ -973,18 +973,19 @@ void TestQgsLayerTree::testRasterSymbolNode() const std::unique_ptr< QgsLayerTreeLayer > n = std::make_unique< QgsLayerTreeLayer >( rl.get() ); // not checkable - QgsRasterSymbolLegendNode rasterNode( n.get(), QColor( 255, 0, 0 ), QStringLiteral( "my node" ), nullptr, false, QStringLiteral( "key" ) ); + QgsRasterSymbolLegendNode rasterNode( n.get(), QColor( 255, 0, 0 ), QStringLiteral( "my node" ), nullptr, false, QStringLiteral( "key" ), QStringLiteral("parentKey") ); QVERIFY( !rasterNode.isCheckable() ); QCOMPARE( rasterNode.ruleKey(), QStringLiteral( "key" ) ); QCOMPARE( static_cast< int >( rasterNode.flags() ), static_cast< int >( Qt::ItemIsEnabled | Qt::ItemIsSelectable ) ); QCOMPARE( rasterNode.data( Qt::DisplayRole ).toString(), QStringLiteral( "my node" ) ); QCOMPARE( rasterNode.data( static_cast< int >( QgsLayerTreeModelLegendNode::CustomRole::NodeType ) ).toInt(), static_cast< int >( QgsLayerTreeModelLegendNode::RasterSymbolLegend ) ); QCOMPARE( rasterNode.data( static_cast< int >( QgsLayerTreeModelLegendNode::CustomRole::RuleKey ) ).toString(), QStringLiteral( "key" ) ); + QCOMPARE( rasterNode.data( static_cast< int >( QgsLayerTreeModelLegendNode::CustomRole::ParentRuleKey ) ).toString(), QStringLiteral( "parentKey" ) ); QCOMPARE( rasterNode.data( Qt::CheckStateRole ), QVariant() ); QVERIFY( !rasterNode.setData( true, Qt::CheckStateRole ) ); // checkable - const QgsRasterSymbolLegendNode rasterNode2( n.get(), QColor( 255, 0, 0 ), QStringLiteral( "my node" ), nullptr, true, QStringLiteral( "key" ) ); + const QgsRasterSymbolLegendNode rasterNode2( n.get(), QColor( 255, 0, 0 ), QStringLiteral( "my node" ), nullptr, true, QStringLiteral( "key" ), QStringLiteral("parentKey") ); QVERIFY( rasterNode2.isCheckable() ); QCOMPARE( static_cast< int >( rasterNode2.flags() ), static_cast< int >( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable ) ); } diff --git a/tests/src/core/testqgslegendrenderer.cpp b/tests/src/core/testqgslegendrenderer.cpp index 6c3868c80c2a9..c7bc649ea08ad 100644 --- a/tests/src/core/testqgslegendrenderer.cpp +++ b/tests/src/core/testqgslegendrenderer.cpp @@ -48,6 +48,7 @@ #include "qgslinesymbol.h" #include "qgsmarkersymbol.h" #include "qgsfillsymbol.h" +#include "qgsmeshlayer.h" static void _setStandardTestFont( QgsLegendSettings &settings, const QString &style = QStringLiteral( "Roman" ) ) { @@ -196,6 +197,7 @@ class TestQgsLegendRenderer : public QgsTest void testFilterByExpression(); void testFilterByExpressionWithContext(); void testDiagramAttributeLegend(); + void testDiagramMeshLegend(); void testDiagramSizeLegend(); void testDataDefinedSizeCollapsed(); void testTextOnSymbol(); @@ -1435,6 +1437,76 @@ void TestQgsLegendRenderer::testDiagramAttributeLegend() QgsProject::instance()->removeMapLayer( vl4 ); } +void TestQgsLegendRenderer::testDiagramMeshLegend() +{ + const QString uri_1( QString( TEST_DATA_DIR ) + QStringLiteral( "/mesh/mesh_z_ws_d_vel.nc" ) ); //mesh with dataset group "Bed Elevation", "Water Level", "Depth" and "Velocity" + + QTemporaryDir tempDir; + const QString uri( tempDir.filePath( QStringLiteral( "mesh.nc" ) ) ); + + QFile::copy( uri_1, uri ); + QgsMeshLayer* layer = new QgsMeshLayer( uri, QStringLiteral( "mesh" ), QStringLiteral( "mdal" ) ); + QVERIFY( layer->isValid() ); + QCOMPARE( layer->datasetGroupCount(), 4 ); + + QgsProject::instance()->addMapLayer( layer ); + + int scalarIndex = 0; + int vectorIndex = -1; + + QgsMeshRendererSettings rendererSettings = layer->rendererSettings(); + rendererSettings.setActiveScalarDatasetGroup(scalarIndex); + rendererSettings.setActiveVectorDatasetGroup(vectorIndex); + layer->setRendererSettings(rendererSettings); + + std::unique_ptr< QgsLayerTree > root( std::make_unique() ); + root->addLayer( layer ); + std::unique_ptr legendModel( std::make_unique(root.get()) ); + + QgsLegendSettings settings; + + QImage res = _renderLegend( legendModel.get(), settings ); + QVERIFY( _verifyImage( res, QStringLiteral( "legend_mesh_diagram_no_vector" ) ) ); + + //red vector + QgsMeshLayer* layer2 = layer->clone(); + QgsProject::instance()->removeMapLayer( layer ); + QgsProject::instance()->addMapLayer( layer2 ); + + vectorIndex = 2; + rendererSettings.setActiveVectorDatasetGroup(vectorIndex); + QgsMeshRendererVectorSettings vectorSettings = rendererSettings.vectorSettings(vectorIndex); + vectorSettings.setColor( Qt::red ); + rendererSettings.setVectorSettings(vectorIndex, vectorSettings); + layer2->setRendererSettings(rendererSettings); + + root = std::make_unique(); + root->addLayer( layer2 ); + legendModel = std::make_unique( root.get() ); + + res = _renderLegend( legendModel.get(), settings ); + QVERIFY( _verifyImage( res, QStringLiteral( "legend_mesh_diagram_red_vector" ) ) ); + + //color ramp vector + QgsMeshLayer* layer3 = layer2->clone(); + QgsProject::instance()->removeMapLayer( layer2 ); + QgsProject::instance()->addMapLayer( layer3 ); + + const QgsColorRampShader fcn = rendererSettings.scalarSettings(vectorIndex).colorRampShader(); + vectorSettings.setColorRampShader(fcn); + vectorSettings.setColoringMethod(QgsInterpolatedLineColor::ColorRamp); + rendererSettings.setVectorSettings(vectorIndex, vectorSettings); + layer3->setRendererSettings(rendererSettings); + + root = std::make_unique(); + root->addLayer( layer3 ); + legendModel = std::make_unique( root.get() ); + + res = _renderLegend( legendModel.get(), settings ); + QVERIFY( _verifyImage( res, QStringLiteral( "legend_mesh_diagram_color_ramp_vector" ) ) ); + QgsProject::instance()->removeMapLayer( layer3 ); +} + void TestQgsLegendRenderer::testDiagramSizeLegend() { QgsVectorLayer *vl4 = new QgsVectorLayer( QStringLiteral( "Point" ), QStringLiteral( "Point Layer" ), QStringLiteral( "memory" ) ); diff --git a/tests/src/python/test_qgscolorramplegendnode.py b/tests/src/python/test_qgscolorramplegendnode.py index b5fef7a89a48f..7c8fc42843ce9 100644 --- a/tests/src/python/test_qgscolorramplegendnode.py +++ b/tests/src/python/test_qgscolorramplegendnode.py @@ -129,11 +129,13 @@ def test_basic(self): layer = QgsVectorLayer('dummy', 'test', 'memory') layer_tree_layer = QgsLayerTreeLayer(layer) - node = QgsColorRampLegendNode(layer_tree_layer, r, 'min_label', 'max_label') + node = QgsColorRampLegendNode(layer_tree_layer, r, 'min_label', 'max_label', 'key', 'parentKey') self.assertEqual(node.ramp().color1().name(), '#c80000') self.assertEqual(node.ramp().color2().name(), '#00c800') - + self.assertEqual(node.data(QgsLayerTreeModelLegendNode.LegendNodeRoles.RuleKeyRole), 'key') + self.assertEqual(node.data(QgsLayerTreeModelLegendNode.LegendNodeRoles.ParentRuleKeyRole), 'parentKey') + node.setIconSize(QSize(11, 12)) self.assertEqual(node.iconSize(), QSize(11, 12)) diff --git a/tests/testdata/control_images/legend/expected_legend_mesh_diagram_color_ramp_vector/expected_legend_mesh_diagram_color_ramp_vector.png b/tests/testdata/control_images/legend/expected_legend_mesh_diagram_color_ramp_vector/expected_legend_mesh_diagram_color_ramp_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..d60a18cb54c68b933f22f09f76a47e86a6802643 GIT binary patch literal 11948 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 BN=g6# literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_mesh_diagram_no_vector/expected_legend_mesh_diagram_no_vector.png b/tests/testdata/control_images/legend/expected_legend_mesh_diagram_no_vector/expected_legend_mesh_diagram_no_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb4a961a41ffc45e257673da3569e7b36538707 GIT binary patch literal 6911 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 literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_mesh_diagram_red_vector/expected_legend_mesh_diagram_red_vector.png b/tests/testdata/control_images/legend/expected_legend_mesh_diagram_red_vector/expected_legend_mesh_diagram_red_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..8f430063dcce7198240cda778619a3e38cac44ca GIT binary patch literal 9087 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 literal 0 HcmV?d00001