Merge pull request #901 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / corlib / Test / System / DateTimeOffsetTest.cs
index 2cd5196b0ffa244d5633c8d23ae3414fed705b70..3bc65a8204b3beb05743dd022ee26e45b11e4dc5 100644 (file)
@@ -3,11 +3,12 @@
 //
 // Authors:
 //     Stephane Delcroix  (sdelcroix@novell.com)
+//     Marek Safar (marek.safar@gmail.com)
 //
 // Copyright (C) 2007 Novell, Inc (http://www.novell.com)
+// Copyright 2012 Xamarin, Inc (http://www.xamarin.com)
 //
 
-#if NET_2_0
 using System.Globalization;
 using NUnit.Framework;
 using System;
@@ -162,7 +163,7 @@ namespace MonoTests.System {
                        Assert.AreEqual (dto.ToString ("r", new CultureInfo ("en-us")), dto.ToString ("R", new CultureInfo ("en-us")));
                        Assert.AreEqual ("2007-10-31T21:00:00", dto.ToString ("s", new CultureInfo ("en-us")));
                        Assert.AreEqual ("2007-11-01 05:00:00Z", dto.ToString ("u", new CultureInfo ("en-us")));
-                       Assert.AreEqual ("October, 2007", dto.ToString ("Y", new CultureInfo ("en-us")));
+                       Assert.AreEqual ("October 2007", dto.ToString ("Y", new CultureInfo ("en-us")));
                        Assert.AreEqual (dto.ToString ("y", new CultureInfo ("en-us")), dto.ToString ("Y", new CultureInfo ("en-us")));
                }
 
@@ -189,7 +190,7 @@ namespace MonoTests.System {
                                "M/dd/yyyy",
                                "M/d/y",
                                "M/d/yy",
-                               "M/d/yyy",
+//                             "M/d/yyy", // this fails on .NET 2.0 (3.5) and 4.0
                                "M/d/yyyy",
                                "M/d/yyyyy",
                                "M/d/yyyyyy",
@@ -232,7 +233,10 @@ namespace MonoTests.System {
                                "M/d/yyyy H:m zzz",    "MM/d/yyyy H:m zzz",
                                "M/dd/yy H:m zzz",     "MM/dd/yy H:m zzz",
                                "M/d/yy H:m zzz",      "M/d/yy H:m zzz",
-                               "ddd dd MMM yyyy h:mm tt zzz", 
+                               "ddd dd MMM yyyy h:mm tt zzz",
+                               "o", "O",
+                               "r", "R",
+                               "u",
                        };
 
                        foreach (DateTimeOffset dto in dtos)
@@ -243,6 +247,24 @@ namespace MonoTests.System {
                                        Assert.AreEqual (dto, DateTimeOffset.ParseExact (serialized, format, fp), format);
                                }
                }
