// 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.Testing; using osu.Game.Online.Rooms; using osu.Game.Screens.OnlinePlay.Components; using osu.Game.Tests.Beatmaps; using osu.Game.Tests.Visual.OnlinePlay; namespace osu.Game.Tests.Visual.Multiplayer { [HeadlessTest] public class TestSceneMultiplayerRoomManager : MultiplayerTestScene { protected override OnlinePlayTestSceneDependencies CreateOnlinePlayDependencies() => new TestDependencies(); public TestSceneMultiplayerRoomManager() : base(false) { } [Test] public void TestPollsInitially() { AddStep("create room manager with a few rooms", () => { RoomManager.CreateRoom(createRoom(r => r.Name.Value = "1")); RoomManager.PartRoom(); RoomManager.CreateRoom(createRoom(r => r.Name.Value = "2")); RoomManager.PartRoom(); RoomManager.ClearRooms(); }); AddAssert("manager polled for rooms", () => ((RoomManager)RoomManager).Rooms.Count == 2); AddAssert("initial rooms received", () => RoomManager.InitialRoomsReceived.Value); } [Test] public void TestRoomsClearedOnDisconnection() { AddStep("create room manager with a few rooms", () => { RoomManager.CreateRoom(createRoom()); RoomManager.PartRoom(); RoomManager.CreateRoom(createRoom()); RoomManager.PartRoom(); }); AddStep("disconnect", () => Client.Disconnect()); AddAssert("rooms cleared", () => ((RoomManager)RoomManager).Rooms.Count == 0); AddAssert("initial rooms not received", () => !RoomManager.InitialRoomsReceived.Value); } [Test] public void TestRoomsPolledOnReconnect() { AddStep("create room manager with a few rooms", () => { RoomManager.CreateRoom(createRoom()); RoomManager.PartRoom(); RoomManager.CreateRoom(createRoom()); RoomManager.PartRoom(); }); AddStep("disconnect", () => Client.Disconnect()); AddStep("connect", () => Client.Connect()); AddAssert("manager polled for rooms", () => ((RoomManager)RoomManager).Rooms.Count == 2); AddAssert("initial rooms received", () => RoomManager.InitialRoomsReceived.Value); } [Test] public void TestRoomsNotPolledWhenJoined() { AddStep("create room manager with a room", () => { RoomManager.CreateRoom(createRoom()); RoomManager.ClearRooms(); }); AddAssert("manager not polled for rooms", () => ((RoomManager)RoomManager).Rooms.Count == 0); AddAssert("initial rooms not received", () => !RoomManager.InitialRoomsReceived.Value); } [Test] public void TestMultiplayerRoomJoinedWhenCreated() { AddStep("create room manager with a room", () => { RoomManager.CreateRoom(createRoom()); }); AddUntilStep("multiplayer room joined", () => Client.Room != null); } [Test] public void TestMultiplayerRoomPartedWhenAPIRoomParted() { AddStep("create room manager with a room", () => { RoomManager.CreateRoom(createRoom()); RoomManager.PartRoom(); }); AddAssert("multiplayer room parted", () => Client.Room == null); } [Test] public void TestMultiplayerRoomJoinedWhenAPIRoomJoined() { AddStep("create room manager with a room", () => { var r = createRoom(); RoomManager.CreateRoom(r); RoomManager.PartRoom(); RoomManager.JoinRoom(r); }); AddUntilStep("multiplayer room joined", () => Client.Room != null); } private Room createRoom(Action initFunc = null) { var room = new Room { Name = { Value = "test room" }, Playlist = { new PlaylistItem { Beatmap = { Value = new TestBeatmap(Ruleset.Value).BeatmapInfo }, Ruleset = { Value = Ruleset.Value } } } }; initFunc?.Invoke(room); return room; } private class TestDependencies : MultiplayerTestSceneDependencies { public TestDependencies() { // Need to set these values as early as possible. RoomManager.TimeBetweenListingPolls.Value = 1; RoomManager.TimeBetweenSelectionPolls.Value = 1; } } } }