do not check order sequence if option /order was not used
[mono.git] / mcs / class / System.XML / Test / System.Xml.Serialization / DeserializeTests.cs
index 99f31febb3b658afc8066d117f5d84d14f5cb873..459620cb13f8ee748e29c6b87d3aa3c5b2b3c983 100644 (file)
@@ -4,9 +4,11 @@
 // Author:
 //     Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
 //     Hagit Yidov <hagity@mainsoft.com>
+//     Andres G. Aragoneses <andres.aragoneses@7digital.com>
 //
 // (C) 2003 Atsushi Enomoto
 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
+// (C) 2012 7digital Media Ltd (http://www.7digital.com)
 //
 //
 using System;
@@ -280,7 +282,6 @@ namespace MonoTests.System.XmlSerialization
 
 #if NET_2_0
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenSimpleClassString ()
                {
                        Deserialize (typeof (GenSimpleClass<string>), "<GenSimpleClassOfString xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />");
@@ -291,7 +292,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenSimpleClassBool ()
                {
                        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>");
@@ -302,7 +302,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenSimpleStructInt ()
                {
                        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>");
@@ -315,7 +314,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenListClassString ()
                {
                        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>");
@@ -327,7 +325,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenListClassFloat ()
                {
                        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>");
@@ -339,7 +336,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenListClassList ()
                {
                        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>");
@@ -353,7 +349,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenListClassArray ()
                {
                        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>");
@@ -368,7 +363,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenTwoClassCharDouble ()
                {
                        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>");
@@ -380,7 +374,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenDerivedClassDecimalShort ()
                {
                        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>");
@@ -394,7 +387,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenDerivedSecondClassByteUlong ()
                {
                        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>");
@@ -408,7 +400,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenNestedClass ()
                {
                        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>");
@@ -420,7 +411,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenListClassListNested ()
                {
                        Deserialize (typeof (GenListClass<GenListClass<GenNestedClass<int, int>.InnerClass<string>>>),
@@ -440,7 +430,6 @@ namespace MonoTests.System.XmlSerialization
 
                public enum Myenum { one, two, three, four, five, six };
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenArrayClassEnum ()
                {
                        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>");
@@ -453,7 +442,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenArrayClassStruct ()
                {
                        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>");
@@ -466,7 +454,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenArrayClassList ()
                {
                        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>");
@@ -495,7 +482,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestDeserializeGenComplexStruct ()
                {
                        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>");
@@ -959,7 +945,6 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotWorking")] // DefaultValue should not be used when deserializing
                public void TestDeserialize_Field ()
                {
                        Field f = null;
@@ -1077,7 +1062,7 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotDotNet")] // MS.NET does not allow SoapAttribute backed by enum ??
+               [Category ("NotDotNet")] // MS.NET results in compilation error (probably it generates bogus source.)
                public void TestDeserialize_Field_Encoded ()
                {
                        Field_Encoded f = null;
@@ -1088,7 +1073,7 @@ namespace MonoTests.System.XmlSerialization
                                XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace));
                        Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags1, "#A1");
                        Assert.AreEqual ((FlagEnum_Encoded) 0, f.Flags2, "#A2");
-                       Assert.AreEqual (FlagEnum_Encoded.e1 | FlagEnum_Encoded.e2, f.Flags3, "#A3");
+                       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");
@@ -1102,14 +1087,14 @@ namespace MonoTests.System.XmlSerialization
                                string.Format (CultureInfo.InvariantCulture, "<?xml version='1.0' encoding='utf-16'?>" +
                                "<q1:field xmlns:xsd='{0}' xmlns:xsi='{1}' id='id1' flag3='two' flag4='' modifiers='Protected' modifiers2='PuBlIc' xmlns:q1='{2}' />",
                                XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace));
-                       Assert.AreEqual (FlagEnum_Encoded.e1, f.Flags1, "#B1");
-                       Assert.AreEqual (FlagEnum_Encoded.e1, f.Flags2, "#B2");
+                       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.Protected, f.Modifiers4, "#B8");
+                       Assert.AreEqual (MapModifiers.Public, f.Modifiers4, "#B8");
                        Assert.AreEqual (MapModifiers.Public, f.Modifiers5, "#B9");
                        Assert.IsNull (f.Names, "#B10");
                        Assert.IsNull (f.Street, "#B11");
@@ -1120,7 +1105,7 @@ namespace MonoTests.System.XmlSerialization
                                XmlSchemaNamespace, XmlSchemaInstanceNamespace, ANamespace));
                        Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags1, "#C1");
                        Assert.AreEqual (FlagEnum_Encoded.e2, f.Flags2, "#C2");
-                       Assert.AreEqual (FlagEnum_Encoded.e1 | FlagEnum_Encoded.e2, f.Flags3, "#C3");
+                       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");
@@ -1175,7 +1160,7 @@ namespace MonoTests.System.XmlSerialization
                        e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two</FlagEnum>");
                        Assert.AreEqual (FlagEnum.e2 | FlagEnum.e4, e, "#A6");
 
-                       e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two\tone\u2002four\u200btwo one</FlagEnum>");
+                       e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum>two four two\tone\u2002four\rtwo one</FlagEnum>");
                        Assert.AreEqual (FlagEnum.e1 | FlagEnum.e2 | FlagEnum.e4, e, "#A7");
 
                        e = (FlagEnum) Deserialize (typeof (FlagEnum), "<FlagEnum></FlagEnum>");
@@ -1487,5 +1472,154 @@ namespace MonoTests.System.XmlSerialization
                        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 ("<DefaultDateTimeContainer xmlns='urn:foo' />"));
+                       // 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 = @"
+                       <HasPermissionsForUserResponse xmlns=""http://tempuri.org/"">
+                               <HasPermissionsForUserResult>true</HasPermissionsForUserResult>
+                       </HasPermissionsForUserResponse>
+                       ";
+                       
+                       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]
+               public void NotExactDateParse ()
+               {
+                       XmlSerializer xs = new XmlSerializer (typeof (NotExactDateParseClass));
+                       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>"));
+                       Assert.AreEqual (new DateTime (2012,2,5), o.SomeDate);
+               }
+
+
+               public class Foo
+               {
+                       public DateTime? Baz { get; set; }
+               }
+
+               [Test]
+               public void CanDeserializeXsiNil()
+               {
+                       var reader = new StringReader(
+@"<Foo xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
+       <Baz xsi:nil=""true"" />
+</Foo>");
+
+                       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(
+@"<Bar xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
+       <baz xsi:nil=""true"" />
+</Bar>");
+
+                       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(
+@"<FooBar xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
+       <baz xsi:nil=""true"" />
+</FooBar>");
+
+                       using (var xmlReader = new XmlTextReader(reader))
+                       {
+                               var serializer = new XmlSerializer(typeof(FooBar));
+                               var foobar = (FooBar)serializer.Deserialize(xmlReader);
+                               Assert.IsNull(foobar.Baz);
+                       }
+               }
        }
 }