Skip to content

Remove RoomManager, centralise listing management to lounge #31866

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 4, 2025
90 changes: 46 additions & 44 deletions osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Linq;
using NUnit.Framework;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
Expand All @@ -19,26 +20,26 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
public partial class TestSceneLoungeRoomsContainer : OnlinePlayTestScene
{
protected new TestRoomManager RoomManager => (TestRoomManager)base.RoomManager;

private RoomsContainer container = null!;
private BindableList<Room> rooms = null!;
private RoomListing container = null!;

public override void SetUpSteps()
{
base.SetUpSteps();

AddStep("create container", () =>
{
rooms = new BindableList<Room>();
Child = new PopoverContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Width = 0.5f,

Child = container = new RoomsContainer
Child = container = new RoomListing
{
RelativeSizeAxes = Axes.Both,
Rooms = { BindTarget = rooms },
SelectedRoom = { BindTarget = SelectedRoom }
}
};
Expand All @@ -48,57 +49,58 @@ public override void SetUpSteps()
[Test]
public void TestBasicListChanges()
{
AddStep("add rooms", () => RoomManager.AddRooms(5, withSpotlightRooms: true));
AddStep("add rooms", () => rooms.AddRange(GenerateRooms(5, withSpotlightRooms: true)));

AddAssert("has 5 rooms", () => container.Rooms.Count == 5);
AddAssert("has 5 rooms", () => container.DrawableRooms.Count == 5);

AddAssert("all spotlights at top", () => container.Rooms
AddAssert("all spotlights at top", () => container.DrawableRooms
.SkipWhile(r => r.Room.Category == RoomCategory.Spotlight)
.All(r => r.Room.Category == RoomCategory.Normal));

AddStep("remove first room", () => RoomManager.RemoveRoom(RoomManager.Rooms.First(r => r.RoomID == 0)));
AddAssert("has 4 rooms", () => container.Rooms.Count == 4);
AddAssert("first room removed", () => container.Rooms.All(r => r.Room.RoomID != 0));
AddStep("remove first room", () => rooms.RemoveAt(0));
AddAssert("has 4 rooms", () => container.DrawableRooms.Count == 4);
AddAssert("first room removed", () => container.DrawableRooms.All(r => r.Room.RoomID != 0));

AddStep("select first room", () => container.Rooms.First().TriggerClick());
AddAssert("first spotlight selected", () => checkRoomSelected(RoomManager.Rooms.First(r => r.Category == RoomCategory.Spotlight)));
AddStep("select first room", () => container.DrawableRooms.First().TriggerClick());
AddAssert("first spotlight selected", () => checkRoomSelected(rooms.First(r => r.Category == RoomCategory.Spotlight)));

AddStep("remove last room", () => RoomManager.RemoveRoom(RoomManager.Rooms.MinBy(r => r.RoomID)!));
AddAssert("first spotlight still selected", () => checkRoomSelected(RoomManager.Rooms.First(r => r.Category == RoomCategory.Spotlight)));
AddStep("remove last room", () => rooms.RemoveAt(rooms.Count - 1));
AddAssert("first spotlight still selected", () => checkRoomSelected(rooms.First(r => r.Category == RoomCategory.Spotlight)));

AddStep("remove spotlight room", () => RoomManager.RemoveRoom(RoomManager.Rooms.Single(r => r.Category == RoomCategory.Spotlight)));
AddStep("remove spotlight room", () => rooms.RemoveAll(r => r.Category == RoomCategory.Spotlight));
AddAssert("selection vacated", () => checkRoomSelected(null));
}

[Test]
public void TestKeyboardNavigation()
{
AddStep("add rooms", () => RoomManager.AddRooms(3));
AddStep("add rooms", () => rooms.AddRange(GenerateRooms(3)));

AddAssert("no selection", () => checkRoomSelected(null));

press(Key.Down);
AddAssert("first room selected", () => checkRoomSelected(RoomManager.Rooms.First()));
AddAssert("first room selected", () => checkRoomSelected(container.DrawableRooms.First().Room));

press(Key.Up);
AddAssert("first room selected", () => checkRoomSelected(RoomManager.Rooms.First()));
AddAssert("first room selected", () => checkRoomSelected(container.DrawableRooms.First().Room));

press(Key.Down);
press(Key.Down);
AddAssert("last room selected", () => checkRoomSelected(RoomManager.Rooms.Last()));
AddAssert("last room selected", () => checkRoomSelected(container.DrawableRooms.Last().Room));
}

[Test]
public void TestKeyboardNavigationAfterOrderChange()
{
AddStep("add rooms", () => RoomManager.AddRooms(3));
AddStep("add rooms", () => rooms.AddRange(GenerateRooms(3)));

AddStep("reorder rooms", () =>
{
var room = RoomManager.Rooms[1];
var room = rooms[1];
rooms.Remove(room);

RoomManager.RemoveRoom(room);
RoomManager.AddOrUpdateRoom(room);
room.RoomID += 3;
rooms.Add(room);
});

AddAssert("no selection", () => checkRoomSelected(null));
Expand All @@ -116,12 +118,12 @@ public void TestKeyboardNavigationAfterOrderChange()
[Test]
public void TestClickDeselection()
{
AddStep("add room", () => RoomManager.AddRooms(1));
AddStep("add room", () => rooms.AddRange(GenerateRooms(1)));

AddAssert("no selection", () => checkRoomSelected(null));

press(Key.Down);
AddAssert("first room selected", () => checkRoomSelected(RoomManager.Rooms.First()));
AddAssert("first room selected", () => checkRoomSelected(container.DrawableRooms.First().Room));

AddStep("click away", () => InputManager.Click(MouseButton.Left));
AddAssert("no selection", () => checkRoomSelected(null));
Expand All @@ -135,62 +137,62 @@ private void press(Key down)
[Test]
public void TestStringFiltering()
{
AddStep("add rooms", () => RoomManager.AddRooms(4));
AddStep("add rooms", () => rooms.AddRange(GenerateRooms(4)));

AddUntilStep("4 rooms visible", () => container.Rooms.Count(r => r.IsPresent) == 4);
AddUntilStep("4 rooms visible", () => container.DrawableRooms.Count(r => r.IsPresent) == 4);

AddStep("filter one room", () => container.Filter.Value = new FilterCriteria { SearchString = "1" });
AddStep("filter one room", () => container.Filter.Value = new FilterCriteria { SearchString = rooms.First().Name });

AddUntilStep("1 rooms visible", () => container.Rooms.Count(r => r.IsPresent) == 1);
AddUntilStep("1 rooms visible", () => container.DrawableRooms.Count(r => r.IsPresent) == 1);

AddStep("remove filter", () => container.Filter.Value = null);

AddUntilStep("4 rooms visible", () => container.Rooms.Count(r => r.IsPresent) == 4);
AddUntilStep("4 rooms visible", () => container.DrawableRooms.Count(r => r.IsPresent) == 4);
}

[Test]
public void TestRulesetFiltering()
{
AddStep("add rooms", () => RoomManager.AddRooms(2, new OsuRuleset().RulesetInfo));
AddStep("add rooms", () => RoomManager.AddRooms(3, new CatchRuleset().RulesetInfo));
AddStep("add rooms", () => rooms.AddRange(GenerateRooms(2, new OsuRuleset().RulesetInfo)));
AddStep("add rooms", () => rooms.AddRange(GenerateRooms(3, new CatchRuleset().RulesetInfo)));

// Todo: What even is this case...?
AddStep("set empty filter criteria", () => container.Filter.Value = new FilterCriteria());
AddUntilStep("5 rooms visible", () => container.Rooms.Count(r => r.IsPresent) == 5);
AddUntilStep("5 rooms visible", () => container.DrawableRooms.Count(r => r.IsPresent) == 5);

AddStep("filter osu! rooms", () => container.Filter.Value = new FilterCriteria { Ruleset = new OsuRuleset().RulesetInfo });
AddUntilStep("2 rooms visible", () => container.Rooms.Count(r => r.IsPresent) == 2);
AddUntilStep("2 rooms visible", () => container.DrawableRooms.Count(r => r.IsPresent) == 2);

AddStep("filter catch rooms", () => container.Filter.Value = new FilterCriteria { Ruleset = new CatchRuleset().RulesetInfo });
AddUntilStep("3 rooms visible", () => container.Rooms.Count(r => r.IsPresent) == 3);
AddUntilStep("3 rooms visible", () => container.DrawableRooms.Count(r => r.IsPresent) == 3);
}

[Test]
public void TestAccessTypeFiltering()
{
AddStep("add rooms", () =>
{
RoomManager.AddRooms(1, withPassword: true);
RoomManager.AddRooms(1, withPassword: false);
rooms.AddRange(GenerateRooms(1, withPassword: true));
rooms.AddRange(GenerateRooms(1, withPassword: false));
});

AddStep("apply default filter", () => container.Filter.SetDefault());

AddUntilStep("both rooms visible", () => container.Rooms.Count(r => r.IsPresent) == 2);
AddUntilStep("both rooms visible", () => container.DrawableRooms.Count(r => r.IsPresent) == 2);

AddStep("filter public rooms", () => container.Filter.Value = new FilterCriteria { Permissions = RoomPermissionsFilter.Public });

AddUntilStep("private room hidden", () => container.Rooms.All(r => !r.Room.HasPassword));
AddUntilStep("private room hidden", () => container.DrawableRooms.All(r => !r.Room.HasPassword));

AddStep("filter private rooms", () => container.Filter.Value = new FilterCriteria { Permissions = RoomPermissionsFilter.Private });

AddUntilStep("public room hidden", () => container.Rooms.All(r => r.Room.HasPassword));
AddUntilStep("public room hidden", () => container.DrawableRooms.All(r => r.Room.HasPassword));
}

[Test]
public void TestPasswordProtectedRooms()
{
AddStep("add rooms", () => RoomManager.AddRooms(3, withPassword: true));
AddStep("add rooms", () => rooms.AddRange(GenerateRooms(3, withPassword: true)));
}

private bool checkRoomSelected(Room? room) => SelectedRoom.Value == room;
Expand Down
3 changes: 1 addition & 2 deletions osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
using osu.Game.Rulesets.Taiko;
using osu.Game.Scoring;
using osu.Game.Screens.OnlinePlay;
using osu.Game.Screens.OnlinePlay.Components;
using osu.Game.Screens.OnlinePlay.Lounge;
using osu.Game.Screens.OnlinePlay.Lounge.Components;
using osu.Game.Screens.OnlinePlay.Match;
Expand Down Expand Up @@ -806,7 +805,7 @@ public void TestRoomSettingsReQueriedWhenJoiningRoom()
AddUntilStep("wait for room", () => this.ChildrenOfType<DrawableRoom>().Any());
AddStep("select room", () => InputManager.Key(Key.Down));

AddStep("disable polling", () => this.ChildrenOfType<ListingPollingComponent>().Single().TimeBetweenPolls.Value = 0);
AddStep("disable polling", () => this.ChildrenOfType<LoungeListingPoller>().Single().TimeBetweenPolls.Value = 0);
AddStep("change server-side settings", () =>
{
multiplayerClient.ServerSideRooms[0].Name = "New name";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
using osu.Framework.Screens;
using osu.Framework.Testing;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Rooms;
using osu.Game.Screens.OnlinePlay.Lounge;
using osu.Game.Screens.OnlinePlay.Lounge.Components;
using osu.Game.Screens.OnlinePlay.Multiplayer;
using osu.Game.Tests.Visual.OnlinePlay;
using osuTK.Input;
Expand All @@ -18,11 +18,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
public partial class TestSceneMultiplayerLoungeSubScreen : MultiplayerTestScene
{
protected new TestRoomManager RoomManager => (TestRoomManager)base.RoomManager;

private LoungeSubScreen loungeScreen = null!;

private RoomsContainer roomsContainer => loungeScreen.ChildrenOfType<RoomsContainer>().First();
private MultiplayerLoungeSubScreen loungeScreen = null!;

public TestSceneMultiplayerLoungeSubScreen()
: base(false)
Expand All @@ -40,7 +36,7 @@ public override void SetUpSteps()
[Test]
public void TestJoinRoomWithoutPassword()
{
AddStep("add room", () => RoomManager.AddRooms(1, withPassword: false));
createRooms(GenerateRooms(1, withPassword: false));
AddStep("select room", () => InputManager.Key(Key.Down));
AddStep("join room", () => InputManager.Key(Key.Enter));

Expand All @@ -50,7 +46,7 @@ public void TestJoinRoomWithoutPassword()
[Test]
public void TestPopoverHidesOnBackButton()
{
AddStep("add room", () => RoomManager.AddRooms(1, withPassword: true));
createRooms(GenerateRooms(1, withPassword: true));
AddStep("select room", () => InputManager.Key(Key.Down));
AddStep("attempt join room", () => InputManager.Key(Key.Enter));

Expand All @@ -70,7 +66,7 @@ public void TestPopoverHidesOnBackButton()
[Test]
public void TestPopoverHidesOnLeavingScreen()
{
AddStep("add room", () => RoomManager.AddRooms(1, withPassword: true));
createRooms(GenerateRooms(1, withPassword: true));
AddStep("select room", () => InputManager.Key(Key.Down));
AddStep("attempt join room", () => InputManager.Key(Key.Enter));

Expand All @@ -86,7 +82,7 @@ public void TestJoinRoomWithIncorrectPasswordViaButton()
{
DrawableLoungeRoom.PasswordEntryPopover? passwordEntryPopover = null;

AddStep("add room", () => RoomManager.AddRooms(1, withPassword: true));
createRooms(GenerateRooms(1, withPassword: true));
AddStep("select room", () => InputManager.Key(Key.Down));
AddStep("attempt join room", () => InputManager.Key(Key.Enter));
AddUntilStep("password prompt appeared", () => (passwordEntryPopover = InputManager.ChildrenOfType<DrawableLoungeRoom.PasswordEntryPopover>().FirstOrDefault()) != null);
Expand All @@ -105,7 +101,7 @@ public void TestJoinRoomWithIncorrectPasswordViaEnter()
{
DrawableLoungeRoom.PasswordEntryPopover? passwordEntryPopover = null;

AddStep("add room", () => RoomManager.AddRooms(1, withPassword: true));
createRooms(GenerateRooms(1, withPassword: true));
AddStep("select room", () => InputManager.Key(Key.Down));
AddStep("attempt join room", () => InputManager.Key(Key.Enter));
AddUntilStep("password prompt appeared", () => (passwordEntryPopover = InputManager.ChildrenOfType<DrawableLoungeRoom.PasswordEntryPopover>().FirstOrDefault()) != null);
Expand All @@ -124,7 +120,7 @@ public void TestJoinRoomWithCorrectPassword()
{
DrawableLoungeRoom.PasswordEntryPopover? passwordEntryPopover = null;

AddStep("add room", () => RoomManager.AddRooms(1, withPassword: true));
createRooms(GenerateRooms(1, withPassword: true));
AddStep("select room", () => InputManager.Key(Key.Down));
AddStep("attempt join room", () => InputManager.Key(Key.Enter));
AddUntilStep("password prompt appeared", () => (passwordEntryPopover = InputManager.ChildrenOfType<DrawableLoungeRoom.PasswordEntryPopover>().FirstOrDefault()) != null);
Expand All @@ -139,7 +135,7 @@ public void TestJoinRoomWithPasswordViaKeyboardOnly()
{
DrawableLoungeRoom.PasswordEntryPopover? passwordEntryPopover = null;

AddStep("add room", () => RoomManager.AddRooms(1, withPassword: true));
createRooms(GenerateRooms(1, withPassword: true));
AddStep("select room", () => InputManager.Key(Key.Down));
AddStep("attempt join room", () => InputManager.Key(Key.Enter));
AddUntilStep("password prompt appeared", () => (passwordEntryPopover = InputManager.ChildrenOfType<DrawableLoungeRoom.PasswordEntryPopover>().FirstOrDefault()) != null);
Expand All @@ -149,6 +145,17 @@ public void TestJoinRoomWithPasswordViaKeyboardOnly()
AddAssert("room joined", () => MultiplayerClient.RoomJoined);
}

private void createRooms(params Room[] rooms)
{
AddStep("create rooms", () =>
{
foreach (var room in rooms)
API.Queue(new CreateRoomRequest(room));
});

AddStep("refresh lounge", () => loungeScreen.RefreshRooms());
}

protected override OnlinePlayTestSceneDependencies CreateOnlinePlayDependencies() => new MultiplayerTestSceneDependencies();
}
}
Loading