Buttons get 12 px of side padding. The top bar buttons, the quiz toolbar and Show answer/Next are laid out in rows with 12 px gaps and are all 36 px tall, and the ±1 buttons use a compact StepButton style. "Randomize new track" is now "Next song". Player rows show the name and the score apart, alternate like the other lists and highlight the character under the mouse. The name field is a LineEdit with a 10-letter limit; blank and duplicate names are refused, and a full list says "Up to 7 players". Remove buttons update when editing is switched instead of every frame, and the spacer panels are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
87 lines
2.5 KiB
GDScript
87 lines
2.5 KiB
GDScript
extends GdUnitTestSuite
|
|
## Show answer and Next: each reports its press, also from its keyboard shortcut, and
|
|
## Next is only enabled while a song is ready.
|
|
|
|
var _runner: GdUnitSceneRunner
|
|
var _controls: SongControls
|
|
|
|
|
|
func before_test() -> void:
|
|
_runner = scene_runner("res://quiz/SongControls.tscn")
|
|
_controls = _runner.scene()
|
|
await _runner.simulate_frames(1)
|
|
|
|
|
|
func _click(button: Button) -> void:
|
|
_runner.set_mouse_position(_controls.get_viewport().get_final_transform()
|
|
* button.get_global_rect().get_center())
|
|
await _runner.simulate_mouse_button_pressed(MOUSE_BUTTON_LEFT)
|
|
await _runner.await_input_processed()
|
|
|
|
|
|
func _press_keys(keys: Array[Key]) -> void:
|
|
for key: Key in keys:
|
|
_runner.simulate_key_press(key)
|
|
await _runner.await_input_processed()
|
|
keys.reverse()
|
|
for key: Key in keys:
|
|
_runner.simulate_key_release(key)
|
|
await _runner.await_input_processed()
|
|
|
|
|
|
func test_next_starts_disabled() -> void:
|
|
assert_bool(_controls.next_button.disabled).is_true()
|
|
|
|
|
|
func test_clicking_show_answer_reports_it() -> void:
|
|
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_controls))
|
|
|
|
await _click(_controls.show_answer_button)
|
|
|
|
await signals.is_emitted("show_answer_pressed")
|
|
|
|
|
|
func test_clicking_next_reports_it_when_enabled() -> void:
|
|
_controls.set_next_enabled(true)
|
|
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_controls))
|
|
|
|
await _click(_controls.next_button)
|
|
|
|
await signals.is_emitted("next_pressed")
|
|
|
|
|
|
func test_clicking_disabled_next_does_nothing() -> void:
|
|
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_controls))
|
|
|
|
await _click(_controls.next_button)
|
|
|
|
await signals.wait_until(200).is_not_emitted("next_pressed")
|
|
|
|
|
|
func test_alt_v_shows_answer_and_alt_c_plays_next() -> void:
|
|
_controls.set_next_enabled(true)
|
|
var signals: GdUnitSignalAssert = assert_signal(monitor_signals(_controls))
|
|
|
|
await _press_keys([KEY_ALT, KEY_V])
|
|
await signals.is_emitted("show_answer_pressed")
|
|
await _press_keys([KEY_ALT, KEY_C])
|
|
await signals.is_emitted("next_pressed")
|
|
|
|
|
|
func test_locking_disables_both() -> void:
|
|
_controls.set_next_enabled(true)
|
|
|
|
_controls.set_locked(true)
|
|
|
|
assert_bool(_controls.show_answer_button.disabled).is_true()
|
|
assert_bool(_controls.next_button.disabled).is_true()
|
|
|
|
|
|
func test_unlocking_enables_show_answer_but_waits_for_a_song_for_next() -> void:
|
|
_controls.set_locked(true)
|
|
|
|
_controls.set_locked(false)
|
|
|
|
assert_bool(_controls.show_answer_button.disabled).is_false()
|
|
assert_bool(_controls.next_button.disabled).is_true()
|