Indent every script with tabs, like the Godot editor does
This commit is contained in:
1 parent
8c1987807c
commit
bad4b3ad8b
35 files changed
+1653
-1653
No files matched your search
@@ -11,82 +11,82 @@ var _list: InspirationList
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
_snapshot = AutoloadSnapshot.take([Settings])
|
||||
Settings.inspiration_list_speed = 0
|
||||
_server = FakeHttpTransport.new().install()
|
||||
_server.respond_json("/music/all", SOUNDTRACKS)
|
||||
_runner = scene_runner("res://InspirationList.tscn")
|
||||
_list = _runner.scene()
|
||||
_snapshot = AutoloadSnapshot.take([Settings])
|
||||
Settings.inspiration_list_speed = 0
|
||||
_server = FakeHttpTransport.new().install()
|
||||
_server.respond_json("/music/all", SOUNDTRACKS)
|
||||
_runner = scene_runner("res://InspirationList.tscn")
|
||||
_list = _runner.scene()
|
||||
|
||||
|
||||
func after_test() -> void:
|
||||
await await_idle_frame()
|
||||
_server.uninstall()
|
||||
_snapshot.restore()
|
||||
await await_idle_frame()
|
||||
_server.uninstall()
|
||||
_snapshot.restore()
|
||||
|
||||
|
||||
func _rows() -> Array[Node]:
|
||||
return _list.get_node("VBoxContainer").get_children()
|
||||
return _list.get_node("VBoxContainer").get_children()
|
||||
|
||||
|
||||
func _texts() -> Array:
|
||||
return _rows().map(func(row: ListRow) -> String: return row.text)
|
||||
return _rows().map(func(row: ListRow) -> String: return row.text)
|
||||
|
||||
|
||||
func test_load_from_server_shows_every_soundtrack_in_order() -> void:
|
||||
_list.load_from_server()
|
||||
_list.load_from_server()
|
||||
|
||||
assert_array(_texts()).contains_exactly(SOUNDTRACKS)
|
||||
assert_array(_list.soundtracks).contains_exactly(SOUNDTRACKS)
|
||||
assert_array(_texts()).contains_exactly(SOUNDTRACKS)
|
||||
assert_array(_list.soundtracks).contains_exactly(SOUNDTRACKS)
|
||||
|
||||
|
||||
func test_rows_alternate_backgrounds() -> void:
|
||||
_list.load_from_server()
|
||||
_list.load_from_server()
|
||||
|
||||
var rows: Array[Node] = _rows()
|
||||
assert_that((rows[0] as ListRow).get_theme_stylebox("panel")) \
|
||||
.is_not_equal((rows[1] as ListRow).get_theme_stylebox("panel"))
|
||||
assert_that((rows[0] as ListRow).get_theme_stylebox("panel")) \
|
||||
.is_equal((rows[2] as ListRow).get_theme_stylebox("panel"))
|
||||
var rows: Array[Node] = _rows()
|
||||
assert_that((rows[0] as ListRow).get_theme_stylebox("panel")) \
|
||||
.is_not_equal((rows[1] as ListRow).get_theme_stylebox("panel"))
|
||||
assert_that((rows[0] as ListRow).get_theme_stylebox("panel")) \
|
||||
.is_equal((rows[2] as ListRow).get_theme_stylebox("panel"))
|
||||
|
||||
|
||||
func test_loading_again_replaces_the_rows() -> void:
|
||||
_list.load_from_server()
|
||||
_server.respond_json("/music/all", ["Terranigma"])
|
||||
_list.load_from_server()
|
||||
_server.respond_json("/music/all", ["Terranigma"])
|
||||
|
||||
_list.load_from_server()
|
||||
_list.load_from_server()
|
||||
|
||||
assert_array(_texts()).contains_exactly(["Terranigma"])
|
||||
assert_array(_texts()).contains_exactly(["Terranigma"])
|
||||
|
||||
|
||||
func test_failed_load_keeps_the_rows() -> void:
|
||||
_list.load_from_server()
|
||||
_server.respond_bytes("/music/all", PackedByteArray(), 500)
|
||||
_list.load_from_server()
|
||||
_server.respond_bytes("/music/all", PackedByteArray(), 500)
|
||||
|
||||
_list.load_from_server()
|
||||
_list.load_from_server()
|
||||
|
||||
assert_array(_texts()).contains_exactly(SOUNDTRACKS)
|
||||
assert_array(_texts()).contains_exactly(SOUNDTRACKS)
|
||||
|
||||
|
||||
func _long_list() -> Array[String]:
|
||||
var names: Array[String] = []
|
||||
for i: int in 40:
|
||||
names.append("Soundtrack %d" % i)
|
||||
return names
|
||||
var names: Array[String] = []
|
||||
for i: int in 40:
|
||||
names.append("Soundtrack %d" % i)
|
||||
return names
|
||||
|
||||
|
||||
func test_scrolls_down_by_itself() -> void:
|
||||
_list.show_soundtracks(_long_list())
|
||||
Settings.inspiration_list_speed = 5
|
||||
_list.show_soundtracks(_long_list())
|
||||
Settings.inspiration_list_speed = 5
|
||||
|
||||
await _runner.simulate_frames(30, 16)
|
||||
await _runner.simulate_frames(30, 16)
|
||||
|
||||
assert_int(_list.scroll_vertical).is_greater(0)
|
||||
assert_int(_list.scroll_vertical).is_greater(0)
|
||||
|
||||
|
||||
func test_does_not_scroll_at_speed_zero() -> void:
|
||||
_list.show_soundtracks(_long_list())
|
||||
_list.show_soundtracks(_long_list())
|
||||
|
||||
await _runner.simulate_frames(30, 16)
|
||||
await _runner.simulate_frames(30, 16)
|
||||
|
||||
assert_int(_list.scroll_vertical).is_equal(0)
|
||||
assert_int(_list.scroll_vertical).is_equal(0)
|
||||
@@ -12,22 +12,22 @@ const BASELINE_PATH: String = "res://tests/data/layout_baseline.json"
|
||||
|
||||
## Nodes that moved from the main window into the Quiz scene, by their old name.
|
||||
const QUIZ_NODES: Array[String] = [
|
||||
"Open", "FileDialog", "MusicListPanel", "VBoxContainer",
|
||||
"MusicPlayer", "ResetPlaylistButton", "ResetPointsButton", "SettingsButton",
|
||||
"SoundTestButton", "ShowAnswerButton", "NextButton", "RepeatSongCheckButton",
|
||||
"DebugLabel", "SettingsWindow", "NewCharacterSelect", "WinnerWindow", "Log",
|
||||
"Open", "FileDialog", "MusicListPanel", "VBoxContainer",
|
||||
"MusicPlayer", "ResetPlaylistButton", "ResetPointsButton", "SettingsButton",
|
||||
"SoundTestButton", "ShowAnswerButton", "NextButton", "RepeatSongCheckButton",
|
||||
"DebugLabel", "SettingsWindow", "NewCharacterSelect", "WinnerWindow", "Log",
|
||||
]
|
||||
|
||||
## Nodes that moved into the Quiz scene and were renamed there: old name to new name.
|
||||
const RENAMED_QUIZ_NODES: Dictionary = {
|
||||
"Players": "PlayersPanel",
|
||||
"ScrollContainer": "InspirationList",
|
||||
"Players": "PlayersPanel",
|
||||
"ScrollContainer": "InspirationList",
|
||||
}
|
||||
|
||||
## Nodes that moved from the main window into the TopBar scene, by their old name.
|
||||
const TOP_BAR_NODES: Array[String] = [
|
||||
"TopPanelContainer", "Title", "SearchButton", "SyncButton", "StatisticsButton",
|
||||
"ShortcutsButton", "AboutButton", "QRButton",
|
||||
"TopPanelContainer", "Title", "SearchButton", "SyncButton", "StatisticsButton",
|
||||
"ShortcutsButton", "AboutButton", "QRButton",
|
||||
]
|
||||
|
||||
## How far a node may be from its old place, in pixels.
|
||||
@@ -40,67 +40,67 @@ var _layout: Dictionary = {}
|
||||
|
||||
|
||||
func before() -> void:
|
||||
_snapshot = AutoloadSnapshot.take([Settings, Playlist])
|
||||
UiTour.prepare_autoloads()
|
||||
_server = UiTour.make_server().install()
|
||||
# Laid out at the size the baseline was taken at, like the screenshots
|
||||
var viewport: SubViewport = auto_free(SubViewport.new())
|
||||
viewport.size = Vector2i(1920, 1080)
|
||||
viewport.gui_embed_subwindows = true
|
||||
Engine.get_main_loop().root.add_child(viewport)
|
||||
_main = load("res://MainWindow.tscn").instantiate()
|
||||
viewport.add_child(_main)
|
||||
await UiTour.new(_main).run(func(state: String, popup: Node) -> void:
|
||||
_layout[state] = UiTour.dump_layout(_main, _main if popup == null else popup))
|
||||
_snapshot = AutoloadSnapshot.take([Settings, Playlist])
|
||||
UiTour.prepare_autoloads()
|
||||
_server = UiTour.make_server().install()
|
||||
# Laid out at the size the baseline was taken at, like the screenshots
|
||||
var viewport: SubViewport = auto_free(SubViewport.new())
|
||||
viewport.size = Vector2i(1920, 1080)
|
||||
viewport.gui_embed_subwindows = true
|
||||
Engine.get_main_loop().root.add_child(viewport)
|
||||
_main = load("res://MainWindow.tscn").instantiate()
|
||||
viewport.add_child(_main)
|
||||
await UiTour.new(_main).run(func(state: String, popup: Node) -> void:
|
||||
_layout[state] = UiTour.dump_layout(_main, _main if popup == null else popup))
|
||||
|
||||
|
||||
func after() -> void:
|
||||
_main.free()
|
||||
await Engine.get_main_loop().process_frame
|
||||
_server.uninstall()
|
||||
_snapshot.restore()
|
||||
_main.free()
|
||||
await Engine.get_main_loop().process_frame
|
||||
_server.uninstall()
|
||||
_snapshot.restore()
|
||||
|
||||
|
||||
## Where the node that used to be at [param old_path] in the main window is now.
|
||||
static func new_path(old_path: String) -> String:
|
||||
var first: String = old_path.get_slice("/", 0)
|
||||
if first in QUIZ_NODES:
|
||||
return "Quiz/" + old_path
|
||||
if first in RENAMED_QUIZ_NODES:
|
||||
return "Quiz/" + RENAMED_QUIZ_NODES[first] + old_path.trim_prefix(first)
|
||||
if first in TOP_BAR_NODES:
|
||||
return "TopBar/" + old_path
|
||||
return old_path
|
||||
var first: String = old_path.get_slice("/", 0)
|
||||
if first in QUIZ_NODES:
|
||||
return "Quiz/" + old_path
|
||||
if first in RENAMED_QUIZ_NODES:
|
||||
return "Quiz/" + RENAMED_QUIZ_NODES[first] + old_path.trim_prefix(first)
|
||||
if first in TOP_BAR_NODES:
|
||||
return "TopBar/" + old_path
|
||||
return old_path
|
||||
|
||||
|
||||
func _baseline() -> Dictionary:
|
||||
return JSON.parse_string(FileAccess.get_file_as_string(BASELINE_PATH))
|
||||
return JSON.parse_string(FileAccess.get_file_as_string(BASELINE_PATH))
|
||||
|
||||
|
||||
func test_tour_has_the_same_states_as_the_baseline() -> void:
|
||||
assert_array(_layout.keys()).contains_exactly_in_any_order(_baseline().keys())
|
||||
assert_array(_layout.keys()).contains_exactly_in_any_order(_baseline().keys())
|
||||
|
||||
|
||||
func test_every_node_is_where_it_was() -> void:
|
||||
var problems: Array[String] = []
|
||||
var baseline: Dictionary = _baseline()
|
||||
for state: String in baseline:
|
||||
var actual: Dictionary = _layout.get(state, {})
|
||||
for old_path: String in baseline[state]:
|
||||
var path: String = new_path(old_path)
|
||||
var expected: Dictionary = baseline[state][old_path]
|
||||
if !actual.has(path):
|
||||
problems.append("%s: %s is missing (was %s)" % [state, path, old_path])
|
||||
continue
|
||||
var rect: Array = actual[path].rect
|
||||
for i: int in 4:
|
||||
if absf(rect[i] - expected.rect[i]) > TOLERANCE:
|
||||
problems.append("%s: %s is at %s, was %s"
|
||||
% [state, path, rect, expected.rect])
|
||||
break
|
||||
if actual[path].visible != expected.visible:
|
||||
problems.append("%s: %s visible is %s, was %s"
|
||||
% [state, path, actual[path].visible, expected.visible])
|
||||
assert_array(problems).override_failure_message(
|
||||
"%d nodes moved:\n%s" % [problems.size(), "\n".join(problems.slice(0, 30))]) \
|
||||
.is_empty()
|
||||
var problems: Array[String] = []
|
||||
var baseline: Dictionary = _baseline()
|
||||
for state: String in baseline:
|
||||
var actual: Dictionary = _layout.get(state, {})
|
||||
for old_path: String in baseline[state]:
|
||||
var path: String = new_path(old_path)
|
||||
var expected: Dictionary = baseline[state][old_path]
|
||||
if !actual.has(path):
|
||||
problems.append("%s: %s is missing (was %s)" % [state, path, old_path])
|
||||
continue
|
||||
var rect: Array = actual[path].rect
|
||||
for i: int in 4:
|
||||
if absf(rect[i] - expected.rect[i]) > TOLERANCE:
|
||||
problems.append("%s: %s is at %s, was %s"
|
||||
% [state, path, rect, expected.rect])
|
||||
break
|
||||
if actual[path].visible != expected.visible:
|
||||
problems.append("%s: %s visible is %s, was %s"
|
||||
% [state, path, actual[path].visible, expected.visible])
|
||||
assert_array(problems).override_failure_message(
|
||||
"%d nodes moved:\n%s" % [problems.size(), "\n".join(problems.slice(0, 30))]) \
|
||||
.is_empty()
|
||||
@@ -3,240 +3,240 @@ extends MainWindowTestSuite
|
||||
|
||||
|
||||
func test_startup_loads_soundtracks_and_preloads_a_song() -> void:
|
||||
assert_int(_server.count("/music/list")).is_equal(1)
|
||||
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_int(_server.count("/music/list")).is_equal(1)
|
||||
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()
|
||||
|
||||
|
||||
func test_low_played_mode_fetches_from_low_played_endpoint() -> void:
|
||||
Settings.use_low_played_mode = true
|
||||
_server.respond_bytes(
|
||||
"/music/rand/low", FileAccess.get_file_as_bytes("res://tests/data/short.mp3"))
|
||||
Settings.use_low_played_mode = true
|
||||
_server.respond_bytes(
|
||||
"/music/rand/low", FileAccess.get_file_as_bytes("res://tests/data/short.mp3"))
|
||||
|
||||
_quiz.fetch_song()
|
||||
_quiz.fetch_song()
|
||||
|
||||
assert_int(_server.count("/music/rand/low")).is_equal(1)
|
||||
assert_int(_server.count("/music/rand/low")).is_equal(1)
|
||||
|
||||
|
||||
func test_next_plays_preloaded_song_and_fetches_another() -> void:
|
||||
_next_song_is(SONG_INFO[1])
|
||||
_next_song_is(SONG_INFO[1])
|
||||
|
||||
_press("NextButton")
|
||||
await _runner.simulate_frames(2)
|
||||
_press("NextButton")
|
||||
await _runner.simulate_frames(2)
|
||||
|
||||
assert_int(Playlist.currently_playing_song).is_equal(0)
|
||||
assert_bool(Playlist.song_object_array[0].has_played).is_true()
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(2)
|
||||
assert_int(_server.count("/music/rand")).is_equal(2)
|
||||
assert_int(Playlist.currently_playing_song).is_equal(0)
|
||||
assert_bool(Playlist.song_object_array[0].has_played).is_true()
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(2)
|
||||
assert_int(_server.count("/music/rand")).is_equal(2)
|
||||
|
||||
|
||||
func test_title_is_hidden_until_answer_is_shown() -> void:
|
||||
var soundtrack_label: Label = _quiz.get_node("VBoxContainer/SoundtrackLabel")
|
||||
_press("NextButton")
|
||||
await _runner.simulate_frames(2)
|
||||
var soundtrack_label: Label = _quiz.get_node("VBoxContainer/SoundtrackLabel")
|
||||
_press("NextButton")
|
||||
await _runner.simulate_frames(2)
|
||||
|
||||
assert_str(soundtrack_label.text).is_equal("????????")
|
||||
assert_str(soundtrack_label.text).is_equal("????????")
|
||||
|
||||
_press("ShowAnswerButton")
|
||||
_press("ShowAnswerButton")
|
||||
|
||||
assert_str(soundtrack_label.text).is_equal("Chrono Trigger")
|
||||
assert_int(_server.count("/music/played?song=0")).is_equal(1)
|
||||
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")
|
||||
await _runner.simulate_frames(2)
|
||||
_press("NextButton")
|
||||
await _runner.simulate_frames(2)
|
||||
|
||||
_press("ResetPlaylistButton")
|
||||
_press("ResetPlaylistButton")
|
||||
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
assert_int(Playlist.currently_playing_song).is_equal(-1)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(1)
|
||||
assert_bool(Playlist.song_object_array[0].has_played).is_false()
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
assert_int(Playlist.currently_playing_song).is_equal(-1)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(1)
|
||||
assert_bool(Playlist.song_object_array[0].has_played).is_false()
|
||||
|
||||
|
||||
func test_reset_points_sets_all_scores_to_zero() -> void:
|
||||
_add_player("Crono").add_point()
|
||||
_add_player("Marle").add_point()
|
||||
_add_player("Crono").add_point()
|
||||
_add_player("Marle").add_point()
|
||||
|
||||
_press("ResetPointsButton")
|
||||
_press("ResetPointsButton")
|
||||
|
||||
assert_int(Settings.player_array[0].player_score).is_equal(0)
|
||||
assert_int(Settings.player_array[1].player_score).is_equal(0)
|
||||
assert_int(Settings.player_array[0].player_score).is_equal(0)
|
||||
assert_int(Settings.player_array[1].player_score).is_equal(0)
|
||||
|
||||
|
||||
func test_cannot_add_more_than_max_players() -> void:
|
||||
for i: int in Settings.MAX_NUMBER_OF_PLAYERS + 1:
|
||||
_add_player("Player %d" % i)
|
||||
for i: int in Settings.MAX_NUMBER_OF_PLAYERS + 1:
|
||||
_add_player("Player %d" % i)
|
||||
|
||||
assert_int(Settings.player_array.size()).is_equal(Settings.MAX_NUMBER_OF_PLAYERS)
|
||||
assert_int(Settings.player_array.size()).is_equal(Settings.MAX_NUMBER_OF_PLAYERS)
|
||||
|
||||
|
||||
func test_cannot_add_player_without_name() -> void:
|
||||
_add_player("")
|
||||
_add_player("")
|
||||
|
||||
assert_array(Settings.player_array).is_empty()
|
||||
assert_array(Settings.player_array).is_empty()
|
||||
|
||||
|
||||
func test_failed_song_download_is_retried_until_the_server_answers() -> void:
|
||||
_quiz.song_fetch_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.song_fetch_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()
|
||||
await await_millis(200)
|
||||
_quiz.fetch_song()
|
||||
await await_millis(200)
|
||||
|
||||
assert_int(_server.count("/music/rand") - rand_requests_before).is_greater(1)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(songs_before)
|
||||
assert_bool(Playlist.is_song_downloading).is_true()
|
||||
assert_int(_server.count("/music/rand") - rand_requests_before).is_greater(1)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(songs_before)
|
||||
assert_bool(Playlist.is_song_downloading).is_true()
|
||||
|
||||
_server.respond_bytes("/music/rand", mp3)
|
||||
await await_millis(200)
|
||||
_server.respond_bytes("/music/rand", mp3)
|
||||
await await_millis(200)
|
||||
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(songs_before + 1)
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(songs_before + 1)
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
|
||||
|
||||
func test_failed_song_info_retries_only_that_step() -> void:
|
||||
_quiz.song_fetch_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.song_fetch_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()
|
||||
await await_millis(200)
|
||||
_next_song_is(SONG_INFO[1])
|
||||
await await_millis(200)
|
||||
_quiz.fetch_song()
|
||||
await await_millis(200)
|
||||
_next_song_is(SONG_INFO[1])
|
||||
await await_millis(200)
|
||||
|
||||
# The song was downloaded and queued once; only the info request was repeated
|
||||
assert_int(_server.count("/music/rand") - rand_before).is_equal(1)
|
||||
assert_int(_server.count("/music/addQue") - queue_before).is_equal(1)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(songs_before + 1)
|
||||
assert_str(Playlist.song_object_array.back().song_title).is_equal("Dancing Mad")
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
# The song was downloaded and queued once; only the info request was repeated
|
||||
assert_int(_server.count("/music/rand") - rand_before).is_equal(1)
|
||||
assert_int(_server.count("/music/addQue") - queue_before).is_equal(1)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(songs_before + 1)
|
||||
assert_str(Playlist.song_object_array.back().song_title).is_equal("Dancing Mad")
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
|
||||
|
||||
func test_preloads_as_many_songs_as_the_cache_setting() -> void:
|
||||
Playlist.number_of_tracks_to_preload = 3
|
||||
Playlist.number_of_tracks_to_preload = 3
|
||||
|
||||
_quiz.fetch_song()
|
||||
_quiz.fetch_song()
|
||||
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
|
||||
|
||||
func test_playing_a_song_tops_the_cache_up_again() -> void:
|
||||
Playlist.number_of_tracks_to_preload = 3
|
||||
_quiz.fetch_song()
|
||||
Playlist.number_of_tracks_to_preload = 3
|
||||
_quiz.fetch_song()
|
||||
|
||||
await _play_first_song()
|
||||
await _play_first_song()
|
||||
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(4)
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
assert_int(Playlist.song_object_array.size()).is_equal(4)
|
||||
|
||||
|
||||
func test_cache_keeps_filling_after_a_failed_download() -> void:
|
||||
_quiz.song_fetch_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.song_fetch_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()
|
||||
await await_millis(150)
|
||||
_quiz.fetch_song()
|
||||
await await_millis(150)
|
||||
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(2)
|
||||
assert_bool(Playlist.is_song_downloading).is_true()
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(2)
|
||||
assert_bool(Playlist.is_song_downloading).is_true()
|
||||
|
||||
_server.respond_bytes("/music/rand", mp3)
|
||||
await await_millis(150)
|
||||
_server.respond_bytes("/music/rand", mp3)
|
||||
await await_millis(150)
|
||||
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
assert_bool(Playlist.is_song_downloading).is_false()
|
||||
|
||||
|
||||
func _open_settings() -> void:
|
||||
_press("SettingsButton")
|
||||
_press("SettingsButton")
|
||||
|
||||
|
||||
func _close_settings() -> void:
|
||||
(_quiz.get_node("SettingsWindow") as Control).visible = false
|
||||
(_quiz.get_node("SettingsWindow") as Control).visible = false
|
||||
|
||||
|
||||
func _press_settings_button(unique_name: String) -> void:
|
||||
(_quiz.get_node("SettingsWindow").get_node("%" + unique_name) as Button).pressed.emit()
|
||||
(_quiz.get_node("SettingsWindow").get_node("%" + unique_name) as Button).pressed.emit()
|
||||
|
||||
|
||||
func test_raising_cache_size_does_not_download_while_settings_are_open() -> void:
|
||||
var downloads_before: int = _server.count("/music/rand")
|
||||
_open_settings()
|
||||
var downloads_before: int = _server.count("/music/rand")
|
||||
_open_settings()
|
||||
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
|
||||
assert_int(Playlist.number_of_tracks_to_preload).is_equal(3)
|
||||
assert_int(_server.count("/music/rand")).is_equal(downloads_before)
|
||||
assert_int(Playlist.number_of_tracks_to_preload).is_equal(3)
|
||||
assert_int(_server.count("/music/rand")).is_equal(downloads_before)
|
||||
|
||||
|
||||
func test_closing_settings_fills_cache_to_new_size() -> void:
|
||||
_open_settings()
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_open_settings()
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
|
||||
_close_settings()
|
||||
_close_settings()
|
||||
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(3)
|
||||
|
||||
|
||||
func test_changing_cache_size_back_and_forth_downloads_only_what_is_needed() -> void:
|
||||
var downloads_before: int = _server.count("/music/rand")
|
||||
_open_settings()
|
||||
for i: int in 5:
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_press_settings_button("LowerCacheButton")
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
var downloads_before: int = _server.count("/music/rand")
|
||||
_open_settings()
|
||||
for i: int in 5:
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
_press_settings_button("LowerCacheButton")
|
||||
_press_settings_button("IncreaseCacheButton")
|
||||
|
||||
_close_settings()
|
||||
_close_settings()
|
||||
|
||||
assert_int(_server.count("/music/rand") - downloads_before).is_equal(1)
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(2)
|
||||
assert_int(_server.count("/music/rand") - downloads_before).is_equal(1)
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(2)
|
||||
|
||||
|
||||
func test_closing_settings_with_full_cache_downloads_nothing() -> void:
|
||||
var downloads_before: int = _server.count("/music/rand")
|
||||
_open_settings()
|
||||
var downloads_before: int = _server.count("/music/rand")
|
||||
_open_settings()
|
||||
|
||||
_close_settings()
|
||||
_close_settings()
|
||||
|
||||
assert_int(_server.count("/music/rand")).is_equal(downloads_before)
|
||||
assert_int(_server.count("/music/rand")).is_equal(downloads_before)
|
||||
|
||||
|
||||
func test_show_answer_before_first_song_does_not_reveal_next_song() -> void:
|
||||
_press("ShowAnswerButton")
|
||||
_press("ShowAnswerButton")
|
||||
|
||||
assert_bool(Playlist.song_object_array[0].is_answered).is_false()
|
||||
assert_int(_server.count("/music/played?song=-1")).is_equal(0)
|
||||
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()
|
||||
await _play_first_song()
|
||||
|
||||
assert_str((_quiz.get_node("VBoxContainer/SoundtrackLabel") as Label).text) \
|
||||
.is_equal("????????")
|
||||
assert_str((_quiz.get_node("VBoxContainer/SoundtrackLabel") as Label).text) \
|
||||
.is_equal("????????")
|
||||
|
||||
|
||||
func test_log_adds_one_row_per_point_with_padded_time() -> void:
|
||||
var log_box: VBoxContainer = _quiz.get_node("%Log").get_node("%LogVBoxContainer")
|
||||
var crono: PlayerObject = _add_player("Crono")
|
||||
await _play_first_song()
|
||||
var log_box: VBoxContainer = _quiz.get_node("%Log").get_node("%LogVBoxContainer")
|
||||
var crono: PlayerObject = _add_player("Crono")
|
||||
await _play_first_song()
|
||||
|
||||
crono.add_point()
|
||||
crono.minus_point()
|
||||
crono.add_point()
|
||||
crono.minus_point()
|
||||
|
||||
assert_int(log_box.get_child_count()).is_equal(2)
|
||||
var time_pattern: RegEx = RegEx.create_from_string("^\\d\\d:\\d\\d:\\d\\d Crono got a point$")
|
||||
assert_object(time_pattern.search((log_box.get_child(0) as Label).text)).is_not_null()
|
||||
assert_str((log_box.get_child(1) as Label).text).ends_with("Crono lost a point")
|
||||
assert_int(log_box.get_child_count()).is_equal(2)
|
||||
var time_pattern: RegEx = RegEx.create_from_string("^\\d\\d:\\d\\d:\\d\\d Crono got a point$")
|
||||
assert_object(time_pattern.search((log_box.get_child(0) as Label).text)).is_not_null()
|
||||
assert_str((log_box.get_child(1) as Label).text).ends_with("Crono lost a point")
|
||||
@@ -3,39 +3,39 @@ extends MainWindowTestSuite
|
||||
|
||||
|
||||
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")
|
||||
_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")
|
||||
_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)
|
||||
# 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")
|
||||
_server.release("/music/list")
|
||||
|
||||
await _play_first_song()
|
||||
await _play_first_song()
|
||||
|
||||
assert_int(Playlist.currently_playing_song).is_equal(1)
|
||||
assert_int(Playlist.currently_playing_song).is_equal(1)
|
||||
|
||||
|
||||
func test_failed_song_list_is_retried_before_preloading() -> void:
|
||||
_quiz.song_fetch_retry_seconds = 0.05
|
||||
_server.respond_json("/music/list", [], 503)
|
||||
_server.release("/music/list")
|
||||
_quiz.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)
|
||||
assert_int(_server.count("/music/rand")).is_equal(0)
|
||||
|
||||
_server.respond_json("/music/list", [])
|
||||
await await_millis(200)
|
||||
_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)
|
||||
assert_int(_server.count("/music/rand")).is_equal(1)
|
||||
assert_int(Playlist.get_preloaded_songs()).is_equal(1)
|
||||
@@ -8,72 +8,72 @@ var _panel: MusicListPanel
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
_snapshot = AutoloadSnapshot.take([Settings, Playlist])
|
||||
Playlist.reset_playlist()
|
||||
for i: int in 3:
|
||||
var song: SongObject = SongObject.new()
|
||||
song.song_number = i
|
||||
song.soundtrack_title = "Soundtrack %d" % i
|
||||
song.song_title = "Song %d" % i
|
||||
song.has_played = true
|
||||
Playlist.add_to_playlist(song)
|
||||
_runner = scene_runner("res://MusicListPanel.tscn")
|
||||
_panel = _runner.scene()
|
||||
_snapshot = AutoloadSnapshot.take([Settings, Playlist])
|
||||
Playlist.reset_playlist()
|
||||
for i: int in 3:
|
||||
var song: SongObject = SongObject.new()
|
||||
song.song_number = i
|
||||
song.soundtrack_title = "Soundtrack %d" % i
|
||||
song.song_title = "Song %d" % i
|
||||
song.has_played = true
|
||||
Playlist.add_to_playlist(song)
|
||||
_runner = scene_runner("res://MusicListPanel.tscn")
|
||||
_panel = _runner.scene()
|
||||
|
||||
|
||||
func after_test() -> void:
|
||||
await await_idle_frame()
|
||||
_snapshot.restore()
|
||||
await await_idle_frame()
|
||||
_snapshot.restore()
|
||||
|
||||
|
||||
func _rows() -> Array[Node]:
|
||||
return _panel.get_node("ScrollContainer/MusicList").get_children()
|
||||
return _panel.get_node("ScrollContainer/MusicList").get_children()
|
||||
|
||||
|
||||
func test_starts_empty() -> void:
|
||||
assert_array(_rows()).is_empty()
|
||||
assert_array(_rows()).is_empty()
|
||||
|
||||
|
||||
func test_refresh_shows_one_row_per_song_in_order() -> void:
|
||||
_panel.refresh()
|
||||
_panel.refresh()
|
||||
|
||||
assert_array(_rows().map(func(row: SongListObject) -> int: return row.song_object.song_number)) \
|
||||
.contains_exactly([0, 1, 2])
|
||||
assert_array(_rows().map(func(row: SongListObject) -> int: return row.song_object.song_number)) \
|
||||
.contains_exactly([0, 1, 2])
|
||||
|
||||
|
||||
func test_refresh_again_replaces_the_rows() -> void:
|
||||
_panel.refresh()
|
||||
Playlist.song_object_array.pop_back()
|
||||
_panel.refresh()
|
||||
Playlist.song_object_array.pop_back()
|
||||
|
||||
_panel.refresh()
|
||||
_panel.refresh()
|
||||
|
||||
assert_int(_rows().size()).is_equal(2)
|
||||
assert_int(_rows().size()).is_equal(2)
|
||||
|
||||
|
||||
func test_clicking_a_row_tells_which_song() -> void:
|
||||
_panel.refresh()
|
||||
await _runner.simulate_frames(2)
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
var row: Control = _rows()[1]
|
||||
# The left end of the row is the song text, not one of the player icons
|
||||
var target: Vector2 = row.get_global_rect().position + Vector2(20, row.size.y / 2)
|
||||
_panel.refresh()
|
||||
await _runner.simulate_frames(2)
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
var row: Control = _rows()[1]
|
||||
# The left end of the row is the song text, not one of the player icons
|
||||
var target: Vector2 = row.get_global_rect().position + Vector2(20, row.size.y / 2)
|
||||
|
||||
_runner.set_mouse_position(_panel.get_viewport().get_final_transform() * target)
|
||||
await _runner.simulate_mouse_button_pressed(MOUSE_BUTTON_LEFT)
|
||||
await _runner.await_input_processed()
|
||||
_runner.set_mouse_position(_panel.get_viewport().get_final_transform() * target)
|
||||
await _runner.simulate_mouse_button_pressed(MOUSE_BUTTON_LEFT)
|
||||
await _runner.await_input_processed()
|
||||
|
||||
await signals.is_emitted("song_clicked", [1])
|
||||
await signals.is_emitted("song_clicked", [1])
|
||||
|
||||
|
||||
func test_right_click_does_nothing() -> void:
|
||||
_panel.refresh()
|
||||
await _runner.simulate_frames(2)
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
var row: Control = _rows()[0]
|
||||
_panel.refresh()
|
||||
await _runner.simulate_frames(2)
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
var row: Control = _rows()[0]
|
||||
|
||||
_runner.set_mouse_position(_panel.get_viewport().get_final_transform()
|
||||
* (row.get_global_rect().position + Vector2(20, row.size.y / 2)))
|
||||
await _runner.simulate_mouse_button_pressed(MOUSE_BUTTON_RIGHT)
|
||||
await _runner.await_input_processed()
|
||||
_runner.set_mouse_position(_panel.get_viewport().get_final_transform()
|
||||
* (row.get_global_rect().position + Vector2(20, row.size.y / 2)))
|
||||
await _runner.simulate_mouse_button_pressed(MOUSE_BUTTON_RIGHT)
|
||||
await _runner.await_input_processed()
|
||||
|
||||
await signals.wait_until(200).is_not_emitted("song_clicked")
|
||||
await signals.wait_until(200).is_not_emitted("song_clicked")
|
||||
@@ -10,143 +10,143 @@ var _lucca: PlayerObject
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
super()
|
||||
_crono = _add_player("Crono")
|
||||
_marle = _add_player("Marle")
|
||||
_lucca = _add_player("Lucca")
|
||||
await _play_first_song()
|
||||
super()
|
||||
_crono = _add_player("Crono")
|
||||
_marle = _add_player("Marle")
|
||||
_lucca = _add_player("Lucca")
|
||||
await _play_first_song()
|
||||
|
||||
|
||||
func _song_points() -> Array[String]:
|
||||
return Playlist.song_object_array[Playlist.currently_playing_song].players_given_point
|
||||
return Playlist.song_object_array[Playlist.currently_playing_song].players_given_point
|
||||
|
||||
|
||||
func test_alt_number_gives_point_to_player_in_that_row() -> void:
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(2)
|
||||
|
||||
assert_array(_scores()).contains_exactly([0, 1, 0])
|
||||
assert_array(_song_points()).contains_exactly([_marle.id])
|
||||
assert_array(_scores()).contains_exactly([0, 1, 0])
|
||||
assert_array(_song_points()).contains_exactly([_marle.id])
|
||||
|
||||
|
||||
func test_ctrl_alt_number_takes_point_from_player_in_that_row() -> void:
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(3)
|
||||
|
||||
await _take_point_with_keybind(3)
|
||||
await _take_point_with_keybind(3)
|
||||
|
||||
assert_array(_scores()).contains_exactly([0, 0, 1])
|
||||
assert_array(_scores()).contains_exactly([0, 0, 1])
|
||||
|
||||
|
||||
func test_taking_last_point_removes_player_from_song() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(1)
|
||||
|
||||
await _take_point_with_keybind(1)
|
||||
await _take_point_with_keybind(1)
|
||||
|
||||
assert_int(_crono.player_score).is_equal(0)
|
||||
assert_array(_song_points()).is_empty()
|
||||
assert_int(_crono.player_score).is_equal(0)
|
||||
assert_array(_song_points()).is_empty()
|
||||
|
||||
|
||||
func test_each_keybind_only_affects_its_own_player() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(3)
|
||||
|
||||
assert_int(_crono.player_score).is_equal(1)
|
||||
assert_int(_marle.player_score).is_equal(0)
|
||||
assert_int(_lucca.player_score).is_equal(2)
|
||||
assert_array(_song_points()).contains_exactly([_crono.id, _lucca.id])
|
||||
assert_int(_crono.player_score).is_equal(1)
|
||||
assert_int(_marle.player_score).is_equal(0)
|
||||
assert_int(_lucca.player_score).is_equal(2)
|
||||
assert_array(_song_points()).contains_exactly([_crono.id, _lucca.id])
|
||||
|
||||
|
||||
func test_number_without_player_does_nothing() -> void:
|
||||
await _give_point_with_keybind(4)
|
||||
await _give_point_with_keybind(4)
|
||||
|
||||
assert_array(_scores()).contains_exactly([0, 0, 0])
|
||||
assert_array(_song_points()).is_empty()
|
||||
assert_array(_scores()).contains_exactly([0, 0, 0])
|
||||
assert_array(_song_points()).is_empty()
|
||||
|
||||
|
||||
func test_keybinds_move_up_when_first_player_is_removed() -> void:
|
||||
await _remove_player(_crono)
|
||||
await _remove_player(_crono)
|
||||
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(2)
|
||||
|
||||
assert_int(_marle.player_score).is_equal(1)
|
||||
assert_int(_lucca.player_score).is_equal(2)
|
||||
assert_array(_song_points()).contains_exactly([_marle.id, _lucca.id])
|
||||
assert_int(_marle.player_score).is_equal(1)
|
||||
assert_int(_lucca.player_score).is_equal(2)
|
||||
assert_array(_song_points()).contains_exactly([_marle.id, _lucca.id])
|
||||
|
||||
|
||||
func test_keybind_after_last_row_does_nothing_after_removal() -> void:
|
||||
await _remove_player(_marle)
|
||||
await _remove_player(_marle)
|
||||
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(3)
|
||||
|
||||
assert_int(_crono.player_score).is_equal(0)
|
||||
assert_int(_lucca.player_score).is_equal(0)
|
||||
assert_int(_crono.player_score).is_equal(0)
|
||||
assert_int(_lucca.player_score).is_equal(0)
|
||||
|
||||
|
||||
func test_removing_player_removes_only_their_points() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(3)
|
||||
|
||||
await _remove_player(_marle)
|
||||
await _remove_player(_marle)
|
||||
|
||||
assert_array(_song_points()).contains_exactly([_crono.id, _lucca.id])
|
||||
assert_int(_crono.player_score).is_equal(1)
|
||||
assert_int(_lucca.player_score).is_equal(1)
|
||||
assert_array(_song_points()).contains_exactly([_crono.id, _lucca.id])
|
||||
assert_int(_crono.player_score).is_equal(1)
|
||||
assert_int(_lucca.player_score).is_equal(1)
|
||||
|
||||
|
||||
func test_new_player_gets_next_free_keybind_after_removal() -> void:
|
||||
await _remove_player(_marle)
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
await _remove_player(_marle)
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(2)
|
||||
await _give_point_with_keybind(3)
|
||||
|
||||
assert_int(_lucca.player_score).is_equal(1)
|
||||
assert_int(robo.player_score).is_equal(1)
|
||||
assert_int(_crono.player_score).is_equal(0)
|
||||
assert_array(_song_points()).contains_exactly([_lucca.id, robo.id])
|
||||
assert_int(_lucca.player_score).is_equal(1)
|
||||
assert_int(robo.player_score).is_equal(1)
|
||||
assert_int(_crono.player_score).is_equal(0)
|
||||
assert_array(_song_points()).contains_exactly([_lucca.id, robo.id])
|
||||
|
||||
|
||||
func test_new_player_does_not_inherit_removed_players_points() -> void:
|
||||
await _give_point_with_keybind(3)
|
||||
await _remove_player(_lucca)
|
||||
await _give_point_with_keybind(3)
|
||||
await _remove_player(_lucca)
|
||||
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
|
||||
assert_int(robo.player_score).is_equal(0)
|
||||
assert_array(_song_points()).is_empty()
|
||||
assert_int(robo.player_score).is_equal(0)
|
||||
assert_array(_song_points()).is_empty()
|
||||
|
||||
|
||||
func test_points_follow_players_through_several_changes() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
await _remove_player(_crono)
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
await _give_point_with_keybind(1)
|
||||
await _remove_player(_marle)
|
||||
var ayla: PlayerObject = _add_player("Ayla")
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(2)
|
||||
await _take_point_with_keybind(2)
|
||||
await _give_point_with_keybind(1)
|
||||
await _remove_player(_crono)
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
await _give_point_with_keybind(1)
|
||||
await _remove_player(_marle)
|
||||
var ayla: PlayerObject = _add_player("Ayla")
|
||||
await _give_point_with_keybind(3)
|
||||
await _give_point_with_keybind(2)
|
||||
await _take_point_with_keybind(2)
|
||||
|
||||
# Rows are now: Lucca, Robo, Ayla
|
||||
assert_array(Settings.player_array).contains_exactly([_lucca, robo, ayla])
|
||||
assert_int(_lucca.player_score).is_equal(0)
|
||||
assert_int(robo.player_score).is_equal(0)
|
||||
assert_int(ayla.player_score).is_equal(1)
|
||||
assert_array(_song_points()).contains_exactly([ayla.id])
|
||||
# Rows are now: Lucca, Robo, Ayla
|
||||
assert_array(Settings.player_array).contains_exactly([_lucca, robo, ayla])
|
||||
assert_int(_lucca.player_score).is_equal(0)
|
||||
assert_int(robo.player_score).is_equal(0)
|
||||
assert_int(ayla.player_score).is_equal(1)
|
||||
assert_array(_song_points()).contains_exactly([ayla.id])
|
||||
|
||||
|
||||
func test_player_list_shows_rows_in_player_order() -> void:
|
||||
await _remove_player(_crono)
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
await _remove_player(_crono)
|
||||
var robo: PlayerObject = _add_player("Robo")
|
||||
|
||||
var rows: Array[Node] = _quiz.get_node(
|
||||
"PlayersPanel/VBoxContainer/ScrollContainer/PlayersListVBoxContainer").get_children()
|
||||
var rows: Array[Node] = _quiz.get_node(
|
||||
"PlayersPanel/VBoxContainer/ScrollContainer/PlayersListVBoxContainer").get_children()
|
||||
|
||||
assert_array(rows.map(func(row: Player) -> PlayerObject: return row.player_object)) \
|
||||
.contains_exactly([_marle, _lucca, robo])
|
||||
assert_array(rows.map(func(row: Player) -> int: return row.list_index)) \
|
||||
.contains_exactly([0, 1, 2])
|
||||
assert_array(rows.map(func(row: Player) -> PlayerObject: return row.player_object)) \
|
||||
.contains_exactly([_marle, _lucca, robo])
|
||||
assert_array(rows.map(func(row: Player) -> int: return row.list_index)) \
|
||||
.contains_exactly([0, 1, 2])
|
||||
@@ -8,139 +8,139 @@ var _panel: PlayersPanel
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
_snapshot = AutoloadSnapshot.take([Settings])
|
||||
Settings.player_array.clear()
|
||||
Settings.edit_players = false
|
||||
_runner = scene_runner("res://PlayersPanel.tscn")
|
||||
_panel = _runner.scene()
|
||||
_snapshot = AutoloadSnapshot.take([Settings])
|
||||
Settings.player_array.clear()
|
||||
Settings.edit_players = false
|
||||
_runner = scene_runner("res://PlayersPanel.tscn")
|
||||
_panel = _runner.scene()
|
||||
|
||||
|
||||
func after_test() -> void:
|
||||
await await_idle_frame()
|
||||
_snapshot.restore()
|
||||
await await_idle_frame()
|
||||
_snapshot.restore()
|
||||
|
||||
|
||||
func _rows() -> Array[Node]:
|
||||
return _panel.players_list_container.get_children()
|
||||
return _panel.players_list_container.get_children()
|
||||
|
||||
|
||||
func _add(player_name: String) -> void:
|
||||
_panel.new_player_name_field.text = player_name
|
||||
_panel.add_player()
|
||||
_panel.new_player_name_field.text = player_name
|
||||
_panel.add_player()
|
||||
|
||||
|
||||
func _click(control: Control) -> void:
|
||||
_runner.set_mouse_position(_panel.get_viewport().get_final_transform()
|
||||
* control.get_global_rect().get_center())
|
||||
await _runner.simulate_mouse_button_pressed(MOUSE_BUTTON_LEFT)
|
||||
await _runner.await_input_processed()
|
||||
_runner.set_mouse_position(_panel.get_viewport().get_final_transform()
|
||||
* control.get_global_rect().get_center())
|
||||
await _runner.simulate_mouse_button_pressed(MOUSE_BUTTON_LEFT)
|
||||
await _runner.await_input_processed()
|
||||
|
||||
|
||||
func test_add_button_shows_and_hides_the_add_row() -> void:
|
||||
assert_bool(_panel.add_player_container.visible).is_false()
|
||||
assert_bool(_panel.add_player_container.visible).is_false()
|
||||
|
||||
await _click(_panel.add_players_button)
|
||||
assert_bool(_panel.add_player_container.visible).is_true()
|
||||
assert_bool(Settings.edit_players).is_true()
|
||||
await _click(_panel.add_players_button)
|
||||
assert_bool(_panel.add_player_container.visible).is_true()
|
||||
assert_bool(Settings.edit_players).is_true()
|
||||
|
||||
await _click(_panel.add_players_button)
|
||||
assert_bool(_panel.add_player_container.visible).is_false()
|
||||
assert_bool(Settings.edit_players).is_false()
|
||||
await _click(_panel.add_players_button)
|
||||
assert_bool(_panel.add_player_container.visible).is_false()
|
||||
assert_bool(Settings.edit_players).is_false()
|
||||
|
||||
|
||||
func test_adding_a_name_adds_a_player_and_a_row() -> void:
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
|
||||
_add("Crono")
|
||||
_add("Crono")
|
||||
|
||||
assert_int(Settings.player_array.size()).is_equal(1)
|
||||
var crono: PlayerObject = Settings.player_array[0]
|
||||
assert_str(crono.player_name).is_equal("Crono")
|
||||
await signals.is_emitted("player_added", [crono])
|
||||
assert_str(_panel.new_player_name_field.text).is_empty()
|
||||
assert_object((_rows()[0] as Player).player_object).is_same(crono)
|
||||
assert_int(Settings.player_array.size()).is_equal(1)
|
||||
var crono: PlayerObject = Settings.player_array[0]
|
||||
assert_str(crono.player_name).is_equal("Crono")
|
||||
await signals.is_emitted("player_added", [crono])
|
||||
assert_str(_panel.new_player_name_field.text).is_empty()
|
||||
assert_object((_rows()[0] as Player).player_object).is_same(crono)
|
||||
|
||||
|
||||
func test_add_button_in_the_row_adds_the_player() -> void:
|
||||
await _click(_panel.add_players_button)
|
||||
_panel.new_player_name_field.text = "Marle"
|
||||
await _click(_panel.add_players_button)
|
||||
_panel.new_player_name_field.text = "Marle"
|
||||
|
||||
await _click(_panel.add_player_button)
|
||||
await _click(_panel.add_player_button)
|
||||
|
||||
assert_int(Settings.player_array.size()).is_equal(1)
|
||||
assert_int(Settings.player_array.size()).is_equal(1)
|
||||
|
||||
|
||||
func test_enter_in_the_name_field_adds_the_player() -> void:
|
||||
await _click(_panel.add_players_button)
|
||||
_panel.new_player_name_field.text = "Lucca"
|
||||
_panel.new_player_name_field.grab_focus()
|
||||
await _click(_panel.add_players_button)
|
||||
_panel.new_player_name_field.text = "Lucca"
|
||||
_panel.new_player_name_field.grab_focus()
|
||||
|
||||
_runner.simulate_key_pressed(KEY_ENTER)
|
||||
await _runner.await_input_processed()
|
||||
_runner.simulate_key_pressed(KEY_ENTER)
|
||||
await _runner.await_input_processed()
|
||||
|
||||
assert_array(Settings.player_array.map(
|
||||
func(p: PlayerObject) -> String: return p.player_name)).contains_exactly(["Lucca"])
|
||||
assert_array(Settings.player_array.map(
|
||||
func(p: PlayerObject) -> String: return p.player_name)).contains_exactly(["Lucca"])
|
||||
|
||||
|
||||
func test_empty_name_adds_nobody() -> void:
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
|
||||
_add("")
|
||||
_add("")
|
||||
|
||||
assert_array(Settings.player_array).is_empty()
|
||||
assert_array(_rows()).is_empty()
|
||||
await signals.wait_until(200).is_not_emitted("player_added")
|
||||
assert_array(Settings.player_array).is_empty()
|
||||
assert_array(_rows()).is_empty()
|
||||
await signals.wait_until(200).is_not_emitted("player_added")
|
||||
|
||||
|
||||
func test_cannot_add_more_than_max_players() -> void:
|
||||
for i: int in Settings.MAX_NUMBER_OF_PLAYERS + 1:
|
||||
_add("Player %d" % i)
|
||||
for i: int in Settings.MAX_NUMBER_OF_PLAYERS + 1:
|
||||
_add("Player %d" % i)
|
||||
|
||||
assert_int(Settings.player_array.size()).is_equal(Settings.MAX_NUMBER_OF_PLAYERS)
|
||||
assert_int(_rows().size()).is_equal(Settings.MAX_NUMBER_OF_PLAYERS)
|
||||
assert_int(Settings.player_array.size()).is_equal(Settings.MAX_NUMBER_OF_PLAYERS)
|
||||
assert_int(_rows().size()).is_equal(Settings.MAX_NUMBER_OF_PLAYERS)
|
||||
|
||||
|
||||
func test_rows_follow_player_order_and_numbering() -> void:
|
||||
_add("Crono")
|
||||
_add("Marle")
|
||||
_add("Lucca")
|
||||
_add("Crono")
|
||||
_add("Marle")
|
||||
_add("Lucca")
|
||||
|
||||
assert_array(_rows().map(func(row: Player) -> String: return row.player_object.player_name)) \
|
||||
.contains_exactly(["Crono", "Marle", "Lucca"])
|
||||
assert_array(_rows().map(func(row: Player) -> int: return row.list_index)) \
|
||||
.contains_exactly([0, 1, 2])
|
||||
assert_array(_rows().map(func(row: Player) -> String: return row.player_object.player_name)) \
|
||||
.contains_exactly(["Crono", "Marle", "Lucca"])
|
||||
assert_array(_rows().map(func(row: Player) -> int: return row.list_index)) \
|
||||
.contains_exactly([0, 1, 2])
|
||||
|
||||
|
||||
func test_remove_button_removes_the_player_and_row() -> void:
|
||||
_add("Crono")
|
||||
_add("Marle")
|
||||
var crono: PlayerObject = Settings.player_array[0]
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
_add("Crono")
|
||||
_add("Marle")
|
||||
var crono: PlayerObject = Settings.player_array[0]
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
|
||||
(_rows()[0].get_node("HBoxContainer/RemovePlayer") as BaseButton).pressed.emit()
|
||||
(_rows()[0].get_node("HBoxContainer/RemovePlayer") as BaseButton).pressed.emit()
|
||||
|
||||
await signals.is_emitted("player_removed", [crono])
|
||||
assert_array(Settings.player_array.map(
|
||||
func(p: PlayerObject) -> String: return p.player_name)).contains_exactly(["Marle"])
|
||||
assert_int(_rows().size()).is_equal(1)
|
||||
assert_int((_rows()[0] as Player).list_index).is_equal(0)
|
||||
await signals.is_emitted("player_removed", [crono])
|
||||
assert_array(Settings.player_array.map(
|
||||
func(p: PlayerObject) -> String: return p.player_name)).contains_exactly(["Marle"])
|
||||
assert_int(_rows().size()).is_equal(1)
|
||||
assert_int((_rows()[0] as Player).list_index).is_equal(0)
|
||||
|
||||
|
||||
func test_character_button_asks_for_a_new_character() -> void:
|
||||
_add("Crono")
|
||||
var row: Player = _rows()[0]
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
_add("Crono")
|
||||
var row: Player = _rows()[0]
|
||||
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
||||
|
||||
(row.get_node("HBoxContainer/Character") as BaseButton).pressed.emit()
|
||||
(row.get_node("HBoxContainer/Character") as BaseButton).pressed.emit()
|
||||
|
||||
await signals.is_emitted("change_character_requested", [row, "Crono"])
|
||||
await signals.is_emitted("change_character_requested", [row, "Crono"])
|
||||
|
||||
|
||||
func test_reload_shows_new_scores() -> void:
|
||||
_add("Crono")
|
||||
Settings.player_array[0].player_score = 3
|
||||
_add("Crono")
|
||||
Settings.player_array[0].player_score = 3
|
||||
|
||||
_panel.reload()
|
||||
_panel.reload()
|
||||
|
||||
assert_str(((_rows()[0] as Player).get_node("HBoxContainer/Name") as Label).text) \
|
||||
.ends_with("Crono: 3")
|
||||
assert_str(((_rows()[0] as Player).get_node("HBoxContainer/Name") as Label).text) \
|
||||
.ends_with("Crono: 3")
|
||||
@@ -5,127 +5,127 @@ extends MainWindowTestSuite
|
||||
|
||||
## Popups opened from the top bar, in the main window.
|
||||
const MAIN_POPUPS: Array[String] = [
|
||||
"Search", "SyncWindow", "QRWindow", "ShortcutsWindow", "AboutWindow",
|
||||
"Search", "SyncWindow", "QRWindow", "ShortcutsWindow", "AboutWindow",
|
||||
]
|
||||
|
||||
## Popups opened from the quiz, in the Quiz scene.
|
||||
const QUIZ_POPUPS: Array[String] = [
|
||||
"SettingsWindow", "NewCharacterSelect", "WinnerWindow", "Log",
|
||||
"SettingsWindow", "NewCharacterSelect", "WinnerWindow", "Log",
|
||||
]
|
||||
|
||||
|
||||
func _popup(node_name: String) -> PopupWindow:
|
||||
return _quiz.get_node(node_name) if node_name in QUIZ_POPUPS \
|
||||
else _window.get_node(node_name)
|
||||
return _quiz.get_node(node_name) if node_name in QUIZ_POPUPS \
|
||||
else _window.get_node(node_name)
|
||||
|
||||
|
||||
## The backdrop that shows behind [param popup].
|
||||
func _backdrop(popup: PopupWindow = _popup("SettingsWindow")) -> ColorRect:
|
||||
return popup.get_parent().get_node("PopupBackdrop")
|
||||
return popup.get_parent().get_node("PopupBackdrop")
|
||||
|
||||
|
||||
## A point on screen outside the popup's panel.
|
||||
func _outside(popup: PopupWindow) -> Vector2:
|
||||
var rect: Rect2 = popup.panel.get_global_rect()
|
||||
return Vector2(rect.end.x + 5, rect.end.y + 5) if rect.end.x < 1900 \
|
||||
else Vector2(rect.position.x - 5, rect.position.y - 5)
|
||||
var rect: Rect2 = popup.panel.get_global_rect()
|
||||
return Vector2(rect.end.x + 5, rect.end.y + 5) if rect.end.x < 1900 \
|
||||
else Vector2(rect.position.x - 5, rect.position.y - 5)
|
||||
|
||||
|
||||
func test_backdrops_are_hidden_without_popups() -> void:
|
||||
assert_bool(_backdrop(_popup("SettingsWindow")).visible).is_false()
|
||||
assert_bool(_backdrop(_popup("AboutWindow")).visible).is_false()
|
||||
assert_bool(_backdrop(_popup("SettingsWindow")).visible).is_false()
|
||||
assert_bool(_backdrop(_popup("AboutWindow")).visible).is_false()
|
||||
|
||||
|
||||
func test_backdrops_cover_the_whole_window() -> void:
|
||||
for node_name: String in ["SettingsWindow", "AboutWindow"]:
|
||||
var popup: PopupWindow = _popup(node_name)
|
||||
popup.open()
|
||||
for node_name: String in ["SettingsWindow", "AboutWindow"]:
|
||||
var popup: PopupWindow = _popup(node_name)
|
||||
popup.open()
|
||||
|
||||
assert_object(_backdrop(popup).get_global_rect()).override_failure_message(
|
||||
"%s: backdrop does not cover the window" % node_name) \
|
||||
.is_equal(_window.get_viewport_rect())
|
||||
popup.close()
|
||||
assert_object(_backdrop(popup).get_global_rect()).override_failure_message(
|
||||
"%s: backdrop does not cover the window" % node_name) \
|
||||
.is_equal(_window.get_viewport_rect())
|
||||
popup.close()
|
||||
|
||||
|
||||
func test_every_popup_is_a_popup_window() -> void:
|
||||
for node_name: String in MAIN_POPUPS + QUIZ_POPUPS:
|
||||
assert_object(_popup(node_name)).is_instanceof(PopupWindow)
|
||||
for node_name: String in MAIN_POPUPS + QUIZ_POPUPS:
|
||||
assert_object(_popup(node_name)).is_instanceof(PopupWindow)
|
||||
|
||||
|
||||
func test_every_popup_shows_backdrop_and_closes_on_outside_click() -> void:
|
||||
for node_name: String in MAIN_POPUPS + QUIZ_POPUPS:
|
||||
var popup: PopupWindow = _popup(node_name)
|
||||
popup.open()
|
||||
await _runner.simulate_frames(1)
|
||||
assert_bool(_backdrop(popup).visible).override_failure_message(
|
||||
"%s: backdrop not shown" % node_name).is_true()
|
||||
for node_name: String in MAIN_POPUPS + QUIZ_POPUPS:
|
||||
var popup: PopupWindow = _popup(node_name)
|
||||
popup.open()
|
||||
await _runner.simulate_frames(1)
|
||||
assert_bool(_backdrop(popup).visible).override_failure_message(
|
||||
"%s: backdrop not shown" % node_name).is_true()
|
||||
|
||||
await _click_at(_outside(popup))
|
||||
await _click_at(_outside(popup))
|
||||
|
||||
assert_bool(popup.visible).override_failure_message(
|
||||
"%s: not closed by outside click" % node_name).is_false()
|
||||
assert_bool(_backdrop(popup).visible).override_failure_message(
|
||||
"%s: backdrop still shown" % node_name).is_false()
|
||||
assert_bool(popup.visible).override_failure_message(
|
||||
"%s: not closed by outside click" % node_name).is_false()
|
||||
assert_bool(_backdrop(popup).visible).override_failure_message(
|
||||
"%s: backdrop still shown" % node_name).is_false()
|
||||
|
||||
|
||||
func test_click_inside_popup_keeps_it_open() -> void:
|
||||
var settings: PopupWindow = _popup("SettingsWindow")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
var settings: PopupWindow = _popup("SettingsWindow")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
|
||||
await _click_at(settings.panel.get_global_rect().get_center())
|
||||
await _click_at(settings.panel.get_global_rect().get_center())
|
||||
|
||||
assert_bool(settings.visible).is_true()
|
||||
assert_bool(settings.visible).is_true()
|
||||
|
||||
|
||||
func test_closing_click_does_not_press_button_behind_popup() -> void:
|
||||
var settings: PopupWindow = _popup("SettingsWindow")
|
||||
var reset_button: Button = _quiz.get_node("ResetPlaylistButton")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
assert_bool(settings.panel.get_global_rect().intersects(reset_button.get_global_rect())) \
|
||||
.is_false()
|
||||
var settings: PopupWindow = _popup("SettingsWindow")
|
||||
var reset_button: Button = _quiz.get_node("ResetPlaylistButton")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
assert_bool(settings.panel.get_global_rect().intersects(reset_button.get_global_rect())) \
|
||||
.is_false()
|
||||
|
||||
await _click_at(reset_button.get_global_rect().get_center())
|
||||
await _click_at(reset_button.get_global_rect().get_center())
|
||||
|
||||
assert_bool(settings.visible).is_false()
|
||||
assert_int(_server.count("/music/reset")).is_equal(0)
|
||||
assert_bool(settings.visible).is_false()
|
||||
assert_int(_server.count("/music/reset")).is_equal(0)
|
||||
|
||||
|
||||
func test_button_works_again_after_popup_closed() -> void:
|
||||
var reset_button: Button = _quiz.get_node("ResetPlaylistButton")
|
||||
var reset_button: Button = _quiz.get_node("ResetPlaylistButton")
|
||||
|
||||
await _click_at(reset_button.get_global_rect().get_center())
|
||||
await _click_at(reset_button.get_global_rect().get_center())
|
||||
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
|
||||
|
||||
func test_closing_search_clears_the_search() -> void:
|
||||
var search: PopupWindow = _popup("Search")
|
||||
search.open()
|
||||
var search_bar: TextEdit = search.get_node("Searchbar")
|
||||
search_bar.text = "mario"
|
||||
var search: PopupWindow = _popup("Search")
|
||||
search.open()
|
||||
var search_bar: TextEdit = search.get_node("Searchbar")
|
||||
search_bar.text = "mario"
|
||||
|
||||
search.close()
|
||||
search.close()
|
||||
|
||||
assert_str(search_bar.text).is_empty()
|
||||
assert_str(search_bar.text).is_empty()
|
||||
|
||||
|
||||
func test_closing_character_select_allows_song_clicks_again() -> void:
|
||||
var character_select: PopupWindow = _popup("NewCharacterSelect")
|
||||
character_select.show_grid("Crono")
|
||||
assert_bool(Settings.character_select_open).is_true()
|
||||
var character_select: PopupWindow = _popup("NewCharacterSelect")
|
||||
character_select.show_grid("Crono")
|
||||
assert_bool(Settings.character_select_open).is_true()
|
||||
|
||||
character_select.close()
|
||||
character_select.close()
|
||||
|
||||
assert_bool(Settings.character_select_open).is_false()
|
||||
assert_bool(Settings.character_select_open).is_false()
|
||||
|
||||
|
||||
func test_toggle_opens_and_closes() -> void:
|
||||
var shortcuts: PopupWindow = _popup("ShortcutsWindow")
|
||||
var shortcuts: PopupWindow = _popup("ShortcutsWindow")
|
||||
|
||||
shortcuts.toggle()
|
||||
assert_bool(shortcuts.visible).is_true()
|
||||
shortcuts.toggle()
|
||||
assert_bool(shortcuts.visible).is_true()
|
||||
|
||||
shortcuts.toggle()
|
||||
assert_bool(shortcuts.visible).is_false()
|
||||
shortcuts.toggle()
|
||||
assert_bool(shortcuts.visible).is_false()
|
||||
@@ -5,239 +5,239 @@ extends MainWindowTestSuite
|
||||
## server and the keyboard shortcuts reach both the main window and the quiz.
|
||||
|
||||
const MAIN_WINDOW_CHILDREN: Array[String] = [
|
||||
"TopBar", "Quiz", "PopupBackdrop", "Search", "SyncWindow", "QRWindow",
|
||||
"ShortcutsWindow", "StatisticsPopupPanel", "AboutWindow",
|
||||
"TopBar", "Quiz", "PopupBackdrop", "Search", "SyncWindow", "QRWindow",
|
||||
"ShortcutsWindow", "StatisticsPopupPanel", "AboutWindow",
|
||||
]
|
||||
|
||||
const TOP_BAR_CHILDREN: Array[String] = [
|
||||
"TopPanelContainer", "Title", "SyncButton", "SearchButton", "StatisticsButton",
|
||||
"ShortcutsButton", "AboutButton", "QRButton",
|
||||
"TopPanelContainer", "Title", "SyncButton", "SearchButton", "StatisticsButton",
|
||||
"ShortcutsButton", "AboutButton", "QRButton",
|
||||
]
|
||||
|
||||
## Each top bar button and the popup it opens in the main window.
|
||||
const TOP_BAR_POPUPS: Dictionary = {
|
||||
"SearchButton": "Search",
|
||||
"SyncButton": "SyncWindow",
|
||||
"StatisticsButton": "StatisticsPopupPanel",
|
||||
"ShortcutsButton": "ShortcutsWindow",
|
||||
"AboutButton": "AboutWindow",
|
||||
"QRButton": "QRWindow",
|
||||
"SearchButton": "Search",
|
||||
"SyncButton": "SyncWindow",
|
||||
"StatisticsButton": "StatisticsPopupPanel",
|
||||
"ShortcutsButton": "ShortcutsWindow",
|
||||
"AboutButton": "AboutWindow",
|
||||
"QRButton": "QRWindow",
|
||||
}
|
||||
|
||||
|
||||
func _top_bar_button(button_name: String) -> Button:
|
||||
return _window.get_node("TopBar/" + button_name)
|
||||
return _window.get_node("TopBar/" + button_name)
|
||||
|
||||
|
||||
func _children(node: Node) -> Array[String]:
|
||||
var names: Array[String] = []
|
||||
for child: Node in node.get_children():
|
||||
names.append(String(child.name))
|
||||
return names
|
||||
var names: Array[String] = []
|
||||
for child: Node in node.get_children():
|
||||
names.append(String(child.name))
|
||||
return names
|
||||
|
||||
|
||||
func _center(control: Control) -> Vector2:
|
||||
return control.get_global_rect().get_center()
|
||||
return control.get_global_rect().get_center()
|
||||
|
||||
|
||||
func test_main_window_holds_only_top_bar_quiz_and_its_popups() -> void:
|
||||
assert_array(_children(_window)).contains_exactly_in_any_order(MAIN_WINDOW_CHILDREN)
|
||||
assert_array(_children(_window)).contains_exactly_in_any_order(MAIN_WINDOW_CHILDREN)
|
||||
|
||||
|
||||
func test_top_bar_is_drawn_below_the_quiz() -> void:
|
||||
# The quiz popups' backdrop has to cover the top bar too
|
||||
assert_int(_window.get_node("TopBar").get_index()) \
|
||||
.is_less(_window.get_node("Quiz").get_index())
|
||||
# The quiz popups' backdrop has to cover the top bar too
|
||||
assert_int(_window.get_node("TopBar").get_index()) \
|
||||
.is_less(_window.get_node("Quiz").get_index())
|
||||
|
||||
|
||||
func test_quiz_parts_are_their_own_scenes() -> void:
|
||||
for node_name: String in ["MusicListPanel", "PlayersPanel", "InspirationList"]:
|
||||
assert_str(_quiz.get_node(node_name).scene_file_path) \
|
||||
.is_equal("res://%s.tscn" % node_name)
|
||||
for node_name: String in ["MusicListPanel", "PlayersPanel", "InspirationList"]:
|
||||
assert_str(_quiz.get_node(node_name).scene_file_path) \
|
||||
.is_equal("res://%s.tscn" % node_name)
|
||||
|
||||
|
||||
func test_top_bar_holds_only_title_and_buttons() -> void:
|
||||
assert_array(_children(_window.get_node("TopBar"))) \
|
||||
.contains_exactly_in_any_order(TOP_BAR_CHILDREN)
|
||||
assert_array(_children(_window.get_node("TopBar"))) \
|
||||
.contains_exactly_in_any_order(TOP_BAR_CHILDREN)
|
||||
|
||||
|
||||
func test_quiz_and_top_bar_let_clicks_through_where_they_are_empty() -> void:
|
||||
assert_int(_quiz.mouse_filter).is_equal(Control.MOUSE_FILTER_IGNORE)
|
||||
assert_int((_window.get_node("TopBar") as Control).mouse_filter) \
|
||||
.is_equal(Control.MOUSE_FILTER_IGNORE)
|
||||
assert_int(_quiz.mouse_filter).is_equal(Control.MOUSE_FILTER_IGNORE)
|
||||
assert_int((_window.get_node("TopBar") as Control).mouse_filter) \
|
||||
.is_equal(Control.MOUSE_FILTER_IGNORE)
|
||||
|
||||
|
||||
func test_clicking_each_top_bar_button_opens_its_popup() -> void:
|
||||
for button_name: String in TOP_BAR_POPUPS:
|
||||
var popup: Node = _window.get_node(TOP_BAR_POPUPS[button_name])
|
||||
for button_name: String in TOP_BAR_POPUPS:
|
||||
var popup: Node = _window.get_node(TOP_BAR_POPUPS[button_name])
|
||||
|
||||
await _click_at(_center(_top_bar_button(button_name)))
|
||||
await _click_at(_center(_top_bar_button(button_name)))
|
||||
|
||||
assert_bool(popup.visible).override_failure_message(
|
||||
"%s did not open %s" % [button_name, popup.name]).is_true()
|
||||
if popup is PopupWindow:
|
||||
popup.close()
|
||||
else:
|
||||
popup.visible = false
|
||||
await _runner.simulate_frames(1)
|
||||
assert_bool(popup.visible).override_failure_message(
|
||||
"%s did not open %s" % [button_name, popup.name]).is_true()
|
||||
if popup is PopupWindow:
|
||||
popup.close()
|
||||
else:
|
||||
popup.visible = false
|
||||
await _runner.simulate_frames(1)
|
||||
|
||||
|
||||
func test_clicking_quiz_buttons_plays_and_shows_answer() -> void:
|
||||
await _click_at(_center(_quiz.get_node("NextButton")))
|
||||
await _runner.simulate_frames(2)
|
||||
assert_int(Playlist.currently_playing_song).is_equal(0)
|
||||
assert_str((_quiz.get_node("VBoxContainer/SoundtrackLabel") as Label).text) \
|
||||
.is_not_equal("Chrono Trigger")
|
||||
await _click_at(_center(_quiz.get_node("NextButton")))
|
||||
await _runner.simulate_frames(2)
|
||||
assert_int(Playlist.currently_playing_song).is_equal(0)
|
||||
assert_str((_quiz.get_node("VBoxContainer/SoundtrackLabel") as Label).text) \
|
||||
.is_not_equal("Chrono Trigger")
|
||||
|
||||
await _click_at(_center(_quiz.get_node("ShowAnswerButton")))
|
||||
await _click_at(_center(_quiz.get_node("ShowAnswerButton")))
|
||||
|
||||
assert_str((_quiz.get_node("VBoxContainer/SoundtrackLabel") as Label).text) \
|
||||
.is_equal("Chrono Trigger")
|
||||
assert_str((_quiz.get_node("VBoxContainer/SoundtrackLabel") as Label).text) \
|
||||
.is_equal("Chrono Trigger")
|
||||
|
||||
|
||||
func test_clicking_a_song_in_the_music_list_plays_it() -> void:
|
||||
_next_song_is(SONG_INFO[1])
|
||||
await _play_first_song()
|
||||
_press("NextButton")
|
||||
# Changing song waits a moment for the old one to stop
|
||||
await get_tree().create_timer(0.7).timeout
|
||||
assert_int(Playlist.currently_playing_song).is_equal(1)
|
||||
var rows: Array[Node] = _quiz.get_node("MusicListPanel/ScrollContainer/MusicList") \
|
||||
.get_children()
|
||||
var first_row: Control = rows.filter(
|
||||
func(row: SongListObject) -> bool: return row.song_object.song_number == 0)[0]
|
||||
_next_song_is(SONG_INFO[1])
|
||||
await _play_first_song()
|
||||
_press("NextButton")
|
||||
# Changing song waits a moment for the old one to stop
|
||||
await get_tree().create_timer(0.7).timeout
|
||||
assert_int(Playlist.currently_playing_song).is_equal(1)
|
||||
var rows: Array[Node] = _quiz.get_node("MusicListPanel/ScrollContainer/MusicList") \
|
||||
.get_children()
|
||||
var first_row: Control = rows.filter(
|
||||
func(row: SongListObject) -> bool: return row.song_object.song_number == 0)[0]
|
||||
|
||||
await _click_at(first_row.get_global_rect().position + Vector2(20, first_row.size.y / 2))
|
||||
await get_tree().create_timer(0.7).timeout
|
||||
await _click_at(first_row.get_global_rect().position + Vector2(20, first_row.size.y / 2))
|
||||
await get_tree().create_timer(0.7).timeout
|
||||
|
||||
assert_int(Playlist.currently_playing_song).is_equal(0)
|
||||
assert_int(Playlist.currently_playing_song).is_equal(0)
|
||||
|
||||
|
||||
func test_points_from_the_player_list_reach_the_song_and_log() -> void:
|
||||
await _play_first_song()
|
||||
var crono: PlayerObject = _add_player("Crono")
|
||||
await _play_first_song()
|
||||
var crono: PlayerObject = _add_player("Crono")
|
||||
|
||||
(_player_row(crono).get_node("HBoxContainer/AddPoint") as BaseButton).pressed.emit()
|
||||
(_player_row(crono).get_node("HBoxContainer/AddPoint") as BaseButton).pressed.emit()
|
||||
|
||||
assert_array(Playlist.song_object_array[0].players_given_point).contains_exactly([crono.id])
|
||||
assert_int((_quiz.get_node("%Log").get_node("%LogVBoxContainer") as Node).get_child_count()) \
|
||||
.is_equal(1)
|
||||
assert_array(Playlist.song_object_array[0].players_given_point).contains_exactly([crono.id])
|
||||
assert_int((_quiz.get_node("%Log").get_node("%LogVBoxContainer") as Node).get_child_count()) \
|
||||
.is_equal(1)
|
||||
|
||||
|
||||
func test_character_button_in_the_player_list_picks_a_new_character() -> void:
|
||||
var crono: PlayerObject = _add_player("Crono")
|
||||
var character_select: PopupWindow = _quiz.get_node("NewCharacterSelect")
|
||||
var crono: PlayerObject = _add_player("Crono")
|
||||
var character_select: PopupWindow = _quiz.get_node("NewCharacterSelect")
|
||||
|
||||
(_player_row(crono).get_node("HBoxContainer/Character") as BaseButton).pressed.emit()
|
||||
(_player_row(crono).get_node("HBoxContainer/Character") as BaseButton).pressed.emit()
|
||||
|
||||
assert_bool(character_select.visible).is_true()
|
||||
var texture: ImageTexture = ImageTexture.create_from_image(
|
||||
Image.create(4, 4, false, Image.FORMAT_RGBA8))
|
||||
character_select.new_new_character_selected.emit(texture)
|
||||
assert_object(crono.character).is_same(texture)
|
||||
assert_bool(character_select.visible).is_true()
|
||||
var texture: ImageTexture = ImageTexture.create_from_image(
|
||||
Image.create(4, 4, false, Image.FORMAT_RGBA8))
|
||||
character_select.new_new_character_selected.emit(texture)
|
||||
assert_object(crono.character).is_same(texture)
|
||||
|
||||
|
||||
func test_quiz_popup_backdrop_covers_the_top_bar() -> void:
|
||||
var settings: PopupWindow = _quiz.get_node("SettingsWindow")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
var settings: PopupWindow = _quiz.get_node("SettingsWindow")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
|
||||
var backdrop: Control = _quiz.get_node("PopupBackdrop")
|
||||
assert_bool(backdrop.visible).is_true()
|
||||
assert_bool(backdrop.get_global_rect().encloses(
|
||||
(_window.get_node("TopBar/TopPanelContainer") as Control).get_global_rect())) \
|
||||
.is_true()
|
||||
var backdrop: Control = _quiz.get_node("PopupBackdrop")
|
||||
assert_bool(backdrop.visible).is_true()
|
||||
assert_bool(backdrop.get_global_rect().encloses(
|
||||
(_window.get_node("TopBar/TopPanelContainer") as Control).get_global_rect())) \
|
||||
.is_true()
|
||||
|
||||
|
||||
func test_click_on_top_bar_while_quiz_popup_is_open_only_closes_it() -> void:
|
||||
var settings: PopupWindow = _quiz.get_node("SettingsWindow")
|
||||
var search: PopupWindow = _window.get_node("Search")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
var settings: PopupWindow = _quiz.get_node("SettingsWindow")
|
||||
var search: PopupWindow = _window.get_node("Search")
|
||||
settings.open()
|
||||
await _runner.simulate_frames(1)
|
||||
|
||||
await _click_at(_center(_top_bar_button("SearchButton")))
|
||||
await _click_at(_center(_top_bar_button("SearchButton")))
|
||||
|
||||
assert_bool(settings.visible).is_false()
|
||||
assert_bool(search.visible).is_false()
|
||||
assert_bool(settings.visible).is_false()
|
||||
assert_bool(search.visible).is_false()
|
||||
|
||||
|
||||
func test_sync_disables_quiz_buttons_until_finished() -> void:
|
||||
_server.respond_bytes("/sync", PackedByteArray())
|
||||
_server.respond_json("/sync/progress", {"progress": 10, "time_spent": "00:00:01"})
|
||||
var sync_window: PopupWindow = _window.get_node("SyncWindow")
|
||||
_server.respond_bytes("/sync", PackedByteArray())
|
||||
_server.respond_json("/sync/progress", {"progress": 10, "time_spent": "00:00:01"})
|
||||
var sync_window: PopupWindow = _window.get_node("SyncWindow")
|
||||
|
||||
_top_bar_button("SyncButton").pressed.emit()
|
||||
sync_window.sync_timer.stop()
|
||||
_top_bar_button("SyncButton").pressed.emit()
|
||||
sync_window.sync_timer.stop()
|
||||
|
||||
for button_name: String in ["SoundTestButton", "ResetPlaylistButton", "ShowAnswerButton",
|
||||
"NextButton"]:
|
||||
assert_bool((_quiz.get_node(button_name) as Button).disabled) \
|
||||
.override_failure_message(button_name + " not disabled").is_true()
|
||||
assert_bool(_top_bar_button("SyncButton").disabled).is_false()
|
||||
for button_name: String in ["SoundTestButton", "ResetPlaylistButton", "ShowAnswerButton",
|
||||
"NextButton"]:
|
||||
assert_bool((_quiz.get_node(button_name) as Button).disabled) \
|
||||
.override_failure_message(button_name + " not disabled").is_true()
|
||||
assert_bool(_top_bar_button("SyncButton").disabled).is_false()
|
||||
|
||||
_server.respond_json("/sync/progress", UiTour.SYNC_RESULT)
|
||||
var reloads_before: int = _server.count("/music/all/order")
|
||||
sync_window._on_sync_timeout()
|
||||
await _runner.simulate_frames(2)
|
||||
_server.respond_json("/sync/progress", UiTour.SYNC_RESULT)
|
||||
var reloads_before: int = _server.count("/music/all/order")
|
||||
sync_window._on_sync_timeout()
|
||||
await _runner.simulate_frames(2)
|
||||
|
||||
for button_name: String in ["SoundTestButton", "ResetPlaylistButton", "ShowAnswerButton",
|
||||
"NextButton"]:
|
||||
assert_bool((_quiz.get_node(button_name) as Button).disabled) \
|
||||
.override_failure_message(button_name + " still disabled").is_false()
|
||||
# The search list in the main window and the quiz playlist are both reloaded
|
||||
assert_int(_server.count("/music/all/order")).is_equal(reloads_before + 1)
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
for button_name: String in ["SoundTestButton", "ResetPlaylistButton", "ShowAnswerButton",
|
||||
"NextButton"]:
|
||||
assert_bool((_quiz.get_node(button_name) as Button).disabled) \
|
||||
.override_failure_message(button_name + " still disabled").is_false()
|
||||
# The search list in the main window and the quiz playlist are both reloaded
|
||||
assert_int(_server.count("/music/all/order")).is_equal(reloads_before + 1)
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
|
||||
|
||||
func test_changing_server_reloads_search_and_quiz() -> void:
|
||||
var search_loads: int = _server.count("/music/all/order")
|
||||
var inspiration_loads: int = _server.count("/music/all")
|
||||
var player: PlayerObject = _add_player("Crono")
|
||||
player.add_point()
|
||||
var search_loads: int = _server.count("/music/all/order")
|
||||
var inspiration_loads: int = _server.count("/music/all")
|
||||
var player: PlayerObject = _add_player("Crono")
|
||||
player.add_point()
|
||||
|
||||
_quiz.get_node("SettingsWindow").server_changed.emit()
|
||||
_quiz.get_node("SettingsWindow").server_changed.emit()
|
||||
|
||||
assert_int(_server.count("/music/all/order")).is_equal(search_loads + 1)
|
||||
assert_int(_server.count("/music/all")).is_equal(inspiration_loads + 1)
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
assert_int(player.player_score).is_equal(0)
|
||||
assert_int(_server.count("/music/all/order")).is_equal(search_loads + 1)
|
||||
assert_int(_server.count("/music/all")).is_equal(inspiration_loads + 1)
|
||||
assert_int(_server.count("/music/reset")).is_equal(1)
|
||||
assert_int(player.player_score).is_equal(0)
|
||||
|
||||
|
||||
func test_alt_k_opens_shortcuts_and_alt_l_opens_log() -> void:
|
||||
await _press_keys([KEY_ALT, KEY_K])
|
||||
assert_bool((_window.get_node("ShortcutsWindow") as Control).visible).is_true()
|
||||
await _press_keys([KEY_ALT, KEY_K])
|
||||
assert_bool((_window.get_node("ShortcutsWindow") as Control).visible).is_true()
|
||||
|
||||
await _press_keys([KEY_ALT, KEY_L])
|
||||
assert_bool((_quiz.get_node("Log") as Control).visible).is_true()
|
||||
await _press_keys([KEY_ALT, KEY_L])
|
||||
assert_bool((_quiz.get_node("Log") as Control).visible).is_true()
|
||||
|
||||
|
||||
func test_alt_down_lowers_the_volume() -> void:
|
||||
var bus: int = AudioServer.get_bus_index("Master")
|
||||
var volume_db: float = AudioServer.get_bus_volume_db(bus)
|
||||
var slider: HSlider = _quiz.get_node("MusicPlayer").volume_slider
|
||||
var volume: float = slider.value
|
||||
var bus: int = AudioServer.get_bus_index("Master")
|
||||
var volume_db: float = AudioServer.get_bus_volume_db(bus)
|
||||
var slider: HSlider = _quiz.get_node("MusicPlayer").volume_slider
|
||||
var volume: float = slider.value
|
||||
|
||||
await _press_keys([KEY_ALT, KEY_DOWN])
|
||||
await _press_keys([KEY_ALT, KEY_DOWN])
|
||||
|
||||
assert_float(slider.value).is_less(volume)
|
||||
AudioServer.set_bus_volume_db(bus, volume_db)
|
||||
assert_float(slider.value).is_less(volume)
|
||||
AudioServer.set_bus_volume_db(bus, volume_db)
|
||||
|
||||
|
||||
func test_alt_enter_switches_fullscreen_and_settings_shows_it() -> void:
|
||||
var settings: PopupWindow = _quiz.get_node("SettingsWindow")
|
||||
var was_fullscreen: bool = Settings.fullscreen
|
||||
var settings: PopupWindow = _quiz.get_node("SettingsWindow")
|
||||
var was_fullscreen: bool = Settings.fullscreen
|
||||
|
||||
await _press_keys([KEY_ALT, KEY_ENTER])
|
||||
settings.open()
|
||||
await _press_keys([KEY_ALT, KEY_ENTER])
|
||||
settings.open()
|
||||
|
||||
assert_bool(Settings.fullscreen).is_equal(!was_fullscreen)
|
||||
assert_bool(settings.fullscreen_button.button_pressed).is_equal(!was_fullscreen)
|
||||
await _press_keys([KEY_ALT, KEY_ENTER])
|
||||
assert_bool(Settings.fullscreen).is_equal(was_fullscreen)
|
||||
assert_bool(Settings.fullscreen).is_equal(!was_fullscreen)
|
||||
assert_bool(settings.fullscreen_button.button_pressed).is_equal(!was_fullscreen)
|
||||
await _press_keys([KEY_ALT, KEY_ENTER])
|
||||
assert_bool(Settings.fullscreen).is_equal(was_fullscreen)
|
||||
|
||||
|
||||
func test_statistics_counts_the_soundtracks() -> void:
|
||||
_top_bar_button("StatisticsButton").pressed.emit()
|
||||
_top_bar_button("StatisticsButton").pressed.emit()
|
||||
|
||||
assert_str((_window.get_node("StatisticsPopupPanel/StatisticsLabel") as Label).text) \
|
||||
.is_equal("Total amount of soundtracks in the playlist: 2")
|
||||
assert_str((_window.get_node("StatisticsPopupPanel/StatisticsLabel") as Label).text) \
|
||||
.is_equal("Total amount of soundtracks in the playlist: 2")
|
||||
@@ -5,61 +5,61 @@ var _crono: PlayerObject
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
super()
|
||||
_crono = _add_player("Crono")
|
||||
await _play_first_song()
|
||||
Settings.winning_score = 1
|
||||
super()
|
||||
_crono = _add_player("Crono")
|
||||
await _play_first_song()
|
||||
Settings.winning_score = 1
|
||||
|
||||
|
||||
func _stats_checkbox() -> CheckButton:
|
||||
return _quiz.get_node("SettingsWindow").get_node("%AddToDatabaseCheckButton")
|
||||
return _quiz.get_node("SettingsWindow").get_node("%AddToDatabaseCheckButton")
|
||||
|
||||
|
||||
func test_winning_turns_statistics_off() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(1)
|
||||
|
||||
assert_bool(Settings.add_to_stats).is_false()
|
||||
assert_bool(Settings.add_to_stats).is_false()
|
||||
|
||||
|
||||
func test_resetting_points_turns_statistics_back_on() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(1)
|
||||
|
||||
_press("ResetPointsButton")
|
||||
_press("ResetPointsButton")
|
||||
|
||||
assert_bool(Settings.add_to_stats).is_true()
|
||||
assert_bool(Settings.add_to_stats).is_true()
|
||||
|
||||
|
||||
func test_statistics_turned_off_by_hand_stay_off_after_reset() -> void:
|
||||
Settings.add_to_stats = false
|
||||
await _give_point_with_keybind(1)
|
||||
Settings.add_to_stats = false
|
||||
await _give_point_with_keybind(1)
|
||||
|
||||
_press("ResetPointsButton")
|
||||
_press("ResetPointsButton")
|
||||
|
||||
assert_bool(Settings.add_to_stats).is_false()
|
||||
assert_bool(Settings.add_to_stats).is_false()
|
||||
|
||||
|
||||
func test_settings_checkbox_shows_statistics_off_after_win() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
await _give_point_with_keybind(1)
|
||||
|
||||
_press("SettingsButton")
|
||||
_press("SettingsButton")
|
||||
|
||||
assert_bool(_stats_checkbox().button_pressed).is_false()
|
||||
assert_bool(_stats_checkbox().button_pressed).is_false()
|
||||
|
||||
|
||||
func test_songs_after_a_win_are_not_counted() -> void:
|
||||
await _give_point_with_keybind(1)
|
||||
var played_before: int = _server.count("/music/played?song=0")
|
||||
await _give_point_with_keybind(1)
|
||||
var played_before: int = _server.count("/music/played?song=0")
|
||||
|
||||
_press("ShowAnswerButton")
|
||||
_press("ShowAnswerButton")
|
||||
|
||||
assert_int(_server.count("/music/played?song=0")).is_equal(played_before)
|
||||
assert_int(_server.count("/music/played?song=0")).is_equal(played_before)
|
||||
|
||||
|
||||
func test_winning_score_cannot_go_below_one() -> void:
|
||||
_press("SettingsButton")
|
||||
var lower_button: Button = _quiz.get_node("SettingsWindow").get_node("%LowerButton")
|
||||
_press("SettingsButton")
|
||||
var lower_button: Button = _quiz.get_node("SettingsWindow").get_node("%LowerButton")
|
||||
|
||||
for i: int in 3:
|
||||
lower_button.pressed.emit()
|
||||
for i: int in 3:
|
||||
lower_button.pressed.emit()
|
||||
|
||||
assert_int(Settings.winning_score).is_equal(1)
|
||||
assert_int(Settings.winning_score).is_equal(1)
|
||||
@@ -7,194 +7,194 @@ var _window: Control
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
_snapshot = AutoloadSnapshot.take([Settings])
|
||||
Settings.currently_syncing = false
|
||||
_server = FakeHttpTransport.new().install()
|
||||
_server.respond_bytes("/sync", PackedByteArray())
|
||||
_runner = scene_runner("res://SyncWindow.tscn")
|
||||
_window = _runner.scene()
|
||||
_snapshot = AutoloadSnapshot.take([Settings])
|
||||
Settings.currently_syncing = false
|
||||
_server = FakeHttpTransport.new().install()
|
||||
_server.respond_bytes("/sync", PackedByteArray())
|
||||
_runner = scene_runner("res://SyncWindow.tscn")
|
||||
_window = _runner.scene()
|
||||
|
||||
|
||||
func after_test() -> void:
|
||||
_server.uninstall()
|
||||
_snapshot.restore()
|
||||
_server.uninstall()
|
||||
_snapshot.restore()
|
||||
|
||||
|
||||
func _node(unique_name: String) -> Control:
|
||||
return _window.get_node("%" + unique_name)
|
||||
return _window.get_node("%" + unique_name)
|
||||
|
||||
|
||||
func _finish_sync(result: Dictionary) -> void:
|
||||
_server.respond_json("/sync/progress", result)
|
||||
_runner.invoke("_on_sync_timeout")
|
||||
_server.respond_json("/sync/progress", result)
|
||||
_runner.invoke("_on_sync_timeout")
|
||||
|
||||
|
||||
func _empty_result() -> Dictionary:
|
||||
return {
|
||||
"soundtracks_added": [],
|
||||
"soundtracks_re_added": [],
|
||||
"soundtracks_changed_title": {},
|
||||
"soundtracks_changed_content": [],
|
||||
"soundtracks_removed": [],
|
||||
"catched_errors": [],
|
||||
"total_time": "00:00:03",
|
||||
}
|
||||
return {
|
||||
"soundtracks_added": [],
|
||||
"soundtracks_re_added": [],
|
||||
"soundtracks_changed_title": {},
|
||||
"soundtracks_changed_content": [],
|
||||
"soundtracks_removed": [],
|
||||
"catched_errors": [],
|
||||
"total_time": "00:00:03",
|
||||
}
|
||||
|
||||
|
||||
func test_start_sync_asks_server_and_shows_progress() -> void:
|
||||
monitor_signals(_window, false)
|
||||
monitor_signals(_window, false)
|
||||
|
||||
_runner.invoke("start_sync")
|
||||
_runner.invoke("start_sync")
|
||||
|
||||
assert_array(_server.requested_paths).contains_exactly(["/sync"])
|
||||
assert_bool(Settings.currently_syncing).is_true()
|
||||
assert_bool(_node("ProgressHBoxContainer").visible).is_true()
|
||||
assert_str(_node("SyncTitleLabel").text).is_equal("Sync in Progress")
|
||||
await assert_signal(_window).is_emitted("sync_started")
|
||||
assert_array(_server.requested_paths).contains_exactly(["/sync"])
|
||||
assert_bool(Settings.currently_syncing).is_true()
|
||||
assert_bool(_node("ProgressHBoxContainer").visible).is_true()
|
||||
assert_str(_node("SyncTitleLabel").text).is_equal("Sync in Progress")
|
||||
await assert_signal(_window).is_emitted("sync_started")
|
||||
|
||||
|
||||
func test_start_sync_does_nothing_while_already_syncing() -> void:
|
||||
Settings.currently_syncing = true
|
||||
Settings.currently_syncing = true
|
||||
|
||||
_runner.invoke("start_sync")
|
||||
_runner.invoke("start_sync")
|
||||
|
||||
assert_array(_server.requested_paths).is_empty()
|
||||
assert_array(_server.requested_paths).is_empty()
|
||||
|
||||
|
||||
func test_progress_updates_progress_bar() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
_server.respond_json("/sync/progress", {"progress": "42", "time_spent": "00:00:12"})
|
||||
_runner.invoke("start_sync")
|
||||
_server.respond_json("/sync/progress", {"progress": "42", "time_spent": "00:00:12"})
|
||||
|
||||
_runner.invoke("_on_sync_timeout")
|
||||
_runner.invoke("_on_sync_timeout")
|
||||
|
||||
assert_float(_node("SyncProgressBar").value).is_equal(42.0)
|
||||
assert_str(_node("SyncTime").text).is_equal("00:00:12")
|
||||
assert_float(_node("SyncProgressBar").value).is_equal(42.0)
|
||||
assert_str(_node("SyncTime").text).is_equal("00:00:12")
|
||||
|
||||
|
||||
func test_finished_sync_shows_only_sections_with_changes() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
monitor_signals(_window, false)
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = ["Chrono Cross", "Xenogears"]
|
||||
result.soundtracks_removed = ["Bad Rip"]
|
||||
_runner.invoke("start_sync")
|
||||
monitor_signals(_window, false)
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = ["Chrono Cross", "Xenogears"]
|
||||
result.soundtracks_removed = ["Bad Rip"]
|
||||
|
||||
_finish_sync(result)
|
||||
_finish_sync(result)
|
||||
|
||||
assert_bool(_node("SoundtracksAddedVBox").visible).is_true()
|
||||
assert_bool(_node("SoundtracksRemovedVBox").visible).is_true()
|
||||
assert_bool(_node("SoundtracksReAddedVBox").visible).is_false()
|
||||
assert_bool(_node("SoundtracksChangedTitleVBox").visible).is_false()
|
||||
assert_bool(_node("NoChangesLabel").visible).is_false()
|
||||
# Header plus one label per soundtrack
|
||||
assert_int(_node("SoundtracksAddedVBox").get_child_count()).is_equal(3)
|
||||
assert_str(_node("SyncTime").text).is_equal("Total time: 00:00:03")
|
||||
assert_bool(Settings.currently_syncing).is_false()
|
||||
await assert_signal(_window).is_emitted("sync_finished")
|
||||
assert_bool(_node("SoundtracksAddedVBox").visible).is_true()
|
||||
assert_bool(_node("SoundtracksRemovedVBox").visible).is_true()
|
||||
assert_bool(_node("SoundtracksReAddedVBox").visible).is_false()
|
||||
assert_bool(_node("SoundtracksChangedTitleVBox").visible).is_false()
|
||||
assert_bool(_node("NoChangesLabel").visible).is_false()
|
||||
# Header plus one label per soundtrack
|
||||
assert_int(_node("SoundtracksAddedVBox").get_child_count()).is_equal(3)
|
||||
assert_str(_node("SyncTime").text).is_equal("Total time: 00:00:03")
|
||||
assert_bool(Settings.currently_syncing).is_false()
|
||||
await assert_signal(_window).is_emitted("sync_finished")
|
||||
|
||||
|
||||
func test_separator_shown_only_between_visible_sections() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = ["Chrono Cross"]
|
||||
result.soundtracks_removed = ["Bad Rip"]
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = ["Chrono Cross"]
|
||||
result.soundtracks_removed = ["Bad Rip"]
|
||||
|
||||
_finish_sync(result)
|
||||
_finish_sync(result)
|
||||
|
||||
assert_bool(_node("SoundtracksAddedSeparator").visible).is_true()
|
||||
assert_bool(_node("SoundtracksRemovedSeparator").visible).is_false()
|
||||
assert_bool(_node("SoundtracksAddedSeparator").visible).is_true()
|
||||
assert_bool(_node("SoundtracksRemovedSeparator").visible).is_false()
|
||||
|
||||
|
||||
func test_changed_titles_list_old_and_new_title() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_changed_title = {"FF7": "Final Fantasy VII"}
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_changed_title = {"FF7": "Final Fantasy VII"}
|
||||
|
||||
_finish_sync(result)
|
||||
_finish_sync(result)
|
||||
|
||||
var vbox: Control = _node("SoundtracksChangedTitleVBox")
|
||||
assert_bool(vbox.visible).is_true()
|
||||
assert_str((vbox.get_child(1) as ListRow).text).is_equal(
|
||||
"FF7\nchanged title to\nFinal Fantasy VII")
|
||||
var vbox: Control = _node("SoundtracksChangedTitleVBox")
|
||||
assert_bool(vbox.visible).is_true()
|
||||
assert_str((vbox.get_child(1) as ListRow).text).is_equal(
|
||||
"FF7\nchanged title to\nFinal Fantasy VII")
|
||||
|
||||
|
||||
func test_no_changes_shows_no_changes_label() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
_runner.invoke("start_sync")
|
||||
|
||||
_finish_sync(_empty_result())
|
||||
_finish_sync(_empty_result())
|
||||
|
||||
assert_bool(_node("NoChangesLabel").visible).is_true()
|
||||
assert_bool(_node("NoChangesLabel").visible).is_true()
|
||||
|
||||
|
||||
func test_errors_are_listed() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.catched_errors = ["Could not read tags in broken.mp3"]
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.catched_errors = ["Could not read tags in broken.mp3"]
|
||||
|
||||
_finish_sync(result)
|
||||
_finish_sync(result)
|
||||
|
||||
assert_bool(_node("CatchedErrorsVBox").visible).is_true()
|
||||
assert_bool(_node("CatchedErrorsVBox").visible).is_true()
|
||||
|
||||
|
||||
func test_reopening_after_sync_shows_result_without_syncing_again() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
_finish_sync(_empty_result())
|
||||
_runner.invoke("start_sync")
|
||||
_finish_sync(_empty_result())
|
||||
|
||||
_runner.invoke("start_sync")
|
||||
_runner.invoke("start_sync")
|
||||
|
||||
assert_int(_server.count("/sync")).is_equal(1)
|
||||
assert_str(_node("SyncTitleLabel").text).is_equal("Sync Result")
|
||||
assert_int(_server.count("/sync")).is_equal(1)
|
||||
assert_str(_node("SyncTitleLabel").text).is_equal("Sync Result")
|
||||
|
||||
|
||||
func test_errors_section_has_errors_header() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.catched_errors = ["Could not read tags in broken.mp3"]
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.catched_errors = ["Could not read tags in broken.mp3"]
|
||||
|
||||
_finish_sync(result)
|
||||
_finish_sync(result)
|
||||
|
||||
assert_str((_node("CatchedErrorsVBox").get_child(0) as Label).text).is_equal("Errors")
|
||||
assert_str((_node("CatchedErrorsVBox").get_child(0) as Label).text).is_equal("Errors")
|
||||
|
||||
|
||||
func test_long_names_wrap_instead_of_widening_the_window() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
var long_name: String = "The Legend of Zelda: Breath of the Wild Original Soundtrack"
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = [long_name]
|
||||
result.soundtracks_re_added = [long_name]
|
||||
result.soundtracks_changed_content = [long_name]
|
||||
result.soundtracks_removed = [long_name]
|
||||
result.soundtracks_changed_title = {long_name: long_name}
|
||||
result.catched_errors = [long_name + " could not be read"]
|
||||
_runner.invoke("start_sync")
|
||||
var long_name: String = "The Legend of Zelda: Breath of the Wild Original Soundtrack"
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = [long_name]
|
||||
result.soundtracks_re_added = [long_name]
|
||||
result.soundtracks_changed_content = [long_name]
|
||||
result.soundtracks_removed = [long_name]
|
||||
result.soundtracks_changed_title = {long_name: long_name}
|
||||
result.catched_errors = [long_name + " could not be read"]
|
||||
|
||||
_finish_sync(result)
|
||||
await _runner.simulate_frames(2)
|
||||
_finish_sync(result)
|
||||
await _runner.simulate_frames(2)
|
||||
|
||||
# The minimum width is what the content needs; wider than the panel it would stick out
|
||||
var panel_width: float = (_window.get_node("SyncPanel") as Control).size.x
|
||||
assert_float(_node("SyncHBoxContainer").get_combined_minimum_size().x) \
|
||||
.is_less(panel_width)
|
||||
assert_float(_node("CatchedErrorsVBox").get_combined_minimum_size().x) \
|
||||
.is_less(panel_width)
|
||||
# The minimum width is what the content needs; wider than the panel it would stick out
|
||||
var panel_width: float = (_window.get_node("SyncPanel") as Control).size.x
|
||||
assert_float(_node("SyncHBoxContainer").get_combined_minimum_size().x) \
|
||||
.is_less(panel_width)
|
||||
assert_float(_node("CatchedErrorsVBox").get_combined_minimum_size().x) \
|
||||
.is_less(panel_width)
|
||||
|
||||
|
||||
func test_visible_columns_share_the_width_equally() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = ["Chrono Cross", "Xenoblade Chronicles X Original Soundtrack"]
|
||||
result.soundtracks_removed = ["Bad Rip"]
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_added = ["Chrono Cross", "Xenoblade Chronicles X Original Soundtrack"]
|
||||
result.soundtracks_removed = ["Bad Rip"]
|
||||
|
||||
_finish_sync(result)
|
||||
await _runner.simulate_frames(2)
|
||||
_finish_sync(result)
|
||||
await _runner.simulate_frames(2)
|
||||
|
||||
assert_float(_node("SoundtracksAddedVBox").size.x).is_equal_approx(
|
||||
_node("SoundtracksRemovedVBox").size.x, 1.0)
|
||||
assert_float(_node("SoundtracksAddedVBox").size.x).is_equal_approx(
|
||||
_node("SoundtracksRemovedVBox").size.x, 1.0)
|
||||
|
||||
|
||||
func test_column_headers() -> void:
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_re_added = ["Super Metroid"]
|
||||
_runner.invoke("start_sync")
|
||||
var result: Dictionary = _empty_result()
|
||||
result.soundtracks_re_added = ["Super Metroid"]
|
||||
|
||||
_finish_sync(result)
|
||||
_finish_sync(result)
|
||||
|
||||
assert_str((_node("SoundtracksReAddedVBox").get_child(0) as Label).text).is_equal("Re-added")
|
||||
assert_str((_node("SoundtracksReAddedVBox").get_child(0) as Label).text).is_equal("Re-added")
|
||||
Reference in new issue
Block a user