from __future__ import annotations def test_node_preservation(bundle, weighted_graph): assert set(weighted_graph.nodes) == set(bundle.graph.nodes) def test_edge_preservation(bundle, weighted_graph): assert weighted_graph.number_of_edges() == bundle.graph.number_of_edges() def test_weight_range(weighted_graph): weights = [d["w"] for _, _, d in weighted_graph.edges(data=True)] assert weights, "가중치가 부여된 엣지가 없습니다" assert all(0.0 < w <= 1.0 for w in weights) def test_large_consumer_edges_suppressed(bundle, weighted_graph, baseline, cfg): from blocksys.graph import build_weighted_graph large_nodes = [n for n, d in weighted_graph.nodes(data=True) if d.get("is_large_consumer")] if not large_nodes: return # Net3 기본 설정(5 L/s)에는 대수용가가 없을 수 있음 plain = build_weighted_graph(bundle.graph, baseline, cfg) # 대수용가 인접 엣지는 제약 반영 전보다 가중치가 낮아야 한다(isolate 기본 정책) for n in large_nodes: for u, v, d in weighted_graph.edges(n, data=True): assert d["w"] <= plain[u][v]["w"] def test_reproducibility(bundle, baseline, cfg): from blocksys.graph import apply_hard_constraints, build_weighted_graph g1 = apply_hard_constraints(build_weighted_graph(bundle.graph, baseline, cfg), cfg) g2 = apply_hard_constraints(build_weighted_graph(bundle.graph, baseline, cfg), cfg) for u, v, d in g1.edges(data=True): assert g2[u][v]["w"] == d["w"]