Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mcs / class / corlib / Test / System.Collections / CaseInsensitiveHashCodeProviderTest.cs
1 //
2 // CaseInsensitiveHashCodeProviderTest
3 //
4 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
5 //
6
7 using System;
8 using System.Collections;
9 using System.Globalization;
10 using System.IO;
11 using System.Runtime.Serialization;
12 using System.Runtime.Serialization.Formatters;
13 using System.Runtime.Serialization.Formatters.Binary;
14 using System.Threading;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.System.Collections
19 {
20         [TestFixture]
21         public class CaseInsensitiveHashCodeProviderTest
22         {
23                 private CultureInfo old_culture;
24
25                 [SetUp]
26                 public void SetUp ()
27                 {
28                         old_culture = Thread.CurrentThread.CurrentCulture;
29                 }
30
31                 [TearDown]
32                 public void TearDown ()
33                 {
34                         Thread.CurrentThread.CurrentCulture = old_culture;
35                 }
36
37                 [Test]
38                 public void Default ()
39                 {
40                         CaseInsensitiveHashCodeProvider cih = new CaseInsensitiveHashCodeProvider (
41                                 CultureInfo.CurrentCulture);
42                         int h1 = cih.GetHashCode ("Test String");
43
44                         cih = CaseInsensitiveHashCodeProvider.Default;
45                         int h2 = cih.GetHashCode ("Test String");
46
47                         Assert.AreEqual (h1, h2, "#1");
48
49                         Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US");
50                         CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.Default;
51                         Thread.CurrentThread.CurrentCulture = new CultureInfo ("nl-BE");
52                         CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.Default;
53                         Assert.IsFalse (object.ReferenceEquals (cih1, cih2), "#2");
54                 }
55
56                 [Test]
57                 public void Default_MS ()
58                 {
59                         // MS always returns new instance
60                         CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.Default;
61                         CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.Default;
62                         Assert.IsFalse (object.ReferenceEquals (cih1, cih2));
63                 }
64
65                 [Test]
66                 public void DefaultInvariant ()
67                 {
68                         CaseInsensitiveHashCodeProvider cih = new CaseInsensitiveHashCodeProvider (
69                                 CultureInfo.InvariantCulture);
70                         int h1 = cih.GetHashCode ("Test String");
71
72                         cih = CaseInsensitiveHashCodeProvider.DefaultInvariant;
73                         int h2 = cih.GetHashCode ("Test String");
74
75                         Assert.AreEqual (h1, h2, "#1");
76
77                         CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.DefaultInvariant;
78                         CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.DefaultInvariant;
79                         Assert.IsTrue (object.ReferenceEquals (cih1, cih2));
80                 }
81
82                 [Test]
83                 public void HashCode ()
84                 {
85                         CaseInsensitiveHashCodeProvider cih = new CaseInsensitiveHashCodeProvider ();
86                         int h1 = cih.GetHashCode ("Test String");
87                         int h2 = cih.GetHashCode ("test string");
88                         int h3 = cih.GetHashCode ("TEST STRING");
89
90                         Assert.IsTrue (h1 == h2, "Mixed Case != lower case");
91                         Assert.IsTrue (h1 == h3, "Mixed Case != UPPER CASE");
92
93                         h1 = cih.GetHashCode ("one");
94                         h2 = cih.GetHashCode ("another");
95                         // Actually this is quite possible.
96                         Assert.IsFalse (h1 == h2);
97                 }
98
99                 [Test]
100                 public void Constructor0_Serialization ()
101                 {
102                         CaseInsensitiveHashCodeProvider cihcp = new CaseInsensitiveHashCodeProvider ();
103                         BinaryFormatter bf = new BinaryFormatter ();
104                         MemoryStream ms = new MemoryStream ();
105                         bf.Serialize (ms, cihcp);
106                         byte[] ser1 = ms.ToArray ();
107
108                         cihcp = new CaseInsensitiveHashCodeProvider (CultureInfo.CurrentCulture);
109                         ms = new MemoryStream ();
110                         bf.Serialize (ms, cihcp);
111                         byte[] ser2 = ms.ToArray ();
112
113                         cihcp = CaseInsensitiveHashCodeProvider.Default;
114                         ms = new MemoryStream ();
115                         bf.Serialize (ms, cihcp);
116                         byte[] ser3 = ms.ToArray ();
117
118                         Assert.AreEqual (ser1, ser2, "#1");
119                         Assert.AreEqual (ser2, ser3, "#2");
120                 }
121
122                 [Test]
123                 public void Constructor1_Culture_Null ()
124                 {
125                         try {
126                                 new CaseInsensitiveHashCodeProvider ((CultureInfo) null);
127                                 Assert.Fail ("#1");
128                         } catch (ArgumentNullException ex) {
129                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
130                                 Assert.IsNull (ex.InnerException, "#3");
131                                 Assert.IsNotNull (ex.Message, "#4");
132                                 Assert.IsNotNull (ex.ParamName, "#5");
133                                 Assert.AreEqual ("culture", ex.ParamName, "#6");
134                         }
135                 }
136
137                 [Test]
138                 public void Constructor1_Serialization ()
139                 {
140                         CaseInsensitiveHashCodeProvider cihcp = new CaseInsensitiveHashCodeProvider (CultureInfo.InvariantCulture);
141                         BinaryFormatter bf = new BinaryFormatter ();
142                         MemoryStream ms = new MemoryStream ();
143                         bf.Serialize (ms, cihcp);
144                         byte[] ser1 = ms.ToArray ();
145
146                         cihcp = CaseInsensitiveHashCodeProvider.DefaultInvariant;
147                         ms = new MemoryStream ();
148                         bf.Serialize (ms, cihcp);
149                         byte[] ser2 = ms.ToArray ();
150
151                         Assert.AreEqual (ser1, ser2, "#1");
152                 }
153
154                 [Test]
155                 public void SerializationRoundtrip ()
156                 {
157                         CaseInsensitiveHashCodeProvider enus = new CaseInsensitiveHashCodeProvider (new CultureInfo ("en-US"));
158                         BinaryFormatter bf = new BinaryFormatter ();
159                         MemoryStream ms = new MemoryStream ();
160                         bf.Serialize (ms, enus);
161
162                         ms.Position = 0;
163                         CaseInsensitiveHashCodeProvider clone = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
164                         Assert.AreEqual (enus.GetHashCode (String.Empty), clone.GetHashCode (String.Empty), "GetHashCode(string)");
165                         Assert.AreEqual (enus.GetHashCode (Int32.MinValue), clone.GetHashCode (Int32.MinValue), "GetHashCode(int)");
166                 }
167
168                 [Test]
169                 public void Deserialize ()
170                 {
171                         BinaryFormatter bf = new BinaryFormatter ();
172
173                         MemoryStream ms = new MemoryStream (serialized_en_us);
174                         CaseInsensitiveHashCodeProvider enus = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
175                         Assert.IsNotNull (enus, "en-US");
176
177                         ms = new MemoryStream (serialized_fr_ca);
178                         CaseInsensitiveHashCodeProvider frca = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
179                         Assert.IsNotNull (frca, "fr-CA");
180                 }
181
182                 private static byte [] serialized_en_us = new byte [] {
183                         0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 
184                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x32, 0x53, 0x79, 0x73, 
185                         0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 
186                         0x43, 0x61, 0x73, 0x65, 0x49, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48, 
187                         0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x01, 
188                         0x00, 0x00, 0x00, 0x06, 0x6D, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x03, 0x1D, 0x53, 0x79, 0x73, 0x74,
189                         0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E,
190                         0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x09, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02,
191                         0x00, 0x00, 0x00, 0x1D, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61,
192                         0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66,
193                         0x6F, 0x06, 0x00, 0x00, 0x00, 0x0F, 0x6D, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x53, 0x65, 0x70, 0x61,
194                         0x72, 0x61, 0x74, 0x6F, 0x72, 0x0C, 0x6D, 0x5F, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4F, 0x6E,
195                         0x6C, 0x79, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x43, 0x75, 0x6C, 0x74, 0x75, 0x72, 0x65,
196                         0x4E, 0x61, 0x6D, 0x65, 0x0B, 0x6D, 0x5F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6D,
197                         0x11, 0x6D, 0x5F, 0x75, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4F, 0x76, 0x65, 0x72, 0x72, 0x69,
198                         0x64, 0x65, 0x0D, 0x6D, 0x5F, 0x77, 0x69, 0x6E, 0x33, 0x32, 0x4C, 0x61, 0x6E, 0x67, 0x49, 0x44,
199                         0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x01, 0x08, 0x0A, 0x00, 0x0A, 0x29, 0x00, 0x00,
200                         0x00, 0x01, 0x09, 0x04, 0x00, 0x00, 0x0B 
201                 };
202
203                 private static byte [] serialized_fr_ca = new byte [] {
204                         0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 
205                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x32, 0x53, 0x79, 0x73, 
206                         0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 
207                         0x43, 0x61, 0x73, 0x65, 0x49, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48, 
208                         0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x01, 
209                         0x00, 0x00, 0x00, 0x06, 0x6D, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x03, 0x1D, 0x53, 0x79, 0x73, 0x74, 
210                         0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 
211                         0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x09, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 
212                         0x00, 0x00, 0x00, 0x1D, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 
213                         0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66, 
214                         0x6F, 0x06, 0x00, 0x00, 0x00, 0x0F, 0x6D, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x53, 0x65, 0x70, 0x61, 
215                         0x72, 0x61, 0x74, 0x6F, 0x72, 0x0C, 0x6D, 0x5F, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4F, 0x6E, 
216                         0x6C, 0x79, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x43, 0x75, 0x6C, 0x74, 0x75, 0x72, 0x65, 
217                         0x4E, 0x61, 0x6D, 0x65, 0x0B, 0x6D, 0x5F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6D, 
218                         0x11, 0x6D, 0x5F, 0x75, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4F, 0x76, 0x65, 0x72, 0x72, 0x69, 
219                         0x64, 0x65, 0x0D, 0x6D, 0x5F, 0x77, 0x69, 0x6E, 0x33, 0x32, 0x4C, 0x61, 0x6E, 0x67, 0x49, 0x44, 
220                         0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x01, 0x08, 0x0A, 0x00, 0x0A, 0x50, 0x00, 0x00, 
221                         0x00, 0x01, 0x0C, 0x0C, 0x00, 0x00, 0x0B 
222                 };
223         }
224 }