diff --git a/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs b/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs index e2096638f7..d1dc7cd557 100644 --- a/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs +++ b/Assets/Tests/InputSystem/Utilities/ArrayHelperTests.cs @@ -118,6 +118,23 @@ public void Utilities_IndexOfReference__IsUsingReferenceEqualsAndConstrainedBySt Assert.AreEqual(2, arr.IndexOfReference(arr[2], 1, 3)); } + [Test] + [Category("Utilities")] + public void Utilities_HaveDuplicateReferences_DetectsDuplicatesInFullRange() + { + var withDup = new object[] { new object(), new object(), new object() }; + withDup[2] = withDup[0]; // duplicate at 0 and 2 + Assert.That(withDup.HaveDuplicateReferences(0, 3), Is.True); + + var noDup = new object[] { new object(), new object(), new object() }; + Assert.That(noDup.HaveDuplicateReferences(0, 3), Is.False); + + // Regression test for ISXB-1792: inner loop was "n < count - i" so later pairs were never checked + var dupAtEnd = new object[] { new object(), new object(), new object(), new object() }; + dupAtEnd[3] = dupAtEnd[2]; // duplicate at 2 and 3 + Assert.That(dupAtEnd.HaveDuplicateReferences(0, 4), Is.True); + } + [Test] [Category("Utilities")] public void Utilities_IndexOfPredicate__IsUsingPredicateForEqualityAndConstraintedByStartIndexAndCount() diff --git a/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs b/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs index 54a4972495..81308623e5 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs @@ -120,7 +120,7 @@ public static bool HaveDuplicateReferences(this TFirst[] first, int inde for (var i = 0; i < count; ++i) { var element = first[i]; - for (var n = i + 1; n < count - i; ++n) + for (var n = i + 1; n < count; ++n) { if (ReferenceEquals(element, first[n])) return true;