new tests for empty string
[mono.git] / mcs / class / corlib / Test / System / DateTimeTest.cs
1 //
2 // DateTimeTest.cs - NUnit Test Cases for the System.DateTime struct
3 //
4 // author:
5 //   Martin Baulig (martin@gnome.org)
6 //
7 //   (C) 2002 Free Software Foundation
8 // Copyright (C) 2004 Novell (http://www.novell.com)
9 //
10
11 using System;
12 using System.IO;
13 using System.Threading;
14 using System.Globalization;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.System
19 {
20         [TestFixture]
21         public class DateTimeTest
22         {
23                 [Flags]
24                 internal enum Resolution : ushort
25                 {
26                         Year = 64,
27                         Month = 96,
28                         Day = 112,
29                         Hour = 120,
30                         Minute = 124,
31                         Second = 126,
32                         Millisecond = 127,
33                         _Month = 32,
34                         _Day = 16,
35                         _Hour = 8,
36                         _Minute = 4,
37                         _Second = 2,
38                         _Millisecond = 1
39                 }
40
41                 internal void DTAssertEquals (DateTime actual, DateTime expected, Resolution resolution)
42                 {
43                         DTAssertEquals ("", actual, expected, resolution);
44                 }
45
46                 internal void DTAssertEquals (string message, DateTime expected, DateTime actual, Resolution resolution)
47                 {
48                         if ((resolution & Resolution.Year) != 0)
49                                 Assert.AreEqual (expected.Year, actual.Year, message);
50                         if ((resolution & Resolution._Month) != 0)
51                                 Assert.AreEqual (expected.Month, actual.Month, message);
52                         if ((resolution & Resolution._Day) != 0)
53                                 Assert.AreEqual (expected.Day, actual.Day, message);
54                         if ((resolution & Resolution._Hour) != 0)
55                                 Assert.AreEqual (expected.Hour, actual.Hour, message);
56                         if ((resolution & Resolution._Minute) != 0)
57                                 Assert.AreEqual (expected.Minute, actual.Minute, message);
58                         if ((resolution & Resolution._Second) != 0)
59                                 Assert.AreEqual (expected.Second, actual.Second, message);
60                         if ((resolution & Resolution._Millisecond) != 0)
61                                 Assert.AreEqual (expected.Millisecond, actual.Millisecond, message);
62                 }
63
64                 private CultureInfo oldcult;
65         
66                 long[] myTicks = {
67                         631501920000000000L,    // 25 Feb 2002 - 00:00:00
68                         631502475130080000L,    // 25 Feb 2002 - 15:25:13,8
69                         631502115130080000L,    // 25 Feb 2002 - 05:25:13,8
70                         631502115000000000L,    // 25 Feb 2002 - 05:25:00
71                         631502115130000000L,    // 25 Feb 2002 - 05:25:13
72                         631502079130000000L,    // 25 Feb 2002 - 04:25:13
73                         629197085770000000L,    // 06 Nov 1994 - 08:49:37 
74                         631796544000000000L,    // 01 Feb 2003 - 00:00:00
75                 };
76
77                 [SetUp]
78                 public void SetUp() 
79                 {
80                         // the current culture determines the result of formatting
81                         oldcult = Thread.CurrentThread.CurrentCulture;
82                         Thread.CurrentThread.CurrentCulture = new CultureInfo ("");
83                 }
84         
85                 [TearDown]
86                 public void TearDown ()
87                 {
88                         Thread.CurrentThread.CurrentCulture = oldcult;
89                 }
90
91                 [Test]
92                 public void TestCtors ()
93                 {
94                         DateTime t1 = new DateTime (2002,2,25);
95                         Assert.AreEqual (myTicks [0], t1.Ticks, "A01");
96                         DateTime t2 = new DateTime (2002,2,25,15,25,13,8);
97                         Assert.AreEqual (myTicks [1], t2.Ticks, "A02");
98                         Assert.AreEqual (myTicks [0], t2.Date.Ticks, "A03");
99                         Assert.AreEqual (2002, t2.Year, "A04");
100                         Assert.AreEqual (2, t2.Month, "A05");
101                         Assert.AreEqual (25, t2.Day, "A06");
102                         Assert.AreEqual (15, t2.Hour, "A07");
103                         Assert.AreEqual (25, t2.Minute, "A08");
104                         Assert.AreEqual (13, t2.Second, "A09");
105                         Assert.AreEqual (8, t2.Millisecond, "A10");
106                         DateTime t3 = new DateTime (2002,2,25,5,25,13,8);
107                         Assert.AreEqual (myTicks [2], t3.Ticks, "A11");
108                 }
109
110                 [Test]
111                 public void Constructor_Max ()
112                 {
113                         Assert.AreEqual (3155378975999990000, new DateTime (9999, 12, 31, 23, 59, 59, 999).Ticks, "Max");
114                 }
115
116                 [Test]
117                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
118                 public void Constructor_Milliseconds_Negative () 
119                 {
120                         new DateTime (9999, 12, 31, 23, 59, 59, -1);
121                 }
122
123                 [Test]
124                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
125                 public void Constructor_Milliseconds_1000 () 
126                 {
127                         new DateTime (9999, 12, 31, 23, 59, 59, 1000);
128                 }
129                 
130                 [Test]
131                 public void Fields ()
132                 {
133                         Assert.AreEqual (3155378975999999999L, DateTime.MaxValue.Ticks, "#1");
134                         Assert.AreEqual (0, DateTime.MinValue.Ticks, "#2");
135                 }
136                 
137                 [Test]
138                 public void Add ()
139                 {
140                         DateTime t1 = new DateTime (myTicks [1]);
141                         TimeSpan span = new TimeSpan (3, 54, 1);
142                         DateTime t2 = t1.Add (span);
143
144                         Assert.AreEqual (25, t2.Day, "#1");
145                         Assert.AreEqual (19, t2.Hour, "#2");
146                         Assert.AreEqual (19, t2.Minute, "#3");
147                         Assert.AreEqual (14, t2.Second, "#4");
148
149                         Assert.AreEqual (25, t1.Day, "#5");
150                         Assert.AreEqual (15, t1.Hour, "#6");
151                         Assert.AreEqual (25, t1.Minute, "#7");
152                         Assert.AreEqual (13, t1.Second, "#8");
153                 }
154                 
155                 [Test]
156                 [ExpectedException(typeof (ArgumentOutOfRangeException))]
157                 public void AddOutOfRangeException1 ()
158                 {
159                         DateTime t1 = new DateTime (myTicks [1]);
160                         t1.Add (TimeSpan.MaxValue);
161                 }
162
163                 [Test]
164                 [ExpectedException(typeof (ArgumentOutOfRangeException))]
165                 public void AddOutOfRangeException2 ()
166                 {
167                         DateTime t1 = new DateTime (myTicks [1]);
168                         t1.Add (TimeSpan.MinValue);
169                 }
170         
171                 [Test]
172                 public void AddDays ()
173                 {
174                         DateTime t1 = new DateTime (myTicks [1]);
175                         t1 = t1.AddDays (3);
176                         Assert.AreEqual (28, t1.Day, "#A1");
177                         Assert.AreEqual (15, t1.Hour, "#A2");
178                         Assert.AreEqual (25, t1.Minute, "#A3");
179                         Assert.AreEqual (13, t1.Second, "#A4");
180                         
181                         t1 = t1.AddDays (1.9);
182                         Assert.AreEqual (2, t1.Day, "#B1");
183                         Assert.AreEqual (13, t1.Hour, "#B2");
184                         Assert.AreEqual (1, t1.Minute, "#B3");
185                         Assert.AreEqual (13, t1.Second, "#B4");
186
187                         t1 = t1.AddDays (0.2);
188                         Assert.AreEqual (2, t1.Day, "#C1");
189                         Assert.AreEqual (17, t1.Hour, "#C2");
190                         Assert.AreEqual (49, t1.Minute, "#C3");
191                         Assert.AreEqual (13, t1.Second, "#C4");
192                 }
193                 
194                 [Test]
195                 [ExpectedException(typeof (ArgumentOutOfRangeException))]
196                 public void AddDaysOutOfRangeException1 ()
197                 {
198                         DateTime t1 = new DateTime (myTicks [1]);
199                         t1.AddDays (10000000);
200                 }
201
202                 [Test]
203                 [ExpectedException(typeof (ArgumentOutOfRangeException))]
204                 public void AddDaysOutOfRangeException2 ()
205                 {
206                         DateTime t1 = new DateTime (myTicks [1]);
207                         t1.AddDays (-10000000);
208                 }
209
210                 [Test]
211                 public void AddHours ()
212                 {
213                         DateTime t1 = new DateTime (myTicks [1]);
214                         t1 = t1.AddHours (10);
215                         Assert.AreEqual (26, t1.Day, "#A1");
216                         Assert.AreEqual (1, t1.Hour, "#A2");
217                         Assert.AreEqual (25, t1.Minute, "#A3");
218                         Assert.AreEqual (13, t1.Second, "#A4");
219                         
220                         t1 = t1.AddHours (-3.7);
221                         Assert.AreEqual (25, t1.Day, "#B1");
222                         Assert.AreEqual (21, t1.Hour, "#B2");
223                         Assert.AreEqual (43, t1.Minute, "#B3");
224                         Assert.AreEqual (13, t1.Second, "#B4");
225
226                         t1 = t1.AddHours (3.732);
227                         Assert.AreEqual (26, t1.Day, "#C1");
228                         Assert.AreEqual (1, t1.Hour, "#C2");
229                         Assert.AreEqual (27, t1.Minute, "#C3");
230                         Assert.AreEqual (8, t1.Second, "#C4");
231                 }
232                 
233                 [Test]
234                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
235                 public void AddHoursOutOfRangeException1 ()
236                 {
237                         DateTime t1 = new DateTime (myTicks [1]);
238                         t1.AddHours (9E100);
239                 }
240
241                 [Test]
242                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
243                 public void AddHoursOutOfRangeException2 ()
244                 {
245                         DateTime t1 = new DateTime (myTicks [1]);
246                         t1.AddHours (-9E100);
247                 }
248
249                 [Test]
250                 public void AddMilliseconds ()
251                 {
252                         DateTime t1 = new DateTime (myTicks [1]);
253                         t1 = t1.AddMilliseconds (1E10);
254                         Assert.AreEqual (21, t1.Day, "#A1");
255                         Assert.AreEqual (9, t1.Hour, "#A2");
256                         Assert.AreEqual (11, t1.Minute, "#A3");
257                         Assert.AreEqual (53, t1.Second, "#A4");
258                         
259                         t1 = t1.AddMilliseconds (-19E10);
260                         Assert.AreEqual (13, t1.Day, "#B1");
261                         Assert.AreEqual (7, t1.Hour, "#B2");
262                         Assert.AreEqual (25, t1.Minute, "#B3");
263                         Assert.AreEqual (13, t1.Second, "#B4");
264
265                         t1 = t1.AddMilliseconds (15.623);
266                         Assert.AreEqual (13, t1.Day, "#C1");
267                         Assert.AreEqual (7, t1.Hour, "#C2");
268                         Assert.AreEqual (25, t1.Minute, "#C3");
269                         Assert.AreEqual (13, t1.Second, "#C4");
270                 }
271
272                 [Test]
273                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
274                 public void AddMillisecondsOutOfRangeException1 ()
275                 {
276                         DateTime t1 = new DateTime (myTicks [1]);
277                         t1.AddMilliseconds (9E100);
278                 }
279
280                 [Test]
281                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
282                 public void AddMillisecondsOutOfRangeException2 ()
283                 {
284                         DateTime t1 = new DateTime (myTicks [1]);
285                         t1.AddMilliseconds (-9E100);
286                 }
287
288                 [Test]
289                 public void TestToString ()
290                 {
291                         DateTime t1 = new DateTime (myTicks[2]);
292                         DateTime t2 = new DateTime (myTicks[1]);
293                         DateTime t3 = new DateTime (999, 1, 2, 3, 4, 5);
294                         // Standard patterns
295                         Assert.AreEqual ("02/25/2002", t1.ToString ("d"), "#A1");
296                         Assert.AreEqual ("Monday, 25 February 2002", t1.ToString ("D"), "#A2");
297                         Assert.AreEqual ("Monday, 25 February 2002 05:25", t1.ToString ("f"), "#A3");
298                         Assert.AreEqual ("Monday, 25 February 2002 05:25:13", t1.ToString ("F"), "#A4");
299                         Assert.AreEqual ("02/25/2002 05:25", t1.ToString ("g"), "#A5");
300                         Assert.AreEqual ("02/25/2002 05:25:13", t1.ToString ("G"), "#A6");
301                         Assert.AreEqual ("February 25", t1.ToString ("m"), "#A7");
302                         Assert.AreEqual ("February 25", t1.ToString ("M"), "#A8");
303                         Assert.AreEqual ("Mon, 25 Feb 2002 05:25:13 GMT", t1.ToString ("r"), "#A9");
304                         Assert.AreEqual ("Mon, 25 Feb 2002 05:25:13 GMT", t1.ToString ("R"), "#A10");
305                         Assert.AreEqual ("2002-02-25T05:25:13", t1.ToString ("s"), "#A11");
306                         Assert.AreEqual ("05:25", t1.ToString ("t"), "#A12");
307                         Assert.AreEqual ("05:25:13", t1.ToString ("T"), "#A13");
308                         Assert.AreEqual ("2002-02-25 05:25:13Z", t1.ToString ("u"), "#A14");
309                         // FIXME: this test is timezone dependent
310                         // Assert.AreEqual ("Sunday, 24 February 2002 11:25:13", t1.ToString ("U"), "#A15");
311                         Assert.AreEqual ("2002 February", t1.ToString ("y"), "#A16");
312                         Assert.AreEqual ("2002 February", t1.ToString ("Y"), "#A17");
313                         Assert.AreEqual ("02/25/2002 05:25:13", t1.ToString (""), "#A18");
314
315                         // Custom patterns
316                         Assert.AreEqual ("25", t1.ToString ("%d"), "#B1");
317                         Assert.AreEqual ("25", t1.ToString ("dd"), "#B2");
318                         Assert.AreEqual ("Mon", t1.ToString ("ddd"), "#B3");
319                         Assert.AreEqual ("Monday", t1.ToString ("dddd"), "#B4");
320                         Assert.AreEqual ("2", t1.ToString ("%M"), "#B5");
321                         Assert.AreEqual ("02", t1.ToString ("MM"), "#B6");
322                         Assert.AreEqual ("Feb", t1.ToString ("MMM"), "#B7");
323                         Assert.AreEqual ("February", t1.ToString ("MMMM"), "#B8");
324                         Assert.AreEqual ("2", t1.ToString ("%y"), "#B9");
325                         Assert.AreEqual ("02", t1.ToString ("yy"), "#B10");
326                         Assert.AreEqual ("2002", t1.ToString ("yyyy"), "#B11");
327                         Assert.AreEqual ("5", t1.ToString ("%h"), "#B12");
328                         Assert.AreEqual ("05", t1.ToString ("hh"), "#B13");
329                         Assert.AreEqual ("3", t2.ToString ("%h"), "#B14");
330                         Assert.AreEqual ("03", t2.ToString ("hh"), "#B15");
331                         Assert.AreEqual ("15", t2.ToString ("%H"), "#B16");
332                         Assert.AreEqual ("15", t2.ToString ("HH"), "#B17");
333                         Assert.AreEqual ("25", t2.ToString ("%m"), "#B18");
334                         Assert.AreEqual ("25", t2.ToString ("mm"), "#B19");
335                         Assert.AreEqual ("13", t2.ToString ("%s"), "#B20");
336                         Assert.AreEqual ("13", t2.ToString ("ss"), "#B21");
337                         Assert.AreEqual ("A", t1.ToString ("%t"), "#B22");
338                         Assert.AreEqual ("P", t2.ToString ("%t"), "#B23");
339                         Assert.AreEqual ("AM", t1.ToString ("tt"), "#B24");
340                         Assert.AreEqual ("PM", t2.ToString ("tt"), "#B25");
341                         long offset = TimeZone.CurrentTimeZone.GetUtcOffset(t1).Ticks / 36000000000;
342                         // Must specify '+0' for GMT
343                         Assert.AreEqual (offset.ToString ("+#;-#;+0"), t1.ToString ("%z"), "#B26");
344                         Assert.AreEqual (offset.ToString ("+00;-00;+00"), t1.ToString ("zz"), "#B28");
345                         // This does not work in, eg banglore, because their timezone has an offset of
346                         // +05:30
347                         //Assert.AreEqual (offset.ToString("+00;-00;00") + ":00", t1.ToString ("zzz"), "#B28");
348                         Assert.AreEqual (" : ", t1.ToString (" : "), "#B29");
349                         Assert.AreEqual (" / ", t1.ToString (" / "), "#B30");
350                         Assert.AreEqual (" yyy ", t1.ToString (" 'yyy' "), "#B31");
351                         Assert.AreEqual (" d", t1.ToString (" \\d"), "#B32");
352                         Assert.AreEqual ("2002", t1.ToString ("yyy"), "#B33");
353                         Assert.AreEqual ("0002002", t1.ToString ("yyyyyyy"), "#B34");
354                         Assert.AreEqual ("999", t3.ToString ("yyy"), "#B33");
355                         Assert.AreEqual ("0999", t3.ToString ("yyyy"), "#B33");
356                 }
357
358                 [Test]
359                 public void ParseExact_Format_Empty ()
360                 {
361                         try {
362                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", string.Empty, null);
363                                 Assert.Fail ("#A1");
364                         } catch (FormatException ex) {
365                                 // Format specifier was invalid
366                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#B2");
367                                 Assert.IsNull (ex.InnerException, "#B3");
368                                 Assert.IsNotNull (ex.Message, "#B4");
369                         }
370
371                         try {
372                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", string.Empty, null,
373                                         DateTimeStyles.None);
374                                 Assert.Fail ("#B1");
375                         } catch (FormatException ex) {
376                                 // Format specifier was invalid
377                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#B2");
378                                 Assert.IsNull (ex.InnerException, "#B3");
379                                 Assert.IsNotNull (ex.Message, "#B4");
380                         }
381                 }
382
383                 [Test]
384                 public void ParseExact_Format_Null ()
385                 {
386                         try {
387                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", (string) null, null);
388                                 Assert.Fail ("#A1");
389                         } catch (ArgumentNullException ex) {
390                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
391                                 Assert.IsNull (ex.InnerException, "#A3");
392                                 Assert.IsNotNull (ex.Message, "#A4");
393                                 Assert.IsNotNull (ex.ParamName, "#A5");
394                                 Assert.AreEqual ("format", ex.ParamName, "#A6");
395                         }
396
397                         try {
398                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", (string) null, null,
399                                         DateTimeStyles.None);
400                                 Assert.Fail ("#B1");
401                         } catch (ArgumentNullException ex) {
402                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
403                                 Assert.IsNull (ex.InnerException, "#B3");
404                                 Assert.IsNotNull (ex.Message, "#B4");
405                                 Assert.IsNotNull (ex.ParamName, "#B5");
406                                 Assert.AreEqual ("format", ex.ParamName, "#B6");
407                         }
408                 }
409
410                 [Test]
411                 public void ParseExact_Formats_Empty ()
412                 {
413                         try {
414                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", new string [0],
415                                         null, DateTimeStyles.None);
416                                 Assert.Fail ("#A1");
417                         } catch (FormatException ex) {
418                                 // Format specifier was invalid
419                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#A2");
420                                 Assert.IsNull (ex.InnerException, "#A3");
421                                 Assert.IsNotNull (ex.Message, "#A4");
422                         }
423
424                         string [] formats = new string [] { "G", string.Empty, "d" };
425                         try {
426                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", formats, null,
427                                         DateTimeStyles.None);
428                                 Assert.Fail ("#B1");
429                         } catch (FormatException ex) {
430                                 // Format specifier was invalid
431                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#B2");
432                                 Assert.IsNull (ex.InnerException, "#B3");
433                                 Assert.IsNotNull (ex.Message, "#B4");
434                         }
435                 }
436
437                 [Test]
438                 public void ParseExact_Formats_Null ()
439                 {
440                         try {
441                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", (string []) null,
442                                         null, DateTimeStyles.None);
443                                 Assert.Fail ("#A1");
444                         } catch (ArgumentNullException ex) {
445                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
446                                 Assert.IsNull (ex.InnerException, "#A3");
447                                 Assert.IsNotNull (ex.Message, "#A4");
448                                 Assert.IsNotNull (ex.ParamName, "#A5");
449                                 Assert.AreEqual ("formats", ex.ParamName, "#A6");
450                         }
451
452                         string [] formats = new string [] { "G", null, "d" };
453                         try {
454                                 DateTime.ParseExact ("2002-02-25 04:25:13Z", formats, null,
455                                         DateTimeStyles.None);
456                                 Assert.Fail ("#B1");
457                         } catch (FormatException ex) {
458                                 // Format specifier was invalid
459                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#B2");
460                                 Assert.IsNull (ex.InnerException, "#B3");
461                                 Assert.IsNotNull (ex.Message, "#B4");
462                         }
463                 }
464
465                 [Test]
466                 public void ParseExact_String_Empty ()
467                 {
468                         try {
469                                 DateTime.ParseExact (string.Empty, "G", null);
470                                 Assert.Fail ("#A1");
471                         } catch (FormatException ex) {
472                                 // Format specifier was invalid
473                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#A2");
474                                 Assert.IsNull (ex.InnerException, "#A3");
475                                 Assert.IsNotNull (ex.Message, "#A4");
476                         }
477
478                         try {
479                                 DateTime.ParseExact (string.Empty, "G", null, DateTimeStyles.None);
480                                 Assert.Fail ("#B1");
481                         } catch (FormatException ex) {
482                                 // Format specifier was invalid
483                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#B2");
484                                 Assert.IsNull (ex.InnerException, "#B3");
485                                 Assert.IsNotNull (ex.Message, "#B4");
486                         }
487
488                         try {
489                                 DateTime.ParseExact (string.Empty, new string [] { "G" }, null,
490                                         DateTimeStyles.None);
491                                 Assert.Fail ("#C1");
492                         } catch (FormatException ex) {
493                                 // Format specifier was invalid
494                                 Assert.AreEqual (typeof (FormatException), ex.GetType (), "#C2");
495                                 Assert.IsNull (ex.InnerException, "#C3");
496                                 Assert.IsNotNull (ex.Message, "#C4");
497                         }
498                 }
499
500                 [Test]
501                 public void ParseExact_String_Null ()
502                 {
503                         try {
504                                 DateTime.ParseExact ((string) null, "G", null);
505                                 Assert.Fail ("#A1");
506                         } catch (ArgumentNullException ex) {
507                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
508                                 Assert.IsNull (ex.InnerException, "#A3");
509                                 Assert.IsNotNull (ex.Message, "#A4");
510                                 Assert.IsNotNull (ex.ParamName, "#A5");
511                                 Assert.AreEqual ("s", ex.ParamName, "#A6");
512                         }
513
514                         try {
515                                 DateTime.ParseExact ((string) null, "G", null, DateTimeStyles.None);
516                                 Assert.Fail ("#B1");
517                         } catch (ArgumentNullException ex) {
518                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
519                                 Assert.IsNull (ex.InnerException, "#B3");
520                                 Assert.IsNotNull (ex.Message, "#B4");
521                                 Assert.IsNotNull (ex.ParamName, "#B5");
522                                 Assert.AreEqual ("s", ex.ParamName, "#B6");
523                         }
524
525                         try {
526                                 DateTime.ParseExact ((string) null, new string [] { "G" }, null,
527                                         DateTimeStyles.None);
528                                 Assert.Fail ("#C1");
529                         } catch (ArgumentNullException ex) {
530                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#C2");
531                                 Assert.IsNull (ex.InnerException, "#C3");
532                                 Assert.IsNotNull (ex.Message, "#C4");
533                                 Assert.IsNotNull (ex.ParamName, "#C5");
534                                 Assert.AreEqual ("s", ex.ParamName, "#C6");
535                         }
536                 }
537
538                 [Test]
539                 public void TestParseExact3 ()
540                 {
541                         DateTime t1 = DateTime.ParseExact ("2002-02-25 04:25:13Z", "u", null);
542                         Assert.AreEqual (2002, t1.Year, "#1");
543                         Assert.AreEqual (02, t1.Month, "#2");
544                         Assert.AreEqual (25, t1.Day, "#3");
545                         Assert.AreEqual (04, t1.Hour, "#4");
546                         Assert.AreEqual (25, t1.Minute, "#5");
547                         Assert.AreEqual (13, t1.Second, "#6");
548                 }
549
550                 [Test]
551                 public void TestParseExact4 ()
552                 {
553                         // bug #60912, modified hour as 13:00
554                         string s = "6/28/2004 13:00:00 AM";
555                         string f = "M/d/yyyy HH':'mm':'ss tt";
556                         DateTime.ParseExact (s, f, CultureInfo.InvariantCulture);
557
558                         // bug #63137
559                         DateTime.ParseExact ("Wed, 12 May 2004 20:51:09 +0200",
560                                 @"ddd, d MMM yyyy H:m:s zzz",
561                                 CultureInfo.CreateSpecificCulture("en-us"),
562                                 DateTimeStyles.AllowInnerWhite);
563                 }
564
565                 [Test]
566                 public void TestParseExact ()
567                 {
568                         // Standard patterns
569                         DateTime t1 = DateTime.ParseExact ("02/25/2002", "d", null);
570                         Assert.AreEqual (myTicks [0], t1.Ticks, "#A1");
571                         t1 = DateTime.ParseExact ("Monday, 25 February 2002", "D", null);
572                         Assert.AreEqual (myTicks [0], t1.Ticks, "#A2");
573                         t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25", "f", null);
574                         Assert.AreEqual (myTicks [3], t1.Ticks, "#A3");
575                         t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25:13", "F", null);
576                         Assert.AreEqual (myTicks [4], t1.Ticks, "#A4");
577                         t1 = DateTime.ParseExact ("02/25/2002 05:25", "g", null);
578                         Assert.AreEqual (myTicks [3], t1.Ticks, "#A5");
579                         t1 = DateTime.ParseExact ("02/25/2002 05:25:13", "G", null);
580                         Assert.AreEqual (myTicks [4], t1.Ticks, "#A6");
581                         t1 = DateTime.ParseExact ("Monday, 25 February 2002 04:25:13", "U", null);
582                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
583                         Assert.AreEqual (2002, t1.Year, "#A7");
584                         Assert.AreEqual (02, t1.Month, "#A8");
585                         Assert.AreEqual (25, t1.Day, "#A9");
586                         Assert.AreEqual (04, t1.Hour, "#A10");
587                         Assert.AreEqual (25, t1.Minute, "#A11");
588                         Assert.AreEqual (13, t1.Second, "#A12");
589                         t1 = DateTime.ParseExact ("Monday, 25 February 2002 04:25:13", "U", null);
590                         Assert.AreEqual ("Monday, 25 February 2002 04:25:13", t1.ToString ("U"), "#A13");
591
592                         DateTime t2 = new DateTime (DateTime.Today.Year, 2, 25);
593                         t1 = DateTime.ParseExact ("February 25", "m", null);
594                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#B1");
595
596                         t2 = new DateTime (DateTime.Today.Year, 2, 25);
597                         t1 = DateTime.ParseExact ("February 25", "M", null);
598                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#B2");
599
600                         t1 = DateTime.ParseExact ("Mon, 25 Feb 2002 04:25:13 GMT", "r", null);
601                         Assert.AreEqual (2002, t1.Year, "#C1");
602                         Assert.AreEqual (02, t1.Month, "#C2");
603                         Assert.AreEqual (25, t1.Day, "#C3");
604                         Assert.AreEqual (04, t1.Hour, "#C4");
605                         Assert.AreEqual (25, t1.Minute, "#C5");
606                         Assert.AreEqual (13, t1.Second, "#C6");
607
608                         t1 = DateTime.ParseExact ("Mon, 25 Feb 2002 04:25:13 GMT", "R", null);
609                         Assert.AreEqual (2002, t1.Year, "#D1");
610                         Assert.AreEqual (02, t1.Month, "#D2");
611                         Assert.AreEqual (25, t1.Day, "#D3");
612                         Assert.AreEqual (04, t1.Hour, "#D4");
613                         Assert.AreEqual (25, t1.Minute, "#D5");
614                         Assert.AreEqual (13, t1.Second, "#D6");
615
616                         t1 = DateTime.ParseExact ("2002-02-25T05:25:13", "s", null);
617                         Assert.AreEqual (myTicks [4], t1.Ticks, "#E1");
618
619                         t2 = DateTime.Today + new TimeSpan (5,25,0);
620                         t1 = DateTime.ParseExact ("05:25", "t", null);
621                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#E2");
622
623                         t2 = DateTime.Today + new TimeSpan (5,25,13);
624                         t1 = DateTime.ParseExact ("05:25:13", "T", null);
625                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#E3");
626
627                         t2 = new DateTime (2002, 2, 1);
628                         t1 = DateTime.ParseExact ("2002 February", "y", null);
629                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#E4");
630
631                         t2 = new DateTime (2002, 2, 1);
632                         t1 = DateTime.ParseExact ("2002 February", "Y", null);
633                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#E5");
634
635                         // Custom patterns
636                         t2 = new DateTime (DateTime.Now.Year, 1, 25);
637                         t1 = DateTime.ParseExact ("25", "%d", null);
638                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#F1");
639                         t1 = DateTime.ParseExact ("25", "dd", null);
640                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#F2");
641
642                         t2 = new DateTime (DateTime.Today.Year, 2, 1);
643                         t1 = DateTime.ParseExact ("2", "%M", null);
644                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G1");
645                         t1 = DateTime.ParseExact ("02", "MM", null);
646                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G2");
647                         t1 = DateTime.ParseExact ("Feb", "MMM", null);
648                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G3");
649                         t1 = DateTime.ParseExact ("February", "MMMM", null);
650                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G4");
651
652                         t2 = new DateTime (2005, 1, 1);
653                         t1 = DateTime.ParseExact ("5", "%y", null);
654                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G5");
655                         t1 = DateTime.ParseExact ("05", "yy", null);
656                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G6");
657                         t1 = DateTime.ParseExact ("2005", "yyyy", null);
658                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G7");
659
660                         t2 = DateTime.Today + new TimeSpan (5, 0, 0);
661                         t1 = DateTime.ParseExact ("5A", "ht", null);
662                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G8");
663                         t1 = DateTime.ParseExact ("05A", "hht", null);
664                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G9");
665
666                         t2 = DateTime.Today + new TimeSpan (15, 0, 0);
667                         t1 = DateTime.ParseExact ("3P", "ht", null);
668                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G10");
669                         t1 = DateTime.ParseExact ("03P", "hht", null);
670                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G11");
671
672                         t2 = DateTime.Today + new TimeSpan (5, 0, 0);
673                         t1 = DateTime.ParseExact ("5", "%H", null);
674                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G12");
675
676                         t2 = DateTime.Today + new TimeSpan (15, 0, 0);
677                         t1 = DateTime.ParseExact ("15", "%H", null);
678                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G13");
679                         t1 = DateTime.ParseExact ("15", "HH", null);
680                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#G14");
681
682                         // Time zones
683 #if false
684                         // Fails durring DST for msft and mono
685                         t2 = DateTime.Today + new TimeSpan (17, 18, 0);
686                         t1 = DateTime.ParseExact ("11:18AM -5", "h:mmtt z", null);
687                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
688                         if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
689                                 t1 += new TimeSpan(1, 0, 0);
690                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#H1");
691                         
692                         t1 = DateTime.ParseExact ("11:18AM -05:00", "h:mmtt zzz", null);
693                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
694                         if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
695                                 t1 += new TimeSpan(1, 0, 0);
696                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#H2");
697
698                         t1 = DateTime.ParseExact ("7:18PM +03", "h:mmtt zz", null);
699                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
700                         if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
701                                 t1 += new TimeSpan(1, 0, 0);
702                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#H3");
703
704                         t1 = DateTime.ParseExact ("7:48PM +03:30", "h:mmtt zzz", null);
705                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
706                         if (!TimeZone.CurrentTimeZone.IsDaylightSavingTime(t1))
707                                 t1 += new TimeSpan(1, 0, 0);
708                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#H4");
709 #endif
710
711                         // Options
712                         t2 = DateTime.Today + new TimeSpan (16, 18, 0);
713                         t1 = DateTime.ParseExact ("11:18AM -5", "h:mmtt z",
714                                                   null, DateTimeStyles.AdjustToUniversal);
715                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#I1");
716
717                         t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25:13", "F",
718                                                   null, DateTimeStyles.AdjustToUniversal);
719                         Assert.AreEqual (myTicks [4], t1.Ticks, "#I2");
720                         t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25:13",
721                                                   "dddd, dd MMMM yyyy HH:mm:ss",
722                                                   null, DateTimeStyles.AdjustToUniversal);
723                         Assert.AreEqual (myTicks [4], t1.Ticks, "#I3");
724
725                         t1 = DateTime.ParseExact ("02/25/2002", "d", null,
726                                                   DateTimeStyles.AllowWhiteSpaces);
727                         Assert.AreEqual (myTicks [0], t1.Ticks, "#I4");
728
729                         t1 = DateTime.ParseExact ("    02/25/2002", "d", null,
730                                                   DateTimeStyles.AllowLeadingWhite);
731                         Assert.AreEqual (myTicks [0], t1.Ticks, "#I5");
732
733                         t1 = DateTime.ParseExact ("02/25/2002    ", "d", null,
734                                                   DateTimeStyles.AllowTrailingWhite);
735                         Assert.AreEqual (myTicks [0], t1.Ticks, "#I6");
736
737                         t1 = DateTime.ParseExact ("  02 / 25 / 2002    ", "d", null,
738                                                   DateTimeStyles.AllowWhiteSpaces);
739                         Assert.AreEqual (myTicks [0], t1.Ticks, "#I7");
740
741                         // Multi Custom Patterns
742                         string rfc1123_date = "r";
743                         string rfc850_date = "dddd, dd'-'MMM'-'yy HH':'mm':'ss 'GMT'";
744                         string asctime_date = "ddd MMM d HH':'mm':'ss yyyy";
745                         string [] formats = new string [] {rfc1123_date, rfc850_date, asctime_date};
746                         CultureInfo enUS = new CultureInfo("en-US", false);
747                         t1 = DateTime.ParseExact ("Sun, 06 Nov 1994 08:49:37 GMT", formats[0], enUS, 
748                                                 DateTimeStyles.AllowWhiteSpaces);
749                         Assert.AreEqual (myTicks [6], t1.Ticks, "#J1");
750                         t1 = DateTime.ParseExact ("Sunday, 06-Nov-94 08:49:37 GMT", formats[1], enUS, 
751                                                 DateTimeStyles.AllowWhiteSpaces);
752                         Assert.AreEqual (myTicks [6], t1.Ticks, "#J2");
753                         t1 = DateTime.ParseExact ("Sun Nov  6 08:49:37 1994", formats[2], enUS, 
754                                                 DateTimeStyles.AllowWhiteSpaces);
755                         Assert.AreEqual (myTicks [6], t1.Ticks, "#J3");
756                         t1 = DateTime.ParseExact ("Sun, 06 Nov 1994 08:49:37 GMT", formats, enUS, 
757                                                 DateTimeStyles.AllowWhiteSpaces);
758                         Assert.AreEqual (myTicks [6], t1.Ticks, "#J4");
759                         t1 = DateTime.ParseExact ("Sunday, 06-Nov-94 08:49:37 GMT", formats, enUS, 
760                                                 DateTimeStyles.AllowWhiteSpaces);
761                         Assert.AreEqual (myTicks [6], t1.Ticks, "#J5");
762                         t1 = DateTime.ParseExact ("Sun Nov  6 08:49:37 1994", formats, enUS, 
763                                                 DateTimeStyles.AllowWhiteSpaces);
764                         Assert.AreEqual (myTicks [6], t1.Ticks, "#J6");
765                         t1 = DateTime.ParseExact ("Monday, 25 February 2002 05:25:13",
766                                                 "ddddddd, dd MMMMMMM yyyy HHHHH:mmmmm:sssss",
767                                                 null, DateTimeStyles.AdjustToUniversal);
768                         Assert.AreEqual (myTicks[4], t1.Ticks, "#J7");
769                 
770                         // Bug 52274
771                         t1 = DateTime.ParseExact ("--12--", "--MM--" , null);
772                         Assert.AreEqual (12, t1.Month, "#K1");
773                         t1=DateTime.ParseExact ("--12-24", "--MM-dd" , null);
774                         Assert.AreEqual (24, t1.Day, "#K2");
775                         Assert.AreEqual (12, t1.Month, "#K3");
776                         t1=DateTime.ParseExact ("---24", "---dd" , null);
777                         Assert.AreEqual (24, t1.Day, "#K4");
778
779                         // Bug 63376
780                         t1 = DateTime.ParseExact ("18Aug2004 12:33:00", "ddMMMyyyy hh:mm:ss", new CultureInfo ("en-US"));
781                         Assert.AreEqual (0, t1.Hour, "hh allows 12, though it's useless");
782
783                         // Bug 74775
784                         DateTime.ParseExact ("Tue, 12 Apr 2005 10:10:04 +0100",
785                                 "Tue, 12 Apr 2005 10:10:04 +0100", enUS);
786                         try {
787                                 DateTime.ParseExact ("Tue, 12 Apr 2005 10:10:04 +00000",
788                                         "ddd, dd MMM yyyy HH':'mm':'ss zzz", enUS);
789                                 Assert.Fail ("#L1");
790                         } catch (FormatException) {
791                         }
792
793                         // Bug #75213 : literal escaping.
794                         t1 = DateTime.ParseExact ("20050707132527Z",
795                                 "yyyyMMddHHmmss\\Z", CultureInfo.InvariantCulture);
796                         Assert.AreEqual (632563395270000000, t1.Ticks, "#L2");
797                 }
798
799                 [Test]
800                 [Ignore ("need to fix tests that run on different timezones")]
801                 public void TestParse2 ()
802                 {
803                         DateTime t1 = DateTime.Parse ("Mon, 25 Feb 2002 04:25:13 GMT");
804                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
805                         Assert.AreEqual (04 - TimeZone.CurrentTimeZone.GetUtcOffset (t1).Hours, t1.Hour);
806                 }
807
808                 [Test]
809                 public void TestParseDateFirst ()
810                 {
811                         // Standard patterns
812                         CultureInfo USCultureInfo = new CultureInfo("en-US");
813                         DateTime t1 = DateTime.Parse ("02/25/2002", USCultureInfo);
814                         Assert.AreEqual (myTicks [0], t1.Ticks, "#A1");
815                         t1 = DateTime.Parse ("2002-02-25", USCultureInfo);
816                         Assert.AreEqual (myTicks [0], t1.Ticks, "#A2");
817                         t1 = DateTime.Parse ("Monday, 25 February 2002");
818                         Assert.AreEqual (myTicks [0], t1.Ticks, "#A3");
819                         t1 = DateTime.Parse ("Monday, 25 February 2002 05:25");
820                         Assert.AreEqual (myTicks [3], t1.Ticks, "#A4");
821                         t1 = DateTime.Parse ("Monday, 25 February 2002 05:25:13");
822                         Assert.AreEqual (myTicks [4], t1.Ticks, "#A5");
823                         t1 = DateTime.Parse ("02/25/2002 05:25", USCultureInfo);
824                         Assert.AreEqual (myTicks [3], t1.Ticks, "#A6");
825                         t1 = DateTime.Parse ("02/25/2002 05:25:13", USCultureInfo);
826                         Assert.AreEqual (myTicks [4], t1.Ticks, "#A7");
827                         t1 = DateTime.Parse ("2002-02-25 04:25:13Z");
828                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1);
829                         Assert.AreEqual (2002, t1.Year, "#A8");
830                         Assert.AreEqual (02, t1.Month, "#A9");
831                         Assert.AreEqual (25, t1.Day, "#A10");
832                         Assert.AreEqual (04, t1.Hour, "#A11");
833                         Assert.AreEqual (25, t1.Minute, "#A12");
834                         Assert.AreEqual (13, t1.Second, "#A13");
835                         t1 = DateTime.Parse ("Mon,02/25/2002", USCultureInfo);
836                         Assert.AreEqual (myTicks [0], t1.Ticks, "#A14");
837                         DateTime t2 = new DateTime (1999, 1, 2, 0, 3, 4);
838                         t1 = DateTime.Parse (t2.ToLongTimeString ());
839                         Assert.AreEqual (0, t1.Hour, "#A14");
840
841                         // parsed as UTC string
842                         t1 = DateTime.Parse ("Mon, 25 Feb 2002 04:25:13 GMT");
843                         t1 = TimeZone.CurrentTimeZone.ToUniversalTime (t1);
844                         Assert.AreEqual (2002, t1.Year, "#C1");
845                         Assert.AreEqual (02, t1.Month, "#C2");
846                         Assert.AreEqual (25, t1.Day, "#C3");
847                         Assert.AreEqual (4, t1.Hour, "#C4");
848                         Assert.AreEqual (25, t1.Minute, "#C5");
849                         Assert.AreEqual (13, t1.Second, "#C6");
850
851                         // Some date 'T' time formats
852 #if NET_2_0 // Net_1_1 requires hh:mm:ss
853                         t1 = DateTime.Parse ("2002-02-25T05:25");
854                         Assert.AreEqual (myTicks [3], t1.Ticks, "#D1");
855 #endif
856                         t1 = DateTime.Parse ("2002-02-25T05:25:13");
857                         Assert.AreEqual (myTicks [4], t1.Ticks, "#D1");
858                         t1 = DateTime.Parse ("2002-02-25T05:25:13.008");
859                         Assert.AreEqual (myTicks [2], t1.Ticks, "#D1");
860                         t1 = DateTime.Parse ("02-2002-25T05:25:13");
861                         Assert.AreEqual (myTicks [4], t1.Ticks, "#D1");
862
863                         // Day month
864                         t2 = new DateTime (DateTime.Today.Year, 2, 25);
865                         t1 = DateTime.Parse ("February 25", USCultureInfo);
866                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#B1");
867
868                         t2 = new DateTime (DateTime.Today.Year, 2, 8);
869                         t1 = DateTime.Parse ("February 08", USCultureInfo);
870                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#B2");
871
872                         t2 = new DateTime (DateTime.Today.Year, 2, 8);
873                         t1 = DateTime.Parse ("February 8", USCultureInfo);
874                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D6");
875
876                         // Month year
877                         t2 = new DateTime (2002, 2, 1);
878                         t1 = DateTime.Parse ("2002 February");
879                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D4");
880
881                         t2 = new DateTime (2002, 2, 1);
882                         t1 = DateTime.Parse ("2002 February", new CultureInfo ("ja-JP"));
883                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D5");
884
885                         // bug #72132
886                         t2 = new DateTime (2002, 2, 25, 5, 25, 22);
887                         t1 = DateTime.Parse ("Monday, 25 February 2002 05:25:22",
888                                 new CultureInfo ("hi-IN"));
889                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D7");
890                         t2 = new DateTime (2002, 2, 25, 5, 25, 0);
891                         t1 = DateTime.Parse ("Monday, 25 February 2002 05:25",
892                                 new CultureInfo ("hi-IN"));
893                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D8");
894
895                         // MM-yyyy-dd + different time formats
896                         t1 = DateTime.Parse ("02-2002-25 05:25", USCultureInfo);
897                         Assert.AreEqual (myTicks[3], t1.Ticks, "#E1");
898                         t1 = DateTime.Parse ("02-2002-25 05:25:13", USCultureInfo);
899                         Assert.AreEqual (myTicks[4], t1.Ticks, "#E1");
900                         t1 = DateTime.Parse ("02-2002-25 05:25:13 Mon", USCultureInfo);
901                         Assert.AreEqual (myTicks[4], t1.Ticks, "#E2");
902                         t1 = DateTime.Parse ("02-2002-25 05:25:13 Monday", USCultureInfo);
903                         Assert.AreEqual (myTicks[4], t1.Ticks, "#E3");
904                         t1 = DateTime.Parse ("02-2002-25 05:25:13.008", USCultureInfo);
905                         Assert.AreEqual (myTicks[2], t1.Ticks, "#E4");
906
907                         // Formats with timezone
908                         long offset = TimeZone.CurrentTimeZone.GetUtcOffset(t1).Ticks;
909                         long hourTicks = 36000000000L;
910                         long halfHourTicks = hourTicks / 2;
911                         t1 = DateTime.Parse ("02-2002-25 05:25+01", USCultureInfo);
912                         Assert.AreEqual (myTicks[3], t1.Ticks + hourTicks - offset, "#F1");
913                         t1 = DateTime.Parse ("02-2002-25 05:25-01", USCultureInfo);
914                         Assert.AreEqual (myTicks[3], t1.Ticks - hourTicks - offset, "#F2");
915                         t1 = DateTime.Parse ("02-2002-25 05:25+00:30", USCultureInfo);
916                         Assert.AreEqual (myTicks[3], t1.Ticks + hourTicks/2 - offset, "#F3");
917                         t1 = DateTime.Parse ("02-2002-25 05:25:13+02", USCultureInfo);
918                         Assert.AreEqual (myTicks[4], t1.Ticks + 2*hourTicks - offset, "#F4");
919 #if NET_2_0
920                         // NET 1.0 doesn't accept second fractions and time zone.
921                         t1 = DateTime.Parse ("2002-02-25 05:25:13.008-02");
922                         Assert.AreEqual (myTicks[2], t1.Ticks - 2*hourTicks - offset, "#F5");
923                         // NET 1.0 doesn't parse well time zone with AM afterwards.
924                         t1 = DateTime.Parse ("02-25-2002 05:25:13-02 AM", USCultureInfo);
925                         Assert.AreEqual (myTicks[4], t1.Ticks - 2*hourTicks - offset, "#F6");
926                         t1 = DateTime.Parse ("25 Feb 2002 05:25:13-02 AM", USCultureInfo);
927                         Assert.AreEqual (myTicks[4], t1.Ticks - 2*hourTicks - offset, "#F6");
928 #endif
929                 }
930
931                 [Test]
932                 public void TestParseTimeFirst ()
933                 {
934                         CultureInfo USCultureInfo = new CultureInfo("en-US");
935
936                         // Hour only patterns
937                         DateTime t2 = DateTime.Today + new TimeSpan (5,25,0);
938                         DateTime t1 = DateTime.Parse ("05:25");
939                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#C1");
940                         t2 = DateTime.Today + new TimeSpan (5,25,13);
941                         t1 = DateTime.Parse ("05:25:13");
942                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#B2");
943
944                         // Test with different date formats
945                         t1 = DateTime.Parse ("05:25 02/25/2002", USCultureInfo);
946                         Assert.AreEqual (myTicks[3], t1.Ticks, "#B1");
947                         t1 = DateTime.Parse ("05:25:13 2002-02-25");
948                         Assert.AreEqual (myTicks[4], t1.Ticks, "#B2");
949                         t1 = DateTime.Parse ("05:25:13.008 02-2002-25");
950                         Assert.AreEqual (myTicks[2], t1.Ticks, "#B3");
951                         t1 = DateTime.Parse ("05:25:13.008 Feb 25 2002");
952                         Assert.AreEqual (myTicks[2], t1.Ticks, "#B4");
953                         t1 = DateTime.Parse ("05:25:13.008 25 Feb 2002");
954                         Assert.AreEqual (myTicks[2], t1.Ticks, "#B5");
955
956                         // Add AM and day of the week
957                         t1 = DateTime.Parse ("AM 05:25:13 2002-02-25");
958                         Assert.AreEqual (myTicks[4], t1.Ticks, "#C1");
959                         t1 = DateTime.Parse ("Monday05:25 02/25/2002", USCultureInfo);
960                         Assert.AreEqual (myTicks[3], t1.Ticks, "#C2");
961                         t1 = DateTime.Parse ("Mon 05:25 AM 02/25/2002", USCultureInfo);
962                         Assert.AreEqual (myTicks[3], t1.Ticks, "#C3");
963                         t1 = DateTime.Parse ("AM 05:25 Monday, 02/25/2002", USCultureInfo);
964                         Assert.AreEqual (myTicks[3], t1.Ticks, "#C4");
965                         t1 = DateTime.Parse ("05:25 02/25/2002 Monday", USCultureInfo);
966                         Assert.AreEqual (myTicks[3], t1.Ticks, "#C5");
967                         t1 = DateTime.Parse ("PM 03:25:13.008 02-2002-25");
968                         Assert.AreEqual (myTicks[1], t1.Ticks, "#C6");
969
970                         // ASP.NET QuickStarts
971                         t2 = new DateTime (2002, 10, 7, 15, 6, 0);
972                         t1 = DateTime.Parse ("3:06 PM 10/7/2002", USCultureInfo);
973                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D1");
974                         t2 = new DateTime (2002, 10, 7, 15, 6, 0);
975                         t1 = DateTime.Parse ("3:06 pm 10/7/2002", USCultureInfo);
976                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D2");
977                         t2 = new DateTime (2002, 10, 7, 3, 6, 0);
978                         t1 = DateTime.Parse ("3:06 AM 10/7/2002", USCultureInfo);
979                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D3");
980                         t2 = new DateTime (2002, 10, 7, 3, 6, 0);
981                         t1 = DateTime.Parse ("3:06 am 10/7/2002", USCultureInfo);
982                         Assert.AreEqual (t2.Ticks, t1.Ticks, "#D4");
983                 }
984
985                 [Test]
986                 public void TestParseWithDifferentShortDatePatterns ()
987                 {
988                         CultureInfo cultureInfo = new CultureInfo("en-US");
989                         DateTimeFormatInfo dateFormatInfo = cultureInfo.DateTimeFormat;
990                         DateTime t1 = DateTime.Parse ("02/01/2003", cultureInfo);
991                         Assert.AreEqual (myTicks[7], t1.Ticks, "#A1");
992
993                         // Day, month year behaviour
994                         dateFormatInfo.ShortDatePattern = "dd/MM/yyyy";
995                         t1 = DateTime.Parse ("01/02/03", cultureInfo);
996                         Assert.AreEqual (myTicks[7], t1.Ticks, "#B1");
997                         t1 = DateTime.Parse ("01/02/2003", cultureInfo);
998                         Assert.AreEqual (myTicks[7], t1.Ticks, "#B2");
999                         t1 = DateTime.Parse ("2003/02/01", cultureInfo);
1000                         Assert.AreEqual (myTicks[7], t1.Ticks, "#B3");
1001                         t1 = DateTime.Parse ("01/Feb/03", cultureInfo);
1002                         Assert.AreEqual (myTicks[7], t1.Ticks, "#B4");
1003                         t1 = DateTime.Parse ("Feb/01/03", cultureInfo);
1004                         Assert.AreEqual (myTicks[7], t1.Ticks, "#B5");
1005
1006                         // Month, day year behaviour
1007                         dateFormatInfo.ShortDatePattern = "MM/dd/yyyy";
1008                         t1 = DateTime.Parse ("02/01/03", cultureInfo);
1009                         Assert.AreEqual (myTicks[7], t1.Ticks, "#C1");
1010                         t1 = DateTime.Parse ("02/01/2003", cultureInfo);
1011                         Assert.AreEqual (myTicks[7], t1.Ticks, "#C2");
1012                         t1 = DateTime.Parse ("2003/02/01", cultureInfo);
1013                         Assert.AreEqual (myTicks[7], t1.Ticks, "#C3");
1014                         t1 = DateTime.Parse ("01/Feb/03", cultureInfo);
1015                         Assert.AreEqual (myTicks[7], t1.Ticks, "#C4");
1016                         t1 = DateTime.Parse ("Feb/01/03", cultureInfo);
1017                         Assert.AreEqual (myTicks[7], t1.Ticks, "#C5");
1018
1019                         // Year, month day behaviour
1020                         dateFormatInfo.ShortDatePattern = "yyyy/MM/dd";
1021                         t1 = DateTime.Parse ("03/02/01", cultureInfo);
1022                         Assert.AreEqual (myTicks[7], t1.Ticks, "#D1");
1023                         t1 = DateTime.Parse ("02/01/2003", cultureInfo);
1024                         Assert.AreEqual (myTicks[7], t1.Ticks, "#D2");
1025                         t1 = DateTime.Parse ("2003/02/01", cultureInfo);
1026                         Assert.AreEqual (myTicks[7], t1.Ticks, "#D3");
1027                         t1 = DateTime.Parse ("03/Feb/01", cultureInfo);
1028                         Assert.AreEqual (myTicks[7], t1.Ticks, "#D4");
1029                         t1 = DateTime.Parse ("Feb/03/01", cultureInfo);
1030                         Assert.AreEqual (myTicks[7], t1.Ticks, "#D5");
1031
1032                         // Year, day month behaviour
1033                         // Note that no culture I am aware of has this pattern, and indeed
1034                         dateFormatInfo.ShortDatePattern = "yyyy/dd/MM";
1035                         t1 = DateTime.Parse ("03/01/02", cultureInfo);
1036                         Assert.AreEqual (myTicks[7], t1.Ticks, "#E1");
1037                         t1 = DateTime.Parse ("01/02/2003", cultureInfo);
1038                         Assert.AreEqual (myTicks[7], t1.Ticks, "#E2");
1039 #if NET_2_0
1040                         t1 = DateTime.Parse ("2003/01/02", cultureInfo);
1041                         Assert.AreEqual (myTicks[7], t1.Ticks, "#E3");
1042 #else
1043                         t1 = DateTime.Parse ("2003/02/01", cultureInfo);
1044                         Assert.AreEqual (myTicks[7], t1.Ticks, "#E3");
1045 #endif
1046                         // For some reason the following throws an exception on .Net
1047                         // t1 = DateTime.Parse ("03/Feb/01", cultureInfo);
1048                         // Assert.AreEqual (myTicks[7], t1.Ticks, "#E4");
1049                         // t1 = DateTime.Parse ("03/01/Feb", cultureInfo);
1050                         // Assert.AreEqual (myTicks[7], t1.Ticks, "#E5");
1051                         // t1 = DateTime.Parse ("Feb/01/03", cultureInfo);
1052                         // Assert.AreEqual (myTicks[7], t1.Ticks, "#E6");
1053                 }
1054
1055                 [Test]
1056                 public void TestParseWithDifferentMonthDayPatterns ()
1057                 {
1058                         CultureInfo cultureInfo = new CultureInfo("en-US");
1059                         DateTimeFormatInfo dateFormatInfo = cultureInfo.DateTimeFormat;
1060                         DateTime t1 = DateTime.Parse ("Feb 03", cultureInfo);
1061                         Assert.AreEqual (2, t1.Month, "#A1");
1062                         Assert.AreEqual (3, t1.Day, "#A2");
1063
1064                         // Day month behaviour
1065                         dateFormatInfo.MonthDayPattern = "dd/MM";
1066 #if NET_2_0
1067                         t1 = DateTime.Parse ("Feb 03", cultureInfo);
1068                         Assert.AreEqual (2, t1.Month, "#B1");
1069                         Assert.AreEqual (1, t1.Day, "#B2");
1070                         Assert.AreEqual (2003, t1.Year, "#B3");
1071 #else // In .Net 1.0 "Feb 03" is always Feb 3rd (and not Feb 2003).
1072                         t1 = DateTime.Parse ("Feb 03", cultureInfo);
1073                         Assert.AreEqual (2, t1.Month, "#B4");
1074                         Assert.AreEqual (3, t1.Day, "#B5");
1075 #endif
1076                         t1 = DateTime.Parse ("03/02", cultureInfo);
1077                         Assert.AreEqual (2, t1.Month, "#B6");
1078                         Assert.AreEqual (3, t1.Day, "#B7");
1079                         t1 = DateTime.Parse ("03 Feb", cultureInfo);
1080                         Assert.AreEqual (2, t1.Month, "#B8");
1081                         Assert.AreEqual (3, t1.Day, "#B9");
1082
1083                         // Month day behaviour
1084                         dateFormatInfo.MonthDayPattern = "MM/dd";
1085                         t1 = DateTime.Parse ("Feb 03", cultureInfo);
1086                         Assert.AreEqual (2, t1.Month, "#C1");
1087                         Assert.AreEqual (3, t1.Day, "#C2");
1088                         t1 = DateTime.Parse ("02/03", cultureInfo);
1089                         Assert.AreEqual (2, t1.Month, "#C3");
1090                         Assert.AreEqual (3, t1.Day, "#C4");
1091                         t1 = DateTime.Parse ("03 Feb", cultureInfo);
1092                         Assert.AreEqual (2, t1.Month, "#C5");
1093                         Assert.AreEqual (3, t1.Day, "#C6");
1094                 }
1095
1096                 [Test]
1097                 public void TestParse3 ()
1098                 {
1099                         string s = "Wednesday, 09 June 2004";
1100                         DateTime.ParseExact (s, "dddd, dd MMMM yyyy", CultureInfo.InvariantCulture);
1101                         try {
1102                                 DateTime.ParseExact (s, "dddd, dd MMMM yyyy", new CultureInfo ("ja-JP"));
1103                                 Assert.Fail ("ja-JP culture does not support format \"dddd, dd MMMM yyyy\"");
1104                         } catch (FormatException) {
1105                         }
1106
1107                         // Ok, now we can assume ParseExact() works expectedly.
1108
1109                         DateTime.Parse (s, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces);
1110                         DateTime.Parse (s, new CultureInfo ("ja-JP"), DateTimeStyles.AllowWhiteSpaces);
1111                         //DateTime.Parse (s, null); currently am not sure if it works for _every_ culture.
1112                 }
1113
1114
1115                 [Test] // bug #74936
1116                 public void TestParse4 ()
1117                 {
1118                         try {
1119                                 DateTime.Parse("1");
1120                                 Assert.Fail ("#1");
1121                         } catch (FormatException) {
1122                         }
1123
1124                         try {
1125                                 DateTime.Parse("1000");
1126                                 Assert.Fail ("#2");
1127                         } catch (FormatException) {
1128                         }
1129
1130                         try {
1131                                 DateTime.Parse("8:");
1132                                 Assert.Fail ("#3");
1133                         } catch (FormatException) {
1134                         }
1135                 }
1136
1137                 [Test] // bug #71289
1138                 public void Parse_Bug71289a ()
1139                 {
1140                         DateTime.Parse ("Sat,,,,,, 01 Oct 1994 03:00:00", CultureInfo.InvariantCulture);
1141                 }
1142
1143                 [Test]
1144                 public void Parse_Bug71289b ()
1145                 {
1146                         // more example...
1147                         DateTime.Parse ("Sat,,, 01,,, Oct,,, ,,,1994 03:00:00", CultureInfo.InvariantCulture);
1148                 }
1149
1150 #if NET_2_0
1151                 [Test]
1152                 [ExpectedException (typeof (FormatException))]
1153                 public void Parse_CommaAfterHours ()
1154                 {
1155                         // ',' after 03 is not allowed.
1156                         DateTime.Parse ("Sat,,, 01,,, Oct,,, ,,,1994 03,:00:00", CultureInfo.InvariantCulture);
1157                 }
1158 #endif
1159
1160                 [Test] // bug #72788
1161                 public void Parse_Bug72788 ()
1162                 {
1163                         DateTime dt = DateTime.Parse ("21/02/05", new CultureInfo ("fr-FR"));
1164                         Assert.AreEqual (2005, dt.Year, "#1");
1165                         Assert.AreEqual (02, dt.Month, "#2");
1166                         Assert.AreEqual (21, dt.Day, "#3");
1167                 }
1168
1169                 [Test] // bug #322510
1170                 public void Parse_HourDesignator ()
1171                 {
1172                         DateTime dt;
1173                         DateTime now = DateTime.Now;
1174
1175                         dt = DateTime.Parse ("12:00:00 AM", new CultureInfo ("en-US"));
1176                         Assert.AreEqual (now.Year, dt.Year, "#A1");
1177                         Assert.AreEqual (now.Month, dt.Month, "#A2");
1178                         Assert.AreEqual (now.Day, dt.Day, "#A3");
1179                         Assert.AreEqual (0, dt.Hour, "#A4");
1180                         Assert.AreEqual (0, dt.Minute, "#A5");
1181                         Assert.AreEqual (0, dt.Second, "#A6");
1182                         Assert.AreEqual (0, dt.Millisecond, "#A7");
1183
1184                         dt = DateTime.Parse ("12:00:00 PM", new CultureInfo ("en-US"));
1185                         Assert.AreEqual (now.Year, dt.Year, "#B1");
1186                         Assert.AreEqual (now.Month, dt.Month, "#B2");
1187                         Assert.AreEqual (now.Day, dt.Day, "#B3");
1188                         Assert.AreEqual (12, dt.Hour, "#B4");
1189                         Assert.AreEqual (0, dt.Minute, "#B5");
1190                         Assert.AreEqual (0, dt.Second, "#B6");
1191                         Assert.AreEqual (0, dt.Millisecond, "#B7");
1192                 }
1193
1194                 [Test]
1195                 // FIXME: This test doesn't work on cultures like es-DO which have patterns
1196                 // for both dd/MM/yyyy & MM/dd/yyyy
1197                 [Category ("NotWorking")]
1198                 public void Parse_Bug53023a ()
1199                 {
1200                         foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.SpecificCultures)) {
1201                                 FormatException e = null;
1202                                 try {
1203                                         // this fails for MOST culture under MS 1.1 SP1
1204                                         DateTime.Parse ("8/16/2005", ci);
1205                                 }
1206                                 catch (FormatException fe) {
1207                                         e = fe;
1208                                 }
1209                                 string c = ci.ToString ();
1210                                 switch (c) {
1211                                 case "af-ZA":
1212                                 case "en-CB":
1213                                 case "en-PH":
1214                                 case "en-US":
1215                                 case "en-ZA":
1216                                 case "en-ZW":
1217                                 case "es-PA":
1218                                 case "eu-ES":
1219                                 case "fa-IR":
1220                                 case "fr-CA":
1221                                 case "hu-HU":
1222                                 case "ja-JP":
1223                                 case "ko-KR":
1224                                 case "lv-LV":
1225                                 case "lt-LT":
1226                                 case "mn-MN":
1227                                 case "pl-PL":
1228                                 case "sq-AL":
1229                                 case "sv-SE":
1230                                 case "sw-KE":
1231                                 case "zh-CN":
1232                                 case "zh-TW":
1233 #if NET_2_0
1234                                 case "ns-ZA":
1235                                 case "se-SE":
1236                                 case "sma-SE":
1237                                 case "smj-SE":
1238                                 case "tn-ZA":
1239                                 case "xh-ZA":
1240                                 case "zu-ZA":
1241 #endif
1242                                         Assert.IsNull (e, c);
1243                                         break;
1244                                 default:
1245                                         Assert.IsNotNull (e, c);
1246                                         break;
1247                                 }
1248                         }
1249                 }
1250
1251                 [Test]
1252                 public void Parse_Bug53023b ()
1253                 {
1254                         foreach (CultureInfo ci in CultureInfo.GetCultures (CultureTypes.SpecificCultures)) {
1255                                 DateTime.Parse ("01-Sep-05", ci);
1256                                 DateTime.Parse ("4:35:35 AM", ci);
1257                         }
1258                 }
1259
1260                 [Test]
1261                 [ExpectedException (typeof (FormatException))]
1262                 [Category ("NotWorking")]
1263                 public void Parse_RequireSpaceSeparator ()
1264                 {
1265                         DateTime.Parse ("05:25:132002-02-25", CultureInfo.InvariantCulture);
1266                 }
1267
1268                 [Test]
1269                 [ExpectedException (typeof (FormatException))]
1270                 public void Parse_DontAccept2DigitsYears ()
1271                 {
1272                         // don't allow 2 digit years where we require 4.
1273                         DateTime.ParseExact ("05", "yyyy", CultureInfo.InvariantCulture);
1274                 }
1275
1276                 [Test]
1277                 [ExpectedException (typeof (FormatException))]
1278                 public void Parse_DontAcceptEmptyHours ()
1279                 {
1280                         DateTime.ParseExact (":05", "H:m", CultureInfo.InvariantCulture);
1281                 }
1282
1283                 [Test]
1284                 [ExpectedException (typeof (FormatException))]
1285                 public void Parse_DontAcceptEmptyMinutes ()
1286                 {
1287                         DateTime.ParseExact ("0::0", "H:m:s", CultureInfo.InvariantCulture);
1288                 }
1289
1290                 [Test]
1291                 public void ParseCOMDependentFormat ()
1292                 {
1293                         // Japanese format.
1294                         DateTime.Parse (String.Format (
1295                                 "{0}\u5E74{1}\u6708{2}\u65E5 {3}\u6642{4}\u5206{5}\u79D2",
1296                                 2006, 3, 1, 15, 32, 42), new CultureInfo (""));
1297
1298                         try {
1299                                 // incorrect year mark.
1300                                 DateTime.Parse (String.Format (
1301                                         "{0}\u4E00{1}\u6708{2}\u65E5 {3}\u6642{4}\u5206{5}\u79D2",
1302                                         2006, 3, 1, 15, 32, 42), new CultureInfo (""));
1303                                 Assert.Fail ();
1304                         } catch (FormatException) {
1305                         }
1306                 }
1307
1308                 [Test]
1309                 [ExpectedException(typeof (FormatException))]
1310                 public void ParseFormatException1 ()
1311                 {
1312                         // Following string is not a correct French date i.e.
1313                         // MM/dd/yyyy HH:mm:ss since it expects d/M/yyyy HH:mm:ss
1314                         // instead (however fr-FR accepts both MM/dd/yyyy and
1315                         // dd/MM/yyyy, which means that we can't just throw exceptions 
1316                         // on overflow).
1317                         String frDateTime = "11/13/2003 11:28:15";
1318                         IFormatProvider format = new CultureInfo("fr-FR", true);
1319                         DateTime t1 = DateTime.Parse(frDateTime, format);
1320                 }
1321         
1322                 [Test]
1323 #if NET_2_0
1324                 [ExpectedException(typeof (FormatException))]
1325 #else
1326                 [ExpectedException(typeof (ArgumentOutOfRangeException))]
1327 #endif
1328                 public void ParseFormatExceptionForInvalidYear ()
1329                 {
1330                         // Bug #77633.  In .NET 1..1, the expected exception is ArgumentOutOfRangeException
1331                         // In .NET 2.0, the expected exception is FormatException
1332                         // build a string with the year of 5 digits
1333                         string s = "1/1/10000";
1334                         DateTime dt = DateTime.Parse (s);
1335                 }
1336         
1337                 [Test]
1338                 public void TestOA ()
1339                 {
1340                         double number=5000.41443;
1341                         DateTime d = DateTime.FromOADate(number);
1342                         DTAssertEquals ("#1", d, new DateTime(1913, 9, 8, 9, 56, 46, 0), Resolution.Second);
1343                         Assert.AreEqual (d.ToOADate(), number, "#2");
1344                 }
1345
1346                 [Test]
1347                 public void ParseAllowsQueerString ()
1348                 {
1349                         DateTime.Parse ("Sat,,,,,, 01 Oct 1994 03:00:00", CultureInfo.InvariantCulture);
1350                 }
1351
1352                 [Test]
1353                 public void ParseUtcNonUtc ()
1354                 {
1355                         Thread.CurrentThread.CurrentCulture = new CultureInfo ("es-ES");
1356
1357                         CultureInfo ci;
1358                         string s, s2, s3, d;
1359                         DateTime dt;
1360                         DateTimeFormatInfo dfi = DateTimeFormatInfo.InvariantInfo;
1361                         s = dfi.UniversalSortableDateTimePattern;
1362                         s2 = "r";
1363
1364                         s3 = "s";
1365
1366                         long tick1 = 631789220960000000; // 2003-01-23 12:34:56 as is
1367                         long tick2 = TimeZone.CurrentTimeZone.ToLocalTime (new DateTime (tick1)).Ticks; // adjusted to local time
1368
1369                         // invariant
1370                         ci = CultureInfo.InvariantCulture;
1371
1372                         d = "2003/01/23 12:34:56";
1373                         dt = DateTime.Parse (d, ci);
1374                         Assert.AreEqual (tick1, dt.Ticks, "#1:" + d);
1375
1376                         d = "2003/01/23 12:34:56 GMT";
1377                         dt = DateTime.Parse (d, ci);
1378                         Assert.AreEqual (tick2, dt.Ticks, "#2:" + d);
1379
1380                         d = "Thu, 23 Jan 2003 12:34:56 GMT";
1381                         dt = DateTime.ParseExact (d, s2, ci);
1382                         Assert.AreEqual (tick1, dt.Ticks, "#3:" + d);
1383
1384                         d = "2003-01-23 12:34:56Z";
1385                         dt = DateTime.ParseExact (d, s, ci);
1386                         Assert.AreEqual (tick1, dt.Ticks, "#4:" + d);
1387
1388                         d = "2003-01-23T12:34:56";
1389                         dt = DateTime.ParseExact (d, s3, ci);
1390                         Assert.AreEqual (tick1, dt.Ticks, "#5:" + d);
1391
1392                         // ja-JP ... it should be culture independent
1393                         ci = new CultureInfo ("ja-JP");
1394
1395                         d = "2003/01/23 12:34:56";
1396                         dt = DateTime.Parse (d, ci);
1397                         Assert.AreEqual (tick1, dt.Ticks, "#6:" + d);
1398
1399                         d = "2003/01/23 12:34:56 GMT";
1400                         dt = DateTime.Parse (d, ci);
1401                         Assert.AreEqual (tick2, dt.Ticks, "#7:" + d);
1402
1403                         d = "Thu, 23 Jan 2003 12:34:56 GMT";
1404                         dt = DateTime.ParseExact (d, s2, ci);
1405                         Assert.AreEqual (tick1, dt.Ticks, "#8:" + d);
1406
1407                         d = "2003-01-23 12:34:56Z";
1408                         dt = DateTime.ParseExact (d, s, ci);
1409                         Assert.AreEqual (tick1, dt.Ticks, "#9:" + d);
1410
1411                         d = "2003-01-23T12:34:56";
1412                         dt = DateTime.ParseExact (d, s3, ci);
1413                         Assert.AreEqual (tick1, dt.Ticks, "#10:" + d);
1414                 }
1415
1416                 [Test]
1417                 public void TimeZoneAdjustment ()
1418                 {
1419                         CultureInfo ci = Thread.CurrentThread.CurrentCulture;
1420                         try {
1421                                 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US");
1422                                 DateTime d1 = DateTime.ParseExact ("2004/06/30", "yyyy/MM/dd", null);
1423                                 DateTime d2 = DateTime.ParseExact ("2004/06/30Z", "yyyy/MM/dd'Z'", null);
1424                                 DateTime d3 = DateTime.ParseExact ("Wed, 30 Jun 2004 00:00:00 GMT", "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", null);
1425                                 DateTime d4 = DateTime.ParseExact ("2004-06-30 00:00:00Z", "yyyy'-'MM'-'dd HH':'mm':'ss'Z'", null);
1426                                 StringWriter sw = new StringWriter ();
1427                                 sw.Write ("{0} {1}", d1.Ticks, d1);
1428                                 Assert.AreEqual ("632241504000000000 6/30/2004 12:00:00 AM", sw.ToString (), "#1");
1429                                 sw.GetStringBuilder ().Length = 0;
1430                                 sw.Write ("{0} {1}", d2.Ticks, d2);
1431                                 Assert.AreEqual ("632241504000000000 6/30/2004 12:00:00 AM", sw.ToString (), "#2");
1432                                 sw.GetStringBuilder ().Length = 0;
1433                                 sw.Write ("{0} {1}", d3.Ticks, d3);
1434                                 Assert.AreEqual ("632241504000000000 6/30/2004 12:00:00 AM", sw.ToString (), "#3");
1435                                 sw.GetStringBuilder ().Length = 0;
1436                                 sw.Write ("{0} {1}", d4.Ticks, d4);
1437                                 Assert.AreEqual ("632241504000000000 6/30/2004 12:00:00 AM", sw.ToString (), "#4");
1438                         } finally {
1439                                 Thread.CurrentThread.CurrentCulture = ci;
1440                         }
1441
1442                         // bug #76082
1443                         Assert.AreEqual (DateTime.MinValue, DateTime.ParseExact ("00010101T00:00:00",
1444                                         "yyyyMMdd'T'HH':'mm':'ss", DateTimeFormatInfo.InvariantInfo), "#5");
1445                 }
1446
1447                 [Test]
1448                 public void DateTimeStylesAdjustToUniversal ()
1449                 {
1450                         // bug #75995 : AdjustToUniversal
1451                         DateTime t1 = DateTime.Parse ("2005-09-05T22:29:00Z",
1452                                 CultureInfo.InvariantCulture,
1453                                 DateTimeStyles.AdjustToUniversal);
1454                         Assert.AreEqual ("2005-09-05 22:29:00Z", t1.ToString ("u"));
1455                 }
1456
1457                 [Test]
1458                 [ExpectedException (typeof (ArgumentException))]
1459                 public void FromOADate_Min () 
1460                 {
1461                         // minimum documented value isn't inclusive
1462                         DateTime.FromOADate (-657435.0d);
1463                 }
1464
1465                 [Test]
1466                 [ExpectedException (typeof (ArgumentException))]
1467                 public void FromOADate_Max () 
1468                 {
1469                         // maximum documented value isn't inclusive
1470                         DateTime.FromOADate (2958466.0d);
1471                 }
1472
1473                 [Test]
1474                 public void FromOADate ()
1475                 {
1476                         // Note: OA (OLE Automation) dates aren't timezone sensitive
1477                         Assert.AreEqual (599264352000000000, DateTime.FromOADate (0.0d).Ticks, "#1");
1478                         Assert.AreEqual (31242239136000000, DateTime.FromOADate (-657434.999d).Ticks, "#2");
1479                         Assert.AreEqual (3155378975136000000, DateTime.FromOADate (2958465.999d).Ticks, "#3");
1480                 }
1481
1482                 [Test]
1483                 public void ToOADate ()
1484                 {
1485                         // Note: OA (OLE Automation) dates aren't timezone sensitive
1486                         DateTime d = new DateTime (0);
1487                         Assert.AreEqual (0.0d, d.ToOADate (), "#1");
1488                         d = new DateTime (599264352000000000);
1489                         Assert.AreEqual (0.0d, d.ToOADate (), "#2");
1490                         d = new DateTime (31242239136000000);
1491                         Assert.AreEqual (-657434.999d, d.ToOADate (), "#3");
1492                         d = new DateTime (3155378975136000000);
1493                         Assert.AreEqual (2958465.999d, d.ToOADate (), "#4");
1494                 }
1495
1496                 [Test]
1497                 public void ToOADate_OverMax ()
1498                 {
1499                         DateTime d = new DateTime (3155378975136000001);
1500                         Assert.AreEqual (2958465.999d, d.ToOADate ());
1501                 }
1502
1503                 [Test]
1504                 public void ToOADate_MaxValue ()
1505                 {
1506                         Assert.AreEqual (2958465.99999999d, DateTime.MaxValue.ToOADate ());
1507                 }
1508
1509                 [Test]
1510                 public void ToOADate_UnderMin ()
1511                 {
1512                         DateTime d = new DateTime (31242239135999999);
1513                         Assert.AreEqual (-657434.999d, d.ToOADate ());
1514                 }
1515
1516                 [Test]
1517                 public void ToOADate_MinValue ()
1518                 {
1519                         Assert.AreEqual (0, DateTime.MinValue.ToOADate ());
1520                 }
1521
1522                 [Test] // bug52075
1523                 public void MaxValueYear ()
1524                 {
1525                         Assert.AreEqual ("9999", DateTime.MaxValue.Year.ToString ());
1526                 }
1527
1528                 [Test]
1529                 public void X509Certificate () 
1530                 {
1531                         // if this test fails then *ALL* or *MOST* X509Certificate tests will also fails
1532                         DateTime dt = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmssZ", null);
1533 #if NET_2_0
1534                         Assert.AreEqual (DateTimeKind.Local, dt.Kind, "#1");
1535                         dt = dt.ToUniversalTime ();
1536                         Assert.AreEqual (DateTimeKind.Utc, dt.Kind, "#2");
1537 #else
1538                         dt = dt.ToUniversalTime ();
1539 #endif
1540                         Assert.AreEqual ("03/12/1996 18:38:47", dt.ToString (), "#3");
1541
1542                         // technically this is invalid (PKIX) because of the missing seconds but it exists so...
1543                         dt = DateTime.ParseExact ("9602231915Z", "yyMMddHHmmZ", null);
1544 #if NET_2_0
1545                         Assert.AreEqual (DateTimeKind.Local, dt.Kind, "#4");
1546                         dt = dt.ToUniversalTime ();
1547                         Assert.AreEqual (DateTimeKind.Utc, dt.Kind, "#5");
1548 #else
1549                         dt = dt.ToUniversalTime ();
1550 #endif
1551                         Assert.AreEqual ("02/23/1996 19:15:00", dt.ToString (), "#6");
1552
1553 #if NET_2_0
1554                         dt = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmssZ", null, DateTimeStyles.AdjustToUniversal);
1555                         Assert.AreEqual (DateTimeKind.Utc, dt.Kind, "#7");
1556 #endif
1557                 }
1558
1559                 [Test]
1560                 public void ZLiteral ()
1561                 {
1562                         // However, "Z" and "'Z'" are different.
1563                         DateTime dt = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmss'Z'", null);
1564                         DateTime dtz = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmssZ", null);
1565 #if NET_2_0
1566                         Assert.AreEqual (DateTimeKind.Unspecified, dt.Kind, "#1");
1567                         dt = dt.ToLocalTime ();
1568                         Assert.AreEqual (DateTimeKind.Local, dt.Kind, "#2");
1569                         Assert.AreEqual (DateTimeKind.Local, dtz.Kind, "#3");
1570 #else
1571                         dt = dt.ToLocalTime ();
1572 #endif
1573                         Assert.AreEqual (dt, dtz, "#4");
1574                 }
1575
1576                 [Test] // bug 56436
1577                 public void QuotedFormat ()
1578                 {
1579                         string date = "28/Mar/2004:19:12:37 +0200";
1580                         string [] expectedFormats = {"dd\"/\"MMM\"/\"yyyy:HH:mm:ss zz\"00\""};
1581                         DateTime.ParseExact (date, expectedFormats, null, DateTimeStyles.AllowWhiteSpaces);
1582                 }
1583
1584                 [Test]
1585                 public void CultureIndependentTests ()
1586                 {
1587                         // Here I aggregated some tests mainly because of test 
1588                         // performance (iterating all the culture is heavy process).
1589                 
1590                         for (int i = 0; i < 32768; i++) {
1591                                 CultureInfo ci = null;
1592                                 string stage = "init";
1593                                 try {
1594                                         try {
1595                                                 ci = new CultureInfo (i);
1596                                                 // In fact InvatiantCulture is not neutral.
1597                                                 // See bug #59716.
1598                                                 if (ci.IsNeutralCulture && ci != CultureInfo.InvariantCulture)
1599                                                         continue;
1600                                         } catch (Exception) {
1601                                                 continue;
1602                                         }
1603                                         Thread.CurrentThread.CurrentCulture = ci;
1604                                         DateTime dt;
1605
1606                                         // Common patterns
1607                                         // X509Certificate pattern is _always_ accepted.
1608                                         stage = "1";
1609                                         dt = DateTime.ParseExact ("19960312183847Z", "yyyyMMddHHmmssZ", null);
1610 #if NET_1_1
1611                                         stage = "2";
1612                                         // culture 1025 ar-SA fails
1613         //                              if (i != 127)
1614         //                                      dt = DateTime.Parse ("19960312183847Z");
1615 #endif
1616                                         stage = "3";
1617                                         dt = DateTime.Parse ("2004-05-26T03:29:01.1234567");
1618                                         stage = "4";
1619                                         dt = DateTime.Parse ("2004-05-26T03:29:01.1234567-07:00");
1620
1621                                         // memo: the least LCID is 127, and then 1025(ar-SA)
1622
1623                                         // "th-TH" locale rejects them since in
1624                                         // ThaiBuddhistCalendar the week of a day is different.
1625                                         // (and also for years).
1626                                         if (ci.LCID != 1054) {
1627                                                 try {
1628                                                         stage = "5";
1629                                                         dt = DateTime.Parse ("Sat, 29 Oct 1994 12:00:00 GMT", ci);
1630                                                 } catch (FormatException ex) {
1631                                                         Assert.Fail (String.Format ("stage 5.1 RFC1123: culture {0} {1} failed: {2}", i, ci, ex.Message));
1632                                                 }
1633
1634                                                 // bug #47720
1635                                                 if (dt != TimeZone.CurrentTimeZone.ToUniversalTime (dt))
1636                                                         Assert.IsTrue (12 != dt.Hour, String.Format ("bug #47720 on culture {0} {1}", ci.LCID, ci));
1637
1638                                                 // variant of RFC1123
1639                                                 try {
1640                                                         stage = "6";
1641                                                         dt = DateTime.Parse ("Sat, 1 Oct 1994 03:00:00", ci);
1642                                                 } catch (FormatException ex) {
1643                                                         Assert.Fail (String.Format ("stage 6.1 RFC1123 variant: culture {0} {1} failed: {2}", i, ci, ex.Message));
1644                                                 }
1645                                                 stage = "7";
1646                                                 Assert.AreEqual (3, dt.Hour, String.Format ("stage 7.1 RFC1123 variant on culture {0} {1}", ci.LCID, ci));
1647                                         }
1648
1649                                         switch (ci.LCID) {
1650                                         case 1025: // ar-SA
1651                                         case 1054: // th-TH
1652                                         case 1125: // div-MV
1653                                                 break;
1654                                         default:
1655                                                 stage = "8";
1656                                                 // 02/25/2002 04:25:13 as is
1657                                                 long tick1 = 631502079130000000;
1658                                                 long tick2 = TimeZone.CurrentTimeZone.ToLocalTime (new DateTime (tick1)).Ticks; // adjusted to local time
1659                                                 dt = DateTime.Parse ("Mon, 25 Feb 2002 04:25:13 GMT", ci);
1660                                                 Assert.AreEqual (tick2, dt.Ticks, String.Format ("GMT variant. culture={0} {1}", i, ci));
1661                                                 break;
1662                                         }
1663
1664 #if NET_1_1
1665                                         // ka-GE rejects these formats under MS.NET. 
1666                                         // I wonder why. Also, those tests fail under .NET 1.0.
1667                                         if (ci.LCID != 1079) {
1668                                                 stage = "9";
1669                                                 dt = DateTime.Parse ("2002-02-25");
1670                                                 stage = "10";
1671                                                 dt = DateTime.Parse ("2002-02-25Z");
1672                                                 stage = "11";
1673                                                 dt = DateTime.Parse ("2002-02-25T19:20:00+09:00");
1674                                                 switch (ci.LCID) {
1675                                                 case 1038: // FIXME: MS passes this culture.
1676                                                 case 1062: // FIXME: MS passes this culture.
1677                                                 case 1078: // MS does not pass this culture. Dunno why.
1678                                                         break;
1679                                                 default:
1680 #if ONLY_1_1
1681                                                         // bug #58938
1682                                                         stage = "12";
1683                                                         dt = DateTime.Parse ("2002#02#25 19:20:00");
1684                                                         // this stage fails under MS 2.0
1685                                                         stage = "13";
1686                                                         Assert.AreEqual (19, dt.Hour, String.Format ("bug #58938 on culture {0} {1}", ci.LCID, ci));
1687 #endif
1688                                                         break;
1689                                                 }
1690                                                 stage = "14";
1691                                                 dt = DateTime.Parse ("2002-02-25 12:01:03");
1692 #if ONLY_1_1
1693                                                 stage = "15";
1694                                                 dt = DateTime.Parse ("2002#02#25 12:01:03");
1695                                                 stage = "16";
1696                                                 dt = DateTime.Parse ("2002%02%25 12:01:03");
1697 #endif
1698                                                 stage = "17";
1699                                                 if (ci.DateTimeFormat.TimeSeparator != ".")
1700                                                         dt = DateTime.Parse ("2002.02.25 12:01:03");
1701                                                 stage = "18";
1702                                                 dt = DateTime.Parse ("2003/01/23 01:34:56 GMT");
1703                                                 dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1704                                                 Assert.AreEqual (1, dt.Hour, String.Format ("stage 18.1 RFC1123 UTC {0} {1}", i, ci));
1705                                                 stage = "19";
1706                                                 // This test was fixed from 12:34:56 to
1707                                                 // 01:34:56 since 1078 af-ZA failed
1708                                                 // because of hour interpretation
1709                                                 // difference (af-ZA expects 0).
1710                                                 // (IMHO it is MS BUG though.)
1711                                                 dt = DateTime.Parse ("2003/01/23 12:34:56 GMT");
1712                                                 dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1713                                                 if (i != 1078)
1714                                                         Assert.AreEqual (12, dt.Hour, String.Format ("stage 18.1 RFC1123 UTC {0} {1}", i, ci));
1715                                         }
1716 #endif
1717                                 } catch (FormatException ex) {
1718                                         Assert.Fail (String.Format ("stage {3}: Culture {0} {1} failed: {2}", i, ci, ex.Message, stage));
1719                                 }
1720                         }
1721                 }
1722
1723                 [Test]
1724                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1725                 public void ToFileTime_MinValue () 
1726                 {
1727                         DateTime.FromFileTime (Int64.MinValue);
1728                 }
1729
1730                 [Test]
1731                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1732                 public void ToFileTime_Negative () 
1733                 {
1734                         DateTime.FromFileTime (-1);
1735                 }
1736
1737                 [Test]
1738                 public void ToFileTime () 
1739                 {
1740                         long u = DateTime.FromFileTimeUtc (0).Ticks;
1741                         Assert.AreEqual (504911232000000000, u, "#A1");
1742                         long max = DateTime.MaxValue.Ticks - 504911232000000000; // w32file_epoch
1743                         Assert.AreEqual (3155378975999999999, DateTime.FromFileTimeUtc (max).Ticks, "#A2");
1744
1745                         long t = DateTime.FromFileTime (0).Ticks;
1746                         Assert.IsTrue (t > (u - TimeSpan.TicksPerDay), "#B1");
1747                         Assert.IsTrue (t < (u + TimeSpan.TicksPerDay), "#B2");
1748                 }
1749
1750                 [Test]
1751                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1752                 public void ToFileTimeUtc_MinValue () 
1753                 {
1754                         DateTime.FromFileTimeUtc (Int64.MinValue);
1755                 }
1756
1757                 [Test]
1758                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1759                 public void ToFileTimeUtc_Negative () 
1760                 {
1761                         DateTime.FromFileTimeUtc (-1);
1762                 }
1763
1764                 [Test]
1765                 public void Milliseconds ()
1766                 {
1767                         DateTime dt = DateTime.Parse ("2004-05-26T03:29:01.1234567-07:00");
1768                         dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1769                         Assert.AreEqual (632211641411234567, dt.Ticks);
1770                 }
1771
1772                 [Test]
1773 #if NET_2_0
1774                 [ExpectedException (typeof (FormatException))]
1775 #else
1776                 [Ignore ("Works only under MS 1.x (not Mono or MS 2.0).")]
1777 #endif
1778                 public void ParseNotExact ()
1779                 {
1780                         // The error reported is:
1781                         // String was not recognized as valid DateTime
1782                         DateTime dt = DateTime.Parse ("2004-05-26T03:29:01-07:00 foo");
1783                         dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1784                         Assert.AreEqual (632211641410000000, dt.Ticks);
1785                 }
1786
1787                 [Test]
1788                 public void ParseExact_Bug80094 ()
1789                 {
1790                         // we can safely change the curernt culture, as the original value will
1791                         // be restored on TearDown
1792                         Thread.CurrentThread.CurrentCulture = new CultureInfo ("ja-JP");
1793                         string y = string.Format ("{0}-{1}-{2} {3}", DateTime.Now.Year.ToString (),
1794                                 "11", "29", "06:34");
1795                         DateTime date = DateTime.ParseExact (y, "yyyy-MMM-dd hh:mm", null);
1796                         Assert.AreEqual (DateTime.Now.Year, date.Year, "#1");
1797                         Assert.AreEqual (11, date.Month, "#2");
1798                         Assert.AreEqual (29, date.Day, "#3");
1799                         Assert.AreEqual (6, date.Hour, "#4");
1800                         Assert.AreEqual (34, date.Minute, "#5");
1801                         Assert.AreEqual (0, date.Second, "#6");
1802                         Assert.AreEqual (0, date.Millisecond, "#7");
1803                 }
1804
1805 #if NET_2_0
1806                 [Test]
1807                 public void ParseExact_Bug324845 ()
1808                 {
1809                         DateTime ctime = new DateTime (2007, 7, 23, 19, 19, 45);
1810                         ctime = ctime.ToUniversalTime ();
1811                         string instr = ctime.ToString ("yyyyMMddHHmmss");
1812
1813                         DateTime t = DateTime.ParseExact (instr, "yyyyMMddHHmmss", null, DateTimeStyles.AssumeUniversal);
1814                         Assert.AreEqual (2007, t.Year);
1815                         Assert.AreEqual (7, t.Month);
1816                         Assert.AreEqual (23, t.Day);
1817                         Assert.AreEqual (19, t.Hour);
1818                         Assert.AreEqual (19, t.Minute);
1819                         Assert.AreEqual (45, t.Second);
1820
1821                 }
1822 #endif
1823
1824                 [Test]
1825                 [ExpectedException (typeof (FormatException))]
1826                 public void ParseExactIsExact()
1827                 {
1828                         DateTime.ParseExact ("2004-05-26T03:29:01-07:00 foo", "yyyy-MM-ddTHH:mm:sszzz", null);
1829                 }
1830
1831                 [Test]
1832                 [ExpectedException (typeof (FormatException))]
1833                 public void ParseExactDoesNotEatZ ()
1834                 {
1835                         DateTime.ParseExact ("2004-05-26T03:29:01", "yyyy-MM-ddTHH:mm:ssZ", null);
1836                 }
1837
1838                 [Test]
1839                 public void ParseExactMilliseconds ()
1840                 {
1841                         DateTime dt = DateTime.ParseExact ("2004-05-26T03:29:01.1234567-07:00", "yyyy-MM-ddTHH:mm:ss.fffffffzzz", null);
1842                         dt = TimeZone.CurrentTimeZone.ToUniversalTime (dt);
1843                         Assert.AreEqual (632211641411234567, dt.Ticks);
1844                 }
1845
1846                 [Test]
1847                 public void NoColonTimeZone ()
1848                 {
1849                         Assert.IsTrue (DateTime.Parse ("2004-05-26T03:29:01-0700").Ticks
1850                                 != DateTime.Parse ("2004-05-26T03:29:01-0800").Ticks);
1851                 }
1852
1853                 [Test]
1854                 public void WithColonTimeZone ()
1855                 {
1856                         Assert.IsTrue (DateTime.Parse ("2004-05-26T03:29:01-07:00").Ticks
1857                                 != DateTime.Parse ("2004-05-26T03:29:01-08:00").Ticks);
1858                 }
1859
1860                 [Test]
1861                 [ExpectedException (typeof (FormatException))]
1862                 public void EmptyFormatPattern ()
1863                 {
1864                         DateTime.ParseExact (String.Empty, String.Empty, null);
1865                 }
1866
1867                 [Test]
1868                 [ExpectedException (typeof (InvalidCastException))]
1869                 public void IConvertible_ToType_Boolean () 
1870                 {
1871                         ((IConvertible)DateTime.Now).ToType (typeof (bool), null);
1872                 }
1873
1874                 [Test]
1875                 [ExpectedException (typeof (InvalidCastException))]
1876                 public void IConvertible_ToType_Byte () 
1877                 {
1878                         ((IConvertible)DateTime.Now).ToType (typeof (byte), null);
1879                 }
1880
1881                 [Test]
1882                 [ExpectedException (typeof (InvalidCastException))]
1883                 public void IConvertible_ToType_Char () 
1884                 {
1885                         ((IConvertible)DateTime.Now).ToType (typeof (char), null);
1886                 }
1887
1888                 [Test]
1889                 public void IConvertible_ToType_DateTime () 
1890                 {
1891                         DateTime dt = DateTime.Now;
1892                         DateTime dt2 = (DateTime) ((IConvertible)dt).ToType (typeof (DateTime), null);
1893                         Assert.IsTrue (dt.Equals (dt2));
1894                 }
1895
1896                 [Test]
1897                 [ExpectedException (typeof (InvalidCastException))]
1898                 public void IConvertible_ToType_DBNull () 
1899                 {
1900                         ((IConvertible)DateTime.Now).ToType (typeof (DBNull), null);
1901                 }
1902
1903                 [Test]
1904                 [ExpectedException (typeof (InvalidCastException))]
1905                 public void IConvertible_ToType_Decimal () 
1906                 {
1907                         ((IConvertible)DateTime.Now).ToType (typeof (decimal), null);
1908                 }
1909
1910                 [Test]
1911                 [ExpectedException (typeof (InvalidCastException))]
1912                 public void IConvertible_ToType_Double () 
1913                 {
1914                         ((IConvertible)DateTime.Now).ToType (typeof (double), null);
1915                 }
1916
1917                 [Test]
1918                 [ExpectedException (typeof (ArgumentNullException))]
1919                 public void IConvertible_ToType_Empty () 
1920                 {
1921                         ((IConvertible)DateTime.Now).ToType (null, null);
1922                 }
1923
1924                 [Test]
1925                 [ExpectedException (typeof (InvalidCastException))]
1926                 public void IConvertible_ToType_Int16 () 
1927                 {
1928                         ((IConvertible)DateTime.Now).ToType (typeof (short), null);
1929                 }
1930
1931                 [Test]
1932                 [ExpectedException (typeof (InvalidCastException))]
1933                 public void IConvertible_ToType_Int32 () 
1934                 {
1935                         ((IConvertible)DateTime.Now).ToType (typeof (int), null);
1936                 }
1937
1938                 [Test]
1939                 [ExpectedException (typeof (InvalidCastException))]
1940                 public void IConvertible_ToType_Int64 () 
1941                 {
1942                         ((IConvertible)DateTime.Now).ToType (typeof (long), null);
1943                 }
1944
1945                 [Test]
1946                 public void IConvertible_ToType_Object () 
1947                 {
1948                         DateTime dt = DateTime.Now;
1949                         object o = ((IConvertible)dt).ToType (typeof (object), null);
1950                         Assert.IsTrue (dt.Equals (o));
1951                 }
1952
1953                 [Test]
1954                 [ExpectedException (typeof (InvalidCastException))]
1955                 public void IConvertible_ToType_SByte () 
1956                 {
1957                         ((IConvertible)DateTime.Now).ToType (typeof (sbyte), null);
1958                 }
1959
1960                 [Test]
1961                 [ExpectedException (typeof (InvalidCastException))]
1962                 public void IConvertible_ToType_Single () 
1963                 {
1964                         ((IConvertible)DateTime.Now).ToType (typeof (float), null);
1965                 }
1966
1967                 [Test]
1968                 public void IConvertible_ToType_String () 
1969                 {
1970                         DateTime dt = DateTime.Now;
1971                         string s = (string) ((IConvertible)dt).ToType (typeof (string), null);
1972                         Assert.AreEqual (s, dt.ToString ());
1973                 }
1974
1975                 [Test]
1976                 [ExpectedException (typeof (InvalidCastException))]
1977                 public void IConvertible_ToType_UInt16 () 
1978                 {
1979                         ((IConvertible)DateTime.Now).ToType (typeof (ushort), null);
1980                 }
1981
1982                 [Test]
1983                 [ExpectedException (typeof (InvalidCastException))]
1984                 public void IConvertible_ToType_UInt32 () 
1985                 {
1986                         ((IConvertible)DateTime.Now).ToType (typeof (uint), null);
1987                 }
1988
1989                 [Test]
1990                 [ExpectedException (typeof (InvalidCastException))]
1991                 public void IConvertible_ToType_UInt64 () 
1992                 {
1993                         ((IConvertible)DateTime.Now).ToType (typeof (ulong), null);
1994                 }
1995
1996                 [Test]
1997                 public void Bug352210 ()
1998                 {
1999                         DateTime dt = DateTime.ParseExact ("2007-06-15T10:30:10.5", "yyyy-MM-ddTHH:mm:ss.f", null);
2000                         Assert.AreEqual (633175002105000000, dt.Ticks, "#1");
2001 #if NET_2_0
2002                         Assert.AreEqual (DateTimeKind.Unspecified, dt.Kind, "#2");
2003 #endif
2004                 }
2005
2006                 [Test]
2007                 public void Bug352210_New ()
2008                 {
2009                         long ticksUTC = 633377759060000000;
2010                         long ticksLocal = ticksUTC + TimeZone.CurrentTimeZone.GetUtcOffset (new DateTime (ticksUTC)).Ticks;
2011                         CultureInfo ci = CultureInfo.InvariantCulture;
2012                         DateTime dt;
2013
2014                         // Should return same time with Unspecified kind
2015                         dt = DateTime.ParseExact ("2008-02-05 02:38:26", "yyyy-MM-dd HH:mm:ss", ci);
2016 #if NET_2_0
2017                         Assert.AreEqual (DateTimeKind.Unspecified, dt.Kind, "A1");
2018 #endif
2019                         Assert.AreEqual (ticksUTC, dt.Ticks, "A2");
2020
2021                         // Should return same time with Unspecified kind
2022                         dt = DateTime.ParseExact ("2008-02-05 02:38:26Z", "u", ci);
2023 #if NET_2_0
2024                         Assert.AreEqual (DateTimeKind.Unspecified, dt.Kind, "B1");
2025 #endif
2026                         Assert.AreEqual (ticksUTC, dt.Ticks, "B2");
2027
2028 #if NET_2_0
2029                         // Should adjust to local time with Local kind
2030                         dt = DateTime.ParseExact ("2008-02-05 00:38:26-02:00", "yyyy-MM-dd HH:mm:ssK", ci);
2031                         Assert.AreEqual (DateTimeKind.Local, dt.Kind, "C1");
2032                         Assert.AreEqual (ticksLocal, dt.Ticks, "C2");
2033
2034                         // Should ignore AssumeUniversal since a timezone specifier is in the format string
2035                         // and return time adjusted to local time with Local kind
2036                         dt = DateTime.ParseExact ("2008-02-05 00:38:26 -2", "yyyy-MM-dd HH:mm:ss z", ci, DateTimeStyles.AssumeUniversal);
2037                         Assert.AreEqual (DateTimeKind.Local, dt.Kind, "D1");
2038                         Assert.AreEqual (ticksLocal, dt.Ticks, "D2");
2039 #endif
2040
2041                         try {
2042                                 // GMT in format string can be used to specify time zone
2043                                 dt = DateTime.ParseExact ("2008-02-05 02:38:26 GMT", "yyyy-MM-dd HH:mm:ss GMT", ci);
2044 #if NET_2_0
2045                                 Assert.AreEqual (DateTimeKind.Local, dt.Kind, "E1");
2046 #endif
2047                                 Assert.AreEqual (ticksLocal, dt.Ticks, "E2");
2048                         }
2049                         catch {
2050                                 Assert.Fail ("E3");
2051                         }
2052
2053                         try {
2054                                 // Same as above even when surrounded with other characters
2055                                 dt = DateTime.ParseExact ("2008-02-05 02:38:26 qqGMTqq", "yyyy-MM-dd HH:mm:ss qqGMTqq", ci);
2056 #if NET_2_0
2057                                 Assert.AreEqual (DateTimeKind.Local, dt.Kind, "F1");
2058 #endif
2059                                 Assert.AreEqual (ticksLocal, dt.Ticks, "F2");
2060                         }
2061                         catch {
2062                                 Assert.Fail ("F3");
2063                         }
2064
2065                         try {
2066                                 // But single quoted GMT in format string should not specify time zone
2067                                 dt = DateTime.ParseExact ("2008-02-05 02:38:26 GMT", "yyyy-MM-dd HH:mm:ss 'GMT'", ci);
2068 #if NET_2_0
2069                                 Assert.AreEqual (DateTimeKind.Unspecified, dt.Kind, "G1");
2070 #endif
2071                                 Assert.AreEqual (ticksUTC, dt.Ticks, "G2");
2072                         }
2073                         catch {
2074                                 Assert.Fail ("G3");
2075                         }
2076
2077                         try {
2078                                 // GMT in Parse can occur before time in 2.0 but not in 1.0
2079                                 dt = DateTime.Parse ("GMT 2008-02-05 02:38:26", ci);
2080 #if NET_2_0
2081                                 Assert.AreEqual (DateTimeKind.Local, dt.Kind, "H1");
2082                                 Assert.AreEqual (ticksLocal, dt.Ticks, "H2");
2083 #else
2084                                 Assert.Fail ("H3");
2085 #endif
2086                         }
2087                         catch {
2088 #if NET_2_0
2089                                 Assert.Fail ("H4");
2090 #endif
2091                         }
2092                 }
2093
2094                 [Test]
2095                 public void Bug377042 ()
2096                 {
2097                         string [] f = new string [] {
2098                                 "yyyy-MM-ddTHH:mm:ssZ",
2099                                 "yyyy-MM-ddTHH:mm:sszzzz",
2100                                 "yyyy-MM-dd"
2101                                 };
2102                         DateTimeStyles dts = DateTimeStyles.AdjustToUniversal;
2103 #if NET_2_0
2104                         dts |= DateTimeStyles.AssumeUniversal;
2105 #endif
2106                         DateTime result = DateTime.ParseExact ("2005-01-01T01:11:11+8:00", f, new DateTimeFormatInfo (), dts);
2107                 }
2108
2109                 [Test]
2110                 [ExpectedException (typeof (FormatException))]
2111                 public void EmptyString ()
2112                 {
2113                         DateTime.Parse ("");
2114                 }
2115 #if NET_2_0
2116                 [Test]
2117                 public void TryEmptyString ()
2118                 {
2119                         DateTime date;
2120                         Assert.IsFalse (DateTime.TryParse ("", out date));
2121                 }
2122
2123                 [Test]
2124                 public void Kind ()
2125                 {
2126                         if (DateTime.Now == DateTime.UtcNow)
2127                                 return; // This test does not make sense.
2128                         if (TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.UtcNow)
2129                                 != TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.Now))
2130                                 return; // In this case it does not satisfy the test premises.
2131
2132                         Assert.AreEqual (DateTimeKind.Local, DateTime.Now.Kind, "#A1");
2133                         Assert.AreEqual (DateTimeKind.Local, DateTime.Today.Kind, "#A2");
2134
2135                         DateTime utc = DateTime.UtcNow;
2136                         DateTime now = new DateTime (utc.Ticks + TimeZone.
2137                                 CurrentTimeZone.GetUtcOffset (utc).Ticks, DateTimeKind.Local);
2138                         DateTime utctouniv = utc.ToUniversalTime ();
2139                         DateTime nowtouniv = now.ToUniversalTime ();
2140                         DateTime utctoloc = utc.ToLocalTime ();
2141                         DateTime nowtoloc = now.ToLocalTime ();
2142
2143                         Assert.AreEqual (DateTimeKind.Utc, utc.Kind, "#B1");
2144                         Assert.AreEqual (DateTimeKind.Local, now.Kind, "#B2");
2145                         Assert.AreEqual (DateTimeKind.Utc, utctouniv.Kind, "#B3");
2146                         Assert.AreEqual (DateTimeKind.Utc, nowtouniv.Kind, "#B4");
2147                         Assert.AreEqual (DateTimeKind.Local, utctoloc.Kind, "#B5");
2148                         Assert.AreEqual (DateTimeKind.Local, nowtoloc.Kind, "#B6");
2149                         Assert.AreEqual (utc, utctouniv, "#B7");
2150                         Assert.AreEqual (utc, nowtouniv, "#B8");
2151                         Assert.AreEqual (now, nowtoloc, "#B9");
2152                         Assert.AreEqual (now, utctoloc, "#B10");
2153                 }
2154
2155                 [Test]
2156                 public void InstanceMembersAndKind ()
2157                 {
2158                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.Date.Kind, "#1");
2159                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.Add (TimeSpan.FromMinutes (1)).Kind, "#2");
2160                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.Subtract (TimeSpan.FromMinutes (1)).Kind, "#3");
2161                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddDays (1).Kind, "#4");
2162                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddTicks (1).Kind, "#5");
2163                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddHours (1).Kind, "#6");
2164                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddMinutes (1).Kind, "#7");
2165                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddSeconds (1).Kind, "#8");
2166                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddMilliseconds (1).Kind, "#9");
2167                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddMonths (1).Kind, "#10");
2168                         Assert.AreEqual (DateTimeKind.Utc, DateTime.UtcNow.AddYears (1).Kind, "#11");
2169                         Assert.AreEqual (DateTimeKind.Utc, (DateTime.UtcNow + TimeSpan.FromMinutes (1)).Kind, "#12");
2170                         Assert.AreEqual (DateTimeKind.Utc, (DateTime.UtcNow - TimeSpan.FromMinutes (1)).Kind, "#13");
2171                 }
2172
2173                 [Test]
2174                 public void FromBinary ()
2175                 {
2176                         DateTime dt_utc = DateTime.FromBinary (0x4000000000000001);
2177                         Assert.AreEqual (DateTimeKind.Utc, dt_utc.Kind, "#1");
2178                         Assert.AreEqual (1, dt_utc.Ticks, "#2");
2179
2180                         DateTime dt_local = DateTime.FromBinary (unchecked ((long) 0x8000000000000001));
2181                         Assert.AreEqual (DateTimeKind.Local, dt_local.Kind, "#3");
2182
2183                         DateTime dt_unspecified = DateTime.FromBinary (0x0000000000000001);
2184                         Assert.AreEqual (DateTimeKind.Unspecified, dt_unspecified.Kind, "#4");
2185                         Assert.AreEqual (1, dt_unspecified.Ticks, "#5");
2186
2187                         DateTime dt_local2 = DateTime.FromBinary (unchecked ((long) 0xC000000000000001));
2188                         Assert.AreEqual (DateTimeKind.Local, dt_local2.Kind, "#6");
2189                         Assert.AreEqual (dt_local.Ticks, dt_local2.Ticks, "#7");
2190                 }
2191
2192                 [Test]
2193                 public void ToBinary ()
2194                 {
2195                         DateTime dt_local = new DateTime (1, DateTimeKind.Local);
2196                         Assert.AreEqual (1, (ulong) dt_local.ToBinary () >> 63, "#1");
2197                         Assert.AreEqual (1, dt_local.Ticks, "#2");
2198
2199                         DateTime dt_utc = new DateTime (1, DateTimeKind.Utc);
2200                         Assert.AreEqual (0x4000000000000001, dt_utc.ToBinary (), "#3");
2201                         Assert.AreEqual (1, dt_utc.Ticks, "#4");
2202
2203                         DateTime dt_unspecified = new DateTime (1, DateTimeKind.Unspecified);
2204                         Assert.AreEqual (1, dt_unspecified.ToBinary (), "#5");
2205                         Assert.AreEqual (1, dt_unspecified.Ticks, "#6");
2206                 }
2207
2208                 [Test]
2209                 public void RoundtripBinary ()
2210                 {
2211                         DateTime dt = DateTime.Now;
2212                         DateTime dt2 = DateTime.SpecifyKind (dt, DateTimeKind.Utc);
2213                         DateTime dt3 = DateTime.SpecifyKind (dt, DateTimeKind.Unspecified);
2214                         Assert.AreEqual (dt, DateTime.FromBinary (dt.ToBinary ()), "#1");
2215                         Assert.AreEqual (dt2, DateTime.FromBinary (dt2.ToBinary ()), "#2");
2216                         Assert.AreEqual (dt3, DateTime.FromBinary (dt3.ToBinary ()), "#3");
2217                         Assert.AreEqual (DateTimeKind.Local, DateTime.FromBinary (dt.ToBinary ()).Kind, "#4");
2218                         Assert.AreEqual (DateTimeKind.Utc, DateTime.FromBinary (dt2.ToBinary ()).Kind, "#5");
2219                         Assert.AreEqual (DateTimeKind.Unspecified, DateTime.FromBinary (dt3.ToBinary ()).Kind, "#6");
2220
2221                         Assert.AreEqual (TimeZone.CurrentTimeZone.GetUtcOffset (dt).Ticks, dt3.ToBinary () - (dt.ToBinary () & 0x7FFFFFFFFFFFFFFF), "#7");
2222                 }
2223
2224                 [Test]
2225                 public void TestMin ()
2226                 {
2227                         // This should never throw.
2228                         DateTime.MinValue.ToLocalTime ();
2229                 }
2230
2231                 [Test]
2232                 public void OmittedSecondsFraction ()
2233                 {
2234                         DateTime today = DateTime.Today;
2235                         Assert.AreEqual ("00:00:00.13579", today.AddTicks (1357900).ToString ("HH:mm:ss.FFFFFFF"), "#1");
2236                         DateTime dt = DateTime.ParseExact ("00:00:00.13579", "HH:mm:ss.FFFFFFF", CultureInfo.InvariantCulture);
2237                         Assert.AreEqual (today, dt.AddTicks (-1357900), "#2");
2238                         // it's more than strange ...
2239                         Assert.AreEqual (String.Empty, today.ToString (".FFFFFFF"), "#3");
2240                         Assert.AreEqual ("$", today.ToString ("$FFFFFFF"), "#4");
2241                 }
2242
2243                 [Test]
2244                 public void KindInPattern ()
2245                 {
2246                         // only 2.0 supports 'K'
2247                         Assert.AreEqual ("00:00:00", new DateTime (2000, 1, 1).ToString ("HH:mm:ssK"), "#1");
2248                         Assert.AreEqual ('Z', DateTime.Today.ToUniversalTime ().ToString ("HH:mm:ssK") [8], "#2");
2249                         Assert.AreEqual ("00:00:00+09:00".Length, DateTime.Today.ToString ("HH:mm:ssK").Length, "#3");
2250                 }
2251
2252                 [Test]
2253                 public void RoundtripPattern ()
2254                 {
2255                         // only 2.0 supports 'o'
2256                         Assert.AreEqual ("2000-01-01T00:00:00.0000000", new DateTime (2000, 1, 1).ToString ("o"), "#1");
2257                         Assert.AreEqual ("2000-01-01T00:00:00.0000000Z", DateTime.SpecifyKind (new DateTime (2000, 1, 1), DateTimeKind.Utc).ToString ("o"), "#2");
2258                         Assert.AreEqual ("2000-01-01T00:00:00.0000000+09:00".Length, DateTime.SpecifyKind (
2259                                 new DateTime (2000, 1, 1), DateTimeKind.Local).ToString ("o").Length, "#3");
2260                 }
2261
2262                 [Test]
2263                 [Category ("NotDotNet")]
2264                 [Category ("NotWorking")] // wrt bug #352210
2265                 public void KindPattern ()
2266                 {
2267                         // no matter how the format string contains 'K' and the
2268                         // output string contains kind information, it does not
2269                         // assure that the string is parsed as roundtrip kind.
2270
2271                         // only 2.0 supports 'K'
2272                         string format = "yyyy-MM-dd'T'HH:mm:ss.fffK";
2273                         CultureInfo ci = CultureInfo.CurrentCulture;
2274                         DateTime dt = DateTime.SpecifyKind (new DateTime (2007, 11, 1, 2, 30, 45), DateTimeKind.Utc);
2275                         string s = dt.ToString (format);
2276                         DateTime d1 = DateTime.ParseExact (s, format, ci); // d1 is parsed as a local time.
2277                         Assert.AreEqual (dt.Ticks, d1.ToUniversalTime ().Ticks, "#1");
2278                         // .NET expects Local here, while s ends with 'Z' and should be parsed as UTC.
2279                         Assert.AreEqual (DateTimeKind.Utc, d1.Kind, "#2");
2280
2281                         format = "yyyy-MM-dd'T'HH:mm:ssK";
2282                         ci = CultureInfo.CurrentCulture;
2283                         dt = new DateTime (2007, 11, 1, 2, 30, 45);
2284                         s = dt.ToString (format);
2285                         d1 = DateTime.ParseExact (s, format, ci);
2286                         Assert.AreEqual (dt.Ticks, d1.Ticks, "#3");
2287                         Assert.AreEqual (DateTimeKind.Unspecified, d1.Kind, "#4");
2288                 }
2289
2290                 [Test]
2291                 public void TestRoundTrip () {
2292                         DateTime result;
2293                         DateTimeStyles roundTripStyle = DateTimeStyles.RoundtripKind;
2294                         string utcDate = "2008-02-21T11:14:18.2721262Z";
2295                         string localDate = "2008-02-21T11:14:18.2721262+02:00";
2296                         string unspec = "2008-02-21T11:14:18.2721262";
2297                         String [] formats = {"yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"};
2298
2299                         result = DateTime.ParseExact (localDate, formats, CultureInfo.InvariantCulture, roundTripStyle);
2300                         Assert.AreEqual (result.Kind, DateTimeKind.Local);
2301                         Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391820582721262);
2302                         
2303                         result = DateTime.ParseExact (unspec, formats, CultureInfo.InvariantCulture, roundTripStyle);
2304                         Assert.AreEqual (result.Kind, DateTimeKind.Unspecified);
2305                         Assert.AreEqual (result.Ticks, 633391892582721262);
2306                         
2307                         result = DateTime.ParseExact (utcDate, formats, CultureInfo.InvariantCulture, roundTripStyle);
2308                         Assert.AreEqual (result.Kind, DateTimeKind.Utc);
2309                         Assert.AreEqual (result.Ticks, 633391892582721262);
2310
2311                 }               
2312
2313                 [Test]
2314                 public void TestRegularStyle () {
2315                         DateTime result;
2316                         DateTimeStyles style = DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite;
2317                         string utcDate = "2008-02-21T11:14:18.2721262Z";
2318                         string localDate = "2008-02-21T11:14:18.2721262+02:00";
2319                         string unspec = "2008-02-21T11:14:18.2721262";
2320                         String [] formats = {"yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"};
2321
2322                         result = DateTime.ParseExact (localDate, formats, CultureInfo.InvariantCulture, style);
2323                         Assert.AreEqual (result.Kind, DateTimeKind.Local);
2324                         Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391820582721262);
2325
2326                         result = DateTime.ParseExact (unspec, formats, CultureInfo.InvariantCulture, style);
2327                         Assert.AreEqual (result.Kind, DateTimeKind.Unspecified);                        
2328                         Assert.AreEqual (result.Ticks, 633391892582721262);
2329
2330                         result = DateTime.ParseExact (utcDate, formats, CultureInfo.InvariantCulture, style);
2331                         Assert.AreEqual (result.Kind, DateTimeKind.Local);
2332                         Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391892582721262);
2333                 }
2334
2335                 [Test]
2336                 public void TestAssumeLocal () {
2337                         DateTime result;
2338                         DateTimeStyles assumeLocal =  DateTimeStyles.AssumeLocal;
2339                         string utcDate = "2008-02-21T11:14:18.2721262Z";
2340                         string localDate = "2008-02-21T11:14:18.2721262+02:00";
2341                         string unspec = "2008-02-21T11:14:18.2721262";
2342                         String [] formats = {"yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"};
2343
2344                         result = DateTime.ParseExact (localDate, formats, CultureInfo.InvariantCulture, assumeLocal);
2345                         Assert.AreEqual (result.Kind, DateTimeKind.Local);
2346                         Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391820582721262);
2347
2348                         result = DateTime.ParseExact (unspec, formats, CultureInfo.InvariantCulture, assumeLocal);
2349                         Assert.AreEqual (result.Kind, DateTimeKind.Local);
2350                         Assert.AreEqual (result.Ticks, 633391892582721262);
2351
2352                         result = DateTime.ParseExact (utcDate, formats, CultureInfo.InvariantCulture, assumeLocal);
2353                         Assert.AreEqual (result.Kind, DateTimeKind.Local);
2354                         Assert.AreEqual (result.ToUniversalTime ().Ticks, 633391892582721262);
2355                 }
2356
2357                 [Test]
2358                 [ExpectedException (typeof (ArgumentException))]
2359                 public void IllegalStyleCombination1()
2360                 {
2361                         DateTimeStyles illegal = DateTimeStyles.RoundtripKind | DateTimeStyles.AssumeLocal;
2362                         DateTime.ParseExact ("", "", null, illegal);                    
2363                 }
2364
2365                 [Test]
2366                 [ExpectedException (typeof (ArgumentException))]
2367                 public void IllegalStyleCombination2()
2368                 {
2369                         DateTimeStyles illegal = DateTimeStyles.RoundtripKind | DateTimeStyles.AdjustToUniversal;
2370                         DateTime.ParseExact ("", "", null, illegal);
2371                 }
2372
2373                 [Test]
2374                 [ExpectedException (typeof (ArgumentException))]
2375                 public void IllegalStyleCombination3()
2376                 {
2377                         DateTimeStyles illegal = DateTimeStyles.RoundtripKind | DateTimeStyles.AssumeUniversal;
2378                         DateTime.ParseExact ("", "", null, illegal);
2379                 }
2380
2381                 [Test]
2382                 [ExpectedException (typeof (ArgumentException))]
2383                 public void IllegalStyleCombination4()
2384                 {
2385                         DateTimeStyles illegal = DateTimeStyles.AssumeLocal | DateTimeStyles.AssumeUniversal;
2386                         DateTime.ParseExact ("", "", null, illegal);
2387                 }
2388
2389                 [Test]
2390                 [ExpectedException (typeof (FormatException))]
2391                 public void TrailingDot ()
2392                 {
2393                         DateTime.ParseExact ("12:00:00", "HH:mm:ss.", null);
2394                 }
2395
2396                 [Test]
2397                 public void TrailingFlexibleMilliseconds ()
2398                 {
2399                         // bug #444103.
2400                         DateTime.ParseExact ("12:00:00", "HH:mm:ss.FFFFFFF", null);
2401                 }
2402 #endif
2403         }
2404 }