private static CompareInfo s_currentCompare = CultureInfo.CurrentCulture.CompareInfo;
private static CompareInfo s_hungarianCompare = new CultureInfo("hu-HU").CompareInfo;
private static CompareInfo s_turkishCompare = new CultureInfo("tr-TR").CompareInfo;
+ private static CompareInfo s_slovakCompare = new CultureInfo("sk-SK").CompareInfo;
public static IEnumerable<object[]> IndexOf_TestData()
{
yield return new object[] { s_invariantCompare, "foobardzsdzs", "rddzs", 0, 12, CompareOptions.None, -1 };
yield return new object[] { s_invariantCompare, "foobardzsdzs", "rddzs", 0, 12, CompareOptions.Ordinal, -1 };
+ // Slovak
+ yield return new object[] { s_slovakCompare, "ch", "h", 0, 2, CompareOptions.None, -1 };
+ yield return new object[] { s_slovakCompare, "chodit hore", "HO", 0, 2, CompareOptions.IgnoreCase, -1 };
+ yield return new object[] { s_slovakCompare, "chh", "h", 0, 3, CompareOptions.None, 2 };
+
// Turkish
yield return new object[] { s_turkishCompare, "Hi", "I", 0, 2, CompareOptions.None, -1 };
yield return new object[] { s_turkishCompare, "Hi", "I", 0, 2, CompareOptions.IgnoreCase, -1 };
yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "a\u0300", 0, 9, CompareOptions.OrdinalIgnoreCase, -1 };
yield return new object[] { s_invariantCompare, "FooBar", "Foo\u0400Bar", 0, 6, CompareOptions.Ordinal, -1 };
yield return new object[] { s_invariantCompare, "TestFooBA\u0300R", "FooB\u00C0R", 0, 11, CompareOptions.IgnoreNonSpace, 4 };
+ yield return new object[] { s_invariantCompare, "o\u0308", "o", 0, 2, CompareOptions.None, -1 };
// Ignore symbols
yield return new object[] { s_invariantCompare, "More Test's", "Tests", 0, 11, CompareOptions.IgnoreSymbols, 5 };
}
// Use IndexOf(string, string, int, int, CompareOptions)
Assert.Equal(expected, compareInfo.IndexOf(source, value, startIndex, count, options));
- }
+
+ if ((compareInfo == s_invariantCompare) && ((options == CompareOptions.None) || (options == CompareOptions.IgnoreCase)))
+ {
+ StringComparison stringComparison = (options == CompareOptions.IgnoreCase) ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture;
+ // Use int string.IndexOf(string, StringComparison)
+ Assert.Equal(expected, source.IndexOf(value, startIndex, count, stringComparison));
+ // Use int MemoryExtensions.IndexOf(this ReadOnlySpan<char>, ReadOnlySpan<char>, StringComparison)
+ Assert.Equal((expected == -1) ? -1 : (expected - startIndex), source.AsSpan(startIndex, count).IndexOf(value.AsSpan(), stringComparison));
+ }
+ }
private static void IndexOf_Char(CompareInfo compareInfo, string source, char value, int startIndex, int count, CompareOptions options, int expected)
{
Assert.Equal(expected, compareInfo.IsPrefix(source, value));
}
Assert.Equal(expected, compareInfo.IsPrefix(source, value, options));
+
+ if ((compareInfo == s_invariantCompare) && ((options == CompareOptions.None) || (options == CompareOptions.IgnoreCase)))
+ {
+ StringComparison stringComparison = (options == CompareOptions.IgnoreCase) ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture;
+ Assert.Equal(expected, source.StartsWith(value, stringComparison));
+ Assert.Equal(expected, source.AsSpan().StartsWith(value.AsSpan(), stringComparison));
+ }
}
[Fact]
private static CompareInfo s_hungarianCompare = new CultureInfo("hu-HU").CompareInfo;
private static CompareInfo s_turkishCompare = new CultureInfo("tr-TR").CompareInfo;
private static CompareInfo s_frenchCompare = new CultureInfo("fr-FR").CompareInfo;
+ private static CompareInfo s_slovakCompare = new CultureInfo("sk-SK").CompareInfo;
public static IEnumerable<object[]> IsSuffix_TestData()
{
yield return new object[] { s_hungarianCompare, "dz", "z", CompareOptions.None, false };
yield return new object[] { s_hungarianCompare, "dz", "z", CompareOptions.Ordinal, true };
+ // Slovak
+ yield return new object[] { s_slovakCompare, "ch", "h", CompareOptions.None, false };
+ yield return new object[] { s_slovakCompare, "velmi chora", "hora", CompareOptions.None, false };
+ yield return new object[] { s_slovakCompare, "chh", "H", CompareOptions.IgnoreCase, true };
+
// Turkish
yield return new object[] { s_turkishCompare, "Hi", "I", CompareOptions.None, false };
yield return new object[] { s_turkishCompare, "Hi", "I", CompareOptions.IgnoreCase, false };
Assert.Equal(expected, compareInfo.IsSuffix(source, value));
}
Assert.Equal(expected, compareInfo.IsSuffix(source, value, options));
+
+ if ((compareInfo == s_invariantCompare) && ((options == CompareOptions.None) || (options == CompareOptions.IgnoreCase)))
+ {
+ StringComparison stringComparison = (options == CompareOptions.IgnoreCase) ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture;
+ Assert.Equal(expected, source.EndsWith(value, stringComparison));
+ Assert.Equal(expected, source.AsSpan().EndsWith(value.AsSpan(), stringComparison));
+ }
}
[Fact]
private static CompareInfo s_invariantCompare = CultureInfo.InvariantCulture.CompareInfo;
private static CompareInfo s_hungarianCompare = new CultureInfo("hu-HU").CompareInfo;
private static CompareInfo s_turkishCompare = new CultureInfo("tr-TR").CompareInfo;
+ private static CompareInfo s_slovakCompare = new CultureInfo("sk-SK").CompareInfo;
public static IEnumerable<object[]> LastIndexOf_TestData()
{
yield return new object[] { s_invariantCompare, "foobardzsdzs", "rddzs", 11, 12, CompareOptions.None, -1 };
yield return new object[] { s_invariantCompare, "foobardzsdzs", "rddzs", 11, 12, CompareOptions.Ordinal, -1 };
+ // Slovak
+ yield return new object[] { s_slovakCompare, "ch", "h", 0, 1, CompareOptions.None, -1 };
+ yield return new object[] { s_slovakCompare, "hore chodit", "HO", 11, 12, CompareOptions.IgnoreCase, 0 };
+ yield return new object[] { s_slovakCompare, "chh", "h", 2, 2, CompareOptions.None, 2 };
+
// Turkish
yield return new object[] { s_turkishCompare, "Hi", "I", 1, 2, CompareOptions.None, -1 };
yield return new object[] { s_turkishCompare, "Hi", "I", 1, 2, CompareOptions.IgnoreCase, -1 };
yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "a\u0300", 8, 9, CompareOptions.Ordinal, -1 };
yield return new object[] { s_invariantCompare, "FooBar", "Foo\u0400Bar", 5, 6, CompareOptions.Ordinal, -1 };
yield return new object[] { s_invariantCompare, "TestFooBA\u0300R", "FooB\u00C0R", 10, 11, CompareOptions.IgnoreNonSpace, 4 };
+ yield return new object[] { s_invariantCompare, "o\u0308", "o", 1, 2, CompareOptions.None, -1 };
// Ignore symbols
yield return new object[] { s_invariantCompare, "More Test's", "Tests", 10, 11, CompareOptions.IgnoreSymbols, 5 };
}
// Use LastIndexOf(string, string, int, int, CompareOptions)
Assert.Equal(expected, compareInfo.LastIndexOf(source, value, startIndex, count, options));
+
+ if ((compareInfo == s_invariantCompare) && ((options == CompareOptions.None) || (options == CompareOptions.IgnoreCase)))
+ {
+ StringComparison stringComparison = (options == CompareOptions.IgnoreCase) ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture;
+
+ // Use int string.LastIndexOf(string, StringComparison)
+ Assert.Equal(expected, source.LastIndexOf(value, startIndex, count, stringComparison));
+
+ // Use int MemoryExtensions.LastIndexOf(this ReadOnlySpan<char>, ReadOnlySpan<char>, StringComparison)
+ // Filter differences betweeen string-based and Span-based LastIndexOf
+ // - Empty value handling - https://github.com/dotnet/coreclr/issues/26608
+ // - Negative count
+ if (value.Length == 0 || count < 0)
+ return;
+
+ if (startIndex == source.Length)
+ {
+ startIndex--;
+ if (count > 0)
+ count--;
+ }
+ int leftStartIndex = (startIndex - count + 1);
+ Assert.Equal((expected == -1) ? -1 : (expected - leftStartIndex), source.AsSpan(leftStartIndex, count).LastIndexOf(value.AsSpan(), stringComparison));
+ }
}
private static void LastIndexOf_Char(CompareInfo compareInfo, string source, char value, int startIndex, int count, CompareOptions options, int expected)
{
Assert.Equal(result, CultureInfo.GetCultureInfo(cul).CompareInfo.IndexOf(source, value, startIndex, count, options));
Assert.Equal(result, source.IndexOf(value, startIndex, count, GetStringComparison(options)));
+ Assert.Equal((result == -1) ? -1 : (result - startIndex), source.AsSpan(startIndex, count).IndexOf(value.AsSpan(), GetStringComparison(options)));
}
}
{
Assert.Equal(result, CultureInfo.GetCultureInfo(cul).CompareInfo.LastIndexOf(source, value, startIndex, count, options));
Assert.Equal(result, source.LastIndexOf(value, startIndex, count, GetStringComparison(options)));
+
+ // Filter differences betweeen string-based and Span-based LastIndexOf
+ // - Empty value handling - https://github.com/dotnet/coreclr/issues/26608
+ // - Negative count
+ if (value.Length == 0 || count < 0)
+ continue;
+
+ if (startIndex == source.Length)
+ {
+ startIndex--;
+ if (count > 0)
+ count--;
+ }
+ int leftStartIndex = (startIndex - count + 1);
+ Assert.Equal((result == -1) ? -1 : (result - leftStartIndex), source.AsSpan(leftStartIndex, count).LastIndexOf(value.AsSpan(), GetStringComparison(options)));
}
}
{
Assert.Equal(result, CultureInfo.GetCultureInfo(cul).CompareInfo.IsPrefix(source, value, options));
Assert.Equal(result, source.StartsWith(value, GetStringComparison(options)));
+ Assert.Equal(result, source.AsSpan().StartsWith(value.AsSpan(), GetStringComparison(options)));
}
}
{
Assert.Equal(result, CultureInfo.GetCultureInfo(cul).CompareInfo.IsSuffix(source, value, options));
Assert.Equal(result, source.EndsWith(value, GetStringComparison(options)));
+ Assert.Equal(result, source.AsSpan().EndsWith(value.AsSpan(), GetStringComparison(options)));
}
}