mirror of
https://github.com/ppy/osu.git
synced 2026-05-13 19:54:15 +08:00
18d4ba5874
Most of this is as everywhere else, but there's also interesting code inspection fixes from the InspectCode bump, so I'll talk about that a little. ## [Fix suspicious equality in `Hotkey`](https://github.com/ppy/osu/commit/948136e49e88a721827d54e51c5759fe9aca811d) Inspection: https://www.jetbrains.com/help/resharper/TypeWithSuspiciousEqualityIsUsedInRecord.Global.html Pretty annoying to fix, nullable array types are a pain. Does look legit though. ## [Fix `StarDifficulty` using inefficient struct equality](https://github.com/ppy/osu/commit/2db775ebb0bb9f18de67677ef84b993465d26545) Inspection: https://www.jetbrains.com/help/resharper/DefaultStructEqualityIsUsed.Global.html This is a dodgy one because there's no real sane way to define equality on `StarDifficulty` now that it has difficulty and performance attributes jammed into it. So I just basically shut the inspection up with a `record` modifier and move on. Unclear where the equality is used precisely. It's from a global inspection. F12 is very unhelpful when trying to track down usages of `Equals()`. We definitely have `Bindable<StarDifficulty>` instances and those do use equality. Maybe more than that. ## [Use `nameof` expressions to reference enum member names](https://github.com/ppy/osu/commit/aa08175c803bc725f3b15a92174dfe6d1b812d91) Inspection: https://www.jetbrains.com/help/resharper/CanSimplifyDictionaryRemovingWithSingleCall.html Pretty quaint. ## [Prefer using concrete values over `default` or `new()`](https://github.com/ppy/osu/commit/b21ee08d7748be10d42268d5c2eb77369026545d) Inspection: https://www.jetbrains.com/help/resharper/PreferConcreteValueOverDefault.html I could see this one going both ways, but I'm kinda sold on this inspection. Explicit is always better. Saves some allocations in the `CancellationToken` cases as well. ## [Explicitly call `.AsEnumerable()` in some realm usages](https://github.com/ppy/osu/commit/c8ce1ecd42b9d8abb8b9e2ab93d471f463e80401) Inspection: https://www.jetbrains.com/help/resharper/PossibleUnintendedQueryableAsEnumerable.html Not fully sold on this one but it's quick and simple so might as well. ## [Simplify dictionary removal with single `.Remove()` call](https://github.com/ppy/osu/commit/5964ceccea900302df726b7a8ecbf6b74eb2e427) Inspection: https://www.jetbrains.com/help/resharper/CanSimplifyDictionaryRemovingWithSingleCall.html Not much to say.
219 lines
7.2 KiB
C#
219 lines
7.2 KiB
C#
// 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.
|
|
|
|
#nullable disable
|
|
|
|
using System.Linq;
|
|
using NUnit.Framework;
|
|
using osu.Framework.Allocation;
|
|
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.Skinning.Legacy;
|
|
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 partial class TestSceneHyperDashColouring : OsuTestScene
|
|
{
|
|
[Resolved]
|
|
private SkinManager skins { get; set; }
|
|
|
|
[Test]
|
|
public void TestDefaultCatcherColour()
|
|
{
|
|
var skin = new TestSkin();
|
|
|
|
checkHyperDashCatcherColour(skin, Catcher.DEFAULT_HYPER_DASH_COLOUR);
|
|
}
|
|
|
|
[Test]
|
|
public void TestCustomCatcherColour()
|
|
{
|
|
var skin = new TestSkin
|
|
{
|
|
HyperDashColour = Color4.Goldenrod
|
|
};
|
|
|
|
checkHyperDashCatcherColour(skin, skin.HyperDashColour);
|
|
}
|
|
|
|
[Test]
|
|
public void TestCustomAfterImageColour()
|
|
{
|
|
var skin = new TestSkin
|
|
{
|
|
HyperDashAfterImageColour = Color4.Lime
|
|
};
|
|
|
|
checkHyperDashCatcherColour(skin, Catcher.DEFAULT_HYPER_DASH_COLOUR, skin.HyperDashAfterImageColour);
|
|
}
|
|
|
|
[Test]
|
|
public void TestCustomAfterImageColourPriority()
|
|
{
|
|
var skin = new TestSkin
|
|
{
|
|
HyperDashColour = Color4.Goldenrod,
|
|
HyperDashAfterImageColour = Color4.Lime
|
|
};
|
|
|
|
checkHyperDashCatcherColour(skin, skin.HyperDashColour, skin.HyperDashAfterImageColour);
|
|
}
|
|
|
|
[Test]
|
|
public void TestDefaultFruitColour()
|
|
{
|
|
var skin = new TestSkin();
|
|
|
|
checkHyperDashFruitColour(skin, Catcher.DEFAULT_HYPER_DASH_COLOUR);
|
|
}
|
|
|
|
[Test]
|
|
public void TestCustomFruitColour()
|
|
{
|
|
var skin = new TestSkin
|
|
{
|
|
HyperDashFruitColour = Color4.Cyan
|
|
};
|
|
|
|
checkHyperDashFruitColour(skin, skin.HyperDashFruitColour);
|
|
}
|
|
|
|
[Test]
|
|
public void TestCustomFruitColourPriority()
|
|
{
|
|
var skin = new TestSkin
|
|
{
|
|
HyperDashColour = Color4.Goldenrod,
|
|
HyperDashFruitColour = Color4.Cyan
|
|
};
|
|
|
|
checkHyperDashFruitColour(skin, skin.HyperDashFruitColour);
|
|
}
|
|
|
|
[Test]
|
|
public void TestFruitColourFallback()
|
|
{
|
|
var skin = new TestSkin
|
|
{
|
|
HyperDashColour = Color4.Goldenrod
|
|
};
|
|
|
|
checkHyperDashFruitColour(skin, skin.HyperDashColour);
|
|
}
|
|
|
|
private void checkHyperDashCatcherColour(ISkin skin, Color4 expectedCatcherColour, Color4? expectedAfterImageColour = null)
|
|
{
|
|
CatcherTrailDisplay trails = null;
|
|
Catcher catcher = null;
|
|
|
|
AddStep("create hyper-dashing catcher", () =>
|
|
{
|
|
CatcherArea catcherArea;
|
|
Child = setupSkinHierarchy(new Container
|
|
{
|
|
Anchor = Anchor.Centre,
|
|
Child = catcherArea = new CatcherArea
|
|
{
|
|
Catcher = catcher = new Catcher(new DroppedObjectContainer())
|
|
{
|
|
Scale = new Vector2(4)
|
|
}
|
|
}
|
|
}, skin);
|
|
trails = catcherArea.ChildrenOfType<CatcherTrailDisplay>().Single();
|
|
});
|
|
|
|
AddStep("start hyper-dash", () =>
|
|
{
|
|
catcher.SetHyperDashState(2);
|
|
});
|
|
|
|
AddUntilStep("catcher colour is correct", () => catcher.Colour == expectedCatcherColour);
|
|
|
|
AddAssert("catcher trails colours are correct", () => trails.HyperDashTrailsColour == expectedCatcherColour);
|
|
AddAssert("catcher after-image colours are correct", () => trails.HyperDashAfterImageColour == (expectedAfterImageColour ?? expectedCatcherColour));
|
|
|
|
AddStep("finish hyper-dashing", () =>
|
|
{
|
|
catcher.SetHyperDashState();
|
|
catcher.FinishTransforms();
|
|
});
|
|
|
|
AddAssert("catcher colour returned to white", () => catcher.Colour == Color4.White);
|
|
}
|
|
|
|
private void checkHyperDashFruitColour(ISkin skin, Color4 expectedColour)
|
|
{
|
|
DrawableFruit drawableFruit = null;
|
|
|
|
AddStep("create hyper-dash fruit", () =>
|
|
{
|
|
var fruit = new Fruit { HyperDashTarget = new Banana() };
|
|
fruit.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty());
|
|
|
|
Child = setupSkinHierarchy(drawableFruit = new DrawableFruit(fruit)
|
|
{
|
|
Anchor = Anchor.Centre,
|
|
Origin = Anchor.Centre,
|
|
Scale = new Vector2(4f),
|
|
}, skin);
|
|
});
|
|
|
|
AddAssert("hyper-dash colour is correct", () => checkLegacyFruitHyperDashColour(drawableFruit, expectedColour));
|
|
}
|
|
|
|
private Drawable setupSkinHierarchy(Drawable child, ISkin skin)
|
|
{
|
|
var legacySkinProvider = new SkinProvidingContainer(skins.GetSkin(DefaultLegacySkin.CreateInfo()));
|
|
var testSkinProvider = new SkinProvidingContainer(skin);
|
|
var legacySkinTransformer = new SkinProvidingContainer(new CatchLegacySkinTransformer(testSkinProvider));
|
|
|
|
return legacySkinProvider
|
|
.WithChild(testSkinProvider
|
|
.WithChild(legacySkinTransformer
|
|
.WithChild(child)));
|
|
}
|
|
|
|
private bool checkLegacyFruitHyperDashColour(DrawableFruit fruit, Color4 expectedColour) =>
|
|
fruit.ChildrenOfType<SkinnableDrawable>().First().Drawable.ChildrenOfType<Sprite>().Any(c => c.Colour == expectedColour);
|
|
|
|
private class TestSkin : LegacySkin
|
|
{
|
|
public Color4 HyperDashColour
|
|
{
|
|
get => Configuration.CustomColours[nameof(CatchSkinColour.HyperDash)];
|
|
set => Configuration.CustomColours[nameof(CatchSkinColour.HyperDash)] = value;
|
|
}
|
|
|
|
public Color4 HyperDashAfterImageColour
|
|
{
|
|
get => Configuration.CustomColours[nameof(CatchSkinColour.HyperDashAfterImage)];
|
|
set => Configuration.CustomColours[nameof(CatchSkinColour.HyperDashAfterImage)] = value;
|
|
}
|
|
|
|
public Color4 HyperDashFruitColour
|
|
{
|
|
get => Configuration.CustomColours[nameof(CatchSkinColour.HyperDashFruit)];
|
|
set => Configuration.CustomColours[nameof(CatchSkinColour.HyperDashFruit)] = value;
|
|
}
|
|
|
|
public TestSkin()
|
|
: base(new SkinInfo(), null, null, string.Empty)
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|