122 lines
5.0 KiB
Python
122 lines
5.0 KiB
Python
"""Tests de l'export PDF (planche d'impression terrain)."""
|
|
|
|
import pytest
|
|
|
|
|
|
def test_layout_landscape_a4_dimensions():
|
|
from lidar_pipeline.export_pdf import layout
|
|
lay = layout("A4", "paysage", 2000)
|
|
assert (lay.page_w, lay.page_h) == (297.0, 210.0) and lay.dpi == 300
|
|
assert lay.map_w > 150 and lay.map_h > 150
|
|
assert lay.panel_x >= lay.map_x + lay.map_w # bandeau à droite
|
|
assert lay.map_x + lay.map_w <= lay.page_w and lay.map_y + lay.map_h <= lay.page_h
|
|
|
|
|
|
def test_layout_portrait_a3_panel_below():
|
|
from lidar_pipeline.export_pdf import layout
|
|
lay = layout("A3", "portrait", 5000)
|
|
assert (lay.page_w, lay.page_h) == (297.0, 420.0) and lay.dpi == 250
|
|
assert lay.panel_y + lay.panel_h <= lay.map_y # bandeau en bas
|
|
|
|
|
|
@pytest.mark.parametrize("args", [("A5", "paysage", 2000), ("A4", "biais", 2000),
|
|
("A4", "paysage", 1234)])
|
|
def test_layout_rejects_invalid(args):
|
|
from lidar_pipeline.export_pdf import layout
|
|
with pytest.raises(ValueError):
|
|
layout(*args)
|
|
|
|
|
|
def test_map_bbox_matches_paper_times_scale():
|
|
from lidar_pipeline.export_pdf import layout, map_bbox
|
|
lay = layout("A4", "paysage", 2000)
|
|
b = map_bbox(652500.0, 6861500.0, lay)
|
|
assert abs((b[2] - b[0]) - lay.map_w / 1000 * 2000) < 1e-6
|
|
assert abs((b[3] - b[1]) - lay.map_h / 1000 * 2000) < 1e-6
|
|
assert abs((b[0] + b[2]) / 2 - 652500.0) < 1e-6
|
|
|
|
|
|
def test_pixel_size_and_grid_step():
|
|
from lidar_pipeline.export_pdf import grid_step, layout, pixel_size
|
|
assert pixel_size(layout("A4", "paysage", 1000)) == 0.2 # plafonné au natif
|
|
assert abs(pixel_size(layout("A3", "paysage", 10000)) - 10000 * 0.0254 / 250) < 1e-9
|
|
assert [grid_step(s) for s in (1000, 2000, 5000, 10000)] == [100, 100, 500, 1000]
|
|
|
|
|
|
def test_center_l93_rejects_non_finite():
|
|
from lidar_pipeline.export_pdf import center_l93
|
|
with pytest.raises(ValueError):
|
|
center_l93(float("nan"), 2.0)
|
|
|
|
|
|
def test_frame_roundtrip():
|
|
from lidar_pipeline.export_pdf import center_l93, frame
|
|
lat, lon = 48.85, 2.35
|
|
f = frame(lat, lon, "A4", "paysage", 2000)
|
|
cx, cy = center_l93(lat, lon)
|
|
assert abs(f["cx"] - cx) < 1e-6 and abs(f["cy"] - cy) < 1e-6
|
|
assert len(f["corners"]) == 4
|
|
nw, ne, se, sw = f["corners"]
|
|
assert nw[0] > sw[0] and ne[1] > nw[1] # [lat, lon] : nord en haut, est à droite
|
|
assert f["width_m"] > f["height_m"] > 0
|
|
|
|
|
|
def test_export_modules_import_without_numpy():
|
|
import subprocess, sys
|
|
code = ("import sys; sys.modules['numpy'] = None; "
|
|
"import lidar_pipeline.export_pdf, lidar_pipeline.tiles; print('ok')")
|
|
r = subprocess.run([sys.executable, "-c", code], capture_output=True, text=True)
|
|
assert r.returncode == 0, r.stderr
|
|
|
|
|
|
def _dalle(tmp_path, col, row, color=(200, 30, 30), px=100, layer="relief_oriente"):
|
|
from lidar_pipeline import index, tiles
|
|
from lidar_pipeline.tests.test_tiles import _make_dalle
|
|
_make_dalle(tmp_path, col, row, [layer], color=color, px=px)
|
|
tiles.source_index(tmp_path, force=True)
|
|
|
|
|
|
def test_nodata_color_matches_visualizations():
|
|
from lidar_pipeline.export_pdf import NODATA_RGB
|
|
from lidar_pipeline.visualizations import RELIEF_NODATA_RGB
|
|
assert NODATA_RGB == tuple(RELIEF_NODATA_RGB)
|
|
|
|
|
|
def test_compose_l93_full_cell(tmp_path, monkeypatch):
|
|
from lidar_pipeline import index
|
|
from lidar_pipeline.export_pdf import compose_l93
|
|
monkeypatch.setattr(index, "PANEL_VIZ", None)
|
|
_dalle(tmp_path, 1054, 6882)
|
|
img, mask, cells = compose_l93(tmp_path, (1054200.0, 6881200.0, 1054400.0, 6881300.0), 1.0)
|
|
assert img.size == (200, 100) and cells == [(1054, 6882)]
|
|
assert mask.getextrema() == (255, 255)
|
|
r, g, b = img.getpixel((100, 50))
|
|
assert r > 150 and g < 80 and b < 80
|
|
|
|
|
|
def test_compose_l93_half_outside_is_white_hatched(tmp_path, monkeypatch):
|
|
from lidar_pipeline import index
|
|
from lidar_pipeline.export_pdf import compose_l93
|
|
monkeypatch.setattr(index, "PANEL_VIZ", None)
|
|
_dalle(tmp_path, 1054, 6882)
|
|
# moitié ouest dans la dalle, moitié est hors données
|
|
img, mask, cells = compose_l93(tmp_path, (1054900.0, 6881400.0, 1055100.0, 6881500.0), 1.0)
|
|
assert mask.getpixel((50, 50)) == 255 and mask.getpixel((150, 50)) == 0
|
|
east = img.crop((110, 0, 200, 100)).convert("L").getextrema()
|
|
assert east[1] == 255 and east[0] < 255 # blanc + hachures
|
|
|
|
|
|
def test_compose_l93_nodata_pixels_masked(tmp_path, monkeypatch):
|
|
from lidar_pipeline import index
|
|
from lidar_pipeline.export_pdf import NODATA_RGB, compose_l93
|
|
monkeypatch.setattr(index, "PANEL_VIZ", None)
|
|
_dalle(tmp_path, 1054, 6882, color=NODATA_RGB)
|
|
img, mask, cells = compose_l93(tmp_path, (1054200.0, 6881200.0, 1054400.0, 6881300.0), 1.0)
|
|
assert mask.getextrema() == (0, 0)
|
|
|
|
|
|
def test_compose_l93_no_data_returns_empty_cells(tmp_path):
|
|
from lidar_pipeline.export_pdf import compose_l93
|
|
img, mask, cells = compose_l93(tmp_path, (0.0, 0.0, 100.0, 100.0), 1.0)
|
|
assert cells == [] and mask.getextrema() == (0, 0)
|