2020-03-26 10:30:59 +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 ;
2020-03-30 14:29:00 +08:00
using osu.Framework.Allocation ;
2020-03-26 10:30:59 +08:00
using osu.Framework.Graphics ;
using osu.Framework.Graphics.Containers ;
using osu.Framework.Graphics.Sprites ;
using osu.Framework.Testing ;
using osu.Game.Beatmaps ;
using osu.Game.Beatmaps.ControlPoints ;
using osu.Game.Rulesets.Catch.Objects ;
using osu.Game.Rulesets.Catch.Objects.Drawables ;
using osu.Game.Rulesets.Catch.Skinning ;
using osu.Game.Rulesets.Catch.UI ;
using osu.Game.Skinning ;
using osu.Game.Tests.Visual ;
using osuTK ;
using osuTK.Graphics ;
namespace osu.Game.Rulesets.Catch.Tests
{
public class TestSceneHyperDashColouring : OsuTestScene
{
2020-03-30 14:29:00 +08:00
[Resolved]
private SkinManager skins { get ; set ; }
2020-04-05 05:02:33 +08:00
[Test]
public void TestHyperDashFruitColour ( )
2020-03-26 10:40:38 +08:00
{
DrawableFruit drawableFruit = null ;
2020-04-04 00:50:32 +08:00
AddStep ( "setup hyper-dash fruit" , ( ) = >
2020-03-26 10:40:38 +08:00
{
2020-03-30 14:29:00 +08:00
var fruit = new Fruit { HyperDashTarget = new Banana ( ) } ;
2020-03-26 10:40:38 +08:00
fruit . ApplyDefaults ( new ControlPointInfo ( ) , new BeatmapDifficulty ( ) ) ;
2020-03-30 14:29:00 +08:00
Child = setupSkinHierarchy ( drawableFruit = new DrawableFruit ( fruit )
{
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
Scale = new Vector2 ( 4f ) ,
2020-04-05 05:02:33 +08:00
} , false , false , false ) ;
2020-03-26 10:40:38 +08:00
} ) ;
2020-04-05 05:02:33 +08:00
AddAssert ( "hyper-dash fruit has default colour" , ( ) = > checkLegacyFruitHyperDashColour ( drawableFruit , Catcher . DefaultHyperDashColour ) ) ;
2020-03-26 10:40:38 +08:00
}
2020-04-05 05:02:33 +08:00
[TestCase(true)]
[TestCase(false)]
public void TestCustomHyperDashFruitColour ( bool customCatcherHyperDashColour )
2020-03-26 10:40:38 +08:00
{
DrawableFruit drawableFruit = null ;
2020-04-04 00:50:32 +08:00
AddStep ( "setup hyper-dash fruit" , ( ) = >
2020-03-26 10:40:38 +08:00
{
2020-03-30 14:29:00 +08:00
var fruit = new Fruit { HyperDashTarget = new Banana ( ) } ;
2020-03-26 10:40:38 +08:00
fruit . ApplyDefaults ( new ControlPointInfo ( ) , new BeatmapDifficulty ( ) ) ;
2020-03-30 14:29:00 +08:00
Child = setupSkinHierarchy ( drawableFruit = new DrawableFruit ( fruit )
{
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
Scale = new Vector2 ( 4f ) ,
2020-04-05 05:02:33 +08:00
} , customCatcherHyperDashColour , false , true ) ;
2020-03-26 10:40:38 +08:00
} ) ;
2020-04-05 05:02:33 +08:00
AddAssert ( "hyper-dash fruit use fruit colour from skin" , ( ) = > checkLegacyFruitHyperDashColour ( drawableFruit , TestSkin . CustomHyperDashFruitColour ) ) ;
2020-03-26 10:40:38 +08:00
}
2020-04-05 05:02:33 +08:00
[Test]
public void TestCustomHyperDashFruitColourFallback ( )
2020-03-26 10:40:38 +08:00
{
DrawableFruit drawableFruit = null ;
2020-04-04 00:50:32 +08:00
AddStep ( "setup hyper-dash fruit" , ( ) = >
2020-03-26 10:40:38 +08:00
{
2020-03-30 14:29:00 +08:00
var fruit = new Fruit { HyperDashTarget = new Banana ( ) } ;
2020-03-26 10:40:38 +08:00
fruit . ApplyDefaults ( new ControlPointInfo ( ) , new BeatmapDifficulty ( ) ) ;
2020-03-30 14:29:00 +08:00
Child = setupSkinHierarchy (
2020-03-26 10:40:38 +08:00
drawableFruit = new DrawableFruit ( fruit )
{
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
Scale = new Vector2 ( 4f ) ,
2020-04-05 05:02:33 +08:00
} , true , false , false ) ;
2020-03-26 10:40:38 +08:00
} ) ;
2020-04-05 05:02:33 +08:00
AddAssert ( "hyper-dash fruit colour falls back to catcher colour from skin" , ( ) = > checkLegacyFruitHyperDashColour ( drawableFruit , TestSkin . CustomHyperDashColour ) ) ;
2020-03-26 10:40:38 +08:00
}
2020-04-05 05:02:33 +08:00
private Drawable setupSkinHierarchy ( Drawable child , bool customCatcherColour , bool customAfterColour , bool customFruitColour )
2020-03-26 10:30:59 +08:00
{
2020-04-05 05:02:33 +08:00
var legacySkinProvider = new SkinProvidingContainer ( skins . GetSkin ( DefaultLegacySkin . Info ) ) ;
2020-03-30 14:29:00 +08:00
var testSkinProvider = new SkinProvidingContainer ( new TestSkin ( customCatcherColour , customAfterColour , customFruitColour ) ) ;
2020-04-05 05:02:33 +08:00
var legacySkinTransformer = new SkinProvidingContainer ( new CatchLegacySkinTransformer ( testSkinProvider ) ) ;
2020-03-30 14:29:00 +08:00
2020-04-05 05:02:33 +08:00
return legacySkinProvider
. WithChild ( testSkinProvider
. WithChild ( legacySkinTransformer
. WithChild ( child ) ) ) ;
2020-03-26 10:30:59 +08:00
}
2020-03-30 14:29:00 +08:00
private bool checkLegacyFruitHyperDashColour ( DrawableFruit fruit , Color4 expectedColour ) = >
fruit . ChildrenOfType < SkinnableDrawable > ( ) . First ( ) . Drawable . ChildrenOfType < Sprite > ( ) . Any ( c = > c . Colour = = expectedColour ) ;
2020-03-26 10:30:59 +08:00
2020-03-30 14:29:00 +08:00
private class TestSkin : ISkin
2020-03-26 10:30:59 +08:00
{
public static Color4 CustomHyperDashColour { get ; } = Color4 . Goldenrod ;
public static Color4 CustomHyperDashFruitColour { get ; } = Color4 . Cyan ;
public static Color4 CustomHyperDashAfterColour { get ; } = Color4 . Lime ;
2020-03-30 14:29:00 +08:00
private readonly bool customCatcherColour ;
private readonly bool customAfterColour ;
private readonly bool customFruitColour ;
2020-03-26 10:30:59 +08:00
2020-04-04 00:53:38 +08:00
public TestSkin ( bool customCatcherColour , bool customAfterColour , bool customFruitColour )
2020-03-26 10:30:59 +08:00
{
2020-03-30 14:29:00 +08:00
this . customCatcherColour = customCatcherColour ;
this . customAfterColour = customAfterColour ;
this . customFruitColour = customFruitColour ;
2020-03-26 10:30:59 +08:00
}
public Drawable GetDrawableComponent ( ISkinComponent component ) = > null ;
2020-03-30 14:29:00 +08:00
public Texture GetTexture ( string componentName ) = > null ;
2020-03-26 10:30:59 +08:00
public SampleChannel GetSample ( ISampleInfo sampleInfo ) = > null ;
public IBindable < TValue > GetConfig < TLookup , TValue > ( TLookup lookup )
{
2020-03-30 14:33:47 +08:00
if ( lookup is CatchSkinColour config )
2020-03-26 10:30:59 +08:00
{
2020-03-30 14:33:47 +08:00
if ( config = = CatchSkinColour . HyperDash & & customCatcherColour )
2020-03-28 12:43:47 +08:00
return SkinUtils . As < TValue > ( new Bindable < Color4 > ( CustomHyperDashColour ) ) ;
2020-03-26 10:30:59 +08:00
2020-03-30 14:33:47 +08:00
if ( config = = CatchSkinColour . HyperDashFruit & & customFruitColour )
2020-03-28 12:43:47 +08:00
return SkinUtils . As < TValue > ( new Bindable < Color4 > ( CustomHyperDashFruitColour ) ) ;
2020-03-26 10:30:59 +08:00
2020-03-30 14:33:47 +08:00
if ( config = = CatchSkinColour . HyperDashAfterImage & & customAfterColour )
2020-03-28 12:43:47 +08:00
return SkinUtils . As < TValue > ( new Bindable < Color4 > ( CustomHyperDashAfterColour ) ) ;
2020-03-26 10:30:59 +08:00
}
return null ;
}
}
}
}