99f515fab030d2f1e0a5d803168a2c2b41bdbefb
[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                 [Category ("NotDotNet")]
58                 public void Default_Mono ()
59                 {
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));
64                 }
65
66                 [Test]
67                 [Category ("NotWorking")]
68                 public void Default_MS ()
69                 {
70                         // MS always returns new instance
71                         CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.Default;
72                         CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.Default;
73                         Assert.IsFalse (object.ReferenceEquals (cih1, cih2));
74                 }
75
76 #if NET_2_0
77                 [Test]
78                 public void DefaultInvariant ()
79                 {
80                         CaseInsensitiveHashCodeProvider cih = new CaseInsensitiveHashCodeProvider (
81                                 CultureInfo.InvariantCulture);
82                         int h1 = cih.GetHashCode ("Test String");
83
84                         cih = CaseInsensitiveHashCodeProvider.DefaultInvariant;
85                         int h2 = cih.GetHashCode ("Test String");
86
87                         Assert.AreEqual (h1, h2, "#1");
88
89                         CaseInsensitiveHashCodeProvider cih1 = CaseInsensitiveHashCodeProvider.DefaultInvariant;
90                         CaseInsensitiveHashCodeProvider cih2 = CaseInsensitiveHashCodeProvider.DefaultInvariant;
91                         Assert.IsTrue (object.ReferenceEquals (cih1, cih2));
92                 }
93 #endif
94
95                 [Test]
96                 public void HashCode ()
97                 {
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");
102
103                         Assert.IsTrue (h1 == h2, "Mixed Case != lower case");
104                         Assert.IsTrue (h1 == h3, "Mixed Case != UPPER CASE");
105
106                         h1 = cih.GetHashCode ("one");
107                         h2 = cih.GetHashCode ("another");
108                         // Actually this is quite possible.
109                         Assert.IsFalse (h1 == h2);
110                 }
111
112                 [Test]
113                 public void Constructor0_Serialization ()
114                 {
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 ();
120
121                         cihcp = new CaseInsensitiveHashCodeProvider (CultureInfo.CurrentCulture);
122                         ms = new MemoryStream ();
123                         bf.Serialize (ms, cihcp);
124                         byte[] ser2 = ms.ToArray ();
125
126                         cihcp = CaseInsensitiveHashCodeProvider.Default;
127                         ms = new MemoryStream ();
128                         bf.Serialize (ms, cihcp);
129                         byte[] ser3 = ms.ToArray ();
130
131                         Assert.AreEqual (ser1, ser2, "#1");
132                         Assert.AreEqual (ser2, ser3, "#2");
133                 }
134
135                 [Test]
136                 public void Constructor1_Culture_Null ()
137                 {
138                         try {
139                                 new CaseInsensitiveHashCodeProvider ((CultureInfo) null);
140                                 Assert.Fail ("#1");
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");
147                         }
148                 }
149
150 #if NET_2_0
151                 [Test]
152                 public void Constructor1_Serialization ()
153                 {
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 ();
159
160                         cihcp = CaseInsensitiveHashCodeProvider.DefaultInvariant;
161                         ms = new MemoryStream ();
162                         bf.Serialize (ms, cihcp);
163                         byte[] ser2 = ms.ToArray ();
164
165                         Assert.AreEqual (ser1, ser2, "#1");
166                 }
167 #endif
168
169                 [Test]
170                 public void SerializationRoundtrip ()
171                 {
172                         CaseInsensitiveHashCodeProvider enus = new CaseInsensitiveHashCodeProvider (new CultureInfo ("en-US"));
173                         BinaryFormatter bf = new BinaryFormatter ();
174                         MemoryStream ms = new MemoryStream ();
175                         bf.Serialize (ms, enus);
176
177                         ms.Position = 0;
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)");
181                 }
182
183                 [Test]
184                 public void Deserialize ()
185                 {
186 #if TARGET_JVM
187                         BinaryFormatter bf = (BinaryFormatter)vmw.@internal.remoting.BinaryFormatterUtils.CreateBinaryFormatter (false);
188 #else
189                         BinaryFormatter bf = new BinaryFormatter ();
190 #endif // TARGET_JVM
191
192                         MemoryStream ms = new MemoryStream (serialized_en_us);
193                         CaseInsensitiveHashCodeProvider enus = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
194                         Assert.IsNotNull (enus, "en-US");
195
196                         ms = new MemoryStream (serialized_fr_ca);
197                         CaseInsensitiveHashCodeProvider frca = (CaseInsensitiveHashCodeProvider) bf.Deserialize (ms);
198                         Assert.IsNotNull (frca, "fr-CA");
199                 }
200
201                 private static byte [] serialized_en_us = new byte [] {
202 #if NET_2_0
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 
221 #else
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
236 #endif
237                 };
238
239                 private static byte [] serialized_fr_ca = new byte [] {
240 #if NET_2_0
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 
259 #else
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
274 #endif
275                 };
276         }
277 }