neon-sprawl/client/test
VinPropane ee572e3661 NEO-24: client tab-target + lock HUD synced to server
Adds `TargetSelectionClient` (Godot, HTTP to NEO-23 targeting endpoints):
- Tab cycles ids in ascending order matching `PrototypeTargetRegistry`
  (`prototype_target_alpha`, `prototype_target_beta`) and wraps.
- Esc clears by POSTing with `targetId` omitted.
- UI always paints from the server's authoritative `targetState`
  (success and denials alike); `UICanvas/TargetLockLabel` shows
  `lockedTargetId`, `validity`, `sequence`, and (on deny) `reasonCode`.
- Movement-triggered refresh: while a lock is held, subsequent
  `authoritative_position_received` snaps fire a throttled GET
  (~250 ms cooldown) so `validity` flips to `out_of_range` after
  locomotion without duplicating server radius math on the client.

Registers `target_tab` (Tab) / `target_clear` (Esc) in `project.godot`;
documents bindings + manual QA in `client/README.md`.

Tests: `target_selection_client_test.gd` covers GET parse, tab ordering
from empty/alpha/wrap, POST body shape, denial preserves server state,
clear omits targetId, movement refresh fires only while locked, cooldown
collapses bursts to one GET, and `apply_as_snap=false` is ignored.
All 85 client GdUnit cases pass; gdlint and gdformat clean.

See `docs/plans/NEO-24-implementation-plan.md`.
2026-04-21 22:14:16 -04:00
..
camera_state_test.gd NEON-25: isometric follow camera, CameraState, tests, and docs 2026-04-07 23:46:04 -04:00
camera_state_test.gd.uid NEON-25: isometric follow camera, CameraState, tests, and docs 2026-04-07 23:46:04 -04:00
ground_pick_test.gd.uid NS-21: add GdUnit4, client tests, and CI headless run 2026-04-06 22:08:37 -04:00
isometric_follow_camera_test.gd chore: point docs and rules at Linear NEO issue ids 2026-04-13 13:15:32 -04:00
isometric_follow_camera_test.gd.uid NEON-25: isometric follow camera, CameraState, tests, and docs 2026-04-07 23:46:04 -04:00
occlusion_policy_test.gd chore: point docs and rules at Linear NEO issue ids 2026-04-13 13:15:32 -04:00
occlusion_policy_test.gd.uid NEON-27: finalise review (Approved) + Godot uid files 2026-04-08 23:55:29 -04:00
player_idle_support_test.gd NEON-29: Fix CI tests (horizontal step flag, idle_support vectors) 2026-04-15 23:57:13 -04:00
player_idle_support_test.gd.uid NEON-29: Fix gdlint (player returns/lines, split idle tests, gdlintrc cap) 2026-04-15 23:48:15 -04:00
player_locomotion_wasd_test.gd NEO-22: Fix locomotion test static calls for GDScript + LSP 2026-04-17 20:24:16 -04:00
player_locomotion_wasd_test.gd.uid NEO-22: Add Godot .uid sidecars for WASD locomotion scripts 2026-04-17 20:51:16 -04:00
player_test.gd NEO-22: add move-stream API and WASD client locomotion 2026-04-17 19:21:33 -04:00
player_test.gd.uid NS-21: add GdUnit4, client tests, and CI headless run 2026-04-06 22:08:37 -04:00
position_authority_client_test.gd NEO-22: Extract WASD locomotion for gdlint max-file-lines 2026-04-17 20:13:36 -04:00
position_authority_client_test.gd.uid NS-21: add GdUnit4, client tests, and CI headless run 2026-04-06 22:08:37 -04:00
position_authority_test_double.gd NS-21: add GdUnit4, client tests, and CI headless run 2026-04-06 22:08:37 -04:00
position_authority_test_double.gd.uid NS-21: add GdUnit4, client tests, and CI headless run 2026-04-06 22:08:37 -04:00
target_selection_client_test.gd NEO-24: client tab-target + lock HUD synced to server 2026-04-21 22:14:16 -04:00
target_selection_client_test.gd.uid NEO-24: client tab-target + lock HUD synced to server 2026-04-21 22:14:16 -04:00
target_selection_test_double.gd NEO-24: client tab-target + lock HUD synced to server 2026-04-21 22:14:16 -04:00
target_selection_test_double.gd.uid NEO-24: client tab-target + lock HUD synced to server 2026-04-21 22:14:16 -04:00
zoom_band_config_test.gd chore: point docs and rules at Linear NEO issue ids 2026-04-13 13:15:32 -04:00
zoom_band_config_test.gd.uid NEON-26: ZoomBandConfig, discrete zoom input, CameraState sync 2026-04-08 22:32:45 -04:00