mirror of
https://github.com/osukey/osukey.git
synced 2025-08-07 16:43:52 +09:00
Merge pull request #11928 from smoogipoo/fix-test-multiplayer-beatmap
This commit is contained in:
35
osu.Game.Tests/OnlinePlay/StatefulMultiplayerClientTest.cs
Normal file
35
osu.Game.Tests/OnlinePlay/StatefulMultiplayerClientTest.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Tests.Visual.Multiplayer;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.OnlinePlay
|
||||||
|
{
|
||||||
|
[HeadlessTest]
|
||||||
|
public class StatefulMultiplayerClientTest : MultiplayerTestScene
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void TestUserAddedOnJoin()
|
||||||
|
{
|
||||||
|
var user = new User { Id = 33 };
|
||||||
|
|
||||||
|
AddRepeatStep("add user multiple times", () => Client.AddUser(user), 3);
|
||||||
|
AddAssert("room has 2 users", () => Client.Room?.Users.Count == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestUserRemovedOnLeave()
|
||||||
|
{
|
||||||
|
var user = new User { Id = 44 };
|
||||||
|
|
||||||
|
AddStep("add user", () => Client.AddUser(user));
|
||||||
|
AddAssert("room has 2 users", () => Client.Room?.Users.Count == 2);
|
||||||
|
|
||||||
|
AddRepeatStep("remove user multiple times", () => Client.RemoveUser(user), 3);
|
||||||
|
AddAssert("room has 1 user", () => Client.Room?.Users.Count == 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,46 +1,41 @@
|
|||||||
// 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 NUnit.Framework;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Game.Online.Multiplayer;
|
||||||
using osu.Game.Screens.OnlinePlay.Components;
|
using osu.Game.Screens.OnlinePlay.Components;
|
||||||
using osu.Game.Users;
|
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Multiplayer
|
namespace osu.Game.Tests.Visual.Multiplayer
|
||||||
{
|
{
|
||||||
public class TestSceneMultiplayer : MultiplayerTestScene
|
public class TestSceneMultiplayer : ScreenTestScene
|
||||||
{
|
{
|
||||||
|
private TestMultiplayer multiplayerScreen;
|
||||||
|
|
||||||
public TestSceneMultiplayer()
|
public TestSceneMultiplayer()
|
||||||
{
|
{
|
||||||
var multi = new TestMultiplayer();
|
AddStep("show", () =>
|
||||||
|
|
||||||
AddStep("show", () => LoadScreen(multi));
|
|
||||||
AddUntilStep("wait for loaded", () => multi.IsLoaded);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void TestOneUserJoinedMultipleTimes()
|
|
||||||
{
|
{
|
||||||
var user = new User { Id = 33 };
|
multiplayerScreen = new TestMultiplayer();
|
||||||
|
|
||||||
AddRepeatStep("add user multiple times", () => Client.AddUser(user), 3);
|
// Needs to be added at a higher level since the multiplayer screen becomes non-current.
|
||||||
|
Child = multiplayerScreen.Client;
|
||||||
|
|
||||||
AddAssert("room has 2 users", () => Client.Room?.Users.Count == 2);
|
LoadScreen(multiplayerScreen);
|
||||||
}
|
});
|
||||||
|
|
||||||
[Test]
|
AddUntilStep("wait for loaded", () => multiplayerScreen.IsLoaded);
|
||||||
public void TestOneUserLeftMultipleTimes()
|
|
||||||
{
|
|
||||||
var user = new User { Id = 44 };
|
|
||||||
|
|
||||||
AddStep("add user", () => Client.AddUser(user));
|
|
||||||
AddAssert("room has 2 users", () => Client.Room?.Users.Count == 2);
|
|
||||||
|
|
||||||
AddRepeatStep("remove user multiple times", () => Client.RemoveUser(user), 3);
|
|
||||||
AddAssert("room has 1 user", () => Client.Room?.Users.Count == 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class TestMultiplayer : Screens.OnlinePlay.Multiplayer.Multiplayer
|
private class TestMultiplayer : Screens.OnlinePlay.Multiplayer.Multiplayer
|
||||||
{
|
{
|
||||||
|
[Cached(typeof(StatefulMultiplayerClient))]
|
||||||
|
public readonly TestMultiplayerClient Client;
|
||||||
|
|
||||||
|
public TestMultiplayer()
|
||||||
|
{
|
||||||
|
Client = new TestMultiplayerClient((TestMultiplayerRoomManager)RoomManager);
|
||||||
|
}
|
||||||
|
|
||||||
protected override RoomManager CreateRoomManager() => new TestMultiplayerRoomManager();
|
protected override RoomManager CreateRoomManager() => new TestMultiplayerRoomManager();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,12 +3,10 @@
|
|||||||
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
using osu.Game.Rulesets.Osu;
|
using osu.Game.Rulesets.Osu;
|
||||||
using osu.Game.Screens.OnlinePlay;
|
|
||||||
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.Tests.Beatmaps;
|
using osu.Game.Tests.Beatmaps;
|
||||||
@ -20,9 +18,6 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
private MultiplayerMatchSubScreen screen;
|
private MultiplayerMatchSubScreen screen;
|
||||||
|
|
||||||
[Cached]
|
|
||||||
private OngoingOperationTracker ongoingOperationTracker = new OngoingOperationTracker();
|
|
||||||
|
|
||||||
public TestSceneMultiplayerMatchSubScreen()
|
public TestSceneMultiplayerMatchSubScreen()
|
||||||
: base(false)
|
: base(false)
|
||||||
{
|
{
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
// 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 NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
|
using osu.Game.Screens.OnlinePlay.Components;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Multiplayer
|
namespace osu.Game.Tests.Visual.Multiplayer
|
||||||
{
|
{
|
||||||
@ -21,15 +24,15 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
||||||
{
|
{
|
||||||
roomManager.CreateRoom(new Room { Name = { Value = "1" } });
|
roomManager.CreateRoom(createRoom(r => r.Name.Value = "1"));
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
roomManager.CreateRoom(new Room { Name = { Value = "2" } });
|
roomManager.CreateRoom(createRoom(r => r.Name.Value = "2"));
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
roomManager.ClearRooms();
|
roomManager.ClearRooms();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
AddAssert("manager polled for rooms", () => roomManager.Rooms.Count == 2);
|
AddAssert("manager polled for rooms", () => ((RoomManager)roomManager).Rooms.Count == 2);
|
||||||
AddAssert("initial rooms received", () => roomManager.InitialRoomsReceived.Value);
|
AddAssert("initial rooms received", () => roomManager.InitialRoomsReceived.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,16 +43,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
||||||
{
|
{
|
||||||
roomManager.CreateRoom(new Room());
|
roomManager.CreateRoom(createRoom());
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
roomManager.CreateRoom(new Room());
|
roomManager.CreateRoom(createRoom());
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
AddStep("disconnect", () => roomContainer.Client.Disconnect());
|
AddStep("disconnect", () => roomContainer.Client.Disconnect());
|
||||||
|
|
||||||
AddAssert("rooms cleared", () => roomManager.Rooms.Count == 0);
|
AddAssert("rooms cleared", () => ((RoomManager)roomManager).Rooms.Count == 0);
|
||||||
AddAssert("initial rooms not received", () => !roomManager.InitialRoomsReceived.Value);
|
AddAssert("initial rooms not received", () => !roomManager.InitialRoomsReceived.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,9 +63,9 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
||||||
{
|
{
|
||||||
roomManager.CreateRoom(new Room());
|
roomManager.CreateRoom(createRoom());
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
roomManager.CreateRoom(new Room());
|
roomManager.CreateRoom(createRoom());
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -70,7 +73,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
AddStep("disconnect", () => roomContainer.Client.Disconnect());
|
AddStep("disconnect", () => roomContainer.Client.Disconnect());
|
||||||
AddStep("connect", () => roomContainer.Client.Connect());
|
AddStep("connect", () => roomContainer.Client.Connect());
|
||||||
|
|
||||||
AddAssert("manager polled for rooms", () => roomManager.Rooms.Count == 2);
|
AddAssert("manager polled for rooms", () => ((RoomManager)roomManager).Rooms.Count == 2);
|
||||||
AddAssert("initial rooms received", () => roomManager.InitialRoomsReceived.Value);
|
AddAssert("initial rooms received", () => roomManager.InitialRoomsReceived.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,12 +84,12 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
||||||
{
|
{
|
||||||
roomManager.CreateRoom(new Room());
|
roomManager.CreateRoom(createRoom());
|
||||||
roomManager.ClearRooms();
|
roomManager.ClearRooms();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
AddAssert("manager not polled for rooms", () => roomManager.Rooms.Count == 0);
|
AddAssert("manager not polled for rooms", () => ((RoomManager)roomManager).Rooms.Count == 0);
|
||||||
AddAssert("initial rooms not received", () => !roomManager.InitialRoomsReceived.Value);
|
AddAssert("initial rooms not received", () => !roomManager.InitialRoomsReceived.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,7 +100,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
||||||
{
|
{
|
||||||
roomManager.CreateRoom(new Room());
|
roomManager.CreateRoom(createRoom());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -111,7 +114,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
||||||
{
|
{
|
||||||
roomManager.CreateRoom(new Room());
|
roomManager.CreateRoom(createRoom());
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -126,7 +129,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
createRoomManager().With(d => d.OnLoadComplete += _ =>
|
||||||
{
|
{
|
||||||
var r = new Room();
|
var r = createRoom();
|
||||||
roomManager.CreateRoom(r);
|
roomManager.CreateRoom(r);
|
||||||
roomManager.PartRoom();
|
roomManager.PartRoom();
|
||||||
roomManager.JoinRoom(r);
|
roomManager.JoinRoom(r);
|
||||||
@ -136,6 +139,21 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
AddUntilStep("multiplayer room joined", () => roomContainer.Client.Room != null);
|
AddUntilStep("multiplayer room joined", () => roomContainer.Client.Room != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Room createRoom(Action<Room> initFunc = null)
|
||||||
|
{
|
||||||
|
var room = new Room();
|
||||||
|
|
||||||
|
room.Name.Value = "test room";
|
||||||
|
room.Playlist.Add(new PlaylistItem
|
||||||
|
{
|
||||||
|
Beatmap = { Value = new TestBeatmap(Ruleset.Value).BeatmapInfo },
|
||||||
|
Ruleset = { Value = Ruleset.Value }
|
||||||
|
});
|
||||||
|
|
||||||
|
initFunc?.Invoke(room);
|
||||||
|
return room;
|
||||||
|
}
|
||||||
|
|
||||||
private TestMultiplayerRoomManager createRoomManager()
|
private TestMultiplayerRoomManager createRoomManager()
|
||||||
{
|
{
|
||||||
Child = roomContainer = new TestMultiplayerRoomContainer
|
Child = roomContainer = new TestMultiplayerRoomContainer
|
||||||
|
@ -9,7 +9,9 @@ using System.Threading.Tasks;
|
|||||||
using Microsoft.AspNetCore.SignalR.Client;
|
using Microsoft.AspNetCore.SignalR.Client;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
|
|
||||||
namespace osu.Game.Online.Multiplayer
|
namespace osu.Game.Online.Multiplayer
|
||||||
@ -121,6 +123,29 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
return connection.InvokeAsync(nameof(IMultiplayerServer.StartMatch));
|
return connection.InvokeAsync(nameof(IMultiplayerServer.StartMatch));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Task<BeatmapSetInfo> GetOnlineBeatmapSet(int beatmapId, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var tcs = new TaskCompletionSource<BeatmapSetInfo>();
|
||||||
|
var req = new GetBeatmapSetRequest(beatmapId, BeatmapSetLookupType.BeatmapId);
|
||||||
|
|
||||||
|
req.Success += res =>
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
tcs.SetCanceled();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tcs.SetResult(res.ToBeatmapSet(Rulesets));
|
||||||
|
};
|
||||||
|
|
||||||
|
req.Failure += e => tcs.SetException(e);
|
||||||
|
|
||||||
|
API.Queue(req);
|
||||||
|
|
||||||
|
return tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool isDisposing)
|
protected override void Dispose(bool isDisposing)
|
||||||
{
|
{
|
||||||
base.Dispose(isDisposing);
|
base.Dispose(isDisposing);
|
||||||
|
@ -17,8 +17,6 @@ using osu.Framework.Logging;
|
|||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests;
|
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
using osu.Game.Online.Rooms.RoomStatuses;
|
using osu.Game.Online.Rooms.RoomStatuses;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
@ -71,7 +69,7 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The <see cref="MultiplayerRoomUser"/> corresponding to the local player, if available.
|
/// The <see cref="MultiplayerRoomUser"/> corresponding to the local player, if available.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MultiplayerRoomUser? LocalUser => Room?.Users.SingleOrDefault(u => u.User?.Id == api.LocalUser.Value.Id);
|
public MultiplayerRoomUser? LocalUser => Room?.Users.SingleOrDefault(u => u.User?.Id == API.LocalUser.Value.Id);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether the <see cref="LocalUser"/> is the host in <see cref="Room"/>.
|
/// Whether the <see cref="LocalUser"/> is the host in <see cref="Room"/>.
|
||||||
@ -85,15 +83,15 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
protected IAPIProvider API { get; private set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
protected RulesetStore Rulesets { get; private set; } = null!;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private UserLookupCache userLookupCache { get; set; } = null!;
|
private UserLookupCache userLookupCache { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved]
|
|
||||||
private IAPIProvider api { get; set; } = null!;
|
|
||||||
|
|
||||||
[Resolved]
|
|
||||||
private RulesetStore rulesets { get; set; } = null!;
|
|
||||||
|
|
||||||
// Only exists for compatibility with old osu-server-spectator build.
|
// Only exists for compatibility with old osu-server-spectator build.
|
||||||
// Todo: Can be removed on 2021/02/26.
|
// Todo: Can be removed on 2021/02/26.
|
||||||
private long defaultPlaylistItemId;
|
private long defaultPlaylistItemId;
|
||||||
@ -515,30 +513,26 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
|
|
||||||
RoomUpdated?.Invoke();
|
RoomUpdated?.Invoke();
|
||||||
|
|
||||||
var req = new GetBeatmapSetRequest(settings.BeatmapID, BeatmapSetLookupType.BeatmapId);
|
GetOnlineBeatmapSet(settings.BeatmapID, cancellationToken).ContinueWith(set => Schedule(() =>
|
||||||
req.Success += res =>
|
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
updatePlaylist(settings, res);
|
updatePlaylist(settings, set.Result);
|
||||||
};
|
}), TaskContinuationOptions.OnlyOnRanToCompletion);
|
||||||
|
|
||||||
api.Queue(req);
|
|
||||||
}, cancellationToken);
|
}, cancellationToken);
|
||||||
|
|
||||||
private void updatePlaylist(MultiplayerRoomSettings settings, APIBeatmapSet onlineSet)
|
private void updatePlaylist(MultiplayerRoomSettings settings, BeatmapSetInfo beatmapSet)
|
||||||
{
|
{
|
||||||
if (Room == null || !Room.Settings.Equals(settings))
|
if (Room == null || !Room.Settings.Equals(settings))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Debug.Assert(apiRoom != null);
|
Debug.Assert(apiRoom != null);
|
||||||
|
|
||||||
var beatmapSet = onlineSet.ToBeatmapSet(rulesets);
|
|
||||||
var beatmap = beatmapSet.Beatmaps.Single(b => b.OnlineBeatmapID == settings.BeatmapID);
|
var beatmap = beatmapSet.Beatmaps.Single(b => b.OnlineBeatmapID == settings.BeatmapID);
|
||||||
beatmap.MD5Hash = settings.BeatmapChecksum;
|
beatmap.MD5Hash = settings.BeatmapChecksum;
|
||||||
|
|
||||||
var ruleset = rulesets.GetRuleset(settings.RulesetID).CreateInstance();
|
var ruleset = Rulesets.GetRuleset(settings.RulesetID).CreateInstance();
|
||||||
var mods = settings.RequiredMods.Select(m => m.ToMod(ruleset));
|
var mods = settings.RequiredMods.Select(m => m.ToMod(ruleset));
|
||||||
var allowedMods = settings.AllowedMods.Select(m => m.ToMod(ruleset));
|
var allowedMods = settings.AllowedMods.Select(m => m.ToMod(ruleset));
|
||||||
|
|
||||||
@ -568,6 +562,14 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves a <see cref="BeatmapSetInfo"/> from an online source.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="beatmapId">The beatmap set ID.</param>
|
||||||
|
/// <param name="cancellationToken">A token to cancel the request.</param>
|
||||||
|
/// <returns>The <see cref="BeatmapSetInfo"/> retrieval task.</returns>
|
||||||
|
protected abstract Task<BeatmapSetInfo> GetOnlineBeatmapSet(int beatmapId, CancellationToken cancellationToken = default);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For the provided user ID, update whether the user is included in <see cref="CurrentMatchPlayingUserIds"/>.
|
/// For the provided user ID, update whether the user is included in <see cref="CurrentMatchPlayingUserIds"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -7,8 +7,10 @@ using osu.Framework.Bindables;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Online.Multiplayer;
|
using osu.Game.Online.Multiplayer;
|
||||||
|
using osu.Game.Online.Rooms;
|
||||||
using osu.Game.Screens.OnlinePlay;
|
using osu.Game.Screens.OnlinePlay;
|
||||||
using osu.Game.Screens.OnlinePlay.Lounge.Components;
|
using osu.Game.Screens.OnlinePlay.Lounge.Components;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Multiplayer
|
namespace osu.Game.Tests.Visual.Multiplayer
|
||||||
{
|
{
|
||||||
@ -48,7 +50,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
RoomManager.Schedule(() => RoomManager.PartRoom());
|
RoomManager.Schedule(() => RoomManager.PartRoom());
|
||||||
|
|
||||||
if (joinRoom)
|
if (joinRoom)
|
||||||
|
{
|
||||||
|
Room.Name.Value = "test name";
|
||||||
|
Room.Playlist.Add(new PlaylistItem
|
||||||
|
{
|
||||||
|
Beatmap = { Value = new TestBeatmap(Ruleset.Value).BeatmapInfo },
|
||||||
|
Ruleset = { Value = Ruleset.Value }
|
||||||
|
});
|
||||||
|
|
||||||
RoomManager.Schedule(() => RoomManager.CreateRoom(Room));
|
RoomManager.Schedule(() => RoomManager.CreateRoom(Room));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
public override void SetUpSteps()
|
public override void SetUpSteps()
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
|
|
||||||
#nullable enable
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.Multiplayer;
|
using osu.Game.Online.Multiplayer;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
@ -25,6 +28,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private IAPIProvider api { get; set; } = null!;
|
private IAPIProvider api { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private BeatmapManager beatmaps { get; set; } = null!;
|
||||||
|
|
||||||
|
private readonly TestMultiplayerRoomManager roomManager;
|
||||||
|
|
||||||
|
public TestMultiplayerClient(TestMultiplayerRoomManager roomManager)
|
||||||
|
{
|
||||||
|
this.roomManager = roomManager;
|
||||||
|
}
|
||||||
|
|
||||||
public void Connect() => isConnected.Value = true;
|
public void Connect() => isConnected.Value = true;
|
||||||
|
|
||||||
public void Disconnect() => isConnected.Value = false;
|
public void Disconnect() => isConnected.Value = false;
|
||||||
@ -89,13 +102,28 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
|
|
||||||
protected override Task<MultiplayerRoom> JoinRoom(long roomId)
|
protected override Task<MultiplayerRoom> JoinRoom(long roomId)
|
||||||
{
|
{
|
||||||
var user = new MultiplayerRoomUser(api.LocalUser.Value.Id) { User = api.LocalUser.Value };
|
var apiRoom = roomManager.Rooms.Single(r => r.RoomID.Value == roomId);
|
||||||
|
|
||||||
var room = new MultiplayerRoom(roomId);
|
var user = new MultiplayerRoomUser(api.LocalUser.Value.Id)
|
||||||
room.Users.Add(user);
|
{
|
||||||
|
User = api.LocalUser.Value
|
||||||
|
};
|
||||||
|
|
||||||
if (room.Users.Count == 1)
|
var room = new MultiplayerRoom(roomId)
|
||||||
room.Host = user;
|
{
|
||||||
|
Settings =
|
||||||
|
{
|
||||||
|
Name = apiRoom.Name.Value,
|
||||||
|
BeatmapID = apiRoom.Playlist.Last().BeatmapID,
|
||||||
|
RulesetID = apiRoom.Playlist.Last().RulesetID,
|
||||||
|
BeatmapChecksum = apiRoom.Playlist.Last().Beatmap.Value.MD5Hash,
|
||||||
|
RequiredMods = apiRoom.Playlist.Last().RequiredMods.Select(m => new APIMod(m)).ToArray(),
|
||||||
|
AllowedMods = apiRoom.Playlist.Last().AllowedMods.Select(m => new APIMod(m)).ToArray(),
|
||||||
|
PlaylistItemId = apiRoom.Playlist.Last().ID
|
||||||
|
},
|
||||||
|
Users = { user },
|
||||||
|
Host = user
|
||||||
|
};
|
||||||
|
|
||||||
return Task.FromResult(room);
|
return Task.FromResult(room);
|
||||||
}
|
}
|
||||||
@ -150,5 +178,19 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
|
|
||||||
return ((IMultiplayerClient)this).LoadRequested();
|
return ((IMultiplayerClient)this).LoadRequested();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Task<BeatmapSetInfo> GetOnlineBeatmapSet(int beatmapId, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
Debug.Assert(Room != null);
|
||||||
|
|
||||||
|
var apiRoom = roomManager.Rooms.Single(r => r.RoomID.Value == Room.RoomID);
|
||||||
|
var set = apiRoom.Playlist.FirstOrDefault(p => p.BeatmapID == beatmapId)?.Beatmap.Value.BeatmapSet
|
||||||
|
?? beatmaps.QueryBeatmap(b => b.OnlineBeatmapID == beatmapId)?.BeatmapSet;
|
||||||
|
|
||||||
|
if (set == null)
|
||||||
|
throw new InvalidOperationException("Beatmap not found.");
|
||||||
|
|
||||||
|
return Task.FromResult(set);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,11 +32,15 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
|
||||||
|
RoomManager = new TestMultiplayerRoomManager();
|
||||||
|
Client = new TestMultiplayerClient(RoomManager);
|
||||||
|
OngoingOperationTracker = new OngoingOperationTracker();
|
||||||
|
|
||||||
AddRangeInternal(new Drawable[]
|
AddRangeInternal(new Drawable[]
|
||||||
{
|
{
|
||||||
Client = new TestMultiplayerClient(),
|
Client,
|
||||||
RoomManager = new TestMultiplayerRoomManager(),
|
RoomManager,
|
||||||
OngoingOperationTracker = new OngoingOperationTracker(),
|
OngoingOperationTracker,
|
||||||
content = new Container { RelativeSizeAxes = Axes.Both }
|
content = new Container { RelativeSizeAxes = Axes.Both }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
[Cached]
|
[Cached]
|
||||||
public readonly Bindable<FilterCriteria> Filter = new Bindable<FilterCriteria>(new FilterCriteria());
|
public readonly Bindable<FilterCriteria> Filter = new Bindable<FilterCriteria>(new FilterCriteria());
|
||||||
|
|
||||||
private readonly List<Room> rooms = new List<Room>();
|
public new readonly List<Room> Rooms = new List<Room>();
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
{
|
{
|
||||||
@ -35,6 +35,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
|
|
||||||
int currentScoreId = 0;
|
int currentScoreId = 0;
|
||||||
int currentRoomId = 0;
|
int currentRoomId = 0;
|
||||||
|
int currentPlaylistItemId = 0;
|
||||||
|
|
||||||
((DummyAPIAccess)api).HandleRequest = req =>
|
((DummyAPIAccess)api).HandleRequest = req =>
|
||||||
{
|
{
|
||||||
@ -46,7 +47,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
createdRoom.CopyFrom(createRoomRequest.Room);
|
createdRoom.CopyFrom(createRoomRequest.Room);
|
||||||
createdRoom.RoomID.Value ??= currentRoomId++;
|
createdRoom.RoomID.Value ??= currentRoomId++;
|
||||||
|
|
||||||
rooms.Add(createdRoom);
|
for (int i = 0; i < createdRoom.Playlist.Count; i++)
|
||||||
|
createdRoom.Playlist[i].ID = currentPlaylistItemId++;
|
||||||
|
|
||||||
|
Rooms.Add(createdRoom);
|
||||||
createRoomRequest.TriggerSuccess(createdRoom);
|
createRoomRequest.TriggerSuccess(createdRoom);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -61,7 +65,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
case GetRoomsRequest getRoomsRequest:
|
case GetRoomsRequest getRoomsRequest:
|
||||||
var roomsWithoutParticipants = new List<Room>();
|
var roomsWithoutParticipants = new List<Room>();
|
||||||
|
|
||||||
foreach (var r in rooms)
|
foreach (var r in Rooms)
|
||||||
{
|
{
|
||||||
var newRoom = new Room();
|
var newRoom = new Room();
|
||||||
|
|
||||||
@ -75,7 +79,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GetRoomRequest getRoomRequest:
|
case GetRoomRequest getRoomRequest:
|
||||||
getRoomRequest.TriggerSuccess(rooms.Single(r => r.RoomID.Value == getRoomRequest.RoomId));
|
getRoomRequest.TriggerSuccess(Rooms.Single(r => r.RoomID.Value == getRoomRequest.RoomId));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GetBeatmapSetRequest getBeatmapSetRequest:
|
case GetBeatmapSetRequest getBeatmapSetRequest:
|
||||||
|
Reference in New Issue
Block a user