Merge pull request #799 from kebby/master
[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         private void NZST(TimeZone t1) {
126                 Assert.AreEqual("NZST", t1.StandardName, "E01");
127                 Assert.AreEqual("NZDT", t1.DaylightName, "E02");
128
129                 DaylightTime d1 = t1.GetDaylightChanges (2013);
130                 Assert.AreEqual("09/29/2013 02:00:00", d1.Start.ToString ("G"), "E03");
131                 Assert.AreEqual("04/07/2013 03:00:00", d1.End.ToString ("G"), "E04");
132                 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "E05");
133
134                 DaylightTime d2 = t1.GetDaylightChanges (2001);
135                 Assert.AreEqual("10/07/2001 02:00:00", d2.Start.ToString ("G"), "E06");
136                 Assert.AreEqual("03/18/2001 03:00:00", d2.End.ToString ("G"), "E07");
137                 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "E08");
138
139                 DateTime d3 = new DateTime(2013,02,15);
140                 Assert.AreEqual(true, t1.IsDaylightSavingTime (d3), "E09");
141                 DateTime d4 = new DateTime(2013,04,30);
142                 Assert.AreEqual(false, t1.IsDaylightSavingTime (d4), "E10");
143                 DateTime d5 = new DateTime(2013,11,03);
144                 Assert.AreEqual(true, t1.IsDaylightSavingTime (d5), "E11");
145
146                 Assert.AreEqual(36000000000L /*hour*/ * 13L, t1.GetUtcOffset (d3).Ticks, "E12");
147                 Assert.AreEqual(36000000000L /*hour*/ * 12L, t1.GetUtcOffset (d4).Ticks, "E13");
148                 Assert.AreEqual(36000000000L /*hour*/ * 13L, t1.GetUtcOffset (d5).Ticks, "E14");
149         }
150
151         [Test]
152         [Culture ("")]
153         public void TestCtors ()
154         {
155                 TimeZone t1 = TimeZone.CurrentTimeZone;
156                 switch (t1.StandardName) {
157                         case "CET":
158                                 CET (t1);
159                                 break;
160                         case "Eastern Standard Time":
161                         case "EST":
162                                 EST (t1);
163                                 break;
164                         case "Tokyo Standard Time":
165                                 TST (t1);
166                                 break;
167                         case "GMT":
168                                 GMT (t1);
169                                 break;
170                         case "NZST":
171                                 NZST (t1);
172                                 break;
173                         default:
174                                 NUnit.Framework.Assert.Ignore ("Your time zone (" + t1.StandardName + ") isn't defined in the test case");
175                                 break;
176                 }
177         }
178
179         [Test]
180         [Category ("TargetJvmNotWorking")]
181         public void CurrentTimeZone_SerializationRoundtrip ()
182         {
183                 TimeZone tz = TimeZone.CurrentTimeZone;
184                 BinaryFormatter bf = new BinaryFormatter ();
185                 MemoryStream ms = new MemoryStream ();
186                 bf.Serialize (ms, tz);
187
188                 ms.Position = 0;
189                 TimeZone clone = (TimeZone) bf.Deserialize (ms);
190
191                 Assert.AreEqual (tz.DaylightName, clone.DaylightName, "DaylightName");
192                 Assert.AreEqual (tz.StandardName, clone.StandardName, "StandardName");
193         }
194
195         static private byte[] serialized_timezone = {
196 #if NET_2_0
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, 0x03, 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, 0x03, 0x00, 0x00, 0x00, 0x08, 0x08, 0xCC, 0x07, 0x00, 0x00, 0x08, 
216                 0x08, 0xD5, 0x07, 0x00, 0x00, 0x08, 0x08, 0xD2, 0x07, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x06, 
217                 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x21, 0x53, 0x79, 0x73, 
218                 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x44, 0x61, 0x79, 0x6C, 
219                 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x03, 0x00, 0x00, 0x00, 0x07, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x05, 0x6D, 
220                 0x5F, 0x65, 0x6E, 0x64, 0x07, 0x6D, 0x5F, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0C, 0x00, 0x10, 0xFA, 0x0F, 
221                 0x3D, 0xF2, 0xBC, 0x88, 0x00, 0x50, 0xD5, 0xB1, 0xC1, 0x91, 0xBD, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x07, 
222                 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x23, 0xFA, 0x07, 0x06, 0xC7, 0x88, 0x00, 0xD0, 0xE2, 0xC4, 0x0C, 0xAB, 0xC7, 
223                 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0C, 0x0F, 
224                 0xEF, 0xAB, 0xC3, 0x88, 0x00, 0x90, 0xE7, 0xB0, 0x73, 0x4B, 0xC4, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x0B
225 #else
226                 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 
227                 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x54, 
228                 0x69, 0x6D, 0x65, 0x5A, 0x6F, 0x6E, 0x65, 0x04, 0x00, 0x00, 0x00, 0x17, 0x6D, 0x5F, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 
229                 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x73, 0x0D, 0x6D, 0x5F, 0x74, 0x69, 0x63, 0x6B, 0x73, 0x4F, 
230                 0x66, 0x66, 0x73, 0x65, 0x74, 0x0E, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x4E, 0x61, 0x6D, 0x65, 0x0E, 0x6D, 
231                 0x5F, 0x64, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x03, 0x00, 0x01, 0x01, 0x1C, 0x53, 0x79, 0x73, 0x74, 
232                 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 
233                 0x6C, 0x65, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x17, 0xD6, 0xFF, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x15, 
234                 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x0A, 
235                 0x04, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 
236                 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x4C, 0x6F, 0x61, 0x64, 0x46, 
237                 0x61, 0x63, 0x74, 0x6F, 0x72, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x08, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 
238                 0x10, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x08, 0x48, 0x61, 0x73, 0x68, 
239                 0x53, 0x69, 0x7A, 0x65, 0x04, 0x4B, 0x65, 0x79, 0x73, 0x06, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x73, 0x00, 0x00, 0x03, 0x03, 0x00, 0x05, 
240                 0x05, 0x0B, 0x08, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 
241                 0x2E, 0x49, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 0x24, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 
242                 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x49, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 
243                 0x64, 0x65, 0x72, 0x08, 0xEC, 0x51, 0x38, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 
244                 0x00, 0x09, 0x05, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x08, 0xCC, 0x07, 0x00, 0x00, 0x08, 
245                 0x08, 0xD2, 0x07, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 
246                 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x21, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 
247                 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x44, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x03, 0x00, 0x00, 
248                 0x00, 0x07, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x05, 0x6D, 0x5F, 0x65, 0x6E, 0x64, 0x07, 0x6D, 0x5F, 0x64, 0x65, 0x6C, 0x74, 
249                 0x61, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0C, 0x00, 0x10, 0xFA, 0x0F, 0x3D, 0xF2, 0xBC, 0x08, 0x00, 0x50, 0xD5, 0xB1, 0xC1, 0x91, 0xBD, 
250                 0x08, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0C, 0x0F, 
251                 0xEF, 0xAB, 0xC3, 0x08, 0x00, 0x90, 0xE7, 0xB0, 0x73, 0x4B, 0xC4, 0x08, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x0B
252 #endif
253         };
254
255         [Test]
256         [Category ("NotWorking")] 
257         // 1.x - deserialize but strings are null
258         // 2.x - eexception when creating a datetime with a negative value
259         public void DeserializeKnownValue ()
260         {
261                 MemoryStream ms = new MemoryStream (serialized_timezone);
262                 BinaryFormatter bf = new BinaryFormatter ();
263                 TimeZone tz = (TimeZone) bf.Deserialize (ms);
264                 Assert.AreEqual ("Eastern Daylight Time", tz.DaylightName, "DaylightName");
265                 Assert.AreEqual ("Eastern Standard Time", tz.StandardName, "StandardName");
266         }
267
268         [Test]
269         public void ToLocalTimeAtDSTBoundaries ()
270         {
271                 TimeZone tz = TimeZone.CurrentTimeZone;
272                 DateTime dst_start_utc = tz.GetDaylightChanges(2007).Start.ToUniversalTime ();
273
274                 if (dst_start_utc == DateTime.MinValue)
275                         return;
276                 Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Subtract (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc), "0:1:59 < 0:3:00");
277                 Assert.IsTrue (tz.ToLocalTime (dst_start_utc) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))), "0:3:00 < 0:3:01");
278                 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");
279                 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");
280                 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");
281         }
282
283                 [Test]
284                 public void StaticProperties ()
285                 {
286                         Assert.IsNotNull (TimeZoneInfo.Local, "Local");
287                         Assert.IsNotNull (TimeZoneInfo.Utc, "Utc");
288                 }
289                 
290                 [Test]
291                 public void FindSystemTimeZoneById ()
292                 {
293                         TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById ("Canada/Eastern");
294                         Assert.AreEqual ("EDT", tzi.DaylightName, "DaylightName");
295                         Assert.AreEqual ("EST", tzi.StandardName, "StandardName");
296                         Assert.IsTrue (tzi.SupportsDaylightSavingTime, "SupportsDaylightSavingTime");
297                 }
298
299 #if MOBILE
300                 // On device we cannot read the OS file system to look for /etc/localtime
301                 // and /usr/share/zoneinfo - so we must initialize the BCL TimeZoneInfo
302                 // from NSTimeZoneInfo. The tests here check the code paths between the
303                 // two types - if they break then TimeZoneInfo work work at all
304                 // ref: http://bugzilla.xamarin.com/show_bug.cgi?id=1790
305                 
306                 bool incomplete_data_on_simulator_only_bug;
307
308                 [Test]
309                 public void GetSystemTimeZones ()
310                 {
311                         // if test is executed a second time then it report less than 400 (about 127) items available
312                         if (incomplete_data_on_simulator_only_bug)
313                                 Assert.Ignore ("known to fail on some iOS simulator versions - see source comments");
314                         
315                         try {
316                                 Assert.That (TimeZoneInfo.GetSystemTimeZones ().Count, Is.GreaterThan (400), "GetSystemTimeZones");
317                         } catch (NullReferenceException) {
318                                 // that's a weird one. It failed on iOS 5.1 *beta* simulator (on Lion) but it worked on *final*
319                                 // now it fails on Snow Leopard the same way (incomplete data) with iOS5 simulator (OS update ?)
320                                 // but it *never*ever* failed on devices
321                                 incomplete_data_on_simulator_only_bug = true;
322                                 if (MonoTouch.ObjCRuntime.Runtime.Arch == MonoTouch.ObjCRuntime.Arch.SIMULATOR)
323                                         Assert.Ignore ("known to fail on some iOS simulator versions - see source comments");
324                         }
325                 }
326 #endif
327         }
328 }