Add basic tests

This commit is contained in:
smoogipoo
2021-10-29 15:44:48 +09:00
parent 42dfb341da
commit e667ef4eea
4 changed files with 102 additions and 27 deletions

View File

@ -6,9 +6,11 @@ using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Audio; using osu.Framework.Audio;
using osu.Framework.Platform; using osu.Framework.Platform;
using osu.Framework.Screens;
using osu.Framework.Testing; using osu.Framework.Testing;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Database; using osu.Game.Database;
using osu.Game.Online.Multiplayer;
using osu.Game.Online.Multiplayer.Queueing; using osu.Game.Online.Multiplayer.Queueing;
using osu.Game.Online.Rooms; using osu.Game.Online.Rooms;
using osu.Game.Rulesets; using osu.Game.Rulesets;
@ -16,6 +18,8 @@ using osu.Game.Rulesets.Osu;
using osu.Game.Screens.OnlinePlay.Lounge; using osu.Game.Screens.OnlinePlay.Lounge;
using osu.Game.Screens.OnlinePlay.Multiplayer; using osu.Game.Screens.OnlinePlay.Multiplayer;
using osu.Game.Screens.OnlinePlay.Multiplayer.Match; using osu.Game.Screens.OnlinePlay.Multiplayer.Match;
using osu.Game.Screens.Play;
using osu.Game.Tests.Resources;
using osuTK.Input; using osuTK.Input;
namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes
@ -24,14 +28,20 @@ namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes
{ {
protected abstract QueueModes Mode { get; } protected abstract QueueModes Mode { get; }
protected BeatmapInfo InitialBeatmap { get; private set; }
protected BeatmapInfo OtherBeatmap { get; private set; }
protected IScreen CurrentScreen => multiplayerScreenStack.CurrentScreen;
protected IScreen CurrentSubScreen => multiplayerScreenStack.MultiplayerScreen.CurrentSubScreen;
private BeatmapManager beatmaps; private BeatmapManager beatmaps;
private RulesetStore rulesets; private RulesetStore rulesets;
private ILive<BeatmapSetInfo> importedBeatmap; private BeatmapSetInfo importedSet;
private TestMultiplayerScreenStack multiplayerScreenStack; private TestMultiplayerScreenStack multiplayerScreenStack;
private TestMultiplayerClient client => multiplayerScreenStack.Client; protected TestMultiplayerClient Client => multiplayerScreenStack.Client;
private TestMultiplayerRoomManager roomManager => multiplayerScreenStack.RoomManager; protected TestMultiplayerRoomManager RoomManager => multiplayerScreenStack.RoomManager;
[Cached(typeof(UserLookupCache))] [Cached(typeof(UserLookupCache))]
private UserLookupCache lookupCache = new TestUserLookupCache(); private UserLookupCache lookupCache = new TestUserLookupCache();
@ -49,18 +59,10 @@ namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes
AddStep("import beatmap", () => AddStep("import beatmap", () =>
{ {
var beatmap1 = CreateBeatmap(new OsuRuleset().RulesetInfo).BeatmapInfo; beatmaps.Import(TestResources.GetQuickTestBeatmapForImport()).Wait();
beatmap1.Version = "1"; importedSet = beatmaps.GetAllUsableBeatmapSetsEnumerable(IncludedDetails.All).First();
InitialBeatmap = importedSet.Beatmaps.First(b => b.RulesetID == 0);
var beatmap2 = CreateBeatmap(new OsuRuleset().RulesetInfo).BeatmapInfo; OtherBeatmap = importedSet.Beatmaps.Last(b => b.RulesetID == 0);
beatmap2.Version = "2";
// Move beatmap2 to beatmap1's set.
var beatmapSet = beatmap1.BeatmapSet;
beatmapSet.Beatmaps.Add(beatmap2);
beatmap2.BeatmapSet = beatmapSet;
importedBeatmap = beatmaps.Import(beatmapSet).Result;
}); });
AddStep("load multiplayer", () => LoadScreen(multiplayerScreenStack = new TestMultiplayerScreenStack())); AddStep("load multiplayer", () => LoadScreen(multiplayerScreenStack = new TestMultiplayerScreenStack()));
@ -76,8 +78,8 @@ namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes
{ {
new PlaylistItem new PlaylistItem
{ {
Beatmap = { Value = importedBeatmap.Value.Beatmaps.First() }, Beatmap = { Value = InitialBeatmap },
Ruleset = { Value = new OsuRuleset().RulesetInfo } Ruleset = { Value = new OsuRuleset().RulesetInfo },
} }
} }
})); }));
@ -91,13 +93,33 @@ namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes
InputManager.Click(MouseButton.Left); InputManager.Click(MouseButton.Left);
}); });
AddUntilStep("wait for join", () => client.Room != null); AddUntilStep("wait for join", () => Client.Room != null);
} }
[Test] [Test]
public void TestCreatedWithCorrectMode() public void TestCreatedWithCorrectMode()
{ {
AddAssert("room created with correct mode", () => client.APIRoom?.QueueMode.Value == Mode); AddAssert("room created with correct mode", () => Client.APIRoom?.QueueMode.Value == Mode);
}
protected void RunGameplay()
{
AddStep("click ready button", () =>
{
InputManager.MoveMouseTo(this.ChildrenOfType<MultiplayerReadyButton>().Single());
InputManager.Click(MouseButton.Left);
});
AddUntilStep("wait for ready", () => Client.LocalUser?.State == MultiplayerUserState.Ready);
AddStep("click ready button", () =>
{
InputManager.MoveMouseTo(this.ChildrenOfType<MultiplayerReadyButton>().Single());
InputManager.Click(MouseButton.Left);
});
AddUntilStep("wait for player", () => multiplayerScreenStack.CurrentScreen is Player player && player.IsLoaded);
AddStep("exit player", () => multiplayerScreenStack.MultiplayerScreen.MakeCurrent());
} }
} }
} }

