Critical: - deactivate_insert() now called when selecting non-Insert spoke, cancelling with no selection, or pressing Escape while insert is active. Fixes simulation staying paused permanently after Insert. Warnings: - Checklist conditions with empty id excluded from get_results() and get_total_count() — prevents impossible-to-complete checklists. Warns at load time when empty-id conditions are found. - _content_base now checks res://content/ first (exported builds), falls back to ../content for editor/dev mode. - 26 new tests for D-054 functions: _angle_to_octant (8 octants), _snap_to_octant_dir (9 cases incl. zero/tiny), _wasd_to_world_dir (8 facing/movement combos). New test file: test_input_mapper_facing.gd. Suggestions: - Cached get_theme_default_font() in checklist overlay _ready(). - Documented InputMapper → GameState coupling as intentional. - Documented YAML parser # truncation limitation. - _insert_active reset on Escape dismiss (Tyre #3). - SimBridge test mode SetFacing reads action_data.facing instead of InputMapper global (Tyre #4). - Removed dead _facing_to_rotation() from entity_renderer.gd (Tyre #5). - Fixed 2 failing facing indicator tests to use InputMapper.facing_angle instead of GameState.player_facing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
123 lines
4.8 KiB
GDScript
123 lines
4.8 KiB
GDScript
## D-054 facing and movement tests — _angle_to_octant, _snap_to_octant_dir,
|
|
## _wasd_to_world_dir coverage. All functions are static or use only facing_angle.
|
|
##
|
|
## Spec ref: D-054 (mouse-relative facing), Sprint 10 Completion Proof.
|
|
class_name TestInputMapperFacing
|
|
extends GdUnitTestSuite
|
|
|
|
|
|
# -- _angle_to_octant ----------------------------------------------------------
|
|
|
|
func test_angle_to_octant_east() -> void:
|
|
assert_str(InputMapper._angle_to_octant(0.0)).is_equal("East")
|
|
|
|
func test_angle_to_octant_north() -> void:
|
|
assert_str(InputMapper._angle_to_octant(-PI / 2.0)).is_equal("North")
|
|
|
|
func test_angle_to_octant_south() -> void:
|
|
assert_str(InputMapper._angle_to_octant(PI / 2.0)).is_equal("South")
|
|
|
|
func test_angle_to_octant_west() -> void:
|
|
assert_str(InputMapper._angle_to_octant(PI)).is_equal("West")
|
|
|
|
func test_angle_to_octant_northeast() -> void:
|
|
assert_str(InputMapper._angle_to_octant(-PI / 4.0)).is_equal("Northeast")
|
|
|
|
func test_angle_to_octant_southeast() -> void:
|
|
assert_str(InputMapper._angle_to_octant(PI / 4.0)).is_equal("Southeast")
|
|
|
|
func test_angle_to_octant_southwest() -> void:
|
|
assert_str(InputMapper._angle_to_octant(3.0 * PI / 4.0)).is_equal("Southwest")
|
|
|
|
func test_angle_to_octant_northwest() -> void:
|
|
assert_str(InputMapper._angle_to_octant(-3.0 * PI / 4.0)).is_equal("Northwest")
|
|
|
|
|
|
# -- _snap_to_octant_dir -------------------------------------------------------
|
|
|
|
func test_snap_east() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(1.0, 0.0))).is_equal(Vector2i(1, 0))
|
|
|
|
func test_snap_north() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(0.0, -1.0))).is_equal(Vector2i(0, -1))
|
|
|
|
func test_snap_south() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(0.0, 1.0))).is_equal(Vector2i(0, 1))
|
|
|
|
func test_snap_west() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(-1.0, 0.0))).is_equal(Vector2i(-1, 0))
|
|
|
|
func test_snap_northeast() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(0.7, -0.7))).is_equal(Vector2i(1, -1))
|
|
|
|
func test_snap_southwest() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(-0.7, 0.7))).is_equal(Vector2i(-1, 1))
|
|
|
|
func test_snap_zero_returns_zero() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2.ZERO)).is_equal(Vector2i.ZERO)
|
|
|
|
func test_snap_tiny_returns_zero() -> void:
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(0.001, 0.0))).is_equal(Vector2i.ZERO)
|
|
|
|
func test_snap_diagonal_bias() -> void:
|
|
# Slightly more east than north — should snap to northeast
|
|
assert_object(InputMapper._snap_to_octant_dir(Vector2(0.8, -0.6))).is_equal(Vector2i(1, -1))
|
|
|
|
|
|
# -- _wasd_to_world_dir --------------------------------------------------------
|
|
|
|
func test_wasd_forward_facing_east() -> void:
|
|
# W pressed, facing east → move east
|
|
InputMapper.facing_angle = 0.0 # East
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(0, -1))
|
|
assert_object(result).is_equal(Vector2i(1, 0))
|
|
|
|
func test_wasd_forward_facing_north() -> void:
|
|
# W pressed, facing north → move north
|
|
InputMapper.facing_angle = -PI / 2.0 # North
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(0, -1))
|
|
assert_object(result).is_equal(Vector2i(0, -1))
|
|
|
|
func test_wasd_backward_facing_north() -> void:
|
|
# S pressed, facing north → move south
|
|
InputMapper.facing_angle = -PI / 2.0 # North
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(0, 1))
|
|
assert_object(result).is_equal(Vector2i(0, 1))
|
|
|
|
func test_wasd_strafe_right_facing_north() -> void:
|
|
# D pressed, facing north → move east
|
|
InputMapper.facing_angle = -PI / 2.0 # North
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(1, 0))
|
|
assert_object(result).is_equal(Vector2i(1, 0))
|
|
|
|
func test_wasd_strafe_left_facing_north() -> void:
|
|
# A pressed, facing north → move west
|
|
InputMapper.facing_angle = -PI / 2.0 # North
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(-1, 0))
|
|
assert_object(result).is_equal(Vector2i(-1, 0))
|
|
|
|
func test_wasd_forward_facing_south() -> void:
|
|
# W pressed, facing south → move south
|
|
InputMapper.facing_angle = PI / 2.0 # South
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(0, -1))
|
|
assert_object(result).is_equal(Vector2i(0, 1))
|
|
|
|
func test_wasd_diagonal_forward_right_facing_east() -> void:
|
|
# W+D pressed, facing east → move southeast
|
|
InputMapper.facing_angle = 0.0 # East
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(1, -1))
|
|
assert_object(result).is_equal(Vector2i(1, 1))
|
|
|
|
func test_wasd_strafe_right_facing_west() -> void:
|
|
# D pressed, facing west → move north
|
|
InputMapper.facing_angle = PI # West
|
|
var result := InputMapper._wasd_to_world_dir(Vector2i(1, 0))
|
|
assert_object(result).is_equal(Vector2i(0, -1))
|
|
|
|
|
|
func after_test() -> void:
|
|
# Reset facing to default
|
|
InputMapper.facing_angle = -PI / 2.0
|
|
InputMapper.facing_octant = "North"
|
|
InputMapper._last_sent_octant = "North"
|