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