1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Collections.Generic; 6 using Xunit; 7 8 namespace System.Globalization.Tests 9 { 10 public class CompareInfoIsSuffixTests 11 { 12 private static CompareInfo s_invariantCompare = CultureInfo.InvariantCulture.CompareInfo; 13 private static CompareInfo s_hungarianCompare = new CultureInfo("hu-HU").CompareInfo; 14 private static CompareInfo s_turkishCompare = new CultureInfo("tr-TR").CompareInfo; 15 IsSuffix_TestData()16 public static IEnumerable<object[]> IsSuffix_TestData() 17 { 18 // Empty strings 19 yield return new object[] { s_invariantCompare, "foo", "", CompareOptions.None, true }; 20 yield return new object[] { s_invariantCompare, "", "", CompareOptions.None, true }; 21 22 // Long strings 23 yield return new object[] { s_invariantCompare, new string('a', 5555), "aaaaaaaaaaaaaaa", CompareOptions.None, true }; 24 yield return new object[] { s_invariantCompare, new string('a', 5555), new string('a', 5000), CompareOptions.None, true }; 25 yield return new object[] { s_invariantCompare, new string('a', 5555), new string('a', 5000) + "b", CompareOptions.None, false }; 26 27 // Hungarian 28 yield return new object[] { s_hungarianCompare, "foobardzsdzs", "rddzs", CompareOptions.Ordinal, false }; 29 yield return new object[] { s_invariantCompare, "foobardzsdzs", "rddzs", CompareOptions.None, false }; 30 yield return new object[] { s_invariantCompare, "foobardzsdzs", "rddzs", CompareOptions.Ordinal, false }; 31 32 // Turkish 33 yield return new object[] { s_turkishCompare, "Hi", "I", CompareOptions.None, false }; 34 yield return new object[] { s_turkishCompare, "Hi", "I", CompareOptions.IgnoreCase, false }; 35 yield return new object[] { s_turkishCompare, "Hi", "\u0130", CompareOptions.None, false }; 36 yield return new object[] { s_turkishCompare, "Hi", "\u0130", CompareOptions.IgnoreCase, true }; 37 yield return new object[] { s_invariantCompare, "Hi", "I", CompareOptions.None, false }; 38 yield return new object[] { s_invariantCompare, "Hi", "I", CompareOptions.IgnoreCase, true }; 39 yield return new object[] { s_invariantCompare, "Hi", "\u0130", CompareOptions.None, false }; 40 yield return new object[] { s_invariantCompare, "Hi", "\u0130", CompareOptions.IgnoreCase, false }; 41 42 // Unicode 43 yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "A\u0300", CompareOptions.None, true }; 44 yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "A\u0300", CompareOptions.Ordinal, false }; 45 yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "a\u0300", CompareOptions.None, false }; 46 yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "a\u0300", CompareOptions.IgnoreCase, true }; 47 yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "a\u0300", CompareOptions.Ordinal, false }; 48 yield return new object[] { s_invariantCompare, "Exhibit \u00C0", "a\u0300", CompareOptions.OrdinalIgnoreCase, false }; 49 yield return new object[] { s_invariantCompare, "FooBar", "Foo\u0400Bar", CompareOptions.Ordinal, false }; 50 yield return new object[] { s_invariantCompare, "FooBA\u0300R", "FooB\u00C0R", CompareOptions.IgnoreNonSpace, true }; 51 52 // Ignore symbols 53 yield return new object[] { s_invariantCompare, "More Test's", "Tests", CompareOptions.IgnoreSymbols, true }; 54 yield return new object[] { s_invariantCompare, "More Test's", "Tests", CompareOptions.None, false }; 55 56 // Platform differences 57 yield return new object[] { s_hungarianCompare, "foobardzsdzs", "rddzs", CompareOptions.None, PlatformDetection.IsWindows ? true : false }; 58 } 59 60 [Theory] 61 [MemberData(nameof(IsSuffix_TestData))] IsSuffix(CompareInfo compareInfo, string source, string value, CompareOptions options, bool expected)62 public void IsSuffix(CompareInfo compareInfo, string source, string value, CompareOptions options, bool expected) 63 { 64 if (options == CompareOptions.None) 65 { 66 Assert.Equal(expected, compareInfo.IsSuffix(source, value)); 67 } 68 Assert.Equal(expected, compareInfo.IsSuffix(source, value, options)); 69 } 70 71 [Fact] IsSuffix_UnassignedUnicode()72 public void IsSuffix_UnassignedUnicode() 73 { 74 bool result = PlatformDetection.IsWindows ? true : false; 75 76 IsSuffix(s_invariantCompare, "FooBar", "Foo\uFFFFBar", CompareOptions.None, result); 77 IsSuffix(s_invariantCompare, "FooBar", "Foo\uFFFFBar", CompareOptions.IgnoreNonSpace, result); 78 } 79 80 [Fact] IsSuffix_Invalid()81 public void IsSuffix_Invalid() 82 { 83 // Source is null 84 AssertExtensions.Throws<ArgumentNullException>("source", () => s_invariantCompare.IsSuffix(null, "")); 85 AssertExtensions.Throws<ArgumentNullException>("source", () => s_invariantCompare.IsSuffix(null, "", CompareOptions.None)); 86 87 // Prefix is null 88 AssertExtensions.Throws<ArgumentNullException>("suffix", () => s_invariantCompare.IsSuffix("", null)); 89 AssertExtensions.Throws<ArgumentNullException>("suffix", () => s_invariantCompare.IsSuffix("", null, CompareOptions.None)); 90 91 // Source and prefix are null 92 AssertExtensions.Throws<ArgumentNullException>("source", () => s_invariantCompare.IsSuffix(null, null)); 93 AssertExtensions.Throws<ArgumentNullException>("source", () => s_invariantCompare.IsSuffix(null, null, CompareOptions.None)); 94 95 // Options are invalid 96 AssertExtensions.Throws<ArgumentException>("options", () => s_invariantCompare.IsSuffix("Test's", "Tests", CompareOptions.StringSort)); 97 AssertExtensions.Throws<ArgumentException>("options", () => s_invariantCompare.IsSuffix("Test's", "Tests", CompareOptions.Ordinal | CompareOptions.IgnoreWidth)); 98 AssertExtensions.Throws<ArgumentException>("options", () => s_invariantCompare.IsSuffix("Test's", "Tests", CompareOptions.OrdinalIgnoreCase | CompareOptions.IgnoreWidth)); 99 AssertExtensions.Throws<ArgumentException>("options", () => s_invariantCompare.IsSuffix("Test's", "Tests", (CompareOptions)(-1))); 100 AssertExtensions.Throws<ArgumentException>("options", () => s_invariantCompare.IsSuffix("Test's", "Tests", (CompareOptions)0x11111111)); 101 } 102 } 103 } 104