Files
mcm-26-b/referee/tests/test_timing_examples.py
2026-09-12 01:56:34 +08:00

46 lines
2.2 KiB
Python

"""计时锚点:附件1 表2 / 附件2 第10节示例必须逐步复现 105/111/194/199。"""
from referee import CostBreakdown, LocalSimulator, Source, clear_cost, measure_cost
from referee.timing import move_time
def payload(request_id="e", **extra):
return dict(arena_id="default", robot_id="2026001", request_id=request_id, **extra)
def measure(request_id="m", x=0, y=0, channel=1):
return payload(request_id, position=dict(x=x, y=y), channel=channel)
def test_attachment_timing_example():
"""附件2 第10节:(0,0)→(300,400) 检测ch1 → 原地检测ch2 → (300,0)清除ch3(未发现)
→ 原地检测ch2 → /exit,虚拟时刻 105/111/194/199。"""
sim = LocalSimulator([Source(3, 10_000, 10_000, 1500)]) # 远源,保证"未发现"
sim.handle("/enter", payload())
assert sim.handle("/measure", measure("m1", 300, 400))[1]["virtual_time_s"] == 105
assert sim.handle("/measure", measure("m2", 300, 400, channel=2))[1]["virtual_time_s"] == 111
clear = payload("c1", position=dict(x=300, y=0), channel=3)
assert sim.handle("/clear", clear)[1]["virtual_time_s"] == 194
assert sim.handle("/measure", measure("m3", 300, 0, channel=2))[1]["virtual_time_s"] == 199
exit_info = sim.handle("/exit", payload("x"))[1]
assert exit_info["virtual_time_s"] == 199
assert exit_info["exit_reason"] == "user_exit"
def test_cost_breakdown_components():
breakdown = measure_cost((0, 0), (300, 400), 1, 1)
assert (breakdown.move_s, breakdown.switch_s, breakdown.action_s) == (100.0, 0.0, 5.0)
breakdown = measure_cost((300, 400), (300, 400), 1, 2)
assert (breakdown.move_s, breakdown.switch_s, breakdown.action_s) == (0.0, 1.0, 5.0)
assert clear_cost((300, 400), (300, 0), success=False).action_s == 3.0
assert clear_cost((300, 0), (300, 0), success=True).action_s == 5.0
assert move_time((0, 0), (0, 50)) == 10.0
def test_microsecond_quantization_is_per_segment():
"""逐段按整数微秒量化后累计 [题面 附件2 4.1],而非先加和再量化。"""
parts = CostBreakdown(move_s=0.0000004, switch_s=0.0000004, action_s=0.0000004)
assert parts.total_us == 0 + 0 + 0
parts = CostBreakdown(move_s=0.0000006, switch_s=0.0000006, action_s=0.0000006)
assert parts.total_us == 3