extends Node ## 键盘输入响应属性测试 ## Feature: godot-ai-town-game, Property 11: 键盘输入响应 const TEST_ITERATIONS = 100 # 测试结果统计 var test_results = { "passed": 0, "failed": 0, "errors": [] } func _ready(): print("\n=== Property Test: Keyboard Input Response ===") await test_property_keyboard_input_response() print_results() print("=== Property Test Completed ===\n") ## Feature: godot-ai-town-game, Property 11: 键盘输入响应 func test_property_keyboard_input_response(): """ 属性测试:键盘输入响应 对于任意有效的键盘移动输入(方向键或 WASD), 系统应该将玩家角色移动到相应方向,并将移动数据同步到服务器 验证需求: 5.1 """ print("\n[Property Test] Testing keyboard input response...") print("Running ", TEST_ITERATIONS, " iterations...") # 定义所有可能的移动动作 var move_actions = ["move_up", "move_down", "move_left", "move_right"] var expected_directions = { "move_up": Vector2(0, -1), "move_down": Vector2(0, 1), "move_left": Vector2(-1, 0), "move_right": Vector2(1, 0) } for i in range(TEST_ITERATIONS): # 随机选择一个移动动作 var action = move_actions[randi() % move_actions.size()] var expected_dir = expected_directions[action] # 创建输入处理器 var input_handler = InputHandler.new() add_child(input_handler) # 等待一帧以确保初始化完成 await get_tree().process_frame # 模拟按键输入 var input_event = InputEventAction.new() input_event.action = action input_event.pressed = true Input.parse_input_event(input_event) # 等待输入处理 await get_tree().process_frame # 获取移动方向 var actual_dir = input_handler.get_move_direction() # 验证方向是否正确 var direction_correct = actual_dir.normalized().distance_to(expected_dir.normalized()) < 0.01 if direction_correct: test_results["passed"] += 1 else: test_results["failed"] += 1 test_results["errors"].append({ "iteration": i + 1, "action": action, "expected": expected_dir, "actual": actual_dir }) # 释放按键 input_event.pressed = false Input.parse_input_event(input_event) # 清理 input_handler.queue_free() await get_tree().process_frame # 测试组合输入(对角线移动) await test_diagonal_movement() func test_diagonal_movement(): """测试对角线移动(组合输入)""" print("\n[Property Test] Testing diagonal movement...") var diagonal_tests = [ { "actions": ["move_up", "move_right"], "expected": Vector2(1, -1).normalized() }, { "actions": ["move_up", "move_left"], "expected": Vector2(-1, -1).normalized() }, { "actions": ["move_down", "move_right"], "expected": Vector2(1, 1).normalized() }, { "actions": ["move_down", "move_left"], "expected": Vector2(-1, 1).normalized() } ] for test_case in diagonal_tests: var input_handler = InputHandler.new() add_child(input_handler) await get_tree().process_frame # 模拟组合按键 for action in test_case["actions"]: var input_event = InputEventAction.new() input_event.action = action input_event.pressed = true Input.parse_input_event(input_event) await get_tree().process_frame # 获取移动方向 var actual_dir = input_handler.get_move_direction() # 验证方向 var direction_correct = actual_dir.distance_to(test_case["expected"]) < 0.01 if direction_correct: test_results["passed"] += 1 else: test_results["failed"] += 1 test_results["errors"].append({ "type": "diagonal", "actions": test_case["actions"], "expected": test_case["expected"], "actual": actual_dir }) # 释放所有按键 for action in test_case["actions"]: var input_event = InputEventAction.new() input_event.action = action input_event.pressed = false Input.parse_input_event(input_event) input_handler.queue_free() await get_tree().process_frame func print_results(): """打印测试结果""" print("\n=== Test Results ===") print("Total iterations: ", TEST_ITERATIONS + 4) # +4 for diagonal tests 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 keyboard input responses work correctly") print("Property 11 validated: Keyboard inputs correctly translate to character movement")