public static void PartialEquals_ReturnsPrefixLength_ValueType() { int[] arr1 = new int[] { 1, 2, 3 }; int[] arr2 = new int[] { 1, 2, 6 }; Assert.Equal(2, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2)); Assert.Equal(2, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, null)); Assert.Equal(2, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, EqualityComparer <int> .Default)); Assert.Equal(2, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, NonDefaultEqualityComparer <int> .Instance)); Assert.Equal(2, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2)); Assert.Equal(2, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, null)); Assert.Equal(2, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, EqualityComparer <int> .Default)); Assert.Equal(2, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, NonDefaultEqualityComparer <int> .Instance)); // Vectorized code path arr1 = new int[] { 1, 2, 3, 4, 5 }; arr2 = new int[] { 1, 2, 3, 6, 7 }; Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, null)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, EqualityComparer <int> .Default)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, NonDefaultEqualityComparer <int> .Instance)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, null)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, EqualityComparer <int> .Default)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, NonDefaultEqualityComparer <int> .Instance)); }
public static void PartialEquals_ReturnsPrefixLength_Byte() { byte[] arr1 = new byte[] { 1, 2, 3, 4, 5 }; byte[] arr2 = new byte[] { 1, 2, 3, 6, 7 }; Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2, null)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2, EqualityComparer <byte> .Default)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2, NonDefaultEqualityComparer <byte> .Instance)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2, null)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2, EqualityComparer <byte> .Default)); Assert.Equal(3, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2, NonDefaultEqualityComparer <byte> .Instance)); // Vectorized code path arr1 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; arr2 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 42, 15, 16, 17 }; Assert.Equal(13, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2)); Assert.Equal(13, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2, null)); Assert.Equal(13, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2, EqualityComparer <byte> .Default)); Assert.Equal(13, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <byte>)arr1, arr2, NonDefaultEqualityComparer <byte> .Instance)); Assert.Equal(13, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2)); Assert.Equal(13, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2, null)); Assert.Equal(13, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2, EqualityComparer <byte> .Default)); Assert.Equal(13, MemoryExtensions.CommonPrefixLength((Span <byte>)arr1, arr2, NonDefaultEqualityComparer <byte> .Instance)); }
private static void ValidateWithDefaultValues <T>(int length1, int length2, IEqualityComparer <T> customComparer, int expected) { Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <T>) new T[length1], new T[length2])); Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <T>) new T[length1], new T[length2], null)); Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <T>) new T[length1], new T[length2], EqualityComparer <T> .Default)); Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <T>) new T[length1], new T[length2], customComparer)); Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((Span <T>) new T[length1], new T[length2])); Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((Span <T>) new T[length1], new T[length2], null)); Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((Span <T>) new T[length1], new T[length2], EqualityComparer <T> .Default)); Assert.Equal(expected, MemoryExtensions.CommonPrefixLength((Span <T>) new T[length1], new T[length2], customComparer)); }
public static void Comparer_UsedInComparisons_ValueType() { int[] arr1 = new[] { 1, 2, 3, 4, 5, 6 }; int[] arr2 = new[] { -1, 2, -3, 4, -7, -8 }; Assert.Equal(4, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, AbsoluteValueComparer.Instance)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, AbsoluteValueComparer.Instance)); Assert.Equal(0, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, NonDefaultEqualityComparer <int> .Instance)); Assert.Equal(0, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, NonDefaultEqualityComparer <int> .Instance)); Assert.Equal(0, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <int>)arr1, arr2, EqualityComparer <int> .Default)); Assert.Equal(0, MemoryExtensions.CommonPrefixLength((Span <int>)arr1, arr2, EqualityComparer <int> .Default)); }
public static void Comparer_UsedInComparisons_ReferenceType() { string[] arr1 = new string[] { null, "a", null, "b", "c", "d", "e" }; string[] arr2 = new string[] { null, "A", null, "B", "F", "G", "H" }; Assert.Equal(4, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <string>)arr1, arr2, StringComparer.OrdinalIgnoreCase)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((Span <string>)arr1, arr2, StringComparer.OrdinalIgnoreCase)); Assert.Equal(1, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <string>)arr1, arr2, NonDefaultEqualityComparer <string> .Instance)); Assert.Equal(1, MemoryExtensions.CommonPrefixLength((Span <string>)arr1, arr2, NonDefaultEqualityComparer <string> .Instance)); Assert.Equal(1, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <string>)arr1, arr2, EqualityComparer <string> .Default)); Assert.Equal(1, MemoryExtensions.CommonPrefixLength((Span <string>)arr1, arr2, EqualityComparer <string> .Default)); }
public static void PartialEquals_ReturnsPrefixLength_ReferenceType() { string[] arr1 = new string[] { null, "a", null, "b", "c", "d", "e" }; string[] arr2 = new string[] { null, "a", null, "b", "f", "g", "h" }; Assert.Equal(4, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <string>)arr1, arr2)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <string>)arr1, arr2, null)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <string>)arr1, arr2, EqualityComparer <string> .Default)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((ReadOnlySpan <string>)arr1, arr2, NonDefaultEqualityComparer <string> .Instance)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((Span <string>)arr1, arr2)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((Span <string>)arr1, arr2, null)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((Span <string>)arr1, arr2, EqualityComparer <string> .Default)); Assert.Equal(4, MemoryExtensions.CommonPrefixLength((Span <string>)arr1, arr2, NonDefaultEqualityComparer <string> .Instance)); }