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.
264 lines
9.1 KiB
C#
264 lines
9.1 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.
|
|
|
|
using NUnit.Framework;
|
|
using osu.Framework.IO.Stores;
|
|
using osu.Game.Rulesets;
|
|
using osu.Game.Rulesets.Osu;
|
|
using osu.Game.Tests.Beatmaps;
|
|
using osu.Game.Tests.Resources;
|
|
using static osu.Game.Skinning.SkinConfiguration;
|
|
|
|
namespace osu.Game.Tests.Gameplay
|
|
{
|
|
public partial class TestSceneHitObjectSamples : HitObjectSampleTest
|
|
{
|
|
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
|
|
protected override IResourceStore<byte[]> RulesetResources => TestResources.GetStore();
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which provides no custom sample set retrieves samples from the user skin.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestDefaultSampleFromUserSkin()
|
|
{
|
|
const string expected_sample = "normal-hitnormal";
|
|
|
|
SetupSkins(expected_sample, expected_sample);
|
|
|
|
CreateTestWithBeatmap("hitobject-skin-sample.osu");
|
|
|
|
AssertUserLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which provides a sample set of 1 retrieves samples from the beatmap skin.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestDefaultSampleFromBeatmap()
|
|
{
|
|
const string expected_sample = "normal-hitnormal";
|
|
|
|
SetupSkins(expected_sample, expected_sample);
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-sample.osu");
|
|
|
|
AssertBeatmapLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which provides a sample set of 1 retrieves samples from the user skin when the beatmap does not contain the sample.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestDefaultSampleFromUserSkinFallback()
|
|
{
|
|
const string expected_sample = "normal-hitnormal";
|
|
|
|
SetupSkins(null, expected_sample);
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-sample.osu");
|
|
|
|
AssertUserLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which provides a custom sample set of 2 retrieves the following samples from the beatmap skin:
|
|
/// normal-hitnormal2
|
|
/// hitnormal
|
|
/// </summary>
|
|
[TestCase("normal-hitnormal2")]
|
|
[TestCase("hitnormal")]
|
|
public void TestDefaultCustomSampleFromBeatmap(string expectedSample)
|
|
{
|
|
SetupSkins(expectedSample, expectedSample);
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-custom-sample.osu");
|
|
|
|
AssertBeatmapLookup(expectedSample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which provides a custom sample set of 2 retrieves the following samples from the user skin
|
|
/// (ignoring the custom sample set index) when the beatmap skin does not contain the sample:
|
|
/// normal-hitnormal
|
|
/// hitnormal
|
|
/// </summary>
|
|
[TestCase("normal-hitnormal")]
|
|
[TestCase("hitnormal")]
|
|
public void TestDefaultCustomSampleFromUserSkinFallback(string expectedSample)
|
|
{
|
|
SetupSkins(string.Empty, expectedSample);
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-custom-sample.osu");
|
|
|
|
AssertUserLookup(expectedSample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which provides a custom sample set of 2 does not retrieve a normal-hitnormal2 sample from the user skin
|
|
/// if the beatmap skin does not contain the sample.
|
|
/// User skins in stable ignore the custom sample set index when performing lookups.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestUserSkinLookupIgnoresSampleBank()
|
|
{
|
|
const string unwanted_sample = "normal-hitnormal2";
|
|
|
|
SetupSkins(string.Empty, unwanted_sample);
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-custom-sample.osu");
|
|
|
|
AssertNoLookup(unwanted_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which provides a sample file retrieves the sample file from the beatmap skin.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestFileSampleFromBeatmap()
|
|
{
|
|
const string expected_sample = "hit_1.wav";
|
|
|
|
SetupSkins(expected_sample, expected_sample);
|
|
|
|
CreateTestWithBeatmap("file-beatmap-sample.osu");
|
|
|
|
AssertBeatmapLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject which specifies a specific sample file which doesn't exist (or isn't allowed to be looked up)
|
|
/// falls back to a normal sample.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestFileSampleFallsBackToNormal()
|
|
{
|
|
const string expected_sample = "normal-hitnormal";
|
|
|
|
SetupSkins(null, expected_sample);
|
|
|
|
CreateTestWithBeatmap("file-beatmap-sample.osu");
|
|
|
|
AssertUserLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a default hitobject and control point causes <see cref="TestDefaultSampleFromUserSkin"/>.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestControlPointSampleFromSkin()
|
|
{
|
|
const string expected_sample = "normal-hitnormal";
|
|
|
|
SetupSkins(expected_sample, expected_sample);
|
|
|
|
CreateTestWithBeatmap("controlpoint-skin-sample.osu");
|
|
|
|
AssertUserLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a control point that provides a custom sample set of 1 causes <see cref="TestDefaultSampleFromBeatmap"/>.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestControlPointSampleFromBeatmap()
|
|
{
|
|
const string expected_sample = "normal-hitnormal";
|
|
|
|
SetupSkins(expected_sample, expected_sample);
|
|
|
|
CreateTestWithBeatmap("controlpoint-beatmap-sample.osu");
|
|
|
|
AssertBeatmapLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a control point that provides a custom sample of 2 causes <see cref="TestDefaultCustomSampleFromBeatmap"/>.
|
|
/// </summary>
|
|
[TestCase("normal-hitnormal2")]
|
|
[TestCase("hitnormal")]
|
|
public void TestControlPointCustomSampleFromBeatmap(string sampleName)
|
|
{
|
|
SetupSkins(sampleName, sampleName);
|
|
|
|
CreateTestWithBeatmap("controlpoint-beatmap-custom-sample.osu");
|
|
|
|
AssertBeatmapLookup(sampleName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that a hitobject's custom sample overrides the control point's.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestHitObjectCustomSampleOverride()
|
|
{
|
|
const string expected_sample = "normal-hitnormal3";
|
|
|
|
SetupSkins(expected_sample, expected_sample);
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-custom-sample-override.osu");
|
|
|
|
AssertBeatmapLookup(expected_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that when a custom sample bank is used, both the normal and additional sounds will be looked up.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestHitObjectCustomSampleBank()
|
|
{
|
|
string[] expectedSamples =
|
|
{
|
|
"normal-hitnormal2",
|
|
"normal-hitwhistle" // user skin lookups ignore custom sample set index
|
|
};
|
|
|
|
SetupSkins(expectedSamples[0], expectedSamples[1]);
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-custom-sample-bank.osu");
|
|
|
|
AssertBeatmapLookup(expectedSamples[0]);
|
|
AssertUserLookup(expectedSamples[1]);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that when a custom sample bank is used, but <see cref="LegacySetting.LayeredHitSounds"/> is disabled,
|
|
/// only the additional sound will be looked up.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestHitObjectCustomSampleBankWithoutLayered()
|
|
{
|
|
const string expected_sample = "normal-hitwhistle2";
|
|
const string unwanted_sample = "normal-hitnormal2";
|
|
|
|
SetupSkins(expected_sample, unwanted_sample);
|
|
disableLayeredHitSounds();
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-custom-sample-bank.osu");
|
|
|
|
AssertBeatmapLookup(expected_sample);
|
|
AssertNoLookup(unwanted_sample);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that when a normal sample bank is used and <see cref="LegacySetting.LayeredHitSounds"/> is disabled,
|
|
/// the normal sound will be looked up anyway.
|
|
/// </summary>
|
|
[Test]
|
|
public void TestHitObjectNormalSampleBankWithoutLayered()
|
|
{
|
|
const string expected_sample = "normal-hitnormal";
|
|
|
|
SetupSkins(expected_sample, expected_sample);
|
|
disableLayeredHitSounds();
|
|
|
|
CreateTestWithBeatmap("hitobject-beatmap-sample.osu");
|
|
|
|
AssertBeatmapLookup(expected_sample);
|
|
}
|
|
|
|
private void disableLayeredHitSounds()
|
|
=> AddStep("set LayeredHitSounds to false", () => Skin.Configuration.ConfigDictionary[nameof(LegacySetting.LayeredHitSounds)] = "0");
|
|
}
|
|
}
|