// // System.Xml.DeserializationTests // // Author: // Atsushi Enomoto // Hagit Yidov // Andres G. Aragoneses // // (C) 2003 Atsushi Enomoto // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com) // (C) 2012 7digital Media Ltd (http://www.7digital.com) // // using System; using System.Globalization; using System.IO; using System.Xml; using System.Xml.Serialization; using NUnit.Framework; using MonoTests.System.Xml.TestClasses; namespace MonoTests.System.XmlSerialization { public class Sample { public string Text; public string[] ArrayText; } [TestFixture] public class DeserializationTests { const string XmlSchemaNamespace = "http://www.w3.org/2001/XMLSchema"; const string XmlSchemaInstanceNamespace = "http://www.w3.org/2001/XMLSchema-instance"; const string SoapEncodingNamespace = "http://schemas.xmlsoap.org/soap/encoding/"; const string WsdlTypesNamespace = "http://microsoft.com/wsdl/types/"; const string ANamespace = "some:urn"; const string AnotherNamespace = "another:urn"; object result; private object Deserialize (Type t, string xml) { StringReader sr = new StringReader (xml); XmlReader xr = new XmlTextReader (sr); return Deserialize (t, xr); } private object Deserialize (Type t, string xml, string defaultNamespace) { StringReader sr = new StringReader (xml); XmlReader xr = new XmlTextReader (sr); return Deserialize (t, xr, defaultNamespace); } private object Deserialize (Type t, string xml, XmlAttributeOverrides ao) { StringReader sr = new StringReader (xml); XmlReader xr = new XmlTextReader (sr); return Deserialize (t, xr, ao); } private object DeserializeEncoded (Type t, string xml) { StringReader sr = new StringReader (xml); XmlReader xr = new XmlTextReader (sr); return DeserializeEncoded (t, xr); } private object Deserialize (Type t, XmlReader xr) { XmlSerializer ser = new XmlSerializer (t); result = ser.Deserialize (xr); return result; } private object Deserialize (Type t, XmlReader xr, string defaultNamespace) { XmlSerializer ser = new XmlSerializer (t, defaultNamespace); result = ser.Deserialize (xr); return result; } private object Deserialize (Type t, XmlReader xr, XmlAttributeOverrides ao) { XmlSerializer ser = new XmlSerializer (t, ao); result = ser.Deserialize (xr); return result; } private object DeserializeEncoded (Type t, XmlReader xr) { SoapReflectionImporter im = new SoapReflectionImporter (); XmlTypeMapping tm = im.ImportTypeMapping (t); XmlSerializer ser = new XmlSerializer (tm); result = ser.Deserialize (xr); return result; } [Test] public void SimpleDeserialize () { Deserialize (typeof (Sample), "Test."); Assert.AreEqual (typeof (Sample), result.GetType ()); Sample sample = result as Sample; Assert.AreEqual ("Test.", sample.Text); } [Test] public void DeserializeInt () { Deserialize (typeof (int), "10"); Assert.AreEqual (typeof (int), result.GetType ()); Assert.AreEqual (10, result); } [Test] public void DeserializeSimpleArray () { Deserialize (typeof (Sample), "Test1Test2"); Assert.AreEqual (typeof (Sample), result.GetType ()); Sample sample = result as Sample; Assert.AreEqual ("Test1", sample.ArrayText[0]); Assert.AreEqual ("Test2", sample.ArrayText[1]); } [Test] public void DeserializeEmptyEnum () { Field f = Deserialize (typeof (Field), "") as Field; Assert.AreEqual (MapModifiers.Public, f.Modifiers); } [Test] public void DeserializePrivateCollection () { MemoryStream ms = new MemoryStream (); Container c = new Container (); c.Items.Add (1); XmlSerializer serializer = new XmlSerializer (typeof (Container)); serializer.Serialize (ms, c); ms.Position = 0; c = (Container) serializer.Deserialize (ms); Assert.AreEqual (1, c.Items[0]); } [Test] [Category ("NotDotNet")] [ExpectedException (typeof (InvalidOperationException))] public void DeserializeEmptyPrivateCollection () { MemoryStream ms = new MemoryStream (); Container2 c = new Container2 (true); c.Items.Add (1); XmlSerializer serializer = new XmlSerializer (typeof (Container2)); serializer.Serialize (ms, c); ms.Position = 0; c = (Container2) serializer.Deserialize (ms); } [Test] [ExpectedException (typeof (InvalidOperationException))] public void DeserializeArrayReferences () { string s = ""; s += ""; s += ""; s += "Hola"; s += ""; s += "Adeu"; s += ""; DeserializeEncoded (typeof (Sample), s); } [Test] public void TestDeserializeXmlNodeArray () { object ob = Deserialize (typeof (object), ""); Assert.IsTrue (ob is XmlNode[], "Is node array"); XmlNode[] nods = (XmlNode[]) ob; Assert.AreEqual (3, nods.Length, "lengh"); Assert.IsTrue (nods[0] is XmlAttribute, "#1"); Assert.AreEqual ("at", ((XmlAttribute) nods[0]).LocalName, "#2"); Assert.AreEqual ("1", ((XmlAttribute) nods[0]).Value, "#3"); Assert.IsTrue (nods[1] is XmlElement, "#4"); Assert.AreEqual ("elem1", ((XmlElement) nods[1]).LocalName, "#5"); Assert.IsTrue (nods[2] is XmlElement, "#6"); Assert.AreEqual ("elem2", ((XmlElement) nods[2]).LocalName, "#7"); } [Test] public void TestDeserializeXmlElement () { object ob = Deserialize (typeof (XmlElement), ""); Assert.IsTrue (ob is XmlElement, "#1"); Assert.AreEqual ("elem", ((XmlElement) ob).LocalName, "#2"); } [Test] public void TestDeserializeXmlCDataSection () { CDataContainer c = (CDataContainer) Deserialize (typeof (CDataContainer), ""); Assert.IsNotNull (c.cdata, "#1"); Assert.AreEqual ("data section contents", c.cdata.Value, "#2"); } [Test] public void TestDeserializeXmlNode () { NodeContainer c = (NodeContainer) Deserialize (typeof (NodeContainer), "text"); Assert.IsTrue (c.node is XmlText, "#1"); Assert.AreEqual ("text", c.node.Value, "#2"); } [Test] public void TestDeserializeChoices () { Choices ch = (Choices) Deserialize (typeof (Choices), "choice text"); Assert.AreEqual ("choice text", ch.MyChoice, "#A1"); Assert.AreEqual (ItemChoiceType.ChoiceZero, ch.ItemType, "#A2"); ch = (Choices) Deserialize (typeof (Choices), "choice text"); Assert.AreEqual ("choice text", ch.MyChoice, "#B1"); Assert.AreEqual (ItemChoiceType.StrangeOne, ch.ItemType, "#B2"); ch = (Choices) Deserialize (typeof (Choices), "choice text"); Assert.AreEqual ("choice text", ch.MyChoice, "#C1"); Assert.AreEqual (ItemChoiceType.ChoiceTwo, ch.ItemType, "#C2"); } [Test] public void TestDeserializeNamesWithSpaces () { TestSpace ts = (TestSpace) Deserialize (typeof (TestSpace), "4"); Assert.AreEqual (4, ts.elem, "#1"); Assert.AreEqual (5, ts.attr, "#2"); } [Test] public void TestDeserializeDefaults () { ListDefaults d2 = (ListDefaults) Deserialize (typeof (ListDefaults), ""); Assert.IsNotNull (d2.list2, "#A1"); Assert.IsNull (d2.list4, "#A3"); Assert.IsNotNull (d2.list5, "#A4"); Assert.IsNotNull (d2.ed, "#A5"); Assert.IsNotNull (d2.str, "#A6"); d2 = (ListDefaults) Deserialize (typeof (ListDefaults), ""); Assert.IsNotNull (d2.list2, "#B1"); Assert.IsNull (d2.list4, "#B3"); Assert.IsNotNull (d2.list5, "#B4"); Assert.IsNotNull (d2.ed, "#B5"); Assert.IsNotNull (d2.str, "#B6"); } [Test] public void TestDeserializeChoiceArray () { CompositeValueType v = (CompositeValueType) Deserialize (typeof (CompositeValueType), "12"); Assert.IsNotNull (v.Items, "#1"); Assert.IsNotNull (v.ItemsElementName, "#2"); Assert.AreEqual (2, v.Items.Length, "#3"); Assert.AreEqual (2, v.ItemsElementName.Length, "#4"); Assert.AreEqual (1, v.Items[0], "#5"); Assert.AreEqual (2, v.Items[1], "#6"); Assert.AreEqual (ItemsChoiceType.In, v.ItemsElementName[0], "#7"); Assert.AreEqual (ItemsChoiceType.Es, v.ItemsElementName[1], "#8"); } #region GenericsDeseralizationTests [Test] public void TestDeserializeGenSimpleClassString () { Deserialize (typeof (GenSimpleClass), ""); Assert.AreEqual (typeof (GenSimpleClass), result.GetType ()); Deserialize (typeof (GenSimpleClass), "hello"); GenSimpleClass simple = result as GenSimpleClass; Assert.AreEqual ("hello", simple.something); } [Test] public void TestDeserializeGenSimpleClassBool () { Deserialize (typeof (GenSimpleClass), "false"); Assert.AreEqual (typeof (GenSimpleClass), result.GetType ()); Deserialize (typeof (GenSimpleClass), "true"); GenSimpleClass simple = result as GenSimpleClass; Assert.AreEqual (true, simple.something); } [Test] public void TestDeserializeGenSimpleStructInt () { Deserialize (typeof (GenSimpleStruct), "0"); Assert.AreEqual (typeof (GenSimpleStruct), result.GetType ()); Deserialize (typeof (GenSimpleStruct), "123"); GenSimpleStruct simple = new GenSimpleStruct (0); if (result != null) simple = (GenSimpleStruct) result; Assert.AreEqual (123, simple.something); } [Test] public void TestDeserializeGenListClassString () { Deserialize (typeof (GenListClass), ""); Assert.AreEqual (typeof (GenListClass), result.GetType ()); Deserialize (typeof (GenListClass), "Value1Value2"); GenListClass genlist = result as GenListClass; Assert.AreEqual ("Value1", genlist.somelist[0]); Assert.AreEqual ("Value2", genlist.somelist[1]); } [Test] public void TestDeserializeGenListClassFloat () { Deserialize (typeof (GenListClass), ""); Assert.AreEqual (typeof (GenListClass), result.GetType ()); Deserialize (typeof (GenListClass), "12.2"); GenListClass genlist = result as GenListClass; Assert.AreEqual (1, genlist.somelist[0]); Assert.AreEqual (2.2F, genlist.somelist[1]); } [Test] public void TestDeserializeGenListClassList () { Deserialize (typeof (GenListClass>), ""); Assert.AreEqual (typeof (GenListClass>), result.GetType ()); Deserialize (typeof (GenListClass>), "121020"); GenListClass> genlist = result as GenListClass>; Assert.AreEqual (1, genlist.somelist[0].somelist[0]); Assert.AreEqual (2, genlist.somelist[0].somelist[1]); Assert.AreEqual (10, genlist.somelist[1].somelist[0]); Assert.AreEqual (20, genlist.somelist[1].somelist[1]); } [Test] public void TestDeserializeGenListClassArray () { Deserialize (typeof (GenListClass>), ""); Assert.AreEqual (typeof (GenListClass>), result.GetType ()); Deserialize (typeof (GenListClass>), "97980100101102"); GenListClass> genlist = result as GenListClass>; Assert.AreEqual ('a', genlist.somelist[0].arr[0]); Assert.AreEqual ('b', genlist.somelist[0].arr[1]); Assert.AreEqual ('d', genlist.somelist[1].arr[0]); Assert.AreEqual ('e', genlist.somelist[1].arr[1]); Assert.AreEqual ('f', genlist.somelist[1].arr[2]); } [Test] public void TestDeserializeGenTwoClassCharDouble () { Deserialize (typeof (GenTwoClass), "00"); Assert.AreEqual (typeof (GenTwoClass), result.GetType ()); Deserialize (typeof (GenTwoClass), "972.2"); GenTwoClass gentwo = result as GenTwoClass; Assert.AreEqual ('a', gentwo.something1); Assert.AreEqual (2.2, gentwo.something2); } [Test] public void TestDeserializeGenDerivedClassDecimalShort () { Deserialize (typeof (GenDerivedClass), "000"); Assert.AreEqual (typeof (GenDerivedClass), result.GetType ()); Deserialize (typeof (GenDerivedClass), "Value111.1-22"); GenDerivedClass derived = result as GenDerivedClass; Assert.AreEqual ("Value1", derived.something1); Assert.AreEqual (1, derived.something2); Assert.AreEqual (1.1M, derived.another1); Assert.AreEqual (-22, derived.another2); } [Test] public void TestDeserializeGenDerivedSecondClassByteUlong () { Deserialize (typeof (GenDerived2Class), "0000"); Assert.AreEqual (typeof (GenDerived2Class), result.GetType ()); Deserialize (typeof (GenDerived2Class), "1222111222222"); GenDerived2Class derived2 = result as GenDerived2Class; Assert.AreEqual (1, derived2.something1); Assert.AreEqual (222, derived2.something2); Assert.AreEqual (111, derived2.another1); Assert.AreEqual (222222, derived2.another2); } [Test] public void TestDeserializeGenNestedClass () { Deserialize (typeof (GenNestedClass.InnerClass), "0false"); Assert.AreEqual (typeof (GenNestedClass.InnerClass), result.GetType ()); Deserialize (typeof (GenNestedClass.InnerClass), "5true"); GenNestedClass.InnerClass nested = result as GenNestedClass.InnerClass; Assert.AreEqual (5, nested.inner); Assert.AreEqual (true, nested.something); } [Test] public void TestDeserializeGenListClassListNested () { Deserialize (typeof (GenListClass.InnerClass>>), ""); Assert.AreEqual (typeof (GenListClass.InnerClass>>), result.GetType ()); Deserialize (typeof (GenListClass.InnerClass>>), "1ONE2TWO30THIRTY"); GenListClass.InnerClass>> genlist = result as GenListClass.InnerClass>>; Assert.AreEqual (1, genlist.somelist[0].somelist[0].inner); Assert.AreEqual ("ONE", genlist.somelist[0].somelist[0].something); Assert.AreEqual (2, genlist.somelist[0].somelist[1].inner); Assert.AreEqual ("TWO", genlist.somelist[0].somelist[1].something); Assert.AreEqual (30, genlist.somelist[1].somelist[0].inner); Assert.AreEqual ("THIRTY", genlist.somelist[1].somelist[0].something); } public enum Myenum { one, two, three, four, five, six }; [Test] public void TestDeserializeGenArrayClassEnum () { Deserialize (typeof (GenArrayClass), "oneoneone"); Assert.AreEqual (typeof (GenArrayClass), result.GetType ()); Deserialize (typeof (GenArrayClass), "onethreefive"); GenArrayClass genarr = result as GenArrayClass; Assert.AreEqual (Myenum.one, genarr.arr[0]); Assert.AreEqual (Myenum.three, genarr.arr[1]); Assert.AreEqual (Myenum.five, genarr.arr[2]); } [Test] public void TestDeserializeGenArrayClassStruct () { Deserialize (typeof (GenArrayClass>), "000"); Assert.AreEqual (typeof (GenArrayClass>), result.GetType ()); Deserialize (typeof (GenArrayClass>), "111222333"); GenArrayClass> genarr = result as GenArrayClass>; Assert.AreEqual (111, genarr.arr[0].something); Assert.AreEqual (222, genarr.arr[1].something); Assert.AreEqual (333, genarr.arr[2].something); } [Test] public void TestDeserializeGenArrayClassList () { Deserialize (typeof (GenArrayClass>), "000"); Assert.AreEqual (typeof (GenArrayClass>), result.GetType ()); Deserialize (typeof (GenArrayClass>), "list1-val1list1-val2list2-val1list2-val2list2-val3list2-val4list3val"); GenArrayClass> genarr = result as GenArrayClass>; Assert.AreEqual ("list1-val1", genarr.arr[0].somelist[0]); Assert.AreEqual ("list1-val2", genarr.arr[0].somelist[1]); Assert.AreEqual ("list2-val1", genarr.arr[1].somelist[0]); Assert.AreEqual ("list2-val2", genarr.arr[1].somelist[1]); Assert.AreEqual ("list2-val3", genarr.arr[1].somelist[2]); Assert.AreEqual ("list2-val4", genarr.arr[1].somelist[3]); Assert.AreEqual ("list3val", genarr.arr[2].somelist[0]); // The code below checks for DotNet bug (see corresponding test in XmlSerializerTests). Deserialize (typeof (GenArrayClass>), "list1-val1list1-val2list3vallist2-val1list2-val2list2-val3list2-val4"); GenArrayClass> genarr2 = result as GenArrayClass>; Assert.AreEqual ("list1-val1", genarr2.arr[0].somelist[0]); Assert.AreEqual ("list1-val2", genarr2.arr[0].somelist[1]); /**/ Assert.AreEqual ("list3val", genarr2.arr[0].somelist[2]); Assert.AreEqual ("list2-val1", genarr2.arr[1].somelist[0]); Assert.AreEqual ("list2-val2", genarr2.arr[1].somelist[1]); Assert.AreEqual ("list2-val3", genarr2.arr[1].somelist[2]); Assert.AreEqual ("list2-val4", genarr2.arr[1].somelist[3]); //Assert.AreEqual ("list3val", genarr2.arr[2].somelist[0]); } [Test] public void TestDeserializeGenComplexStruct () { Deserialize (typeof (GenComplexStruct), "0000000000000"); Assert.AreEqual (typeof (GenComplexStruct), result.GetType ()); Deserialize (typeof (GenComplexStruct), "12345678910020011223310Tentwo21one4four3three5six6"); GenComplexStruct complex = new GenComplexStruct (0); if (result != null) complex = (GenComplexStruct) result; Assert.AreEqual (123, complex.something); Assert.AreEqual (456, complex.simpleclass.something); Assert.AreEqual (789, complex.simplestruct.something); Assert.AreEqual (100, complex.listclass.somelist[0]); Assert.AreEqual (200, complex.listclass.somelist[1]); Assert.AreEqual (11, complex.arrayclass.arr[0]); Assert.AreEqual (22, complex.arrayclass.arr[1]); Assert.AreEqual (33, complex.arrayclass.arr[2]); Assert.AreEqual (10, complex.twoclass.something1); Assert.AreEqual ("Ten", complex.twoclass.something2); Assert.AreEqual (1, complex.derivedclass.another1); Assert.AreEqual ("one", complex.derivedclass.another2); Assert.AreEqual ("two", complex.derivedclass.something1); Assert.AreEqual (2, complex.derivedclass.something2); Assert.AreEqual (3, complex.derived2.another1); Assert.AreEqual ("three", complex.derived2.another2); Assert.AreEqual (4, complex.derived2.something1); Assert.AreEqual ("four", complex.derived2.something2); Assert.AreEqual (5, complex.nestedouter.outer); Assert.AreEqual ("six", complex.nestedinner.inner); Assert.AreEqual (6, complex.nestedinner.something); } #endregion //GenericsDeseralizationTests [Test] public void TestDeserializeCollection () { string s0 = ""; s0 += " "; s0 += " "; s0 += " "; s0 += " "; EntityCollection col = (EntityCollection) Deserialize (typeof (EntityCollection), s0); Assert.IsNotNull (col, "#1"); Assert.AreEqual (2, col.Count, "#2"); Assert.IsNull (col[0].Parent, "#3"); Assert.IsNull (col[1].Parent, "#4"); } [Test] public void TestDeserializeEmptyCollection () { string s1 = ""; s1 += " "; EntityCollection col = (EntityCollection) Deserialize (typeof (EntityCollection), s1); Assert.IsNotNull (col, "#A1"); Assert.AreEqual (0, col.Count, "#A2"); string s1_1 = ""; s1_1 += " "; s1_1 += " "; col = (EntityCollection) Deserialize (typeof (EntityCollection), s1_1); Assert.IsNotNull (col, "#B1"); Assert.AreEqual (0, col.Count, "#B2"); } [Test] public void TestDeserializeNilCollectionIsNotNull () { string s2 = ""; s2 += " "; EntityCollection col = (EntityCollection) Deserialize (typeof (EntityCollection), s2); Assert.IsNotNull (col, "#1"); Assert.AreEqual (0, col.Count, "#2"); } [Test] public void TestDeserializeObjectCollections () { string s3 = ""; s3 += ""; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += ""; EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s3); Assert.IsNotNull (cont, "#A1"); Assert.IsNotNull (cont.Collection1, "#B1"); Assert.AreEqual (2, cont.Collection1.Count, "#B2"); Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3"); Assert.AreEqual ("assigned", cont.Collection1[0].Parent, "#B4"); Assert.AreEqual ("assigned", cont.Collection1[1].Parent, "#B5"); Assert.IsNotNull (cont.Collection2, "#C1"); Assert.AreEqual (2, cont.Collection2.Count, "#C2"); Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3"); Assert.AreEqual ("assigned", cont.Collection2[0].Parent, "#C4"); Assert.AreEqual ("assigned", cont.Collection2[1].Parent, "#C5"); Assert.IsNotNull (cont.Collection3, "#D1"); Assert.AreEqual (2, cont.Collection3.Count, "#D2"); Assert.AreEqual ("root", cont.Collection3.Container, "#D3"); Assert.AreEqual ("root", cont.Collection3[0].Parent, "#D4"); Assert.AreEqual ("root", cont.Collection3[1].Parent, "#D5"); Assert.IsNotNull (cont.Collection4, "#E1"); Assert.AreEqual (2, cont.Collection4.Count, "#E2"); Assert.AreEqual ("root", cont.Collection4.Container, "#E3"); Assert.AreEqual ("root", cont.Collection4[0].Parent, "#E4"); Assert.AreEqual ("root", cont.Collection4[1].Parent, "#E5"); } [Test] public void TestDeserializeEmptyObjectCollections () { string s4 = ""; s4 += ""; s4 += ""; EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s4); Assert.IsNotNull (cont, "#A1"); Assert.IsNotNull (cont.Collection1, "#B1"); Assert.AreEqual (0, cont.Collection1.Count, "#B2"); Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3"); Assert.IsNotNull (cont.Collection2, "#C1"); Assert.AreEqual (0, cont.Collection2.Count, "#C2"); Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3"); Assert.IsNotNull (cont.Collection3, "#D1"); Assert.AreEqual (0, cont.Collection3.Count, "#D2"); Assert.AreEqual ("root", cont.Collection3.Container, "#D3"); Assert.IsNotNull (cont.Collection4, "#E1"); Assert.AreEqual (0, cont.Collection4.Count, "#E2"); Assert.AreEqual ("root", cont.Collection4.Container, "#E3"); } [Test] public void TestDeserializeObjectNilCollectionsAreNotNull () { string s5 = ""; s5 += ""; s5 += " "; s5 += " "; s5 += " "; s5 += " "; s5 += ""; EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s5); Assert.IsNotNull (cont, "#A1"); Assert.IsNotNull (cont.Collection1, "#B1"); Assert.AreEqual (0, cont.Collection1.Count, "#B2"); Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3"); Assert.IsNotNull (cont.Collection2, "#C1"); Assert.AreEqual (0, cont.Collection2.Count, "#C2"); Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3"); Assert.IsNotNull (cont.Collection3, "#D1"); Assert.AreEqual (0, cont.Collection3.Count, "#D2"); Assert.AreEqual ("root", cont.Collection3.Container, "#D3"); Assert.IsNotNull (cont.Collection4, "#E1"); Assert.AreEqual (0, cont.Collection4.Count, "#E2"); Assert.AreEqual ("root", cont.Collection4.Container, "#E3"); } [Test] public void TestDeserializeObjectEmptyCollections () { string s6 = ""; s6 += ""; s6 += " "; s6 += " "; s6 += " "; s6 += " "; s6 += ""; EntityContainer cont = (EntityContainer) Deserialize (typeof (EntityContainer), s6); Assert.IsNotNull (cont, "#A1"); Assert.IsNotNull (cont.Collection1, "#B1"); Assert.AreEqual (0, cont.Collection1.Count, "#B2"); Assert.AreEqual ("assigned", cont.Collection1.Container, "#B3"); Assert.IsNotNull (cont.Collection2, "#C1"); Assert.AreEqual (0, cont.Collection2.Count, "#C2"); Assert.AreEqual ("assigned", cont.Collection2.Container, "#C3"); Assert.IsNotNull (cont.Collection3, "#D1"); Assert.AreEqual (0, cont.Collection3.Count, "#D2"); Assert.AreEqual ("root", cont.Collection3.Container, "#D3"); Assert.IsNotNull (cont.Collection4, "#E1"); Assert.AreEqual (0, cont.Collection4.Count, "#E2"); Assert.AreEqual ("root", cont.Collection4.Container, "#E3"); } [Test] public void TestDeserializeObjectEmptyArrays () { string s6 = ""; s6 += ""; s6 += " "; s6 += " "; s6 += " "; s6 += " "; s6 += ""; ArrayEntityContainer cont = (ArrayEntityContainer) Deserialize (typeof (ArrayEntityContainer), s6); Assert.IsNotNull (cont, "#A1"); Assert.IsNotNull (cont.Collection1, "#B1"); Assert.AreEqual (0, cont.Collection1.Length, "#B2"); Assert.IsNotNull (cont.Collection2, "#C1"); Assert.AreEqual (0, cont.Collection2.Length, "#C2"); Assert.IsNotNull (cont.Collection3, "#D1"); Assert.AreEqual (0, cont.Collection3.Length, "#D2"); Assert.IsNotNull (cont.Collection4, "#E1"); Assert.AreEqual (0, cont.Collection4.Length, "#E2"); } [Test] public void TestDeserializeEmptyObjectArrays () { string s4 = ""; s4 += ""; s4 += ""; ArrayEntityContainer cont = (ArrayEntityContainer) Deserialize (typeof (ArrayEntityContainer), s4); Assert.IsNotNull (cont, "#A1"); Assert.IsNull (cont.Collection1, "#B1"); Assert.IsNull (cont.Collection2, "#B2"); Assert.IsNotNull (cont.Collection3, "#C1"); Assert.AreEqual (0, cont.Collection3.Length, "#C2"); Assert.IsNotNull (cont.Collection4, "#D1"); Assert.AreEqual (0, cont.Collection4.Length, "#D2"); } [Test] public void TestDeserializeObjectNilArrays () { string s5 = ""; s5 += ""; s5 += " "; s5 += " "; s5 += " "; s5 += " "; s5 += ""; ArrayEntityContainer cont = (ArrayEntityContainer) Deserialize (typeof (ArrayEntityContainer), s5); Assert.IsNotNull (cont, "#A1"); Assert.IsNull (cont.Collection1, "#B1"); Assert.IsNull (cont.Collection2, "#B2"); Assert.IsNull (cont.Collection3, "#B3"); Assert.IsNotNull (cont.Collection4, "#C1"); Assert.AreEqual (0, cont.Collection4.Length, "#C2"); } [Test] public void TestDeserializeEmptyArray () { string s1 = ""; s1 += ""; Entity[] col = (Entity[]) Deserialize (typeof (Entity[]), s1); Assert.IsNotNull (col, "#A1"); Assert.AreEqual (0, col.Length, "#A2"); string s1_1 = ""; s1_1 += " "; s1_1 += " "; col = (Entity[]) Deserialize (typeof (Entity[]), s1_1); Assert.IsNotNull (col, "#B1"); Assert.AreEqual (0, col.Length, "#B2"); } [Test] public void TestDeserializeNilArray () { string s2 = ""; s2 += ""; Entity[] col = (Entity[]) Deserialize (typeof (Entity[]), s2); Assert.IsNull (col, "#1"); } [Test] public void TestDeserializeObjectWithReadonlyCollection () { string s3 = ""; s3 += ""; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += ""; ObjectWithReadonlyCollection cont = (ObjectWithReadonlyCollection) Deserialize (typeof (ObjectWithReadonlyCollection), s3); Assert.IsNotNull (cont, "#1"); Assert.IsNotNull (cont.Collection1, "#2"); Assert.AreEqual (2, cont.Collection1.Count, "#3"); Assert.AreEqual ("root", cont.Collection1.Container, "#4"); Assert.AreEqual ("root", cont.Collection1[0].Parent, "#5"); Assert.AreEqual ("root", cont.Collection1[1].Parent, "#6"); } [Test] public void TestDeserializeObjectWithReadonlyNulCollection () { string s3 = ""; s3 += ""; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += ""; var obj = (ObjectWithReadonlyNulCollection) Deserialize (typeof (ObjectWithReadonlyNulCollection), s3); Assert.IsNull (obj.Collection1); } [Test] public void TestDeserializeObjectWithReadonlyArray () { string s3 = ""; s3 += ""; s3 += " "; s3 += " "; s3 += " "; s3 += " "; s3 += ""; ObjectWithReadonlyArray cont = (ObjectWithReadonlyArray) Deserialize (typeof (ObjectWithReadonlyArray), s3); Assert.IsNotNull (cont, "#1"); Assert.IsNotNull (cont.Collection1, "#2"); Assert.AreEqual (0, cont.Collection1.Length, "#3"); } [Test] public void TestDeserialize_EnumDefaultValue () { EnumDefaultValue e; e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), ""); Assert.AreEqual (0, (int) e, "#1"); e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), " e3"); Assert.AreEqual (EnumDefaultValue.e3, e, "#2"); e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), "e1 e2"); Assert.AreEqual (EnumDefaultValue.e3, e, "#3"); e = (EnumDefaultValue) Deserialize (typeof (EnumDefaultValue), " e1 e2 "); Assert.AreEqual (EnumDefaultValue.e1 | EnumDefaultValue.e2, e, "#4"); } [Test] public void TestDeserialize_EnumDefaultValueNF () { EnumDefaultValueNF e; e = (EnumDefaultValueNF) Deserialize (typeof (EnumDefaultValueNF), "e3"); Assert.AreEqual (EnumDefaultValueNF.e3, e, "#A1"); try { Deserialize (typeof (EnumDefaultValueNF), ""); Assert.Fail ("#B1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); Assert.IsNotNull (ex.InnerException, "#B3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#B4"); Assert.IsNotNull (ex.InnerException.Message, "#B5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("''") != -1, "#B6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#B7"); } try { Deserialize (typeof (EnumDefaultValueNF), "e1 e3"); Assert.Fail ("#C1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2"); Assert.IsNotNull (ex.InnerException, "#C3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#C4"); Assert.IsNotNull (ex.InnerException.Message, "#C5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'e1 e3'") != -1, "#C6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#C7"); } try { Deserialize (typeof (EnumDefaultValueNF), " e3"); Assert.Fail ("#D1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2"); Assert.IsNotNull (ex.InnerException, "#D3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D4"); Assert.IsNotNull (ex.InnerException.Message, "#D5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("' e3'") != -1, "#D6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#D7"); } try { Deserialize (typeof (EnumDefaultValueNF), " "); Assert.Fail ("#E1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#E2"); Assert.IsNotNull (ex.InnerException, "#E3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#E4"); Assert.IsNotNull (ex.InnerException.Message, "#E5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("' '") != -1, "#E6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#E7"); } try { Deserialize (typeof (EnumDefaultValueNF), "1"); Assert.Fail ("#F1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F2"); Assert.IsNotNull (ex.InnerException, "#F3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#F4"); Assert.IsNotNull (ex.InnerException.Message, "#F5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'1'") != -1, "#F6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (EnumDefaultValueNF).Name) != -1, "#F7"); } } [Test] public void TestDeserialize_Field () { Field f = null; f = (Field) Deserialize (typeof (Field), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace)); Assert.AreEqual ((FlagEnum) 0, f.Flags1, "#A1"); Assert.AreEqual ((FlagEnum) 0, f.Flags2, "#A2"); Assert.AreEqual ((FlagEnum) 0, f.Flags3, "#A3"); Assert.AreEqual ((FlagEnum) 0, f.Flags4, "#A4"); Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#A5"); Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#A6"); Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#A7"); Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#A8"); Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#A9"); Assert.IsNull (f.Names, "#A10"); Assert.IsNull (f.Street, "#A11"); f = (Field) Deserialize (typeof (Field), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace)); Assert.AreEqual ((FlagEnum) 0, f.Flags1, "#B1"); Assert.AreEqual ((FlagEnum) 0, f.Flags2, "#B2"); Assert.AreEqual (FlagEnum.e2, f.Flags3, "#B3"); Assert.AreEqual ((FlagEnum) 0, f.Flags4, "#B4"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers, "#B5"); Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#B6"); Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#B7"); Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#B8"); Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#B9"); Assert.IsNull (f.Names, "#B10"); Assert.IsNull (f.Street, "#B11"); f = (Field) Deserialize (typeof (Field), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace)); Assert.AreEqual (FlagEnum.e2, f.Flags1, "#C1"); Assert.AreEqual (FlagEnum.e2, f.Flags2, "#C2"); Assert.AreEqual ((FlagEnum) 0, f.Flags3, "#C3"); Assert.AreEqual ((FlagEnum) 0, f.Flags4, "#C4"); Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#C5"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers2, "#C6"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers3, "#C7"); Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#C8"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers5, "#C9"); Assert.IsNull (f.Names, "#C10"); Assert.IsNull (f.Street, "#C11"); try { f = (Field) Deserialize (typeof (Field), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace)); Assert.Fail ("#D1"); } catch (InvalidOperationException ex) { // There was an error generating the XML document Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2"); Assert.IsNotNull (ex.Message, "#D3"); Assert.IsNotNull (ex.InnerException, "#D4"); // '444' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D5"); Assert.IsNotNull (ex.InnerException.Message, "#D6"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'444'") != -1, "#D7"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#D8"); Assert.IsNull (ex.InnerException.InnerException, "#D9"); } try { f = (Field) Deserialize (typeof (Field), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace)); Assert.Fail ("#E1"); } catch (InvalidOperationException ex) { // There was an error generating the XML document Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#E2"); Assert.IsNotNull (ex.Message, "#E3"); Assert.IsNotNull (ex.InnerException, "#E4"); // 'Garbage' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#E5"); Assert.IsNotNull (ex.InnerException.Message, "#E6"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'Garbage'") != -1, "#E7"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#E8"); Assert.IsNull (ex.InnerException.InnerException, "#E9"); } try { f = (Field) Deserialize (typeof (Field), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace, ((int) FlagEnum.e2).ToString (CultureInfo.InvariantCulture))); Assert.Fail ("#F1"); } catch (InvalidOperationException ex) { // There was an error generating the XML document Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F2"); Assert.IsNotNull (ex.Message, "#F3"); Assert.IsNotNull (ex.InnerException, "#F4"); // '2' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#F5"); Assert.IsNotNull (ex.InnerException.Message, "#F6"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'2'") != -1, "#F7"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#F8"); Assert.IsNull (ex.InnerException.InnerException, "#F9"); } } [Test] [Category ("NotWorking")] // MS.NET results in compilation error (probably it generates bogus source.) public void TestDeserialize_Field_Encoded () { Field_Encoded f = null; f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace)); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags1, "#A1"); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags2, "#A2"); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags3, "#A3"); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags4, "#A4"); Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#A5"); Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#A6"); Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#A7"); Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#A8"); Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#A9"); Assert.IsNull (f.Names, "#A10"); Assert.IsNull (f.Street, "#A11"); f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace)); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags1, "#B1"); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags2, "#B2"); Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags3, "#B3"); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags4, "#B4"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers, "#B5"); Assert.AreEqual (MapModifiers.Public, f.Modifiers2, "#B6"); Assert.AreEqual (MapModifiers.Public, f.Modifiers3, "#B7"); Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#B8"); Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#B9"); Assert.IsNull (f.Names, "#B10"); Assert.IsNull (f.Street, "#B11"); f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace)); Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags1, "#C1"); Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags2, "#C2"); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags3, "#C3"); Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags4, "#C4"); Assert.AreEqual (MapModifiers.Public, f.Modifiers, "#C5"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers2, "#C6"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers3, "#C7"); Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#C8"); Assert.AreEqual (MapModifiers.Protected, f.Modifiers5, "#C9"); Assert.IsNull (f.Names, "#C10"); Assert.IsNull (f.Street, "#C11"); try { f = (Field_Encoded) DeserializeEncoded (typeof (Field_Encoded), string.Format (CultureInfo.InvariantCulture, "" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace)); Assert.Fail ("#D1"); } catch (InvalidOperationException ex) { // There was an error generating the XML document Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2"); Assert.IsNotNull (ex.Message, "#D3"); Assert.IsNotNull (ex.InnerException, "#D4"); // '444' is not a valid value for MonoTests.System.Xml.TestClasses.FlagEnum_Encoded Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D5"); Assert.IsNotNull (ex.InnerException.Message, "#D6"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'444'") != -1, "#D7"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum_Encoded).FullName) != -1, "#D8"); Assert.IsNull (ex.InnerException.InnerException, "#D9"); } } [Test] public void TestDeserialize_FlagEnum () { FlagEnum e; e = (FlagEnum) Deserialize (typeof (FlagEnum), ""); Assert.AreEqual (0, (int) e, "#A1"); e = (FlagEnum) Deserialize (typeof (FlagEnum), "one"); Assert.AreEqual (FlagEnum.e1, e, "#A2"); e = (FlagEnum) Deserialize (typeof (FlagEnum), "one\u200atwo"); Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2, e, "#A3"); e = (FlagEnum) Deserialize (typeof (FlagEnum), "one two four"); Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2 | FlagEnum.e4, e, "#A4"); e = (FlagEnum) Deserialize (typeof (FlagEnum), " two four "); Assert.AreEqual (FlagEnum.e2 | FlagEnum.e4, e, "#A5"); e = (FlagEnum) Deserialize (typeof (FlagEnum), "two four two"); Assert.AreEqual (FlagEnum.e2 | FlagEnum.e4, e, "#A6"); e = (FlagEnum) Deserialize (typeof (FlagEnum), "two four two\tone\u2002four\rtwo one"); Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2 | FlagEnum.e4, e, "#A7"); e = (FlagEnum) Deserialize (typeof (FlagEnum), ""); Assert.AreEqual (0, (int) e, "#A8"); e = (FlagEnum) Deserialize (typeof (FlagEnum), " "); Assert.AreEqual (0, (int) e, "#A9"); try { Deserialize (typeof (FlagEnum), "1"); Assert.Fail ("#B1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); Assert.IsNotNull (ex.InnerException, "#B3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#B4"); Assert.IsNotNull (ex.InnerException.Message, "#B5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'1'") != -1, "#B6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#B7"); } try { Deserialize (typeof (FlagEnum), "one,two"); Assert.Fail ("#C1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2"); Assert.IsNotNull (ex.InnerException, "#C3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#C4"); Assert.IsNotNull (ex.InnerException.Message, "#C5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'one,two'") != -1, "#C6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#C7"); } try { Deserialize (typeof (FlagEnum), "one something"); Assert.Fail ("#D1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2"); Assert.IsNotNull (ex.InnerException, "#D3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D4"); Assert.IsNotNull (ex.InnerException.Message, "#D5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'something'") != -1, "#D6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (FlagEnum).FullName) != -1, "#D7"); } } [Test] public void TestDeserialize_Group () { string xml = string.Format (CultureInfo.InvariantCulture, "" + "" + "10000" + "Small" + "" + "" + "" + "1234566" + "0001-01-01" + "" + "", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance"); XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.ReadStartElement ("Wrapper"); Group group = (Group) DeserializeEncoded (typeof (Group), xtr); Assert.AreEqual (new DateTime (2002, 5, 2), group.Today, "#A1"); Assert.AreEqual (".NET", group.GroupName, "#A2"); Assert.AreEqual (new byte[] { 0x64, 0x32 }, group.GroupNumber, "#A3"); Assert.AreEqual (GroupType.A, group.Grouptype, "#A4"); Assert.AreEqual ("10000", group.PostitiveInt, "#A5"); Assert.IsFalse (group.IgnoreThis, "#A6"); Assert.IsNotNull (group.MyVehicle, "#A7"); Assert.AreEqual (typeof (Car), group.MyVehicle.GetType (), "#A8"); Assert.AreEqual ("1234566", group.MyVehicle.licenseNumber, "#A9"); Assert.AreEqual (new DateTime (1, 1, 1), group.MyVehicle.makeDate, "#A10"); Assert.IsNull (group.MyVehicle.weight, "#A11"); xml = string.Format (CultureInfo.InvariantCulture, "" + "" + "10000" + "Large" + "" + "" + "" + "450" + "" + "", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance"); xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.ReadStartElement ("Wrapper"); group = (Group) DeserializeEncoded (typeof (Group), xtr); Assert.AreEqual (new DateTime (2002, 5, 2), group.Today, "#B1"); Assert.IsNull (group.GroupName, "#B2"); Assert.AreEqual (new byte[] { 0x64, 0x32 }, group.GroupNumber, "#B3"); Assert.AreEqual (GroupType.B, group.Grouptype, "#B4"); Assert.AreEqual ("10000", group.PostitiveInt, "#B5"); Assert.IsFalse (group.IgnoreThis, "#B6"); Assert.IsNotNull (group.MyVehicle, "#B7"); Assert.AreEqual (typeof (Car), group.MyVehicle.GetType (), "#B8"); Assert.IsNull (group.MyVehicle.licenseNumber, "#B9"); Assert.AreEqual (DateTime.MinValue, group.MyVehicle.makeDate, "#B10"); Assert.AreEqual ("450", group.MyVehicle.weight, "#B11"); xml = string.Format (CultureInfo.InvariantCulture, "" + "" + "", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance"); xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.ReadStartElement ("Wrapper"); group = (Group) DeserializeEncoded (typeof (Group), xtr); Assert.AreEqual (DateTime.MinValue, group.Today, "#C1"); Assert.IsNull (group.GroupName, "#C2"); Assert.AreEqual (null, group.GroupNumber, "#C3"); Assert.AreEqual (GroupType.A, group.Grouptype, "#C4"); Assert.IsNull (group.PostitiveInt, "#C5"); Assert.IsFalse (group.IgnoreThis, "#C6"); Assert.IsNull (group.MyVehicle, "#C7"); xml = string.Format (CultureInfo.InvariantCulture, "" + "" + "666" + "" + "", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance"); xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.ReadStartElement ("Wrapper"); try { group = (Group) DeserializeEncoded (typeof (Group), xtr); Assert.Fail ("#D1"); } catch (InvalidOperationException ex) { // There is an error in XML document (1, 174) Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2"); Assert.IsNotNull (ex.Message, "#D3"); Assert.IsNotNull (ex.InnerException, "#D4"); // '666' is not a valid value for GroupType Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D5"); Assert.IsNotNull (ex.InnerException.Message, "#D6"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'666'") != -1, "#D7"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (GroupType).Name) != -1, "#D8"); Assert.IsNull (ex.InnerException.InnerException, "#D9"); } xml = string.Format (CultureInfo.InvariantCulture, "" + "" + "Garbage" + "" + "", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance"); xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.ReadStartElement ("Wrapper"); try { group = (Group) DeserializeEncoded (typeof (Group), xtr); Assert.Fail ("#E1"); } catch (InvalidOperationException ex) { // There is an error in XML document (1, 178) Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#E2"); Assert.IsNotNull (ex.Message, "#E3"); Assert.IsNotNull (ex.InnerException, "#E4"); // 'Garbage' is not a valid value for GroupType Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#E5"); Assert.IsNotNull (ex.InnerException.Message, "#E6"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'Garbage'") != -1, "#E7"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (GroupType).Name) != -1, "#E8"); Assert.IsNull (ex.InnerException.InnerException, "#E9"); } xml = string.Format (CultureInfo.InvariantCulture, "" + "" + "{2}" + "" + "", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/2001/XMLSchema-instance", ((int) GroupType.B).ToString (CultureInfo.InvariantCulture)); xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.ReadStartElement ("Wrapper"); try { group = (Group) DeserializeEncoded (typeof (Group), xtr); Assert.Fail ("#F1"); } catch (InvalidOperationException ex) { // There is an error in XML document (1, 172) Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#F2"); Assert.IsNotNull (ex.Message, "#F3"); Assert.IsNotNull (ex.InnerException, "#F4"); // '1' is not a valid value for GroupType Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#F5"); Assert.IsNotNull (ex.InnerException.Message, "#F6"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'1'") != -1, "#F7"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (GroupType).Name) != -1, "#F8"); Assert.IsNull (ex.InnerException.InnerException, "#F9"); } } [Test] public void TestDeserialize_ZeroFlagEnum () { ZeroFlagEnum e; e = (ZeroFlagEnum) Deserialize (typeof (ZeroFlagEnum), ""); Assert.AreEqual (ZeroFlagEnum.e0, e, "#A1"); e = (ZeroFlagEnum) Deserialize (typeof (ZeroFlagEnum), ""); Assert.AreEqual (ZeroFlagEnum.e0, e, "#A2"); try { Deserialize (typeof (ZeroFlagEnum), "four"); Assert.Fail ("#B1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); Assert.IsNotNull (ex.InnerException, "#B3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#B4"); Assert.IsNotNull (ex.InnerException.Message, "#B5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'four'") != -1, "#B6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (ZeroFlagEnum).FullName) != -1, "#B7"); } try { Deserialize (typeof (ZeroFlagEnum), " o<n>e four "); Assert.Fail ("#C1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2"); Assert.IsNotNull (ex.InnerException, "#C3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#C4"); Assert.IsNotNull (ex.InnerException.Message, "#C5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'four'") != -1, "#C6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (ZeroFlagEnum).FullName) != -1, "#C7"); } try { Deserialize (typeof (ZeroFlagEnum), "four o<n>e"); Assert.Fail ("#D1"); } catch (InvalidOperationException ex) { Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2"); Assert.IsNotNull (ex.InnerException, "#D3"); Assert.AreEqual (typeof (InvalidOperationException), ex.InnerException.GetType (), "#D4"); Assert.IsNotNull (ex.InnerException.Message, "#D5"); Assert.IsTrue (ex.InnerException.Message.IndexOf ("'four'") != -1, "#D6"); Assert.IsTrue (ex.InnerException.Message.IndexOf (typeof (ZeroFlagEnum).FullName) != -1, "#D7"); } } [Test] public void TestDeserialize_PrimitiveTypesContainer () { Deserialize (typeof (PrimitiveTypesContainer), string.Format (CultureInfo.InvariantCulture, "" + "" + "2004" + "some name" + "56" + "8w8=" + "47" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace, WsdlTypesNamespace)); Assert.AreEqual (typeof (PrimitiveTypesContainer), result.GetType (), "#A1"); PrimitiveTypesContainer deserialized = (PrimitiveTypesContainer) result; Assert.AreEqual (2004, deserialized.Number, "#A2"); Assert.AreEqual ("some name", deserialized.Name, "#A3"); Assert.AreEqual ((byte) 56, deserialized.Index, "#A4"); Assert.AreEqual (new byte[] { 243, 15 }, deserialized.Password, "#A5"); Assert.AreEqual ('/', deserialized.PathSeparatorCharacter, "#A6"); DeserializeEncoded (typeof (PrimitiveTypesContainer), string.Format (CultureInfo.InvariantCulture, "" + "" + "2004" + "some name" + "56" + "8w8=" + "47" + "", XmlSchemaNamespace, XmlSchemaInstanceNamespace, AnotherNamespace, WsdlTypesNamespace)); Assert.AreEqual (typeof (PrimitiveTypesContainer), result.GetType (), "#B1"); deserialized = (PrimitiveTypesContainer) result; Assert.AreEqual (2004, deserialized.Number, "#B2"); Assert.AreEqual ("some name", deserialized.Name, "#B3"); Assert.AreEqual ((byte) 56, deserialized.Index, "#B4"); Assert.AreEqual (new byte[] { 243, 15 }, deserialized.Password, "#B5"); Assert.AreEqual ('/', deserialized.PathSeparatorCharacter, "#B6"); } [Test] // bug #378696 public void DoNotFillDefaultValue () { XmlSerializer xs = new XmlSerializer (typeof (DefaultDateTimeContainer)); DefaultDateTimeContainer o = (DefaultDateTimeContainer) xs.Deserialize (new StringReader ("")); // do not fill DefaultValue / do not bork at generating code. Assert.AreEqual (DateTime.MinValue, o.FancyDateTime, "#1"); Assert.AreEqual (0, o.Numeric, "#2"); } [Test] // bug bxc 4367 public void SpecifiedXmlIgnoreTest () { XmlReflectionMember [] out_members = new XmlReflectionMember [2]; XmlReflectionMember m; m = new XmlReflectionMember (); m.IsReturnValue = false; m.MemberName = "HasPermissionsForUserResult"; m.MemberType = typeof (bool); m.SoapAttributes = new SoapAttributes (); m.XmlAttributes = new XmlAttributes (); out_members [0] = m; m = new XmlReflectionMember (); m.IsReturnValue = false; m.MemberName = "HasPermissionsForUserResultSpecified"; m.MemberType = typeof (bool); m.SoapAttributes = new SoapAttributes (); m.XmlAttributes = new XmlAttributes (); m.XmlAttributes.XmlIgnore = true; out_members [1] = m; XmlReflectionImporter xmlImporter = new XmlReflectionImporter (); XmlMembersMapping OutputMembersMapping = xmlImporter.ImportMembersMapping ("HasPermissionsForUserResponse", "http://tempuri.org", out_members, true); XmlSerializer xmlSerializer = XmlSerializer.FromMappings (new XmlMapping [] { OutputMembersMapping }) [0]; Assert.AreEqual (2, OutputMembersMapping.Count, "#count"); string msg = @" true "; object res = xmlSerializer.Deserialize (new StringReader (msg)); Assert.AreEqual (typeof (object[]), res.GetType (), "type"); Assert.AreEqual (2, ((object[]) res).Length, "length"); } [Test] public void InvalidNullableTypeTest () { XmlReflectionMember [] out_members = new XmlReflectionMember [1]; XmlReflectionMember m; m = new XmlReflectionMember (); m.IsReturnValue = false; m.MemberName = "HasPermissionsForUserResultSpecified"; m.MemberType = typeof (bool); m.SoapAttributes = new SoapAttributes (); m.XmlAttributes = new XmlAttributes (); m.XmlAttributes.XmlIgnore = true; m.XmlAttributes.XmlElements.Add (new XmlElementAttribute () { IsNullable = true }); out_members [0] = m; XmlReflectionImporter xmlImporter = new XmlReflectionImporter (); try { xmlImporter.ImportMembersMapping ("HasPermissionsForUserResponse", "http://tempuri.org", out_members, true); Assert.Fail ("Expected InvalidOperationException"); } catch (InvalidOperationException) { } } [Test] [Category ("MobileNotWorking")] public void NotExactDateParse () { XmlSerializer xs = new XmlSerializer (typeof (NotExactDateParseClass)); NotExactDateParseClass o = (NotExactDateParseClass) xs.Deserialize (new StringReader ("2012-02-05-09:00")); Assert.AreEqual (new DateTime (2012,2,5,9,0,0,DateTimeKind.Utc), o.SomeDate.ToUniversalTime ()); } public class Foo { public DateTime? Baz { get; set; } } [Test] public void CanDeserializeXsiNil() { var reader = new StringReader( @" "); using (var xmlReader = new XmlTextReader(reader)) { var serializer = new XmlSerializer(typeof(Foo)); var foo = (Foo)serializer.Deserialize(xmlReader); Assert.IsNull(foo.Baz); } } public class Bar { [XmlElement("baz")] public DateTime? Baz { get; set; } } [Test] public void CanDeserializeXsiNilToAPropertyWithXmlElementAttrib() { var reader = new StringReader( @" "); using (var xmlReader = new XmlTextReader(reader)) { var serializer = new XmlSerializer(typeof(Bar)); var bar = (Bar)serializer.Deserialize(xmlReader); Assert.IsNull(bar.Baz); } } public class FooBar { [XmlElement("baz", IsNullable = true)] public DateTime? Baz { get; set; } } [Test] public void CanDeserializeXsiNilToAPropertyWithXmlElementAttribAndIsNullableTrue() { var reader = new StringReader( @" "); using (var xmlReader = new XmlTextReader(reader)) { var serializer = new XmlSerializer(typeof(FooBar)); var foobar = (FooBar)serializer.Deserialize(xmlReader); Assert.IsNull(foobar.Baz); } } [Test] // bug #8468 public void TestUseSubclassDefaultNamespace () { XmlSerializer xs = new XmlSerializer (typeof (Bug8468Subclass)); string msg = "BaseValueMidValue"; var res1 = (Bug8468Subclass)xs.Deserialize (new StringReader (msg)); Assert.IsNotNull (res1); Assert.AreEqual ("BaseValue", res1.Base); Assert.AreEqual ("MidValue", res1.Mid); xs = new XmlSerializer (typeof (Bug8468SubclassNoNamespace), "http://test-namespace"); var res2 = (Bug8468SubclassNoNamespace)xs.Deserialize (new StringReader (msg)); Assert.IsNotNull (res2); Assert.AreEqual ("BaseValue", res2.Base); Assert.AreEqual ("MidValue", res2.Mid); xs = new XmlSerializer (typeof (Bug8468SubclassV2)); var res3 = (Bug8468SubclassV2)xs.Deserialize (new StringReader (msg)); Assert.IsNotNull (res3); Assert.IsNull (res3.Base); Assert.AreEqual ("MidValue", res3.Mid); xs = new XmlSerializer (typeof (Bug8468SubclassNoNamespaceV2), "http://test-namespace"); var res4 = (Bug8468SubclassNoNamespaceV2)xs.Deserialize (new StringReader (msg)); Assert.IsNotNull (res4); Assert.IsNull (res4.Base); Assert.AreEqual ("MidValue", res4.Mid); msg = "BaseValueMidValue"; xs = new XmlSerializer (typeof (Bug8468SubclassV2)); var res5 = (Bug8468SubclassV2)xs.Deserialize (new StringReader (msg)); Assert.IsNotNull (res5); Assert.AreEqual ("BaseValue", res5.Base); Assert.AreEqual ("MidValue", res5.Mid); xs = new XmlSerializer (typeof (Bug8468SubclassNoNamespaceV2), "http://test-namespace"); var res6 = (Bug8468SubclassNoNamespaceV2)xs.Deserialize (new StringReader (msg)); Assert.IsNotNull (res6); Assert.AreEqual ("BaseValue", res6.Base); Assert.AreEqual ("MidValue", res6.Mid); } [Test] // bug #9193 public void TestOrderedMapWithFlatList () { var d = (Bug9193Class) Deserialize (typeof(Bug9193Class), "OneTwoThreeab"); Assert.IsNotNull (d); Assert.AreEqual (3, d.Data.Length); Assert.AreEqual ("One", d.Data[0]); Assert.AreEqual ("Two", d.Data[1]); Assert.AreEqual ("Three", d.Data[2]); Assert.AreEqual (2, d.Extra.Length); Assert.AreEqual ("a", d.Extra[0]); Assert.AreEqual ("b", d.Extra[1]); } } }