b509195ee9
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
75 lines
2.2 KiB
Nim
75 lines
2.2 KiB
Nim
import std/unittest
|
|
import std/math
|
|
import ../radar_lock
|
|
|
|
suite "radar_lock":
|
|
|
|
setup:
|
|
init()
|
|
|
|
# Basic lock: radar already on enemy — overshoot pushes it slightly
|
|
test "radar on enemy — returns overshoot only":
|
|
let rate = doRadar(90.0, 90.0)
|
|
check rate == DefaultOvershootDeg
|
|
|
|
# Cardinal directions
|
|
test "lock from 0 degrees":
|
|
let rate = doRadar(0.0, 0.0)
|
|
check rate == DefaultOvershootDeg
|
|
|
|
test "lock from 90 degrees":
|
|
let rate = doRadar(90.0, 90.0)
|
|
check rate == DefaultOvershootDeg
|
|
|
|
test "lock from 180 degrees":
|
|
let rate = doRadar(180.0, 180.0)
|
|
check rate == DefaultOvershootDeg
|
|
|
|
test "lock from 270 degrees":
|
|
let rate = doRadar(270.0, 270.0)
|
|
check rate == DefaultOvershootDeg
|
|
|
|
# Angle wrapping: radar at 350°, enemy at 10° → shortest path is +20°
|
|
test "wrapping 350 to 10 — turns right 20 + overshoot":
|
|
let rate = doRadar(350.0, 10.0)
|
|
check abs(rate - (20.0 + DefaultOvershootDeg)) < 1e-9
|
|
|
|
# Angle wrapping: radar at 10°, enemy at 350° → shortest path is -20°
|
|
test "wrapping 10 to 350 — turns left 20 + overshoot":
|
|
let rate = doRadar(10.0, 350.0)
|
|
check abs(rate - (-20.0 - DefaultOvershootDeg)) < 1e-9
|
|
|
|
# Clamping: enemy 100° away → raw turn+overshoot > 45°, must clamp
|
|
test "clamp positive — large gap":
|
|
let rate = doRadar(0.0, 100.0)
|
|
check rate == 45.0
|
|
|
|
test "clamp negative — large gap":
|
|
let rate = doRadar(100.0, 0.0)
|
|
check rate == -45.0
|
|
|
|
# Overshoot direction: turn right → positive overshoot
|
|
test "overshoot direction right":
|
|
let rate = doRadar(0.0, 30.0) # needs +30°, overshoot adds +5°
|
|
check abs(rate - 35.0) < 1e-9
|
|
|
|
# Overshoot direction: turn left → negative overshoot
|
|
test "overshoot direction left":
|
|
let rate = doRadar(30.0, 0.0) # needs -30°, overshoot adds -5°
|
|
check abs(rate - (-35.0)) < 1e-9
|
|
|
|
# Output never exceeds ±45
|
|
test "output bounded above":
|
|
let rate = doRadar(0.0, 179.0)
|
|
check rate <= 45.0
|
|
|
|
test "output bounded below":
|
|
let rate = doRadar(179.0, 0.0)
|
|
check rate >= -45.0
|
|
|
|
# init() resets overShootDeg
|
|
test "init resets overshoot":
|
|
overShootDeg = 20.0
|
|
init()
|
|
check overShootDeg == DefaultOvershootDeg
|