diff --git a/osu.Framework.Tests/Input/KeyCombinationModifierTest.cs b/osu.Framework.Tests/Input/KeyCombinationTest.cs similarity index 87% rename from osu.Framework.Tests/Input/KeyCombinationModifierTest.cs rename to osu.Framework.Tests/Input/KeyCombinationTest.cs index 06bf215f5a..618c260ce3 100644 --- a/osu.Framework.Tests/Input/KeyCombinationModifierTest.cs +++ b/osu.Framework.Tests/Input/KeyCombinationTest.cs @@ -7,7 +7,7 @@ namespace osu.Framework.Tests.Input { [TestFixture] - public class KeyCombinationModifierTest + public class KeyCombinationTest { private static readonly object[][] key_combination_display_test_cases = { @@ -50,5 +50,23 @@ public class KeyCombinationModifierTest [TestCaseSource(nameof(key_combination_display_test_cases))] public void TestLeftRightModifierHandling(KeyCombination candidate, KeyCombination pressed, KeyCombinationMatchingMode matchingMode, bool shouldContain) => Assert.AreEqual(shouldContain, KeyCombination.ContainsAll(candidate.Keys, pressed.Keys, matchingMode)); + + [Test] + public void TestCreationNoDuplicates() + { + var keyCombination = new KeyCombination(InputKey.A, InputKey.Control); + + Assert.That(keyCombination.Keys[0], Is.EqualTo(InputKey.Control)); + Assert.That(keyCombination.Keys[1], Is.EqualTo(InputKey.A)); + } + + [Test] + public void TestCreationWithDuplicates() + { + var keyCombination = new KeyCombination(InputKey.A, InputKey.Control, InputKey.A); + + Assert.That(keyCombination.Keys[0], Is.EqualTo(InputKey.Control)); + Assert.That(keyCombination.Keys[1], Is.EqualTo(InputKey.A)); + } } } diff --git a/osu.Framework/Input/Bindings/KeyCombination.cs b/osu.Framework/Input/Bindings/KeyCombination.cs index 76d3653f3c..138fefec2c 100644 --- a/osu.Framework/Input/Bindings/KeyCombination.cs +++ b/osu.Framework/Input/Bindings/KeyCombination.cs @@ -39,15 +39,23 @@ public KeyCombination(ICollection? keys) var keyBuilder = ImmutableArray.CreateBuilder(keys.Count); + bool hadDuplicates = false; + foreach (var key in keys) { - if (!keyBuilder.Contains(key)) - keyBuilder.Add(key); + if (keyBuilder.Contains(key)) + { + // This changes the expected count meaning we can't use the optimised MoveToImmutable() method. + hadDuplicates = true; + continue; + } + + keyBuilder.Add(key); } keyBuilder.Sort(); - Keys = keyBuilder.MoveToImmutable(); + Keys = hadDuplicates ? keyBuilder.ToImmutableArray() : keyBuilder.MoveToImmutable(); } ///