extends GdUnitTestSuite ## Playlist: moving through the songs, answering them and keeping points. var _server: FakeHttpTransport var _add_to_stats: bool var _is_debug: bool func before_test() -> void: _server = FakeHttpTransport.new().install() _add_to_stats = Settings.add_to_stats _is_debug = Settings.is_debug Settings.add_to_stats = false Settings.is_debug = false Playlist.reset_playlist() Playlist.number_of_tracks_to_preload = 1 func after_test() -> void: Playlist.reset_playlist() Settings.add_to_stats = _add_to_stats Settings.is_debug = _is_debug _server.uninstall() func _add_songs(count: int) -> Array[SongObject]: var songs: Array[SongObject] = [] for i: int in count: var song: SongObject = SongObject.new() song.song_number = i song.soundtrack_title = "Soundtrack %d" % i song.song_title = "Song %d" % i Playlist.add_to_playlist(song) songs.append(song) return songs func test_set_latest_played_song_advances() -> void: _add_songs(3) Playlist.set_latest_played_song() assert_int(Playlist.latest_played_song).is_equal(1) func test_set_latest_played_song_stops_at_last_song() -> void: _add_songs(2) Playlist.set_latest_played_song() Playlist.set_latest_played_song() Playlist.set_latest_played_song() assert_int(Playlist.latest_played_song).is_equal(1) func test_get_next_song_returns_latest_played() -> void: var songs: Array[SongObject] = _add_songs(3) Playlist.latest_played_song = 2 assert_object(Playlist.get_next_song()).is_same(songs[2]) func test_update_last_played_song_points_past_existing_songs() -> void: _add_songs(4) Playlist.update_last_played_song() assert_int(Playlist.latest_played_song).is_equal(4) func test_preloaded_songs_counts_unplayed_songs() -> void: var songs: Array[SongObject] = _add_songs(3) songs[0].has_played = true assert_int(Playlist.get_preloaded_songs()).is_equal(2) func test_should_preload_more_songs_when_below_target() -> void: var songs: Array[SongObject] = _add_songs(1) songs[0].has_played = true assert_bool(Playlist.should_preload_more_songs()).is_true() func test_should_not_preload_more_songs_when_target_reached() -> void: _add_songs(1) assert_bool(Playlist.should_preload_more_songs()).is_false() func test_get_playlist_hides_unplayed_songs() -> void: var songs: Array[SongObject] = _add_songs(3) songs[0].has_played = true assert_array(Playlist.get_playlist()).contains_exactly([songs[0]]) func test_get_playlist_shows_everything_in_debug() -> void: Settings.is_debug = true var songs: Array[SongObject] = _add_songs(2) assert_array(Playlist.get_playlist()).contains_exactly(songs) func test_song_is_answered_marks_song() -> void: var songs: Array[SongObject] = _add_songs(2) Playlist.song_is_answered(1) assert_bool(songs[1].is_answered).is_true() assert_bool(songs[0].is_answered).is_false() func test_song_is_answered_reports_to_stats_when_enabled() -> void: Settings.add_to_stats = true _add_songs(2) Playlist.song_is_answered(1) assert_array(_server.requested_paths).contains_exactly(["/music/played?song=1"]) func test_song_is_answered_does_not_report_when_stats_disabled() -> void: _add_songs(2) Playlist.song_is_answered(1) assert_array(_server.requested_paths).is_empty() func test_points_are_recorded_on_current_song() -> void: var songs: Array[SongObject] = _add_songs(2) Playlist.set_currently_playing_song(1) Playlist.add_point("lucca-id") Playlist.add_point("crono-id") assert_array(songs[1].players_given_point).contains_exactly(["lucca-id", "crono-id"]) assert_array(songs[0].players_given_point).is_empty() func test_remove_point_from_current_song() -> void: var songs: Array[SongObject] = _add_songs(1) Playlist.set_currently_playing_song(0) Playlist.add_point("crono-id") Playlist.add_point("marle-id") Playlist.remove_point("crono-id") assert_array(songs[0].players_given_point).contains_exactly(["marle-id"]) func test_remove_player_removes_only_that_players_points() -> void: var songs: Array[SongObject] = _add_songs(2) songs[0].players_given_point.assign(["crono-id", "marle-id"]) songs[1].players_given_point.assign(["crono-id"]) Playlist.remove_player_from_list("marle-id") assert_array(songs[0].players_given_point).contains_exactly(["crono-id"]) assert_array(songs[1].players_given_point).contains_exactly(["crono-id"]) func test_clear_points_empties_every_song() -> void: var songs: Array[SongObject] = _add_songs(2) songs[0].players_given_point.assign(["crono-id", "marle-id"]) songs[1].players_given_point.assign(["crono-id"]) Playlist.clear_points() assert_array(songs[0].players_given_point).is_empty() assert_array(songs[1].players_given_point).is_empty() func test_reset_playlist_starts_a_new_game() -> void: _add_songs(3) Playlist.game_start_song = 2 Playlist.reset_playlist() assert_int(Playlist.game_start_song).is_equal(0) func test_reset_playlist_clears_songs_and_position() -> void: _add_songs(3) Playlist.latest_played_song = 2 Playlist.set_currently_playing_song(1) Playlist.reset_playlist() assert_array(Playlist.song_object_array).is_empty() assert_int(Playlist.latest_played_song).is_equal(0) assert_int(Playlist.currently_playing_song).is_equal(-1) func test_current_titles_are_hidden_until_answered() -> void: var songs: Array[SongObject] = _add_songs(1) Playlist.set_currently_playing_song(0) assert_str(Playlist.get_current_soundtrack_title()).is_equal("????????") songs[0].is_answered = true assert_str(Playlist.get_current_soundtrack_title()).is_equal("Soundtrack 0") assert_str(Playlist.get_current_song_title()).is_equal("Song 0") func test_answering_when_nothing_is_playing_does_nothing() -> void: Settings.add_to_stats = true var songs: Array[SongObject] = _add_songs(2) Playlist.song_is_answered() assert_bool(songs[0].is_answered).is_false() assert_bool(songs[1].is_answered).is_false() assert_array(_server.requested_paths).is_empty() func test_answering_with_empty_playlist_does_nothing() -> void: Playlist.song_is_answered() assert_array(_server.requested_paths).is_empty()