diff --git a/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreen.cs b/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreen.cs index c155cd2aed..27de959ff8 100644 --- a/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreen.cs +++ b/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreen.cs @@ -6,9 +6,7 @@ using System.Collections.Generic; using System.Linq; using NUnit.Framework; using osu.Framework.Extensions; -using osu.Framework.Graphics.Primitives; using osu.Framework.Screens; -using osu.Framework.Testing; using osu.Framework.Utils; using osu.Game.Online.API; using osu.Game.Online.API.Requests; @@ -19,10 +17,7 @@ using osu.Game.Online.Rooms; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; using osu.Game.Screens.OnlinePlay.Matchmaking; -using osu.Game.Screens.OnlinePlay.Matchmaking.Screens.Pick; using osu.Game.Tests.Visual.Multiplayer; -using osuTK; -using osuTK.Input; namespace osu.Game.Tests.Visual.Matchmaking { @@ -41,6 +36,7 @@ namespace osu.Game.Tests.Visual.Matchmaking AddStep("join room", () => { var room = CreateDefaultRoom(); + room.Type = MatchType.Matchmaking; room.Playlist = Enumerable.Range(1, 50).Select(i => new PlaylistItem(new MultiplayerPlaylistItem { ID = i, @@ -97,106 +93,49 @@ namespace osu.Game.Tests.Visual.Matchmaking [Test] public void TestGameplayFlow() { - // Initial "ready" status of the room". - AddWaitStep("wait", 5); - - AddStep("round start", () => MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState + for (int round = 1; round <= 2; round++) { - Stage = MatchmakingStage.RoundWarmupTime - }).WaitSafely()); + AddLabel($"Round {round}"); - // Next round starts with picks. - AddWaitStep("wait", 5); - - AddStep("pick", () => MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState - { - Stage = MatchmakingStage.UserBeatmapSelect - }).WaitSafely()); - - // Make some selections - AddWaitStep("wait", 5); - - for (int i = 0; i < 3; i++) - { - int j = i * 2; - AddStep("click a beatmap", () => + int r = round; + changeStage(MatchmakingStage.RoundWarmupTime, state => state.CurrentRound = r); + changeStage(MatchmakingStage.UserBeatmapSelect); + changeStage(MatchmakingStage.ServerBeatmapFinalised, state => { - Quad panelQuad = this.ChildrenOfType().ElementAt(j).ScreenSpaceDrawQuad; + MultiplayerPlaylistItem[] beatmaps = Enumerable.Range(1, 50).Select(i => new MultiplayerPlaylistItem + { + ID = i, + BeatmapID = i, + StarRating = i / 10.0, + }).ToArray(); - InputManager.MoveMouseTo(new Vector2(panelQuad.Centre.X, panelQuad.TopLeft.Y + 5)); - InputManager.Click(MouseButton.Left); - }); + state.CandidateItems = beatmaps.Select(b => b.ID).ToArray(); + state.CandidateItem = beatmaps[0].ID; + }, waitTime: 35); - AddWaitStep("wait", 2); + changeStage(MatchmakingStage.WaitingForClientsBeatmapDownload); + changeStage(MatchmakingStage.GameplayWarmupTime); + changeStage(MatchmakingStage.Gameplay); + changeStage(MatchmakingStage.ResultsDisplaying); } - // Lock in the gameplay beatmap - - AddStep("selection", () => + changeStage(MatchmakingStage.Ended, state => { - MultiplayerPlaylistItem[] beatmaps = Enumerable.Range(1, 50).Select(i => new MultiplayerPlaylistItem - { - ID = i, - BeatmapID = i, - StarRating = i / 10.0, - }).ToArray(); - - MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState - { - Stage = MatchmakingStage.ServerBeatmapFinalised, - CandidateItems = beatmaps.Select(b => b.ID).ToArray(), - CandidateItem = beatmaps[0].ID - }).WaitSafely(); - }); - - // Prepare gameplay. - AddWaitStep("wait", 25); - - AddStep("prepare gameplay", () => MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState - { - Stage = MatchmakingStage.GameplayWarmupTime - }).WaitSafely()); - - // Start gameplay. - AddWaitStep("wait", 5); - - AddStep("gameplay", () => MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState - { - Stage = MatchmakingStage.Gameplay - }).WaitSafely()); - - AddStep("start gameplay", () => MultiplayerClient.StartMatch().WaitSafely()); - // AddUntilStep("wait for player", () => (Stack.CurrentScreen as Player)?.IsLoaded == true); - - // Finish gameplay. - AddWaitStep("wait", 5); - - AddStep("round end", () => MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState - { - Stage = MatchmakingStage.ResultsDisplaying - }).WaitSafely()); - - AddWaitStep("wait", 10); - - AddStep("room end", () => - { - MatchmakingRoomState state = new MatchmakingRoomState - { - CurrentRound = 1, - Stage = MatchmakingStage.Ended - }; - int localUserId = API.LocalUser.Value.OnlineID; state.Users[localUserId].Placement = 1; state.Users[localUserId].Rounds[1].Placement = 1; state.Users[localUserId].Rounds[1].TotalScore = 1; state.Users[localUserId].Rounds[1].Statistics[HitResult.LargeBonus] = 1; - - MultiplayerClient.ChangeMatchRoomState(state).WaitSafely(); }); } + private void changeStage(MatchmakingStage stage, Action? prepare = null, int waitTime = 5) + { + AddStep($"stage: {stage}", () => MultiplayerClient.MatchmakingChangeStage(stage, prepare).WaitSafely()); + AddWaitStep("wait", waitTime); + } + private void setupRequestHandler() { AddStep("setup request handler", () => diff --git a/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreenStack.cs b/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreenStack.cs index be3d7463d6..24784db472 100644 --- a/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreenStack.cs +++ b/osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreenStack.cs @@ -65,55 +65,49 @@ namespace osu.Game.Tests.Visual.Matchmaking } [Test] - public void TestStatus() + public void TestChangeStage() { - AddWaitStep("wait for scroll", 5); - AddStep("pick", () => MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState + for (int round = 1; round <= 2; round++) { - Stage = MatchmakingStage.UserBeatmapSelect - }).WaitSafely()); + AddLabel($"Round {round}"); - AddWaitStep("wait for scroll", 5); - AddStep("selection", () => + int r = round; + changeStage(MatchmakingStage.RoundWarmupTime, state => state.CurrentRound = r); + changeStage(MatchmakingStage.UserBeatmapSelect); + changeStage(MatchmakingStage.ServerBeatmapFinalised, state => + { + MultiplayerPlaylistItem[] beatmaps = Enumerable.Range(1, 50).Select(i => new MultiplayerPlaylistItem + { + ID = i, + BeatmapID = i, + StarRating = i / 10.0, + }).ToArray(); + + state.CandidateItems = beatmaps.Select(b => b.ID).ToArray(); + state.CandidateItem = beatmaps[0].ID; + }, waitTime: 35); + + changeStage(MatchmakingStage.WaitingForClientsBeatmapDownload); + changeStage(MatchmakingStage.GameplayWarmupTime); + changeStage(MatchmakingStage.Gameplay); + changeStage(MatchmakingStage.ResultsDisplaying); + } + + changeStage(MatchmakingStage.Ended, state => { - MultiplayerPlaylistItem[] beatmaps = Enumerable.Range(1, 50).Select(i => new MultiplayerPlaylistItem - { - ID = i, - BeatmapID = i, - StarRating = i / 10.0, - }).ToArray(); - - beatmaps = Random.Shared.GetItems(beatmaps, 8); - - MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState - { - Stage = MatchmakingStage.ServerBeatmapFinalised, - CandidateItems = beatmaps.Select(b => b.ID).ToArray(), - CandidateItem = beatmaps[0].ID - }).WaitSafely(); - }); - - AddWaitStep("wait for scroll", 35); - AddStep("room end", () => - { - var state = new MatchmakingRoomState - { - CurrentRound = 1, - Stage = MatchmakingStage.Ended - }; - int localUserId = API.LocalUser.Value.OnlineID; state.Users[localUserId].Placement = 1; state.Users[localUserId].Rounds[1].Placement = 1; state.Users[localUserId].Rounds[1].TotalScore = 1; state.Users[localUserId].Rounds[1].Statistics[HitResult.LargeBonus] = 1; - - state.Users[1].Placement = 2; - state.Users[1].Rounds[1].Placement = 2; - - MultiplayerClient.ChangeMatchRoomState(state).WaitSafely(); }); } + + private void changeStage(MatchmakingStage stage, Action? prepare = null, int waitTime = 5) + { + AddStep($"stage: {stage}", () => MultiplayerClient.MatchmakingChangeStage(stage, prepare).WaitSafely()); + AddWaitStep("wait", waitTime); + } } } diff --git a/osu.Game.Tests/Visual/Matchmaking/TestSceneStageDisplay.cs b/osu.Game.Tests/Visual/Matchmaking/TestSceneStageDisplay.cs index 49680acd64..87af7577a9 100644 --- a/osu.Game.Tests/Visual/Matchmaking/TestSceneStageDisplay.cs +++ b/osu.Game.Tests/Visual/Matchmaking/TestSceneStageDisplay.cs @@ -5,7 +5,6 @@ using System; using NUnit.Framework; using osu.Framework.Extensions; using osu.Framework.Graphics; -using osu.Game.Online.Matchmaking; using osu.Game.Online.Multiplayer.MatchTypes.Matchmaking; using osu.Game.Screens.OnlinePlay.Matchmaking; using osu.Game.Tests.Visual.Multiplayer; @@ -31,24 +30,11 @@ namespace osu.Game.Tests.Visual.Matchmaking } [Test] - public void TestStartCountdown() + public void TestChangeStage() { - foreach (var status in Enum.GetValues()) + foreach (var stage in Enum.GetValues()) { - AddStep($"{status}", () => - { - MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState - { - Stage = status - }).WaitSafely(); - - MultiplayerClient.StartCountdown(new MatchmakingStageCountdown - { - Stage = status, - TimeRemaining = TimeSpan.FromSeconds(5) - }).WaitSafely(); - }); - + AddStep($"{stage}", () => MultiplayerClient.MatchmakingChangeStage(stage).WaitSafely()); AddWaitStep("wait a bit", 10); } } diff --git a/osu.Game.Tests/Visual/Matchmaking/TestSceneStageText.cs b/osu.Game.Tests/Visual/Matchmaking/TestSceneStageText.cs index 0094c7645a..2d7f6b4db1 100644 --- a/osu.Game.Tests/Visual/Matchmaking/TestSceneStageText.cs +++ b/osu.Game.Tests/Visual/Matchmaking/TestSceneStageText.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using NUnit.Framework; using osu.Framework.Extensions; using osu.Framework.Graphics; @@ -26,18 +27,14 @@ namespace osu.Game.Tests.Visual.Matchmaking }); } - [TestCase(MatchmakingStage.WaitingForClientsJoin)] - [TestCase(MatchmakingStage.RoundWarmupTime)] - [TestCase(MatchmakingStage.UserBeatmapSelect)] - [TestCase(MatchmakingStage.ServerBeatmapFinalised)] - [TestCase(MatchmakingStage.WaitingForClientsBeatmapDownload)] - [TestCase(MatchmakingStage.GameplayWarmupTime)] - [TestCase(MatchmakingStage.Gameplay)] - [TestCase(MatchmakingStage.ResultsDisplaying)] - [TestCase(MatchmakingStage.Ended)] - public void TestStatus(MatchmakingStage status) + [Test] + public void TestChangeStage() { - AddStep("set status", () => MultiplayerClient.ChangeMatchRoomState(new MatchmakingRoomState { Stage = status }).WaitSafely()); + foreach (var stage in Enum.GetValues()) + { + AddStep($"{stage}", () => MultiplayerClient.MatchmakingChangeStage(stage).WaitSafely()); + AddWaitStep("wait a bit", 10); + } } } } diff --git a/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs b/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs index 3fe66d3cda..5a69c6fcba 100644 --- a/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs +++ b/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs @@ -824,6 +824,25 @@ namespace osu.Game.Tests.Visual.Multiplayer await ((IMatchmakingClient)this).MatchmakingItemSelected(clone(userId), clone(playlistItemId)).ConfigureAwait(false); } + public async Task MatchmakingChangeStage(MatchmakingStage stage, Action? prepare = null) + { + MatchmakingRoomState state = clone((MatchmakingRoomState)ServerRoom!.MatchState!); + + state.Stage = stage; + + if (stage == MatchmakingStage.RoundWarmupTime) + state.CurrentRound++; + + prepare?.Invoke(state); + + await ChangeMatchRoomState(state).ConfigureAwait(false); + await StartCountdown(new MatchmakingStageCountdown + { + Stage = stage, + TimeRemaining = TimeSpan.FromSeconds(10) + }).ConfigureAwait(false); + } + #region API Room Handling public IReadOnlyList ServerSideRooms