+
+               //
+               // Tests that we can parse the K format specifier which is a 4 digit offset
+               // see bug 589227
+               //
+               [Test]
+               public void ParseExactWithKFormat ()
+               {
+                       DateTimeOffset o = DateTimeOffset.ParseExact ("Wed Mar 17 22:25:08 +0000 2010", "ddd MMM d H:m:ss K yyyy", CultureInfo.InvariantCulture);
+               }
+
+               [Test]
+               public void ParseExactCustomFormat ()
+               {
+                       var dt = DateTimeOffset.ParseExact ("Sunday, 06-Nov-94 08:49:37 GMT", "dddd, dd'-'MMM'-'yy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture);
+                       Assert.AreEqual (new DateTimeOffset (1994, 11, 6, 8, 49, 37, TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.Now)), dt);
+               }
+               
                [Test]
                public void ParseExactYearFormat ()
                {
@@ -255,7 +277,7 @@ namespace MonoTests.System {
                        };
 
                        string[] formats = {
-                               "M/d/yyy H:m zzz",
+//                             "M/d/yyy H:m zzz", // fails under .NET 2.0 and 4.0.
                                "M/d/yyyy H:m zzz",
                                "M/d/yyyyy H:m zzz",
                                "M/d/yyyyyy H:m zzz",
@@ -272,6 +294,27 @@ namespace MonoTests.System {
                        
                }
 
+               [Test]
+               public void ParseExactOffsetFormat ()
+               {
+                       CultureInfo fp = CultureInfo.InvariantCulture;
+                       string[] dates = {
+                               "13/Oct/2009:22:35:35 +09:00",
+                               "13/Oct/2009:22:35:35 +0900",
+                               "13/Oct/2009:22:35:35 +09:30",
+                               "13/Oct/2009:22:35:35 +0930",
+                       };
+                       TimeSpan[] offsets = {
+                               new TimeSpan (9,0,0),
+                               new TimeSpan (9,0,0),
+                               new TimeSpan (9,30,0),
+                               new TimeSpan (9,30,0),
+                       };
+
+                       for (int i = 0; i < dates.Length; i++)
+                               Assert.AreEqual(offsets[i], DateTimeOffset.ParseExact (dates[i], "d/MMM/yyyy:HH:mm:ss zzz", fp).Offset, dates[i]);
+               }
+
                [Test]
                [ExpectedException (typeof (FormatException))]
                public void ParseExactYearException ()
@@ -322,6 +365,16 @@ namespace MonoTests.System {
                        DateTimeOffset.ParseExact(date, format, fp);
                }
 
+               [Test]
+               [ExpectedException (typeof (FormatException))]
+               public void ParseExactFormatException5 ()
+               {
+                       CultureInfo fp = CultureInfo.InvariantCulture;
+                       string format = "U";
+                       string date = "Mon 14 Jan 2008 2:56 PM +01: 00";
+                       DateTimeOffset.ParseExact (date, format, fp);
+               }
+
                [Test]
                public void ParseExactWithSeconds ()
                {
@@ -399,17 +452,17 @@ namespace MonoTests.System {
                }
 
                [Test]
-               [ExpectedException (typeof (ArgumentOutOfRangeException))]
+               [ExpectedException (typeof (FormatException))]
                public void ParseUnderflow ()
                {
-                       DateTimeOffset.Parse ("01/01/0001 0:0 +09:00");
+                       DateTimeOffset.Parse ("01/01/0001 0:0 +09:00", new CultureInfo ("en-US"));
                }
 
                [Test]
-               [ExpectedException (typeof (ArgumentOutOfRangeException))]
+               [ExpectedException (typeof (FormatException))]
                public void ParseOverflow ()
                {
-                       DateTimeOffset.Parse ("12/31/9999 23:59 -09:00");
+                       DateTimeOffset.Parse ("12/31/9999 23:59 -09:00", new CultureInfo ("en-US"));
                }
 
                [Test]
@@ -446,6 +499,14 @@ namespace MonoTests.System {
                                }
                }
 
+               [Test]
+               public void ParseExactPreserveFractions ()
+               {
+                       var s = "1999-06-10T21:27:03.1147764+02:00";
+                       var d = DateTimeOffset.ParseExact (s, "yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+                       Assert.AreEqual (630646468231147764, d.Ticks, "#1");
+               }
+
                [Test]
                public void EqualsObject ()
                {
@@ -597,8 +658,16 @@ namespace MonoTests.System {
                        }
                        return result;
                }
-
+               
+               [Test]
+               public void ArithmeticAccrossDSTBoudaries ()
+               {
+                       DateTime dt = new DateTime (633954393584177800, DateTimeKind.Local); //Dec 3, 2009, 12:16
+                       DateTimeOffset dto = new DateTimeOffset (dt);
+                       DateTimeOffset dto2 = dto.AddDays (-60); //Should cross the late Oct boundary in most part of the world
+                       Assert.AreEqual (dto.Offset, dto2.Offset);
+                       Assert.AreEqual (dt.AddDays (-60), dto2.DateTime);
+               }
        }
 }
-#endif