extends GutTest # ============================================================================ # test_socketio_client.gd - SocketIOClient 单元测试 # ============================================================================ # 测试 Socket.IO 协议封装的功能 # # 测试覆盖: # - 初始化测试 # - 连接状态管理 # - 消息格式化 # - 事件监听器管理 # ============================================================================ var socket_client: SocketIOClient # ============================================================================ # 测试设置和清理 # ============================================================================ func before_each(): # 每个测试前创建新实例 socket_client = SocketIOClient.new() add_child(socket_client) func after_each(): # 每个测试后清理 if is_instance_valid(socket_client): socket_client.queue_free() socket_client = null # ============================================================================ # 初始化测试 # ============================================================================ func test_socket_initialization(): # 测试客户端初始化 assert_not_null(socket_client, "SocketIOClient 应该成功初始化") assert_eq(socket_client.is_connected(), false, "初始状态应该是未连接") # ============================================================================ # 连接状态测试 # ============================================================================ func test_initial_connection_state(): # 测试初始连接状态为 DISCONNECTED assert_eq(socket_client._connection_state, SocketIOClient.ConnectionState.DISCONNECTED, "初始连接状态应该是 DISCONNECTED") func test_get_connection_state_when_disconnected(): # 测试获取未连接状态 var state := socket_client._get_connection_state() assert_eq(state, SocketIOClient.ConnectionState.DISCONNECTED, "获取的连接状态应该是 DISCONNECTED") # ============================================================================ # 事件监听器测试 # ============================================================================ func test_add_event_listener(): # 测试添加事件监听器 var callback_called := false var test_callback := func(data: Dictionary): callback_called = true socket_client.add_event_listener("test_event", test_callback) assert_true(socket_client._event_listeners.has("test_event"), "事件监听器应该被添加") assert_eq(socket_client._event_listeners["test_event"].size(), 1, "应该有 1 个监听器") func test_add_multiple_event_listeners(): # 测试添加多个监听器到同一事件 var callback1 := func(data: Dictionary): pass var callback2 := func(data: Dictionary): pass socket_client.add_event_listener("test_event", callback1) socket_client.add_event_listener("test_event", callback2) assert_eq(socket_client._event_listeners["test_event"].size(), 2, "应该有 2 个监听器") func test_remove_event_listener(): # 测试移除事件监听器 var callback := func(data: Dictionary): pass socket_client.add_event_listener("test_event", callback) assert_eq(socket_client._event_listeners["test_event"].size(), 1, "监听器应该被添加") socket_client.remove_event_listener("test_event", callback) assert_eq(socket_client._event_listeners["test_event"].size(), 0, "监听器应该被移除") func test_remove_nonexistent_event_listener(): # 测试移除不存在的监听器不应该报错 var callback := func(data: Dictionary): pass socket_client.remove_event_listener("nonexistent_event", callback) # 如果没有报错,测试通过 assert_true(true, "移除不存在的监听器不应该报错") # ============================================================================ # 消息格式化测试(模拟) # ============================================================================ func test_message_data_structure(): # 测试消息数据结构 var message_data := { "t": "chat", "content": "Hello, world!", "scope": "local" } # 验证数据结构 assert_true(message_data.has("t"), "消息应该有 't' 字段") assert_eq(message_data["t"], "chat", "事件类型应该是 'chat'") assert_eq(message_data["content"], "Hello, world!", "内容应该匹配") assert_eq(message_data["scope"], "local", "范围应该是 'local'") func test_login_message_structure(): # 测试登录消息数据结构 var login_data := { "type": "login", "token": "test_token_123" } # 验证数据结构 assert_true(login_data.has("type"), "登录消息应该有 'type' 字段") assert_eq(login_data["type"], "login", "类型应该是 'login'") assert_eq(login_data["token"], "test_token_123", "token 应该匹配") func test_error_message_structure(): # 测试错误消息数据结构 var error_data := { "t": "error", "code": "AUTH_FAILED", "message": "认证失败" } # 验证数据结构 assert_eq(error_data["t"], "error", "事件类型应该是 'error'") assert_eq(error_data["code"], "AUTH_FAILED", "错误码应该匹配") assert_eq(error_data["message"], "认证失败", "错误消息应该匹配") # ============================================================================ # JSON 序列化测试 # ============================================================================ func test_json_serialization(): # 测试 JSON 序列化 var data := { "t": "chat", "content": "Test message", "scope": "local" } var json_string := JSON.stringify(data) var json := JSON.new() var result := json.parse(json_string) assert_eq(result, OK, "JSON 序列化应该成功") assert_true(json.data.has("t"), "解析后的数据应该有 't' 字段") assert_eq(json.data["content"], "Test message", "内容应该匹配") func test_json_serialization_with_unicode(): # 测试包含 Unicode 字符的 JSON 序列化 var data := { "t": "chat", "content": "你好,世界!🎮", "scope": "local" } var json_string := JSON.stringify(data) var json := JSON.new() var result := json.parse(json_string) assert_eq(result, OK, "Unicode JSON 序列化应该成功") assert_eq(json.data["content"], "你好,世界!🎮", "Unicode 内容应该匹配") # ============================================================================ # 信号测试 # ============================================================================ func test_connected_signal(): # 测试连接成功信号 watch_signals(socket_client) # 手动触发信号 socket_client.emit_signal("connected") assert_signal_emitted(socket_client, "connected", "应该发射 connected 信号") func test_disconnected_signal(): # 测试断开连接信号 watch_signals(socket_client) # 手动触发信号 socket_client.emit_signal("disconnected", true) assert_signal_emitted(socket_client, "disconnected", "应该发射 disconnected 信号") func test_event_received_signal(): # 测试事件接收信号 watch_signals(socket_client) var test_data := {"t": "test", "value": 123} socket_client.emit_signal("event_received", "test", test_data) assert_signal_emitted(socket_client, "event_received", "应该发射 event_received 信号") func test_error_occurred_signal(): # 测试错误发生信号 watch_signals(socket_client) socket_client.emit_signal("error_occurred", "Test error") assert_signal_emitted(socket_client, "error_occurred", "应该发射 error_occurred 信号") # ============================================================================ # 边界条件测试 # ============================================================================ func test_empty_message_content(): # 测试空消息内容 var data := { "t": "chat", "content": "", "scope": "local" } assert_eq(data["content"], "", "空内容应该被保留") func test_very_long_message_content(): # 测试超长消息内容(边界测试) var long_content := "x".repeat(1000) var data := { "t": "chat", "content": long_content, "scope": "local" } assert_eq(data["content"].length(), 1000, "超长内容应该被保留") func test_special_characters_in_message(): # 测试特殊字符 var data := { "t": "chat", "content": "Test with \"quotes\" and 'apostrophes'\n\tNew lines and tabs", "scope": "local" } var json_string := JSON.stringify(data) var json := JSON.new() var result := json.parse(json_string) assert_eq(result, OK, "特殊字符 JSON 序列化应该成功") assert_true(json.data["content"].contains("\n"), "换行符应该被保留")