"""计时锚点:附件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