"""方案 B 定位逻辑的真值测试(合成 mask,纯 numpy,无需 torch)。""" import numpy as np from face_analysis.hair_segmenter import locate_hairline_by_segmentation def test_locate_on_synthetic_mask(): """已知头发上沿 row=10、中轴线发际线 row=80,应被精确定位。""" H, W = 200, 100 cx = W // 2 mask = np.zeros((H, W), dtype=bool) mask[10:51, :] = True # 顶部头发块,最高点 row=10 mask[10:81, cx - 1:cx + 2] = True # 中轴线碎发延伸到 row=80 res = locate_hairline_by_segmentation(mask, cx, H) assert res is not None hairline_y, hair_top_y = res assert hairline_y == 80 assert hair_top_y == 10 assert hair_top_y < hairline_y def test_locate_none_on_empty(): assert locate_hairline_by_segmentation(None, 50, 200) is None assert locate_hairline_by_segmentation(np.zeros((200, 100), bool), 50, 200) is None def test_locate_handles_out_of_range_x(): """brow_center_x 越界应被夹回,不抛异常。""" H, W = 100, 60 mask = np.zeros((H, W), dtype=bool) mask[5:30, :] = True assert locate_hairline_by_segmentation(mask, 9999, H) is not None assert locate_hairline_by_segmentation(mask, -50, H) is not None