2 // System.Globalization.CultureInfo Test Cases
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // (c) 2005 Novell, Inc. (http://www.novell.com)
11 using System.Globalization;
13 using System.Runtime.Serialization.Formatters.Binary;
14 using System.Threading;
16 using NUnit.Framework;
18 namespace MonoTests.System.Globalization
21 public class CultureInfoTest
23 CultureInfo old_culture;
28 old_culture = Thread.CurrentThread.CurrentCulture;
32 public void TearDown ()
34 Thread.CurrentThread.CurrentCulture = old_culture;
38 public void Constructor0 ()
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");
48 public void Constructor0_Identifier_Negative ()
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");
63 public void Constructor1 ()
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");
73 public void Constructor1_Name_Null ()
76 new CultureInfo ((string) null);
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");
88 public void Constructor2 ()
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");
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");
104 public void Constructor2_Identifier_Negative ()
107 new CultureInfo (-1, false);
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");
119 public void Constructor3 ()
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");
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");
135 public void Constructor3_Name_Null ()
138 new CultureInfo ((string) null, false);
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");
150 public void DateTimeFormat_Neutral_Culture ()
152 CultureInfo ci = new CultureInfo ("nl");
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");
164 public void GetAllCulturesInvariant ()
166 CultureInfo invariant = CultureInfo.InvariantCulture;
167 CultureInfo [] infos = CultureInfo.GetCultures (CultureTypes.AllCultures);
168 foreach (CultureInfo culture in infos) {
169 if (culture.Equals (invariant))
173 Assert.Fail ("InvariantCulture not found in the array from GetCultures()");
177 [ExpectedException (typeof (NotSupportedException))]
178 public void TrySetNeutralCultureNotInvariant ()
180 Thread.CurrentThread.CurrentCulture = new CultureInfo ("ar");
184 [Category ("TargetJvmNotWorking")] //OptionalCalendars not yet supported for TARGET_JVM.
185 // make sure that all CultureInfo holds non-null calendars.
186 public void OptionalCalendars ()
188 foreach (CultureInfo ci in CultureInfo.GetCultures (
189 CultureTypes.AllCultures))
190 Assert.IsNotNull (ci.OptionalCalendars, String.Format ("{0} {1}",
195 public void CloneNeutral ()
197 CultureInfo culture = new CultureInfo ("en");
198 CultureInfo cultureClone = culture.Clone () as CultureInfo;
199 Assert.IsTrue (culture.Equals (cultureClone));
203 public void IsReadOnly ()
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");
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");
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");
234 ci.NumberFormat.NumberGroupSeparator = ",";
236 } catch (InvalidOperationException ex) {
237 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C5");
238 Assert.IsNull (ex.InnerException, "#C6");
239 Assert.IsNotNull (ex.Message, "#C7");
242 ci = CultureInfo.CurrentUICulture;
243 Assert.IsTrue (ci.IsReadOnly, "#D1");
244 Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#D2");
245 Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#D3");
247 ci.NumberFormat.NumberGroupSeparator = ",";
249 } catch (InvalidOperationException ex) {
250 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D5");
251 Assert.IsNull (ex.InnerException, "#D6");
252 Assert.IsNotNull (ex.Message, "#D7");
255 ci = CultureInfo.InvariantCulture;
256 Assert.IsTrue (ci.IsReadOnly, "#F1");
257 Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#F2");
258 Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#F3");
260 ci.NumberFormat.NumberGroupSeparator = ",";
262 } catch (InvalidOperationException ex) {
263 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F5");
264 Assert.IsNull (ex.InnerException, "#F6");
265 Assert.IsNotNull (ex.Message, "#F7");
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");
281 public void IsReadOnly_GetCultures ()
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)
288 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
289 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
294 [Category ("NotWorking")]
295 public void IsReadOnly_InstalledUICulture ()
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");
302 ci.NumberFormat.NumberGroupSeparator = ",";
304 } catch (InvalidOperationException ex) {
305 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#5");
306 Assert.IsNull (ex.InnerException, "#6");
307 Assert.IsNotNull (ex.Message, "#7");
312 public void Norwegian ()
314 new CultureInfo ("no");
315 new CultureInfo ("nb-NO");
316 new CultureInfo ("nn-NO");
320 public void NumberFormat_Neutral_Culture ()
322 CultureInfo ci = new CultureInfo ("nl");
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");
335 [Category ("NotDotNet")] // On MS, the NumberFormatInfo of the CultureInfo matching the current locale is not read-only
336 public void GetCultureInfo_Identifier ()
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)
344 Assert.IsTrue (culture.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
345 Assert.IsTrue (culture.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
350 public void GetCultureInfo_Identifier_Negative ()
353 CultureInfo.GetCultureInfo (-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");
365 public void GetCultureInfo_Identifier_NotSupported ()
368 CultureInfo.GetCultureInfo (666);
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");
380 [Category ("NotDotNet")] // On MS, the NumberFormatInfo of the CultureInfo matching the current locale is not read-only
381 public void GetCultureInfo_Name ()
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)
389 Assert.IsTrue (culture.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
390 Assert.IsTrue (culture.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
395 public void GetCultureInfo_Name_NotSupported ()
398 CultureInfo.GetCultureInfo ("666");
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");
410 public void GetCultureInfo_Name_Null ()
413 CultureInfo.GetCultureInfo ((string) null);
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");
426 public void UseUserOverride_CurrentCulture ()
428 CultureInfo ci = CultureInfo.CurrentCulture;
429 bool expected = (ci.LCID != CultureInfo.InvariantCulture.LCID);
430 Assert.AreEqual (expected, ci.UseUserOverride, "#1");
432 ci = (CultureInfo) ci.Clone ();
433 Assert.AreEqual (expected, ci.UseUserOverride, "#2");
437 public void UseUserOverride_CurrentUICulture ()
439 CultureInfo ci = CultureInfo.CurrentCulture;
440 bool expected = (ci.LCID != CultureInfo.InvariantCulture.LCID);
441 Assert.AreEqual (expected, ci.UseUserOverride, "#1");
443 ci = (CultureInfo) ci.Clone ();
444 Assert.AreEqual (expected, ci.UseUserOverride, "#2");
449 public void UseUserOverride_GetCultureInfo ()
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);
464 public void UseUserOverride_GetCultures ()
466 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
467 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
469 if (ci.LCID == CultureInfo.InvariantCulture.LCID)
470 Assert.IsFalse (ci.UseUserOverride, cultureMsg);
472 Assert.IsTrue (ci.UseUserOverride, cultureMsg);
474 Assert.IsTrue (ci.UseUserOverride, cultureMsg);
480 public void UseUserOverride_InvariantCulture ()
482 CultureInfo ci = CultureInfo.InvariantCulture;
483 Assert.IsFalse (ci.UseUserOverride, "#21");
485 ci = (CultureInfo) ci.Clone ();
486 Assert.IsFalse (ci.UseUserOverride, "#2");
490 public void Bug402128 ()
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);
501 public void ZhHant ()
503 Assert.AreEqual (31748, new CultureInfo ("zh-Hant").LCID);
505 Assert.AreEqual (31748, CultureInfo.GetCultureInfo ("zh-Hant").LCID);