extends GutTest ## Unit tests for NetworkManager signal emissions ## Tests signal behavior without requiring actual network connections var network_manager: NetworkManager var signal_received: bool = false var last_signal_data: Variant = null func before_each(): # Create a fresh NetworkManager instance for testing network_manager = NetworkManager.new() add_child_autoqfree(network_manager) signal_received = false last_signal_data = null func after_each(): # Cleanup handled by autoqfree pass # ======= HELPER FUNCTIONS ======= func _connect_signal_and_track(signal_obj: Signal) -> void: signal_obj.connect(_on_signal_received) func _on_signal_received(data = null) -> void: signal_received = true last_signal_data = data # ======= CONNECTION STATE SIGNAL TESTS ======= func test_connection_state_changed_signal_exists(): assert_has_signal(network_manager, "connection_state_changed") func test_authenticated_signal_exists(): assert_has_signal(network_manager, "authenticated") func test_authentication_failed_signal_exists(): assert_has_signal(network_manager, "authentication_failed") func test_logged_out_signal_exists(): assert_has_signal(network_manager, "logged_out") func test_network_error_signal_exists(): assert_has_signal(network_manager, "network_error") # ======= MATCHMAKING SIGNAL TESTS ======= func test_queue_joined_signal_exists(): assert_has_signal(network_manager, "queue_joined") func test_queue_left_signal_exists(): assert_has_signal(network_manager, "queue_left") func test_match_found_signal_exists(): assert_has_signal(network_manager, "match_found") func test_room_created_signal_exists(): assert_has_signal(network_manager, "room_created") func test_room_joined_signal_exists(): assert_has_signal(network_manager, "room_joined") func test_room_updated_signal_exists(): assert_has_signal(network_manager, "room_updated") func test_matchmaking_update_signal_exists(): assert_has_signal(network_manager, "matchmaking_update") # ======= GAME MESSAGE SIGNAL TESTS ======= func test_opponent_action_received_signal_exists(): assert_has_signal(network_manager, "opponent_action_received") func test_turn_timer_update_signal_exists(): assert_has_signal(network_manager, "turn_timer_update") func test_game_started_signal_exists(): assert_has_signal(network_manager, "game_started") func test_game_ended_signal_exists(): assert_has_signal(network_manager, "game_ended") func test_phase_changed_signal_exists(): assert_has_signal(network_manager, "phase_changed") func test_action_confirmed_signal_exists(): assert_has_signal(network_manager, "action_confirmed") func test_action_failed_signal_exists(): assert_has_signal(network_manager, "action_failed") func test_opponent_disconnected_signal_exists(): assert_has_signal(network_manager, "opponent_disconnected") func test_opponent_reconnected_signal_exists(): assert_has_signal(network_manager, "opponent_reconnected") func test_game_state_sync_signal_exists(): assert_has_signal(network_manager, "game_state_sync") # ======= CONNECTION STATE ENUM TESTS ======= func test_connection_state_disconnected_value(): assert_eq(NetworkManager.ConnectionState.DISCONNECTED, 0) func test_connection_state_connecting_value(): assert_eq(NetworkManager.ConnectionState.CONNECTING, 1) func test_connection_state_connected_value(): assert_eq(NetworkManager.ConnectionState.CONNECTED, 2) func test_connection_state_authenticating_value(): assert_eq(NetworkManager.ConnectionState.AUTHENTICATING, 3) func test_connection_state_authenticated_value(): assert_eq(NetworkManager.ConnectionState.AUTHENTICATED, 4) func test_connection_state_in_queue_value(): assert_eq(NetworkManager.ConnectionState.IN_QUEUE, 5) func test_connection_state_in_room_value(): assert_eq(NetworkManager.ConnectionState.IN_ROOM, 6) func test_connection_state_in_game_value(): assert_eq(NetworkManager.ConnectionState.IN_GAME, 7) # ======= INITIAL STATE TESTS ======= func test_initial_connection_state_is_disconnected(): assert_eq(network_manager.connection_state, NetworkManager.ConnectionState.DISCONNECTED) func test_initial_auth_token_is_empty(): assert_eq(network_manager.auth_token, "") func test_initial_is_authenticated_is_false(): assert_false(network_manager.is_authenticated) func test_initial_current_game_id_is_empty(): assert_eq(network_manager.current_game_id, "") func test_initial_current_room_code_is_empty(): assert_eq(network_manager.current_room_code, "") func test_initial_local_player_index_is_zero(): assert_eq(network_manager.local_player_index, 0) # ======= LOGOUT TESTS ======= func test_logout_clears_auth_token(): network_manager.auth_token = "test_token" network_manager.logout() assert_eq(network_manager.auth_token, "") func test_logout_clears_current_user(): network_manager.current_user = { "id": "123", "username": "test" } network_manager.logout() assert_eq(network_manager.current_user, {}) func test_logout_sets_is_authenticated_false(): network_manager.is_authenticated = true network_manager.logout() assert_false(network_manager.is_authenticated) func test_logout_emits_logged_out_signal(): watch_signals(network_manager) network_manager.logout() assert_signal_emitted(network_manager, "logged_out") # ======= CONNECTION STATE NAME TESTS ======= func test_get_connection_state_name_disconnected(): network_manager.connection_state = NetworkManager.ConnectionState.DISCONNECTED assert_eq(network_manager.get_connection_state_name(), "Disconnected") func test_get_connection_state_name_connecting(): network_manager.connection_state = NetworkManager.ConnectionState.CONNECTING assert_eq(network_manager.get_connection_state_name(), "Connecting") func test_get_connection_state_name_connected(): network_manager.connection_state = NetworkManager.ConnectionState.CONNECTED assert_eq(network_manager.get_connection_state_name(), "Connected") func test_get_connection_state_name_authenticating(): network_manager.connection_state = NetworkManager.ConnectionState.AUTHENTICATING assert_eq(network_manager.get_connection_state_name(), "Authenticating") func test_get_connection_state_name_authenticated(): network_manager.connection_state = NetworkManager.ConnectionState.AUTHENTICATED assert_eq(network_manager.get_connection_state_name(), "Online") func test_get_connection_state_name_in_queue(): network_manager.connection_state = NetworkManager.ConnectionState.IN_QUEUE assert_eq(network_manager.get_connection_state_name(), "In Queue") func test_get_connection_state_name_in_room(): network_manager.connection_state = NetworkManager.ConnectionState.IN_ROOM assert_eq(network_manager.get_connection_state_name(), "In Room") func test_get_connection_state_name_in_game(): network_manager.connection_state = NetworkManager.ConnectionState.IN_GAME assert_eq(network_manager.get_connection_state_name(), "In Game") # ======= CONFIGURATION TESTS ======= func test_configure_sets_http_url(): network_manager.configure("http://test.com", "ws://test.com") assert_eq(network_manager.http_base_url, "http://test.com") func test_configure_sets_ws_url(): network_manager.configure("http://test.com", "ws://test.com:3001") assert_eq(network_manager.ws_url, "ws://test.com:3001") func test_default_http_url(): assert_eq(network_manager.http_base_url, "http://localhost:3000") func test_default_ws_url(): assert_eq(network_manager.ws_url, "ws://localhost:3001") # ======= CONSTANTS TESTS ======= func test_heartbeat_interval_constant(): assert_eq(NetworkManager.HEARTBEAT_INTERVAL, 10.0) func test_reconnect_delay_constant(): assert_eq(NetworkManager.RECONNECT_DELAY, 5.0) func test_max_reconnect_attempts_constant(): assert_eq(NetworkManager.MAX_RECONNECT_ATTEMPTS, 3) func test_token_file_constant(): assert_eq(NetworkManager.TOKEN_FILE, "user://auth_token.dat")