Files
whale-town/tests/test_game_state_manager.gd
2025-12-05 19:00:14 +08:00

175 lines
5.6 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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")