extends SceneTree ## Smoke test for the FX library: every registered effect instantiates and attaches without error, ## and an unknown name fails soft (returns null, no crash). Catches a broken effect .tscn before it ## ships. Run: godot --headless --script tests/fx_gallery_test.gd var _pass := 0 var _fail := 0 func _init() -> void: _run.call_deferred() func _ok(cond: bool, msg: String) -> void: if cond: _pass += 1 print(" PASS: ", msg) else: _fail += 1 print(" FAIL: ", msg) func _run() -> void: var fx: Node = root.get_node("/root/Fx") var host := Node3D.new() root.add_child(host) current_scene = host for id: StringName in [&"blood_burst", &"slam_dust", &"spark", &"hit_flash", &"bull_slam", &"bull_kick", &"bull_dash"]: var inst: Node = fx.call("spawn", id, Transform3D.IDENTITY, host) _ok(inst != null and is_instance_valid(inst), "spawns %s" % id) # Continuous bull effects are held (attach), not fired-and-forgotten (spawn). for id: StringName in [&"bull_hoof_dust", &"bull_charge_trail", &"bull_roll_sparks"]: var inst: Node = fx.call("attach", id, host) _ok(inst != null and is_instance_valid(inst), "attaches %s" % id) var missing: Node = fx.call("spawn", &"does_not_exist", Transform3D.IDENTITY, host) _ok(missing == null, "unknown effect returns null instead of crashing") # The preview gallery scene is wired (has its controller script + label). var gallery: Node = load("res://systems/fx/effect_gallery.tscn").instantiate() _ok(gallery.get_script() != null, "gallery scene keeps its controller script") host.add_child(gallery) await process_frame _ok(gallery.get_node_or_null("UI/Label") != null, "gallery scene has its name label") await process_frame print("Results: %d passed, %d failed" % [_pass, _fail]) quit(1 if _fail > 0 else 0)