extends SceneTree ## Headless smoke test for AudioManager autoload. func _initialize() -> void: _run() func _run() -> void: await process_frame print("SMOKE: Starting AudioManager verification...") var audio_mgr := root.get_node_or_null("AudioManager") if audio_mgr == null: printerr("FAIL: AudioManager node not found in root") quit(1) return print("PASS: AudioManager autoload exists in scene tree.") audio_mgr.set_sound_enabled(true, false) # 1. Verify streams are valid AudioStream objects var streams := [ ["STREAM_CLICK", audio_mgr.STREAM_CLICK], ["STREAM_COIN", audio_mgr.STREAM_COIN], ["STREAM_CHIME", audio_mgr.STREAM_CHIME], ["STREAM_FANFARE", audio_mgr.STREAM_FANFARE], ["STREAM_BELL", audio_mgr.STREAM_BELL], ["STREAM_DOOR", audio_mgr.STREAM_DOOR], ] for s in streams: var name_str: String = s[0] var stream_obj: Variant = s[1] if not (stream_obj is AudioStream): printerr("FAIL: %s is not an AudioStream" % name_str) quit(1) return print("PASS: %s is a valid AudioStream." % name_str) # 2. Verify pool size is 16 if audio_mgr.pool_size != 16: printerr("FAIL: Expected pool size 16, got %d" % audio_mgr.pool_size) quit(1) return print("PASS: Pool size is 16.") # 3. Call sound helpers var p1: AudioStreamPlayer = audio_mgr.play_click() if p1 == null or not (p1 is AudioStreamPlayer): printerr("FAIL: play_click() did not return an AudioStreamPlayer") quit(1) return var p2: AudioStreamPlayer = audio_mgr.play_coin() if p2 == null or not (p2 is AudioStreamPlayer): printerr("FAIL: play_coin() did not return an AudioStreamPlayer") quit(1) return var p3: AudioStreamPlayer = audio_mgr.play_chime() if p3 == null or not (p3 is AudioStreamPlayer): printerr("FAIL: play_chime() did not return an AudioStreamPlayer") quit(1) return var p4: AudioStreamPlayer = audio_mgr.play_fanfare() if p4 == null or not (p4 is AudioStreamPlayer): printerr("FAIL: play_fanfare() did not return an AudioStreamPlayer") quit(1) return var p5: AudioStreamPlayer = audio_mgr.play_bell() if p5 == null or not (p5 is AudioStreamPlayer): printerr("FAIL: play_bell() did not return an AudioStreamPlayer") quit(1) return var p6: AudioStreamPlayer = audio_mgr.play_door() if p6 == null or not (p6 is AudioStreamPlayer): printerr("FAIL: play_door() did not return an AudioStreamPlayer") quit(1) return print("PASS: All 6 sound helper methods executed and returned players.") # 4. Fire 20 rapid sounds to verify round-robin recycling var player_order: Array[AudioStreamPlayer] = [] for i in range(20): var p: AudioStreamPlayer = audio_mgr.play_click() if p == null: printerr("FAIL: Rapid sound #%d returned null" % i) quit(1) return player_order.append(p) if player_order[16] != player_order[0]: printerr("FAIL: Player at index 16 is not recycled player at index 0") quit(1) return if player_order[17] != player_order[1]: printerr("FAIL: Player at index 17 is not recycled player at index 1") quit(1) return if player_order[18] != player_order[2]: printerr("FAIL: Player at index 18 is not recycled player at index 2") quit(1) return if player_order[19] != player_order[3]: printerr("FAIL: Player at index 19 is not recycled player at index 3") quit(1) return print("PASS: 20 rapid sounds verified round-robin recycling.") # 5. Verify universal tactile button click hook var btn := Button.new() btn.text = "Test Button" root.add_child(btn) await process_frame btn.emit_signal("pressed") # Button in no_click_sound group var silent_btn := Button.new() silent_btn.add_to_group("no_click_sound") # 6. Verify sound toggle & mute functionality var tracker := {"received": false, "val": false} audio_mgr.sound_toggled.connect(func(val: bool): tracker["received"] = true tracker["val"] = val ) # Toggle OFF var new_state: bool = audio_mgr.toggle_sound() if new_state != false or audio_mgr.is_sound_enabled() != false: printerr("FAIL: toggle_sound() should disable sound") quit(1) return if not tracker["received"] or tracker["val"] != false: printerr("FAIL: sound_toggled signal not fired on disable") quit(1) return # When sound disabled, play_click should return null var disabled_p: AudioStreamPlayer = audio_mgr.play_click() if disabled_p != null: printerr("FAIL: play_click() returned non-null when sound disabled") quit(1) return print("PASS: Sound disable successfully suppressed audio playback.") # Toggle back ON tracker["received"] = false new_state = audio_mgr.toggle_sound() if new_state != true or audio_mgr.is_sound_enabled() != true: printerr("FAIL: toggle_sound() should re-enable sound") quit(1) return if not tracker["received"] or tracker["val"] != true: printerr("FAIL: sound_toggled signal not fired on re-enable") quit(1) return var reenabled_p: AudioStreamPlayer = audio_mgr.play_click() if reenabled_p == null: printerr("FAIL: play_click() returned null after re-enabling sound") quit(1) return print("PASS: Sound re-enable restored audio playback and signal notifications.") print("SMOKE RESULT: PASS") quit(0)