S1005403_RisCC/tests/test_command_ris_roundtrip.py

66 lines
2.3 KiB
Python

import math
from target_simulator.core.command_builder import build_tgtinit
from target_simulator.core.models import Waypoint, Target, NM_TO_FT
METERS_PER_NM = 1852.0
def test_build_tgtinit_contains_parameters():
wp = Waypoint(
maneuver_type=Waypoint.maneuver_type, # placeholder, not used by builder
target_range_nm=30.0,
target_azimuth_deg=10.0,
target_altitude_ft=10000.0,
target_velocity_fps=506.34,
target_heading_deg=25.0,
)
t = Target(target_id=0, trajectory=[wp])
# Make sure flags are set as expected
t.active = True
t.traceable = True
t.restart = True
# Set current kinematics to match waypoint (build_tgtinit reads current_* fields)
t.current_range_nm = 30.0
t.current_azimuth_deg = 10.0
t.current_heading_deg = 25.0
t.current_altitude_ft = 10000.0
t.current_velocity_fps = 506.34
cmd = build_tgtinit(t)
# command should start with tgtinit and contain the numeric fields in order
parts = cmd.split()
assert parts[0] == "tgtinit"
assert parts[1] == "0"
assert parts[2] == "30.00"
assert parts[3] == "10.00"
# velocity is formatted as fps
assert parts[4] == "506.34"
assert parts[5] == "25.00"
assert parts[6] == "10000.00"
# qualifiers should contain /s /t /r (order may vary for /r appended)
qualifiers = parts[7:]
assert "/s" in qualifiers
assert "/t" in qualifiers
assert "/r" in qualifiers
def test_command_to_ris_coordinate_roundtrip():
"""Simula il percorso: command params -> RIS coords (meters) -> GUI azimuth -> reconstruct coords.
Verifica che la ricostruzione torni alle stesse coordinate (round-trip) entro tolleranza.
"""
range_nm = 40.0
az_deg = 20.0
alt_ft = 10000.0
# Simulate server: produce RIS X,Y in meters using conventional conversion
rad = math.radians(az_deg)
x_m = range_nm * METERS_PER_NM * math.sin(rad)
y_m = range_nm * METERS_PER_NM * math.cos(rad)
# GUI receives x_m,y_m and computes az_gui = degrees(atan2(y,x)).
# Given server uses x = R*sin(az) and y = R*cos(az),
# az_gui should equal (90° - az) modulo 360.
az_gui = math.degrees(math.atan2(y_m, x_m)) % 360
expected = (90.0 - az_deg) % 360
assert math.isclose(az_gui, expected, rel_tol=1e-9, abs_tol=1e-6)