Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make test more stable across different platforms #59950

Merged
merged 1 commit into from
Dec 19, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
259 changes: 124 additions & 135 deletions tests/src/python/test_qgsvectorlayerprofilegenerator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import os
import math
from typing import List, Tuple

from qgis.PyQt.QtCore import QDir
from qgis.core import (
Expand Down Expand Up @@ -2994,7 +2995,7 @@ def doCheckPoint(
request: QgsProfileRequest,
tolerance: float,
layer: QgsVectorLayer,
expectedFeatures,
expectedFeatures: list[list[int]],
):
request.setTolerance(tolerance)

Expand All @@ -3005,11 +3006,11 @@ def doCheckPoint(
features = results.asFeatures(Qgis.ProfileExportType.Features3D)
self.assertFalse(len(features) == 0)

expected = sorted(expectedFeatures.copy())
expected = [sorted(e.copy()) for e in expectedFeatures]
actual = [f.attributes["id"] for _, f in enumerate(features)]
actualUniqSorted = sorted(list(set(actual)))

self.assertEqual(actualUniqSorted, expected)
self.assertIn(actualUniqSorted, expected)

for k, feat in enumerate(features):
hasValidZ = False
Expand All @@ -3029,15 +3030,26 @@ def doCheckLine(
request: QgsProfileRequest,
tolerance: float,
layer: QgsVectorLayer,
expectedFeatures,
nbSubGeomPerFeature,
geomType,
expectedFeatures: list[list[tuple[int, int]]],
geomType: Qgis.GeometryType,
):
results = self.doCheckPoint(request, tolerance, layer, expectedFeatures)
"""
The expectedFeatures is a list of valid features, with each tuple
containing feature ID and number of sub geometries for that feature
"""
expected_point_features = [
[e[0] for e in expected] for expected in expectedFeatures
]
results = self.doCheckPoint(request, tolerance, layer, expected_point_features)
features = results.asFeatures(Qgis.ProfileExportType.Features3D)

actual = [f.attributes["id"] for _, f in enumerate(features)]
actualUniqSorted = sorted(list(set(actual)))
nbSubGeomPerFeature = [
[e[1] for e in expected]
for expected in expectedFeatures
if len(expected) == len(actualUniqSorted)
][0]
for idx, fid in enumerate(actualUniqSorted):
actual = [1 for _, f in enumerate(features) if f.attributes["id"] == fid]
self.assertEqual(len(actual), nbSubGeomPerFeature[idx])
Expand All @@ -3050,6 +3062,10 @@ def doCheckLine(

return results

@unittest.skipIf(
Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() == 11,
"Unreliable GEOS minor version found",
)
def testPointGenerationFeature(self):
vl = QgsVectorLayer(os.path.join(unitTestDataPath(), "3d", "points_with_z.shp"))
self.assertTrue(vl.isValid())
Expand All @@ -3072,20 +3088,18 @@ def testPointGenerationFeature(self):
req.setTerrainProvider(terrain_provider)
req.setCrs(QgsCoordinateReferenceSystem("EPSG:3857"))

if Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() <= 10:
self.doCheckPoint(req, 15, vl, [5, 11, 12, 13, 14, 15, 18, 45, 46])
elif Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() == 11:
self.doCheckPoint(req, 16, vl, [5, 11, 12, 13, 14, 15, 18, 45, 46])
elif Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() == 12:
self.doCheckPoint(req, 15, vl, [5, 11, 12, 13, 14, 15, 18, 45])
elif Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() >= 13:
self.doCheckPoint(req, 15, vl, [5, 11, 12, 13, 14, 15, 18, 45, 46])
# actual results vary a lot here depending on geos/proj/... versions!
expected = [
[5, 11, 12, 13, 14, 15, 18, 45, 46],
[5, 11, 12, 13, 14, 15, 18, 45],
]
self.doCheckPoint(req, 15, vl, expected)

self.doCheckPoint(
req,
70,
vl,
[0, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 38, 45, 46, 48],
[[0, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 38, 45, 46, 48]],
)

def testLineGenerationFeature(self):
Expand All @@ -3112,29 +3126,39 @@ def testLineGenerationFeature(self):
req.setCrs(QgsCoordinateReferenceSystem("EPSG:3857"))

# check no tolerance
self.doCheckLine(req, 0, vl, [0, 2], [1, 5], Qgis.GeometryType.Point)
self.doCheckLine(req, 0, vl, [[(0, 1), (2, 5)]], Qgis.GeometryType.Point)

# check increased tolerance, terrain, no extrusion
self.doCheckLine(req, 1, vl, [0, 2], [1, 5], Qgis.GeometryType.Line)
self.doCheckLine(req, 1, vl, [[(0, 1), (2, 5)]], Qgis.GeometryType.Line)

# check increased tolerance, terrain, no extrusion
self.doCheckLine(req, 20, vl, [0, 2], [1, 3], Qgis.GeometryType.Line)
self.doCheckLine(req, 20, vl, [[(0, 1), (2, 3)]], Qgis.GeometryType.Line)

# check increased tolerance, terrain, no extrusion
self.doCheckLine(req, 50, vl, [1, 0, 2], [1, 1, 1], Qgis.GeometryType.Line)
self.doCheckLine(
req, 50, vl, [[(1, 1), (0, 1), (2, 1)]], Qgis.GeometryType.Line
)

# check terrain + extrusion
vl.elevationProperties().setClamping(Qgis.AltitudeClamping.Terrain)
vl.elevationProperties().setExtrusionEnabled(True)
vl.elevationProperties().setExtrusionHeight(17)
self.doCheckLine(req, 50, vl, [1, 0, 2], [1, 1, 1], Qgis.GeometryType.Polygon)
self.doCheckLine(
req, 50, vl, [[(1, 1), (0, 1), (2, 1)]], Qgis.GeometryType.Polygon
)

# check no terrain + no extrusion
vl.elevationProperties().setClamping(Qgis.AltitudeClamping.Absolute)
vl.elevationProperties().setExtrusionEnabled(False)
vl.elevationProperties().setZOffset(5.0)
self.doCheckLine(req, 50, vl, [1, 0, 2], [1, 1, 1], Qgis.GeometryType.Line)
self.doCheckLine(
req, 50, vl, [[(1, 1), (0, 1), (2, 1)]], Qgis.GeometryType.Line
)

@unittest.skipIf(
Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() == 11,
"Unreliable GEOS minor version found",
)
def testPolygonGenerationFeature(self):
vl = QgsVectorLayer(os.path.join(unitTestDataPath(), "3d", "buildings.shp"))
self.assertTrue(vl.isValid())
Expand Down Expand Up @@ -3162,128 +3186,93 @@ def testPolygonGenerationFeature(self):
req,
1,
vl,
[168, 206, 210, 284, 306, 321],
[1, 1, 1, 1, 1, 1],
[[(168, 1), (206, 1), (210, 1), (284, 1), (306, 1), (321, 1)]],
Qgis.GeometryType.Line,
)

if Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() <= 10:
self.doCheckLine(
req,
10,
vl,
[168, 172, 206, 210, 231, 267, 275, 282, 284, 306, 307, 319, 321],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
self.doCheckLine(
req,
11,
vl,
self.doCheckLine(
req,
10,
vl,
[
[
168,
172,
206,
210,
231,
255,
267,
275,
282,
283,
284,
306,
307,
319,
321,
(168, 1),
(172, 1),
(206, 1),
(210, 1),
(231, 1),
(267, 1),
(275, 1),
(282, 1),
(284, 1),
(306, 1),
(307, 1),
(319, 1),
(321, 1),
],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
elif Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() == 11:
self.doCheckLine(
req,
9,
vl,
[168, 172, 206, 210, 231, 267, 275, 282, 284, 306, 307, 319, 321],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
self.doCheckLine(
req,
10,
vl,
[168, 172, 206, 210, 231, 267, 275, 282, 283, 284, 306, 307, 319, 321],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
elif Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() == 12:
self.doCheckLine(
req,
10,
vl,
[168, 172, 206, 210, 231, 267, 275, 282, 283, 284, 306, 307, 319, 321],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
self.doCheckLine(
req,
11,
vl,
[
168,
172,
206,
210,
231,
237,
255,
267,
275,
282,
283,
284,
306,
307,
319,
321,
(168, 1),
(172, 1),
(206, 1),
(210, 1),
(231, 1),
(267, 1),
(275, 1),
(282, 1),
(283, 1),
(284, 1),
(306, 1),
(307, 1),
(319, 1),
(321, 1),
],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
elif Qgis.geosVersionMajor() == 3 and Qgis.geosVersionMinor() >= 13:
self.doCheckLine(
req,
10,
vl,
[168, 172, 206, 210, 231, 267, 275, 282, 284, 306, 307, 319, 321],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
self.doCheckLine(
req,
11,
vl,
],
Qgis.GeometryType.Line,
)

self.doCheckLine(
req,
11,
vl,
[
[
168,
172,
206,
210,
231,
255,
267,
275,
282,
283,
284,
306,
307,
319,
321,
(168, 1),
(172, 1),
(206, 1),
(210, 1),
(231, 1),
(255, 1),
(267, 1),
(275, 1),
(282, 1),
(283, 1),
(284, 1),
(306, 1),
(307, 1),
(319, 1),
(321, 1),
],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
Qgis.GeometryType.Line,
)
[
(168, 1),
(172, 1),
(206, 1),
(210, 1),
(231, 1),
(237, 1),
(255, 1),
(267, 1),
(275, 1),
(282, 1),
(283, 1),
(284, 1),
(306, 1),
(307, 1),
(319, 1),
(321, 1),
],
],
Qgis.GeometryType.Line,
)

def testPolyhedralSurfaceGenerationFeature(self):
# Create a Vector Layer and add a polyhedralSurface feature
Expand Down
Loading