Files
mtgodot-poc/project/mouse_controller_test.gd

69 lines
2.6 KiB
GDScript

extends SceneTree
var _failed := false
class CursorStub extends Node:
var current := "NORMAL"
func set_cursor(shape: String) -> void:
current = shape
func reset() -> void:
current = "NORMAL"
class AudioStub extends Node:
var calls: Array[String] = []
func play_ui(name: String) -> void:
calls.append(name)
func _init() -> void:
var host := Node.new()
root.add_child(host)
var cur := CursorStub.new()
host.add_child(cur)
var audio := AudioStub.new()
host.add_child(audio)
var mouse := preload("res://ui/mouse_controller.gd").new()
host.add_child(mouse)
mouse.setup(host, cur, audio)
_check(not mouse.is_attached(), "starts detached")
_check(mouse.attach_item(1, 7, 1001, 3), "attach inventory item")
_check(audio.calls == ["pick.wav"], "attach plays pick sound")
_check(mouse.is_attached(), "attached state visible")
_check(int(mouse.attached().get("cell", -1)) == 7, "attached source cell")
_check(cur.current == "ITEM", "item cursor state")
var target := Control.new()
target.position = Vector2.ZERO
target.size = Vector2(32, 32)
host.add_child(target)
mouse.register_target(target, func(payload: Dictionary):
host.set_meta("dropped_cell", int(payload.get("cell", -1)))
return int(payload.get("cell", -1)) == 7)
mouse._drop_at(target.get_global_rect().position + Vector2(4, 4))
_check(int(host.get_meta("dropped_cell", -1)) == 7, "drop callback receives source payload")
_check(not mouse.is_attached(), "successful drop clears attached state")
_check(audio.calls == ["pick.wav", "drop.wav"], "successful drop plays drop sound")
mouse.attach_money(123)
_check(mouse.is_attached() and int(mouse.attached().get("vnum", 0)) == -1
and int(mouse.attached().get("count", 0)) == 123, "money has independent attached state")
mouse.cancel()
mouse.cancel()
_check(not mouse.is_attached(), "cancel clears attached state")
_check(cur.current == "NORMAL", "cancel resets cursor")
mouse.attach_item(1, 7, 1001, 1)
mouse._drop_at(Vector2(999, 999))
_check(not mouse.is_attached(), "invalid drop cancels attached state")
mouse._notification(Node.NOTIFICATION_WM_WINDOW_FOCUS_OUT)
mouse.attach_item(1, 7, 1001, 1)
mouse._notification(Node.NOTIFICATION_WM_WINDOW_FOCUS_OUT)
_check(not mouse.is_attached(), "focus loss cancels drag")
_check(audio.calls == ["pick.wav", "drop.wav", "pick.wav", "pick.wav", "loginfail.wav", "pick.wav"],
"invalid drop plays cancel sound and focus loss cancels")
host.queue_free()
print("PASS: mouse_controller (global item drag state + cancel)")
quit(1 if _failed else 0)
func _check(ok: bool, label: String) -> void:
if ok:
return
_failed = true
push_error("FAIL: " + label)