Explorar o código

* DeserializeTests.cs: Improved TestDeserialize_Enum test for
bug #78204.
* SerializationCodeGenerator.cs: For flag enums, we should split on all
whitespace chars instead of only on blanks.
* XmlTypeMapping.cs: Same. Added ToEnum method for converting from
constant name(s) to integral enum value.

svn path=/trunk/mcs/; revision=59918

Gert Driesen %!s(int64=19) %!d(string=hai) anos
pai
achega
2bfaa4cc5c

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

@@ -1,3 +1,10 @@
+2006-04-26  Gert Driesen  <[email protected]>
+
+	* SerializationCodeGenerator.cs: For flag enums, we should split on all
+	whitespace chars instead of only on blanks.
+	* XmlTypeMapping.cs: Same. Added ToEnum method for converting from
+	constant name(s) to integral enum value.
+
 2006-04-26  Gert Driesen  <[email protected]>
 
 	* SoapAttributes.cs: The DefaultValueAttribute.Value should be returned

+ 1 - 6
mcs/class/System.XML/System.Xml.Serialization/SerializationCodeGenerator.cs

@@ -2282,10 +2282,8 @@ namespace System.Xml.Serialization
 				WriteLineInd ("{");
 				WriteLine ("xmlName = xmlName.Trim();");
 				WriteLine ("if (xmlName.Length == 0) return (" + typeMap.TypeFullName + ")0;");
-				WriteLine ("if (xmlName.IndexOf (' ') != -1)");
-				WriteLineInd ("{");
 				WriteLine (typeMap.TypeFullName + " sb = (" + typeMap.TypeFullName + ")0;");
-				WriteLine ("string[] enumNames = xmlName.ToString().Split (' ');");
+				WriteLine ("string[] enumNames = xmlName.Split (null);");
 				WriteLine ("foreach (string name in enumNames)");
 				WriteLineInd ("{");
 				WriteLine ("if (name == string.Empty) continue;");
@@ -2293,9 +2291,6 @@ namespace System.Xml.Serialization
 				WriteLineUni ("}");
 				WriteLine ("return sb;");
 				WriteLineUni ("}");
-				WriteLine ("else");
-				WriteLine ("\treturn " + switchMethod + " (xmlName);");
-				WriteLineUni ("}");
 				WriteLine ("");
 				metName = switchMethod;
 			}

+ 18 - 20
mcs/class/System.XML/System.Xml.Serialization/XmlTypeMapping.cs

@@ -739,29 +739,27 @@ namespace System.Xml.Serialization
 				if (xmlName.Length == 0)
 					return "0";
 
-				if (xmlName.IndexOf (' ') > 0) {
-					System.Text.StringBuilder sb = new System.Text.StringBuilder ();
-					string[] enumNames = xmlName.ToString ().Split (' ');
-					foreach (string name in enumNames) {
-						if (name == string.Empty) continue;
-						string foundEnumValue = null;
-						for (int i = 0; i < XmlNames.Length; i++)
-							if (XmlNames[i] == name) {
-								foundEnumValue = EnumNames[i];
-								break;
-							}
-
-						if (foundEnumValue != null) {
-							if (sb.Length > 0)
-								sb.Append (',');
-							sb.Append (foundEnumValue);
-						} else {
-							throw new InvalidOperationException (string.Format (CultureInfo.CurrentCulture,
-								"'{0}' is not a valid value for {1}.", name, typeName));
+				System.Text.StringBuilder sb = new System.Text.StringBuilder ();
+				string[] enumNames = xmlName.Split (null);
+				foreach (string name in enumNames) {
+					if (name == string.Empty) continue;
+					string foundEnumValue = null;
+					for (int i = 0; i < XmlNames.Length; i++)
+						if (XmlNames[i] == name) {
+							foundEnumValue = EnumNames[i];
+							break;
 						}
+
+					if (foundEnumValue != null) {
+						if (sb.Length > 0)
+							sb.Append (',');
+						sb.Append (foundEnumValue);
+					} else {
+						throw new InvalidOperationException (string.Format (CultureInfo.CurrentCulture,
+							"'{0}' is not a valid value for {1}.", name, typeName));
 					}
-					return sb.ToString ();
 				}
+				return sb.ToString ();
 			}
 
 			foreach (EnumMapMember mem in _members)

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

@@ -1,3 +1,8 @@
+2006-04-26  Gert Driesen  <[email protected]>
+
+	* DeserializeTests.cs: Improved TestDeserialize_Enum test for 
+	bug #78204.
+
 2006-04-26  Gert Driesen  <[email protected]>
 
 	* SoapAttributesTests.cs: Added tests for bug #78205.

+ 30 - 2
mcs/class/System.XML/Test/System.Xml.Serialization/DeserializeTests.cs

@@ -42,6 +42,20 @@ namespace MonoTests.System.XmlSerialization
 			return Deserialize (t, xr);
 		}
 
+		private object Deserialize (Type t, string xml, string defaultNamespace)
+		{
+			StringReader sr = new StringReader (xml);
+			XmlReader xr = new XmlTextReader (sr);
+			return Deserialize (t, xr, defaultNamespace);
+		}
+
+		private object Deserialize (Type t, string xml, XmlAttributeOverrides ao)
+		{
+			StringReader sr = new StringReader (xml);
+			XmlReader xr = new XmlTextReader (sr);
+			return Deserialize (t, xr, ao);
+		}
+
 		private object DeserializeEncoded (Type t, string xml)
 		{
 			StringReader sr = new StringReader (xml);
@@ -56,6 +70,20 @@ namespace MonoTests.System.XmlSerialization
 			return result;
 		}
 
+		private object Deserialize (Type t, XmlReader xr, string defaultNamespace)
+		{
+			XmlSerializer ser = new XmlSerializer (t, defaultNamespace);
+			result = ser.Deserialize (xr);
+			return result;
+		}
+
+		private object Deserialize (Type t, XmlReader xr, XmlAttributeOverrides ao)
+		{
+			XmlSerializer ser = new XmlSerializer (t, ao);
+			result = ser.Deserialize (xr);
+			return result;
+		}
+
 		private object DeserializeEncoded (Type t, XmlReader xr)
 		{
 			SoapReflectionImporter im = new SoapReflectionImporter ();
@@ -680,7 +708,7 @@ namespace MonoTests.System.XmlSerialization
 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>one</FlagEnum>");
 			Assert.AreEqual (FlagEnum.e1, e, "#A2");
 
-			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>one two</FlagEnum>");
+			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>one\u200atwo</FlagEnum>");
 			Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2, e, "#A3");
 
 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>one two four</FlagEnum>");
@@ -692,7 +720,7 @@ namespace MonoTests.System.XmlSerialization
 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two</FlagEnum>");
 			Assert.AreEqual (FlagEnum.e2 | FlagEnum.e4, e, "#A6");
 
-			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two one four two one</FlagEnum>");
+			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two\tone\u2002four\u200btwo one</FlagEnum>");
 			Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2 | FlagEnum.e4, e, "#A7");
 
 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum></FlagEnum>");