2019-07-29 11:52:42 +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.Linq ;
using NUnit.Framework ;
using osu.Framework.Bindables ;
using osu.Framework.Graphics ;
2020-12-15 14:22:14 +08:00
using osu.Framework.Testing ;
2020-12-18 15:20:42 +08:00
using osu.Framework.Utils ;
2020-12-15 14:27:26 +08:00
using osu.Game.Screens.Play.HUD ;
2019-07-29 11:52:42 +08:00
using osu.Game.Users ;
using osuTK ;
namespace osu.Game.Tests.Visual.Gameplay
{
[TestFixture]
2020-12-15 14:27:26 +08:00
public class TestSceneGameplayLeaderboard : OsuTestScene
2019-07-29 11:52:42 +08:00
{
2020-12-15 14:27:26 +08:00
private readonly TestGameplayLeaderboard leaderboard ;
2019-07-29 11:52:42 +08:00
2020-12-15 14:27:26 +08:00
private readonly BindableDouble playerScore = new BindableDouble ( ) ;
public TestSceneGameplayLeaderboard ( )
2019-07-29 11:52:42 +08:00
{
2020-12-15 14:27:26 +08:00
Add ( leaderboard = new TestGameplayLeaderboard
2019-07-29 11:52:42 +08:00
{
Anchor = Anchor . Centre ,
2020-12-17 20:12:32 +08:00
Origin = Anchor . TopCentre ,
2019-07-29 11:52:42 +08:00
Scale = new Vector2 ( 2 ) ,
} ) ;
}
2020-12-15 14:22:14 +08:00
[SetUpSteps]
public void SetUpSteps ( )
2019-08-04 23:28:40 +08:00
{
2020-12-15 14:22:14 +08:00
AddStep ( "reset leaderboard" , ( ) = >
{
2020-12-15 14:27:26 +08:00
leaderboard . Clear ( ) ;
2020-12-15 14:22:14 +08:00
playerScore . Value = 1222333 ;
} ) ;
2020-12-18 08:34:33 +08:00
AddStep ( "add local player" , ( ) = > leaderboard . Add ( createLeaderboardScore ( playerScore , "You" , true ) ) ) ;
2020-12-15 14:22:14 +08:00
AddSliderStep ( "set player score" , 50 , 5000000 , 1222333 , v = > playerScore . Value = v ) ;
2019-08-04 23:28:40 +08:00
}
2019-07-30 17:37:01 +08:00
2019-07-29 11:52:42 +08:00
[Test]
public void TestPlayerScore ( )
{
var player2Score = new BindableDouble ( 1234567 ) ;
var player3Score = new BindableDouble ( 1111111 ) ;
2020-12-18 08:34:33 +08:00
AddStep ( "add player 2" , ( ) = > leaderboard . Add ( createLeaderboardScore ( player2Score , "Player 2" ) ) ) ;
AddStep ( "add player 3" , ( ) = > leaderboard . Add ( createLeaderboardScore ( player3Score , "Player 3" ) ) ) ;
2019-07-29 11:52:42 +08:00
AddAssert ( "is player 2 position #1" , ( ) = > leaderboard . CheckPositionByUsername ( "Player 2" , 1 ) ) ;
AddAssert ( "is player position #2" , ( ) = > leaderboard . CheckPositionByUsername ( "You" , 2 ) ) ;
AddAssert ( "is player 3 position #3" , ( ) = > leaderboard . CheckPositionByUsername ( "Player 3" , 3 ) ) ;
AddStep ( "set score above player 3" , ( ) = > player2Score . Value = playerScore . Value - 500 ) ;
AddAssert ( "is player position #1" , ( ) = > leaderboard . CheckPositionByUsername ( "You" , 1 ) ) ;
AddAssert ( "is player 2 position #2" , ( ) = > leaderboard . CheckPositionByUsername ( "Player 2" , 2 ) ) ;
AddAssert ( "is player 3 position #3" , ( ) = > leaderboard . CheckPositionByUsername ( "Player 3" , 3 ) ) ;
AddStep ( "set score below players" , ( ) = > player2Score . Value = playerScore . Value - 123456 ) ;
AddAssert ( "is player position #1" , ( ) = > leaderboard . CheckPositionByUsername ( "You" , 1 ) ) ;
AddAssert ( "is player 3 position #2" , ( ) = > leaderboard . CheckPositionByUsername ( "Player 3" , 2 ) ) ;
AddAssert ( "is player 2 position #3" , ( ) = > leaderboard . CheckPositionByUsername ( "Player 2" , 3 ) ) ;
}
2020-12-18 15:20:42 +08:00
[Test]
public void TestRandomScores ( )
{
int playerNumber = 1 ;
AddRepeatStep ( "add player with random score" , ( ) = > leaderboard . Add ( createLeaderboardScore ( new BindableDouble ( RNG . Next ( 0 , 5_000_000 ) ) , $"Player {playerNumber++}" ) ) , 10 ) ;
}
2020-12-18 08:34:33 +08:00
private static GameplayLeaderboardScore createLeaderboardScore ( BindableDouble score , string username , bool localOrReplayPlayer = false )
{
return new GameplayLeaderboardScore ( new User { Username = username } , localOrReplayPlayer )
{
TotalScore = { BindTarget = score } ,
} ;
}
2020-12-15 14:27:26 +08:00
private class TestGameplayLeaderboard : GameplayLeaderboard
2019-07-29 11:52:42 +08:00
{
2020-12-15 14:27:26 +08:00
public bool CheckPositionByUsername ( string username , int? expectedPosition )
2019-07-29 11:52:42 +08:00
{
2020-12-15 14:27:26 +08:00
var scoreItem = this . FirstOrDefault ( i = > i . User . Username = = username ) ;
2019-07-29 11:52:42 +08:00
2020-12-15 14:27:26 +08:00
return scoreItem ! = null & & scoreItem . ScorePosition = = expectedPosition ;
2019-07-29 11:52:42 +08:00
}
}
}
}