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")