feat(mvp): complete M13 clean-up milestone (real usernames, avatar studio redesign, pause menu, audio manager)
checkpoint / checkpoint (push) Successful in 6m22s

This commit is contained in:
2026-09-18 21:54:01 +00:00
parent 4c8a60fbc8
commit ee4006d217
31 changed files with 2394 additions and 262 deletions
+125
View File
@@ -0,0 +1,125 @@
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.")
# 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")
root.add_child(silent_btn)
await process_frame
silent_btn.emit_signal("pressed")
print("SMOKE RESULT: PASS")
quit(0)