2 // TimeZoneTest.cs - NUnit Test Cases for the System.TimeZone struct
5 // Martin Baulig (martin@gnome.org)
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // (C) 2002 Martin Baulig
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
12 using NUnit.Framework;
15 using System.Threading;
16 using System.Globalization;
17 using System.Runtime.Serialization.Formatters.Binary;
19 namespace MonoTests.System {
22 public class TimeZoneTest {
24 private void CET (TimeZone t1)
26 Assert.AreEqual("CET", t1.StandardName, "A01");
27 Assert.AreEqual("CEST", t1.DaylightName, "A02");
29 DaylightTime d1 = t1.GetDaylightChanges (2002);
30 Assert.AreEqual("03/31/2002 02:00:00", d1.Start.ToString ("G", CultureInfo.InvariantCulture), "A03");
31 Assert.AreEqual("10/27/2002 03:00:00", d1.End.ToString ("G", CultureInfo.InvariantCulture), "A04");
32 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "A05");
34 DaylightTime d2 = t1.GetDaylightChanges (1996);
35 Assert.AreEqual("03/31/1996 02:00:00", d2.Start.ToString ("G", CultureInfo.InvariantCulture), "A06");
36 Assert.AreEqual("10/27/1996 03:00:00", d2.End.ToString ("G", CultureInfo.InvariantCulture), "A07");
37 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "A08");
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");
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");
50 // Test TimeZone methods with UTC DateTime in DST.
51 DateTime d6 = d4.ToUniversalTime ();
52 Assert.AreEqual(false, t1.IsDaylightSavingTime (d6), "A15");
53 Assert.AreEqual(0, t1.GetUtcOffset (d6).Ticks, "A16");
56 private void EST (TimeZone t1)
58 // It could be EST though...
59 //Assert.AreEqual("Eastern Standard Time", t1.StandardName, "B01");
60 //Assert.AreEqual("Eastern Daylight Time", t1.DaylightName, "B02");
62 DaylightTime d1 = t1.GetDaylightChanges (2002);
63 Assert.AreEqual("04/07/2002 02:00:00", d1.Start.ToString ("G", CultureInfo.InvariantCulture), "B03");
64 Assert.AreEqual("10/27/2002 02:00:00", d1.End.ToString ("G", CultureInfo.InvariantCulture), "B04");
65 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "B05");
67 DaylightTime d2 = t1.GetDaylightChanges (1996);
68 Assert.AreEqual("04/07/1996 02:00:00", d2.Start.ToString ("G", CultureInfo.InvariantCulture), "B06");
69 Assert.AreEqual("10/27/1996 02:00:00", d2.End.ToString ("G", CultureInfo.InvariantCulture), "B07");
70 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "B08");
72 DateTime d3 = new DateTime (2002,2,25);
73 Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "B09");
74 DateTime d4 = new DateTime (2002,4,8);
75 Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "B10");
77 DateTime d5 = new DateTime (2002,11,4);
78 Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "B11");
80 Assert.AreEqual(-180000000000L, t1.GetUtcOffset (d3).Ticks, "B12");
81 Assert.AreEqual(-144000000000L, t1.GetUtcOffset (d4).Ticks, "B13");
82 Assert.AreEqual(-180000000000L, t1.GetUtcOffset (d5).Ticks, "B14");
84 // Test TimeZone methods with UTC DateTime in DST.
85 DateTime d6 = d4.ToUniversalTime ();
86 Assert.AreEqual(false, t1.IsDaylightSavingTime (d6), "B15");
87 Assert.AreEqual(0, t1.GetUtcOffset (d6).Ticks, "B16");
90 private void TST (TimeZone t1)
92 Assert.AreEqual("Tokyo Standard Time", t1.StandardName, "C01");
93 Assert.AreEqual("Tokyo Standard Time", t1.DaylightName, "C02");
95 DateTime d3 = new DateTime (2002,2,25);
96 Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "C09");
97 DateTime d4 = new DateTime (2002,4,8);
98 Assert.AreEqual(false, t1.IsDaylightSavingTime (d4), "C10");
99 DateTime d5 = new DateTime (2002,11,4);
100 Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "C11");
102 Assert.AreEqual(324000000000L, t1.GetUtcOffset (d3).Ticks, "C12");
103 Assert.AreEqual(324000000000L, t1.GetUtcOffset (d4).Ticks, "C13");
104 Assert.AreEqual(324000000000L, t1.GetUtcOffset (d5).Ticks, "C14");
107 private void GMT (TimeZone t1) {
108 // Probably wont work on MS.NET, but is better than nothing. Where do
109 // we change our implementation to match theirs?
111 Assert.AreEqual("GMT", t1.StandardName, "D01");
112 Assert.IsTrue("BST" == t1.DaylightName || "IST" == t1.DaylightName, "D02");
114 DaylightTime d1 = t1.GetDaylightChanges (2002);
115 Assert.AreEqual("03/31/2002 01:00:00", d1.Start.ToString ("G", CultureInfo.InvariantCulture), "D03");
116 Assert.AreEqual("10/27/2002 02:00:00", d1.End.ToString ("G", CultureInfo.InvariantCulture), "D04");
117 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "D05");
119 DaylightTime d2 = t1.GetDaylightChanges (1996);
120 Assert.AreEqual("03/31/1996 01:00:00", d2.Start.ToString ("G", CultureInfo.InvariantCulture), "D06");
121 Assert.AreEqual("10/27/1996 02:00:00", d2.End.ToString ("G", CultureInfo.InvariantCulture), "D07");
122 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "D08");
124 DateTime d3 = new DateTime (2002,2,25);
125 Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "D09");
126 DateTime d4 = new DateTime (2002,4,2);
127 Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "D10");
128 DateTime d5 = new DateTime (2002,11,4);
129 Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "D11");
131 Assert.AreEqual(0L, t1.GetUtcOffset (d3).Ticks, "D12");
132 Assert.AreEqual(36000000000L, t1.GetUtcOffset (d4).Ticks, "D13");
133 Assert.AreEqual(0L, t1.GetUtcOffset (d5).Ticks, "D14");
135 // Test TimeZone methods with UTC DateTime in DST.
136 DateTime d6 = d4.ToUniversalTime ();
137 Assert.AreEqual(false, t1.IsDaylightSavingTime (d6), "D15");
138 Assert.AreEqual(0, t1.GetUtcOffset (d6).Ticks, "D16");
141 private void NZST(TimeZone t1) {
142 Assert.AreEqual("NZST", t1.StandardName, "E01");
143 Assert.AreEqual("NZDT", t1.DaylightName, "E02");
145 DaylightTime d1 = t1.GetDaylightChanges (2013);
146 Assert.AreEqual("09/29/2013 02:00:00", d1.Start.ToString ("G", CultureInfo.InvariantCulture), "E03");
147 Assert.AreEqual("04/07/2013 03:00:00", d1.End.ToString ("G", CultureInfo.InvariantCulture), "E04");
148 Assert.AreEqual(36000000000L, d1.Delta.Ticks, "E05");
150 DaylightTime d2 = t1.GetDaylightChanges (2001);
151 Assert.AreEqual("10/07/2001 02:00:00", d2.Start.ToString ("G", CultureInfo.InvariantCulture), "E06");
152 Assert.AreEqual("03/18/2001 03:00:00", d2.End.ToString ("G", CultureInfo.InvariantCulture), "E07");
153 Assert.AreEqual(36000000000L, d2.Delta.Ticks, "E08");
155 DateTime d3 = new DateTime(2013,02,15);
156 Assert.AreEqual(true, t1.IsDaylightSavingTime (d3), "E09");
157 DateTime d4 = new DateTime(2013,04,30);
158 Assert.AreEqual(false, t1.IsDaylightSavingTime (d4), "E10");
159 DateTime d5 = new DateTime(2013,11,03);
160 Assert.AreEqual(true, t1.IsDaylightSavingTime (d5), "E11");
162 Assert.AreEqual(36000000000L /*hour*/ * 13L, t1.GetUtcOffset (d3).Ticks, "E12");
163 Assert.AreEqual(36000000000L /*hour*/ * 12L, t1.GetUtcOffset (d4).Ticks, "E13");
164 Assert.AreEqual(36000000000L /*hour*/ * 13L, t1.GetUtcOffset (d5).Ticks, "E14");
166 // Test TimeZone methods with UTC DateTime in DST.
167 DateTime d6 = d5.ToUniversalTime ();
168 Assert.AreEqual(false, t1.IsDaylightSavingTime (d6), "E15");
169 Assert.AreEqual(0, t1.GetUtcOffset (d6).Ticks, "E16");
173 public void TestCtors ()
175 TimeZone t1 = TimeZone.CurrentTimeZone;
176 switch (t1.StandardName) {
180 case "Eastern Standard Time":
184 case "Tokyo Standard Time":
194 NUnit.Framework.Assert.Ignore ("Your time zone (" + t1.StandardName + ") isn't defined in the test case");
200 public void CurrentTimeZone_SerializationRoundtrip ()
202 TimeZone tz = TimeZone.CurrentTimeZone;
203 BinaryFormatter bf = new BinaryFormatter ();
204 MemoryStream ms = new MemoryStream ();
205 bf.Serialize (ms, tz);
208 TimeZone clone = (TimeZone) bf.Deserialize (ms);
210 Assert.AreEqual (tz.DaylightName, clone.DaylightName, "DaylightName");
211 Assert.AreEqual (tz.StandardName, clone.StandardName, "StandardName");
214 static private byte[] serialized_timezone = {
215 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00,
216 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x54,
217 0x69, 0x6D, 0x65, 0x5A, 0x6F, 0x6E, 0x65, 0x04, 0x00, 0x00, 0x00, 0x17, 0x6D, 0x5F, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61,
218 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x73, 0x0D, 0x6D, 0x5F, 0x74, 0x69, 0x63, 0x6B, 0x73, 0x4F,
219 0x66, 0x66, 0x73, 0x65, 0x74, 0x0E, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x4E, 0x61, 0x6D, 0x65, 0x0E, 0x6D,
220 0x5F, 0x64, 0x61, 0x79, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x03, 0x00, 0x01, 0x01, 0x1C, 0x53, 0x79, 0x73, 0x74,
221 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62,
222 0x6C, 0x65, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x17, 0xD6, 0xFF, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x15,
223 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x0A,
224 0x04, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F,
225 0x6E, 0x73, 0x2E, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x4C, 0x6F, 0x61, 0x64, 0x46,
226 0x61, 0x63, 0x74, 0x6F, 0x72, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x08, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72,
227 0x10, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x72, 0x08, 0x48, 0x61, 0x73, 0x68,
228 0x53, 0x69, 0x7A, 0x65, 0x04, 0x4B, 0x65, 0x79, 0x73, 0x06, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x73, 0x00, 0x00, 0x03, 0x03, 0x00, 0x05,
229 0x05, 0x0B, 0x08, 0x1C, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
230 0x2E, 0x49, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x72, 0x24, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x43, 0x6F, 0x6C, 0x6C,
231 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, 0x49, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6F, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x76, 0x69,
232 0x64, 0x65, 0x72, 0x08, 0xEC, 0x51, 0x38, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00,
233 0x00, 0x09, 0x05, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x08, 0xCC, 0x07, 0x00, 0x00, 0x08,
234 0x08, 0xD5, 0x07, 0x00, 0x00, 0x08, 0x08, 0xD2, 0x07, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x06,
235 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x21, 0x53, 0x79, 0x73,
236 0x74, 0x65, 0x6D, 0x2E, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x44, 0x61, 0x79, 0x6C,
237 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x03, 0x00, 0x00, 0x00, 0x07, 0x6D, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x05, 0x6D,
238 0x5F, 0x65, 0x6E, 0x64, 0x07, 0x6D, 0x5F, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0C, 0x00, 0x10, 0xFA, 0x0F,
239 0x3D, 0xF2, 0xBC, 0x88, 0x00, 0x50, 0xD5, 0xB1, 0xC1, 0x91, 0xBD, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x07,
240 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x23, 0xFA, 0x07, 0x06, 0xC7, 0x88, 0x00, 0xD0, 0xE2, 0xC4, 0x0C, 0xAB, 0xC7,
241 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0C, 0x0F,
242 0xEF, 0xAB, 0xC3, 0x88, 0x00, 0x90, 0xE7, 0xB0, 0x73, 0x4B, 0xC4, 0x88, 0x00, 0x68, 0xC4, 0x61, 0x08, 0x00, 0x00, 0x00, 0x0B
246 [Category ("NotWorking")]
247 // 1.x - deserialize but strings are null
248 // 2.x - eexception when creating a datetime with a negative value
249 public void DeserializeKnownValue ()
251 MemoryStream ms = new MemoryStream (serialized_timezone);
252 BinaryFormatter bf = new BinaryFormatter ();
253 TimeZone tz = (TimeZone) bf.Deserialize (ms);
254 Assert.AreEqual ("Eastern Daylight Time", tz.DaylightName, "DaylightName");
255 Assert.AreEqual ("Eastern Standard Time", tz.StandardName, "StandardName");
259 public void ToLocalTimeAtDSTBoundaries ()
261 TimeZone tz = TimeZone.CurrentTimeZone;
262 DateTime dst_start_utc = tz.GetDaylightChanges(2007).Start.ToUniversalTime ();
264 if (dst_start_utc == DateTime.MinValue)
265 Assert.Ignore ("Couldn't get beginning of daylight saving time in 2007.");
266 Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Subtract (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc), "0:1:59 < 0:3:00");
267 Assert.IsTrue (tz.ToLocalTime (dst_start_utc) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))), "0:3:00 < 0:3:01");
268 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");
269 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");
270 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");
274 public void GetUtcOffsetAtDSTBoundary ()
277 * Getting a definitive list of timezones which do or don't observe Daylight
278 * Savings is difficult (can't say America's or USA definitively) and lengthy see
280 * http://en.wikipedia.org/wiki/Daylight_saving_time_by_country
282 * as a good starting point for a list.
284 * The following are SOME of the timezones/regions which do support daylight savings.
288 * USA (EST, CST, MST, PST, AKST) note this does not cover all states or regions
289 * Europe/London (GMT)
290 * CET (member states of the European Union)
292 * This test should work in all the above timezones
296 TimeZone tz = TimeZone.CurrentTimeZone;
297 int year = DateTime.Now.Year;
298 DaylightTime daylightChanges = tz.GetDaylightChanges(year);
299 DateTime dst_end = daylightChanges.End;
301 if (dst_end == DateTime.MinValue)
302 Assert.Ignore (tz.StandardName + " did not observe daylight saving time during " + year + ".");
304 var standardOffset = tz.GetUtcOffset(daylightChanges.Start.AddMinutes(-1));
306 Assert.AreEqual(standardOffset, tz.GetUtcOffset (dst_end));
307 Assert.AreEqual(standardOffset, tz.GetUtcOffset (dst_end.Add (daylightChanges.Delta.Negate ().Add (TimeSpan.FromSeconds(1)))));
308 Assert.AreEqual(standardOffset, tz.GetUtcOffset (dst_end.Add(daylightChanges.Delta.Negate ())));
309 Assert.AreNotEqual(standardOffset, tz.GetUtcOffset (dst_end.Add(daylightChanges.Delta.Negate ().Add (TimeSpan.FromSeconds(-1)))));
314 public void StaticProperties ()
316 Assert.IsNotNull (TimeZoneInfo.Local, "Local");
317 Assert.IsNotNull (TimeZoneInfo.Utc, "Utc");
321 public void FindSystemTimeZoneById ()
323 TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById ("Canada/Eastern");
324 Assert.AreEqual ("EDT", tzi.DaylightName, "DaylightName");
325 Assert.AreEqual ("EST", tzi.StandardName, "StandardName");
326 Assert.IsTrue (tzi.SupportsDaylightSavingTime, "SupportsDaylightSavingTime");
330 // On device we cannot read the OS file system to look for /etc/localtime
331 // and /usr/share/zoneinfo - so we must initialize the BCL TimeZoneInfo
332 // from NSTimeZoneInfo. The tests here check the code paths between the
333 // two types - if they break then TimeZoneInfo work work at all
334 // ref: http://bugzilla.xamarin.com/show_bug.cgi?id=1790
336 bool incomplete_data_on_simulator_only_bug;
339 public void GetSystemTimeZones ()
341 // if test is executed a second time then it report less than 400 (about 127) items available
342 if (incomplete_data_on_simulator_only_bug)
343 Assert.Ignore ("known to fail on some iOS simulator versions - see source comments");
346 Assert.That (TimeZoneInfo.GetSystemTimeZones ().Count, Is.GreaterThan (400), "GetSystemTimeZones");
347 } catch (NullReferenceException) {
348 // that's a weird one. It failed on iOS 5.1 *beta* simulator (on Lion) but it worked on *final*
349 // now it fails on Snow Leopard the same way (incomplete data) with iOS5 simulator (OS update ?)
350 // but it *never*ever* failed on devices
351 incomplete_data_on_simulator_only_bug = true;
353 if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
355 if (MonoTouch.ObjCRuntime.Runtime.Arch == MonoTouch.ObjCRuntime.Arch.SIMULATOR)
357 Assert.Ignore ("known to fail on some iOS simulator versions - see source comments");