Merge pull request #1857 from slluis/fix-assembly-resolver
[mono.git] / mcs / class / System.XML / Test / System.Xml.Serialization / DeserializeTests.cs
index 62d3e27ccf8ae796ec48b25c0fe270b3f906a2b4..ec13691da1c6f391354da03759db0b487818446c 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;
@@ -161,7 +163,8 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotDotNet")]
+               [Category ("MobileNotWorking")]
+               [ExpectedException (typeof (InvalidOperationException))]
                public void DeserializeArrayReferences ()
                {
                        string s = "<Sample xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">";
@@ -246,7 +249,6 @@ namespace MonoTests.System.XmlSerialization
                        ListDefaults d2 = (ListDefaults) Deserialize (typeof (ListDefaults), "<root/>");
 
                        Assert.IsNotNull (d2.list2, "#A1");
-                       Assert.IsNull (d2.list3, "#A2");
                        Assert.IsNull (d2.list4, "#A3");
                        Assert.IsNotNull (d2.list5, "#A4");
                        Assert.IsNotNull (d2.ed, "#A5");
@@ -255,7 +257,6 @@ namespace MonoTests.System.XmlSerialization
                        d2 = (ListDefaults) Deserialize (typeof (ListDefaults), "<root></root>");
 
                        Assert.IsNotNull (d2.list2, "#B1");
-                       Assert.IsNull (d2.list3, "#B2");
                        Assert.IsNull (d2.list4, "#B3");
                        Assert.IsNotNull (d2.list5, "#B4");
                        Assert.IsNotNull (d2.ed, "#B5");
@@ -278,7 +279,6 @@ namespace MonoTests.System.XmlSerialization
 
                #region GenericsDeseralizationTests
 
-#if NET_2_0
                [Test]
                public void TestDeserializeGenSimpleClassString ()
                {
@@ -510,7 +510,6 @@ namespace MonoTests.System.XmlSerialization
                        Assert.AreEqual ("six", complex.nestedinner.inner);
                        Assert.AreEqual (6, complex.nestedinner.something);
                }
-#endif
 
                #endregion //GenericsDeseralizationTests
 
@@ -819,7 +818,7 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [ExpectedException (typeof (InvalidOperationException))]
+               [Category ("MobileNotWorking")]
                public void TestDeserializeObjectWithReadonlyNulCollection ()
                {
                        string s3 = "";
@@ -830,7 +829,8 @@ namespace MonoTests.System.XmlSerialization
                        s3 += " </Collection1>";
                        s3 += "</Container>";
 
-                       Deserialize (typeof (ObjectWithReadonlyNulCollection), s3);
+                       var obj = (ObjectWithReadonlyNulCollection) Deserialize (typeof (ObjectWithReadonlyNulCollection), s3);
+                       Assert.IsNull (obj.Collection1);
                }
 
                [Test]
@@ -1060,7 +1060,7 @@ namespace MonoTests.System.XmlSerialization
                }
 
                [Test]
-               [Category ("NotDotNet")] // MS.NET results in compilation error (probably it generates bogus source.)
+               [Category ("NotWorking")] // MS.NET results in compilation error (probably it generates bogus source.)
                public void TestDeserialize_Field_Encoded ()
                {
                        Field_Encoded f = null;
@@ -1158,7 +1158,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>");
@@ -1480,5 +1480,203 @@ namespace MonoTests.System.XmlSerialization
                        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]
+               [Category ("MobileNotWorking")]
+               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,9,0,0,DateTimeKind.Utc), o.SomeDate.ToUniversalTime ());
+               }
+
+
+               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);
+                       }
+               }
+
+               [Test] // bug #8468
+               public void TestUseSubclassDefaultNamespace ()
+               {
+                       XmlSerializer xs = new XmlSerializer (typeof (Bug8468Subclass));
+                       string msg = "<Test xmlns=\"http://test-namespace\"><Base>BaseValue</Base><Mid>MidValue</Mid></Test>";
+                       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 = "<Test xmlns=\"http://test-namespace\"><Base xmlns=\"\">BaseValue</Base><Mid>MidValue</Mid></Test>";
+
+                       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), "<Test><Data>One</Data><Data>Two</Data><Data>Three</Data><Extra>a</Extra><Extra>b</Extra></Test>");
+                       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]);
+               }
        }
 }