175 lines
5.6 KiB
GDScript
175 lines
5.6 KiB
GDScript
extends Node
|
||
## 游戏状态管理器单元测试
|
||
## 测试状态转换逻辑和数据持久化
|
||
|
||
var game_state_manager: GameStateManager
|
||
|
||
func _ready():
|
||
print("\n=== GameStateManager Unit Tests ===")
|
||
_setup()
|
||
test_initial_state()
|
||
test_state_transitions()
|
||
test_state_change_signal()
|
||
test_data_persistence()
|
||
test_data_serialization()
|
||
_cleanup()
|
||
print("=== All GameStateManager tests completed ===\n")
|
||
|
||
func _setup():
|
||
"""设置测试环境"""
|
||
game_state_manager = GameStateManager.new()
|
||
add_child(game_state_manager)
|
||
|
||
func _cleanup():
|
||
"""清理测试环境"""
|
||
if game_state_manager:
|
||
game_state_manager.clear_player_data()
|
||
game_state_manager.queue_free()
|
||
|
||
func test_initial_state():
|
||
"""测试初始状态"""
|
||
print("\n[Unit Test] Initial State")
|
||
|
||
assert(game_state_manager.current_state == GameStateManager.GameState.LOGIN,
|
||
"Initial state should be LOGIN")
|
||
|
||
print(" ✅ PASSED: Initial state is LOGIN")
|
||
|
||
func test_state_transitions():
|
||
"""测试各种状态转换场景"""
|
||
print("\n[Unit Test] State Transitions")
|
||
|
||
# 测试 LOGIN -> CHARACTER_CREATION
|
||
game_state_manager.change_state(GameStateManager.GameState.CHARACTER_CREATION)
|
||
assert(game_state_manager.current_state == GameStateManager.GameState.CHARACTER_CREATION,
|
||
"State should change to CHARACTER_CREATION")
|
||
|
||
# 测试 CHARACTER_CREATION -> IN_GAME
|
||
game_state_manager.change_state(GameStateManager.GameState.IN_GAME)
|
||
assert(game_state_manager.current_state == GameStateManager.GameState.IN_GAME,
|
||
"State should change to IN_GAME")
|
||
|
||
# 测试 IN_GAME -> DISCONNECTED
|
||
game_state_manager.change_state(GameStateManager.GameState.DISCONNECTED)
|
||
assert(game_state_manager.current_state == GameStateManager.GameState.DISCONNECTED,
|
||
"State should change to DISCONNECTED")
|
||
|
||
# 测试 DISCONNECTED -> LOGIN
|
||
game_state_manager.change_state(GameStateManager.GameState.LOGIN)
|
||
assert(game_state_manager.current_state == GameStateManager.GameState.LOGIN,
|
||
"State should change back to LOGIN")
|
||
|
||
# 测试相同状态不触发变化
|
||
var old_state = game_state_manager.current_state
|
||
game_state_manager.change_state(old_state)
|
||
assert(game_state_manager.current_state == old_state,
|
||
"State should remain the same when changing to current state")
|
||
|
||
print(" ✅ PASSED: All state transitions work correctly")
|
||
|
||
func test_state_change_signal():
|
||
"""测试状态变化信号"""
|
||
print("\n[Unit Test] State Change Signal")
|
||
|
||
# 使用字典来存储信号接收状态(避免 lambda 捕获问题)
|
||
var signal_data = {
|
||
"received": false,
|
||
"old_state": null,
|
||
"new_state": null
|
||
}
|
||
|
||
# 连接信号
|
||
var callback = func(prev_state, next_state):
|
||
signal_data["received"] = true
|
||
signal_data["old_state"] = prev_state
|
||
signal_data["new_state"] = next_state
|
||
|
||
game_state_manager.state_changed.connect(callback)
|
||
|
||
# 改变状态
|
||
var old_state = game_state_manager.current_state
|
||
var new_state = GameStateManager.GameState.IN_GAME
|
||
game_state_manager.change_state(new_state)
|
||
|
||
# 信号是同步的,应该立即触发
|
||
assert(signal_data["received"], "State change signal should be emitted")
|
||
assert(signal_data["old_state"] == old_state, "Old state should match")
|
||
assert(signal_data["new_state"] == new_state, "New state should match")
|
||
|
||
# 测试相同状态不发射信号
|
||
signal_data["received"] = false
|
||
game_state_manager.change_state(new_state)
|
||
assert(not signal_data["received"], "Signal should not be emitted when state doesn't change")
|
||
|
||
print(" ✅ PASSED: State change signal works correctly")
|
||
|
||
func test_data_persistence():
|
||
"""测试数据持久化"""
|
||
print("\n[Unit Test] Data Persistence")
|
||
|
||
# 设置测试数据
|
||
game_state_manager.player_data = {
|
||
"username": "test_player",
|
||
"character_id": "char_123",
|
||
"level": 5,
|
||
"position": {
|
||
"x": 100.0,
|
||
"y": 200.0
|
||
}
|
||
}
|
||
|
||
# 保存数据
|
||
game_state_manager.save_player_data()
|
||
|
||
# 清空内存中的数据
|
||
game_state_manager.player_data.clear()
|
||
assert(game_state_manager.player_data.is_empty(), "Player data should be cleared")
|
||
|
||
# 加载数据
|
||
var loaded_data = game_state_manager.load_player_data()
|
||
|
||
# 验证数据
|
||
assert(not loaded_data.is_empty(), "Loaded data should not be empty")
|
||
assert(loaded_data.has("username"), "Loaded data should have username")
|
||
assert(loaded_data["username"] == "test_player", "Username should match")
|
||
assert(loaded_data.has("character_id"), "Loaded data should have character_id")
|
||
assert(loaded_data["character_id"] == "char_123", "Character ID should match")
|
||
assert(loaded_data.has("level"), "Loaded data should have level")
|
||
assert(loaded_data["level"] == 5, "Level should match")
|
||
|
||
print(" ✅ PASSED: Data persistence works correctly")
|
||
|
||
func test_data_serialization():
|
||
"""测试数据序列化(JSON 格式)"""
|
||
print("\n[Unit Test] Data Serialization")
|
||
|
||
# 创建包含各种数据类型的测试数据
|
||
var test_data = {
|
||
"string": "test_value",
|
||
"int": 42,
|
||
"float": 3.14,
|
||
"bool": true,
|
||
"array": [1, 2, 3],
|
||
"nested": {
|
||
"key": "value",
|
||
"number": 123
|
||
}
|
||
}
|
||
|
||
game_state_manager.player_data = test_data
|
||
game_state_manager.save_player_data()
|
||
|
||
# 清空并重新加载
|
||
game_state_manager.player_data.clear()
|
||
var loaded = game_state_manager.load_player_data()
|
||
|
||
# 验证所有数据类型
|
||
assert(loaded["string"] == "test_value", "String should be preserved")
|
||
assert(loaded["int"] == 42, "Integer should be preserved")
|
||
assert(abs(loaded["float"] - 3.14) < 0.001, "Float should be preserved")
|
||
assert(loaded["bool"] == true, "Boolean should be preserved")
|
||
assert(loaded["array"].size() == 3, "Array should be preserved")
|
||
assert(loaded["nested"]["key"] == "value", "Nested data should be preserved")
|
||
|
||
print(" ✅ PASSED: Data serialization (JSON) works correctly")
|