1 //
2 // System.Xml.DeserializationTests
3 //
4 // Author:
5 //	Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
6 //	Hagit Yidov <hagity@mainsoft.com>
7 //	Andres G. Aragoneses <andres.aragoneses@7digital.com>
8 //
9 // (C) 2003 Atsushi Enomoto
10 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
11 // (C) 2012 7digital Media Ltd (http://www.7digital.com)
12 //
13 //
14 using System;
15 using System.Globalization;
16 using System.IO;
17 using System.Xml;
18 using System.Xml.Serialization;
19 using NUnit.Framework;
20 using MonoTests.System.Xml.TestClasses;
21 
22 namespace MonoTests.System.XmlSerialization
23 {
24 	public class Sample
25 	{
26 		public string Text;
27 		public string[] ArrayText;
28 	}
29 
30 	[TestFixture]
31 	public class DeserializationTests
32 	{
33 		const string XmlSchemaNamespace = "http://www.w3.org/2001/XMLSchema";
34 		const string XmlSchemaInstanceNamespace = "http://www.w3.org/2001/XMLSchema-instance";
35 		const string SoapEncodingNamespace = "http://schemas.xmlsoap.org/soap/encoding/";
36 		const string WsdlTypesNamespace = "http://microsoft.com/wsdl/types/";
37 		const string ANamespace = "some:urn";
38 		const string AnotherNamespace = "another:urn";
39 
40 		object result;
41 
Deserialize(Type t, string xml)42 		private object Deserialize (Type t, string xml)
43 		{
44 			StringReader sr = new StringReader (xml);
45 			XmlReader xr = new XmlTextReader (sr);
46 			return Deserialize (t, xr);
47 		}
48 
Deserialize(Type t, string xml, string defaultNamespace)49 		private object Deserialize (Type t, string xml, string defaultNamespace)
50 		{
51 			StringReader sr = new StringReader (xml);
52 			XmlReader xr = new XmlTextReader (sr);
53 			return Deserialize (t, xr, defaultNamespace);
54 		}
55 
Deserialize(Type t, string xml, XmlAttributeOverrides ao)56 		private object Deserialize (Type t, string xml, XmlAttributeOverrides ao)
57 		{
58 			StringReader sr = new StringReader (xml);
59 			XmlReader xr = new XmlTextReader (sr);
60 			return Deserialize (t, xr, ao);
61 		}
62 
DeserializeEncoded(Type t, string xml)63 		private object DeserializeEncoded (Type t, string xml)
64 		{
65 			StringReader sr = new StringReader (xml);
66 			XmlReader xr = new XmlTextReader (sr);
67 			return DeserializeEncoded (t, xr);
68 		}
69 
Deserialize(Type t, XmlReader xr)70 		private object Deserialize (Type t, XmlReader xr)
71 		{
72 			XmlSerializer ser = new XmlSerializer (t);
73 			result = ser.Deserialize (xr);
74 			return result;
75 		}
76 
Deserialize(Type t, XmlReader xr, string defaultNamespace)77 		private object Deserialize (Type t, XmlReader xr, string defaultNamespace)
78 		{
79 			XmlSerializer ser = new XmlSerializer (t, defaultNamespace);
80 			result = ser.Deserialize (xr);
81 			return result;
82 		}
83 
Deserialize(Type t, XmlReader xr, XmlAttributeOverrides ao)84 		private object Deserialize (Type t, XmlReader xr, XmlAttributeOverrides ao)
85 		{
86 			XmlSerializer ser = new XmlSerializer (t, ao);
87 			result = ser.Deserialize (xr);
88 			return result;
89 		}
90 
DeserializeEncoded(Type t, XmlReader xr)91 		private object DeserializeEncoded (Type t, XmlReader xr)
92 		{
93 			SoapReflectionImporter im = new SoapReflectionImporter ();
94 			XmlTypeMapping tm = im.ImportTypeMapping (t);
95 			XmlSerializer ser = new XmlSerializer (tm);
96 			result = ser.Deserialize (xr);
97 			return result;
98 		}
99 
100 		[Test]
SimpleDeserialize()101 		public void SimpleDeserialize ()
102 		{
103 			Deserialize (typeof (Sample), "<Sample><Text>Test.</Text></Sample>");
104 			Assert.AreEqual (typeof (Sample), result.GetType ());
105 			Sample sample = result as Sample;
106 			Assert.AreEqual ("Test.", sample.Text);
107 		}
108 
109 		[Test]
DeserializeInt()110 		public void DeserializeInt ()
111 		{
112 			Deserialize (typeof (int), "<int>10</int>");
113 			Assert.AreEqual (typeof (int), result.GetType ());
114 			Assert.AreEqual (10, result);
115 		}
116 
117 		[Test]
DeserializeSimpleArray()118 		public void DeserializeSimpleArray ()
119 		{
120 			Deserialize (typeof (Sample), "<Sample><ArrayText><string>Test1</string><string>Test2</string></ArrayText></Sample>");
121 			Assert.AreEqual (typeof (Sample), result.GetType ());
122 			Sample sample = result as Sample;
123 			Assert.AreEqual ("Test1", sample.ArrayText[0]);
124 			Assert.AreEqual ("Test2", sample.ArrayText[1]);
125 		}
126 
127 		[Test]
DeserializeEmptyEnum()128 		public void DeserializeEmptyEnum ()
129 		{
130 			Field f = Deserialize (typeof (Field), "<field modifiers=\"\" />") as Field;
131 			Assert.AreEqual (MapModifiers.Public, f.Modifiers);
132 		}
133 
134 		[Test]
DeserializePrivateCollection()135 		public void DeserializePrivateCollection ()
136 		{
137 			MemoryStream ms = new MemoryStream ();
138 			Container c = new Container ();
139 			c.Items.Add (1);
140 
141 			XmlSerializer serializer = new XmlSerializer (typeof (Container));
142 			serializer.Serialize (ms, c);
143 
144 			ms.Position = 0;
145 			c = (Container) serializer.Deserialize (ms);
146 			Assert.AreEqual (1, c.Items[0]);
147 		}
148 
149 		[Test]
150 		[Category ("NotDotNet")]
151 		[ExpectedException (typeof (InvalidOperationException))]
DeserializeEmptyPrivateCollection()152 		public void DeserializeEmptyPrivateCollection ()
153 		{
154 			MemoryStream ms = new MemoryStream ();
155 			Container2 c = new Container2 (true);
156 			c.Items.Add (1);
157 
158 			XmlSerializer serializer = new XmlSerializer (typeof (Container2));
159 			serializer.Serialize (ms, c);
160 
161 			ms.Position = 0;
162 			c = (Container2) serializer.Deserialize (ms);
163 		}
164 
165 		[Test]
166 		[Category ("MobileNotWorking")]
167 		[ExpectedException (typeof (InvalidOperationException))]
DeserializeArrayReferences()168 		public void DeserializeArrayReferences ()
169 		{
170 			string s = "<Sample xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">";
171 			s += "<ArrayText xmlns:n3=\"http://schemas.xmlsoap.org/soap/encoding/\" xsi:type=\"n3:Array\" n3:arrayType=\"xsd:string[2]\">";
172 			s += "<item href=\"#id-606830706\"></item>";
173 			s += "<item xsi:type=\"xsd:string\">Hola</item>";
174 			s += "</ArrayText>";
175 			s += "<string id=\"id-606830706\" xsi:type=\"xsd:string\">Adeu</string>";
176 			s += "</Sample>";
177 			DeserializeEncoded (typeof (Sample), s);
178 		}
179 
180 
181 		[Test]
TestDeserializeXmlNodeArray()182 		public void TestDeserializeXmlNodeArray ()
183 		{
184 			object ob = Deserialize (typeof (object), "<anyType at=\"1\"><elem1/><elem2/></anyType>");
185 			Assert.IsTrue (ob is XmlNode[], "Is node array");
186 
187 			XmlNode[] nods = (XmlNode[]) ob;
188 			Assert.AreEqual (3, nods.Length, "lengh");
189 			Assert.IsTrue (nods[0] is XmlAttribute, "#1");
190 			Assert.AreEqual ("at", ((XmlAttribute) nods[0]).LocalName, "#2");
191 			Assert.AreEqual ("1", ((XmlAttribute) nods[0]).Value, "#3");
192 			Assert.IsTrue (nods[1] is XmlElement, "#4");
193 			Assert.AreEqual ("elem1", ((XmlElement) nods[1]).LocalName, "#5");
194 			Assert.IsTrue (nods[2] is XmlElement, "#6");
195 			Assert.AreEqual ("elem2", ((XmlElement) nods[2]).LocalName, "#7");
196 		}
197 
198 		[Test]
TestDeserializeXmlElement()199 		public void TestDeserializeXmlElement ()
200 		{
201 			object ob = Deserialize (typeof (XmlElement), "<elem/>");
202 			Assert.IsTrue (ob is XmlElement, "#1");
203 			Assert.AreEqual ("elem", ((XmlElement) ob).LocalName, "#2");
204 		}
205 
206 		[Test]
TestDeserializeXmlCDataSection()207 		public void TestDeserializeXmlCDataSection ()
208 		{
209 			CDataContainer c = (CDataContainer) Deserialize (typeof (CDataContainer), "<CDataContainer xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><cdata><![CDATA[data section contents]]></cdata></CDataContainer>");
210 			Assert.IsNotNull (c.cdata, "#1");
211 			Assert.AreEqual ("data section contents", c.cdata.Value, "#2");
212 		}
213 
214 		[Test]
TestDeserializeXmlNode()215 		public void TestDeserializeXmlNode ()
216 		{
217 			NodeContainer c = (NodeContainer) Deserialize (typeof (NodeContainer), "<NodeContainer xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><node>text</node></NodeContainer>");
218 			Assert.IsTrue (c.node is XmlText, "#1");
219 			Assert.AreEqual ("text", c.node.Value, "#2");
220 		}
221 
222 		[Test]
TestDeserializeChoices()223 		public void TestDeserializeChoices ()
224 		{
225 			Choices ch = (Choices) Deserialize (typeof (Choices), "<Choices><ChoiceZero>choice text</ChoiceZero></Choices>");
226 			Assert.AreEqual ("choice text", ch.MyChoice, "#A1");
227 			Assert.AreEqual (ItemChoiceType.ChoiceZero, ch.ItemType, "#A2");
228 
229 			ch = (Choices) Deserialize (typeof (Choices), "<Choices><ChoiceOne>choice text</ChoiceOne></Choices>");
230 			Assert.AreEqual ("choice text", ch.MyChoice, "#B1");
231 			Assert.AreEqual (ItemChoiceType.StrangeOne, ch.ItemType, "#B2");
232 
233 			ch = (Choices) Deserialize (typeof (Choices), "<Choices><ChoiceTwo>choice text</ChoiceTwo></Choices>");
234 			Assert.AreEqual ("choice text", ch.MyChoice, "#C1");
235 			Assert.AreEqual (ItemChoiceType.ChoiceTwo, ch.ItemType, "#C2");
236 		}
237 
238 		[Test]
TestDeserializeNamesWithSpaces()239 		public void TestDeserializeNamesWithSpaces ()
240 		{
241 			TestSpace ts = (TestSpace) Deserialize (typeof (TestSpace), "<Type_x0020_with_x0020_space xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' Attribute_x0020_with_x0020_space='5'><Element_x0020_with_x0020_space>4</Element_x0020_with_x0020_space></Type_x0020_with_x0020_space>");
242 			Assert.AreEqual (4, ts.elem, "#1");
243 			Assert.AreEqual (5, ts.attr, "#2");
244 		}
245 
246 		[Test]
TestDeserializeDefaults()247 		public void TestDeserializeDefaults ()
248 		{
249 			ListDefaults d2 = (ListDefaults) Deserialize (typeof (ListDefaults), "<root/>");
250 
251 			Assert.IsNotNull (d2.list2, "#A1");
252 			Assert.IsNull (d2.list4, "#A3");
253 			Assert.IsNotNull (d2.list5, "#A4");
254 			Assert.IsNotNull (d2.ed, "#A5");
255 			Assert.IsNotNull (d2.str, "#A6");
256 
257 			d2 = (ListDefaults) Deserialize (typeof (ListDefaults), "<root></root>");
258 
259 			Assert.IsNotNull (d2.list2, "#B1");
260 			Assert.IsNull (d2.list4, "#B3");
261 			Assert.IsNotNull (d2.list5, "#B4");
262 			Assert.IsNotNull (d2.ed, "#B5");
263 			Assert.IsNotNull (d2.str, "#B6");
264 		}
265 
266 		[Test]
TestDeserializeChoiceArray()267 		public void TestDeserializeChoiceArray ()
268 		{
269 			CompositeValueType v = (CompositeValueType) Deserialize (typeof (CompositeValueType), "<?xml version=\"1.0\" encoding=\"utf-16\"?><CompositeValueType xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><In>1</In><Es>2</Es></CompositeValueType>");
270 			Assert.IsNotNull (v.Items, "#1");
271 			Assert.IsNotNull (v.ItemsElementName, "#2");
272 			Assert.AreEqual (2, v.Items.Length, "#3");
273 			Assert.AreEqual (2, v.ItemsElementName.Length, "#4");
274 			Assert.AreEqual (1, v.Items[0], "#5");
275 			Assert.AreEqual (2, v.Items[1], "#6");
276 			Assert.AreEqual (ItemsChoiceType.In, v.ItemsElementName[0], "#7");
277 			Assert.AreEqual (ItemsChoiceType.Es, v.ItemsElementName[1], "#8");
278 		}
279 
280 		#region GenericsDeseralizationTests
281 
282 		[Test]
TestDeserializeGenSimpleClassString()283 		public void TestDeserializeGenSimpleClassString ()
284 		{
285 			Deserialize (typeof (GenSimpleClass<string>), "<GenSimpleClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />");
286 			Assert.AreEqual (typeof (GenSimpleClass<string>), result.GetType ());
287 			Deserialize (typeof (GenSimpleClass<string>), "<GenSimpleClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something>hello</something></GenSimpleClassOfString>");
288 			GenSimpleClass<string> simple = result as GenSimpleClass<string>;
289 			Assert.AreEqual ("hello", simple.something);
290 		}
291 
292 		[Test]
TestDeserializeGenSimpleClassBool()293 		public void TestDeserializeGenSimpleClassBool ()
294 		{
295 			Deserialize (typeof (GenSimpleClass<bool>), "<GenSimpleClassOfBoolean xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something>false</something></GenSimpleClassOfBoolean>");
296 			Assert.AreEqual (typeof (GenSimpleClass<bool>), result.GetType ());
297 			Deserialize (typeof (GenSimpleClass<bool>), "<GenSimpleClassOfBoolean xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something>true</something></GenSimpleClassOfBoolean>");
298 			GenSimpleClass<bool> simple = result as GenSimpleClass<bool>;
299 			Assert.AreEqual (true, simple.something);
300 		}
301 
302 		[Test]
TestDeserializeGenSimpleStructInt()303 		public void TestDeserializeGenSimpleStructInt ()
304 		{
305 			Deserialize (typeof (GenSimpleStruct<int>), "<GenSimpleStructOfInt32 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something>0</something></GenSimpleStructOfInt32>");
306 			Assert.AreEqual (typeof (GenSimpleStruct<int>), result.GetType ());
307 			Deserialize (typeof (GenSimpleStruct<int>), "<GenSimpleStructOfInt32 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something>123</something></GenSimpleStructOfInt32>");
308 			GenSimpleStruct<int> simple = new GenSimpleStruct<int> (0);
309 			if (result != null)
310 				simple = (GenSimpleStruct<int>) result;
311 			Assert.AreEqual (123, simple.something);
312 		}
313 
314 		[Test]
TestDeserializeGenListClassString()315 		public void TestDeserializeGenListClassString ()
316 		{
317 			Deserialize (typeof (GenListClass<string>), "<GenListClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist></somelist></GenListClassOfString>");
318 			Assert.AreEqual (typeof (GenListClass<string>), result.GetType ());
319 			Deserialize (typeof (GenListClass<string>), "<GenListClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist><string>Value1</string><string>Value2</string></somelist></GenListClassOfString>");
320 			GenListClass<string> genlist = result as GenListClass<string>;
321 			Assert.AreEqual ("Value1", genlist.somelist[0]);
322 			Assert.AreEqual ("Value2", genlist.somelist[1]);
323 		}
324 
325 		[Test]
TestDeserializeGenListClassFloat()326 		public void TestDeserializeGenListClassFloat ()
327 		{
328 			Deserialize (typeof (GenListClass<float>), "<GenListClassOfSingle xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist></somelist></GenListClassOfSingle>");
329 			Assert.AreEqual (typeof (GenListClass<float>), result.GetType ());
330 			Deserialize (typeof (GenListClass<float>), "<GenListClassOfSingle xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist><float>1</float><float>2.2</float></somelist></GenListClassOfSingle>");
331 			GenListClass<float> genlist = result as GenListClass<float>;
332 			Assert.AreEqual (1, genlist.somelist[0]);
333 			Assert.AreEqual (2.2F, genlist.somelist[1]);
334 		}
335 
336 		[Test]
TestDeserializeGenListClassList()337 		public void TestDeserializeGenListClassList ()
338 		{
339 			Deserialize (typeof (GenListClass<GenListClass<int>>), "<GenListClassOfGenListClassOfInt32 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist></somelist></GenListClassOfGenListClassOfInt32>");
340 			Assert.AreEqual (typeof (GenListClass<GenListClass<int>>), result.GetType ());
341 			Deserialize (typeof (GenListClass<GenListClass<int>>), "<GenListClassOfGenListClassOfInt32 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist><GenListClassOfInt32><somelist><int>1</int><int>2</int></somelist></GenListClassOfInt32><GenListClassOfInt32><somelist><int>10</int><int>20</int></somelist></GenListClassOfInt32></somelist></GenListClassOfGenListClassOfInt32>");
342 			GenListClass<GenListClass<int>> genlist = result as GenListClass<GenListClass<int>>;
343 			Assert.AreEqual (1, genlist.somelist[0].somelist[0]);
344 			Assert.AreEqual (2, genlist.somelist[0].somelist[1]);
345 			Assert.AreEqual (10, genlist.somelist[1].somelist[0]);
346 			Assert.AreEqual (20, genlist.somelist[1].somelist[1]);
347 		}
348 
349 		[Test]
TestDeserializeGenListClassArray()350 		public void TestDeserializeGenListClassArray ()
351 		{
352 			Deserialize (typeof (GenListClass<GenArrayClass<char>>), "<GenListClassOfGenArrayClassOfChar xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist></somelist></GenListClassOfGenArrayClassOfChar>");
353 			Assert.AreEqual (typeof (GenListClass<GenArrayClass<char>>), result.GetType ());
354 			Deserialize (typeof (GenListClass<GenArrayClass<char>>), "<GenListClassOfGenArrayClassOfChar xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist><GenArrayClassOfChar><arr><char>97</char><char>98</char><char>0</char></arr></GenArrayClassOfChar><GenArrayClassOfChar><arr><char>100</char><char>101</char><char>102</char></arr></GenArrayClassOfChar></somelist></GenListClassOfGenArrayClassOfChar>");
355 			GenListClass<GenArrayClass<char>> genlist = result as GenListClass<GenArrayClass<char>>;
356 			Assert.AreEqual ('a', genlist.somelist[0].arr[0]);
357 			Assert.AreEqual ('b', genlist.somelist[0].arr[1]);
358 			Assert.AreEqual ('d', genlist.somelist[1].arr[0]);
359 			Assert.AreEqual ('e', genlist.somelist[1].arr[1]);
360 			Assert.AreEqual ('f', genlist.somelist[1].arr[2]);
361 		}
362 
363 		[Test]
TestDeserializeGenTwoClassCharDouble()364 		public void TestDeserializeGenTwoClassCharDouble ()
365 		{
366 			Deserialize (typeof (GenTwoClass<char, double>), "<GenTwoClassOfCharDouble xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something1>0</something1><something2>0</something2></GenTwoClassOfCharDouble>");
367 			Assert.AreEqual (typeof (GenTwoClass<char, double>), result.GetType ());
368 			Deserialize (typeof (GenTwoClass<char, double>), "<GenTwoClassOfCharDouble xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something1>97</something1><something2>2.2</something2></GenTwoClassOfCharDouble>");
369 			GenTwoClass<char, double> gentwo = result as GenTwoClass<char, double>;
370 			Assert.AreEqual ('a', gentwo.something1);
371 			Assert.AreEqual (2.2, gentwo.something2);
372 		}
373 
374 		[Test]
TestDeserializeGenDerivedClassDecimalShort()375 		public void TestDeserializeGenDerivedClassDecimalShort ()
376 		{
377 			Deserialize (typeof (GenDerivedClass<decimal, short>), "<GenDerivedClassOfDecimalInt16 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something2>0</something2><another1>0</another1><another2>0</another2></GenDerivedClassOfDecimalInt16>");
378 			Assert.AreEqual (typeof (GenDerivedClass<decimal, short>), result.GetType ());
379 			Deserialize (typeof (GenDerivedClass<decimal, short>), "<GenDerivedClassOfDecimalInt16 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something1>Value1</something1><something2>1</something2><another1>1.1</another1><another2>-22</another2></GenDerivedClassOfDecimalInt16>");
380 			GenDerivedClass<decimal, short> derived = result as GenDerivedClass<decimal, short>;
381 			Assert.AreEqual ("Value1", derived.something1);
382 			Assert.AreEqual (1, derived.something2);
383 			Assert.AreEqual (1.1M, derived.another1);
384 			Assert.AreEqual (-22, derived.another2);
385 		}
386 
387 		[Test]
TestDeserializeGenDerivedSecondClassByteUlong()388 		public void TestDeserializeGenDerivedSecondClassByteUlong ()
389 		{
390 			Deserialize (typeof (GenDerived2Class<byte, ulong>), "<GenDerived2ClassOfByteUInt64 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something1>0</something1><something2>0</something2><another1>0</another1><another2>0</another2></GenDerived2ClassOfByteUInt64>");
391 			Assert.AreEqual (typeof (GenDerived2Class<byte, ulong>), result.GetType ());
392 			Deserialize (typeof (GenDerived2Class<byte, ulong>), "<GenDerived2ClassOfByteUInt64 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something1>1</something1><something2>222</something2><another1>111</another1><another2>222222</another2></GenDerived2ClassOfByteUInt64>");
393 			GenDerived2Class<byte, ulong> derived2 = result as GenDerived2Class<byte, ulong>;
394 			Assert.AreEqual (1, derived2.something1);
395 			Assert.AreEqual (222, derived2.something2);
396 			Assert.AreEqual (111, derived2.another1);
397 			Assert.AreEqual (222222, derived2.another2);
398 		}
399 
400 		[Test]
TestDeserializeGenNestedClass()401 		public void TestDeserializeGenNestedClass ()
402 		{
403 			Deserialize (typeof (GenNestedClass<string, int>.InnerClass<bool>), "<InnerClassOfStringInt32Boolean xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><inner>0</inner><something>false</something></InnerClassOfStringInt32Boolean>");
404 			Assert.AreEqual (typeof (GenNestedClass<string, int>.InnerClass<bool>), result.GetType ());
405 			Deserialize (typeof (GenNestedClass<string, int>.InnerClass<bool>), "<InnerClassOfStringInt32Boolean xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><inner>5</inner><something>true</something></InnerClassOfStringInt32Boolean>");
406 			GenNestedClass<string, int>.InnerClass<bool> nested = result as GenNestedClass<string, int>.InnerClass<bool>;
407 			Assert.AreEqual (5, nested.inner);
408 			Assert.AreEqual (true, nested.something);
409 		}
410 
411 		[Test]
TestDeserializeGenListClassListNested()412 		public void TestDeserializeGenListClassListNested ()
413 		{
414 			Deserialize (typeof (GenListClass<GenListClass<GenNestedClass<int, int>.InnerClass<string>>>),
415 				"<GenListClassOfGenListClassOfInnerClassOfInt32Int32String xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist></somelist></GenListClassOfGenListClassOfInnerClassOfInt32Int32String>");
416 			Assert.AreEqual (typeof (GenListClass<GenListClass<GenNestedClass<int, int>.InnerClass<string>>>), result.GetType ());
417 			Deserialize (typeof (GenListClass<GenListClass<GenNestedClass<int, int>.InnerClass<string>>>),
418 				"<GenListClassOfGenListClassOfInnerClassOfInt32Int32String xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><somelist><GenListClassOfInnerClassOfInt32Int32String><somelist><InnerClassOfInt32Int32String><inner>1</inner><something>ONE</something></InnerClassOfInt32Int32String><InnerClassOfInt32Int32String><inner>2</inner><something>TWO</something></InnerClassOfInt32Int32String></somelist></GenListClassOfInnerClassOfInt32Int32String><GenListClassOfInnerClassOfInt32Int32String><somelist><InnerClassOfInt32Int32String><inner>30</inner><something>THIRTY</something></InnerClassOfInt32Int32String></somelist></GenListClassOfInnerClassOfInt32Int32String></somelist></GenListClassOfGenListClassOfInnerClassOfInt32Int32String>");
419 			GenListClass<GenListClass<GenNestedClass<int, int>.InnerClass<string>>> genlist =
420 				result as GenListClass<GenListClass<GenNestedClass<int, int>.InnerClass<string>>>;
421 			Assert.AreEqual (1, genlist.somelist[0].somelist[0].inner);
422 			Assert.AreEqual ("ONE", genlist.somelist[0].somelist[0].something);
423 			Assert.AreEqual (2, genlist.somelist[0].somelist[1].inner);
424 			Assert.AreEqual ("TWO", genlist.somelist[0].somelist[1].something);
425 			Assert.AreEqual (30, genlist.somelist[1].somelist[0].inner);
426 			Assert.AreEqual ("THIRTY", genlist.somelist[1].somelist[0].something);
427 		}
428 
429 		public enum Myenum { one, two, three, four, five, six };
430 		[Test]
TestDeserializeGenArrayClassEnum()431 		public void TestDeserializeGenArrayClassEnum ()
432 		{
433 			Deserialize (typeof (GenArrayClass<Myenum>), "<GenArrayClassOfMyenum xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><arr><Myenum>one</Myenum><Myenum>one</Myenum><Myenum>one</Myenum></arr></GenArrayClassOfMyenum>");
434 			Assert.AreEqual (typeof (GenArrayClass<Myenum>), result.GetType ());
435 			Deserialize (typeof (GenArrayClass<Myenum>), "<GenArrayClassOfMyenum xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><arr><Myenum>one</Myenum><Myenum>three</Myenum><Myenum>five</Myenum></arr></GenArrayClassOfMyenum>");
436 			GenArrayClass<Myenum> genarr = result as GenArrayClass<Myenum>;
437 			Assert.AreEqual (Myenum.one, genarr.arr[0]);
438 			Assert.AreEqual (Myenum.three, genarr.arr[1]);
439 			Assert.AreEqual (Myenum.five, genarr.arr[2]);
440 		}
441 
442 		[Test]
TestDeserializeGenArrayClassStruct()443 		public void TestDeserializeGenArrayClassStruct ()
444 		{
445 			Deserialize (typeof (GenArrayClass<GenSimpleStruct<uint>>), "<GenArrayClassOfGenSimpleStructOfUInt32 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><arr><GenSimpleStructOfUInt32>0</GenSimpleStructOfUInt32><GenSimpleStructOfUInt32>0</GenSimpleStructOfUInt32><GenSimpleStructOfUInt32>0</GenSimpleStructOfUInt32></arr></GenArrayClassOfGenSimpleStructOfUInt32>");
446 			Assert.AreEqual (typeof (GenArrayClass<GenSimpleStruct<uint>>), result.GetType ());
447 			Deserialize (typeof (GenArrayClass<GenSimpleStruct<uint>>), "<GenArrayClassOfGenSimpleStructOfUInt32 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><arr><GenSimpleStructOfUInt32><something>111</something></GenSimpleStructOfUInt32><GenSimpleStructOfUInt32><something>222</something></GenSimpleStructOfUInt32><GenSimpleStructOfUInt32><something>333</something></GenSimpleStructOfUInt32></arr></GenArrayClassOfGenSimpleStructOfUInt32>");
448 			GenArrayClass<GenSimpleStruct<uint>> genarr = result as GenArrayClass<GenSimpleStruct<uint>>;
449 			Assert.AreEqual (111, genarr.arr[0].something);
450 			Assert.AreEqual (222, genarr.arr[1].something);
451 			Assert.AreEqual (333, genarr.arr[2].something);
452 		}
453 
454 		[Test]
TestDeserializeGenArrayClassList()455 		public void TestDeserializeGenArrayClassList ()
456 		{
457 			Deserialize (typeof (GenArrayClass<GenListClass<string>>), "<GenArrayClassOfGenListClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><arr><GenListClassOfString>0</GenListClassOfString><GenListClassOfString>0</GenListClassOfString><GenListClassOfString>0</GenListClassOfString></arr></GenArrayClassOfGenListClassOfString>");
458 			Assert.AreEqual (typeof (GenArrayClass<GenListClass<string>>), result.GetType ());
459 			Deserialize (typeof (GenArrayClass<GenListClass<string>>), "<GenArrayClassOfGenListClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><arr><GenListClassOfString><somelist><string>list1-val1</string><string>list1-val2</string></somelist></GenListClassOfString><GenListClassOfString><somelist><string>list2-val1</string><string>list2-val2</string><string>list2-val3</string><string>list2-val4</string></somelist></GenListClassOfString><GenListClassOfString><somelist><string>list3val</string></somelist></GenListClassOfString></arr></GenArrayClassOfGenListClassOfString>");
460 			GenArrayClass<GenListClass<string>> genarr = result as GenArrayClass<GenListClass<string>>;
461 			Assert.AreEqual ("list1-val1", genarr.arr[0].somelist[0]);
462 			Assert.AreEqual ("list1-val2", genarr.arr[0].somelist[1]);
463 			Assert.AreEqual ("list2-val1", genarr.arr[1].somelist[0]);
464 			Assert.AreEqual ("list2-val2", genarr.arr[1].somelist[1]);
465 			Assert.AreEqual ("list2-val3", genarr.arr[1].somelist[2]);
466 			Assert.AreEqual ("list2-val4", genarr.arr[1].somelist[3]);
467 			Assert.AreEqual ("list3val", genarr.arr[2].somelist[0]);
468 			// The code below checks for DotNet bug (see corresponding test in XmlSerializerTests).
469 			Deserialize (typeof (GenArrayClass<GenListClass<string>>), "<GenArrayClassOfGenListClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><arr><GenListClassOfString><somelist><string>list1-val1</string><string>list1-val2</string><string>list3val</string></somelist></GenListClassOfString><GenListClassOfString><somelist><string>list2-val1</string><string>list2-val2</string><string>list2-val3</string><string>list2-val4</string></somelist></GenListClassOfString><GenListClassOfString><somelist></somelist></GenListClassOfString></arr></GenArrayClassOfGenListClassOfString>");
470 			GenArrayClass<GenListClass<string>> genarr2 = result as GenArrayClass<GenListClass<string>>;
471 			Assert.AreEqual ("list1-val1", genarr2.arr[0].somelist[0]);
472 			Assert.AreEqual ("list1-val2", genarr2.arr[0].somelist[1]);
473 			/**/
474 			Assert.AreEqual ("list3val", genarr2.arr[0].somelist[2]);
475 			Assert.AreEqual ("list2-val1", genarr2.arr[1].somelist[0]);
476 			Assert.AreEqual ("list2-val2", genarr2.arr[1].somelist[1]);
477 			Assert.AreEqual ("list2-val3", genarr2.arr[1].somelist[2]);
478 			Assert.AreEqual ("list2-val4", genarr2.arr[1].somelist[3]);
479 			//Assert.AreEqual ("list3val", genarr2.arr[2].somelist[0]);
480 		}
481 
482 		[Test]
TestDeserializeGenComplexStruct()483 		public void TestDeserializeGenComplexStruct ()
484 		{
485 			Deserialize (typeof (GenComplexStruct<int, string>), "<GenComplexStructOfInt32String xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something>0</something><simpleclass><something>0</something></simpleclass><simplestruct><something>0</something></simplestruct><listclass><somelist></somelist></listclass><arrayclass><arr><int>0</int><int>0</int><int>0</int></arr></arrayclass><twoclass><something1>0</something1></twoclass><derivedclass><something2>0</something2><another1>0</another1></derivedclass><derived2><something1>0</something1><another1>0</another1></derived2><nestedouter><outer>0</outer></nestedouter><nestedinner><something>0</something></nestedinner></GenComplexStructOfInt32String>");
486 			Assert.AreEqual (typeof (GenComplexStruct<int, string>), result.GetType ());
487 			Deserialize (typeof (GenComplexStruct<int, string>), "<GenComplexStructOfInt32String xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><something>123</something><simpleclass><something>456</something></simpleclass><simplestruct><something>789</something></simplestruct><listclass><somelist><int>100</int><int>200</int></somelist></listclass><arrayclass><arr><int>11</int><int>22</int><int>33</int></arr></arrayclass><twoclass><something1>10</something1><something2>Ten</something2></twoclass><derivedclass><something1>two</something1><something2>2</something2><another1>1</another1><another2>one</another2></derivedclass><derived2><something1>4</something1><something2>four</something2><another1>3</another1><another2>three</another2></derived2><nestedouter><outer>5</outer></nestedouter><nestedinner><inner>six</inner><something>6</something></nestedinner></GenComplexStructOfInt32String>");
488 			GenComplexStruct<int, string> complex = new GenComplexStruct<int, string> (0);
489 			if (result != null)
490 				complex = (GenComplexStruct<int, string>) result;
491 			Assert.AreEqual (123, complex.something);
492 			Assert.AreEqual (456, complex.simpleclass.something);
493 			Assert.AreEqual (789, complex.simplestruct.something);
494 			Assert.AreEqual (100, complex.listclass.somelist[0]);
495 			Assert.AreEqual (200, complex.listclass.somelist[1]);
496 			Assert.AreEqual (11, complex.arrayclass.arr[0]);
497 			Assert.AreEqual (22, complex.arrayclass.arr[1]);
498 			Assert.AreEqual (33, complex.arrayclass.arr[2]);
499 			Assert.AreEqual (10, complex.twoclass.something1);
500 			Assert.AreEqual ("Ten", complex.twoclass.something2);
501 			Assert.AreEqual (1, complex.derivedclass.another1);
502 			Assert.AreEqual ("one", complex.derivedclass.another2);
503 			Assert.AreEqual ("two", complex.derivedclass.something1);
504 			Assert.AreEqual (2, complex.derivedclass.something2);
505 			Assert.AreEqual (3, complex.derived2.another1);
506 			Assert.AreEqual ("three", complex.derived2.another2);
507 			Assert.AreEqual (4, complex.derived2.something1);
508 			Assert.AreEqual ("four", complex.derived2.something2);
509 			Assert.AreEqual (5, complex.nestedouter.outer);
510 			Assert.AreEqual ("six", complex.nestedinner.inner);
511 			Assert.AreEqual (6, complex.nestedinner.something);
512 		}
513 
514 		#endregion //GenericsDeseralizationTests
515 
516 		[Test]
TestDeserializeCollection()517 		public void TestDeserializeCollection ()
518 		{
519 			string s0 = "";
520 			s0 += "	<ArrayOfEntity xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
521 			s0 += "		<Entity Name='node1'/>";
522 			s0 += "		<Entity Name='node2'/>";
523 			s0 += "	</ArrayOfEntity>";
524 
525 			EntityCollection col = (EntityCollection) Deserialize (typeof (EntityCollection), s0);
526 			Assert.IsNotNull (col, "#1");
527 			Assert.AreEqual (2, col.Count, "#2");
528 			Assert.IsNull (col[0].Parent, "#3");
529 			Assert.IsNull (col[1].Parent, "#4");
530 		}
531 
532 		[Test]
TestDeserializeEmptyCollection()533 		public void TestDeserializeEmptyCollection ()
534 		{
535 			string s1 = "";
536 			s1 += "	<ArrayOfEntity xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
537 
538 			EntityCollection col = (EntityCollection) Deserialize (typeof (EntityCollection), s1);
539 			Assert.IsNotNull (col, "#A1");
540 			Assert.AreEqual (0, col.Count, "#A2");
541 
542 			string s1_1 = "";
543 			s1_1 += "	<ArrayOfEntity xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
544 			s1_1 += "	</ArrayOfEntity>";
545 
546 			col = (EntityCollection) Deserialize (typeof (EntityCollection), s1_1);
547 			Assert.IsNotNull (col, "#B1");
548 			Assert.AreEqual (0, col.Count, "#B2");
549 		}
550 
551 		[Test]
TestDeserializeNilCollectionIsNotNull()552 		public void TestDeserializeNilCollectionIsNotNull ()
553 		{
554 			string s2 = "";
555 			s2 += "	<ArrayOfEntity xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true'/>";
556 
557 			EntityCollection col = (EntityCollection) Deserialize (typeof (EntityCollection), s2);
558 			Assert.IsNotNull (col, "#1");
559 			Assert.AreEqual (0, col.Count, "#2");
560 		}
561 
562 		[Test]
TestDeserializeObjectCollections()563 		public void TestDeserializeObjectCollections ()
564 		{
565 			string s3 = "";
566 			s3 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
567 			s3 += "	<Collection1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
568 			s3 += "		<Entity Name='node1'/>";
569 			s3 += "		<Entity Name='node2'/>";
570 			s3 += "	</Collection1>";
571 			s3 += "	<Collection2 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
572 			s3 += "		<Entity Name='node1'/>";
573 			s3 += "		<Entity Name='node2'/>";
574 			s3 += "	</Collection2>";
575 			s3 += "	<Collection3 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
576 			s3 += "		<Entity Name='node1'/>";
577 			s3 += "		<Entity Name='node2'/>";
578 			s3 += "	</Collection3>";
579 			s3 += "	<Collection4 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
580 			s3 += "		<Entity Name='node1'/>";
581 			s3 += "		<Entity Name='node2'/>";
582 			s3 += "	</Collection4>";
583 			s3 += "</Container>";
584 
585 			EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s3);
586 			Assert.IsNotNull (cont, "#A1");
587 
588 			Assert.IsNotNull (cont.Collection1, "#B1");
589 			Assert.AreEqual (2, cont.Collection1.Count, "#B2");
590 			Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3");
591 			Assert.AreEqual ("assigned", cont.Collection1[0].Parent, "#B4");
592 			Assert.AreEqual ("assigned", cont.Collection1[1].Parent, "#B5");
593 
594 			Assert.IsNotNull (cont.Collection2, "#C1");
595 			Assert.AreEqual (2, cont.Collection2.Count, "#C2");
596 			Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3");
597 			Assert.AreEqual ("assigned", cont.Collection2[0].Parent, "#C4");
598 			Assert.AreEqual ("assigned", cont.Collection2[1].Parent, "#C5");
599 
600 			Assert.IsNotNull (cont.Collection3, "#D1");
601 			Assert.AreEqual (2, cont.Collection3.Count, "#D2");
602 			Assert.AreEqual ("root", cont.Collection3.Container, "#D3");
603 			Assert.AreEqual ("root", cont.Collection3[0].Parent, "#D4");
604 			Assert.AreEqual ("root", cont.Collection3[1].Parent, "#D5");
605 
606 			Assert.IsNotNull (cont.Collection4, "#E1");
607 			Assert.AreEqual (2, cont.Collection4.Count, "#E2");
608 			Assert.AreEqual ("root", cont.Collection4.Container, "#E3");
609 			Assert.AreEqual ("root", cont.Collection4[0].Parent, "#E4");
610 			Assert.AreEqual ("root", cont.Collection4[1].Parent, "#E5");
611 		}
612 
613 		[Test]
TestDeserializeEmptyObjectCollections()614 		public void TestDeserializeEmptyObjectCollections ()
615 		{
616 			string s4 = "";
617 			s4 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
618 			s4 += "</Container>";
619 
620 			EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s4);
621 			Assert.IsNotNull (cont, "#A1");
622 
623 			Assert.IsNotNull (cont.Collection1, "#B1");
624 			Assert.AreEqual (0, cont.Collection1.Count, "#B2");
625 			Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3");
626 
627 			Assert.IsNotNull (cont.Collection2, "#C1");
628 			Assert.AreEqual (0, cont.Collection2.Count, "#C2");
629 			Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3");
630 
631 			Assert.IsNotNull (cont.Collection3, "#D1");
632 			Assert.AreEqual (0, cont.Collection3.Count, "#D2");
633 			Assert.AreEqual ("root", cont.Collection3.Container, "#D3");
634 
635 			Assert.IsNotNull (cont.Collection4, "#E1");
636 			Assert.AreEqual (0, cont.Collection4.Count, "#E2");
637 			Assert.AreEqual ("root", cont.Collection4.Container, "#E3");
638 		}
639 
640 		[Test]
TestDeserializeObjectNilCollectionsAreNotNull()641 		public void TestDeserializeObjectNilCollectionsAreNotNull ()
642 		{
643 			string s5 = "";
644 			s5 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
645 			s5 += "	<Collection1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
646 			s5 += "	<Collection2 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
647 			s5 += "	<Collection3 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
648 			s5 += "	<Collection4 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
649 			s5 += "</Container>";
650 
651 			EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s5);
652 			Assert.IsNotNull (cont, "#A1");
653 
654 			Assert.IsNotNull (cont.Collection1, "#B1");
655 			Assert.AreEqual (0, cont.Collection1.Count, "#B2");
656 			Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3");
657 
658 			Assert.IsNotNull (cont.Collection2, "#C1");
659 			Assert.AreEqual (0, cont.Collection2.Count, "#C2");
660 			Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3");
661 
662 			Assert.IsNotNull (cont.Collection3, "#D1");
663 			Assert.AreEqual (0, cont.Collection3.Count, "#D2");
664 			Assert.AreEqual ("root", cont.Collection3.Container, "#D3");
665 
666 			Assert.IsNotNull (cont.Collection4, "#E1");
667 			Assert.AreEqual (0, cont.Collection4.Count, "#E2");
668 			Assert.AreEqual ("root", cont.Collection4.Container, "#E3");
669 		}
670 
671 		[Test]
TestDeserializeObjectEmptyCollections()672 		public void TestDeserializeObjectEmptyCollections ()
673 		{
674 			string s6 = "";
675 			s6 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
676 			s6 += "	<Collection1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
677 			s6 += "	<Collection2 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
678 			s6 += "	<Collection3 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
679 			s6 += "	<Collection4 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
680 			s6 += "</Container>";
681 
682 			EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s6);
683 			Assert.IsNotNull (cont, "#A1");
684 
685 			Assert.IsNotNull (cont.Collection1, "#B1");
686 			Assert.AreEqual (0, cont.Collection1.Count, "#B2");
687 			Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3");
688 
689 			Assert.IsNotNull (cont.Collection2, "#C1");
690 			Assert.AreEqual (0, cont.Collection2.Count, "#C2");
691 			Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3");
692 
693 			Assert.IsNotNull (cont.Collection3, "#D1");
694 			Assert.AreEqual (0, cont.Collection3.Count, "#D2");
695 			Assert.AreEqual ("root", cont.Collection3.Container, "#D3");
696 
697 			Assert.IsNotNull (cont.Collection4, "#E1");
698 			Assert.AreEqual (0, cont.Collection4.Count, "#E2");
699 			Assert.AreEqual ("root", cont.Collection4.Container, "#E3");
700 		}
701 
702 		[Test]
TestDeserializeObjectEmptyArrays()703 		public void TestDeserializeObjectEmptyArrays ()
704 		{
705 			string s6 = "";
706 			s6 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
707 			s6 += "	<Collection1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
708 			s6 += "	<Collection2 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
709 			s6 += "	<Collection3 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
710 			s6 += "	<Collection4 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
711 			s6 += "</Container>";
712 
713 			ArrayEntityContainer cont = (ArrayEntityContainer) Deserialize (typeof (ArrayEntityContainer), s6);
714 			Assert.IsNotNull (cont, "#A1");
715 
716 			Assert.IsNotNull (cont.Collection1, "#B1");
717 			Assert.AreEqual (0, cont.Collection1.Length, "#B2");
718 
719 			Assert.IsNotNull (cont.Collection2, "#C1");
720 			Assert.AreEqual (0, cont.Collection2.Length, "#C2");
721 
722 			Assert.IsNotNull (cont.Collection3, "#D1");
723 			Assert.AreEqual (0, cont.Collection3.Length, "#D2");
724 
725 			Assert.IsNotNull (cont.Collection4, "#E1");
726 			Assert.AreEqual (0, cont.Collection4.Length, "#E2");
727 		}
728 
729 		[Test]
TestDeserializeEmptyObjectArrays()730 		public void TestDeserializeEmptyObjectArrays ()
731 		{
732 			string s4 = "";
733 			s4 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
734 			s4 += "</Container>";
735 
736 			ArrayEntityContainer cont = (ArrayEntityContainer) Deserialize (typeof (ArrayEntityContainer), s4);
737 			Assert.IsNotNull (cont, "#A1");
738 
739 			Assert.IsNull (cont.Collection1, "#B1");
740 			Assert.IsNull (cont.Collection2, "#B2");
741 
742 			Assert.IsNotNull (cont.Collection3, "#C1");
743 			Assert.AreEqual (0, cont.Collection3.Length, "#C2");
744 
745 			Assert.IsNotNull (cont.Collection4, "#D1");
746 			Assert.AreEqual (0, cont.Collection4.Length, "#D2");
747 		}
748 
749 		[Test]
TestDeserializeObjectNilArrays()750 		public void TestDeserializeObjectNilArrays ()
751 		{
752 			string s5 = "";
753 			s5 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
754 			s5 += "	<Collection1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
755 			s5 += "	<Collection2 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
756 			s5 += "	<Collection3 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
757 			s5 += "	<Collection4 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true' />";
758 			s5 += "</Container>";
759 
760 			ArrayEntityContainer cont = (ArrayEntityContainer) Deserialize (typeof (ArrayEntityContainer), s5);
761 			Assert.IsNotNull (cont, "#A1");
762 
763 			Assert.IsNull (cont.Collection1, "#B1");
764 			Assert.IsNull (cont.Collection2, "#B2");
765 			Assert.IsNull (cont.Collection3, "#B3");
766 
767 			Assert.IsNotNull (cont.Collection4, "#C1");
768 			Assert.AreEqual (0, cont.Collection4.Length, "#C2");
769 		}
770 
771 		[Test]
TestDeserializeEmptyArray()772 		public void TestDeserializeEmptyArray ()
773 		{
774 			string s1 = "";
775 			s1 += "<ArrayOfEntity xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />";
776 
777 			Entity[] col = (Entity[]) Deserialize (typeof (Entity[]), s1);
778 			Assert.IsNotNull (col, "#A1");
779 			Assert.AreEqual (0, col.Length, "#A2");
780 
781 			string s1_1 = "";
782 			s1_1 += "	<ArrayOfEntity xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
783 			s1_1 += "	</ArrayOfEntity>";
784 
785 			col = (Entity[]) Deserialize (typeof (Entity[]), s1_1);
786 			Assert.IsNotNull (col, "#B1");
787 			Assert.AreEqual (0, col.Length, "#B2");
788 		}
789 
790 		[Test]
TestDeserializeNilArray()791 		public void TestDeserializeNilArray ()
792 		{
793 			string s2 = "";
794 			s2 += "<ArrayOfEntity xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:nil='true'/>";
795 
796 			Entity[] col = (Entity[]) Deserialize (typeof (Entity[]), s2);
797 			Assert.IsNull (col, "#1");
798 		}
799 
800 		[Test]
TestDeserializeObjectWithReadonlyCollection()801 		public void TestDeserializeObjectWithReadonlyCollection ()
802 		{
803 			string s3 = "";
804 			s3 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
805 			s3 += "	<Collection1>";
806 			s3 += "		<Entity Name='node1'/>";
807 			s3 += "		<Entity Name='node2'/>";
808 			s3 += "	</Collection1>";
809 			s3 += "</Container>";
810 
811 			ObjectWithReadonlyCollection cont = (ObjectWithReadonlyCollection) Deserialize (typeof (ObjectWithReadonlyCollection), s3);
812 			Assert.IsNotNull (cont, "#1");
813 			Assert.IsNotNull (cont.Collection1, "#2");
814 			Assert.AreEqual (2, cont.Collection1.Count, "#3");
815 			Assert.AreEqual ("root", cont.Collection1.Container, "#4");
816 			Assert.AreEqual ("root", cont.Collection1[0].Parent, "#5");
817 			Assert.AreEqual ("root", cont.Collection1[1].Parent, "#6");
818 		}
819 
820 		[Test]
821 		[Category ("MobileNotWorking")]
TestDeserializeObjectWithReadonlyNulCollection()822 		public void TestDeserializeObjectWithReadonlyNulCollection ()
823 		{
824 			string s3 = "";
825 			s3 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
826 			s3 += "	<Collection1>";
827 			s3 += "		<Entity Name='node1'/>";
828 			s3 += "		<Entity Name='node2'/>";
829 			s3 += "	</Collection1>";
830 			s3 += "</Container>";
831 
832 			var obj = (ObjectWithReadonlyNulCollection) Deserialize (typeof (ObjectWithReadonlyNulCollection), s3);
833 			Assert.IsNull (obj.Collection1);
834 		}
835 
836 		[Test]
TestDeserializeObjectWithReadonlyArray()837 		public void TestDeserializeObjectWithReadonlyArray ()
838 		{
839 			string s3 = "";
840 			s3 += "<Container xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>";
841 			s3 += "	<Collection1>";
842 			s3 += "		<Entity Name='node1'/>";
843 			s3 += "		<Entity Name='node2'/>";
844 			s3 += "	</Collection1>";
845 			s3 += "</Container>";
846 
847 			ObjectWithReadonlyArray cont = (ObjectWithReadonlyArray) Deserialize (typeof (ObjectWithReadonlyArray), s3);
848 			Assert.IsNotNull (cont, "#1");
849 			Assert.IsNotNull (cont.Collection1, "#2");
850 			Assert.AreEqual (0, cont.Collection1.Length, "#3");
851 		}
852 
853 		[Test]
TestDeserialize_EnumDefaultValue()854 		public void TestDeserialize_EnumDefaultValue ()
855 		{
856 			EnumDefaultValue e;
857 
858 			e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), "<EnumDefaultValue />");
859 			Assert.AreEqual (0, (int) e, "#1");
860 
861 			e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), "<EnumDefaultValue> e3</EnumDefaultValue>");
862 			Assert.AreEqual (EnumDefaultValue.e3, e, "#2");
863 
864 			e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), "<EnumDefaultValue>e1 e2</EnumDefaultValue>");
865 			Assert.AreEqual (EnumDefaultValue.e3, e, "#3");
866 
867 			e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), "<EnumDefaultValue>  e1   e2 </EnumDefaultValue>");
868 			Assert.AreEqual (EnumDefaultValue.e1 | EnumDefaultValue.e2, e, "#4");
869 		}
870 
871 		[Test]
TestDeserialize_EnumDefaultValueNF()872 		public void TestDeserialize_EnumDefaultValueNF ()
873 		{
874 			EnumDefaultValueNF e;
875 
876 			e = (EnumDefaultValueNF) Deserialize (typeof (EnumDefaultValueNF), "<EnumDefaultValueNF>e3</EnumDefaultValueNF>");
877 			Assert.AreEqual (EnumDefaultValueNF.e3, e, "#A1");
878 
879 			try {
880 				Deserialize (typeof (EnumDefaultValueNF), "<EnumDefaultValueNF />");
881 				Assert.Fail ("#B1");
882 			}
883 			catch (InvalidOperationException ex) {
884 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
885 				Assert.IsNotNull (ex.InnerException, "#B3");
886 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#B4");
887 				Assert.IsNotNull (ex.InnerException.Message, "#B5");
888 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("''") != -1, "#B6");
889 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#B7");
890 			}
891 
892 			try {
893 				Deserialize (typeof (EnumDefaultValueNF), "<EnumDefaultValueNF>e1 e3</EnumDefaultValueNF>");
894 				Assert.Fail ("#C1");
895 			}
896 			catch (InvalidOperationException ex) {
897 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
898 				Assert.IsNotNull (ex.InnerException, "#C3");
899 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#C4");
900 				Assert.IsNotNull (ex.InnerException.Message, "#C5");
901 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'e1 e3'") != -1, "#C6");
902 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#C7");
903 			}
904 
905 			try {
906 				Deserialize (typeof (EnumDefaultValueNF), "<EnumDefaultValueNF> e3</EnumDefaultValueNF>");
907 				Assert.Fail ("#D1");
908 			}
909 			catch (InvalidOperationException ex) {
910 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
911 				Assert.IsNotNull (ex.InnerException, "#D3");
912 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D4");
913 				Assert.IsNotNull (ex.InnerException.Message, "#D5");
914 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("' e3'") != -1, "#D6");
915 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#D7");
916 			}
917 
918 			try {
919 				Deserialize (typeof (EnumDefaultValueNF), "<EnumDefaultValueNF> </EnumDefaultValueNF>");
920 				Assert.Fail ("#E1");
921 			}
922 			catch (InvalidOperationException ex) {
923 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#E2");
924 				Assert.IsNotNull (ex.InnerException, "#E3");
925 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#E4");
926 				Assert.IsNotNull (ex.InnerException.Message, "#E5");
927 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("' '") != -1, "#E6");
928 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#E7");
929 			}
930 
931 			try {
932 				Deserialize (typeof (EnumDefaultValueNF), "<EnumDefaultValueNF>1</EnumDefaultValueNF>");
933 				Assert.Fail ("#F1");
934 			}
935 			catch (InvalidOperationException ex) {
936 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F2");
937 				Assert.IsNotNull (ex.InnerException, "#F3");
938 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#F4");
939 				Assert.IsNotNull (ex.InnerException.Message, "#F5");
940 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'1'") != -1, "#F6");
941 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#F7");
942 			}
943 		}
944 
945 		[Test]
TestDeserialize_Field()946 		public void TestDeserialize_Field ()
947 		{
948 			Field f = null;
949 
950 			f = (Field) Deserialize (typeof (Field),
951 				string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
952 				"<field xmlns:xsd='{0}' xmlns:xsi='{1}' flag1='' flag2='' flag4='' modifiers='public' modifiers2='public' modifiers4='public' />",
953 				XmlSchemaNamespace, XmlSchemaInstanceNamespace));
954 			Assert.AreEqual ((FlagEnum) 0, f.Flags1, "#A1");
955 			Assert.AreEqual ((FlagEnum) 0, f.Flags2, "#A2");
956 			Assert.AreEqual ((FlagEnum) 0, f.Flags3, "#A3");
957 			Assert.AreEqual ((FlagEnum) 0, f.Flags4, "#A4");
958 			Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#A5");
959 			Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#A6");
960 			Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#A7");
961 			Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#A8");
962 			Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#A9");
963 			Assert.IsNull (f.Names, "#A10");
964 			Assert.IsNull (f.Street, "#A11");
965 
966 			f = (Field) Deserialize (typeof (Field),
967 				string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
968 				"<field xmlns:xsd='{0}' xmlns:xsi='{1}' flag3='two' flag4='' modifiers='protected' modifiers2='public' />",
969 				XmlSchemaNamespace, XmlSchemaInstanceNamespace));
970 			Assert.AreEqual ((FlagEnum) 0, f.Flags1, "#B1");
971 			Assert.AreEqual ((FlagEnum) 0, f.Flags2, "#B2");
972 			Assert.AreEqual (FlagEnum.e2, f.Flags3, "#B3");
973 			Assert.AreEqual ((FlagEnum) 0, f.Flags4, "#B4");
974 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers, "#B5");
975 			Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#B6");
976 			Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#B7");
977 			Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#B8");
978 			Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#B9");
979 			Assert.IsNull (f.Names, "#B10");
980 			Assert.IsNull (f.Street, "#B11");
981 
982 			f = (Field) Deserialize (typeof (Field),
983 				string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
984 				"<field xmlns:xsd='{0}' xmlns:xsi='{1}' flag1='two' flag2='two' flag4='' modifiers='public' modifiers2='protected' modifiers3='protected' modifiers4='public' modifiers5='protected' />",
985 				XmlSchemaNamespace, XmlSchemaInstanceNamespace));
986 			Assert.AreEqual (FlagEnum.e2, f.Flags1, "#C1");
987 			Assert.AreEqual (FlagEnum.e2, f.Flags2, "#C2");
988 			Assert.AreEqual ((FlagEnum) 0, f.Flags3, "#C3");
989 			Assert.AreEqual ((FlagEnum) 0, f.Flags4, "#C4");
990 			Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#C5");
991 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers2, "#C6");
992 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers3, "#C7");
993 			Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#C8");
994 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers5, "#C9");
995 			Assert.IsNull (f.Names, "#C10");
996 			Assert.IsNull (f.Street, "#C11");
997 
998 			try {
999 				f = (Field) Deserialize (typeof (Field),
1000 					string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
1001 					"<field xmlns:xsd='{0}' xmlns:xsi='{1}' flag2='444' />",
1002 					XmlSchemaNamespace, XmlSchemaInstanceNamespace));
1003 				Assert.Fail ("#D1");
1004 			}
1005 			catch (InvalidOperationException ex) {
1006 				// There was an error generating the XML document
1007 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
1008 				Assert.IsNotNull (ex.Message, "#D3");
1009 				Assert.IsNotNull (ex.InnerException, "#D4");
1010 
1011 				// '444' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum
1012 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D5");
1013 				Assert.IsNotNull (ex.InnerException.Message, "#D6");
1014 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'444'") != -1, "#D7");
1015 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#D8");
1016 				Assert.IsNull (ex.InnerException.InnerException, "#D9");
1017 			}
1018 
1019 			try {
1020 				f = (Field) Deserialize (typeof (Field),
1021 					string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
1022 					"<field xmlns:xsd='{0}' xmlns:xsi='{1}' flag2='Garbage' />",
1023 					XmlSchemaNamespace, XmlSchemaInstanceNamespace));
1024 				Assert.Fail ("#E1");
1025 			}
1026 			catch (InvalidOperationException ex) {
1027 				// There was an error generating the XML document
1028 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#E2");
1029 				Assert.IsNotNull (ex.Message, "#E3");
1030 				Assert.IsNotNull (ex.InnerException, "#E4");
1031 
1032 				// 'Garbage' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum
1033 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#E5");
1034 				Assert.IsNotNull (ex.InnerException.Message, "#E6");
1035 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'Garbage'") != -1, "#E7");
1036 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#E8");
1037 				Assert.IsNull (ex.InnerException.InnerException, "#E9");
1038 			}
1039 
1040 			try {
1041 				f = (Field) Deserialize (typeof (Field),
1042 					string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
1043 					"<field xmlns:xsd='{0}' xmlns:xsi='{1}' flag2='{2}' />",
1044 					XmlSchemaNamespace, XmlSchemaInstanceNamespace, ((int) FlagEnum.e2).ToString (CultureInfo.InvariantCulture)));
1045 				Assert.Fail ("#F1");
1046 			}
1047 			catch (InvalidOperationException ex) {
1048 				// There was an error generating the XML document
1049 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F2");
1050 				Assert.IsNotNull (ex.Message, "#F3");
1051 				Assert.IsNotNull (ex.InnerException, "#F4");
1052 
1053 				// '2' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum
1054 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#F5");
1055 				Assert.IsNotNull (ex.InnerException.Message, "#F6");
1056 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'2'") != -1, "#F7");
1057 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#F8");
1058 				Assert.IsNull (ex.InnerException.InnerException, "#F9");
1059 			}
1060 		}
1061 
1062 		[Test]
1063 		[Category ("NotWorking")] // MS.NET results in compilation error (probably it generates bogus source.)
TestDeserialize_Field_Encoded()1064 		public void TestDeserialize_Field_Encoded ()
1065 		{
1066 			Field_Encoded f = null;
1067 
1068 			f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded),
1069 				string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
1070 				"<q1:field xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1' flag1='' flag2='' flag4='' modifiers='PuBlIc' modifiers2='PuBlIc' modifiers4='PuBlIc' xmlns:q1='{2}' />",
1071 				XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace));
1072 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags1, "#A1");
1073 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags2, "#A2");
1074 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags3, "#A3");
1075 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags4, "#A4");
1076 			Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#A5");
1077 			Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#A6");
1078 			Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#A7");
1079 			Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#A8");
1080 			Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#A9");
1081 			Assert.IsNull (f.Names, "#A10");
1082 			Assert.IsNull (f.Street, "#A11");
1083 
1084 			f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded),
1085 				string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
1086 				"<q1:field xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1' flag3='two' flag4='' modifiers='Protected' modifiers2='PuBlIc' xmlns:q1='{2}' />",
1087 				XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace));
1088 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags1, "#B1");
1089 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags2, "#B2");
1090 			Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags3, "#B3");
1091 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags4, "#B4");
1092 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers, "#B5");
1093 			Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#B6");
1094 			Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#B7");
1095 			Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#B8");
1096 			Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#B9");
1097 			Assert.IsNull (f.Names, "#B10");
1098 			Assert.IsNull (f.Street, "#B11");
1099 
1100 			f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded),
1101 				string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
1102 				"<q1:field xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1' flag1='two' flag2='two' flag4='' modifiers='PuBlIc' modifiers2='Protected' modifiers3='Protected' modifiers4='PuBlIc' modifiers5='Protected' xmlns:q1='{2}' />",
1103 				XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace));
1104 			Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags1, "#C1");
1105 			Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags2, "#C2");
1106 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags3, "#C3");
1107 			Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags4, "#C4");
1108 			Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#C5");
1109 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers2, "#C6");
1110 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers3, "#C7");
1111 			Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#C8");
1112 			Assert.AreEqual (MapModifiers.Protected, f.Modifiers5, "#C9");
1113 			Assert.IsNull (f.Names, "#C10");
1114 			Assert.IsNull (f.Street, "#C11");
1115 
1116 			try {
1117 				f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded),
1118 					string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
1119 					"<q1:field xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1' flag2='444' flag3='555' flag4='' modifiers='666' modifiers2='777' modifiers4='888' modifiers5='999' xmlns:q1='{2}' />",
1120 					XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace));
1121 				Assert.Fail ("#D1");
1122 			}
1123 			catch (InvalidOperationException ex) {
1124 				// There was an error generating the XML document
1125 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
1126 				Assert.IsNotNull (ex.Message, "#D3");
1127 				Assert.IsNotNull (ex.InnerException, "#D4");
1128 
1129 				// '444' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum_Encoded
1130 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D5");
1131 				Assert.IsNotNull (ex.InnerException.Message, "#D6");
1132 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'444'") != -1, "#D7");
1133 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum_Encoded).FullName) != -1, "#D8");
1134 				Assert.IsNull (ex.InnerException.InnerException, "#D9");
1135 			}
1136 		}
1137 
1138 		[Test]
TestDeserialize_FlagEnum()1139 		public void TestDeserialize_FlagEnum ()
1140 		{
1141 			FlagEnum e;
1142 
1143 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum />");
1144 			Assert.AreEqual (0, (int) e, "#A1");
1145 
1146 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>one</FlagEnum>");
1147 			Assert.AreEqual (FlagEnum.e1, e, "#A2");
1148 
1149 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>one\u200atwo</FlagEnum>");
1150 			Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2, e, "#A3");
1151 
1152 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>one two four</FlagEnum>");
1153 			Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2 | FlagEnum.e4, e, "#A4");
1154 
1155 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum> two  four </FlagEnum>");
1156 			Assert.AreEqual (FlagEnum.e2 | FlagEnum.e4, e, "#A5");
1157 
1158 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two</FlagEnum>");
1159 			Assert.AreEqual (FlagEnum.e2 | FlagEnum.e4, e, "#A6");
1160 
1161 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two\tone\u2002four\rtwo one</FlagEnum>");
1162 			Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2 | FlagEnum.e4, e, "#A7");
1163 
1164 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum></FlagEnum>");
1165 			Assert.AreEqual (0, (int) e, "#A8");
1166 
1167 			e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum> </FlagEnum>");
1168 			Assert.AreEqual (0, (int) e, "#A9");
1169 
1170 			try {
1171 				Deserialize (typeof (FlagEnum), "<FlagEnum>1</FlagEnum>");
1172 				Assert.Fail ("#B1");
1173 			}
1174 			catch (InvalidOperationException ex) {
1175 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1176 				Assert.IsNotNull (ex.InnerException, "#B3");
1177 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#B4");
1178 				Assert.IsNotNull (ex.InnerException.Message, "#B5");
1179 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'1'") != -1, "#B6");
1180 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#B7");
1181 			}
1182 
1183 			try {
1184 				Deserialize (typeof (FlagEnum), "<FlagEnum>one,two</FlagEnum>");
1185 				Assert.Fail ("#C1");
1186 			}
1187 			catch (InvalidOperationException ex) {
1188 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
1189 				Assert.IsNotNull (ex.InnerException, "#C3");
1190 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#C4");
1191 				Assert.IsNotNull (ex.InnerException.Message, "#C5");
1192 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'one,two'") != -1, "#C6");
1193 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#C7");
1194 			}
1195 
1196 			try {
1197 				Deserialize (typeof (FlagEnum), "<FlagEnum>one something</FlagEnum>");
1198 				Assert.Fail ("#D1");
1199 			}
1200 			catch (InvalidOperationException ex) {
1201 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
1202 				Assert.IsNotNull (ex.InnerException, "#D3");
1203 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D4");
1204 				Assert.IsNotNull (ex.InnerException.Message, "#D5");
1205 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'something'") != -1, "#D6");
1206 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#D7");
1207 			}
1208 		}
1209 
1210 		[Test]
TestDeserialize_Group()1211 		public void TestDeserialize_Group ()
1212 		{
1213 			string xml = string.Format (CultureInfo.InvariantCulture,
1214 				"<Wrapper>" +
1215 				"<Group xmlns:xsd='{0}' xmlns:xsi='{1}' xmlns:d2p1='http://www.cpandl.com' CreationDate='2002-05-02' d2p1:GroupName='.NET' GroupNumber='ZDI=' id='id1'>" +
1216 				"<PosInt xsi:type='xsd:nonNegativeInteger'>10000</PosInt>" +
1217 				"<Grouptype xsi:type='GroupType'>Small</Grouptype>" +
1218 				"<MyVehicle href='#id2' />" +
1219 				"</Group>" +
1220 				"<Car xmlns:d2p1='{1}' id='id2' d2p1:type='Car'>" +
1221 				"<licenseNumber xmlns:q1='{0}' d2p1:type='q1:string'>1234566</licenseNumber>" +
1222 				"<makeDate xmlns:q2='{0}' d2p1:type='q2:date'>0001-01-01</makeDate>" +
1223 				"</Car>" +
1224 				"</Wrapper>",
1225 				"http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance");
1226 
1227 			XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
1228 			xtr.ReadStartElement ("Wrapper");
1229 
1230 			Group group = (Group) DeserializeEncoded (typeof (Group), xtr);
1231 
1232 			Assert.AreEqual (new DateTime (2002, 5, 2), group.Today, "#A1");
1233 			Assert.AreEqual (".NET", group.GroupName, "#A2");
1234 			Assert.AreEqual (new byte[] { 0x64, 0x32 }, group.GroupNumber, "#A3");
1235 			Assert.AreEqual (GroupType.A, group.Grouptype, "#A4");
1236 			Assert.AreEqual ("10000", group.PostitiveInt, "#A5");
1237 			Assert.IsFalse (group.IgnoreThis, "#A6");
1238 			Assert.IsNotNull (group.MyVehicle, "#A7");
1239 			Assert.AreEqual (typeof (Car), group.MyVehicle.GetType (), "#A8");
1240 			Assert.AreEqual ("1234566", group.MyVehicle.licenseNumber, "#A9");
1241 			Assert.AreEqual (new DateTime (1, 1, 1), group.MyVehicle.makeDate, "#A10");
1242 			Assert.IsNull (group.MyVehicle.weight, "#A11");
1243 
1244 			xml = string.Format (CultureInfo.InvariantCulture,
1245 				"<Wrapper>" +
1246 				"<Group xmlns:xsd='{0}' xmlns:xsi='{1}' CreationDate='2002-05-02' GroupNumber='ZDI=' id='id1'>" +
1247 				"<PosInt xsi:type='xsd:nonNegativeInteger'>10000</PosInt>" +
1248 				"<Grouptype xsi:type='GroupType'>Large</Grouptype>" +
1249 				"<MyVehicle href='#id2' />" +
1250 				"</Group>" +
1251 				"<Car xmlns:d2p1='{1}' id='id2' d2p1:type='Car'>" +
1252 				"<weight xmlns:q2='{0}' d2p1:type='q2:string'>450</weight>" +
1253 				"</Car>" +
1254 				"</Wrapper>",
1255 				"http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance");
1256 
1257 			xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
1258 			xtr.ReadStartElement ("Wrapper");
1259 
1260 			group = (Group) DeserializeEncoded (typeof (Group), xtr);
1261 
1262 			Assert.AreEqual (new DateTime (2002, 5, 2), group.Today, "#B1");
1263 			Assert.IsNull (group.GroupName, "#B2");
1264 			Assert.AreEqual (new byte[] { 0x64, 0x32 }, group.GroupNumber, "#B3");
1265 			Assert.AreEqual (GroupType.B, group.Grouptype, "#B4");
1266 			Assert.AreEqual ("10000", group.PostitiveInt, "#B5");
1267 			Assert.IsFalse (group.IgnoreThis, "#B6");
1268 			Assert.IsNotNull (group.MyVehicle, "#B7");
1269 			Assert.AreEqual (typeof (Car), group.MyVehicle.GetType (), "#B8");
1270 			Assert.IsNull (group.MyVehicle.licenseNumber, "#B9");
1271 			Assert.AreEqual (DateTime.MinValue, group.MyVehicle.makeDate, "#B10");
1272 			Assert.AreEqual ("450", group.MyVehicle.weight, "#B11");
1273 
1274 			xml = string.Format (CultureInfo.InvariantCulture,
1275 				"<Wrapper>" +
1276 				"<Group xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1' />" +
1277 				"</Wrapper>",
1278 				"http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance");
1279 
1280 			xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
1281 			xtr.ReadStartElement ("Wrapper");
1282 
1283 			group = (Group) DeserializeEncoded (typeof (Group), xtr);
1284 
1285 			Assert.AreEqual (DateTime.MinValue, group.Today, "#C1");
1286 			Assert.IsNull (group.GroupName, "#C2");
1287 			Assert.AreEqual (null, group.GroupNumber, "#C3");
1288 			Assert.AreEqual (GroupType.A, group.Grouptype, "#C4");
1289 			Assert.IsNull (group.PostitiveInt, "#C5");
1290 			Assert.IsFalse (group.IgnoreThis, "#C6");
1291 			Assert.IsNull (group.MyVehicle, "#C7");
1292 
1293 			xml = string.Format (CultureInfo.InvariantCulture,
1294 				"<Wrapper>" +
1295 				"<Group xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1'>" +
1296 				"<Grouptype xsi:type='GroupType'>666</Grouptype>" +
1297 				"</Group>" +
1298 				"</Wrapper>",
1299 				"http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance");
1300 
1301 			xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
1302 			xtr.ReadStartElement ("Wrapper");
1303 
1304 			try {
1305 				group = (Group) DeserializeEncoded (typeof (Group), xtr);
1306 				Assert.Fail ("#D1");
1307 			}
1308 			catch (InvalidOperationException ex) {
1309 				// There is an error in XML document (1, 174)
1310 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
1311 				Assert.IsNotNull (ex.Message, "#D3");
1312 				Assert.IsNotNull (ex.InnerException, "#D4");
1313 
1314 				// '666' is not a valid value for GroupType
1315 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D5");
1316 				Assert.IsNotNull (ex.InnerException.Message, "#D6");
1317 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'666'") != -1, "#D7");
1318 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (GroupType).Name) != -1, "#D8");
1319 				Assert.IsNull (ex.InnerException.InnerException, "#D9");
1320 			}
1321 
1322 			xml = string.Format (CultureInfo.InvariantCulture,
1323 				"<Wrapper>" +
1324 				"<Group xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1'>" +
1325 				"<Grouptype xsi:type='GroupType'>Garbage</Grouptype>" +
1326 				"</Group>" +
1327 				"</Wrapper>",
1328 				"http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance");
1329 
1330 			xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
1331 			xtr.ReadStartElement ("Wrapper");
1332 
1333 			try {
1334 				group = (Group) DeserializeEncoded (typeof (Group), xtr);
1335 				Assert.Fail ("#E1");
1336 			}
1337 			catch (InvalidOperationException ex) {
1338 				// There is an error in XML document (1, 178)
1339 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#E2");
1340 				Assert.IsNotNull (ex.Message, "#E3");
1341 				Assert.IsNotNull (ex.InnerException, "#E4");
1342 
1343 				// 'Garbage' is not a valid value for GroupType
1344 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#E5");
1345 				Assert.IsNotNull (ex.InnerException.Message, "#E6");
1346 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'Garbage'") != -1, "#E7");
1347 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (GroupType).Name) != -1, "#E8");
1348 				Assert.IsNull (ex.InnerException.InnerException, "#E9");
1349 			}
1350 
1351 			xml = string.Format (CultureInfo.InvariantCulture,
1352 				"<Wrapper>" +
1353 				"<Group xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1'>" +
1354 				"<Grouptype xsi:type='GroupType'>{2}</Grouptype>" +
1355 				"</Group>" +
1356 				"</Wrapper>",
1357 				"http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance",
1358 				((int) GroupType.B).ToString (CultureInfo.InvariantCulture));
1359 
1360 			xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
1361 			xtr.ReadStartElement ("Wrapper");
1362 
1363 			try {
1364 				group = (Group) DeserializeEncoded (typeof (Group), xtr);
1365 				Assert.Fail ("#F1");
1366 			}
1367 			catch (InvalidOperationException ex) {
1368 				// There is an error in XML document (1, 172)
1369 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F2");
1370 				Assert.IsNotNull (ex.Message, "#F3");
1371 				Assert.IsNotNull (ex.InnerException, "#F4");
1372 
1373 				// '1' is not a valid value for GroupType
1374 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#F5");
1375 				Assert.IsNotNull (ex.InnerException.Message, "#F6");
1376 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'1'") != -1, "#F7");
1377 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (GroupType).Name) != -1, "#F8");
1378 				Assert.IsNull (ex.InnerException.InnerException, "#F9");
1379 			}
1380 		}
1381 
1382 		[Test]
TestDeserialize_ZeroFlagEnum()1383 		public void TestDeserialize_ZeroFlagEnum ()
1384 		{
1385 			ZeroFlagEnum e;
1386 
1387 			e = (ZeroFlagEnum) Deserialize (typeof (ZeroFlagEnum), "<ZeroFlagEnum />");
1388 			Assert.AreEqual (ZeroFlagEnum.e0, e, "#A1");
1389 			e = (ZeroFlagEnum) Deserialize (typeof (ZeroFlagEnum), "<ZeroFlagEnum></ZeroFlagEnum>");
1390 			Assert.AreEqual (ZeroFlagEnum.e0, e, "#A2");
1391 
1392 			try {
1393 				Deserialize (typeof (ZeroFlagEnum), "<ZeroFlagEnum>four</ZeroFlagEnum>");
1394 				Assert.Fail ("#B1");
1395 			}
1396 			catch (InvalidOperationException ex) {
1397 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1398 				Assert.IsNotNull (ex.InnerException, "#B3");
1399 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#B4");
1400 				Assert.IsNotNull (ex.InnerException.Message, "#B5");
1401 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'four'") != -1, "#B6");
1402 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (ZeroFlagEnum).FullName) != -1, "#B7");
1403 			}
1404 
1405 			try {
1406 				Deserialize (typeof (ZeroFlagEnum), "<ZeroFlagEnum> o&lt;n&gt;e  four </ZeroFlagEnum>");
1407 				Assert.Fail ("#C1");
1408 			}
1409 			catch (InvalidOperationException ex) {
1410 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
1411 				Assert.IsNotNull (ex.InnerException, "#C3");
1412 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#C4");
1413 				Assert.IsNotNull (ex.InnerException.Message, "#C5");
1414 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'four'") != -1, "#C6");
1415 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (ZeroFlagEnum).FullName) != -1, "#C7");
1416 			}
1417 
1418 			try {
1419 				Deserialize (typeof (ZeroFlagEnum), "<ZeroFlagEnum>four o&lt;n&gt;e</ZeroFlagEnum>");
1420 				Assert.Fail ("#D1");
1421 			}
1422 			catch (InvalidOperationException ex) {
1423 				Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
1424 				Assert.IsNotNull (ex.InnerException, "#D3");
1425 				Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D4");
1426 				Assert.IsNotNull (ex.InnerException.Message, "#D5");
1427 				Assert.IsTrue (ex.InnerException.Message.IndexOf ("'four'") != -1, "#D6");
1428 				Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (ZeroFlagEnum).FullName) != -1, "#D7");
1429 			}
1430 		}
1431 
1432 		[Test]
TestDeserialize_PrimitiveTypesContainer()1433 		public void TestDeserialize_PrimitiveTypesContainer ()
1434 		{
1435 			Deserialize (typeof (PrimitiveTypesContainer), string.Format (CultureInfo.InvariantCulture,
1436 				"<?xml version='1.0' encoding='utf-16'?>" +
1437 				"<PrimitiveTypesContainer xmlns:xsd='{0}' xmlns:xsi='{1}' xmlns='{2}'>" +
1438 				"<Number xsi:type='xsd:int'>2004</Number>" +
1439 				"<Name xsi:type='xsd:string'>some name</Name>" +
1440 				"<Index xsi:type='xsd:unsignedByte'>56</Index>" +
1441 				"<Password xsi:type='xsd:base64Binary'>8w8=</Password>" +
1442 				"<PathSeparatorCharacter xmlns:q1='{3}' xsi:type='q1:char'>47</PathSeparatorCharacter>" +
1443 				"</PrimitiveTypesContainer>", XmlSchemaNamespace,
1444 				XmlSchemaInstanceNamespace, ANamespace, WsdlTypesNamespace));
1445 			Assert.AreEqual (typeof (PrimitiveTypesContainer), result.GetType (), "#A1");
1446 
1447 			PrimitiveTypesContainer deserialized = (PrimitiveTypesContainer) result;
1448 			Assert.AreEqual (2004, deserialized.Number, "#A2");
1449 			Assert.AreEqual ("some name", deserialized.Name, "#A3");
1450 			Assert.AreEqual ((byte) 56, deserialized.Index, "#A4");
1451 			Assert.AreEqual (new byte[] { 243, 15 }, deserialized.Password, "#A5");
1452 			Assert.AreEqual ('/', deserialized.PathSeparatorCharacter, "#A6");
1453 
1454 			DeserializeEncoded (typeof (PrimitiveTypesContainer), string.Format (CultureInfo.InvariantCulture,
1455 				"<?xml version='1.0' encoding='utf-16'?>" +
1456 				"<q1:PrimitiveTypesContainer xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1' xmlns:q1='{2}'>" +
1457 				"<Number xsi:type='xsd:int'>2004</Number>" +
1458 				"<Name xsi:type='xsd:string'>some name</Name>" +
1459 				"<Index xsi:type='xsd:unsignedByte'>56</Index>" +
1460 				"<Password xsi:type='xsd:base64Binary'>8w8=</Password>" +
1461 				"<PathSeparatorCharacter xmlns:q1='{3}' xsi:type='q1:char'>47</PathSeparatorCharacter>" +
1462 				"</q1:PrimitiveTypesContainer>", XmlSchemaNamespace,
1463 				XmlSchemaInstanceNamespace, AnotherNamespace, WsdlTypesNamespace));
1464 			Assert.AreEqual (typeof (PrimitiveTypesContainer), result.GetType (), "#B1");
1465 
1466 			deserialized = (PrimitiveTypesContainer) result;
1467 			Assert.AreEqual (2004, deserialized.Number, "#B2");
1468 			Assert.AreEqual ("some name", deserialized.Name, "#B3");
1469 			Assert.AreEqual ((byte) 56, deserialized.Index, "#B4");
1470 			Assert.AreEqual (new byte[] { 243, 15 }, deserialized.Password, "#B5");
1471 			Assert.AreEqual ('/', deserialized.PathSeparatorCharacter, "#B6");
1472 		}
1473 
1474 		[Test] // bug #378696
DoNotFillDefaultValue()1475 		public void DoNotFillDefaultValue ()
1476 		{
1477 			XmlSerializer xs = new XmlSerializer (typeof (DefaultDateTimeContainer));
1478 			DefaultDateTimeContainer o = (DefaultDateTimeContainer) xs.Deserialize (new StringReader ("<DefaultDateTimeContainer xmlns='urn:foo' />"));
1479 			// do not fill DefaultValue / do not bork at generating code.
1480 			Assert.AreEqual (DateTime.MinValue, o.FancyDateTime, "#1");
1481 			Assert.AreEqual (0, o.Numeric, "#2");
1482 		}
1483 
1484 		[Test] // bug bxc 4367
SpecifiedXmlIgnoreTest()1485 		public void SpecifiedXmlIgnoreTest ()
1486 		{
1487 			XmlReflectionMember [] out_members = new XmlReflectionMember [2];
1488 			XmlReflectionMember m;
1489 
1490 			m = new XmlReflectionMember ();
1491 			m.IsReturnValue = false;
1492 			m.MemberName = "HasPermissionsForUserResult";
1493 			m.MemberType = typeof (bool);
1494 			m.SoapAttributes = new SoapAttributes ();
1495 			m.XmlAttributes = new XmlAttributes ();
1496 			out_members [0] = m;
1497 
1498 			m = new XmlReflectionMember ();
1499 			m.IsReturnValue = false;
1500 			m.MemberName = "HasPermissionsForUserResultSpecified";
1501 			m.MemberType = typeof (bool);
1502 			m.SoapAttributes = new SoapAttributes ();
1503 			m.XmlAttributes = new XmlAttributes ();
1504 			m.XmlAttributes.XmlIgnore = true;
1505 			out_members [1] = m;
1506 
1507 			XmlReflectionImporter xmlImporter = new XmlReflectionImporter ();
1508 			XmlMembersMapping OutputMembersMapping = xmlImporter.ImportMembersMapping ("HasPermissionsForUserResponse", "http://tempuri.org", out_members, true);
1509 			XmlSerializer xmlSerializer = XmlSerializer.FromMappings (new XmlMapping [] { OutputMembersMapping }) [0];
1510 
1511 			Assert.AreEqual (2, OutputMembersMapping.Count, "#count");
1512 
1513 			string msg = @"
1514 			<HasPermissionsForUserResponse xmlns=""http://tempuri.org/"">
1515 				<HasPermissionsForUserResult>true</HasPermissionsForUserResult>
1516 			</HasPermissionsForUserResponse>
1517 			";
1518 
1519 			object res = xmlSerializer.Deserialize (new StringReader (msg));
1520 			Assert.AreEqual (typeof (object[]), res.GetType (), "type");
1521 			Assert.AreEqual (2, ((object[]) res).Length, "length");
1522 		}
1523 
1524 		[Test]
InvalidNullableTypeTest()1525 		public void InvalidNullableTypeTest ()
1526 		{
1527 			XmlReflectionMember [] out_members = new XmlReflectionMember [1];
1528 			XmlReflectionMember m;
1529 
1530 			m = new XmlReflectionMember ();
1531 			m.IsReturnValue = false;
1532 			m.MemberName = "HasPermissionsForUserResultSpecified";
1533 			m.MemberType = typeof (bool);
1534 			m.SoapAttributes = new SoapAttributes ();
1535 			m.XmlAttributes = new XmlAttributes ();
1536 			m.XmlAttributes.XmlIgnore = true;
1537 			m.XmlAttributes.XmlElements.Add (new XmlElementAttribute () { IsNullable = true });
1538 			out_members [0] = m;
1539 
1540 			XmlReflectionImporter xmlImporter = new XmlReflectionImporter ();
1541 
1542 			try {
1543 				xmlImporter.ImportMembersMapping ("HasPermissionsForUserResponse", "http://tempuri.org", out_members, true);
1544 				Assert.Fail ("Expected InvalidOperationException");
1545 			} catch (InvalidOperationException) {
1546 			}
1547 		}
1548 
1549 		[Test]
1550 		[Category ("MobileNotWorking")]
NotExactDateParse()1551 		public void NotExactDateParse ()
1552 		{
1553 			XmlSerializer xs = new XmlSerializer (typeof (NotExactDateParseClass));
1554 			NotExactDateParseClass o = (NotExactDateParseClass) xs.Deserialize (new StringReader ("<NotExactDateParseClass xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><SomeDate xsi:type=\"xsd:date\">2012-02-05-09:00</SomeDate></NotExactDateParseClass>"));
1555 			Assert.AreEqual (new DateTime (2012,2,5,9,0,0,DateTimeKind.Utc), o.SomeDate.ToUniversalTime ());
1556 		}
1557 
1558 		[Test]
TimeWithUtc()1559 		public void TimeWithUtc ()
1560 		{
1561 			XmlSerializer xs = new XmlSerializer (typeof (UtcTimeClass));
1562 			var o = (UtcTimeClass) xs.Deserialize (new StringReader ("<UtcTimeClass xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><DateTimeValue>12:34:56.0Z</DateTimeValue></UtcTimeClass>"));
1563 			Assert.AreEqual (new DateTime (1,1,1,12,34,56,DateTimeKind.Utc), o.DateTimeValue);
1564 		}
1565 
1566 		public class Foo
1567 		{
1568 			public DateTime? Baz { get; set; }
1569 		}
1570 
1571 		[Test]
CanDeserializeXsiNil()1572 		public void CanDeserializeXsiNil()
1573 		{
1574 			var reader = new StringReader(
1575 @"<Foo xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
1576 	<Baz xsi:nil=""true"" />
1577 </Foo>");
1578 
1579 			using (var xmlReader = new XmlTextReader(reader))
1580 			{
1581 				var serializer = new XmlSerializer(typeof(Foo));
1582 				var foo = (Foo)serializer.Deserialize(xmlReader);
1583 				Assert.IsNull(foo.Baz);
1584 			}
1585 		}
1586 
1587 		public class Bar
1588 		{
1589 			[XmlElement("baz")]
1590 			public DateTime? Baz { get; set; }
1591 		}
1592 
1593 		[Test]
CanDeserializeXsiNilToAPropertyWithXmlElementAttrib()1594 		public void CanDeserializeXsiNilToAPropertyWithXmlElementAttrib()
1595 		{
1596 			var reader = new StringReader(
1597 @"<Bar xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
1598 	<baz xsi:nil=""true"" />
1599 </Bar>");
1600 
1601 			using (var xmlReader = new XmlTextReader(reader))
1602 			{
1603 				var serializer = new XmlSerializer(typeof(Bar));
1604 				var bar = (Bar)serializer.Deserialize(xmlReader);
1605 				Assert.IsNull(bar.Baz);
1606 			}
1607 		}
1608 
1609 		public class FooBar
1610 		{
1611 			[XmlElement("baz", IsNullable = true)]
1612 			public DateTime? Baz { get; set; }
1613 		}
1614 
1615 		[Test]
CanDeserializeXsiNilToAPropertyWithXmlElementAttribAndIsNullableTrue()1616 		public void CanDeserializeXsiNilToAPropertyWithXmlElementAttribAndIsNullableTrue()
1617 		{
1618 			var reader = new StringReader(
1619 @"<FooBar xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
1620 	<baz xsi:nil=""true"" />
1621 </FooBar>");
1622 
1623 			using (var xmlReader = new XmlTextReader(reader))
1624 			{
1625 				var serializer = new XmlSerializer(typeof(FooBar));
1626 				var foobar = (FooBar)serializer.Deserialize(xmlReader);
1627 				Assert.IsNull(foobar.Baz);
1628 			}
1629 		}
1630 
1631 		[Test] // bug #8468
TestUseSubclassDefaultNamespace()1632 		public void TestUseSubclassDefaultNamespace ()
1633 		{
1634 			XmlSerializer xs = new XmlSerializer (typeof (Bug8468Subclass));
1635 			string msg = "<Test xmlns=\"http://test-namespace\"><Base>BaseValue</Base><Mid>MidValue</Mid></Test>";
1636 			var res1 = (Bug8468Subclass)xs.Deserialize (new StringReader (msg));
1637 			Assert.IsNotNull (res1);
1638 			Assert.AreEqual ("BaseValue", res1.Base);
1639 			Assert.AreEqual ("MidValue", res1.Mid);
1640 
1641 			xs = new XmlSerializer (typeof (Bug8468SubclassNoNamespace), "http://test-namespace");
1642 			var res2 = (Bug8468SubclassNoNamespace)xs.Deserialize (new StringReader (msg));
1643 			Assert.IsNotNull (res2);
1644 			Assert.AreEqual ("BaseValue", res2.Base);
1645 			Assert.AreEqual ("MidValue", res2.Mid);
1646 
1647 			xs = new XmlSerializer (typeof (Bug8468SubclassV2));
1648 			var res3 = (Bug8468SubclassV2)xs.Deserialize (new StringReader (msg));
1649 			Assert.IsNotNull (res3);
1650 			Assert.IsNull (res3.Base);
1651 			Assert.AreEqual ("MidValue", res3.Mid);
1652 
1653 			xs = new XmlSerializer (typeof (Bug8468SubclassNoNamespaceV2), "http://test-namespace");
1654 			var res4 = (Bug8468SubclassNoNamespaceV2)xs.Deserialize (new StringReader (msg));
1655 			Assert.IsNotNull (res4);
1656 			Assert.IsNull (res4.Base);
1657 			Assert.AreEqual ("MidValue", res4.Mid);
1658 
1659 			msg = "<Test xmlns=\"http://test-namespace\"><Base xmlns=\"\">BaseValue</Base><Mid>MidValue</Mid></Test>";
1660 
1661 			xs = new XmlSerializer (typeof (Bug8468SubclassV2));
1662 			var res5 = (Bug8468SubclassV2)xs.Deserialize (new StringReader (msg));
1663 			Assert.IsNotNull (res5);
1664 			Assert.AreEqual ("BaseValue", res5.Base);
1665 			Assert.AreEqual ("MidValue", res5.Mid);
1666 
1667 			xs = new XmlSerializer (typeof (Bug8468SubclassNoNamespaceV2), "http://test-namespace");
1668 			var res6 = (Bug8468SubclassNoNamespaceV2)xs.Deserialize (new StringReader (msg));
1669 			Assert.IsNotNull (res6);
1670 			Assert.AreEqual ("BaseValue", res6.Base);
1671 			Assert.AreEqual ("MidValue", res6.Mid);
1672 		}
1673 
1674 		[Test] // bug #9193
TestOrderedMapWithFlatList()1675 		public void TestOrderedMapWithFlatList ()
1676 		{
1677 			var d = (Bug9193Class) Deserialize (typeof(Bug9193Class), "<Test><Data>One</Data><Data>Two</Data><Data>Three</Data><Extra>a</Extra><Extra>b</Extra></Test>");
1678 			Assert.IsNotNull (d);
1679 			Assert.AreEqual (3, d.Data.Length);
1680 			Assert.AreEqual ("One", d.Data[0]);
1681 			Assert.AreEqual ("Two", d.Data[1]);
1682 			Assert.AreEqual ("Three", d.Data[2]);
1683 
1684 			Assert.AreEqual (2, d.Extra.Length);
1685 			Assert.AreEqual ("a", d.Extra[0]);
1686 			Assert.AreEqual ("b", d.Extra[1]);
1687 		}
1688 	}
1689 }
1690