aps-agent/tests/golden/test_algolib_catalog.py

81 lines
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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