import sys from pathlib import Path import numpy as np import pytest # Ensure project root is on the import path when tests run directly. ROOT = Path(__file__).resolve().parents[1] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from backend.py.app.inference.classical import detect_classical from backend.py.app.inference.dl import detect_dl def _synthetic_edge_image(size: int = 64) -> np.ndarray: img = np.zeros((size, size, 3), dtype=np.uint8) img[size // 4 : 3 * size // 4, size // 4, :] = 255 img[size // 4 : 3 * size // 4, 3 * size // 4, :] = 255 img[size // 4, size // 4 : 3 * size // 4, :] = 255 img[3 * size // 4, size // 4 : 3 * size // 4, :] = 255 return img def test_detect_classical_edges_highlights_pixels(): img = _synthetic_edge_image() overlay, meta = detect_classical( img, detector="Edges (Canny)", canny_low=50, canny_high=150, harris_k=0.04, harris_block=2, harris_ksize=3, hough_thresh=50, hough_min_len=10, hough_max_gap=5, ellipse_min_area=100, max_ellipses=1, line_detector="hough", ) assert overlay.shape == img.shape assert overlay.dtype == np.uint8 assert meta["num_edge_pixels"] > 0 # Expect some pixels painted green in RGB space. assert np.any(np.all(overlay == np.array([0, 255, 0], dtype=np.uint8), axis=-1)) def test_detect_dl_dexined_morphological_thinning_default(): img = _synthetic_edge_image() overlay, meta = detect_dl(img, detector="Edges (Canny)", model_choice="dexined.onnx", params={}) assert overlay.shape == img.shape assert overlay.dtype == np.uint8 assert meta.get("error") is None assert meta["adapter"] == "dexined" assert 0.0 <= meta["edge_prob_mean"] <= 1.0 assert meta["fuse_min"] <= meta["edge_prob_mean"] <= meta["fuse_max"] assert 0.0 <= meta["edge_map_mean"] <= 1.0 assert 0.0 <= meta["edge_map_std"] <= 1.0 assert meta["model_path"].endswith("dexined.onnx") assert meta["dexined_use_marching_squares"] is False assert meta["dexined_threshold_mode"] == "adaptive" assert 0.0 <= meta["dexined_threshold"] <= 1.0 assert meta.get("skeleton_pixels", 0) > 0 assert meta.get("subpixel_points", 0) >= 0 assert np.any(np.all(overlay == np.array([0, 255, 0], dtype=np.uint8), axis=-1)) def test_detect_dl_dexined_marching_squares_with_fixed_threshold(): img = _synthetic_edge_image() params = { "dexined_use_marching_squares": True, "dexined_threshold_mode": "fixed", "dexined_threshold_value": 0.05, } overlay, meta = detect_dl(img, detector="Edges (Canny)", model_choice="dexined.onnx", params=params) assert overlay.shape == img.shape assert overlay.dtype == np.uint8 assert meta.get("error") is None assert meta["dexined_use_marching_squares"] is True assert meta["dexined_threshold_mode"] == "fixed" assert meta["dexined_threshold"] == pytest.approx(0.05, abs=1e-4) assert meta.get("marching_squares_segments", 0) >= 0 if meta.get("marching_squares_segments", 0): assert "marching_squares_samples" in meta greenish = (overlay[..., 1] > overlay[..., 0] + 10) & (overlay[..., 1] > overlay[..., 2] + 10) assert np.count_nonzero(greenish) > 0