# test_minimap_radar_parity.gd —— 小地图雷达与坐标系统 1:1 回归测试套件 # 运行方式: # /opt/homebrew/bin/godot --headless --path metin2-client/project --script test_minimap_radar_parity.gd extends SceneTree const Minimap = preload("res://ui/minimap.gd") class MockPlayer extends Node3D: pass class MockClient extends Node: signal channel_changed(c: int) signal observer_event(ev: Dictionary) signal world_reset var _passed := 0 var _failed := 0 func _assert(cond: bool, msg: String) -> void: if cond: _passed += 1 print(" [PASS] %s" % msg) else: _failed += 1 printerr(" [FAIL] %s" % msg) func _init() -> void: print("\n=== Running test_minimap_radar_parity (Direction 3: Minimap & Coordinates 1:1) ===") _test_minimap_coordinates() _test_zoom_buttons() _test_atlas_button() _finish() func _test_minimap_coordinates() -> void: print("\n--- Test 1: Real-time (X, Y) Coordinates Display ---") var client := MockClient.new() get_root().add_child(client) var player := MockPlayer.new() get_root().add_child(player) player.position = Vector3(150.8, 5.0, -320.4) var mm := Minimap.new() get_root().add_child(mm) mm.setup(client, get_root(), func(): return player) # Trigger process update mm._process(0.016) _assert(mm._coord_label != null, "_coord_label exists") _assert(mm._coord_label.text == "(150, 320)", "Coordinates label correctly displays (150, 320)") # Move player to (500, -800) player.position = Vector3(500.0, 0.0, -800.0) mm._process(0.016) _assert(mm._coord_label.text == "(500, 800)", "Coordinates updated to (500, 800)") mm.queue_free() player.queue_free() client.queue_free() func _test_zoom_buttons() -> void: print("\n--- Test 2: ScaleUp / ScaleDown Buttons ---") var client := MockClient.new() get_root().add_child(client) var mm := Minimap.new() get_root().add_child(mm) mm.setup(client, get_root(), func(): return null) var initial_scale := mm.get_scale() mm._btn_zoom_in.pressed.emit() _assert(mm.get_scale() > initial_scale, "Zoom in button increases scale") mm._btn_zoom_out.pressed.emit() _assert(absf(mm.get_scale() - initial_scale) < 0.001, "Zoom out button decreases scale back") mm.queue_free() client.queue_free() func _test_atlas_button() -> void: print("\n--- Test 3: Atlas (M) Button ---") var client := MockClient.new() get_root().add_child(client) var mm := Minimap.new() get_root().add_child(mm) mm.setup(client, get_root(), func(): return null) var state := {"clicked": false} mm.map_pressed.connect(func(): state["clicked"] = true) mm._btn_atlas.pressed.emit() _assert(state["clicked"] == true, "Atlas button click emits map_pressed signal") mm.queue_free() client.queue_free() func _finish() -> void: print("\n=== SUMMARY: %d passed, %d failed ===" % [_passed, _failed]) if _failed == 0: print("ALL TESTS PASSED!\n") quit(0) else: printerr("SOME TESTS FAILED!\n") quit(1)