forked from datawhale/whale-town-front
- 修复 WebSocketManager/SocketIOClient 函数缩进错误 - 重命名 is_connected() 避免与 Object 基类冲突 - 修复 tscn 文件多余前导空格 - 修复测试文件 GUT 断言函数调用 - 添加 GUT 测试框架
264 lines
8.4 KiB
GDScript
264 lines
8.4 KiB
GDScript
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_socket_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"), "换行符应该被保留")
|