diff --git a/test/unit/test_room_navigator.gd b/test/unit/test_room_navigator.gd new file mode 100644 index 0000000..29e3326 --- /dev/null +++ b/test/unit/test_room_navigator.gd @@ -0,0 +1,91 @@ +## Tests for RoomNavigator — floor/room state and camera navigation logic. +extends GutTest + +const RoomNavigatorScript: GDScript = preload("res://scripts/systems/room_navigator.gd") + +var _nav: Node +var _camera: Camera2D + + +func before_each() -> void: + _nav = RoomNavigatorScript.new() + add_child_autofree(_nav) + _camera = Camera2D.new() + add_child_autofree(_camera) + _nav.initialize(_camera) + + +func test_initial_floor_is_zero() -> void: + assert_eq(_nav.get_current_floor(), 0) + + +func test_initial_room_is_zero() -> void: + assert_eq(_nav.get_current_room(), 0) + + +func test_go_to_room_updates_floor() -> void: + _nav.go_to_room(1, 2) + assert_eq(_nav.get_current_floor(), 1) + + +func test_go_to_room_updates_room() -> void: + _nav.go_to_room(1, 2) + assert_eq(_nav.get_current_room(), 2) + + +func test_go_to_room_same_position_when_already_there_is_noop() -> void: + _nav.go_to_room(1, 2) + var camera_pos: Vector2 = _camera.position + _nav.go_to_room(1, 2) + assert_eq(_camera.position, camera_pos) + + +func test_go_to_floor_navigates_to_room_zero() -> void: + _nav.go_to_floor(2) + assert_eq(_nav.get_current_floor(), 2) + assert_eq(_nav.get_current_room(), 0) + + +func test_go_to_room_emits_room_changed_signal() -> void: + watch_signals(_nav) + _nav.go_to_room(1, 2) + await wait_for_signal(_nav.room_changed, 1.0) + assert_signal_emitted(_nav, "room_changed") + + +func test_go_to_room_emits_room_changed_with_correct_parameters() -> void: + watch_signals(_nav) + _nav.go_to_room(1, 2) + await wait_for_signal(_nav.room_changed, 1.0) + assert_signal_emitted_with_parameters(_nav, "room_changed", [1, 2]) + + +func test_go_to_room_moves_camera_to_target_position() -> void: + _nav.go_to_room(0, 0) + _camera.position = Vector2.ZERO + _nav.go_to_room(1, 0) + await wait_for_signal(_nav.room_changed, 1.0) + assert_eq(_camera.position, Vector2(640.0, -360.0)) + + +func test_go_to_floor_does_not_emit_if_already_on_floor_room_zero() -> void: + watch_signals(_nav) + _nav.go_to_floor(0) + assert_signal_not_emitted(_nav, "room_changed") + + +func test_initialize_with_null_camera_prevents_state_update() -> void: + var nav: Node = RoomNavigatorScript.new() + add_child_autofree(nav) + nav.initialize(null) + nav.go_to_room(1, 2) + assert_eq(nav.get_current_floor(), 0) + assert_eq(nav.get_current_room(), 0) + + +func test_multiple_room_changes_update_state() -> void: + _nav.go_to_room(0, 1) + _nav.go_to_room(1, 0) + _nav.go_to_room(2, 3) + assert_eq(_nav.get_current_floor(), 2) + assert_eq(_nav.get_current_room(), 3)