SqlBulkCopy Implementation
[mono.git] / mcs / class / corlib / Test / System / TimeZoneTest.cs
1 //
2 // TimeZoneTest.cs - NUnit Test Cases for the System.TimeZone struct
3 //
4 // Authors:
5 //      Martin Baulig (martin@gnome.org)
6 //      Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 //   (C) 2002 Martin Baulig
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 //
11
12 using NUnit.Framework;
13 using System;
14 using System.IO;
15 using System.Threading;
16 using System.Globalization;
17 using System.Runtime.Serialization.Formatters.Binary;
18
19 namespace MonoTests.System {
20
21 [TestFixture]
22 public class TimeZoneTest {
23
24         private void CET (TimeZone t1) 
25         {
26                 Assert.AreEqual("CET", t1.StandardName, "A01");
27                 Assert.AreEqual("CEST", t1.DaylightName, "A02");
28         
29                 DaylightTime d1 = t1.GetDaylightChanges (2002);
30                 Assert.AreEqual("03/31/2002 02:00:00", d1.Start.ToString ("G"), "A03");
31                 Assert.AreEqual("10/27/2002 03:00:00", d1.End.ToString ("G"), "A04");
32                 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "A05");
33         
34                 DaylightTime d2 = t1.GetDaylightChanges (1996);
35                 Assert.AreEqual("03/31/1996 02:00:00", d2.Start.ToString ("G"), "A06");
36                 Assert.AreEqual("10/27/1996 03:00:00", d2.End.ToString ("G"), "A07");
37                 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "A08");
38         
39                 DateTime d3 = new DateTime (2002,2,25);
40                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "A09");
41                 DateTime d4 = new DateTime (2002,4,2);
42                 Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "A10");
43                 DateTime d5 = new DateTime (2002,11,4);
44                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "A11");
45         
46                 Assert.AreEqual(36000000000L, t1.GetUtcOffset (d3).Ticks, "A12");
47                 Assert.AreEqual(72000000000L, t1.GetUtcOffset (d4).Ticks, "A13");
48                 Assert.AreEqual(36000000000L, t1.GetUtcOffset (d5).Ticks, "A14");
49         }
50
51         private void EST (TimeZone t1) 
52         {
53                 // It could be EST though...
54                 //Assert.AreEqual("Eastern Standard Time", t1.StandardName, "B01");
55                 //Assert.AreEqual("Eastern Daylight Time", t1.DaylightName, "B02");
56
57                 DaylightTime d1 = t1.GetDaylightChanges (2002);
58                 Assert.AreEqual("04/07/2002 02:00:00", d1.Start.ToString ("G"), "B03");
59                 Assert.AreEqual("10/27/2002 02:00:00", d1.End.ToString ("G"), "B04");
60                 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "B05");
61
62                 DaylightTime d2 = t1.GetDaylightChanges (1996);
63                 Assert.AreEqual("04/07/1996 02:00:00", d2.Start.ToString ("G"), "B06");
64                 Assert.AreEqual("10/27/1996 02:00:00", d2.End.ToString ("G"), "B07");
65                 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "B08");
66
67                 DateTime d3 = new DateTime (2002,2,25);
68                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "B09");
69                 DateTime d4 = new DateTime (2002,4,8);
70                 Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "B10");
71                 DateTime d5 = new DateTime (2002,11,4);
72                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "B11");
73
74                 Assert.AreEqual(-180000000000L, t1.GetUtcOffset (d3).Ticks, "B12");
75                 Assert.AreEqual(-144000000000L, t1.GetUtcOffset (d4).Ticks, "B13");
76                 Assert.AreEqual(-180000000000L, t1.GetUtcOffset (d5).Ticks, "B14");
77         }
78
79         private void TST (TimeZone t1) 
80         {
81                 Assert.AreEqual("Tokyo Standard Time", t1.StandardName, "C01");
82                 Assert.AreEqual("Tokyo Standard Time", t1.DaylightName, "C02");
83
84                 DateTime d3 = new DateTime (2002,2,25);
85                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "C09");
86                 DateTime d4 = new DateTime (2002,4,8);
87                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d4), "C10");
88                 DateTime d5 = new DateTime (2002,11,4);
89                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "C11");
90
91                 Assert.AreEqual(324000000000L, t1.GetUtcOffset (d3).Ticks, "C12");
92                 Assert.AreEqual(324000000000L, t1.GetUtcOffset (d4).Ticks, "C13");
93                 Assert.AreEqual(324000000000L, t1.GetUtcOffset (d5).Ticks, "C14");
94         }
95
96         private void GMT (TimeZone t1) {
97                 // Probably wont work on MS.NET, but is better than nothing. Where do
98                 // we change our implementation to match theirs?
99                 
100                 Assert.AreEqual("GMT", t1.StandardName, "D01");
101                 Assert.IsTrue("BST" == t1.DaylightName || "IST" == t1.DaylightName, "D02");
102         
103                 DaylightTime d1 = t1.GetDaylightChanges (2002);
104                 Assert.AreEqual("03/31/2002 01:00:00", d1.Start.ToString ("G"), "D03");
105                 Assert.AreEqual("10/27/2002 02:00:00", d1.End.ToString ("G"), "D04");
106                 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "D05");
107         
108                 DaylightTime d2 = t1.GetDaylightChanges (1996);
109                 Assert.AreEqual("03/31/1996 01:00:00", d2.Start.ToString ("G"), "D06");
110                 Assert.AreEqual("10/27/1996 02:00:00", d2.End.ToString ("G"), "D07");
111                 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "D08");
112         
113                 DateTime d3 = new DateTime (2002,2,25);
114                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "D09");
115                 DateTime d4 = new DateTime (2002,4,2);
116                 Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "D10");
117                 DateTime d5 = new DateTime (2002,11,4);
118                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "D11");
119         
120                 Assert.AreEqual(0L, t1.GetUtcOffset (d3).Ticks, "D12");
121                 Assert.AreEqual(36000000000L, t1.GetUtcOffset (d4).Ticks, "D13");
122                 Assert.AreEqual(0L, t1.GetUtcOffset (d5).Ticks, "D14");
123         }
124
125         [Test]
126         [Culture ("")]
127         public void TestCtors ()
128         {
129                 TimeZone t1 = TimeZone.CurrentTimeZone;
130                 switch (t1.StandardName) {
131                         case "CET":
132                                 CET (t1);
133                                 break;
134                         case "Eastern Standard Time":
135                         case "EST":
136                                 EST (t1);
137                                 break;
138                         case "Tokyo Standard Time":
139                                 TST (t1);
140                                 break;
141                         case "GMT":
142                                 GMT (t1);
143                                 break;
144                         default:
145                                 NUnit.Framework.Assert.Ignore ("Your time zone (" + t1.StandardName + ") isn't defined in the test case");
146                                 break;
147                 }
148         }
149
150         [Test]
151         [Category ("TargetJvmNotWorking")]
152         public void CurrentTimeZone_SerializationRoundtrip ()
153         {
154                 TimeZone tz = TimeZone.CurrentTimeZone;
155                 BinaryFormatter bf = new BinaryFormatter ();
156                 MemoryStream ms = new MemoryStream ();
157                 bf.Serialize (ms, tz);
158
159                 ms.Position = 0;
160                 TimeZone clone = (TimeZone) bf.Deserialize (ms);
161
162                 Assert.AreEqual (tz.DaylightName, clone.DaylightName, "DaylightName");
163                 Assert.AreEqual (tz.StandardName, clone.StandardName, "StandardName");
164         }
165
166         static private byte[] serialized_timezone = {
167 #if NET_2_0
168                 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 
169                 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x54, 
170                 0x69, 0x6D, 0x65, 0x5A, 0x6F, 0x6E, 0x65, 0x04, 0x00, 0x00, 0x00, 0x17, 0x6D, 0x5F, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 
171                 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x73, 0x0D, 0x6D, 0x5F, 0x74, 0x69, 0x63, 0x6B, 0x73, 0x4F, 
172                 0x66, 0x66, 0x73, 0x65, 0x74, 0x0E, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x4E, 0x61, 0x6D, 0x65, 0x0E, 0x6D, 
173                 0x5F, 0x64, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x03, 0x00, 0x01, 0x01, 0x1C, 0x53, 0x79, 0x73, 0x74, 
174                 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 
175                 0x6C, 0x65, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x17, 0xD6, 0xFF, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x15, 
176                 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x0A, 
177                 0x04, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 
178                 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x4C, 0x6F, 0x61, 0x64, 0x46, 
179                 0x61, 0x63, 0x74, 0x6F, 0x72, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x08, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 
180                 0x10, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x08, 0x48, 0x61, 0x73, 0x68, 
181                 0x53, 0x69, 0x7A, 0x65, 0x04, 0x4B, 0x65, 0x79, 0x73, 0x06, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x73, 0x00, 0x00, 0x03, 0x03, 0x00, 0x05, 
182                 0x05, 0x0B, 0x08, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 
183                 0x2E, 0x49, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 0x24, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 
184                 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x49, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 
185                 0x64, 0x65, 0x72, 0x08, 0xEC, 0x51, 0x38, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 
186                 0x00, 0x09, 0x05, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x08, 0xCC, 0x07, 0x00, 0x00, 0x08, 
187                 0x08, 0xD5, 0x07, 0x00, 0x00, 0x08, 0x08, 0xD2, 0x07, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x06, 
188                 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x21, 0x53, 0x79, 0x73, 
189                 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x44, 0x61, 0x79, 0x6C, 
190                 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x03, 0x00, 0x00, 0x00, 0x07, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x05, 0x6D, 
191                 0x5F, 0x65, 0x6E, 0x64, 0x07, 0x6D, 0x5F, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0C, 0x00, 0x10, 0xFA, 0x0F, 
192                 0x3D, 0xF2, 0xBC, 0x88, 0x00, 0x50, 0xD5, 0xB1, 0xC1, 0x91, 0xBD, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x07, 
193                 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x23, 0xFA, 0x07, 0x06, 0xC7, 0x88, 0x00, 0xD0, 0xE2, 0xC4, 0x0C, 0xAB, 0xC7, 
194                 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0C, 0x0F, 
195                 0xEF, 0xAB, 0xC3, 0x88, 0x00, 0x90, 0xE7, 0xB0, 0x73, 0x4B, 0xC4, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x0B
196 #else
197                 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 
198                 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x54, 
199                 0x69, 0x6D, 0x65, 0x5A, 0x6F, 0x6E, 0x65, 0x04, 0x00, 0x00, 0x00, 0x17, 0x6D, 0x5F, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 
200                 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x73, 0x0D, 0x6D, 0x5F, 0x74, 0x69, 0x63, 0x6B, 0x73, 0x4F, 
201                 0x66, 0x66, 0x73, 0x65, 0x74, 0x0E, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x4E, 0x61, 0x6D, 0x65, 0x0E, 0x6D, 
202                 0x5F, 0x64, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x03, 0x00, 0x01, 0x01, 0x1C, 0x53, 0x79, 0x73, 0x74, 
203                 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 
204                 0x6C, 0x65, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x17, 0xD6, 0xFF, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x15, 
205                 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x0A, 
206                 0x04, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 
207                 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x4C, 0x6F, 0x61, 0x64, 0x46, 
208                 0x61, 0x63, 0x74, 0x6F, 0x72, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x08, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 
209                 0x10, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x08, 0x48, 0x61, 0x73, 0x68, 
210                 0x53, 0x69, 0x7A, 0x65, 0x04, 0x4B, 0x65, 0x79, 0x73, 0x06, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x73, 0x00, 0x00, 0x03, 0x03, 0x00, 0x05, 
211                 0x05, 0x0B, 0x08, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 
212                 0x2E, 0x49, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 0x24, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 
213                 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x49, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 
214                 0x64, 0x65, 0x72, 0x08, 0xEC, 0x51, 0x38, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 
215                 0x00, 0x09, 0x05, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x08, 0xCC, 0x07, 0x00, 0x00, 0x08, 
216                 0x08, 0xD2, 0x07, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 
217                 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x21, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 
218                 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x44, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x03, 0x00, 0x00, 
219                 0x00, 0x07, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x05, 0x6D, 0x5F, 0x65, 0x6E, 0x64, 0x07, 0x6D, 0x5F, 0x64, 0x65, 0x6C, 0x74, 
220                 0x61, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0C, 0x00, 0x10, 0xFA, 0x0F, 0x3D, 0xF2, 0xBC, 0x08, 0x00, 0x50, 0xD5, 0xB1, 0xC1, 0x91, 0xBD, 
221                 0x08, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0C, 0x0F, 
222                 0xEF, 0xAB, 0xC3, 0x08, 0x00, 0x90, 0xE7, 0xB0, 0x73, 0x4B, 0xC4, 0x08, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x0B
223 #endif
224         };
225
226         [Test]
227         [Category ("NotWorking")] 
228         // 1.x - deserialize but strings are null
229         // 2.x - eexception when creating a datetime with a negative value
230         public void DeserializeKnownValue ()
231         {
232                 MemoryStream ms = new MemoryStream (serialized_timezone);
233                 BinaryFormatter bf = new BinaryFormatter ();
234                 TimeZone tz = (TimeZone) bf.Deserialize (ms);
235                 Assert.AreEqual ("Eastern Daylight Time", tz.DaylightName, "DaylightName");
236                 Assert.AreEqual ("Eastern Standard Time", tz.StandardName, "StandardName");
237         }
238
239         [Test]
240         public void ToLocalTimeAtDSTBoundaries ()
241         {
242                 TimeZone tz = TimeZone.CurrentTimeZone;
243                 DateTime dst_start_utc = tz.GetDaylightChanges(2007).Start.ToUniversalTime ();
244
245                 if (dst_start_utc == DateTime.MinValue)
246                         return;
247                 Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Subtract (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc), "0:1:59 < 0:3:00");
248                 Assert.IsTrue (tz.ToLocalTime (dst_start_utc) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))), "0:3:00 < 0:3:01");
249                 Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0))), "0:3:01 < 0:3:59");
250                 Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0))), "0:3:59 < 0:4:00");
251                 Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 1, 0))), "0:4:00 < 0:4:01");
252         }
253
254                 [Test]
255                 public void StaticProperties ()
256                 {
257                         Assert.IsNotNull (TimeZoneInfo.Local, "Local");
258                         Assert.IsNotNull (TimeZoneInfo.Utc, "Utc");
259                 }
260                 
261                 [Test]
262                 public void FindSystemTimeZoneById ()
263                 {
264                         TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById ("Canada/Eastern");
265                         Assert.AreEqual ("EDT", tzi.DaylightName, "DaylightName");
266                         Assert.AreEqual ("EST", tzi.StandardName, "StandardName");
267                         Assert.IsTrue (tzi.SupportsDaylightSavingTime, "SupportsDaylightSavingTime");
268                 }
269
270 #if MOBILE
271                 // On device we cannot read the OS file system to look for /etc/localtime
272                 // and /usr/share/zoneinfo - so we must initialize the BCL TimeZoneInfo
273                 // from NSTimeZoneInfo. The tests here check the code paths between the
274                 // two types - if they break then TimeZoneInfo work work at all
275                 // ref: http://bugzilla.xamarin.com/show_bug.cgi?id=1790
276                 
277                 bool incomplete_data_on_simulator_only_bug;
278
279                 [Test]
280                 public void GetSystemTimeZones ()
281                 {
282                         // if test is executed a second time then it report less than 400 (about 127) items available
283                         if (incomplete_data_on_simulator_only_bug)
284                                 Assert.Ignore ("known to fail on some iOS simulator versions - see source comments");
285                         
286                         try {
287                                 Assert.That (TimeZoneInfo.GetSystemTimeZones ().Count, Is.GreaterThan (400), "GetSystemTimeZones");
288                         } catch (NullReferenceException) {
289                                 // that's a weird one. It failed on iOS 5.1 *beta* simulator (on Lion) but it worked on *final*
290                                 // now it fails on Snow Leopard the same way (incomplete data) with iOS5 simulator (OS update ?)
291                                 // but it *never*ever* failed on devices
292                                 incomplete_data_on_simulator_only_bug = true;
293                                 if (MonoTouch.ObjCRuntime.Runtime.Arch == MonoTouch.ObjCRuntime.Arch.SIMULATOR)
294                                         Assert.Ignore ("known to fail on some iOS simulator versions - see source comments");
295                         }
296                 }
297 #endif
298         }
299 }