"""接口2 单元测试:mesh 解析 / MP→OBJ 重排 / 性别贴图映射(不需 SegFormer)。""" import numpy as np from hairline.render import load_ext_mesh, mp_order_to_obj_order from hairline.service import get_texture_map from hairline import constants as C def test_ext_mesh(): uv, ext_faces = load_ext_mesh() assert uv.shape == (502, 2) assert len(ext_faces) == 64 # ribbon 扩展三角形 # 扩展面至少含一个 ≥468 的顶点 assert all(max(f) >= 468 for f in ext_faces) def test_mp_to_obj_anchor_mapping(): """OBJ 序重排后,ribbon 引用的 obj 锚点应映射回 MP_TOP_ANCHORS。""" pts = np.zeros((502, 3), np.float32) pts[:468, 0] = np.arange(468) # 用 x 编码 MP 索引 obj = mp_order_to_obj_order(pts) _uv, ext_faces = load_ext_mesh() obj_anchor_ids = sorted({pi for f in ext_faces for pi in f if pi < 468}) mapped = sorted(int(obj[i, 0]) for i in obj_anchor_ids) # 还原成 MP 索引 assert mapped == sorted(C.MP_TOP_ANCHORS) def test_texture_map(): m = get_texture_map() assert [k for k, _ in m["female"]] == ["ellipse", "flower", "heart", "straight", "wave"] assert [k for k, _ in m["male"]] == ["ellipse", "inverse_arc", "m", "straight"]