2019-01-24 16:43:03 +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.
2018-04-13 17:19:50 +08:00
2020-06-18 12:20:16 +08:00
using System ;
using System.Collections.Generic ;
2019-11-04 08:52:26 +08:00
using System.Linq ;
2020-06-19 14:35:39 +08:00
using System.Threading.Tasks ;
2018-04-13 17:19:50 +08:00
using NUnit.Framework ;
using osu.Framework.Allocation ;
2019-11-04 08:52:26 +08:00
using osu.Framework.Graphics ;
using osu.Framework.Graphics.Containers ;
using osu.Framework.Screens ;
2020-06-19 14:35:39 +08:00
using osu.Framework.Testing ;
2020-06-19 17:02:57 +08:00
using osu.Framework.Utils ;
2018-04-13 17:19:50 +08:00
using osu.Game.Beatmaps ;
2020-08-30 00:30:56 +08:00
using osu.Game.Graphics.UserInterface ;
2020-06-18 12:20:16 +08:00
using osu.Game.Online.API ;
2020-03-17 16:43:16 +08:00
using osu.Game.Rulesets.Osu ;
2018-11-28 15:12:57 +08:00
using osu.Game.Scoring ;
2019-11-04 08:52:26 +08:00
using osu.Game.Screens ;
2018-12-21 15:28:33 +08:00
using osu.Game.Screens.Play ;
2018-04-13 17:19:50 +08:00
using osu.Game.Screens.Ranking ;
2020-06-19 17:02:57 +08:00
using osu.Game.Screens.Ranking.Statistics ;
2020-06-23 14:21:23 +08:00
using osuTK ;
2020-06-19 14:35:39 +08:00
using osuTK.Input ;
2018-04-13 17:19:50 +08:00
2020-03-17 16:43:16 +08:00
namespace osu.Game.Tests.Visual.Ranking
2018-04-13 17:19:50 +08:00
{
[TestFixture]
2020-06-23 14:13:30 +08:00
public class TestSceneResultsScreen : OsuManualInputManagerTestScene
2018-04-13 17:19:50 +08:00
{
private BeatmapManager beatmaps ;
[BackgroundDependencyLoader]
private void load ( BeatmapManager beatmaps )
{
this . beatmaps = beatmaps ;
}
protected override void LoadComplete ( )
{
base . LoadComplete ( ) ;
2018-05-23 16:37:39 +08:00
var beatmapInfo = beatmaps . QueryBeatmap ( b = > b . RulesetID = = 0 ) ;
if ( beatmapInfo ! = null )
Beatmap . Value = beatmaps . GetWorkingBeatmap ( beatmapInfo ) ;
2019-11-04 08:52:26 +08:00
}
2018-04-13 17:19:50 +08:00
2020-06-03 10:06:59 +08:00
private TestResultsScreen createResultsScreen ( ) = > new TestResultsScreen ( new TestScoreInfo ( new OsuRuleset ( ) . RulesetInfo ) ) ;
private UnrankedSoloResultsScreen createUnrankedSoloResultsScreen ( ) = > new UnrankedSoloResultsScreen ( new TestScoreInfo ( new OsuRuleset ( ) . RulesetInfo ) ) ;
2019-11-04 08:52:26 +08:00
[Test]
2020-06-19 14:35:39 +08:00
public void TestResultsWithoutPlayer ( )
2019-11-04 08:52:26 +08:00
{
2020-06-03 10:06:59 +08:00
TestResultsScreen screen = null ;
2020-01-31 18:10:44 +08:00
OsuScreenStack stack ;
2019-11-04 08:52:26 +08:00
2020-01-31 18:10:44 +08:00
AddStep ( "load results" , ( ) = >
2019-11-04 08:52:26 +08:00
{
2020-01-31 18:10:44 +08:00
Child = stack = new OsuScreenStack
{
RelativeSizeAxes = Axes . Both
} ;
stack . Push ( screen = createResultsScreen ( ) ) ;
2019-11-04 08:52:26 +08:00
} ) ;
AddUntilStep ( "wait for loaded" , ( ) = > screen . IsLoaded ) ;
AddAssert ( "retry overlay not present" , ( ) = > screen . RetryOverlay = = null ) ;
}
[Test]
2020-06-19 14:35:39 +08:00
public void TestResultsWithPlayer ( )
2019-11-04 08:52:26 +08:00
{
2020-06-03 10:06:59 +08:00
TestResultsScreen screen = null ;
2019-11-04 08:52:26 +08:00
AddStep ( "load results" , ( ) = > Child = new TestResultsContainer ( screen = createResultsScreen ( ) ) ) ;
AddUntilStep ( "wait for loaded" , ( ) = > screen . IsLoaded ) ;
AddAssert ( "retry overlay present" , ( ) = > screen . RetryOverlay ! = null ) ;
}
2020-06-03 10:06:59 +08:00
[Test]
2020-06-19 14:35:39 +08:00
public void TestResultsForUnranked ( )
2020-06-03 10:06:59 +08:00
{
UnrankedSoloResultsScreen screen = null ;
AddStep ( "load results" , ( ) = > Child = new TestResultsContainer ( screen = createUnrankedSoloResultsScreen ( ) ) ) ;
AddUntilStep ( "wait for loaded" , ( ) = > screen . IsLoaded ) ;
AddAssert ( "retry overlay present" , ( ) = > screen . RetryOverlay ! = null ) ;
}
2020-06-23 14:21:23 +08:00
[Test]
public void TestShowHideStatisticsViaOutsideClick ( )
{
TestResultsScreen screen = null ;
AddStep ( "load results" , ( ) = > Child = new TestResultsContainer ( screen = createResultsScreen ( ) ) ) ;
AddUntilStep ( "wait for loaded" , ( ) = > screen . IsLoaded ) ;
AddStep ( "click expanded panel" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
InputManager . MoveMouseTo ( expandedPanel ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
AddAssert ( "statistics shown" , ( ) = > this . ChildrenOfType < StatisticsPanel > ( ) . Single ( ) . State . Value = = Visibility . Visible ) ;
AddUntilStep ( "expanded panel at the left of the screen" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
return expandedPanel . ScreenSpaceDrawQuad . TopLeft . X - screen . ScreenSpaceDrawQuad . TopLeft . X < 150 ;
} ) ;
AddStep ( "click to right of panel" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
InputManager . MoveMouseTo ( expandedPanel . ScreenSpaceDrawQuad . TopRight + new Vector2 ( 100 , 0 ) ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
AddAssert ( "statistics hidden" , ( ) = > this . ChildrenOfType < StatisticsPanel > ( ) . Single ( ) . State . Value = = Visibility . Hidden ) ;
AddUntilStep ( "expanded panel in centre of screen" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
return Precision . AlmostEquals ( expandedPanel . ScreenSpaceDrawQuad . Centre . X , screen . ScreenSpaceDrawQuad . Centre . X , 1 ) ;
} ) ;
}
2020-06-19 17:02:57 +08:00
[Test]
public void TestShowHideStatistics ( )
{
TestResultsScreen screen = null ;
AddStep ( "load results" , ( ) = > Child = new TestResultsContainer ( screen = createResultsScreen ( ) ) ) ;
AddUntilStep ( "wait for loaded" , ( ) = > screen . IsLoaded ) ;
AddStep ( "click expanded panel" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
InputManager . MoveMouseTo ( expandedPanel ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
AddAssert ( "statistics shown" , ( ) = > this . ChildrenOfType < StatisticsPanel > ( ) . Single ( ) . State . Value = = Visibility . Visible ) ;
AddUntilStep ( "expanded panel at the left of the screen" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
return expandedPanel . ScreenSpaceDrawQuad . TopLeft . X - screen . ScreenSpaceDrawQuad . TopLeft . X < 150 ;
} ) ;
AddStep ( "click expanded panel" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
InputManager . MoveMouseTo ( expandedPanel ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
AddAssert ( "statistics hidden" , ( ) = > this . ChildrenOfType < StatisticsPanel > ( ) . Single ( ) . State . Value = = Visibility . Hidden ) ;
AddUntilStep ( "expanded panel in centre of screen" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
return Precision . AlmostEquals ( expandedPanel . ScreenSpaceDrawQuad . Centre . X , screen . ScreenSpaceDrawQuad . Centre . X , 1 ) ;
} ) ;
}
[Test]
public void TestShowStatisticsAndClickOtherPanel ( )
{
TestResultsScreen screen = null ;
AddStep ( "load results" , ( ) = > Child = new TestResultsContainer ( screen = createResultsScreen ( ) ) ) ;
AddUntilStep ( "wait for loaded" , ( ) = > screen . IsLoaded ) ;
ScorePanel expandedPanel = null ;
ScorePanel contractedPanel = null ;
AddStep ( "click expanded panel then contracted panel" , ( ) = >
{
expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
InputManager . MoveMouseTo ( expandedPanel ) ;
InputManager . Click ( MouseButton . Left ) ;
contractedPanel = this . ChildrenOfType < ScorePanel > ( ) . First ( p = > p . State = = PanelState . Contracted & & p . ScreenSpaceDrawQuad . TopLeft . X > screen . ScreenSpaceDrawQuad . TopLeft . X ) ;
InputManager . MoveMouseTo ( contractedPanel ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
AddAssert ( "statistics shown" , ( ) = > this . ChildrenOfType < StatisticsPanel > ( ) . Single ( ) . State . Value = = Visibility . Visible ) ;
AddAssert ( "contracted panel still contracted" , ( ) = > contractedPanel . State = = PanelState . Contracted ) ;
AddAssert ( "expanded panel still expanded" , ( ) = > expandedPanel . State = = PanelState . Expanded ) ;
}
2020-06-19 14:35:39 +08:00
[Test]
public void TestFetchScoresAfterShowingStatistics ( )
{
DelayedFetchResultsScreen screen = null ;
AddStep ( "load results" , ( ) = > Child = new TestResultsContainer ( screen = new DelayedFetchResultsScreen ( new TestScoreInfo ( new OsuRuleset ( ) . RulesetInfo ) , 3000 ) ) ) ;
AddUntilStep ( "wait for loaded" , ( ) = > screen . IsLoaded ) ;
AddStep ( "click expanded panel" , ( ) = >
{
var expandedPanel = this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) ;
InputManager . MoveMouseTo ( expandedPanel ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
AddUntilStep ( "wait for fetch" , ( ) = > screen . FetchCompleted ) ;
AddAssert ( "expanded panel still on screen" , ( ) = > this . ChildrenOfType < ScorePanel > ( ) . Single ( p = > p . State = = PanelState . Expanded ) . ScreenSpaceDrawQuad . TopLeft . X > 0 ) ;
}
2020-08-30 00:30:56 +08:00
[Test]
2020-08-30 02:13:03 +08:00
public void TestDownloadButtonInitiallyDisabled ( )
2020-08-30 00:30:56 +08:00
{
TestResultsScreen screen = null ;
AddStep ( "load results" , ( ) = > Child = new TestResultsContainer ( screen = createResultsScreen ( ) ) ) ;
2020-08-30 02:23:22 +08:00
AddAssert ( "download button is disabled" , ( ) = > ! screen . ChildrenOfType < DownloadButton > ( ) . Single ( ) . Enabled . Value ) ;
2020-08-30 00:30:56 +08:00
AddStep ( "click contracted panel" , ( ) = >
{
var contractedPanel = this . ChildrenOfType < ScorePanel > ( ) . First ( p = > p . State = = PanelState . Contracted & & p . ScreenSpaceDrawQuad . TopLeft . X > screen . ScreenSpaceDrawQuad . TopLeft . X ) ;
InputManager . MoveMouseTo ( contractedPanel ) ;
InputManager . Click ( MouseButton . Left ) ;
} ) ;
2020-08-30 02:23:22 +08:00
AddAssert ( "download button is enabled" , ( ) = > screen . ChildrenOfType < DownloadButton > ( ) . Single ( ) . Enabled . Value ) ;
2020-08-30 00:30:56 +08:00
}
2019-11-04 08:52:26 +08:00
private class TestResultsContainer : Container
{
[Cached(typeof(Player))]
private readonly Player player = new TestPlayer ( ) ;
public TestResultsContainer ( IScreen screen )
{
RelativeSizeAxes = Axes . Both ;
2020-01-31 18:10:44 +08:00
OsuScreenStack stack ;
2019-11-04 08:52:26 +08:00
2020-01-31 18:10:44 +08:00
InternalChild = stack = new OsuScreenStack
2018-04-13 17:19:50 +08:00
{
2019-11-04 08:52:26 +08:00
RelativeSizeAxes = Axes . Both ,
} ;
2020-01-31 18:10:44 +08:00
stack . Push ( screen ) ;
2019-11-04 08:52:26 +08:00
}
}
2020-06-03 10:06:59 +08:00
private class TestResultsScreen : ResultsScreen
{
public HotkeyRetryOverlay RetryOverlay ;
public TestResultsScreen ( ScoreInfo score )
: base ( score )
{
}
protected override void LoadComplete ( )
{
base . LoadComplete ( ) ;
RetryOverlay = InternalChildren . OfType < HotkeyRetryOverlay > ( ) . SingleOrDefault ( ) ;
}
2020-06-18 12:20:16 +08:00
protected override APIRequest FetchScores ( Action < IEnumerable < ScoreInfo > > scoresCallback )
{
var scores = new List < ScoreInfo > ( ) ;
for ( int i = 0 ; i < 20 ; i + + )
{
var score = new TestScoreInfo ( new OsuRuleset ( ) . RulesetInfo ) ;
score . TotalScore + = 10 - i ;
2020-08-30 00:30:56 +08:00
score . Hash = $"test{i}" ;
2020-06-18 12:20:16 +08:00
scores . Add ( score ) ;
}
scoresCallback ? . Invoke ( scores ) ;
return null ;
}
2020-06-03 10:06:59 +08:00
}
2020-06-19 14:35:39 +08:00
private class DelayedFetchResultsScreen : TestResultsScreen
{
public bool FetchCompleted { get ; private set ; }
private readonly double delay ;
public DelayedFetchResultsScreen ( ScoreInfo score , double delay )
: base ( score )
{
this . delay = delay ;
}
protected override APIRequest FetchScores ( Action < IEnumerable < ScoreInfo > > scoresCallback )
{
Task . Run ( async ( ) = >
{
await Task . Delay ( TimeSpan . FromMilliseconds ( delay ) ) ;
var scores = new List < ScoreInfo > ( ) ;
for ( int i = 0 ; i < 20 ; i + + )
{
var score = new TestScoreInfo ( new OsuRuleset ( ) . RulesetInfo ) ;
score . TotalScore + = 10 - i ;
scores . Add ( score ) ;
}
scoresCallback ? . Invoke ( scores ) ;
Schedule ( ( ) = > FetchCompleted = true ) ;
} ) ;
return null ;
}
}
2020-06-03 10:06:59 +08:00
private class UnrankedSoloResultsScreen : SoloResultsScreen
2019-11-04 08:52:26 +08:00
{
public HotkeyRetryOverlay RetryOverlay ;
2020-06-03 10:06:59 +08:00
public UnrankedSoloResultsScreen ( ScoreInfo score )
2019-11-04 08:52:26 +08:00
: base ( score )
{
2020-06-03 10:06:59 +08:00
Score . Beatmap . OnlineBeatmapID = 0 ;
Score . Beatmap . Status = BeatmapSetOnlineStatus . Pending ;
2019-11-04 08:52:26 +08:00
}
protected override void LoadComplete ( )
{
base . LoadComplete ( ) ;
RetryOverlay = InternalChildren . OfType < HotkeyRetryOverlay > ( ) . SingleOrDefault ( ) ;
}
2018-04-13 17:19:50 +08:00
}
}
}