from genomeloom.composer import can_compose, repair_hints def test_can_compose_ok(): a = {"capabilities": ["net"], "resource_envelope": {"cpu": 1, "memory": 128}, "invariants": ["mode=readonly"]} b = {"capabilities": ["storage"], "resource_envelope": {"cpu": 1, "memory": 128}, "invariants": ["mode=readonly"]} ok, details = can_compose(a, b, target_budget={"cpu": 4, "memory": 512}) assert ok assert details["cap_conflicts"] == [] def test_can_compose_cap_conflict(): a = {"capabilities": ["net"], "resource_envelope": {"cpu": 2}} b = {"capabilities": ["net"], "resource_envelope": {"cpu": 2}} ok, details = can_compose(a, b, target_budget={"cpu": 3}) assert not ok assert "net" in details["cap_conflicts"] hints = repair_hints(details) assert any("capability" in h or "Remove" in h for h in hints) def test_can_compose_budget_violation(): a = {"capabilities": ["a"], "resource_envelope": {"cpu": 2}} b = {"capabilities": ["b"], "resource_envelope": {"cpu": 3}} ok, details = can_compose(a, b, target_budget={"cpu": 4}) assert not ok assert "cpu" in details["budget_violations"] hints = repair_hints(details) assert any("Reduce 'cpu'" in h for h in hints)