2020-02-14 15:01:45 +09: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.
2022-06-17 16:37:17 +09:00
#nullable disable
2021-12-09 01:16:37 +09:00
using System ;
2020-02-14 15:36:47 +09:00
using System.Collections.Generic ;
2021-11-01 15:42:12 +09:00
using System.Diagnostics ;
2020-02-14 15:01:45 +09:00
using System.Linq ;
using NUnit.Framework ;
2020-06-02 14:31:43 +09:00
using osu.Framework.Allocation ;
using osu.Framework.Audio ;
2020-02-14 15:01:45 +09:00
using osu.Framework.Graphics ;
2020-02-14 16:48:30 +09:00
using osu.Framework.Graphics.Containers ;
2024-07-19 17:49:13 +09:00
using osu.Framework.Graphics.Sprites ;
2020-06-02 14:31:43 +09:00
using osu.Framework.Platform ;
2020-02-14 16:48:30 +09:00
using osu.Framework.Testing ;
2020-06-02 14:31:43 +09:00
using osu.Game.Beatmaps ;
2021-02-02 17:21:46 +09:00
using osu.Game.Beatmaps.Drawables ;
2024-05-27 12:01:02 +02:00
using osu.Game.Beatmaps.Drawables.Cards ;
2021-11-25 23:15:28 +09:00
using osu.Game.Database ;
2020-02-14 16:48:30 +09:00
using osu.Game.Graphics.Containers ;
2022-07-14 02:45:38 +03:00
using osu.Game.Graphics.Cursor ;
2024-01-15 14:58:46 +01:00
using osu.Game.Graphics.UserInterface ;
2021-11-22 15:52:55 +09:00
using osu.Game.Models ;
2022-02-15 16:01:14 +09:00
using osu.Game.Online.API ;
2024-01-15 14:58:46 +01:00
using osu.Game.Online.Chat ;
2020-12-25 13:38:11 +09:00
using osu.Game.Online.Rooms ;
2020-06-02 14:31:43 +09:00
using osu.Game.Rulesets ;
2020-02-14 17:57:25 +09:00
using osu.Game.Rulesets.Osu ;
2020-02-14 15:01:45 +09:00
using osu.Game.Rulesets.Osu.Mods ;
2020-12-25 16:50:00 +01:00
using osu.Game.Screens.OnlinePlay ;
2020-02-14 17:57:25 +09:00
using osu.Game.Tests.Beatmaps ;
2021-11-26 17:40:45 +09:00
using osu.Game.Users.Drawables ;
2020-02-14 15:01:45 +09:00
using osuTK ;
2020-02-14 16:48:30 +09:00
using osuTK.Input ;
2020-02-14 15:01:45 +09:00
namespace osu.Game.Tests.Visual.Multiplayer
{
2022-02-15 21:08:27 +09:00
public partial class TestSceneDrawableRoomPlaylist : MultiplayerTestScene
2020-02-14 15:01:45 +09:00
{
2020-02-20 08:37:23 +09:00
private TestPlaylist playlist ;
2020-02-14 15:01:45 +09:00
2020-06-02 14:31:43 +09:00
private BeatmapManager manager ;
[BackgroundDependencyLoader]
private void load ( GameHost host , AudioManager audio )
{
2022-07-28 16:19:05 +09:00
Dependencies . Cache ( new RealmRulesetStore ( Realm ) ) ;
Dependencies . Cache ( manager = new BeatmapManager ( LocalStorage , Realm , null , audio , Resources , host , Beatmap . Default ) ) ;
2022-01-25 12:58:15 +09:00
Dependencies . Cache ( Realm ) ;
2020-06-02 14:31:43 +09:00
}
2020-02-14 15:01:45 +09:00
[Test]
2020-02-14 15:36:47 +09:00
public void TestNonEditableNonSelectable ( )
2020-02-14 15:01:45 +09:00
{
2021-12-09 01:16:37 +09:00
createPlaylist ( ) ;
2020-02-14 16:48:30 +09:00
moveToItem ( 0 ) ;
assertHandleVisibility ( 0 , false ) ;
assertDeleteButtonVisibility ( 0 , false ) ;
2020-02-14 16:55:05 +09:00
AddStep ( "click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "no item selected" , ( ) = > playlist . SelectedItem . Value = = null ) ;
2022-05-05 05:42:49 +03:00
AddStep ( "press down" , ( ) = > InputManager . Key ( Key . Down ) ) ;
AddAssert ( "no item selected" , ( ) = > playlist . SelectedItem . Value = = null ) ;
2020-02-14 15:01:45 +09:00
}
[Test]
2020-02-14 15:36:47 +09:00
public void TestEditable ( )
2020-02-14 15:01:45 +09:00
{
2021-12-09 17:48:09 +09:00
createPlaylist ( p = >
{
p . AllowReordering = true ;
p . AllowDeletion = true ;
} ) ;
2020-02-14 16:48:30 +09:00
moveToItem ( 0 ) ;
assertHandleVisibility ( 0 , true ) ;
assertDeleteButtonVisibility ( 0 , true ) ;
2020-02-14 16:55:05 +09:00
AddStep ( "click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "no item selected" , ( ) = > playlist . SelectedItem . Value = = null ) ;
2022-05-05 05:42:49 +03:00
AddStep ( "press down" , ( ) = > InputManager . Key ( Key . Down ) ) ;
AddAssert ( "no item selected" , ( ) = > playlist . SelectedItem . Value = = null ) ;
2020-02-14 15:01:45 +09:00
}
2021-11-16 17:08:21 +09:00
[Test]
public void TestMarkInvalid ( )
{
2021-12-09 17:48:09 +09:00
createPlaylist ( p = >
{
p . AllowReordering = true ;
p . AllowDeletion = true ;
p . AllowSelection = true ;
} ) ;
2021-11-16 17:08:21 +09:00
AddStep ( "mark item 0 as invalid" , ( ) = > playlist . Items [ 0 ] . MarkInvalid ( ) ) ;
moveToItem ( 0 ) ;
2020-02-14 16:55:05 +09:00
AddStep ( "click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "no item selected" , ( ) = > playlist . SelectedItem . Value = = null ) ;
2022-05-05 05:42:49 +03:00
AddStep ( "press down" , ( ) = > InputManager . Key ( Key . Down ) ) ;
AddAssert ( "no item selected" , ( ) = > playlist . SelectedItem . Value = = null ) ;
2020-02-14 15:01:45 +09:00
}
[Test]
2020-02-14 15:36:47 +09:00
public void TestSelectable ( )
2020-02-14 15:01:45 +09:00
{
2021-12-09 01:16:37 +09:00
createPlaylist ( p = > p . AllowSelection = true ) ;
2020-02-14 16:48:30 +09:00
moveToItem ( 0 ) ;
assertHandleVisibility ( 0 , false ) ;
assertDeleteButtonVisibility ( 0 , false ) ;
AddStep ( "click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "item 0 is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items [ 0 ] ) ;
2020-02-14 15:01:45 +09:00
}
[Test]
2020-02-14 15:36:47 +09:00
public void TestEditableSelectable ( )
2020-02-14 15:01:45 +09:00
{
2021-12-09 17:48:09 +09:00
createPlaylist ( p = >
{
p . AllowReordering = true ;
p . AllowDeletion = true ;
p . AllowSelection = true ;
} ) ;
2020-02-14 16:48:30 +09:00
moveToItem ( 0 ) ;
assertHandleVisibility ( 0 , true ) ;
assertDeleteButtonVisibility ( 0 , true ) ;
AddStep ( "click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddAssert ( "item 0 is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items [ 0 ] ) ;
}
[Test]
public void TestSelectionNotLostAfterRearrangement ( )
{
2021-12-09 17:48:09 +09:00
createPlaylist ( p = >
{
p . AllowReordering = true ;
p . AllowDeletion = true ;
p . AllowSelection = true ;
} ) ;
2020-02-14 16:48:30 +09:00
moveToItem ( 0 ) ;
AddStep ( "click" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
moveToDragger ( 0 ) ;
AddStep ( "begin drag" , ( ) = > InputManager . PressButton ( MouseButton . Left ) ) ;
moveToDragger ( 1 , new Vector2 ( 0 , 5 ) ) ;
AddStep ( "end drag" , ( ) = > InputManager . ReleaseButton ( MouseButton . Left ) ) ;
AddAssert ( "item 1 is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items [ 1 ] ) ;
}
2022-05-04 13:12:21 +02:00
[Test]
2022-05-05 06:12:24 +03:00
public void TestKeyboardSelection ( )
2022-05-04 13:12:21 +02:00
{
createPlaylist ( p = > p . AllowSelection = true ) ;
AddStep ( "press down" , ( ) = > InputManager . Key ( Key . Down ) ) ;
AddAssert ( "item 0 is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items [ 0 ] ) ;
AddStep ( "press down" , ( ) = > InputManager . Key ( Key . Down ) ) ;
AddAssert ( "item 1 is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items [ 1 ] ) ;
AddStep ( "press up" , ( ) = > InputManager . Key ( Key . Up ) ) ;
AddAssert ( "item 0 is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items [ 0 ] ) ;
AddUntilStep ( "navigate to last item via keyboard" , ( ) = >
{
InputManager . Key ( Key . Down ) ;
return playlist . SelectedItem . Value = = playlist . Items . Last ( ) ;
} ) ;
AddAssert ( "last item is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items . Last ( ) ) ;
AddUntilStep ( "last item is scrolled into view" , ( ) = >
{
var drawableItem = playlist . ItemMap [ playlist . Items . Last ( ) ] ;
return playlist . ScreenSpaceDrawQuad . Contains ( drawableItem . ScreenSpaceDrawQuad . TopLeft )
& & playlist . ScreenSpaceDrawQuad . Contains ( drawableItem . ScreenSpaceDrawQuad . BottomRight ) ;
} ) ;
AddStep ( "press down" , ( ) = > InputManager . Key ( Key . Down ) ) ;
AddAssert ( "last item is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items . Last ( ) ) ;
AddStep ( "press up" , ( ) = > InputManager . Key ( Key . Up ) ) ;
AddAssert ( "second last item is selected" , ( ) = > playlist . SelectedItem . Value = = playlist . Items . Reverse ( ) . ElementAt ( 1 ) ) ;
}
2020-06-02 14:31:43 +09:00
[Test]
2021-01-17 19:17:14 +03:00
public void TestDownloadButtonHiddenWhenBeatmapExists ( )
2020-06-02 14:31:43 +09:00
{
2022-01-26 13:37:33 +09:00
Live < BeatmapSetInfo > imported = null ;
2021-10-28 17:10:04 +09:00
2022-07-14 03:12:48 +03:00
AddStep ( "import beatmap" , ( ) = >
{
var beatmap = new TestBeatmap ( new OsuRuleset ( ) . RulesetInfo ) . BeatmapInfo ;
2021-12-17 18:26:12 +09:00
2022-07-14 03:12:48 +03:00
Debug . Assert ( beatmap . BeatmapSet ! = null ) ;
imported = manager . Import ( beatmap . BeatmapSet ) ;
} ) ;
2021-10-28 17:10:04 +09:00
2022-01-11 15:55:13 +09:00
createPlaylistWithBeatmaps ( ( ) = > imported . PerformRead ( s = > s . Beatmaps . Detach ( ) ) ) ;
2020-06-02 14:31:43 +09:00
2021-01-17 18:08:58 +01:00
assertDownloadButtonVisible ( false ) ;
2021-01-17 19:17:14 +03:00
2022-01-11 15:55:13 +09:00
AddStep ( "delete beatmap set" , ( ) = > imported . PerformWrite ( s = > s . DeletePending = true ) ) ;
2021-01-17 18:08:58 +01:00
assertDownloadButtonVisible ( true ) ;
2021-01-17 19:17:14 +03:00
2022-01-11 15:55:13 +09:00
AddStep ( "undelete beatmap set" , ( ) = > imported . PerformWrite ( s = > s . DeletePending = false ) ) ;
2021-01-17 18:08:58 +01:00
assertDownloadButtonVisible ( false ) ;
void assertDownloadButtonVisible ( bool visible ) = > AddUntilStep ( $"download button {(visible ? " shown " : " hidden ")}" ,
2022-02-15 23:51:44 +09:00
( ) = > playlist . ChildrenOfType < BeatmapDownloadButton > ( ) . SingleOrDefault ( ) ? . Alpha = = ( visible ? 1 : 0 ) ) ;
2020-06-02 14:31:43 +09:00
}
[Test]
public void TestDownloadButtonVisibleInitiallyWhenBeatmapDoesNotExist ( )
{
2021-11-01 15:42:12 +09:00
var byOnlineId = CreateAPIBeatmap ( ) ;
2021-11-01 16:43:39 +09:00
byOnlineId . OnlineID = 1337 ; // Some random ID that does not exist locally.
2020-06-02 14:31:43 +09:00
2021-11-01 15:42:12 +09:00
var byChecksum = CreateAPIBeatmap ( ) ;
byChecksum . Checksum = "1337" ; // Some random checksum that does not exist locally.
2020-06-02 14:31:43 +09:00
2022-01-11 15:55:13 +09:00
createPlaylistWithBeatmaps ( ( ) = > new [ ] { byOnlineId , byChecksum } ) ;
2020-06-02 14:31:43 +09:00
2021-11-27 15:08:03 +01:00
AddAssert ( "download buttons shown" , ( ) = > playlist . ChildrenOfType < BeatmapDownloadButton > ( ) . All ( d = > d . IsPresent ) ) ;
2020-06-02 14:31:43 +09:00
}
2021-01-13 11:57:29 +03:00
[Test]
public void TestExplicitBeatmapItem ( )
{
2021-11-01 15:42:12 +09:00
var beatmap = CreateAPIBeatmap ( ) ;
2021-11-01 16:43:39 +09:00
2021-11-01 15:42:12 +09:00
Debug . Assert ( beatmap . BeatmapSet ! = null ) ;
beatmap . BeatmapSet . HasExplicitContent = true ;
2021-01-13 11:57:29 +03:00
2022-01-11 15:55:13 +09:00
createPlaylistWithBeatmaps ( ( ) = > new [ ] { beatmap } ) ;
2021-01-13 11:57:29 +03:00
}
2021-10-22 21:04:52 +09:00
[Test]
public void TestExpiredItems ( )
{
2022-07-14 02:19:23 +03:00
createPlaylist ( p = >
2021-10-22 21:04:52 +09:00
{
2022-07-14 02:19:23 +03:00
p . Items . Clear ( ) ;
p . Items . AddRange ( new [ ]
2021-10-22 21:04:52 +09:00
{
2022-07-14 02:19:23 +03:00
new PlaylistItem ( new TestBeatmap ( new OsuRuleset ( ) . RulesetInfo ) . BeatmapInfo )
2021-10-22 21:04:52 +09:00
{
2022-07-14 02:19:23 +03:00
ID = 0 ,
RulesetID = new OsuRuleset ( ) . RulesetInfo . OnlineID ,
Expired = true ,
RequiredMods = new [ ]
2021-10-22 21:04:52 +09:00
{
2022-07-14 02:19:23 +03:00
new APIMod ( new OsuModHardRock ( ) ) ,
new APIMod ( new OsuModDoubleTime ( ) ) ,
new APIMod ( new OsuModAutoplay ( ) )
}
} ,
new PlaylistItem ( new TestBeatmap ( new OsuRuleset ( ) . RulesetInfo ) . BeatmapInfo )
{
ID = 1 ,
RulesetID = new OsuRuleset ( ) . RulesetInfo . OnlineID ,
RequiredMods = new [ ]
2021-10-22 21:04:52 +09:00
{
2022-07-14 02:19:23 +03:00
new APIMod ( new OsuModHardRock ( ) ) ,
new APIMod ( new OsuModDoubleTime ( ) ) ,
new APIMod ( new OsuModAutoplay ( ) )
2021-10-22 21:04:52 +09:00
}
}
2022-07-14 02:19:23 +03:00
} ) ;
2021-10-22 21:04:52 +09:00
} ) ;
AddUntilStep ( "wait for items to load" , ( ) = > playlist . ItemMap . Values . All ( i = > i . IsLoaded ) ) ;
}
2021-11-26 17:40:45 +09:00
[TestCase(false)]
[TestCase(true)]
public void TestWithOwner ( bool withOwner )
{
2021-12-09 01:16:37 +09:00
createPlaylist ( p = > p . ShowItemOwners = withOwner ) ;
2021-11-26 17:40:45 +09:00
AddAssert ( "owner visible" , ( ) = > playlist . ChildrenOfType < UpdateableAvatar > ( ) . All ( a = > a . IsPresent = = withOwner ) ) ;
}
2021-12-09 23:46:03 +09:00
[Test]
public void TestWithAllButtonsEnabled ( )
{
createPlaylist ( p = >
{
p . AllowDeletion = true ;
p . AllowShowingResults = true ;
2021-12-10 01:08:54 +09:00
p . AllowEditing = true ;
2021-12-09 23:46:03 +09:00
} ) ;
}
2024-01-15 14:58:46 +01:00
[Test]
public void TestSelectableMouseHandling ( )
{
bool resultsRequested = false ;
AddStep ( "reset flag" , ( ) = > resultsRequested = false ) ;
createPlaylist ( p = >
{
p . AllowSelection = true ;
p . AllowShowingResults = true ;
p . RequestResults = _ = > resultsRequested = true ;
} ) ;
2024-05-27 12:01:02 +02:00
AddUntilStep ( "wait for load" , ( ) = > playlist . ChildrenOfType < DrawableLinkCompiler > ( ) . Any ( ) & & playlist . ChildrenOfType < BeatmapCardThumbnail > ( ) . First ( ) . DrawWidth > 0 ) ;
2024-07-19 17:49:13 +09:00
AddStep ( "move mouse to first item title" , ( ) = > InputManager . MoveMouseTo ( playlist . ChildrenOfType < LinkFlowContainer > ( ) . First ( ) . ChildrenOfType < SpriteText > ( ) . First ( ) ) ) ;
AddAssert ( "first item title not hovered" , ( ) = > playlist . ChildrenOfType < DrawableLinkCompiler > ( ) . First ( ) . IsHovered , ( ) = > Is . False ) ;
AddStep ( "click title" , ( ) = >
2024-01-15 14:58:46 +01:00
{
2024-07-19 17:49:13 +09:00
InputManager . MoveMouseTo ( playlist . ChildrenOfType < LinkFlowContainer > ( ) . First ( ) . ChildrenOfType < SpriteText > ( ) . First ( ) ) ;
InputManager . Click ( MouseButton . Left ) ;
2024-01-15 14:58:46 +01:00
} ) ;
2024-07-19 17:49:13 +09:00
2024-01-15 14:58:46 +01:00
AddUntilStep ( "first item selected" , ( ) = > playlist . ChildrenOfType < DrawableRoomPlaylistItem > ( ) . First ( ) . IsSelectedItem , ( ) = > Is . True ) ;
AddUntilStep ( "first item title hovered" , ( ) = > playlist . ChildrenOfType < DrawableLinkCompiler > ( ) . First ( ) . IsHovered , ( ) = > Is . True ) ;
AddStep ( "move mouse to second item results button" , ( ) = > InputManager . MoveMouseTo ( playlist . ChildrenOfType < GrayButton > ( ) . ElementAt ( 5 ) ) ) ;
AddStep ( "click left mouse" , ( ) = > InputManager . Click ( MouseButton . Left ) ) ;
AddUntilStep ( "results requested" , ( ) = > resultsRequested ) ;
}
2020-02-14 16:48:30 +09:00
private void moveToItem ( int index , Vector2 ? offset = null )
2022-02-15 23:51:44 +09:00
= > AddStep ( $"move mouse to item {index}" , ( ) = > InputManager . MoveMouseTo ( playlist . ChildrenOfType < DrawableRoomPlaylistItem > ( ) . ElementAt ( index ) , offset ) ) ;
2020-02-14 16:48:30 +09:00
private void moveToDragger ( int index , Vector2 ? offset = null ) = > AddStep ( $"move mouse to dragger {index}" , ( ) = >
{
var item = playlist . ChildrenOfType < OsuRearrangeableListItem < PlaylistItem > > ( ) . ElementAt ( index ) ;
InputManager . MoveMouseTo ( item . ChildrenOfType < OsuRearrangeableListItem < PlaylistItem > . PlaylistItemHandle > ( ) . Single ( ) , offset ) ;
} ) ;
private void assertHandleVisibility ( int index , bool visible )
= > AddAssert ( $"handle {index} {(visible ? " is " : " is not ")} visible" ,
( ) = > ( playlist . ChildrenOfType < OsuRearrangeableListItem < PlaylistItem > . PlaylistItemHandle > ( ) . ElementAt ( index ) . Alpha > 0 ) = = visible ) ;
private void assertDeleteButtonVisibility ( int index , bool visible )
2021-10-22 21:04:52 +09:00
= > AddAssert ( $"delete button {index} {(visible ? " is " : " is not ")} visible" ,
2021-12-10 00:38:18 +09:00
( ) = > ( playlist . ChildrenOfType < DrawableRoomPlaylistItem . PlaylistRemoveButton > ( ) . ElementAt ( 2 + index * 2 ) . Alpha > 0 ) = = visible ) ;
2020-02-14 16:48:30 +09:00
2022-07-14 02:19:23 +03:00
private void createPlaylistWithBeatmaps ( Func < IEnumerable < IBeatmapInfo > > beatmaps ) = > createPlaylist ( p = >
{
int index = 0 ;
p . Items . Clear ( ) ;
foreach ( var b in beatmaps ( ) )
{
p . Items . Add ( new PlaylistItem ( b )
{
ID = index + + ,
OwnerID = 2 ,
RulesetID = new OsuRuleset ( ) . RulesetInfo . OnlineID ,
RequiredMods = new [ ]
{
new APIMod ( new OsuModHardRock ( ) ) ,
new APIMod ( new OsuModDoubleTime ( ) ) ,
new APIMod ( new OsuModAutoplay ( ) )
}
} ) ;
}
} ) ;
2021-12-09 04:20:23 +09:00
private void createPlaylist ( Action < TestPlaylist > setupPlaylist = null )
2020-02-14 15:01:45 +09:00
{
2020-02-20 08:37:23 +09:00
AddStep ( "create playlist" , ( ) = >
2020-02-14 15:01:45 +09:00
{
2022-07-15 03:19:50 +03:00
Child = new OsuContextMenuContainer
2020-02-20 08:37:23 +09:00
{
2022-07-14 02:45:38 +03:00
RelativeSizeAxes = Axes . Both ,
2022-07-15 03:19:50 +03:00
Child = playlist = new TestPlaylist
2022-07-14 02:45:38 +03:00
{
2022-07-15 03:19:50 +03:00
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
Size = new Vector2 ( 500 , 300 )
}
2020-02-20 08:37:23 +09:00
} ;
2020-02-14 15:01:45 +09:00
2020-02-20 08:37:23 +09:00
for ( int i = 0 ; i < 20 ; i + + )
2020-02-14 15:01:45 +09:00
{
2022-02-15 23:33:26 +09:00
playlist . Items . Add ( new PlaylistItem ( i % 2 = = 1
? new TestBeatmap ( new OsuRuleset ( ) . RulesetInfo ) . BeatmapInfo
: new BeatmapInfo
{
Metadata = new BeatmapMetadata
{
Artist = "Artist" ,
Author = new RealmUser { Username = "Creator name here" } ,
Title = "Long title used to check background colour" ,
} ,
BeatmapSet = new BeatmapSetInfo ( )
} )
2020-02-14 15:01:45 +09:00
{
2020-02-20 08:37:23 +09:00
ID = i ,
2021-11-25 23:15:28 +09:00
OwnerID = 2 ,
2022-02-15 16:01:14 +09:00
RulesetID = new OsuRuleset ( ) . RulesetInfo . OnlineID ,
RequiredMods = new [ ]
2020-02-20 08:37:23 +09:00
{
2022-02-15 16:01:14 +09:00
new APIMod ( new OsuModHardRock ( ) ) ,
new APIMod ( new OsuModDoubleTime ( ) ) ,
new APIMod ( new OsuModAutoplay ( ) )
2020-02-20 08:37:23 +09:00
}
} ) ;
}
2020-06-02 14:31:43 +09:00
2022-07-14 02:19:23 +03:00
setupPlaylist ? . Invoke ( playlist ) ;
2020-06-02 14:31:43 +09:00
} ) ;
AddUntilStep ( "wait for items to load" , ( ) = > playlist . ItemMap . Values . All ( i = > i . IsLoaded ) ) ;
}
2020-02-20 08:37:23 +09:00
private partial class TestPlaylist : DrawableRoomPlaylist
{
public new IReadOnlyDictionary < PlaylistItem , RearrangeableListItem < PlaylistItem > > ItemMap = > base . ItemMap ;
}
2020-02-14 15:01:45 +09:00
}
}