holy fuking shit
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
"""评测引擎一致性:时限、状态机、观测判定、幂等与量化(移植自参赛队仓库并扩展)。"""
|
||||
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from dataclasses import replace
|
||||
from threading import Event
|
||||
|
||||
import pytest
|
||||
@@ -9,12 +8,12 @@ import pytest
|
||||
from referee import FieldSpec, LocalSimulator, SimulatorClosed, Source, Spec
|
||||
|
||||
|
||||
def payload(id="e", **extra):
|
||||
return dict(arena_id="default", robot_id="2026001", request_id=id, **extra)
|
||||
def payload(request_id="e", **extra):
|
||||
return dict(arena_id="default", robot_id="2026001", request_id=request_id, **extra)
|
||||
|
||||
|
||||
def measure(id="m", x=0, y=0, channel=1):
|
||||
return payload(id, position=dict(x=x, y=y), channel=channel)
|
||||
def measure(request_id="m", x=0, y=0, channel=1):
|
||||
return payload(request_id, position=dict(x=x, y=y), channel=channel)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- 时限 [题面 附件1 2.5]
|
||||
@@ -92,7 +91,7 @@ def test_error_rejection_does_not_consume_id():
|
||||
sim = LocalSimulator([])
|
||||
for bad in ["e\n", "e\u200b", "e\u0085", "e\ud800"]:
|
||||
assert sim.handle("/enter", payload(bad))[0] == 400
|
||||
assert sim._idempotency == {}
|
||||
assert not sim._idempotency
|
||||
assert sim.handle("/enter", payload())[1]["accepted"]
|
||||
|
||||
|
||||
@@ -181,6 +180,8 @@ def test_huge_numeric_fields_return_bad_request():
|
||||
(dict(arena_id="other", robot_id="2026001", request_id="e"), False),
|
||||
(dict(arena_id="default", robot_id="someone-else", request_id="e"), False),
|
||||
])
|
||||
# pytest 参数化保留 expect 列(用例矩阵可读性),当前断言恒为 False,故不参与断言
|
||||
# pylint: disable-next=unused-argument
|
||||
def test_unknown_fields_and_mismatch_are_business_rejected(body, expect):
|
||||
sim = LocalSimulator([])
|
||||
status, response = sim.handle("/enter", body)
|
||||
@@ -204,12 +205,14 @@ def test_channel_and_position_validation():
|
||||
]
|
||||
for extra in cases:
|
||||
assert sim.handle("/measure", payload("m", **extra))[0] == 400
|
||||
assert sim.handle("/measure", payload("ok", position=dict(x=0, y=0), channel=1.0))[1]["accepted"]
|
||||
assert sim.handle("/measure",
|
||||
payload("ok", position=dict(x=0, y=0), channel=1.0))[1]["accepted"]
|
||||
|
||||
|
||||
def test_actions_before_enter_are_business_rejected():
|
||||
sim = LocalSimulator([])
|
||||
for path, body in [("/measure", measure()), ("/clear", payload("c", position=dict(x=0, y=0), channel=1)),
|
||||
for path, body in [("/measure", measure()),
|
||||
("/clear", payload("c", position=dict(x=0, y=0), channel=1)),
|
||||
("/exit", payload("x"))]:
|
||||
status, response = sim.handle(path, body)
|
||||
assert status == 200 and response["accepted"] is False
|
||||
@@ -224,7 +227,8 @@ def test_clear_rules():
|
||||
assert ok["clear_result"] == "success"
|
||||
again = sim.handle("/clear", payload("c5b", position=dict(x=10, y=0), channel=5))[1]
|
||||
assert again["clear_result"] == "no_target_in_range" # 同一源只能清除一次
|
||||
assert sim.handle("/clear", payload("c6", position=dict(x=15, y=0), channel=6))[1]["clear_result"] == "success"
|
||||
cleared = sim.handle("/clear", payload("c6", position=dict(x=15, y=0), channel=6))[1]
|
||||
assert cleared["clear_result"] == "success"
|
||||
miss = sim.handle("/clear", payload("c9", position=dict(x=0, y=0), channel=9))[1]
|
||||
assert miss["clear_result"] == "no_target_in_range"
|
||||
assert sim.channel == 1 # /clear 不切换测向机频道 [题面 附件1 2.3]
|
||||
@@ -238,15 +242,20 @@ def test_measure_observation_matrix():
|
||||
sim = LocalSimulator(sources, error_half_deg=0.0)
|
||||
sim.handle("/enter", payload("enter"))
|
||||
# 超出有效接收半径
|
||||
assert sim.handle("/measure", measure("a", -600, 0, channel=1))[1]["measure_result"] == "no_signal"
|
||||
assert sim.handle("/measure",
|
||||
measure("a", -600, 0, channel=1))[1]["measure_result"] == "no_signal"
|
||||
# 接收半径边界:distance == r_eff 仍有信号 [题面 附件2 2.1 "超过"]
|
||||
assert sim.handle("/measure", measure("b", -500, 0, channel=1))[1]["measure_result"] == "direction"
|
||||
assert sim.handle("/measure",
|
||||
measure("b", -500, 0, channel=1))[1]["measure_result"] == "direction"
|
||||
# 覆盖角边界:源2 朝东,正东方向(bearing=0°)恰在 ±90° 覆盖内
|
||||
assert sim.handle("/measure", measure("c", 200, 0, channel=2))[1]["measure_result"] == "direction"
|
||||
assert sim.handle("/measure",
|
||||
measure("c", 200, 0, channel=2))[1]["measure_result"] == "direction"
|
||||
# 覆盖角边界:bearing=90°(正北)仍在覆盖内(含边界)[题面 附件2 2.2]
|
||||
assert sim.handle("/measure", measure("c2", 100, 100, channel=2))[1]["measure_result"] == "direction"
|
||||
assert sim.handle("/measure",
|
||||
measure("c2", 100, 100, channel=2))[1]["measure_result"] == "direction"
|
||||
# 覆盖角外(bearing≈135° > 90°):无信号
|
||||
assert sim.handle("/measure", measure("d", 90, 10, channel=2))[1]["measure_result"] == "no_signal"
|
||||
assert sim.handle("/measure",
|
||||
measure("d", 90, 10, channel=2))[1]["measure_result"] == "no_signal"
|
||||
# 距离过近:不返回 svd_deg [题面 附件2 2.4]
|
||||
near = sim.handle("/measure", measure("near", 998, 0, channel=1))[1]
|
||||
assert near["measure_result"] == "near" and "svd_deg" not in near
|
||||
|
||||
Reference in New Issue
Block a user