extends Node ## 在线角色显示属性测试 ## Feature: godot-ai-town-game, Property 22: 在线角色显示 const TEST_ITERATIONS = 50 # 测试结果统计 var test_results = { "passed": 0, "failed": 0, "errors": [] } func _ready(): print("\n=== Property Test: Online Character Display ===") await test_property_online_character_display() print_results() print("=== Property Test Completed ===\n") ## Feature: godot-ai-town-game, Property 22: 在线角色显示 func test_property_online_character_display(): """ 属性测试:在线角色显示 对于任意玩家进入游戏场景时,系统应该显示所有当前在线玩家的角色 验证需求: 11.1 """ print("\n[Property Test] Testing online character display...") print("Running ", TEST_ITERATIONS, " iterations...") for i in range(TEST_ITERATIONS): # 创建世界管理器和角色容器 var world_manager = WorldManager.new() var character_container = Node2D.new() character_container.name = "CharacterContainer" add_child(world_manager) add_child(character_container) world_manager.set_character_container(character_container) await get_tree().process_frame # 生成随机数量的在线角色 var num_online_characters = randi() % 5 + 1 # 1-5 个在线角色 var spawned_characters = [] for j in range(num_online_characters): var character_data = _generate_online_character_data(j) var character = world_manager.spawn_character(character_data, false) if character: spawned_characters.append({ "id": character_data[CharacterData.FIELD_ID], "character": character }) await get_tree().process_frame # 验证所有在线角色都被正确显示 var all_displayed = true var display_errors = [] for char_info in spawned_characters: var char_id = char_info["id"] var character = char_info["character"] # 检查角色是否在场景树中 if not is_instance_valid(character): all_displayed = false display_errors.append({ "character_id": char_id, "error": "character_not_valid" }) continue if not character.is_inside_tree(): all_displayed = false display_errors.append({ "character_id": char_id, "error": "not_in_scene_tree" }) continue # 检查角色是否标记为在线 if not character.is_online: all_displayed = false display_errors.append({ "character_id": char_id, "error": "not_marked_online" }) continue # 检查角色是否可见 if not character.visible: all_displayed = false display_errors.append({ "character_id": char_id, "error": "not_visible" }) # 验证世界管理器中记录的角色数量 var managed_characters = world_manager.get_all_characters() if managed_characters.size() != num_online_characters: all_displayed = false display_errors.append({ "error": "character_count_mismatch", "expected": num_online_characters, "actual": managed_characters.size() }) if all_displayed: test_results["passed"] += 1 else: test_results["failed"] += 1 test_results["errors"].append({ "iteration": i + 1, "num_characters": num_online_characters, "errors": display_errors }) # 清理 world_manager.clear_all_characters() world_manager.queue_free() character_container.queue_free() await get_tree().process_frame func _generate_online_character_data(index: int) -> Dictionary: """生成在线角色数据""" var character_data = CharacterData.create( "OnlinePlayer" + str(index), "owner_" + str(index), Vector2(randf_range(100, 900), randf_range(100, 700)) ) # 确保角色标记为在线 character_data[CharacterData.FIELD_IS_ONLINE] = true return character_data func print_results(): """打印测试结果""" print("\n=== Test Results ===") print("Total iterations: ", TEST_ITERATIONS) print("Passed: ", test_results["passed"]) print("Failed: ", test_results["failed"]) if test_results["failed"] > 0: print("\n❌ FAILED: Some iterations failed") print("First 5 errors:") for i in range(min(5, test_results["errors"].size())): var error = test_results["errors"][i] print(" Error ", i + 1, ": ", error) else: print("\n✅ PASSED: All online characters displayed correctly") print("Property 22 validated: Online characters are properly spawned and visible")