2020-02-14 16:20:38 +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.
using System ;
using System.Collections.Generic ;
2020-02-14 16:51:42 +08:00
using System.IO ;
using System.Linq ;
using System.Text ;
2020-02-14 16:20:38 +08:00
using NUnit.Framework ;
using osu.Framework.Allocation ;
2020-02-14 16:51:42 +08:00
using osu.Framework.Audio ;
using osu.Framework.Extensions ;
using osu.Framework.Platform ;
using osu.Framework.Screens ;
using osu.Framework.Utils ;
2020-02-14 16:20:38 +08:00
using osu.Game.Beatmaps ;
2021-06-24 18:09:31 +08:00
using osu.Game.Online.Rooms ;
2020-02-14 16:51:42 +08:00
using osu.Game.Rulesets ;
2020-08-13 18:48:41 +08:00
using osu.Game.Rulesets.Mods ;
2020-02-14 16:51:42 +08:00
using osu.Game.Rulesets.Osu ;
2020-08-13 18:48:41 +08:00
using osu.Game.Rulesets.Osu.Mods ;
2020-12-25 23:50:00 +08:00
using osu.Game.Screens.OnlinePlay.Components ;
2021-02-01 19:16:58 +08:00
using osu.Game.Screens.OnlinePlay.Playlists ;
2021-06-24 16:01:28 +08:00
using osu.Game.Tests.Visual.OnlinePlay ;
2020-02-14 16:20:38 +08:00
namespace osu.Game.Tests.Visual.Multiplayer
{
2021-06-25 12:02:19 +08:00
public class TestScenePlaylistsSongSelect : OnlinePlayTestScene
2020-02-14 16:20:38 +08:00
{
[Resolved]
private BeatmapManager beatmapManager { get ; set ; }
2020-02-14 16:51:42 +08:00
private BeatmapManager manager ;
private RulesetStore rulesets ;
2021-02-01 19:16:58 +08:00
private TestPlaylistsSongSelect songSelect ;
2020-02-14 16:51:42 +08:00
[BackgroundDependencyLoader]
private void load ( GameHost host , AudioManager audio )
{
Dependencies . Cache ( rulesets = new RulesetStore ( ContextFactory ) ) ;
2021-05-31 17:37:32 +08:00
Dependencies . Cache ( manager = new BeatmapManager ( LocalStorage , ContextFactory , rulesets , null , audio , Resources , host , Beatmap . Default ) ) ;
2020-02-14 16:51:42 +08:00
var beatmaps = new List < BeatmapInfo > ( ) ;
for ( int i = 0 ; i < 6 ; i + + )
{
int beatmapId = 10 * 10 + i ;
int length = RNG . Next ( 30000 , 200000 ) ;
double bpm = RNG . NextSingle ( 80 , 200 ) ;
beatmaps . Add ( new BeatmapInfo
{
Ruleset = new OsuRuleset ( ) . RulesetInfo ,
OnlineBeatmapID = beatmapId ,
Version = $"{beatmapId} (length {TimeSpan.FromMilliseconds(length):m\\:ss}, bpm {bpm:0.#})" ,
Length = length ,
BPM = bpm ,
BaseDifficulty = new BeatmapDifficulty
{
OverallDifficulty = 3.5f ,
} ,
} ) ;
}
manager . Import ( new BeatmapSetInfo
{
OnlineBeatmapSetID = 10 ,
Hash = new MemoryStream ( Encoding . UTF8 . GetBytes ( Guid . NewGuid ( ) . ToString ( ) ) ) . ComputeMD5Hash ( ) ,
Metadata = new BeatmapMetadata
{
// Create random metadata, then we can check if sorting works based on these
Artist = "Some Artist " + RNG . Next ( 0 , 9 ) ,
Title = $"Some Song (set id 10), max bpm {beatmaps.Max(b => b.BPM):0.#})" ,
AuthorString = "Some Guy " + RNG . Next ( 0 , 9 ) ,
} ,
Beatmaps = beatmaps ,
DateAdded = DateTimeOffset . UtcNow ,
} ) . Wait ( ) ;
}
public override void SetUpSteps ( )
{
base . SetUpSteps ( ) ;
AddStep ( "reset" , ( ) = >
{
2021-06-24 18:09:31 +08:00
SelectedRoom . Value = new Room ( ) ;
2020-02-14 16:51:42 +08:00
Ruleset . Value = new OsuRuleset ( ) . RulesetInfo ;
Beatmap . SetDefault ( ) ;
2021-02-09 12:09:38 +08:00
SelectedMods . Value = Array . Empty < Mod > ( ) ;
2020-02-14 16:51:42 +08:00
} ) ;
2021-08-24 12:34:23 +08:00
AddStep ( "create song select" , ( ) = > LoadScreen ( songSelect = new TestPlaylistsSongSelect ( SelectedRoom . Value ) ) ) ;
2020-02-14 16:51:42 +08:00
AddUntilStep ( "wait for present" , ( ) = > songSelect . IsCurrentScreen ( ) ) ;
}
2020-02-14 16:20:38 +08:00
[Test]
2020-02-14 16:51:42 +08:00
public void TestItemAddedIfEmptyOnStart ( )
{
AddStep ( "finalise selection" , ( ) = > songSelect . FinaliseSelection ( ) ) ;
2021-06-24 18:09:31 +08:00
AddAssert ( "playlist has 1 item" , ( ) = > SelectedRoom . Value . Playlist . Count = = 1 ) ;
2020-02-14 16:51:42 +08:00
}
[Test]
public void TestItemAddedWhenCreateNewItemClicked ( )
{
AddStep ( "create new item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
2021-06-24 18:09:31 +08:00
AddAssert ( "playlist has 1 item" , ( ) = > SelectedRoom . Value . Playlist . Count = = 1 ) ;
2020-02-14 16:51:42 +08:00
}
[Test]
public void TestItemNotAddedIfExistingOnStart ( )
{
AddStep ( "create new item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
AddStep ( "finalise selection" , ( ) = > songSelect . FinaliseSelection ( ) ) ;
2021-06-24 18:09:31 +08:00
AddAssert ( "playlist has 1 item" , ( ) = > SelectedRoom . Value . Playlist . Count = = 1 ) ;
2020-02-14 16:51:42 +08:00
}
2020-02-14 18:56:01 +08:00
[Test]
public void TestAddSameItemMultipleTimes ( )
{
AddStep ( "create new item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
AddStep ( "create new item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
2021-06-24 18:09:31 +08:00
AddAssert ( "playlist has 2 items" , ( ) = > SelectedRoom . Value . Playlist . Count = = 2 ) ;
2020-02-14 18:56:01 +08:00
}
2020-02-17 16:04:58 +08:00
[Test]
public void TestAddItemAfterRearrangement ( )
{
AddStep ( "create new item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
AddStep ( "create new item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
AddStep ( "rearrange" , ( ) = >
{
2021-06-24 18:09:31 +08:00
var item = SelectedRoom . Value . Playlist [ 0 ] ;
SelectedRoom . Value . Playlist . RemoveAt ( 0 ) ;
SelectedRoom . Value . Playlist . Add ( item ) ;
2020-02-17 16:04:58 +08:00
} ) ;
AddStep ( "create new item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
2021-06-24 18:09:31 +08:00
AddAssert ( "new item has id 2" , ( ) = > SelectedRoom . Value . Playlist . Last ( ) . ID = = 2 ) ;
2020-02-17 16:04:58 +08:00
}
2020-08-13 18:48:41 +08:00
/// <summary>
/// Tests that the same <see cref="Mod"/> instances are not shared between two playlist items.
/// </summary>
[Test]
public void TestNewItemHasNewModInstances ( )
{
AddStep ( "set dt mod" , ( ) = > SelectedMods . Value = new [ ] { new OsuModDoubleTime ( ) } ) ;
AddStep ( "create item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
AddStep ( "change mod rate" , ( ) = > ( ( OsuModDoubleTime ) SelectedMods . Value [ 0 ] ) . SpeedChange . Value = 2 ) ;
AddStep ( "create item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
2021-06-24 18:09:31 +08:00
AddAssert ( "item 1 has rate 1.5" , ( ) = > Precision . AlmostEquals ( 1.5 , ( ( OsuModDoubleTime ) SelectedRoom . Value . Playlist . First ( ) . RequiredMods [ 0 ] ) . SpeedChange . Value ) ) ;
AddAssert ( "item 2 has rate 2" , ( ) = > Precision . AlmostEquals ( 2 , ( ( OsuModDoubleTime ) SelectedRoom . Value . Playlist . Last ( ) . RequiredMods [ 0 ] ) . SpeedChange . Value ) ) ;
2020-08-13 18:48:41 +08:00
}
2020-09-04 14:20:55 +08:00
/// <summary>
/// Tests that the global mod instances are not retained by the rooms, as global mod instances are retained and re-used by the mod select overlay.
/// </summary>
[Test]
public void TestGlobalModInstancesNotRetained ( )
{
OsuModDoubleTime mod = null ;
AddStep ( "set dt mod and store" , ( ) = >
{
SelectedMods . Value = new [ ] { new OsuModDoubleTime ( ) } ;
// Mod select overlay replaces our mod.
mod = ( OsuModDoubleTime ) SelectedMods . Value [ 0 ] ;
} ) ;
AddStep ( "create item" , ( ) = > songSelect . BeatmapDetails . CreateNewItem ( ) ) ;
AddStep ( "change stored mod rate" , ( ) = > mod . SpeedChange . Value = 2 ) ;
2021-06-24 18:09:31 +08:00
AddAssert ( "item has rate 1.5" , ( ) = > Precision . AlmostEquals ( 1.5 , ( ( OsuModDoubleTime ) SelectedRoom . Value . Playlist . First ( ) . RequiredMods [ 0 ] ) . SpeedChange . Value ) ) ;
2020-09-04 14:20:55 +08:00
}
2021-02-01 19:16:58 +08:00
private class TestPlaylistsSongSelect : PlaylistsSongSelect
2020-02-14 16:20:38 +08:00
{
2020-02-14 16:51:42 +08:00
public new MatchBeatmapDetailArea BeatmapDetails = > ( MatchBeatmapDetailArea ) base . BeatmapDetails ;
2021-08-24 12:34:23 +08:00
public TestPlaylistsSongSelect ( Room room )
: base ( room )
{
}
2020-02-14 16:20:38 +08:00
}
}
}