MusicListPanel, PlayersPanel (was Players) and InspirationList (was ScrollContainer) each get their own scene and script. They report what happens through signals, and the quiz wires them to the playlist, the music player, the log and the popups. Every node keeps its place on screen. Screenshots of every UI state are pixel-identical to before, the layout test still matches the original baseline, and each part is tested on its own as well as through the quiz.
147 lines
4.8 KiB
GDScript
147 lines
4.8 KiB
GDScript
extends GdUnitTestSuite
|
|
## The player list on its own: adding players through the name field, removing them
|
|
## and asking for a new character.
|
|
|
|
var _snapshot: AutoloadSnapshot
|
|
var _runner: GdUnitSceneRunner
|
|
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()
|
|
|
|
|
|
func after_test() -> void:
|
|
await await_idle_frame()
|
|
_snapshot.restore()
|
|
|
|
|
|
func _rows() -> Array[Node]:
|
|
return _panel.players_list_container.get_children()
|
|
|
|
|
|
func _add(player_name: String) -> void:
|
|
_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()
|
|
|
|
|
|
func test_add_button_shows_and_hides_the_add_row() -> void:
|
|
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_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))
|
|
|
|
_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)
|
|
|
|
|
|
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_player_button)
|
|
|
|
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()
|
|
|
|
_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"])
|
|
|
|
|
|
func test_empty_name_adds_nobody() -> void:
|
|
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_panel))
|
|
|
|
_add("")
|
|
|
|
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)
|
|
|
|
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")
|
|
|
|
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))
|
|
|
|
(_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)
|
|
|
|
|
|
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))
|
|
|
|
(row.get_node("HBoxContainer/Character") as BaseButton).pressed.emit()
|
|
|
|
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
|
|
|
|
_panel.reload()
|
|
|
|
assert_str(((_rows()[0] as Player).get_node("HBoxContainer/Name") as Label).text) \
|
|
.ends_with("Crono: 3")
|