@tool extends McpTestSuite ## 回归测试:Player 的同步配置必须真的被解析成条目。 ## ## 这是一处典型的「静默失效」:如果 .tres 里的键名写错,或 replication_mode ## 落到 NEVER,远端玩家会僵在原地不动,而且不打任何错误。用测试钉住它。 const CONFIG_PATH := "res://player/player_sync.tres" const PLAYER_SCENE_PATH := "res://player/player.tscn" func suite_name() -> String: return "net" func test_config_has_expected_paths() -> void: var config := load(CONFIG_PATH) as SceneReplicationConfig assert_true(config != null, "player_sync.tres 未能加载为 SceneReplicationConfig") if config == null: return var paths := config.get_properties() assert_eq(paths.size(), 2, "同步字段数量不对:%s" % [paths]) assert_true(config.has_property(^".:position"), "缺少 .:position") assert_true(config.has_property(^"Body:rotation"), "缺少 Body:rotation") func test_config_replication_mode_is_always() -> void: var config := load(CONFIG_PATH) as SceneReplicationConfig assert_true(config != null, "player_sync.tres 未能加载") if config == null: return var paths := config.get_properties() assert_gt(paths.size(), 0, "同步字段为空,远端玩家不会移动") for path in paths: assert_eq( config.property_get_replication_mode(path), SceneReplicationConfig.REPLICATION_MODE_ALWAYS, "%s 的 replication_mode 不是 ALWAYS" % path ) func test_player_scene_wires_synchronizer() -> void: var packed := load(PLAYER_SCENE_PATH) as PackedScene assert_true(packed != null, "player.tscn 未能加载") if packed == null: return var player := packed.instantiate() track(player) var sync := player.get_node_or_null("Sync") as MultiplayerSynchronizer assert_true(sync != null, "Player 下缺少 Sync 节点") if sync == null: return assert_true(sync.replication_config != null, "Sync 没有绑定 SceneReplicationConfig") assert_eq(sync.root_path, ^"..", "Sync.root_path 应为 .. (相对 Player)")