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;
15 using System.Threading.Tasks;
17 using NUnit.Framework;
19 namespace MonoTests.System.Globalization
22 public class CultureInfoTest
24 CultureInfo old_culture;
29 old_culture = Thread.CurrentThread.CurrentCulture;
33 public void TearDown ()
35 Thread.CurrentThread.CurrentCulture = old_culture;
39 public void Constructor0 ()
41 CultureInfo ci = new CultureInfo (2067);
42 Assert.IsFalse (ci.IsReadOnly, "#1");
43 Assert.AreEqual (2067, ci.LCID, "#2");
44 Assert.AreEqual ("nl-BE", ci.Name, "#3");
45 Assert.IsTrue (ci.UseUserOverride, "#4");
49 public void Constructor0_Identifier_Negative ()
54 } catch (ArgumentOutOfRangeException ex) {
55 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
56 Assert.IsNull (ex.InnerException, "#3");
57 Assert.IsNotNull (ex.Message, "#4");
58 Assert.IsNotNull (ex.ParamName, "#5");
59 Assert.AreEqual ("culture", ex.ParamName, "#6");
64 public void Constructor1 ()
66 CultureInfo ci = new CultureInfo ("nl-BE");
67 Assert.IsFalse (ci.IsReadOnly, "#1");
68 Assert.AreEqual (2067, ci.LCID, "#2");
69 Assert.AreEqual ("nl-BE", ci.Name, "#3");
70 Assert.IsTrue (ci.UseUserOverride, "#4");
74 public void Constructor1_Name_Null ()
77 new CultureInfo ((string) null);
79 } catch (ArgumentNullException ex) {
80 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
81 Assert.IsNull (ex.InnerException, "#3");
82 Assert.IsNotNull (ex.Message, "#4");
83 Assert.IsNotNull (ex.ParamName, "#5");
84 Assert.AreEqual ("name", ex.ParamName, "#6");
89 public void Constructor2 ()
91 CultureInfo ci = new CultureInfo (2067, false);
92 Assert.IsFalse (ci.IsReadOnly, "#A1");
93 Assert.AreEqual (2067, ci.LCID, "#A2");
94 Assert.AreEqual ("nl-BE", ci.Name, "#A3");
95 Assert.IsFalse (ci.UseUserOverride, "#A4");
97 ci = new CultureInfo (2067, true);
98 Assert.IsFalse (ci.IsReadOnly, "#B1");
99 Assert.AreEqual (2067, ci.LCID, "#B2");
100 Assert.AreEqual ("nl-BE", ci.Name, "#B3");
101 Assert.IsTrue (ci.UseUserOverride, "#B4");
105 public void Constructor2_Identifier_Negative ()
108 new CultureInfo (-1, false);
110 } catch (ArgumentOutOfRangeException ex) {
111 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
112 Assert.IsNull (ex.InnerException, "#3");
113 Assert.IsNotNull (ex.Message, "#4");
114 Assert.IsNotNull (ex.ParamName, "#5");
115 Assert.AreEqual ("culture", ex.ParamName, "#6");
120 public void Constructor3 ()
122 CultureInfo ci = new CultureInfo ("nl-BE", false);
123 Assert.IsFalse (ci.IsReadOnly, "#A1");
124 Assert.AreEqual (2067, ci.LCID, "#A2");
125 Assert.AreEqual ("nl-BE", ci.Name, "#A3");
126 Assert.IsFalse (ci.UseUserOverride, "#A4");
128 ci = new CultureInfo ("nl-BE", true);
129 Assert.IsFalse (ci.IsReadOnly, "#B1");
130 Assert.AreEqual (2067, ci.LCID, "#B2");
131 Assert.AreEqual ("nl-BE", ci.Name, "#B3");
132 Assert.IsTrue (ci.UseUserOverride, "#B4");
136 public void Constructor3_Name_Null ()
139 new CultureInfo ((string) null, false);
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 ("name", ex.ParamName, "#6");
151 public void ClearCachedData ()
153 var dt = DateTime.Now;
154 old_culture.ClearCachedData (); // It can be any culture instance as the method should be static
159 public void CreateSpecificCulture ()
161 var ci = CultureInfo.CreateSpecificCulture ("en");
162 Assert.AreEqual ("en-US", ci.Name, "#1");
164 ci = CultureInfo.CreateSpecificCulture ("en-GB");
165 Assert.AreEqual ("en-GB", ci.Name, "#2");
167 ci = CultureInfo.CreateSpecificCulture ("en-----");
168 Assert.AreEqual ("en-US", ci.Name, "#3");
170 ci = CultureInfo.CreateSpecificCulture ("en-GB-");
171 Assert.AreEqual ("en-US", ci.Name, "#4");
173 ci = CultureInfo.CreateSpecificCulture ("");
174 Assert.AreEqual (CultureInfo.InvariantCulture, ci, "#5");
176 ci = CultureInfo.CreateSpecificCulture ("zh-hant");
177 Assert.AreEqual ("zh-HK", ci.Name, "#6");
179 ci = CultureInfo.CreateSpecificCulture ("zh-hans");
180 Assert.AreEqual ("zh-CN", ci.Name, "#7");
182 ci = CultureInfo.CreateSpecificCulture ("zh-hans-CN");
183 Assert.AreEqual ("zh-CN", ci.Name, "#8");
185 ci = CultureInfo.CreateSpecificCulture ("zh-hant-US");
186 Assert.AreEqual ("zh-HK", ci.Name, "#9");
188 ci = CultureInfo.CreateSpecificCulture ("az-CyrlM-BR");
189 Assert.AreEqual ("az-Latn-AZ", ci.Name, "#10");
193 public void CreateSpecificCulture_Invalid ()
196 CultureInfo.CreateSpecificCulture ("uy32");
198 } catch (CultureNotFoundException) {
202 CultureInfo.CreateSpecificCulture (null);
204 } catch (ArgumentNullException) {
205 // .NET throws NRE which is lame
210 public void DateTimeFormat_Neutral_Culture ()
212 CultureInfo ci = new CultureInfo ("nl");
214 DateTimeFormatInfo dfi = ci.DateTimeFormat;
215 Assert.IsNotNull (dfi, "#1");
216 } catch (NotSupportedException ex) {
217 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
218 Assert.IsNull (ex.InnerException, "#3");
219 Assert.IsNotNull (ex.Message, "#4");
224 public void GetAllCulturesInvariant ()
226 CultureInfo invariant = CultureInfo.InvariantCulture;
227 CultureInfo [] infos = CultureInfo.GetCultures (CultureTypes.AllCultures);
228 foreach (CultureInfo culture in infos) {
229 if (culture.Equals (invariant))
233 Assert.Fail ("InvariantCulture not found in the array from GetCultures()");
237 public void GetAllCultures_Specific ()
239 CultureInfo [] infos = CultureInfo.GetCultures (CultureTypes.SpecificCultures);
240 foreach (CultureInfo ci in infos) {
241 Assert.IsNotNull (ci.DateTimeFormat);
246 public void TrySetNeutralCultureNotInvariant ()
248 Thread.CurrentThread.CurrentCulture = new CultureInfo ("ar");
252 // make sure that all CultureInfo holds non-null calendars.
253 public void OptionalCalendars ()
256 // ensure the linker does not remove them so we can test them
257 Assert.IsNotNull (typeof (UmAlQuraCalendar), "UmAlQuraCalendar");
259 foreach (CultureInfo ci in CultureInfo.GetCultures (
260 CultureTypes.AllCultures))
261 Assert.IsNotNull (ci.OptionalCalendars, String.Format ("{0} {1}",
266 public void CloneNeutral ()
268 CultureInfo culture = new CultureInfo ("en");
269 CultureInfo cultureClone = culture.Clone () as CultureInfo;
270 Assert.IsTrue (culture.Equals (cultureClone));
274 public void IsNeutral ()
276 var ci = new CultureInfo (0x6C1A);
277 Assert.IsTrue (ci.IsNeutralCulture, "#1");
278 Assert.AreEqual ("srp", ci.ThreeLetterISOLanguageName, "#2");
280 ci = new CultureInfo ("en-US");
281 Assert.IsFalse (ci.IsNeutralCulture, "#1a");
282 Assert.AreEqual ("eng", ci.ThreeLetterISOLanguageName, "#2a");
286 public void IsReadOnly ()
290 ci = new CultureInfo ("en-US");
291 Assert.IsFalse (ci.IsReadOnly, "#A1");
292 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#A2");
293 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#A3");
294 ci.NumberFormat.NumberGroupSeparator = ",";
295 ci.NumberFormat = new NumberFormatInfo ();
296 ci.DateTimeFormat.DateSeparator = "/";
297 ci.DateTimeFormat = new DateTimeFormatInfo ();
298 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#A4");
299 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#A5");
301 ci = new CultureInfo (CultureInfo.InvariantCulture.LCID);
302 Assert.IsFalse (ci.IsReadOnly, "#B1");
303 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#B2");
304 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#B3");
305 ci.NumberFormat.NumberGroupSeparator = ",";
306 ci.NumberFormat = new NumberFormatInfo ();
307 ci.DateTimeFormat.DateSeparator = "/";
308 ci.DateTimeFormat = new DateTimeFormatInfo ();
309 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#B4");
310 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#B5");
312 ci = CultureInfo.CurrentCulture;
313 Assert.IsTrue (ci.IsReadOnly, "#C1:" + ci.DisplayName);
314 Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#C2");
315 Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#C3");
317 ci.NumberFormat.NumberGroupSeparator = ",";
319 } catch (InvalidOperationException ex) {
320 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C5");
321 Assert.IsNull (ex.InnerException, "#C6");
322 Assert.IsNotNull (ex.Message, "#C7");
325 ci = CultureInfo.CurrentUICulture;
326 Assert.IsTrue (ci.IsReadOnly, "#D1");
327 Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#D2");
328 Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#D3");
330 ci.NumberFormat.NumberGroupSeparator = ",";
332 } catch (InvalidOperationException ex) {
333 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D5");
334 Assert.IsNull (ex.InnerException, "#D6");
335 Assert.IsNotNull (ex.Message, "#D7");
338 ci = CultureInfo.InvariantCulture;
339 Assert.IsTrue (ci.IsReadOnly, "#F1");
340 Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#F2");
341 Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#F3");
343 ci.NumberFormat.NumberGroupSeparator = ",";
345 } catch (InvalidOperationException ex) {
346 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F5");
347 Assert.IsNull (ex.InnerException, "#F6");
348 Assert.IsNotNull (ex.Message, "#F7");
351 ci = new CultureInfo (string.Empty);
352 Assert.IsFalse (ci.IsReadOnly, "#G1");
353 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#G2");
354 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#G3");
355 ci.NumberFormat.NumberGroupSeparator = ",";
356 ci.NumberFormat = new NumberFormatInfo ();
357 ci.DateTimeFormat.DateSeparator = "/";
358 ci.DateTimeFormat = new DateTimeFormatInfo ();
359 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#G4");
360 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#G5");
364 public void IsReadOnly_GetCultures ()
366 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
367 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
368 Assert.IsFalse (ci.IsReadOnly, "#1:" + cultureMsg);
369 if (ci.IsNeutralCulture)
371 Assert.IsFalse (ci.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
372 Assert.IsFalse (ci.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
377 [Category ("NotWorking")]
378 public void IsReadOnly_InstalledUICulture ()
380 CultureInfo ci = CultureInfo.InstalledUICulture;
381 Assert.IsTrue (ci.IsReadOnly, "#1");
382 Assert.IsTrue (ci.NumberFormat.IsReadOnly, "#2");
383 Assert.IsTrue (ci.DateTimeFormat.IsReadOnly, "#3");
385 ci.NumberFormat.NumberGroupSeparator = ",";
387 } catch (InvalidOperationException ex) {
388 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#5");
389 Assert.IsNull (ex.InnerException, "#6");
390 Assert.IsNotNull (ex.Message, "#7");
395 public void Norwegian ()
397 new CultureInfo ("no");
398 new CultureInfo ("nb-NO");
399 new CultureInfo ("nn-NO");
403 public void NumberFormat_Neutral_Culture ()
405 CultureInfo ci = new CultureInfo ("nl");
407 NumberFormatInfo nfi = ci.NumberFormat;
408 Assert.IsNotNull (nfi, "#1");
409 } catch (NotSupportedException ex) {
410 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
411 Assert.IsNull (ex.InnerException, "#3");
412 Assert.IsNotNull (ex.Message, "#4");
417 [Category ("NotDotNet")] // On MS, the NumberFormatInfo of the CultureInfo matching the current locale is not read-only
418 public void GetCultureInfo_Identifier ()
420 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
421 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
422 CultureInfo culture = CultureInfo.GetCultureInfo (ci.LCID);
423 Assert.IsTrue (culture.IsReadOnly, "#1:" + cultureMsg);
424 if (culture.IsNeutralCulture)
426 Assert.IsTrue (culture.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
427 Assert.IsTrue (culture.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
432 public void GetCultureInfo_Identifier_Nonpositive ()
435 CultureInfo.GetCultureInfo (0);
437 } catch (ArgumentOutOfRangeException ex) {
438 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
439 Assert.IsNull (ex.InnerException, "#3");
440 Assert.IsNotNull (ex.Message, "#4");
441 Assert.IsNotNull (ex.ParamName, "#5");
442 Assert.AreEqual ("culture", ex.ParamName, "#6");
447 public void GetCultureInfo_Identifier_NotSupported ()
450 CultureInfo.GetCultureInfo (666);
452 } catch (ArgumentException ex) {
453 Assert.AreEqual (typeof (CultureNotFoundException), ex.GetType (), "#2");
454 Assert.IsNull (ex.InnerException, "#3");
455 Assert.IsNotNull (ex.Message, "#4");
456 Assert.IsNotNull (ex.ParamName, "#5");
457 Assert.AreEqual ("culture", ex.ParamName, "#6");
462 [Category ("NotDotNet")] // On MS, the NumberFormatInfo of the CultureInfo matching the current locale is not read-only
463 public void GetCultureInfo_Name ()
465 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
466 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
467 CultureInfo culture = CultureInfo.GetCultureInfo (ci.Name);
468 Assert.IsTrue (culture.IsReadOnly, "#1:" + cultureMsg);
469 if (culture.IsNeutralCulture)
471 Assert.IsTrue (culture.NumberFormat.IsReadOnly, "#2:" + cultureMsg);
472 Assert.IsTrue (culture.DateTimeFormat.IsReadOnly, "#3:" + cultureMsg);
477 public void GetCultureInfo_Name_NotSupported ()
480 CultureInfo.GetCultureInfo ("666");
482 } catch (ArgumentException ex) {
483 Assert.AreEqual (typeof (CultureNotFoundException), ex.GetType (), "#2");
484 Assert.IsNull (ex.InnerException, "#3");
485 Assert.IsNotNull (ex.Message, "#4");
486 Assert.IsNotNull (ex.ParamName, "#5");
487 Assert.AreEqual ("name", ex.ParamName, "#6");
492 public void GetCultureInfo_Name_Null ()
495 CultureInfo.GetCultureInfo ((string) null);
497 } catch (ArgumentNullException ex) {
498 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
499 Assert.IsNull (ex.InnerException, "#3");
500 Assert.IsNotNull (ex.Message, "#4");
501 Assert.IsNotNull (ex.ParamName, "#5");
502 Assert.AreEqual ("name", ex.ParamName, "#6");
507 public void UseUserOverride_CurrentCulture ()
509 CultureInfo ci = CultureInfo.CurrentCulture;
510 bool expected = (ci.LCID != CultureInfo.InvariantCulture.LCID);
511 Assert.AreEqual (expected, ci.UseUserOverride, "#1");
513 ci = (CultureInfo) ci.Clone ();
514 Assert.AreEqual (expected, ci.UseUserOverride, "#2");
518 public void UseUserOverride_CurrentUICulture ()
520 CultureInfo ci = CultureInfo.CurrentCulture;
521 bool expected = (ci.LCID != CultureInfo.InvariantCulture.LCID);
522 Assert.AreEqual (expected, ci.UseUserOverride, "#1");
524 ci = (CultureInfo) ci.Clone ();
525 Assert.AreEqual (expected, ci.UseUserOverride, "#2");
529 public void UseUserOverride_GetCultureInfo ()
533 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
534 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
535 culture = CultureInfo.GetCultureInfo (ci.Name);
536 Assert.IsFalse (culture.UseUserOverride, "#1: " + cultureMsg);
537 culture = CultureInfo.GetCultureInfo (ci.LCID);
538 Assert.IsFalse (culture.UseUserOverride, "#2: " + cultureMsg);
543 public void UseUserOverride_GetCultures ()
545 foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.AllCultures)) {
546 string cultureMsg = String.Format ("{0} {1}", ci.LCID, ci.Name);
547 if (ci.LCID == CultureInfo.InvariantCulture.LCID)
548 Assert.IsFalse (ci.UseUserOverride, cultureMsg);
550 Assert.IsTrue (ci.UseUserOverride, cultureMsg);
555 public void UseUserOverride_InvariantCulture ()
557 CultureInfo ci = CultureInfo.InvariantCulture;
558 Assert.IsFalse (ci.UseUserOverride, "#21");
560 ci = (CultureInfo) ci.Clone ();
561 Assert.IsFalse (ci.UseUserOverride, "#2");
565 public void Bug402128 ()
567 var culture = new CultureInfo ("en-US");
568 var ms = new MemoryStream ();
569 var formatter = new BinaryFormatter ();
570 formatter.Serialize (ms, culture);
571 ms.Seek (0, SeekOrigin.Begin);
572 var deserializedCulture = (CultureInfo) formatter.Deserialize (ms);
576 public void ZhHant ()
578 Assert.AreEqual (31748, new CultureInfo ("zh-Hant").LCID);
579 Assert.AreEqual (31748, CultureInfo.GetCultureInfo ("zh-Hant").LCID);
580 Assert.AreEqual (31748, new CultureInfo ("zh-CHT").LCID);
581 Assert.AreEqual (31748, new CultureInfo ("zh-CHT").Parent.LCID);
585 public void ZhHans ()
587 Assert.AreEqual (4, new CultureInfo ("zh-Hans").LCID);
588 Assert.AreEqual (4, CultureInfo.GetCultureInfo ("zh-Hans").LCID);
589 Assert.AreEqual (4, new CultureInfo ("zh-CHS").LCID);
590 Assert.AreEqual (4, new CultureInfo ("zh-CHS").Parent.LCID);
594 [SetCulture ("zh-TW")]
595 public void ParentOfZh ()
597 Assert.AreEqual (31748, CultureInfo.CurrentCulture.Parent.LCID);
598 Assert.AreEqual (31748, CultureInfo.CurrentCulture.Parent.Parent.LCID);
602 public void CurrentCulture ()
604 Assert.IsNotNull (CultureInfo.CurrentCulture, "CurrentCulture");
608 [ExpectedException (typeof (CultureNotFoundException))]
609 public void CultureNotFound ()
611 // that's how the 'locale' gets defined for a device with an English UI
612 // and it's international settings set for Hong Kong
613 // https://bugzilla.xamarin.com/show_bug.cgi?id=3471
614 new CultureInfo ("en-HK");
618 public void ChineseSimplifiedDontEqual ()
620 CultureInfo zh1 = new CultureInfo ("zh-Hans");
621 CultureInfo zh2 = new CultureInfo ("zh-CHS");
623 Assert.IsFalse (zh1.Equals (zh2), "#1");
624 Assert.IsFalse (zh2.Equals (zh1), "#2");
627 CountdownEvent barrier = new CountdownEvent (3);
628 AutoResetEvent[] evt = new AutoResetEvent [] { new AutoResetEvent (false), new AutoResetEvent (false), new AutoResetEvent (false), new AutoResetEvent (false)};
630 CultureInfo[] initial_culture = new CultureInfo[4];
631 CultureInfo[] changed_culture = new CultureInfo[4];
632 CultureInfo[] changed_culture2 = new CultureInfo[4];
633 CultureInfo alternative_culture = new CultureInfo("pt-BR");
635 void StepAllPhases (int index)
637 initial_culture [index] = CultureInfo.CurrentCulture;
638 /*Phase 1 - we witness the original value */
641 /*Phase 2 - main thread changes culture */
642 evt [index].WaitOne ();
644 /*Phase 3 - we witness the new value */
645 changed_culture [index] = CultureInfo.CurrentCulture;
648 /* Phase 4 - main thread changes culture back */
649 evt [index].WaitOne ();
651 /*Phase 5 - we witness the new value */
652 changed_culture2 [index] = CultureInfo.CurrentCulture;
656 void ThreadWithoutChange () {
660 void ThreadWithChange () {
661 Thread.CurrentThread.CurrentCulture = alternative_culture;
665 void ThreadPoolWithoutChange () {
670 public void DefaultThreadCurrentCulture () {
673 var orig_culture = CultureInfo.CurrentCulture;
674 var new_culture = new CultureInfo("fr-FR");
676 /* Phase 0 - warm up */
677 new Thread (ThreadWithoutChange).Start ();
678 new Thread (ThreadWithChange).Start ();
679 Action x = ThreadPoolWithoutChange;
680 x.BeginInvoke (null, null);
682 /* Phase 1 - let everyone witness initial values */
683 initial_culture [0] = CultureInfo.CurrentCulture;
687 /* Phase 2 - change the default culture*/
688 CultureInfo.DefaultThreadCurrentCulture = new_culture;
693 /* Phase 3 - let everyone witness the new value */
694 changed_culture [0] = CultureInfo.CurrentCulture;
698 /* Phase 4 - revert the default culture back to null */
699 CultureInfo.DefaultThreadCurrentCulture = null;
704 /* Phase 5 - let everyone witness the new value */
705 changed_culture2 [0] = CultureInfo.CurrentCulture;
709 CultureInfo.DefaultThreadCurrentCulture = null;
711 Assert.AreEqual (orig_culture, initial_culture [0], "#1");
712 Assert.AreEqual (orig_culture, initial_culture [1], "#2");
713 Assert.AreEqual (alternative_culture, initial_culture [2], "#3");
714 Assert.AreEqual (orig_culture, initial_culture [3], "#4");
716 Assert.AreEqual (new_culture, changed_culture [0], "#5");
717 Assert.AreEqual (new_culture, changed_culture [1], "#6");
718 Assert.AreEqual (alternative_culture, changed_culture [2], "#7");
719 Assert.AreEqual (new_culture, changed_culture [3], "#8");
721 Assert.AreEqual (orig_culture, changed_culture2 [0], "#9");
722 Assert.AreEqual (orig_culture, changed_culture2 [1], "#10");
723 Assert.AreEqual (alternative_culture, changed_culture2 [2], "#11");
724 Assert.AreEqual (orig_culture, changed_culture2 [3], "#12");
726 var ar = c.BeginInvoke (null, null);
727 ar.AsyncWaitHandle.WaitOne ();
731 public void DefaultThreadCurrentCultureIsIgnoredWhenCultureFlowsToThread ()
733 string us_str = null;
734 string br_str = null;
736 var thread = new Thread (() => {
737 CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
738 us_str = 100000.ToString ("C");
739 CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pt-BR");
740 br_str = 100000.ToString ("C");
743 var expected = 100000.ToString ("C");
746 Assert.IsTrue (thread.Join (5000), "#0");
747 CultureInfo.DefaultThreadCurrentCulture = null;
748 Assert.AreEqual (expected, us_str, "#1");
749 Assert.AreEqual (expected, br_str, "#2");
753 public void FlowCultureInfoFromParentThreadSinceNet46 ()
755 Func<Task> f = async () => {
756 Thread.CurrentThread.CurrentUICulture = new CultureInfo ("pt-BR");
758 Assert.AreEqual ("pt-BR", Thread.CurrentThread.CurrentUICulture.Name);