2 // CaseInsensitiveHashCodeProviderTest
4 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 using System.Collections;
9 using System.Globalization;
11 using System.Runtime.Serialization;
12 using System.Runtime.Serialization.Formatters;
13 using System.Runtime.Serialization.Formatters.Binary;
14 using System.Threading;
16 using NUnit.Framework;
18 namespace MonoTests.System.Collections
21 public class CaseInsensitiveHashCodeProviderTest
23 private CultureInfo old_culture;
28 old_culture = Thread.CurrentThread.CurrentCulture;
32 public void TearDown ()
34 Thread.CurrentThread.CurrentCulture = old_culture;
38 public void Default ()
40 CaseInsensitiveHashCodeProvider cih = new CaseInsensitiveHashCodeProvider (
41 CultureInfo.CurrentCulture);
42 int h1 = cih.GetHashCode ("Test String");
44 cih = CaseInsensitiveHashCodeProvider.Default;
45 int h2 = cih.GetHashCode ("Test String");
47 Assert.AreEqual (h1, h2, "#1");
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");
57 [Category ("NotDotNet")]
58 public void Default_Mono ()
60 // we return same instance if current culture did not change
61 CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.Default;
62 CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.Default;
63 Assert.IsTrue (object.ReferenceEquals (cih1, cih2));
67 [Category ("NotWorking")]
68 public void Default_MS ()
70 // MS always returns new instance
71 CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.Default;
72 CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.Default;
73 Assert.IsFalse (object.ReferenceEquals (cih1, cih2));
78 public void DefaultInvariant ()
80 CaseInsensitiveHashCodeProvider cih = new CaseInsensitiveHashCodeProvider (
81 CultureInfo.InvariantCulture);
82 int h1 = cih.GetHashCode ("Test String");
84 cih = CaseInsensitiveHashCodeProvider.DefaultInvariant;
85 int h2 = cih.GetHashCode ("Test String");
87 Assert.AreEqual (h1, h2, "#1");
89 CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.DefaultInvariant;
90 CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.DefaultInvariant;
91 Assert.IsTrue (object.ReferenceEquals (cih1, cih2));
96 public void HashCode ()
98 CaseInsensitiveHashCodeProvider cih = new CaseInsensitiveHashCodeProvider ();
99 int h1 = cih.GetHashCode ("Test String");
100 int h2 = cih.GetHashCode ("test string");
101 int h3 = cih.GetHashCode ("TEST STRING");
103 Assert.IsTrue (h1 == h2, "Mixed Case != lower case");
104 Assert.IsTrue (h1 == h3, "Mixed Case != UPPER CASE");
106 h1 = cih.GetHashCode ("one");
107 h2 = cih.GetHashCode ("another");
108 // Actually this is quite possible.
109 Assert.IsFalse (h1 == h2);
113 public void Constructor0_Serialization ()
115 CaseInsensitiveHashCodeProvider cihcp = new CaseInsensitiveHashCodeProvider ();
116 BinaryFormatter bf = new BinaryFormatter ();
117 MemoryStream ms = new MemoryStream ();
118 bf.Serialize (ms, cihcp);
119 byte[] ser1 = ms.ToArray ();
121 cihcp = new CaseInsensitiveHashCodeProvider (CultureInfo.CurrentCulture);
122 ms = new MemoryStream ();
123 bf.Serialize (ms, cihcp);
124 byte[] ser2 = ms.ToArray ();
126 cihcp = CaseInsensitiveHashCodeProvider.Default;
127 ms = new MemoryStream ();
128 bf.Serialize (ms, cihcp);
129 byte[] ser3 = ms.ToArray ();
131 Assert.AreEqual (ser1, ser2, "#1");
132 Assert.AreEqual (ser2, ser3, "#2");
136 public void Constructor1_Culture_Null ()
139 new CaseInsensitiveHashCodeProvider ((CultureInfo) null);
141 } catch (ArgumentNullException ex) {
142 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
143 Assert.IsNull (ex.InnerException, "#3");
144 Assert.IsNotNull (ex.Message, "#4");
145 Assert.IsNotNull (ex.ParamName, "#5");
146 Assert.AreEqual ("culture", ex.ParamName, "#6");
152 public void Constructor1_Serialization ()
154 CaseInsensitiveHashCodeProvider cihcp = new CaseInsensitiveHashCodeProvider (CultureInfo.InvariantCulture);
155 BinaryFormatter bf = new BinaryFormatter ();
156 MemoryStream ms = new MemoryStream ();
157 bf.Serialize (ms, cihcp);
158 byte[] ser1 = ms.ToArray ();
160 cihcp = CaseInsensitiveHashCodeProvider.DefaultInvariant;
161 ms = new MemoryStream ();
162 bf.Serialize (ms, cihcp);
163 byte[] ser2 = ms.ToArray ();
165 Assert.AreEqual (ser1, ser2, "#1");
170 public void SerializationRoundtrip ()
172 CaseInsensitiveHashCodeProvider enus = new CaseInsensitiveHashCodeProvider (new CultureInfo ("en-US"));
173 BinaryFormatter bf = new BinaryFormatter ();
174 MemoryStream ms = new MemoryStream ();
175 bf.Serialize (ms, enus);
178 CaseInsensitiveHashCodeProvider clone = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
179 Assert.AreEqual (enus.GetHashCode (String.Empty), clone.GetHashCode (String.Empty), "GetHashCode(string)");
180 Assert.AreEqual (enus.GetHashCode (Int32.MinValue), clone.GetHashCode (Int32.MinValue), "GetHashCode(int)");
184 public void Deserialize ()
187 BinaryFormatter bf = (BinaryFormatter)vmw.@internal.remoting.BinaryFormatterUtils.CreateBinaryFormatter (false);
189 BinaryFormatter bf = new BinaryFormatter ();
192 MemoryStream ms = new MemoryStream (serialized_en_us);
193 CaseInsensitiveHashCodeProvider enus = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
194 Assert.IsNotNull (enus, "en-US");
196 ms = new MemoryStream (serialized_fr_ca);
197 CaseInsensitiveHashCodeProvider frca = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
198 Assert.IsNotNull (frca, "fr-CA");
201 private static byte [] serialized_en_us = new byte [] {
203 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x32, 0x53, 0x79, 0x73,
205 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E,
206 0x43, 0x61, 0x73, 0x65, 0x49, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48,
207 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x01,
208 0x00, 0x00, 0x00, 0x06, 0x6D, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x03, 0x1D, 0x53, 0x79, 0x73, 0x74,
209 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E,
210 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x09, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02,
211 0x00, 0x00, 0x00, 0x1D, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61,
212 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66,
213 0x6F, 0x06, 0x00, 0x00, 0x00, 0x0F, 0x6D, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x53, 0x65, 0x70, 0x61,
214 0x72, 0x61, 0x74, 0x6F, 0x72, 0x0C, 0x6D, 0x5F, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4F, 0x6E,
215 0x6C, 0x79, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x43, 0x75, 0x6C, 0x74, 0x75, 0x72, 0x65,
216 0x4E, 0x61, 0x6D, 0x65, 0x0B, 0x6D, 0x5F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6D,
217 0x11, 0x6D, 0x5F, 0x75, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4F, 0x76, 0x65, 0x72, 0x72, 0x69,
218 0x64, 0x65, 0x0D, 0x6D, 0x5F, 0x77, 0x69, 0x6E, 0x33, 0x32, 0x4C, 0x61, 0x6E, 0x67, 0x49, 0x44,
219 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x01, 0x08, 0x0A, 0x00, 0x0A, 0x29, 0x00, 0x00,
220 0x00, 0x01, 0x09, 0x04, 0x00, 0x00, 0x0B
222 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x32, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F,
224 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x43, 0x61, 0x73, 0x65, 0x49, 0x6E,
225 0x73, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64,
226 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x01, 0x00, 0x00, 0x00, 0x06, 0x6D, 0x5F,
227 0x74, 0x65, 0x78, 0x74, 0x03, 0x1D, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F,
228 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49,
229 0x6E, 0x66, 0x6F, 0x09, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x53, 0x79,
230 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69,
231 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x03, 0x00, 0x00, 0x00, 0x0B,
232 0x6D, 0x5F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6D, 0x11, 0x6D, 0x5F, 0x75, 0x73,
233 0x65, 0x55, 0x73, 0x65, 0x72, 0x4F, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x0D, 0x6D, 0x5F,
234 0x77, 0x69, 0x6E, 0x33, 0x32, 0x4C, 0x61, 0x6E, 0x67, 0x49, 0x44, 0x00, 0x00, 0x00, 0x08, 0x01,
235 0x08, 0x29, 0x00, 0x00, 0x00, 0x01, 0x09, 0x04, 0x00, 0x00, 0x0B
239 private static byte [] serialized_fr_ca = new byte [] {
241 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x32, 0x53, 0x79, 0x73,
243 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E,
244 0x43, 0x61, 0x73, 0x65, 0x49, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48,
245 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x01,
246 0x00, 0x00, 0x00, 0x06, 0x6D, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x03, 0x1D, 0x53, 0x79, 0x73, 0x74,
247 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E,
248 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x09, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02,
249 0x00, 0x00, 0x00, 0x1D, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61,
250 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66,
251 0x6F, 0x06, 0x00, 0x00, 0x00, 0x0F, 0x6D, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x53, 0x65, 0x70, 0x61,
252 0x72, 0x61, 0x74, 0x6F, 0x72, 0x0C, 0x6D, 0x5F, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4F, 0x6E,
253 0x6C, 0x79, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x43, 0x75, 0x6C, 0x74, 0x75, 0x72, 0x65,
254 0x4E, 0x61, 0x6D, 0x65, 0x0B, 0x6D, 0x5F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6D,
255 0x11, 0x6D, 0x5F, 0x75, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4F, 0x76, 0x65, 0x72, 0x72, 0x69,
256 0x64, 0x65, 0x0D, 0x6D, 0x5F, 0x77, 0x69, 0x6E, 0x33, 0x32, 0x4C, 0x61, 0x6E, 0x67, 0x49, 0x44,
257 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x01, 0x08, 0x0A, 0x00, 0x0A, 0x50, 0x00, 0x00,
258 0x00, 0x01, 0x0C, 0x0C, 0x00, 0x00, 0x0B
260 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x32, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F,
262 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x43, 0x61, 0x73, 0x65, 0x49, 0x6E,
263 0x73, 0x65, 0x6E, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64,
264 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x01, 0x00, 0x00, 0x00, 0x06, 0x6D, 0x5F,
265 0x74, 0x65, 0x78, 0x74, 0x03, 0x1D, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F,
266 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49,
267 0x6E, 0x66, 0x6F, 0x09, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x53, 0x79,
268 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69,
269 0x6F, 0x6E, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x03, 0x00, 0x00, 0x00, 0x0B,
270 0x6D, 0x5F, 0x6E, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6D, 0x11, 0x6D, 0x5F, 0x75, 0x73,
271 0x65, 0x55, 0x73, 0x65, 0x72, 0x4F, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x0D, 0x6D, 0x5F,
272 0x77, 0x69, 0x6E, 0x33, 0x32, 0x4C, 0x61, 0x6E, 0x67, 0x49, 0x44, 0x00, 0x00, 0x00, 0x08, 0x01,
273 0x08, 0x50, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x0C, 0x00, 0x00, 0x0B