Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHorst Kakuschke <HorstKakuschke@users.noreply.github.com>2013-12-11 23:14:17 +0400
committerHorst Kakuschke <HorstKakuschke@users.noreply.github.com>2013-12-11 23:14:17 +0400
commit2ff1bf33aa2965ba6cfb6d26dd3ee55ae50b5224 (patch)
tree9ec7a5791d296a46cb455e0587eda14b77596bdc /mcs/class/System.XML
parente652c6d7f2dc3cc4e76d59725bce05f1d2103eff (diff)
Fixes Xamarin Bug 16742: XmlConvert.ToDateTime(string, XmlDateTimeSerializationMode) throws index out of bounds exception
Fix for bug + added tests for method XmlConvert.ToDateTime(string, XmlDateTimeSerializationMode)
Diffstat (limited to 'mcs/class/System.XML')
-rw-r--r--mcs/class/System.XML/System.Xml/XmlConvert.cs55
-rw-r--r--mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs195
2 files changed, 198 insertions, 52 deletions
diff --git a/mcs/class/System.XML/System.Xml/XmlConvert.cs b/mcs/class/System.XML/System.Xml/XmlConvert.cs
index 8497c85eee9..bac049be278 100644
--- a/mcs/class/System.XML/System.Xml/XmlConvert.cs
+++ b/mcs/class/System.XML/System.Xml/XmlConvert.cs
@@ -140,48 +140,6 @@ namespace System.Xml {
"---ddZ",
};
-#if NET_2_0
- static readonly string [] defaultDateTimeFormats = new string [] {
- "yyyy-MM-ddTHH:mm:ss", // dateTime(1)
- "yyyy-MM-ddTHH:mm:ss.FFFFFFF", // dateTime(2)
- "yyyy-MM-dd", // date
- "HH:mm:ss", // time
- "yyyy-MM", // gYearMonth
- "yyyy", // gYear
- "--MM-dd", // gMonthDay
- "---dd", // gDay
- };
-
- static readonly string [] roundtripDateTimeFormats;
- static readonly string [] localDateTimeFormats;
- static readonly string [] utcDateTimeFormats;
- static readonly string [] unspecifiedDateTimeFormats;
-
- static XmlConvert ()
- {
- int l = defaultDateTimeFormats.Length;
- roundtripDateTimeFormats = new string [l * 2];
- localDateTimeFormats = new string [l * 2];
- utcDateTimeFormats = new string [l * 3];
- unspecifiedDateTimeFormats = new string [l * 5];
- for (int i = 0; i < l; i++) {
- string s = defaultDateTimeFormats [i];
- var z = s + 'Z';
- localDateTimeFormats [i * 2] = s + (s [s.Length - 1] == 's' || s [s.Length - 1] == 'F' ? "zzz" : String.Empty);
- localDateTimeFormats [i * 2 + 1] = z;
- roundtripDateTimeFormats [i * 2] = s + 'K';
- roundtripDateTimeFormats [i * 2 + 1] = z;
- utcDateTimeFormats [i * 3] = s;
- utcDateTimeFormats [i * 3 + 1] = z;
- utcDateTimeFormats [i * 3 + 2] = s + "zzz";
- unspecifiedDateTimeFormats [i * 5] = s;
- unspecifiedDateTimeFormats [i * 5 + 1] = z;
- unspecifiedDateTimeFormats [i * 5 + 2] = localDateTimeFormats [i];
- unspecifiedDateTimeFormats [i * 5 + 3] = roundtripDateTimeFormats [i];
- unspecifiedDateTimeFormats [i * 5 + 4] = utcDateTimeFormats [i];
- }
- }
-#endif
static DateTimeStyles _defaultStyle = DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite;
public XmlConvert()
@@ -369,20 +327,15 @@ namespace System.Xml {
#if NET_2_0
public static DateTime ToDateTime (string s, XmlDateTimeSerializationMode dateTimeOption)
{
- DateTime dt;
switch (dateTimeOption) {
case XmlDateTimeSerializationMode.Local:
- dt = ToDateTime (s, localDateTimeFormats);
- return new DateTime (dt.Ticks, DateTimeKind.Local);
+ return ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.AssumeLocal).ToLocalTime();
case XmlDateTimeSerializationMode.RoundtripKind:
- return ToDateTime (s, roundtripDateTimeFormats, _defaultStyle | DateTimeStyles.RoundtripKind);
+ return ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.RoundtripKind);
case XmlDateTimeSerializationMode.Utc:
- dt = ToDateTime (s, utcDateTimeFormats);
- return new DateTime (dt.Ticks, DateTimeKind.Utc);
- case XmlDateTimeSerializationMode.Unspecified:
- return ToDateTime (s, unspecifiedDateTimeFormats);
+ return ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.AssumeUniversal).ToUniversalTime();
default:
- return ToDateTime (s, defaultDateTimeFormats);
+ return new DateTime (ToDateTime(s, datetimeFormats, _defaultStyle | DateTimeStyles.RoundtripKind).Ticks, DateTimeKind.Unspecified);
}
}
#endif
diff --git a/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs
index 900043304d6..9cd202e5aac 100644
--- a/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs
+++ b/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs
@@ -193,7 +193,200 @@ namespace MonoTests.System.Xml
{
}
}
-
+
+ [Test]
+ public void ToDateTimeWithSerializationMode ()
+ {
+ //check resulting datetime depending on serialization mode
+ foreach (XmlDateTimeSerializationMode dateTimeSerializationMode in Enum.GetValues(typeof(XmlDateTimeSerializationMode)))
+ {
+ //dateTime local
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 123).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.123", dateTimeSerializationMode).Ticks);
+
+ //dateTime with zero timezone
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Local)
+ {
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 123, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.123Z", dateTimeSerializationMode).Ticks);
+ }
+ else
+ {
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(2003, 09, 26, 13, 30, 44, 123, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.123Z", dateTimeSerializationMode).Ticks);
+ }
+
+ //dateTime with timezone
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Utc)
+ {
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 123, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.123+13:00", dateTimeSerializationMode).Ticks);
+ }
+ else
+ {
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.00000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.0000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 13, 30, 44, 123, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26T13:30:44.123+13:00", dateTimeSerializationMode).Ticks);
+ }
+
+ //time local
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44.0", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44.00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44.000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44.0000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44.00000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44.000000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000).Ticks, XmlConvert.ToDateTime("13:30:44.0000000", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 123).Ticks, XmlConvert.ToDateTime("13:30:44.123", dateTimeSerializationMode).Ticks);
+
+ //time with zero timezone
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Local)
+ {
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.00Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.00000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 123, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.123Z", dateTimeSerializationMode).Ticks);
+ }
+ else
+ {
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.0Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.00Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.0000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.00000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.0000000Z", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 123, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("13:30:44.123Z", dateTimeSerializationMode).Ticks);
+ }
+
+ //time with timezone
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Utc)
+ {
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.00+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.00000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 123, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("13:30:44.123+13:00", dateTimeSerializationMode).Ticks);
+ }
+ else
+ {
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.00+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.00000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.0000000+13:00", dateTimeSerializationMode).Ticks);
+ Assert.AreEqual(new DateTimeOffset(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 13, 30, 44, 123, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("13:30:44.123+13:00", dateTimeSerializationMode).Ticks);
+ }
+
+ //date
+ Assert.AreEqual(new DateTime(2003, 09, 26, 00, 00, 00, 000).Ticks, XmlConvert.ToDateTime("2003-09-26", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Local)
+ Assert.AreEqual(new DateTime(2003, 09, 26, 00, 00, 00, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26Z", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTime(2003, 09, 26, 00, 00, 00, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09-26Z", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Utc)
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09-26+13:00", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 26, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09-26+13:00", dateTimeSerializationMode).Ticks);
+
+ //gYearMonth
+ Assert.AreEqual(new DateTime(2003, 09, 01, 00, 00, 00, 000).Ticks, XmlConvert.ToDateTime("2003-09", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Local)
+ Assert.AreEqual(new DateTime(2003, 09, 01, 00, 00, 00, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09Z", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTime(2003, 09, 01, 00, 00, 00, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003-09Z", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Utc)
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 01, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003-09+13:00", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTimeOffset(2003, 09, 01, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003-09+13:00", dateTimeSerializationMode).Ticks);
+
+ //gYear
+ Assert.AreEqual(new DateTime(2003, 01, 01, 00, 00, 00, 000).Ticks, XmlConvert.ToDateTime("2003", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Local)
+ Assert.AreEqual(new DateTime(2003, 01, 01, 00, 00, 00, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003Z", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTime(2003, 01, 01, 00, 00, 00, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("2003Z", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Utc)
+ Assert.AreEqual(new DateTimeOffset(2003, 01, 01, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("2003+13:00", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTimeOffset(2003, 01, 01, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("2003+13:00", dateTimeSerializationMode).Ticks);
+
+ //gDay
+ Assert.AreEqual(new DateTime(DateTime.Now.Year, 01, 26, 00, 00, 00, 000).Ticks, XmlConvert.ToDateTime("---26", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Local)
+ Assert.AreEqual(new DateTime(DateTime.Now.Year, 01, 26, 00, 00, 00, 000, DateTimeKind.Utc).ToLocalTime().Ticks, XmlConvert.ToDateTime("---26Z", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTime(DateTime.Now.Year, 01, 26, 00, 00, 00, 000, DateTimeKind.Local).Ticks, XmlConvert.ToDateTime("---26Z", dateTimeSerializationMode).Ticks);
+ if (dateTimeSerializationMode == XmlDateTimeSerializationMode.Utc)
+ Assert.AreEqual(new DateTimeOffset(DateTime.Now.Year, 01, 26, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToUniversalTime().Ticks, XmlConvert.ToDateTime("---26+13:00", dateTimeSerializationMode).Ticks);
+ else
+ Assert.AreEqual(new DateTimeOffset(DateTime.Now.Year, 01, 26, 00, 00, 00, 000, new TimeSpan(13, 0, 0)).ToLocalTime().Ticks, XmlConvert.ToDateTime("---26+13:00", dateTimeSerializationMode).Ticks);
+
+ }
+
+ //check resulting date kind
+ Assert.AreEqual(DateTimeKind.Local, XmlConvert.ToDateTime("2003-09-26T13:30:44", XmlDateTimeSerializationMode.Local).Kind);
+ Assert.AreEqual(DateTimeKind.Local, XmlConvert.ToDateTime("2003-09-26T13:30:44Z", XmlDateTimeSerializationMode.Local).Kind);
+ Assert.AreEqual(DateTimeKind.Local, XmlConvert.ToDateTime("2003-09-26T13:30:44+13:00", XmlDateTimeSerializationMode.Local).Kind);
+ Assert.AreEqual(DateTimeKind.Utc, XmlConvert.ToDateTime("2003-09-26T13:30:44", XmlDateTimeSerializationMode.Utc).Kind);
+ Assert.AreEqual(DateTimeKind.Utc, XmlConvert.ToDateTime("2003-09-26T13:30:44Z", XmlDateTimeSerializationMode.Utc).Kind);
+ Assert.AreEqual(DateTimeKind.Utc, XmlConvert.ToDateTime("2003-09-26T13:30:44+13:00", XmlDateTimeSerializationMode.Utc).Kind);
+ Assert.AreEqual(DateTimeKind.Unspecified, XmlConvert.ToDateTime("2003-09-26T13:30:44", XmlDateTimeSerializationMode.Unspecified).Kind);
+ Assert.AreEqual(DateTimeKind.Unspecified, XmlConvert.ToDateTime("2003-09-26T13:30:44Z", XmlDateTimeSerializationMode.Unspecified).Kind);
+ Assert.AreEqual(DateTimeKind.Unspecified, XmlConvert.ToDateTime("2003-09-26T13:30:44+13:00", XmlDateTimeSerializationMode.Unspecified).Kind);
+ Assert.AreEqual(DateTimeKind.Unspecified, XmlConvert.ToDateTime("2003-09-26T13:30:44", XmlDateTimeSerializationMode.RoundtripKind).Kind);
+ Assert.AreEqual(DateTimeKind.Utc, XmlConvert.ToDateTime("2003-09-26T13:30:44Z", XmlDateTimeSerializationMode.RoundtripKind).Kind);
+ Assert.AreEqual(DateTimeKind.Local, XmlConvert.ToDateTime("2003-09-26T13:30:44+13:00", XmlDateTimeSerializationMode.RoundtripKind).Kind);
+ }
+
[Test]
public void ToDecimal ()
{