168 lines
5.0 KiB
GDScript
168 lines
5.0 KiB
GDScript
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)
|