81 lines
3.6 KiB
Python
81 lines
3.6 KiB
Python
# ============================================================
|
||
# 算法库目录完整性黄金测试(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 资产如实登记未落地
|