创建新工程

This commit is contained in:
moyin
2025-12-05 19:00:14 +08:00
commit ff4fa5fffd
227 changed files with 32804 additions and 0 deletions

View File

@@ -0,0 +1,174 @@
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")