View File

@ -1,12 +1,65 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
using System;
using System.Linq;
using NUnit.Framework;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Online.Multiplayer.Queueing; using osu.Game.Online.Multiplayer.Queueing;
using osu.Game.Screens.OnlinePlay.Multiplayer;
using osuTK.Input;
namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes namespace osu.Game.Tests.Visual.Multiplayer.QueueingModes
{ {
public class TestSceneHostOnlyQueueingMode : QueueModeTestScene public class TestSceneHostOnlyQueueingMode : QueueModeTestScene
{ {
protected override QueueModes Mode => QueueModes.HostOnly; protected override QueueModes Mode => QueueModes.HostOnly;
[Test]
public void TestItemStillSelectedAfterChange()
{
selectNewItem(() => OtherBeatmap);
}
[Test]
public void TestNewItemCreatedAfterGameplayFinished()
{
RunGameplay();
AddAssert("playlist contains two items", () => Client.APIRoom?.Playlist.Count == 2);
AddAssert("first playlist item expired", () => Client.APIRoom?.Playlist[0].Expired == true);
AddAssert("second playlist item not expired", () => Client.APIRoom?.Playlist[1].Expired == false);
AddAssert("second playlist item selected", () => Client.CurrentMatchPlayingItem.Value == Client.APIRoom?.Playlist[1]);
}
[Test]
public void TestOnlyLastItemChangedAfterGameplayFinished()
{
RunGameplay();
BeatmapInfo firstBeatmap = null;
AddStep("get first playlist item beatmap", () => firstBeatmap = Client.APIRoom?.Playlist[0].Beatmap.Value);
selectNewItem(() => OtherBeatmap);
AddAssert("first playlist item hasn't changed", () => Client.APIRoom?.Playlist[0].Beatmap.Value == firstBeatmap);
AddAssert("second playlist item changed", () => Client.APIRoom?.Playlist[1].Beatmap.Value != firstBeatmap);
}
private void selectNewItem(Func<BeatmapInfo> beatmap)
{
AddStep("click edit button", () =>
{
InputManager.MoveMouseTo(this.ChildrenOfType<MultiplayerMatchSubScreen>().Single().AddOrEditPlaylistButton);
InputManager.Click(MouseButton.Left);
});
AddUntilStep("wait for song select", () => CurrentSubScreen is Screens.Select.SongSelect select && select.IsLoaded);
AddStep("select other beatmap", () => ((Screens.Select.SongSelect)CurrentSubScreen).FinaliseSelection(beatmap()));
AddUntilStep("wait for return to match", () => CurrentSubScreen is MultiplayerMatchSubScreen);
AddUntilStep("selected item is new beatmap", () => Client.CurrentMatchPlayingItem.Value?.Beatmap.Value?.OnlineID == OtherBeatmap.OnlineID);
}
} }
} }

View File

@ -55,7 +55,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
[CanBeNull] [CanBeNull]
private IDisposable readyClickOperation; private IDisposable readyClickOperation;
private OsuButton addOrEditPlaylistButton; public OsuButton AddOrEditPlaylistButton { get; private set; }
public MultiplayerMatchSubScreen(Room room) public MultiplayerMatchSubScreen(Room room)
: base(room) : base(room)
@ -134,7 +134,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
new Drawable[] { new OverlinedHeader("Beatmap") }, new Drawable[] { new OverlinedHeader("Beatmap") },
new Drawable[] new Drawable[]
{ {
addOrEditPlaylistButton = new PurpleTriangleButton AddOrEditPlaylistButton = new PurpleTriangleButton
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
Height = 40, Height = 40,
@ -386,18 +386,18 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
switch (client.Room.Settings.QueueMode) switch (client.Room.Settings.QueueMode)
{ {
case QueueModes.HostOnly: case QueueModes.HostOnly:
addOrEditPlaylistButton.Text = "Edit beatmap"; AddOrEditPlaylistButton.Text = "Edit beatmap";
addOrEditPlaylistButton.Alpha = client.Room.Host?.User?.Equals(client.LocalUser?.User) == true ? 1 : 0; AddOrEditPlaylistButton.Alpha = client.Room.Host?.User?.Equals(client.LocalUser?.User) == true ? 1 : 0;
break; break;
case QueueModes.FreeForAll: case QueueModes.FreeForAll:
case QueueModes.FairRotate: case QueueModes.FairRotate:
addOrEditPlaylistButton.Text = "Add beatmap"; AddOrEditPlaylistButton.Text = "Add beatmap";
addOrEditPlaylistButton.Alpha = 1; AddOrEditPlaylistButton.Alpha = 1;
break; break;
default: default:
addOrEditPlaylistButton.Alpha = 0; AddOrEditPlaylistButton.Alpha = 0;
break; break;
} }

View File

@ -211,7 +211,7 @@ namespace osu.Game.Screens.OnlinePlay
((IBindable<UserActivity>)Activity).BindTo(newOsuScreen.Activity); ((IBindable<UserActivity>)Activity).BindTo(newOsuScreen.Activity);
} }
protected IScreen CurrentSubScreen => screenStack.CurrentScreen; public IScreen CurrentSubScreen => screenStack.CurrentScreen;
protected abstract string ScreenTitle { get; } protected abstract string ScreenTitle { get; }