Add working tests, fix bugs, rework popups and automate releases #36
No files matched your search
+7
-8
@@ -186,7 +186,6 @@ func _ready() -> void:
|
|||||||
|
|
||||||
get_suggestion_list()
|
get_suggestion_list()
|
||||||
fetch_song_list_at_start()
|
fetch_song_list_at_start()
|
||||||
fetch_song()
|
|
||||||
search_view.get_list_of_soundtracks()
|
search_view.get_list_of_soundtracks()
|
||||||
new_character_select.load_characters()
|
new_character_select.load_characters()
|
||||||
|
|
||||||
@@ -240,14 +239,12 @@ func show_answer_pressed() -> void:
|
|||||||
Playlist.song_is_answered()
|
Playlist.song_is_answered()
|
||||||
update_song_list()
|
update_song_list()
|
||||||
|
|
||||||
|
# Loads the songs already in the server playlist, then starts preloading new ones.
|
||||||
|
# Preloading waits for the list, because loading the list clears the playlist.
|
||||||
func fetch_song_list_at_start() -> void:
|
func fetch_song_list_at_start() -> void:
|
||||||
print("fetch_song_list_at_start")
|
print("fetch_song_list_at_start")
|
||||||
var fetch_song_list_at_start_done: Callable = func fetch_songs_at_start_done(data) -> void:
|
var fetch_song_list_at_start_done: Callable = func fetch_songs_at_start_done(data) -> void:
|
||||||
Playlist.clear_song_list()
|
Playlist.clear_song_list()
|
||||||
if data == null:
|
|
||||||
Playlist.update_last_played_song()
|
|
||||||
update_song_list()
|
|
||||||
return
|
|
||||||
if typeof(data) == TYPE_ARRAY:
|
if typeof(data) == TYPE_ARRAY:
|
||||||
for d: Dictionary in data:
|
for d: Dictionary in data:
|
||||||
var new_song_object: SongObject = SongObject.new()
|
var new_song_object: SongObject = SongObject.new()
|
||||||
@@ -257,11 +254,14 @@ func fetch_song_list_at_start() -> void:
|
|||||||
new_song_object.is_answered = true
|
new_song_object.is_answered = true
|
||||||
new_song_object.has_played = true
|
new_song_object.has_played = true
|
||||||
Playlist.add_to_playlist(new_song_object)
|
Playlist.add_to_playlist(new_song_object)
|
||||||
else:
|
elif data != null:
|
||||||
print("Unexpected data")
|
print("Unexpected data")
|
||||||
Playlist.update_last_played_song()
|
Playlist.update_last_played_song()
|
||||||
update_song_list()
|
update_song_list()
|
||||||
MusicServerClient.fetch_song_list(fetch_song_list_at_start_done)
|
if !Playlist.is_song_downloading:
|
||||||
|
fetch_song()
|
||||||
|
MusicServerClient.fetch_song_list(fetch_song_list_at_start_done,
|
||||||
|
_retry_later.bind(fetch_song_list_at_start))
|
||||||
|
|
||||||
func play_next_song() -> void:
|
func play_next_song() -> void:
|
||||||
print("play_next_song ", Playlist.latest_played_song)
|
print("play_next_song ", Playlist.latest_played_song)
|
||||||
@@ -360,7 +360,6 @@ func reset_playlist() -> void:
|
|||||||
var playlist_reset_done: Callable = func playlist_reset_done() -> void:
|
var playlist_reset_done: Callable = func playlist_reset_done() -> void:
|
||||||
Playlist.reset_playlist()
|
Playlist.reset_playlist()
|
||||||
fetch_song_list_at_start()
|
fetch_song_list_at_start()
|
||||||
fetch_song()
|
|
||||||
|
|
||||||
MusicServerClient.reset_playlist(playlist_reset_done)
|
MusicServerClient.reset_playlist(playlist_reset_done)
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ var requested_methods: Array[int] = []
|
|||||||
|
|
||||||
var _responses: Dictionary = {}
|
var _responses: Dictionary = {}
|
||||||
var _successes_left: Dictionary = {}
|
var _successes_left: Dictionary = {}
|
||||||
|
var _held_paths: Dictionary = {}
|
||||||
var _previous_transport: HttpTransport
|
var _previous_transport: HttpTransport
|
||||||
|
|
||||||
|
|
||||||
@@ -49,6 +50,20 @@ func fail_after(path: String, successes: int) -> void:
|
|||||||
_successes_left[path] = successes
|
_successes_left[path] = successes
|
||||||
|
|
||||||
|
|
||||||
|
## Holds back responses to [param path] until [method release] is called, like a slow
|
||||||
|
## server.
|
||||||
|
func hold(path: String) -> void:
|
||||||
|
_held_paths[path] = []
|
||||||
|
|
||||||
|
|
||||||
|
## Delivers the responses held back for [param path] and stops holding it.
|
||||||
|
func release(path: String) -> void:
|
||||||
|
var waiting: Array = _held_paths.get(path, [])
|
||||||
|
_held_paths.erase(path)
|
||||||
|
for pending: Callable in waiting:
|
||||||
|
pending.call()
|
||||||
|
|
||||||
|
|
||||||
## Returns how many times [param path] has been requested.
|
## Returns how many times [param path] has been requested.
|
||||||
func count(path: String) -> int:
|
func count(path: String) -> int:
|
||||||
return requested_paths.count(path)
|
return requested_paths.count(path)
|
||||||
@@ -58,6 +73,13 @@ func request(url: String, method: int, on_complete: Callable) -> void:
|
|||||||
var path: String = url.trim_prefix(Settings.default_path)
|
var path: String = url.trim_prefix(Settings.default_path)
|
||||||
requested_paths.append(path)
|
requested_paths.append(path)
|
||||||
requested_methods.append(method)
|
requested_methods.append(method)
|
||||||
|
if _held_paths.has(path):
|
||||||
|
_held_paths[path].append(_answer.bind(path, on_complete))
|
||||||
|
return
|
||||||
|
_answer(path, on_complete)
|
||||||
|
|
||||||
|
|
||||||
|
func _answer(path: String, on_complete: Callable) -> void:
|
||||||
if _successes_left.has(path):
|
if _successes_left.has(path):
|
||||||
if _successes_left[path] == 0:
|
if _successes_left[path] == 0:
|
||||||
on_complete.call(503, PackedByteArray())
|
on_complete.call(503, PackedByteArray())
|
||||||
|
|||||||
@@ -36,12 +36,19 @@ func before_test() -> void:
|
|||||||
_server.respond_bytes("/music/reset", PackedByteArray())
|
_server.respond_bytes("/music/reset", PackedByteArray())
|
||||||
_server.respond_bytes("/music/played?song=0", PackedByteArray())
|
_server.respond_bytes("/music/played?song=0", PackedByteArray())
|
||||||
|
|
||||||
|
_before_window_starts()
|
||||||
_runner = scene_runner("res://MainWindow.tscn")
|
_runner = scene_runner("res://MainWindow.tscn")
|
||||||
_window = _runner.scene()
|
_window = _runner.scene()
|
||||||
# The debug build lowers the winning score on startup; keep it out of reach
|
# The debug build lowers the winning score on startup; keep it out of reach
|
||||||
Settings.winning_score = 20
|
Settings.winning_score = 20
|
||||||
|
|
||||||
|
|
||||||
|
## Override to change the fake server before the window starts and sends its first
|
||||||
|
## requests.
|
||||||
|
func _before_window_starts() -> void:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
func after_test() -> void:
|
func after_test() -> void:
|
||||||
# Let nodes queued for deletion by the window be freed before orphans are counted
|
# Let nodes queued for deletion by the window be freed before orphans are counted
|
||||||
await await_idle_frame()
|
await await_idle_frame()
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
extends MainWindowTestSuite
|
||||||
|
## Startup with a slow /music/list response.
|
||||||
|
|
||||||
|
|
||||||
|
func _before_window_starts() -> void:
|
||||||
|
_server.respond_json("/music/list", [
|
||||||
|
{"SongNo": 0, "Soundtrack": "Chrono Trigger", "Song": "Corridors of Time"},
|
||||||
|
])
|
||||||
|
_next_song_is({"SongNo": 1, "Soundtrack": "Final Fantasy VI", "Song": "Dancing Mad"})
|
||||||
|
_server.hold("/music/list")
|
||||||
|
|
||||||
|
|
||||||
|
func test_preloaded_song_survives_a_slow_song_list() -> void:
|
||||||
|
_server.release("/music/list")
|
||||||
|
|
||||||
|
# The song already on the server, then the preloaded one
|
||||||
|
assert_int(Playlist.song_object_array.size()).is_equal(2)
|
||||||
|
assert_str(Playlist.song_object_array[1].song_title).is_equal("Dancing Mad")
|
||||||
|
assert_int(Playlist.get_preloaded_songs()).is_equal(1)
|
||||||
|
|
||||||
|
|
||||||
|
func test_next_plays_the_preloaded_song_after_a_slow_song_list() -> void:
|
||||||
|
_server.release("/music/list")
|
||||||
|
|
||||||
|
await _play_first_song()
|
||||||
|
|
||||||
|
assert_int(Playlist.currently_playing_song).is_equal(1)
|
||||||
|
|
||||||
|
|
||||||
|
func test_failed_song_list_is_retried_before_preloading() -> void:
|
||||||
|
_window.song_fetch_retry_seconds = 0.05
|
||||||
|
_server.respond_json("/music/list", [], 503)
|
||||||
|
_server.release("/music/list")
|
||||||
|
|
||||||
|
assert_int(_server.count("/music/rand")).is_equal(0)
|
||||||
|
|
||||||
|
_server.respond_json("/music/list", [])
|
||||||
|
await await_millis(200)
|
||||||
|
|
||||||
|
assert_int(_server.count("/music/rand")).is_equal(1)
|
||||||
|
assert_int(Playlist.get_preloaded_songs()).is_equal(1)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://sfwrqidmuj04
|
||||||
Reference in new issue
Block a user