Explorar o código

2007-10-30 Atsushi Enomoto <[email protected]>

	* XmlConvert.cs : ToDateTime(string,string) should use ParseExact(),
	  not Parse(). Use 'K' for roundtrip format.

	* XmlCustomFormatter.cs : use RoundtripKind when converting to and
	  from DateTime.

	* XmlConvertTest.cs : added test for DateTime roundtrip.

	* XmlSerializerTests.cs : added test for bug #337729.


svn path=/trunk/mcs/; revision=88448
Atsushi Eno %!s(int64=18) %!d(string=hai) anos
pai
achega
756ab6c79b

+ 5 - 0
mcs/class/System.XML/System.Xml.Serialization/ChangeLog

@@ -1,3 +1,8 @@
+2007-10-30  Atsushi Enomoto  <[email protected]>
+
+	* XmlCustomFormatter.cs : use RoundtripKind when converting to and
+	  from DateTime.
+
 2007-10-30  Atsushi Enomoto  <[email protected]>
 
 	* MapCodeGenerator.cs : found the true culprit for the previous

+ 12 - 6
mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs

@@ -67,7 +67,7 @@ namespace System.Xml.Serialization {
 		internal static string FromDateTime (DateTime value)
 		{
 #if NET_2_0
-			return XmlConvert.ToString (value, "yyyy-MM-ddTHH:mm:ss.FFFFFFF");
+			return XmlConvert.ToString (value, XmlDateTimeSerializationMode.RoundtripKind);
 #else
 			return XmlConvert.ToString (value, "yyyy-MM-ddTHH:mm:ss.fffffffzzz");
 #endif
@@ -165,7 +165,11 @@ namespace System.Xml.Serialization {
 
 		internal static DateTime ToDateTime (string value)
 		{
+#if NET_2_0
+			return XmlConvert.ToDateTime (value, XmlDateTimeSerializationMode.RoundtripKind);
+#else
 			return XmlConvert.ToDateTime (value);
+#endif
 		}
 
 		internal static DateTime ToTime (string value)
@@ -230,7 +234,7 @@ namespace System.Xml.Serialization {
 				case "unsignedByte": return XmlConvert.ToString ((byte)value);
 				case "char": return XmlConvert.ToString ((int)(char)value);
 #if NET_2_0
-				case "dateTime": return XmlConvert.ToString ((DateTime)value, XmlDateTimeSerializationMode.Unspecified);
+				case "dateTime": return XmlConvert.ToString ((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind);
 				case "date": return ((DateTime)value).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
 				case "time": return ((DateTime)value).ToString("HH:mm:ss.FFFFFFF", CultureInfo.InvariantCulture);
 #else
@@ -266,11 +270,13 @@ namespace System.Xml.Serialization {
 				case "boolean": return XmlConvert.ToBoolean (value);
 				case "unsignedByte": return XmlConvert.ToByte (value);
 				case "char": return (char)XmlConvert.ToInt32 (value);
-				case "dateTime": return XmlConvert.ToDateTime (value);
-				case "date": return DateTime.ParseExact (value, "yyyy-MM-dd", null);
 #if NET_2_0
+				case "dateTime": return XmlConvert.ToDateTime (value, XmlDateTimeSerializationMode.RoundtripKind);
+				case "date": return DateTime.ParseExact (value, "yyyy-MM-dd", null);
 				case "time": return DateTime.ParseExact (value, "HH:mm:ss.FFFFFFF", null);
 #else
+				case "dateTime": return XmlConvert.ToDateTime (value);
+				case "date": return DateTime.ParseExact (value, "yyyy-MM-dd", null);
 				case "time": return DateTime.ParseExact (value, "HH:mm:ss.fffffffzzz", null);
 #endif
 				case "decimal": return XmlConvert.ToDecimal (value);
@@ -314,7 +320,7 @@ namespace System.Xml.Serialization {
 				case "unsignedByte": return value + ".ToString(CultureInfo.InvariantCulture)";
 				case "char": return "((int)(" + value + ")).ToString(CultureInfo.InvariantCulture)";
 #if NET_2_0
-				case "dateTime": return value + ".ToString(\"yyyy-MM-ddTHH:mm:ss.FFFFFFF\", CultureInfo.InvariantCulture)";
+				case "dateTime": return "XmlConvert.ToString (" + value + ", XmlDateTimeSerializationMode.RoundtripKind)";
 				case "date": return value + ".ToString(\"yyyy-MM-dd\", CultureInfo.InvariantCulture)";
 				case "time": return value + ".ToString(\"HH:mm:ss.FFFFFFF\", CultureInfo.InvariantCulture)";
 #else
@@ -368,7 +374,7 @@ namespace System.Xml.Serialization {
 				case "unsignedByte": return "byte.Parse (" + value + ", CultureInfo.InvariantCulture)";
 				case "char": return "(char)Int32.Parse (" + value + ", CultureInfo.InvariantCulture)";
 #if NET_2_0
-				case "dateTime": return "XmlConvert.ToDateTime (" + value + ", XmlDateTimeSerializationMode.Unspecified)";
+				case "dateTime": return "XmlConvert.ToDateTime (" + value + ", XmlDateTimeSerializationMode.RoundtripKind)";
 				case "date": return "DateTime.ParseExact (" + value + ", \"yyyy-MM-dd\", CultureInfo.InvariantCulture)";
 				case "time": return "DateTime.ParseExact (" + value + ", \"HH:mm:ss.FFFFFFF\", CultureInfo.InvariantCulture)";
 #else

+ 5 - 0
mcs/class/System.XML/System.Xml/ChangeLog

@@ -1,3 +1,8 @@
+2007-10-30  Atsushi Enomoto  <[email protected]>
+
+	* XmlConvert.cs : ToDateTime(string,string) should use ParseExact(),
+	  not Parse(). Use 'K' for roundtrip format.
+
 2007-10-10  Atsushi Enomoto  <[email protected]>
 
 	* XmlTextWriter2.cs : making <del>silly</del>funky MS compatibility

+ 8 - 5
mcs/class/System.XML/System.Xml/XmlConvert.cs

@@ -301,7 +301,7 @@ namespace System.Xml {
 				dt = ToDateTime (value, "yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz");
 				return dt == DateTime.MinValue || dt == DateTime.MaxValue ? dt : dt.ToLocalTime ();
 			case XmlDateTimeSerializationMode.RoundtripKind:
-				return ToDateTime (value, "yyyy-MM-ddTHH:mm:ss.FFFFFFF");
+				return ToDateTime (value, "yyyy-MM-ddTHH:mm:ss.FFFFFFFK");
 			case XmlDateTimeSerializationMode.Utc:
 				dt = ToDateTime (value, "yyyy-MM-ddTHH:mm:ss.FFFFFFFZ");
 				return dt == DateTime.MinValue || dt == DateTime.MaxValue ? dt : dt.ToUniversalTime ();
@@ -313,9 +313,12 @@ namespace System.Xml {
 #endif
 		public static DateTime ToDateTime(string s, string format)
 		{
-			DateTimeFormatInfo d = new DateTimeFormatInfo();
-			d.FullDateTimePattern = format;
-			return DateTime.Parse(s, d);
+			//DateTimeFormatInfo d = new DateTimeFormatInfo();
+			//d.FullDateTimePattern = format;
+			//return DateTime.Parse(s, d);
+			DateTimeStyles style = DateTimeStyles.AllowLeadingWhite |
+					       DateTimeStyles.AllowTrailingWhite;
+			return DateTime.ParseExact (s, format, DateTimeFormatInfo.InvariantInfo, style);
 		}
 
 		public static DateTime ToDateTime(string s, string[] formats)
@@ -518,7 +521,7 @@ namespace System.Xml {
 				break;
 			case XmlDateTimeSerializationMode.RoundtripKind:
 				return value.ToString (
-					"yyyy-MM-ddTHH:mm:ss.FFFFFFF",
+					"yyyy-MM-ddTHH:mm:ss.FFFFFFFK",
 					CultureInfo.InvariantCulture);
 				break;
 			default:

+ 4 - 0
mcs/class/System.XML/Test/System.Xml.Serialization/ChangeLog

@@ -1,3 +1,7 @@
+2007-10-30  Atsushi Enomoto  <[email protected]>
+
+	* XmlSerializerTests.cs : added test for bug #337729.
+
 2007-10-30  Atsushi Enomoto  <[email protected]>
 
 	* XmlCodeExporterTests.cs : enable the previous test again.

+ 12 - 0
mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTests.cs

@@ -2314,6 +2314,18 @@ namespace MonoTests.System.XmlSerialization
 			ser.Serialize (TextWriter.Null, new InvalidTypeContainer ());
 		}
 
+#if NET_2_0
+		public void DateTimeRoundtrip ()
+		{
+			// bug #337729
+			XmlSerializer ser = new XmlSerializer (typeof (DateTime));
+			StringWriter sw = new StringWriter ();
+			ser.Serialize (sw, DateTime.UtcNow);
+			DateTime d = (DateTime) ser.Deserialize (new StringReader (sw.ToString ()));
+			Assert.AreEqual (DateTimeKind.Utc, d.Kind);
+		}
+#endif
+
 		#region GenericsSeralizationTests
 
 #if NET_2_0

+ 4 - 0
mcs/class/System.XML/Test/System.Xml/ChangeLog

@@ -1,3 +1,7 @@
+2007-10-30  Atsushi Enomoto  <[email protected]>
+
+	* XmlConvertTest.cs : added test for DateTime roundtrip.
+
 2007-10-19  Atsushi Enomoto  <[email protected]>
 
 	* XmlReaderCommonTests.cs : added test for bug #334752.

+ 14 - 0
mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs

@@ -604,6 +604,20 @@ namespace MonoTests.System.Xml
 			AssertEquals ("#5", "9999-12-31T23:59:59.9999999Z", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFZ"));
 			AssertEquals ("#6", "9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz").Substring (0, 27));
 		}
+
+		[Test]
+		public void XmlDateTimeSerializationModeRountripKind ()
+		{
+			string format = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK";
+			string s = XmlConvert.ToString (DateTime.UtcNow, format);
+			AssertType.AreEqual ('Z', s [s.Length -1], "#1-1");
+			// LAMESPEC: .NET has a bug here that 'K' in format string does not reflect 'Z' as Utc Kind.
+			//AssertType.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, format).Kind, "#1-2");
+
+			s = XmlConvert.ToString (DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);
+			AssertType.AreEqual ('Z', s [s.Length -1], "#2-1");
+			AssertType.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, XmlDateTimeSerializationMode.RoundtripKind).Kind, "#2-2");
+		}
 #endif
 	}
 }