aps-agent/tests/golden/test_algolib_catalog.py

81 lines
3.6 KiB
Python
Raw Permalink Normal View History

# ============================================================
# 算法库目录完整性黄金测试(plan.md §9.5 / 矩阵 86 行剩余项)
# 覆盖:A-E 五类齐全、ML/元启发目录资产如实登记(available=False)、
# LNS 随 round-36 交付翻转为真实可用、健康检查如实报告。
# ============================================================
from __future__ import annotations
from server.agent_core.algolib import get_algolib, reset_algolib_registry
def _registry():
reset_algolib_registry()
return get_algolib()
def test_catalog_covers_all_five_categories():
"""A-E 五类算法资产目录齐全。"""
reg = _registry()
items = reg.list()
assert {it["category"] for it in items} == {"A", "B", "C", "D", "E"}
for cat in "ABCDE":
assert any(it["category"] == cat for it in items), f"缺少 {cat} 类资产"
# 启发式/精确/元启发/ML/集成各有代表
assert any(it["algo_id"].startswith("rule.") for it in items)
assert any(it["algo_id"] in ("cp_sat", "milp") for it in items)
assert any(it["category"] == "C" for it in items) # 元启发
assert any(it["category"] == "D" for it in items) # ML
assert any(it["category"] == "E" for it in items) # 集成
def test_ml_and_metahueristic_assets_registered_truthfully():
"""ML/元启发目录资产如实登记:未落地 available=False,健康检查报告未就绪。"""
reg = _registry()
for algo_id in ("milp", "ml.worktime_regression", "ml.due_date_survival"):
item = reg.get(algo_id)
assert item is not None, f"{algo_id} 未登记"
assert item["available"] is False, f"{algo_id} 未落地却宣称可用"
assert item["entrypoint"] in ("", None) # 无真实入口
health = {h["algo_id"]: h for h in reg.health()}
assert "ok" in health["ml.worktime_regression"]
def test_lns_flipped_to_available_after_round36():
"""LNS 已交付(round-36 lns.py)→ 目录 available=True + 入口 + 黄金测试。"""
reg = _registry()
lns = reg.get("lns")
assert lns is not None
assert lns["available"] is True
assert lns["entrypoint"] == "server.aps_domain.lns:lns_local_repair"
assert any("test_rush_lns.py" in t for t in lns["golden_tests"])
health = {h["algo_id"]: h for h in reg.health("lns")}
assert health["lns"]["available"] is True
# 查询:available=True 的 C 类资产可被编排器选到
found = reg.query(category="C", available=True)
assert any(it["algo_id"] == "lns" for it in found)
def test_nsga2_flipped_to_available_after_round40():
"""NSGA-II 已交付(round-40 nsga2_engine.py)→ 目录 available=True + 入口 + 黄金测试。"""
reg = _registry()
nsga2 = reg.get("nsga2")
assert nsga2 is not None
assert nsga2["available"] is True
assert nsga2["entrypoint"] == "server.engines.nsga2_engine:solve_nsga2"
assert any("test_nsga2_engine.py" in t for t in nsga2["golden_tests"])
health = {h["algo_id"]: h for h in reg.health("nsga2")}
assert health["nsga2"]["available"] is True
def test_query_filters_and_categories_label():
"""query 过滤与类别标签可用(编排器选型入口)。"""
reg = _registry()
cats = reg.categories()
assert set(cats) == {"A", "B", "C", "D", "E"}
assert "元启发" in cats["C"]
available_only = reg.query(available=True)
assert all(it["available"] is True for it in available_only)
ml = reg.query(category="D")
assert all(it["category"] == "D" for it in ml)
assert ml and all(it["available"] is False for it in ml) # ML 资产如实登记未落地