agrovision / tests /unit /test_geometry.py
alexp97's picture
feat(core): esquemas de dominio y motores puros NDVI/GSD/densidad (Fase 1)
603f109
Raw
History Blame Contribute Delete
1.63 kB
"""
Archivo: test_geometry.py
Fecha de modificación: 03/06/2026
Autor: Equipo AgroVisión
Descripción:
Pruebas unitarias de las funciones geométricas puras (Fase 1): distancia de muestreo
terrestre (GSD), densidad por hectárea y área geodésica de un polígono lon/lat.
Ejemplo de Integración:
uv run python -m pytest tests/unit/test_geometry.py
"""
from __future__ import annotations
from backend.core.geometry import density_per_ha, geodesic_area_m2, gsd_cm_per_px
def test_gsd_valor_conocido() -> None:
"""GSD = (sensor*altura)/(focal*ancho)*100; caso redondo -> 10 cm/px."""
g = gsd_cm_per_px(sensor_w_mm=10, flight_h_m=100, focal_mm=10, img_w_px=1000)
assert g == 10.0
def test_density_per_ha_una_hectarea() -> None:
"""100 plantas en 10.000 m² (1 ha) -> 100 pl/Ha."""
assert density_per_ha(100, 10_000) == 100.0
def test_density_per_ha_area_cero() -> None:
"""Área cero no debe dividir por cero; devuelve 0.0."""
assert density_per_ha(5, 0) == 0.0
def test_geodesic_area_caja_un_grado_cerca_ecuador() -> None:
"""Una caja de 1°x1° cerca del ecuador mide ~1.23e10 m² (≈12.300 km²)."""
box = [[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]
area = geodesic_area_m2(box)
assert 1.1e10 < area < 1.4e10
def test_geodesic_area_independiente_del_sentido() -> None:
"""El área no depende del sentido de giro del polígono (se toma valor absoluto)."""
horario = [[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]
antihorario = [[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]
assert round(geodesic_area_m2(horario), 2) == round(geodesic_area_m2(antihorario), 2)