Split now playing, the quiz buttons and song loading out of the quiz

NowPlaying, QuizToolbar and SongControls become their own scenes, the auto
repeat switch moves into the music player scene, and downloading songs moves
into a SongLoader node. The quiz only wires the parts together. Every node
keeps its place on screen.

Screenshots of every UI state are pixel-identical to before, the layout test
still matches the original baseline, and each new part has its own tests.
This commit is contained in:
Sansan committed 2026-10-06 11:11:18 +02:00
1 parent bad4b3ad8b
commit e94c75e84d
32 files changed
+822 -300

No files matched your search

+20 -20
View File
@@ -7,7 +7,7 @@ func test_startup_loads_soundtracks_and_preloads_a_song() -> void:
assert_int(_server.count("/music/all")).is_equal(1)
assert_array(_server.requested_paths).contains(["/music/rand", "/music/addQue", "/music/info"])
assert_int(Playlist.song_object_array.size()).is_equal(1)
assert_bool((_quiz.get_node("NextButton") as Button).disabled).is_false()
assert_bool((_quiz.get_node("SongControls/NextButton") as Button).disabled).is_false()
func test_low_played_mode_fetches_from_low_played_endpoint() -> void:
@@ -15,7 +15,7 @@ func test_low_played_mode_fetches_from_low_played_endpoint() -> void:
_server.respond_bytes(
"/music/rand/low", FileAccess.get_file_as_bytes("res://tests/data/short.mp3"))
_quiz.fetch_song()
_quiz.song_loader.fetch_song()
assert_int(_server.count("/music/rand/low")).is_equal(1)
@@ -23,7 +23,7 @@ func test_low_played_mode_fetches_from_low_played_endpoint() -> void:
func test_next_plays_preloaded_song_and_fetches_another() -> void:
_next_song_is(SONG_INFO[1])
_press("NextButton")
_press("SongControls/NextButton")
await _runner.simulate_frames(2)
assert_int(Playlist.currently_playing_song).is_equal(0)
@@ -33,23 +33,23 @@ func test_next_plays_preloaded_song_and_fetches_another() -> void:
func test_title_is_hidden_until_answer_is_shown() -> void:
var soundtrack_label: Label = _quiz.get_node("VBoxContainer/SoundtrackLabel")
_press("NextButton")
var soundtrack_label: Label = _quiz.get_node("NowPlaying/SoundtrackLabel")
_press("SongControls/NextButton")
await _runner.simulate_frames(2)
assert_str(soundtrack_label.text).is_equal("????????")
_press("ShowAnswerButton")
_press("SongControls/ShowAnswerButton")
assert_str(soundtrack_label.text).is_equal("Chrono Trigger")
assert_int(_server.count("/music/played?song=0")).is_equal(1)
func test_reset_playlist_clears_server_and_preloads_again() -> void:
_press("NextButton")
_press("SongControls/NextButton")
await _runner.simulate_frames(2)
_press("ResetPlaylistButton")
_press("QuizToolbar/ResetPlaylistButton")
assert_int(_server.count("/music/reset")).is_equal(1)
assert_int(Playlist.currently_playing_song).is_equal(-1)
@@ -61,7 +61,7 @@ func test_reset_points_sets_all_scores_to_zero() -> void:
_add_player("Crono").add_point()
_add_player("Marle").add_point()
_press("ResetPointsButton")
_press("QuizToolbar/ResetPointsButton")
assert_int(Settings.player_array[0].player_score).is_equal(0)
assert_int(Settings.player_array[1].player_score).is_equal(0)
@@ -81,13 +81,13 @@ func test_cannot_add_player_without_name() -> void:
func test_failed_song_download_is_retried_until_the_server_answers() -> void:
_quiz.song_fetch_retry_seconds = 0.05
_quiz.song_loader.retry_seconds = 0.05
var songs_before: int = Playlist.song_object_array.size()
var mp3: PackedByteArray = FileAccess.get_file_as_bytes("res://tests/data/short.mp3")
_server.respond_bytes("/music/rand", PackedByteArray(), 503)
var rand_requests_before: int = _server.count("/music/rand")
_quiz.fetch_song()
_quiz.song_loader.fetch_song()
await await_millis(200)
assert_int(_server.count("/music/rand") - rand_requests_before).is_greater(1)
@@ -102,13 +102,13 @@ func test_failed_song_download_is_retried_until_the_server_answers() -> void:
func test_failed_song_info_retries_only_that_step() -> void:
_quiz.song_fetch_retry_seconds = 0.05
_quiz.song_loader.retry_seconds = 0.05
var songs_before: int = Playlist.song_object_array.size()
_server.respond_bytes("/music/info", PackedByteArray(), 503)
var rand_before: int = _server.count("/music/rand")
var queue_before: int = _server.count("/music/addQue")
_quiz.fetch_song()
_quiz.song_loader.fetch_song()
await await_millis(200)
_next_song_is(SONG_INFO[1])
await await_millis(200)
@@ -124,7 +124,7 @@ func test_failed_song_info_retries_only_that_step() -> void:
func test_preloads_as_many_songs_as_the_cache_setting() -> void:
Playlist.number_of_tracks_to_preload = 3
_quiz.fetch_song()
_quiz.song_loader.fetch_song()
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
assert_bool(Playlist.is_song_downloading).is_false()
@@ -132,7 +132,7 @@ func test_preloads_as_many_songs_as_the_cache_setting() -> void:
func test_playing_a_song_tops_the_cache_up_again() -> void:
Playlist.number_of_tracks_to_preload = 3
_quiz.fetch_song()
_quiz.song_loader.fetch_song()
await _play_first_song()
@@ -141,13 +141,13 @@ func test_playing_a_song_tops_the_cache_up_again() -> void:
func test_cache_keeps_filling_after_a_failed_download() -> void:
_quiz.song_fetch_retry_seconds = 0.05
_quiz.song_loader.retry_seconds = 0.05
Playlist.number_of_tracks_to_preload = 3
var mp3: PackedByteArray = FileAccess.get_file_as_bytes("res://tests/data/short.mp3")
# One more download works, then the server stops answering
_server.fail_after("/music/rand", 1)
_quiz.fetch_song()
_quiz.song_loader.fetch_song()
await await_millis(150)
assert_int(Playlist.get_preloaded_songs()).is_equal(2)
@@ -161,7 +161,7 @@ func test_cache_keeps_filling_after_a_failed_download() -> void:
func _open_settings() -> void:
_press("SettingsButton")
_press("QuizToolbar/SettingsButton")
func _close_settings() -> void:
@@ -217,14 +217,14 @@ func test_closing_settings_with_full_cache_downloads_nothing() -> void:
func test_show_answer_before_first_song_does_not_reveal_next_song() -> void:
_press("ShowAnswerButton")
_press("SongControls/ShowAnswerButton")
assert_bool(Playlist.song_object_array[0].is_answered).is_false()
assert_int(_server.count("/music/played?song=-1")).is_equal(0)
await _play_first_song()
assert_str((_quiz.get_node("VBoxContainer/SoundtrackLabel") as Label).text) \
assert_str((_quiz.get_node("NowPlaying/SoundtrackLabel") as Label).text) \
.is_equal("????????")