- Suppression de generate_solar (éclairage solaire) des visualisations - Accélération GPU de hillshade, slope, aspect, curvature, depressions, anomalies, roughness, texture GLCM, flow (sink filling) - Nettoyage mémoire GPU entre visualisations (gpu_cleanup) - Correction OOM texture GLCM: calcul entropie bin par bin au lieu d'un tableau 3D massif sur GPU - Correction bug: xp_minimum_filter manquant dans imports visualizations - Option --file accepte plusieurs noms complets sans extension - run.sh affiche l'aide si appelé sans arguments - Option --test pour exécuter les tests unitaires dans Docker - Filtre ReturnNumber>=1 intégré dans le pipeline PDAL (plus d'erreur SMRF) - 60 tests unitaires: GPU, visualisations, rendering, DTM, pipeline, CLI - Ajout pytest au Dockerfile Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
41 lines
1.7 KiB
Python
41 lines
1.7 KiB
Python
"""Tests for DTM module."""
|
|
|
|
import json
|
|
import pytest
|
|
from pathlib import Path
|
|
|
|
|
|
class TestSMRFPipeline:
|
|
def test_pipeline_json_valid(self):
|
|
"""create_smrf_pipeline produces valid JSON with expected stages."""
|
|
from lidar_pipeline.dtm import create_smrf_pipeline
|
|
result = create_smrf_pipeline("/data/input/test.laz", "/data/output/test_ground.las")
|
|
pipeline = json.loads(result)
|
|
|
|
assert "pipeline" in pipeline
|
|
stages = pipeline["pipeline"]
|
|
|
|
# Should have: reader, range filter (ReturnNumber), SMRF, range filter (Classification), writer
|
|
stage_types = [s.get("type") if isinstance(s, dict) else None for s in stages]
|
|
|
|
# First stage is the filename string (reader)
|
|
assert isinstance(stages[0], str)
|
|
assert "test.laz" in stages[0]
|
|
|
|
# Must contain SMRF filter
|
|
assert "filters.smrf" in stage_types
|
|
|
|
# Must contain ReturnNumber filter
|
|
range_stages = [s for s in stages if isinstance(s, dict) and s.get("type") == "filters.range"]
|
|
assert len(range_stages) >= 1
|
|
# At least one should filter ReturnNumber
|
|
assert any("ReturnNumber" in str(s.get("limits", "")) for s in range_stages)
|
|
|
|
def test_pipeline_output_path(self):
|
|
"""Pipeline output path is set correctly."""
|
|
from lidar_pipeline.dtm import create_smrf_pipeline
|
|
result = create_smrf_pipeline("/input/a.laz", "/output/a_ground.las")
|
|
pipeline = json.loads(result)
|
|
# Last stage should be writer with correct output path
|
|
writer = [s for s in pipeline["pipeline"] if isinstance(s, dict) and s.get("type") == "writers.las"][0]
|
|
assert writer["filename"] == "/output/a_ground.las" |