创建新工程
This commit is contained in:
167
tests/test_character_data.gd
Normal file
167
tests/test_character_data.gd
Normal file
@@ -0,0 +1,167 @@
|
||||
extends Node
|
||||
## 角色数据模型测试
|
||||
## Feature: godot-ai-town-game, Property 1: 角色创建唯一性
|
||||
|
||||
const TEST_ITERATIONS = 100
|
||||
|
||||
func _ready():
|
||||
print("\n=== CharacterData Tests ===")
|
||||
test_property_character_id_uniqueness()
|
||||
test_character_creation()
|
||||
test_name_validation()
|
||||
test_data_validation()
|
||||
test_position_operations()
|
||||
test_serialization_roundtrip()
|
||||
print("=== All CharacterData tests completed ===\n")
|
||||
|
||||
## Feature: godot-ai-town-game, Property 1: 角色创建唯一性
|
||||
func test_property_character_id_uniqueness():
|
||||
"""
|
||||
属性测试:角色创建唯一性
|
||||
对于任意两个成功创建的角色,它们的角色 ID 应该是唯一的,不会发生冲突
|
||||
"""
|
||||
print("\n[Property Test] Character ID Uniqueness")
|
||||
|
||||
var ids = {}
|
||||
var duplicates = 0
|
||||
|
||||
# 创建多个角色并检查 ID 唯一性
|
||||
for i in range(TEST_ITERATIONS):
|
||||
var character = CharacterData.create("TestChar" + str(i), "owner_" + str(i))
|
||||
var id = character[CharacterData.FIELD_ID]
|
||||
|
||||
if ids.has(id):
|
||||
duplicates += 1
|
||||
print(" FAILED: Duplicate ID found: ", id)
|
||||
else:
|
||||
ids[id] = true
|
||||
|
||||
assert(duplicates == 0, "All character IDs should be unique")
|
||||
print(" Result: ", TEST_ITERATIONS, " characters created, ", ids.size(), " unique IDs")
|
||||
|
||||
if duplicates == 0:
|
||||
print(" ✅ PASSED: All character IDs are unique")
|
||||
else:
|
||||
print(" ❌ FAILED: Found ", duplicates, " duplicate IDs")
|
||||
|
||||
func test_character_creation():
|
||||
"""测试角色创建"""
|
||||
print("\n[Unit Test] Character Creation")
|
||||
|
||||
var character = CharacterData.create("TestHero", "player_123", Vector2(100, 200))
|
||||
|
||||
# 验证所有必需字段
|
||||
assert(character.has(CharacterData.FIELD_ID), "Should have ID")
|
||||
assert(character.has(CharacterData.FIELD_NAME), "Should have name")
|
||||
assert(character.has(CharacterData.FIELD_OWNER_ID), "Should have owner ID")
|
||||
assert(character.has(CharacterData.FIELD_POSITION), "Should have position")
|
||||
assert(character.has(CharacterData.FIELD_IS_ONLINE), "Should have online status")
|
||||
assert(character.has(CharacterData.FIELD_APPEARANCE), "Should have appearance")
|
||||
assert(character.has(CharacterData.FIELD_CREATED_AT), "Should have created_at")
|
||||
assert(character.has(CharacterData.FIELD_LAST_SEEN), "Should have last_seen")
|
||||
|
||||
# 验证字段值
|
||||
assert(character[CharacterData.FIELD_NAME] == "TestHero", "Name should match")
|
||||
assert(character[CharacterData.FIELD_OWNER_ID] == "player_123", "Owner ID should match")
|
||||
assert(character[CharacterData.FIELD_IS_ONLINE] == true, "Should be online by default")
|
||||
|
||||
# 验证位置
|
||||
var pos = CharacterData.get_position(character)
|
||||
assert(pos.x == 100 and pos.y == 200, "Position should match")
|
||||
|
||||
print(" ✅ PASSED: Character creation works correctly")
|
||||
|
||||
func test_name_validation():
|
||||
"""测试角色名称验证"""
|
||||
print("\n[Unit Test] Name Validation")
|
||||
|
||||
# 有效名称
|
||||
assert(CharacterData.validate_name("Hero"), "Valid name should pass")
|
||||
assert(CharacterData.validate_name("TestCharacter123"), "Name with numbers should pass")
|
||||
assert(CharacterData.validate_name("My Hero"), "Name with spaces should pass")
|
||||
|
||||
# 无效名称 - 空白
|
||||
assert(not CharacterData.validate_name(""), "Empty name should fail")
|
||||
assert(not CharacterData.validate_name(" "), "Whitespace-only name should fail")
|
||||
assert(not CharacterData.validate_name("\t\n"), "Whitespace characters should fail")
|
||||
|
||||
# 无效名称 - 长度
|
||||
assert(not CharacterData.validate_name("A"), "Too short name should fail")
|
||||
assert(not CharacterData.validate_name("ThisNameIsWayTooLongForACharacter"), "Too long name should fail")
|
||||
|
||||
# 边界情况
|
||||
assert(CharacterData.validate_name("AB"), "Min length name should pass")
|
||||
assert(CharacterData.validate_name("12345678901234567890"), "Max length name should pass")
|
||||
|
||||
print(" ✅ PASSED: Name validation works correctly")
|
||||
|
||||
func test_data_validation():
|
||||
"""测试角色数据验证"""
|
||||
print("\n[Unit Test] Data Validation")
|
||||
|
||||
# 有效数据
|
||||
var valid_char = CharacterData.create("ValidChar", "owner_1")
|
||||
assert(CharacterData.validate(valid_char), "Valid character should pass validation")
|
||||
|
||||
# 无效数据 - 缺少字段
|
||||
var invalid_char1 = {"name": "Test"}
|
||||
assert(not CharacterData.validate(invalid_char1), "Character without ID should fail")
|
||||
|
||||
# 无效数据 - 错误的类型
|
||||
var invalid_char2 = CharacterData.create("Test", "owner")
|
||||
invalid_char2[CharacterData.FIELD_IS_ONLINE] = "true" # 应该是 bool
|
||||
assert(not CharacterData.validate(invalid_char2), "Character with wrong type should fail")
|
||||
|
||||
# 无效数据 - 无效名称
|
||||
var invalid_char3 = CharacterData.create("", "owner")
|
||||
assert(not CharacterData.validate(invalid_char3), "Character with invalid name should fail")
|
||||
|
||||
print(" ✅ PASSED: Data validation works correctly")
|
||||
|
||||
func test_position_operations():
|
||||
"""测试位置操作"""
|
||||
print("\n[Unit Test] Position Operations")
|
||||
|
||||
var character = CharacterData.create("Hero", "owner")
|
||||
|
||||
# 测试获取位置
|
||||
var pos1 = CharacterData.get_position(character)
|
||||
assert(pos1 == Vector2.ZERO, "Initial position should be zero")
|
||||
|
||||
# 测试设置位置
|
||||
CharacterData.set_position(character, Vector2(50, 75))
|
||||
var pos2 = CharacterData.get_position(character)
|
||||
assert(pos2.x == 50 and pos2.y == 75, "Position should be updated")
|
||||
|
||||
# 测试在线状态
|
||||
assert(character[CharacterData.FIELD_IS_ONLINE] == true, "Should be online initially")
|
||||
CharacterData.set_online_status(character, false)
|
||||
assert(character[CharacterData.FIELD_IS_ONLINE] == false, "Should be offline after update")
|
||||
|
||||
print(" ✅ PASSED: Position operations work correctly")
|
||||
|
||||
func test_serialization_roundtrip():
|
||||
"""测试序列化往返"""
|
||||
print("\n[Unit Test] Serialization Roundtrip")
|
||||
|
||||
# 创建角色
|
||||
var original = CharacterData.create("TestChar", "owner_123", Vector2(100, 200))
|
||||
|
||||
# 序列化
|
||||
var json_string = CharacterData.to_json(original)
|
||||
assert(not json_string.is_empty(), "JSON string should not be empty")
|
||||
|
||||
# 反序列化
|
||||
var deserialized = CharacterData.from_json(json_string)
|
||||
assert(not deserialized.is_empty(), "Deserialized data should not be empty")
|
||||
|
||||
# 验证数据一致性
|
||||
assert(deserialized[CharacterData.FIELD_ID] == original[CharacterData.FIELD_ID], "ID should match")
|
||||
assert(deserialized[CharacterData.FIELD_NAME] == original[CharacterData.FIELD_NAME], "Name should match")
|
||||
assert(deserialized[CharacterData.FIELD_OWNER_ID] == original[CharacterData.FIELD_OWNER_ID], "Owner ID should match")
|
||||
|
||||
var pos_orig = CharacterData.get_position(original)
|
||||
var pos_deser = CharacterData.get_position(deserialized)
|
||||
assert(pos_orig.distance_to(pos_deser) < 0.001, "Position should match")
|
||||
|
||||
print(" ✅ PASSED: Serialization roundtrip works correctly")
|
||||
Reference in New Issue
Block a user