2020-12-19 01:37:47 +08:00
// 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.
2021-02-16 09:51:21 +08:00
using System.Collections.Generic ;
2020-12-19 01:37:47 +08:00
using System.Linq ;
using NUnit.Framework ;
2021-08-16 14:06:56 +08:00
using osu.Framework.Extensions.ObjectExtensions ;
2020-12-19 01:37:47 +08:00
using osu.Framework.Graphics ;
using osu.Framework.Graphics.Sprites ;
using osu.Framework.Testing ;
2020-12-22 17:25:45 +08:00
using osu.Framework.Utils ;
2022-07-08 06:42:55 +08:00
using osu.Game.Graphics.Cursor ;
2021-02-05 14:52:49 +08:00
using osu.Game.Graphics.UserInterface ;
2021-01-18 16:10:38 +08:00
using osu.Game.Online ;
2025-02-06 13:12:15 +08:00
using osu.Game.Online.API ;
2021-11-04 17:02:44 +08:00
using osu.Game.Online.API.Requests.Responses ;
2020-12-25 12:38:11 +08:00
using osu.Game.Online.Multiplayer ;
2021-01-18 16:10:38 +08:00
using osu.Game.Online.Rooms ;
2025-02-06 13:12:15 +08:00
using osu.Game.Rulesets.Catch.Mods ;
2021-02-01 16:54:56 +08:00
using osu.Game.Rulesets.Mods ;
using osu.Game.Rulesets.Osu.Mods ;
2025-02-06 13:12:15 +08:00
using osu.Game.Rulesets.Taiko.Mods ;
2020-12-25 23:50:00 +08:00
using osu.Game.Screens.OnlinePlay.Multiplayer.Participants ;
2020-12-19 01:37:47 +08:00
using osu.Game.Users ;
using osuTK ;
2020-12-25 12:20:37 +08:00
namespace osu.Game.Tests.Visual.Multiplayer
2020-12-19 01:37:47 +08:00
{
2020-12-25 12:38:11 +08:00
public partial class TestSceneMultiplayerParticipantsList : MultiplayerTestScene
2020-12-19 01:37:47 +08:00
{
2021-06-25 19:56:13 +08:00
[SetUpSteps]
public void SetupSteps ( )
2021-06-25 19:44:00 +08:00
{
2021-06-25 19:56:13 +08:00
createNewParticipantsList ( ) ;
2021-06-25 19:44:00 +08:00
}
2020-12-19 01:37:47 +08:00
[Test]
public void TestAddUser ( )
{
AddAssert ( "one unique panel" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . Select ( p = > p . User ) . Distinct ( ) . Count ( ) = = 1 ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "add user" , ( ) = > MultiplayerClient . AddUser ( new APIUser
2020-12-19 01:37:47 +08:00
{
Id = 3 ,
Username = "Second" ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ) ;
AddAssert ( "two unique panels" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . Select ( p = > p . User ) . Distinct ( ) . Count ( ) = = 2 ) ;
2020-12-28 13:56:53 +08:00
}
[Test]
2021-11-02 15:51:27 +08:00
public void TestAddUnresolvedUser ( )
2020-12-28 13:56:53 +08:00
{
AddAssert ( "one unique panel" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . Select ( p = > p . User ) . Distinct ( ) . Count ( ) = = 1 ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "add non-resolvable user" , ( ) = > MultiplayerClient . TestAddUnresolvedUser ( ) ) ;
2022-07-01 17:58:22 +08:00
AddUntilStep ( "null user added" , ( ) = > MultiplayerClient . ClientRoom . AsNonNull ( ) . Users . Count ( u = > u . User = = null ) = = 1 ) ;
2020-12-28 13:56:53 +08:00
AddUntilStep ( "two unique panels" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . Select ( p = > p . User ) . Distinct ( ) . Count ( ) = = 2 ) ;
2021-08-16 14:37:29 +08:00
AddStep ( "kick null user" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . Single ( p = > p . User . User = = null )
. ChildrenOfType < ParticipantPanel . KickButton > ( ) . Single ( ) . TriggerClick ( ) ) ;
2022-07-01 17:58:22 +08:00
AddUntilStep ( "null user kicked" , ( ) = > MultiplayerClient . ClientRoom . AsNonNull ( ) . Users . Count = = 1 ) ;
2020-12-19 01:37:47 +08:00
}
[Test]
public void TestRemoveUser ( )
{
2022-07-07 16:51:49 +08:00
APIUser ? secondUser = null ;
2020-12-19 01:37:47 +08:00
AddStep ( "add a user" , ( ) = >
{
2022-02-16 08:43:28 +08:00
MultiplayerClient . AddUser ( secondUser = new APIUser
2020-12-19 01:37:47 +08:00
{
Id = 3 ,
Username = "Second" ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ;
} ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "remove host" , ( ) = > MultiplayerClient . RemoveUser ( API . LocalUser . Value ) ) ;
2020-12-19 01:37:47 +08:00
2022-07-07 16:51:49 +08:00
AddAssert ( "single panel is for second user" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . Single ( ) . User . UserID = = secondUser ? . Id ) ;
2020-12-19 01:37:47 +08:00
}
2021-02-05 14:58:27 +08:00
[Test]
public void TestGameStateHasPriorityOverDownloadState ( )
{
2022-02-16 08:43:28 +08:00
AddStep ( "set to downloading map" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . Downloading ( 0 ) ) ) ;
2021-02-05 14:58:27 +08:00
checkProgressBarVisibility ( true ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "make user ready" , ( ) = > MultiplayerClient . ChangeState ( MultiplayerUserState . Results ) ) ;
2021-02-05 14:58:27 +08:00
checkProgressBarVisibility ( false ) ;
AddUntilStep ( "ready mark visible" , ( ) = > this . ChildrenOfType < StateDisplay > ( ) . Single ( ) . IsPresent ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "make user ready" , ( ) = > MultiplayerClient . ChangeState ( MultiplayerUserState . Idle ) ) ;
2021-02-05 14:58:27 +08:00
checkProgressBarVisibility ( true ) ;
}
2021-02-09 14:46:23 +08:00
[Test]
public void TestCorrectInitialState ( )
{
2022-02-16 08:43:28 +08:00
AddStep ( "set to downloading map" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . Downloading ( 0 ) ) ) ;
2021-06-25 19:56:13 +08:00
createNewParticipantsList ( ) ;
2021-02-09 14:46:23 +08:00
checkProgressBarVisibility ( true ) ;
}
2021-01-18 16:10:38 +08:00
[Test]
public void TestBeatmapDownloadingStates ( )
{
2023-06-28 14:39:32 +08:00
AddStep ( "set to unknown" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . Unknown ( ) ) ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "set to no map" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . NotDownloaded ( ) ) ) ;
AddStep ( "set to downloading map" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . Downloading ( 0 ) ) ) ;
2021-02-05 14:52:49 +08:00
2021-02-05 14:58:27 +08:00
checkProgressBarVisibility ( true ) ;
2021-02-05 14:52:49 +08:00
2021-01-18 16:10:38 +08:00
AddRepeatStep ( "increment progress" , ( ) = >
{
2021-10-27 12:04:41 +08:00
float progress = this . ChildrenOfType < ParticipantPanel > ( ) . Single ( ) . User . BeatmapAvailability . DownloadProgress ? ? 0 ;
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . Downloading ( progress + RNG . NextSingle ( 0.1f ) ) ) ;
2021-01-18 16:10:38 +08:00
} , 25 ) ;
2021-02-05 14:52:49 +08:00
AddAssert ( "progress bar increased" , ( ) = > this . ChildrenOfType < ProgressBar > ( ) . Single ( ) . Current . Value > 0 ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "set to importing map" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . Importing ( ) ) ) ;
2021-02-05 14:58:27 +08:00
checkProgressBarVisibility ( false ) ;
2021-02-05 14:52:49 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "set to available" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . LocallyAvailable ( ) ) ) ;
2021-01-18 16:10:38 +08:00
}
2020-12-19 01:37:47 +08:00
[Test]
public void TestToggleReadyState ( )
{
2020-12-22 17:25:45 +08:00
AddAssert ( "ready mark invisible" , ( ) = > ! this . ChildrenOfType < StateDisplay > ( ) . Single ( ) . IsPresent ) ;
2020-12-19 01:37:47 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "make user ready" , ( ) = > MultiplayerClient . ChangeState ( MultiplayerUserState . Ready ) ) ;
2020-12-22 17:25:45 +08:00
AddUntilStep ( "ready mark visible" , ( ) = > this . ChildrenOfType < StateDisplay > ( ) . Single ( ) . IsPresent ) ;
2020-12-19 01:37:47 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "make user idle" , ( ) = > MultiplayerClient . ChangeState ( MultiplayerUserState . Idle ) ) ;
2020-12-22 17:25:45 +08:00
AddUntilStep ( "ready mark invisible" , ( ) = > ! this . ChildrenOfType < StateDisplay > ( ) . Single ( ) . IsPresent ) ;
2020-12-19 01:37:47 +08:00
}
2021-04-07 15:40:24 +08:00
[Test]
public void TestToggleSpectateState ( )
{
2022-02-16 08:43:28 +08:00
AddStep ( "make user spectating" , ( ) = > MultiplayerClient . ChangeState ( MultiplayerUserState . Spectating ) ) ;
AddStep ( "make user idle" , ( ) = > MultiplayerClient . ChangeState ( MultiplayerUserState . Idle ) ) ;
2021-04-07 15:40:24 +08:00
}
2020-12-19 01:37:47 +08:00
[Test]
public void TestCrownChangesStateWhenHostTransferred ( )
{
2022-02-16 08:43:28 +08:00
AddStep ( "add user" , ( ) = > MultiplayerClient . AddUser ( new APIUser
2020-12-19 01:37:47 +08:00
{
Id = 3 ,
Username = "Second" ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ) ;
AddUntilStep ( "first user crown visible" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . ElementAt ( 0 ) . ChildrenOfType < SpriteIcon > ( ) . First ( ) . Alpha = = 1 ) ;
AddUntilStep ( "second user crown hidden" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . ElementAt ( 1 ) . ChildrenOfType < SpriteIcon > ( ) . First ( ) . Alpha = = 0 ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "make second user host" , ( ) = > MultiplayerClient . TransferHost ( 3 ) ) ;
2020-12-19 01:37:47 +08:00
AddUntilStep ( "first user crown hidden" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . ElementAt ( 0 ) . ChildrenOfType < SpriteIcon > ( ) . First ( ) . Alpha = = 0 ) ;
AddUntilStep ( "second user crown visible" , ( ) = > this . ChildrenOfType < ParticipantPanel > ( ) . ElementAt ( 1 ) . ChildrenOfType < SpriteIcon > ( ) . First ( ) . Alpha = = 1 ) ;
}
2020-12-19 01:46:16 +08:00
2022-03-18 12:26:10 +08:00
[Test]
public void TestHostGetsPinnedToTop ( )
{
AddStep ( "add user" , ( ) = > MultiplayerClient . AddUser ( new APIUser
{
Id = 3 ,
Username = "Second" ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ) ;
AddStep ( "make second user host" , ( ) = > MultiplayerClient . TransferHost ( 3 ) ) ;
AddAssert ( "second user above first" , ( ) = >
{
var first = this . ChildrenOfType < ParticipantPanel > ( ) . ElementAt ( 0 ) ;
var second = this . ChildrenOfType < ParticipantPanel > ( ) . ElementAt ( 1 ) ;
return second . Y < first . Y ;
} ) ;
}
2021-08-11 16:31:37 +08:00
[Test]
public void TestKickButtonOnlyPresentWhenHost ( )
{
2022-02-16 08:43:28 +08:00
AddStep ( "add user" , ( ) = > MultiplayerClient . AddUser ( new APIUser
2021-08-11 16:31:37 +08:00
{
Id = 3 ,
Username = "Second" ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ) ;
2021-08-11 16:39:23 +08:00
AddUntilStep ( "kick buttons visible" , ( ) = > this . ChildrenOfType < ParticipantPanel . KickButton > ( ) . Count ( d = > d . IsPresent ) = = 1 ) ;
2021-08-11 16:31:37 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "make second user host" , ( ) = > MultiplayerClient . TransferHost ( 3 ) ) ;
2021-08-11 16:31:37 +08:00
2024-11-28 20:37:53 +08:00
AddUntilStep ( "kick buttons not visible" , ( ) = > ! this . ChildrenOfType < ParticipantPanel . KickButton > ( ) . Any ( d = > d . IsPresent ) ) ;
2021-08-11 16:31:37 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "make local user host again" , ( ) = > MultiplayerClient . TransferHost ( API . LocalUser . Value . Id ) ) ;
2021-08-11 16:31:37 +08:00
2021-08-11 16:39:23 +08:00
AddUntilStep ( "kick buttons visible" , ( ) = > this . ChildrenOfType < ParticipantPanel . KickButton > ( ) . Count ( d = > d . IsPresent ) = = 1 ) ;
2021-08-11 16:31:37 +08:00
}
[Test]
public void TestKickButtonKicks ( )
{
2022-02-16 08:43:28 +08:00
AddStep ( "add user" , ( ) = > MultiplayerClient . AddUser ( new APIUser
2021-08-11 16:31:37 +08:00
{
Id = 3 ,
Username = "Second" ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ) ;
2021-08-11 16:39:23 +08:00
AddStep ( "kick second user" , ( ) = > this . ChildrenOfType < ParticipantPanel . KickButton > ( ) . Single ( d = > d . IsPresent ) . TriggerClick ( ) ) ;
2021-08-11 16:31:37 +08:00
2022-07-01 17:58:22 +08:00
AddUntilStep ( "second user kicked" , ( ) = > MultiplayerClient . ClientRoom ? . Users . Single ( ) . UserID = = API . LocalUser . Value . Id ) ;
2021-08-11 16:31:37 +08:00
}
2020-12-19 01:46:16 +08:00
[Test]
public void TestManyUsers ( )
{
2022-03-18 12:18:49 +08:00
const int users_count = 20 ;
2020-12-19 01:46:16 +08:00
AddStep ( "add many users" , ( ) = >
{
2022-03-18 12:18:49 +08:00
for ( int i = 0 ; i < users_count ; i + + )
2020-12-19 01:46:16 +08:00
{
2022-02-16 08:43:28 +08:00
MultiplayerClient . AddUser ( new APIUser
2020-12-19 01:46:16 +08:00
{
Id = i ,
Username = $"User {i}" ,
2021-02-16 09:51:21 +08:00
RulesetsStatistics = new Dictionary < string , UserStatistics >
2021-02-09 13:28:09 +08:00
{
2021-02-16 12:28:51 +08:00
{
Ruleset . Value . ShortName ,
2021-02-17 13:50:48 +08:00
new UserStatistics { GlobalRank = RNG . Next ( 1 , 100000 ) , }
2021-02-16 12:28:51 +08:00
}
2021-02-09 13:28:09 +08:00
} ,
2020-12-19 01:46:16 +08:00
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ;
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeUserState ( i , ( MultiplayerUserState ) RNG . Next ( 0 , ( int ) MultiplayerUserState . Results + 1 ) ) ;
2021-01-18 16:10:38 +08:00
if ( RNG . NextBool ( ) )
{
var beatmapState = ( DownloadState ) RNG . Next ( 0 , ( int ) DownloadState . LocallyAvailable + 1 ) ;
switch ( beatmapState )
{
case DownloadState . NotDownloaded :
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeUserBeatmapAvailability ( i , BeatmapAvailability . NotDownloaded ( ) ) ;
2021-01-18 16:10:38 +08:00
break ;
case DownloadState . Downloading :
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeUserBeatmapAvailability ( i , BeatmapAvailability . Downloading ( RNG . NextSingle ( ) ) ) ;
2021-01-18 16:10:38 +08:00
break ;
case DownloadState . Importing :
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeUserBeatmapAvailability ( i , BeatmapAvailability . Importing ( ) ) ;
2021-01-18 16:10:38 +08:00
break ;
}
}
2020-12-19 01:46:16 +08:00
}
} ) ;
2022-03-18 12:18:49 +08:00
AddRepeatStep ( "switch hosts" , ( ) = > MultiplayerClient . TransferHost ( RNG . Next ( 0 , users_count ) ) , 10 ) ;
2022-03-18 13:08:31 +08:00
AddStep ( "give host back" , ( ) = > MultiplayerClient . TransferHost ( API . LocalUser . Value . Id ) ) ;
2020-12-19 01:46:16 +08:00
}
2021-02-01 16:54:56 +08:00
[Test]
public void TestUserWithMods ( )
{
AddStep ( "add user" , ( ) = >
{
2022-02-16 08:43:28 +08:00
MultiplayerClient . AddUser ( new APIUser
2021-02-01 16:54:56 +08:00
{
Id = 0 ,
2021-02-03 13:53:13 +08:00
Username = "User 0" ,
2021-02-16 09:51:21 +08:00
RulesetsStatistics = new Dictionary < string , UserStatistics >
2021-02-09 13:28:09 +08:00
{
2021-02-16 12:28:51 +08:00
{
Ruleset . Value . ShortName ,
2021-02-17 13:50:48 +08:00
new UserStatistics { GlobalRank = RNG . Next ( 1 , 100000 ) , }
2021-02-16 12:28:51 +08:00
}
2021-02-09 13:28:09 +08:00
} ,
2021-02-01 16:54:56 +08:00
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ;
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeUserMods ( 0 , new Mod [ ]
2021-02-01 16:54:56 +08:00
{
new OsuModHardRock ( ) ,
new OsuModDifficultyAdjust { ApproachRate = { Value = 1 } }
} ) ;
} ) ;
2021-02-01 17:25:09 +08:00
for ( var i = MultiplayerUserState . Idle ; i < MultiplayerUserState . Results ; i + + )
{
var state = i ;
2022-02-16 08:43:28 +08:00
AddStep ( $"set state: {state}" , ( ) = > MultiplayerClient . ChangeUserState ( 0 , state ) ) ;
2021-02-01 17:25:09 +08:00
}
2021-10-18 01:58:38 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "set state: downloading" , ( ) = > MultiplayerClient . ChangeUserBeatmapAvailability ( 0 , BeatmapAvailability . Downloading ( 0 ) ) ) ;
2021-10-18 01:58:38 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "set state: locally available" , ( ) = > MultiplayerClient . ChangeUserBeatmapAvailability ( 0 , BeatmapAvailability . LocallyAvailable ( ) ) ) ;
2021-10-18 01:58:38 +08:00
}
2024-12-25 22:30:24 +08:00
[Test]
public void TestUserWithStyle ( )
{
AddStep ( "add users" , ( ) = >
{
MultiplayerClient . AddUser ( new APIUser
{
Id = 0 ,
Username = "User 0" ,
RulesetsStatistics = new Dictionary < string , UserStatistics >
{
{
Ruleset . Value . ShortName ,
new UserStatistics { GlobalRank = RNG . Next ( 1 , 100000 ) , }
}
} ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ;
MultiplayerClient . ChangeUserStyle ( 0 , 259 , 2 ) ;
} ) ;
AddStep ( "set beatmap locally available" , ( ) = > MultiplayerClient . ChangeUserBeatmapAvailability ( 0 , BeatmapAvailability . LocallyAvailable ( ) ) ) ;
AddStep ( "change user style to beatmap: 258, ruleset: 1" , ( ) = > MultiplayerClient . ChangeUserStyle ( 0 , 258 , 1 ) ) ;
AddStep ( "change user style to beatmap: null, ruleset: null" , ( ) = > MultiplayerClient . ChangeUserStyle ( 0 , null , null ) ) ;
}
2021-10-18 01:58:38 +08:00
[Test]
public void TestModOverlap ( )
{
AddStep ( "add dummy mods" , ( ) = >
{
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeUserMods ( new Mod [ ]
2021-10-18 01:58:38 +08:00
{
new OsuModNoFail ( ) ,
new OsuModDoubleTime ( )
} ) ;
} ) ;
AddStep ( "add user with mods" , ( ) = >
{
2022-02-16 08:43:28 +08:00
MultiplayerClient . AddUser ( new APIUser
2021-10-18 01:58:38 +08:00
{
Id = 0 ,
Username = "Baka" ,
RulesetsStatistics = new Dictionary < string , UserStatistics >
{
{
Ruleset . Value . ShortName ,
new UserStatistics { GlobalRank = RNG . Next ( 1 , 100000 ) , }
}
} ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ;
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeUserMods ( 0 , new Mod [ ]
2021-10-18 01:58:38 +08:00
{
new OsuModHardRock ( ) ,
new OsuModDoubleTime ( )
} ) ;
} ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "set 0 ready" , ( ) = > MultiplayerClient . ChangeState ( MultiplayerUserState . Ready ) ) ;
2021-10-18 01:58:38 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "set 1 spectate" , ( ) = > MultiplayerClient . ChangeUserState ( 0 , MultiplayerUserState . Spectating ) ) ;
2021-10-18 01:58:38 +08:00
// Have to set back to idle due to status priority.
AddStep ( "set 0 no map, 1 ready" , ( ) = >
{
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeState ( MultiplayerUserState . Idle ) ;
MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . NotDownloaded ( ) ) ;
MultiplayerClient . ChangeUserState ( 0 , MultiplayerUserState . Ready ) ;
2021-10-18 01:58:38 +08:00
} ) ;
2022-02-16 08:43:28 +08:00
AddStep ( "set 0 downloading" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . Downloading ( 0 ) ) ) ;
2021-10-18 01:58:38 +08:00
2022-02-16 08:43:28 +08:00
AddStep ( "set 0 spectate" , ( ) = > MultiplayerClient . ChangeUserState ( 0 , MultiplayerUserState . Spectating ) ) ;
2021-10-18 01:58:38 +08:00
AddStep ( "make both default" , ( ) = >
{
2022-02-16 08:43:28 +08:00
MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . LocallyAvailable ( ) ) ;
MultiplayerClient . ChangeUserState ( 0 , MultiplayerUserState . Idle ) ;
MultiplayerClient . ChangeState ( MultiplayerUserState . Idle ) ;
2021-10-18 01:58:38 +08:00
} ) ;
2021-02-01 16:54:56 +08:00
}
2021-02-05 14:58:27 +08:00
2025-02-06 13:12:15 +08:00
[Test]
public void TestModsAndRuleset ( )
{
AddStep ( "add another user" , ( ) = >
{
MultiplayerClient . AddUser ( new APIUser
{
Id = 0 ,
Username = "User 0" ,
RulesetsStatistics = new Dictionary < string , UserStatistics >
{
{
Ruleset . Value . ShortName ,
new UserStatistics { GlobalRank = RNG . Next ( 1 , 100000 ) , }
}
} ,
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg" ,
} ) ;
MultiplayerClient . ChangeUserBeatmapAvailability ( 0 , BeatmapAvailability . LocallyAvailable ( ) ) ;
} ) ;
AddStep ( "set user styles" , ( ) = >
{
MultiplayerClient . ChangeUserStyle ( API . LocalUser . Value . OnlineID , 259 , 1 ) ;
MultiplayerClient . ChangeUserMods ( API . LocalUser . Value . OnlineID ,
[new APIMod(new TaikoModConstantSpeed()), new APIMod(new TaikoModHidden()), new APIMod(new TaikoModFlashlight()), new APIMod(new TaikoModHardRock())] ) ;
MultiplayerClient . ChangeUserStyle ( 0 , 259 , 2 ) ;
MultiplayerClient . ChangeUserMods ( 0 ,
[new APIMod(new CatchModFloatingFruits()), new APIMod(new CatchModHidden()), new APIMod(new CatchModMirror())] ) ;
} ) ;
}
2021-02-09 14:46:23 +08:00
private void createNewParticipantsList ( )
{
2022-07-07 16:51:49 +08:00
ParticipantsList ? participantsList = null ;
2021-06-25 19:56:13 +08:00
2022-07-08 06:42:55 +08:00
AddStep ( "create new list" , ( ) = > Child = new OsuContextMenuContainer
2021-06-25 19:56:13 +08:00
{
2022-07-08 06:42:55 +08:00
RelativeSizeAxes = Axes . Both ,
Child = participantsList = new ParticipantsList
{
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
RelativeSizeAxes = Axes . Y ,
Size = new Vector2 ( 380 , 0.7f )
}
2021-06-25 19:56:13 +08:00
} ) ;
2022-07-07 16:51:49 +08:00
AddUntilStep ( "wait for list to load" , ( ) = > participantsList ? . IsLoaded = = true ) ;
2023-06-29 12:17:42 +08:00
AddStep ( "set beatmap available" , ( ) = > MultiplayerClient . ChangeBeatmapAvailability ( BeatmapAvailability . LocallyAvailable ( ) ) ) ;
2021-02-09 14:46:23 +08:00
}
2021-02-05 14:58:27 +08:00
private void checkProgressBarVisibility ( bool visible ) = >
AddUntilStep ( $"progress bar {(visible ? " is " : " is not ")}visible" , ( ) = >
this . ChildrenOfType < ProgressBar > ( ) . Single ( ) . IsPresent = = visible ) ;
2020-12-19 01:37:47 +08:00
}
}