extends "res://tests/test_case.gd" const Matchmaking = preload("res://scripts/matchmaking.gd") const MatchmakingState = preload("res://scripts/matchmaking_state.gd") func test_every_backend_phase_has_a_nonempty_user_message() -> void: for phase in [MatchmakingState.IDLE, MatchmakingState.QUEUED, MatchmakingState.PROPOSED, MatchmakingState.ACCEPTED, MatchmakingState.ALLOCATING, MatchmakingState.PROCESS_READY, MatchmakingState.ASSIGNMENT_READY, MatchmakingState.ASSIGNED, MatchmakingState.CONNECTING, MatchmakingState.LIVE, MatchmakingState.RESULT_PENDING, MatchmakingState.COMPLETED, MatchmakingState.CANCELLED, MatchmakingState.EXPIRED, MatchmakingState.FAILED]: assert_true(not Matchmaking.phase_label(phase).is_empty(), "phase %s has visible copy" % phase) func test_terminal_state_policy_does_not_leave_cancel_or_proposal_actions_enabled() -> void: for phase in [MatchmakingState.CANCELLED, MatchmakingState.EXPIRED, MatchmakingState.FAILED, MatchmakingState.LIVE, MatchmakingState.COMPLETED]: assert_true(Matchmaking._is_terminal(phase), "phase %s is terminal" % phase) assert_true(not Matchmaking._is_terminal(MatchmakingState.QUEUED), "queued search remains active") assert_true(not Matchmaking._is_terminal(MatchmakingState.PROPOSED), "proposal remains actionable") assert_true(Matchmaking._can_start_new_search(MatchmakingState.FAILED), "failed search can be retried") assert_true(not Matchmaking._can_start_new_search(MatchmakingState.LIVE), "live match cannot start a second search") assert_true(Matchmaking._can_start_new_search(MatchmakingState.COMPLETED), "completed match can start a new search") func test_proposal_countdown_uses_authoritative_expiry_and_clamps_after_expiry() -> void: assert_eq(Matchmaking.proposal_countdown_text(1100, 1000), "Review proposal · 100s remaining", "proposal countdown uses server expiry") assert_eq(Matchmaking.proposal_countdown_text(1000, 1001), "Review proposal · 0s remaining", "expired proposal countdown clamps to zero") assert_eq(Matchmaking.proposal_countdown_text(0, 1000), "Review the proposal before the countdown expires", "missing expiry retains compatible copy")