2009-05-27 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / corlib / Test / System.Globalization / CultureInfoTest.cs
1 //
2 // System.Globalization.CultureInfo Test Cases
3 //
4 // Authors:
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 // (c) 2005 Novell, Inc. (http://www.novell.com)
8 //
9
10 using System;
11 using System.Globalization;
12 using System.IO;
13 using System.Runtime.Serialization.Formatters.Binary;
14 using System.Threading;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.System.Globalization
19 {
20         [TestFixture]
21         public class CultureInfoTest
22         {
23                 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 Constructor0 ()
39                 {
40                         CultureInfo ci = new CultureInfo (2067);
41                         Assert.IsFalse (ci.IsReadOnly, "#1");
42                         Assert.AreEqual (2067, ci.LCID, "#2");
43                         Assert.AreEqual ("nl-BE", ci.Name, "#3");
44                         Assert.IsTrue (ci.UseUserOverride, "#4");
45                 }
46
47                 [Test]
48                 public void Constructor0_Identifier_Negative ()
49                 {
50                         try {
51                                 new CultureInfo (-1);
52                                 Assert.Fail ("#1");
53                         } catch (ArgumentOutOfRangeException ex) {
54                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
55                                 Assert.IsNull (ex.InnerException, "#3");
56                                 Assert.IsNotNull (ex.Message, "#4");
57                                 Assert.IsNotNull (ex.ParamName, "#5");
58                                 Assert.AreEqual ("culture", ex.ParamName, "#6");
59                         }
60                 }
61
62                 [Test]
63                 public void Constructor1 ()
64                 {
65                         CultureInfo ci = new CultureInfo ("nl-BE");
66                         Assert.IsFalse (ci.IsReadOnly, "#1");
67                         Assert.AreEqual (2067, ci.LCID, "#2");
68                         Assert.AreEqual ("nl-BE", ci.Name, "#3");
69                         Assert.IsTrue (ci.UseUserOverride, "#4");
70                 }
71
72                 [Test]
73                 public void Constructor1_Name_Null ()
74                 {
75                         try {
76                                 new CultureInfo ((string) null);
77                                 Assert.Fail ("#1");
78                         } catch (ArgumentNullException ex) {
79                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
80                                 Assert.IsNull (ex.InnerException, "#3");
81                                 Assert.IsNotNull (ex.Message, "#4");
82                                 Assert.IsNotNull (ex.ParamName, "#5");
83                                 Assert.AreEqual ("name", ex.ParamName, "#6");
84                         }
85                 }
86
87                 [Test]
88                 public void Constructor2 ()
89                 {
90                         CultureInfo ci = new CultureInfo (2067, false);
91                         Assert.IsFalse (ci.IsReadOnly, "#A1");
92                         Assert.AreEqual (2067, ci.LCID, "#A2");
93                         Assert.AreEqual ("nl-BE", ci.Name, "#A3");
94                         Assert.IsFalse (ci.UseUserOverride, "#A4");
95
96                         ci = new CultureInfo (2067, true);
97                         Assert.IsFalse (ci.IsReadOnly, "#B1");
98                         Assert.AreEqual (2067, ci.LCID, "#B2");
99                         Assert.AreEqual ("nl-BE", ci.Name, "#B3");
100                         Assert.IsTrue (ci.UseUserOverride, "#B4");
101                 }
102
103                 [Test]
104                 public void Constructor2_Identifier_Negative ()
105                 {
106                         try {
107                                 new CultureInfo (-1, false);
108                                 Assert.Fail ("#1");
109                         } catch (ArgumentOutOfRangeException ex) {
110                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
111                                 Assert.IsNull (ex.InnerException, "#3");
112                                 Assert.IsNotNull (ex.Message, "#4");
113                                 Assert.IsNotNull (ex.ParamName, "#5");
114                                 Assert.AreEqual ("culture", ex.ParamName, "#6");
115                         }
116                 }
117
118                 [Test]
119                 public void Constructor3 ()
120                 {
121                         CultureInfo ci = new CultureInfo ("nl-BE", false);
122                         Assert.IsFalse (ci.IsReadOnly, "#A1");
123                         Assert.AreEqual (2067, ci.LCID, "#A2");
124                         Assert.AreEqual ("nl-BE", ci.Name, "#A3");
125                         Assert.IsFalse (ci.UseUserOverride, "#A4");
126
127                         ci = new CultureInfo ("nl-BE", true);
128                         Assert.IsFalse (ci.IsReadOnly, "#B1");
129                         Assert.AreEqual (2067, ci.LCID, "#B2");
130                         Assert.AreEqual ("nl-BE", ci.Name, "#B3");
131                         Assert.IsTrue (ci.UseUserOverride, "#B4");
132                 }
133
134                 [Test]
135                 public void Constructor3_Name_Null ()
136                 {
137                         try {
138                                 new CultureInfo ((string) null, false);
139                                 Assert.Fail ("#1");
140                         } catch (ArgumentNullException ex) {
141                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
142                                 Assert.IsNull (ex.InnerException, "#3");
143                                 Assert.IsNotNull (ex.Message, "#4");
144                                 Assert.IsNotNull (ex.ParamName, "#5");
145                                 Assert.AreEqual ("name", ex.ParamName, "#6");
146                         }
147                 }
148
149                 [Test]
150                 public void DateTimeFormat_Neutral_Culture ()
151                 {
152                         CultureInfo ci = new CultureInfo ("nl");
153                         try {
154                                 DateTimeFormatInfo dfi = ci.DateTimeFormat;
155                                 Assert.Fail ("#1:" + (dfi != null));
156                         } catch (NotSupportedException ex) {
157                                 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
158                                 Assert.IsNull (ex.InnerException, "#3");
159                                 Assert.IsNotNull (ex.Message, "#4");
160                         }
161                 }
162
163                 [Test] // bug #72081
164                 public void GetAllCulturesInvariant ()
165                 {
166                         CultureInfo invariant = CultureInfo.InvariantCulture;
167                         CultureInfo [] infos = CultureInfo.GetCultures (CultureTypes.AllCultures);
168                         foreach (CultureInfo culture in infos) {
169                                 if (culture.Equals (invariant))
170                                         return;
171                         }
172
173                         Assert.Fail ("InvariantCulture not found in the array from GetCultures()");
174                 }
175
176                 [Test]
177                 [ExpectedException (typeof (NotSupportedException))]
178                 public void TrySetNeutralCultureNotInvariant ()
179                 {
180                         Thread.CurrentThread.CurrentCulture = new CultureInfo ("ar");
181                 }
182
183                 [Test]
184                 [Category ("TargetJvmNotWorking")] //OptionalCalendars not yet supported for TARGET_JVM.
185                 // make sure that all CultureInfo holds non-null calendars.
186                 public void OptionalCalendars ()
187                 {
188                         foreach (CultureInfo ci in CultureInfo.GetCultures (
189                                 CultureTypes.AllCultures))
190                                 Assert.IsNotNull (ci.OptionalCalendars, String.Format ("{0} {1}",
191                                         ci.LCID, ci.Name));
192                 }
193
194                 [Test] // bug #77347
195                 public void CloneNeutral ()
196                 {
197                         CultureInfo culture = new CultureInfo ("en");
198                         CultureInfo cultureClone = culture.Clone () as CultureInfo;
199                         Assert.IsTrue (culture.Equals (cultureClone));
200                 }
201
202                 [Test] // bug #81930
203                 public void IsReadOnly ()
204                 {
205                         CultureInfo ci;
206
207                         ci = new CultureInfo ("en-US");
208                         Assert.IsFalse (ci.IsReadOnly, "#A1");
209                         Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#A2");
210                         Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#A3");
211                         ci.NumberFormat.NumberGroupSeparator = ",";
212                         ci.NumberFormat = new NumberFormatInfo ();
213                         ci.DateTimeFormat.DateSeparator = "/";
214                         ci.DateTimeFormat = new DateTimeFormatInfo ();
215                         Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#A4");
216                         Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#A5");
217
218                         ci = new CultureInfo (CultureInfo.InvariantCulture.LCID);
219                         Assert.IsFalse (ci.IsReadOnly, "#B1");
220                         Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#B2");
221                         Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#B3");
222                         ci.NumberFormat.NumberGroupSeparator = ",";
223                         ci.NumberFormat = new NumberFormatInfo ();
224                         ci.DateTimeFormat.DateSeparator = "/";
225                         ci.DateTimeFormat = new DateTimeFormatInfo ();
226                         Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#B4");
227                         Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#B5");
228
229                         ci = CultureInfo.CurrentCulture;
230                         Assert.IsTrue (ci.IsReadOnly, "#C1:" + ci.DisplayName);
231                         Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#C2");
232                         Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#C3");
233                         try {
234                                 ci.NumberFormat.NumberGroupSeparator = ",";
235                                 Assert.Fail ("#C4");
236                         } catch (InvalidOperationException ex) {
237                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C5");
238                                 Assert.IsNull (ex.InnerException, "#C6");
239                                 Assert.IsNotNull (ex.Message, "#C7");
240                         }
241
242                         ci = CultureInfo.CurrentUICulture;
243                         Assert.IsTrue (ci.IsReadOnly, "#D1");
244                         Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#D2");
245                         Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#D3");
246                         try {
247                                 ci.NumberFormat.NumberGroupSeparator = ",";
248                                 Assert.Fail ("#D4");
249                         } catch (InvalidOperationException ex) {
250                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D5");
251                                 Assert.IsNull (ex.InnerException, "#D6");
252                                 Assert.IsNotNull (ex.Message, "#D7");
253                         }
254
255                         ci = CultureInfo.InvariantCulture;
256                         Assert.IsTrue (ci.IsReadOnly, "#F1");
257                         Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#F2");
258                         Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#F3");
259                         try {
260                                 ci.NumberFormat.NumberGroupSeparator = ",";
261                                 Assert.Fail ("#F4");
262                         } catch (InvalidOperationException ex) {
263                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F5");
264                                 Assert.IsNull (ex.InnerException, "#F6");
265                                 Assert.IsNotNull (ex.Message, "#F7");
266                         }
267
268                         ci = new CultureInfo (string.Empty);
269                         Assert.IsFalse (ci.IsReadOnly, "#G1");
270                         Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#G2");
271                         Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#G3");
272                         ci.NumberFormat.NumberGroupSeparator = ",";
273                         ci.NumberFormat = new NumberFormatInfo ();
274                         ci.DateTimeFormat.DateSeparator = "/";
275                         ci.DateTimeFormat = new DateTimeFormatInfo ();
276                         Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#G4");
277                         Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#G5");
278                 }
279
280                 [Test]
281                 public void IsReadOnly_GetCultures ()
282                 {
283                         foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
284                                 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
285                                 Assert.IsFalse (ci.IsReadOnly, "#1:" + cultureMsg);
286                                 if (ci.IsNeutralCulture)
287                                         continue;
288                                 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
289                                 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
290                         }
291                 }
292
293                 [Test]
294                 [Category ("NotWorking")]
295                 public void IsReadOnly_InstalledUICulture ()
296                 {
297                         CultureInfo ci = CultureInfo.InstalledUICulture;
298                         Assert.IsTrue (ci.IsReadOnly, "#1");
299                         Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#2");
300                         Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#3");
301                         try {
302                                 ci.NumberFormat.NumberGroupSeparator = ",";
303                                 Assert.Fail ("#4");
304                         } catch (InvalidOperationException ex) {
305                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#5");
306                                 Assert.IsNull (ex.InnerException, "#6");
307                                 Assert.IsNotNull (ex.Message, "#7");
308                         }
309                 }
310
311                 [Test] // bug #69652
312                 public void Norwegian ()
313                 {
314                         new CultureInfo ("no");
315                         new CultureInfo ("nb-NO");
316                         new CultureInfo ("nn-NO");
317                 }
318
319                 [Test]
320                 public void NumberFormat_Neutral_Culture ()
321                 {
322                         CultureInfo ci = new CultureInfo ("nl");
323                         try {
324                                 NumberFormatInfo nfi = ci.NumberFormat;
325                                 Assert.Fail ("#1:" + (nfi != null));
326                         } catch (NotSupportedException ex) {
327                                 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
328                                 Assert.IsNull (ex.InnerException, "#3");
329                                 Assert.IsNotNull (ex.Message, "#4");
330                         }
331                 }
332
333 #if NET_2_0
334                 [Test]
335                 [Category ("NotDotNet")] // On MS, the NumberFormatInfo of the CultureInfo matching the current locale is not read-only
336                 public void GetCultureInfo_Identifier ()
337                 {
338                         foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
339                                 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
340                                 CultureInfo culture = CultureInfo.GetCultureInfo (ci.LCID);
341                                 Assert.IsTrue (culture.IsReadOnly, "#1:" + cultureMsg);
342                                 if (culture.IsNeutralCulture)
343                                         continue;
344                                 Assert.IsTrue (culture.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
345                                 Assert.IsTrue (culture.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
346                         }
347                 }
348
349                 [Test]
350                 public void GetCultureInfo_Identifier_Negative ()
351                 {
352                         try {
353                                 CultureInfo.GetCultureInfo (-1);
354                                 Assert.Fail ("#1");
355                         } catch (ArgumentOutOfRangeException ex) {
356                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
357                                 Assert.IsNull (ex.InnerException, "#3");
358                                 Assert.IsNotNull (ex.Message, "#4");
359                                 Assert.IsNotNull (ex.ParamName, "#5");
360                                 Assert.AreEqual ("culture", ex.ParamName, "#6");
361                         }
362                 }
363
364                 [Test]
365                 public void GetCultureInfo_Identifier_NotSupported ()
366                 {
367                         try {
368                                 CultureInfo.GetCultureInfo (666);
369                                 Assert.Fail ("#1");
370                         } catch (ArgumentException ex) {
371                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
372                                 Assert.IsNull (ex.InnerException, "#3");
373                                 Assert.IsNotNull (ex.Message, "#4");
374                                 Assert.IsNotNull (ex.ParamName, "#5");
375                                 Assert.AreEqual ("culture", ex.ParamName, "#6");
376                         }
377                 }
378
379                 [Test]
380                 [Category ("NotDotNet")] // On MS, the NumberFormatInfo of the CultureInfo matching the current locale is not read-only
381                 public void GetCultureInfo_Name ()
382                 {
383                         foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
384                                 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
385                                 CultureInfo culture = CultureInfo.GetCultureInfo (ci.Name);
386                                 Assert.IsTrue (culture.IsReadOnly, "#1:" + cultureMsg);
387                                 if (culture.IsNeutralCulture)
388                                         continue;
389                                 Assert.IsTrue (culture.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
390                                 Assert.IsTrue (culture.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
391                         }
392                 }
393
394                 [Test]
395                 public void GetCultureInfo_Name_NotSupported ()
396                 {
397                         try {
398                                 CultureInfo.GetCultureInfo ("666");
399                                 Assert.Fail ("#1");
400                         } catch (ArgumentException ex) {
401                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
402                                 Assert.IsNull (ex.InnerException, "#3");
403                                 Assert.IsNotNull (ex.Message, "#4");
404                                 Assert.IsNotNull (ex.ParamName, "#5");
405                                 Assert.AreEqual ("name", ex.ParamName, "#6");
406                         }
407                 }
408
409                 [Test]
410                 public void GetCultureInfo_Name_Null ()
411                 {
412                         try {
413                                 CultureInfo.GetCultureInfo ((string) null);
414                                 Assert.Fail ("#1");
415                         } catch (ArgumentNullException ex) {
416                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
417                                 Assert.IsNull (ex.InnerException, "#3");
418                                 Assert.IsNotNull (ex.Message, "#4");
419                                 Assert.IsNotNull (ex.ParamName, "#5");
420                                 Assert.AreEqual ("name", ex.ParamName, "#6");
421                         }
422                 }
423 #endif
424
425                 [Test]
426                 public void UseUserOverride_CurrentCulture ()
427                 {
428                         CultureInfo ci = CultureInfo.CurrentCulture;
429                         bool expected = (ci.LCID != CultureInfo.InvariantCulture.LCID);
430                         Assert.AreEqual (expected, ci.UseUserOverride, "#1");
431
432                         ci = (CultureInfo) ci.Clone ();
433                         Assert.AreEqual (expected, ci.UseUserOverride, "#2");
434                 }
435
436                 [Test]
437                 public void UseUserOverride_CurrentUICulture ()
438                 {
439                         CultureInfo ci = CultureInfo.CurrentCulture;
440                         bool expected = (ci.LCID != CultureInfo.InvariantCulture.LCID);
441                         Assert.AreEqual (expected, ci.UseUserOverride, "#1");
442
443                         ci = (CultureInfo) ci.Clone ();
444                         Assert.AreEqual (expected, ci.UseUserOverride, "#2");
445                 }
446
447 #if NET_2_0
448                 [Test]
449                 public void UseUserOverride_GetCultureInfo ()
450                 {
451                         CultureInfo culture;
452
453                         foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
454                                 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
455                                 culture = CultureInfo.GetCultureInfo (ci.Name);
456                                 Assert.IsFalse (culture.UseUserOverride, "#1: " + cultureMsg);
457                                 culture = CultureInfo.GetCultureInfo (ci.LCID);
458                                 Assert.IsFalse (culture.UseUserOverride, "#2: " + cultureMsg);
459                         }
460                 }
461 #endif
462
463                 [Test]
464                 public void UseUserOverride_GetCultures ()
465                 {
466                         foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
467                                 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
468 #if NET_2_0
469                                 if (ci.LCID == CultureInfo.InvariantCulture.LCID)
470                                         Assert.IsFalse (ci.UseUserOverride, cultureMsg);
471                                 else
472                                         Assert.IsTrue (ci.UseUserOverride, cultureMsg);
473 #else
474                                 Assert.IsTrue (ci.UseUserOverride, cultureMsg);
475 #endif
476                         }
477                 }
478
479                 [Test]
480                 public void UseUserOverride_InvariantCulture ()
481                 {
482                         CultureInfo ci = CultureInfo.InvariantCulture;
483                         Assert.IsFalse (ci.UseUserOverride, "#21");
484
485                         ci = (CultureInfo) ci.Clone ();
486                         Assert.IsFalse (ci.UseUserOverride, "#2");
487                 }
488
489                 [Test]
490                 public void Bug402128 ()
491                 {
492                         var culture = new CultureInfo ("en-US");
493                         var ms = new MemoryStream ();
494                         var formatter = new BinaryFormatter ();
495                         formatter.Serialize (ms, culture);
496                         ms.Seek (0, SeekOrigin.Begin);
497                         var deserializedCulture = (CultureInfo) formatter.Deserialize (ms);
498                 }
499
500                 [Test]
501                 public void ZhHant ()
502                 {
503                         Assert.AreEqual (31748, new CultureInfo ("zh-Hant").LCID);
504 #if NET_2_0
505                         Assert.AreEqual (31748, CultureInfo.GetCultureInfo ("zh-Hant").LCID);
506 #endif
507                 }
508         }
509 }