Improve test coverage for Span-based globalization APIs (dotnet/corefx#41224)
authorJan Kotas <jkotas@microsoft.com>
Mon, 7 Oct 2019 23:22:34 +0000 (16:22 -0700)
committerGitHub <noreply@github.com>
Mon, 7 Oct 2019 23:22:34 +0000 (16:22 -0700)
* Improve test coverage for Span-based globalization APIs

* More interesting test cases

Commit migrated from https://github.com/dotnet/corefx/commit/14d971cdeb7b625bb7b753d48760f2cb98b32358

src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTests.IndexOf.cs
src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTests.IsPrefix.cs
src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTests.IsSuffix.cs
src/libraries/System.Globalization/tests/CompareInfo/CompareInfoTests.LastIndexOf.cs
src/libraries/System.Globalization/tests/Invariant/InvariantMode.cs

index 78da2f0..72422cd 100644 (file)
@@ -13,6 +13,7 @@ namespace System.Globalization.Tests
         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()
         {
@@ -36,6 +37,11 @@ namespace System.Globalization.Tests
             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 };
@@ -55,6 +61,7 @@ namespace System.Globalization.Tests
             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 };
@@ -176,7 +183,16 @@ namespace System.Globalization.Tests
             }
             // 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)
         {
index b886e8c..a9a93c5 100644 (file)
@@ -94,6 +94,13 @@ namespace System.Globalization.Tests
                 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]
index 3e70c0f..3d920dd 100644 (file)
@@ -13,6 +13,7 @@ namespace System.Globalization.Tests
         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()
         {
@@ -33,6 +34,11 @@ namespace System.Globalization.Tests
             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 };
@@ -91,6 +97,13 @@ namespace System.Globalization.Tests
                 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]
index cd90b17..9026f88 100644 (file)
@@ -12,6 +12,7 @@ namespace System.Globalization.Tests
         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()
         {
@@ -47,6 +48,11 @@ namespace System.Globalization.Tests
             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 };
@@ -67,6 +73,7 @@ namespace System.Globalization.Tests
             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 };
@@ -149,6 +156,30 @@ namespace System.Globalization.Tests
             }
             // 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)
index 59394c2..2ea617b 100644 (file)
@@ -657,6 +657,7 @@ namespace System.Globalization.Tests
             {
                 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)));
             }
         }
 
@@ -668,6 +669,21 @@ namespace System.Globalization.Tests
             {
                 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)));
             }
         }
 
@@ -679,6 +695,7 @@ namespace System.Globalization.Tests
             {
                 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)));
             }
         }
 
@@ -690,6 +707,7 @@ namespace System.Globalization.Tests
             {
                 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)));
             }
         }