Add not-working tets for some MarkupExtension wrapper types.
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlObjectWriterTest.cs
old mode 100644 (file)
new mode 100755 (executable)
index f709ac6..787a9f3
@@ -25,13 +25,15 @@ using System.Collections;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.IO;
+using System.Linq;
 using System.Reflection;
 using System.Windows.Markup;
 using System.Xaml;
 using System.Xaml.Schema;
+using System.Xml;
 using NUnit.Framework;
 
-using Category = NUnit.Framework.CategoryAttribute;
+using CategoryAttribute = NUnit.Framework.CategoryAttribute;
 
 namespace MonoTests.System.Xaml
 {
@@ -247,13 +249,11 @@ namespace MonoTests.System.Xaml
                        // passes here, but ...
                        xw.WriteValue ("foo");
                        // rejected here, unlike XamlXmlWriter.
-                       //
-                       // Basically, assume that no content could be written 
-                       // for an object member within XamlObjectWriter.
                        xw.WriteEndMember ();
                }
 
                [Test]
+               [ExpectedException (typeof (XamlDuplicateMemberException))]
                public void ValueAfterObject2 ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -263,6 +263,8 @@ namespace MonoTests.System.Xaml
                        xw.WriteEndObject ();
                        // passes here, but should be rejected later.
                        xw.WriteValue ("foo");
+
+                       xw.WriteEndMember (); // Though this raises an error.
                }
 
                [Test]
@@ -293,6 +295,7 @@ namespace MonoTests.System.Xaml
 
                [Test]
                //[ExpectedException (typeof (ArgumentException))] // oh? XamlXmlWriter raises this.
+               [Category ("NotWorking")] // so, it's not worthy of passing.
                public void WriteValueTypeMismatch ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -329,6 +332,8 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
+               // This behavior is different from XamlXmlWriter. Compare to XamlXmlWriterTest.WriteValueList().
+               [Category ("NotWorking")] // not worthy of passing
                public void WriteValueList ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -344,8 +349,16 @@ namespace MonoTests.System.Xaml
                        Assert.AreEqual ("bar", l [1], "#3");
                }
 
+               // I believe .NET XamlObjectWriter.Dispose() is hack and should
+               // be fixed to exactly determine which of End (member or object)
+               // to call that results in this ExpectedException.
+               // Surprisingly, PositionalParameters is allowed to be closed
+               // without EndMember. So it smells that .NET is hacky.
+               // We should disable this test and introduce better code (which
+               // is already in XamlWriterInternalBase).
                [Test]
                [ExpectedException (typeof (XamlObjectWriterException))]
+               [Ignore ("See the comment in XamlObjectWriterTest.cs")]
                public void CloseWithoutEndMember ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -431,6 +444,7 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
+               [ExpectedException (typeof (XamlDuplicateMemberException))] // duplicate member assignment
                public void ObjectContainsObjectAndValue ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -439,6 +453,8 @@ namespace MonoTests.System.Xaml
                        xw.WriteStartObject (xt3);
                        xw.WriteEndObject ();
                        xw.WriteValue ("foo"); // but this is allowed ...
+
+                       xw.WriteEndMember (); // Though this raises an error.
                }
 
                [Test]
@@ -512,7 +528,6 @@ namespace MonoTests.System.Xaml
 
                [Test]
                [ExpectedException (typeof (XamlObjectWriterException))] // This is also very different, requires exactly opposite namespace output manner to XamlXmlWriter (namespace first, object follows).
-               [Category ("NotWorking")]
                public void StartMemberAfterNamespace ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -521,7 +536,7 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               [Category ("NotWorking")]
+               [Category ("NotWorking")] // not worthy of passing
                public void StartMemberBeforeNamespace ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -581,7 +596,6 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void GetObjectOnIntValue ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -592,18 +606,18 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               // String is not treated as a collection on XamlXmlWriter, while this XamlObjectReader does.
-               [Category ("NotWorking")]
+               // String is not treated as a collection on XamlXmlWriter, while this XamlObjectWriter does.
                public void GetObjectOnNonNullString ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
                        xw.WriteStartObject (xt3);
+                       Assert.IsNull (xw.Result, "#1");
                        xw.WriteStartMember (xt3.GetMember ("TestProp3"));
                        xw.WriteGetObject ();
+                       Assert.IsNull (xw.Result, "#2");
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void GetObjectOnCollection ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -611,8 +625,6 @@ namespace MonoTests.System.Xaml
                        xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Bar"), sctx));
                        xw.WriteGetObject ();
                        xw.Close ();
-                       // FIXME: enable it once we got generic type output fixed.
-                       //Assert.AreEqual (xml, sw.ToString ().Replace ('"', '\''), "#1");
                }
 
                [Test]
@@ -649,7 +661,6 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void StartMemberAfterGetObject ()
                {
                        var xw = new XamlObjectWriter (sctx, null);
@@ -677,5 +688,431 @@ namespace MonoTests.System.Xaml
                        xw.WriteGetObject ();
                        xw.WriteEndObject ();
                }
+
+               // extra use case based tests.
+
+               [Test]
+               public void WriteEx_Type_WriteString ()
+               {
+                       var ow = new XamlObjectWriter (sctx);
+                       ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
+                       ));
+                       ow.WriteStartObject (XamlLanguage.Type);
+                       ow.WriteStartMember (XamlLanguage.PositionalParameters);
+                       ow.WriteValue ("x:Int32");
+                       ow.Close ();
+                       Assert.AreEqual (typeof (int), ow.Result, "#1");
+               }
+
+               [Test]
+               public void WriteEx_Type_WriteType ()
+               {
+                       var ow = new XamlObjectWriter (sctx);
+                       ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
+                       ));
+                       ow.WriteStartObject (XamlLanguage.Type);
+                       ow.WriteStartMember (XamlLanguage.PositionalParameters);
+                       ow.WriteValue (typeof (int));
+                       ow.Close ();
+                       Assert.AreEqual (typeof (int), ow.Result, "#1");
+               }
+               
+               // common use case based tests (to other readers/writers).
+
+               XamlReader GetReader (string filename)
+               {
+                       return new XamlXmlReader (XmlReader.Create (Path.Combine ("Test/XmlFiles", filename), new XmlReaderSettings () { CloseInput =true }));
+               }
+
+               [Test]
+               public void Write_String ()
+               {
+                       using (var xr = GetReader ("String.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual ("foo", des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_Int32 ()
+               {
+                       using (var xr = GetReader ("Int32.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (5, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_DateTime ()
+               {
+                       using (var xr = GetReader ("DateTime.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (new DateTime (2010, 4, 14), des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_TimeSpan ()
+               {
+                       using (var xr = GetReader ("TimeSpan.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (TimeSpan.FromMinutes (7), des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_Uri ()
+               {
+                       using (var xr = GetReader ("Uri.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (new Uri ("urn:foo"), des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_Null ()
+               {
+                       using (var xr = GetReader ("NullExtension.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.IsNull (des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_Type ()
+               {
+                       using (var xr = GetReader ("Type.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (typeof (int), des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_Type2 ()
+               {
+                       var obj = typeof (MonoTests.System.Xaml.TestClass1);
+                       using (var xr = GetReader ("Type2.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_Guid ()
+               {
+                       var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
+                       using (var xr = GetReader ("Guid.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_GuidFactoryMethod ()
+               {
+                       var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
+                       using (var xr = GetReader ("GuidFactoryMethod.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               [ExpectedException (typeof (XamlObjectWriterException))] // cannot resolve the StaticExtension value.
+               public void Write_StaticExtension ()
+               {
+                       var obj = new StaticExtension ("FooBar");
+                       using (var xr = GetReader ("StaticExtension.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               [Ignore ("Not sure why MemberType is NOT serialized. Needs investigation")]
+               public void Write_StaticExtension2 ()
+               {
+                       var obj = new StaticExtension ("FooBar"); //incorrect
+                       using (var xr = GetReader ("StaticExtension2.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_Reference ()
+               {
+                       using (var xr = GetReader ("Reference.xml")) {
+                               var des = XamlServices.Load (xr);
+                               // .NET does not return Reference.
+                               // Its ProvideValue() returns MS.Internal.Xaml.Context.NameFixupToken,
+                               // which is assumed (by name) to resolve to the referenced object.
+                               Assert.IsNotNull (des, "#1");
+                               //Assert.AreEqual (new Reference ("FooBar"), des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_ArrayInt32 ()
+               {
+                       var obj = new int [] {4, -5, 0, 255, int.MaxValue};
+                       using (var xr = GetReader ("Array_Int32.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_ListInt32 ()
+               {
+                       var obj = new int [] {5, -3, int.MaxValue, 0}.ToList ();
+                       using (var xr = GetReader ("List_Int32.xml")) {
+                               var des = (List<int>) XamlServices.Load (xr);
+                               Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_ListInt32_2 ()
+               {
+                       var obj = new List<int> (new int [0]) { Capacity = 0 }; // set explicit capacity for trivial implementation difference
+                       using (var xr = GetReader ("List_Int32_2.xml")) {
+                               var des = (List<int>) XamlServices.Load (xr);
+                               Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_ListType ()
+               {
+                       var obj = new List<Type> (new Type [] {typeof (int), typeof (Dictionary<Type, XamlType>)}) { Capacity = 2 };
+                       using (var xr = GetReader ("List_Type.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_DictionaryInt32String ()
+               {
+                       var dic = new Dictionary<int,string> ();
+                       dic.Add (0, "foo");
+                       dic.Add (5, "bar");
+                       dic.Add (-2, "baz");
+                       using (var xr = GetReader ("Dictionary_Int32_String.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (dic, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_DictionaryStringType ()
+               {
+                       var dic = new Dictionary<string,Type> ();
+                       dic.Add ("t1", typeof (int));
+                       dic.Add ("t2", typeof (int []));
+                       dic.Add ("t3", typeof (int?));
+                       dic.Add ("t4", typeof (List<int>));
+                       dic.Add ("t5", typeof (Dictionary<int,DateTime>));
+                       dic.Add ("t6", typeof (List<KeyValuePair<int,DateTime>>));
+                       using (var xr = GetReader ("Dictionary_String_Type.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (dic, des, "#1");
+                       }
+               }
+
+               [Test]
+               [Ignore ("Needs to get successfully deserialized. Currently we can't")]
+               public void Write_PositionalParameters1Wrapper ()
+               {
+                       // Unlike the above case, this has the wrapper object and hence PositionalParametersClass1 can be written as an attribute (markup extension)
+                       var obj = new PositionalParametersWrapper ("foo", 5);
+                       using (var xr = GetReader ("PositionalParametersWrapper.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+               
+               [Test]
+               public void Write_ArgumentAttributed ()
+               {
+                       //var obj = new ArgumentAttributed ("foo", "bar");
+                       using (var xr = GetReader ("ArgumentAttributed.xml")) {
+                               var des = (ArgumentAttributed) XamlServices.Load (xr);
+                               Assert.AreEqual ("foo", des.Arg1, "#1");
+                               Assert.AreEqual ("bar", des.Arg2, "#2");
+                       }
+               }
+
+               [Test]
+               public void Write_ArrayExtension2 ()
+               {
+                       //var obj = new ArrayExtension (typeof (int));
+                       using (var xr = GetReader ("ArrayExtension2.xml")) {
+                               var des = XamlServices.Load (xr);
+                               // The resulting object is not ArrayExtension.
+                               Assert.AreEqual (new int [0], des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_ArrayList ()
+               {
+                       var obj = new ArrayList (new int [] {5, -3, 0});
+                       using (var xr = GetReader ("ArrayList.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               [Ignore ("Needs to get successfully deserialized. Currently we can't")]
+               public void ComplexPositionalParameterWrapper ()
+               {
+                       //var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
+                       using (var xr = GetReader ("ComplexPositionalParameterWrapper.xml")) {
+                               var des = (ComplexPositionalParameterWrapper) XamlServices.Load (xr);
+                               Assert.IsNotNull (des.Param, "#1");
+                               Assert.AreEqual ("foo", des.Param.Value, "#2");
+                       }
+               }
+
+               [Test]
+               public void Write_ListWrapper ()
+               {
+                       var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
+                       using (var xr = GetReader ("ListWrapper.xml")) {
+                               var des = (ListWrapper) XamlServices.Load (xr);
+                               Assert.IsNotNull (des, "#1");
+                               Assert.IsNotNull (des.Items, "#2");
+                               Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
+                       }
+               }
+
+               [Test]
+               public void Write_ListWrapper2 ()
+               {
+                       var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
+                       using (var xr = GetReader ("ListWrapper2.xml")) {
+                               var des = (ListWrapper2) XamlServices.Load (xr);
+                               Assert.IsNotNull (des, "#1");
+                               Assert.IsNotNull (des.Items, "#2");
+                               Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
+                       }
+               }
+
+               [Test]
+               public void Write_MyArrayExtension ()
+               {
+                       //var obj = new MyArrayExtension (new int [] {5, -3, 0});
+                       using (var xr = GetReader ("MyArrayExtension.xml")) {
+                               var des = XamlServices.Load (xr);
+                               // ProvideValue() returns an array
+                               Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_MyArrayExtensionA ()
+               {
+                       //var obj = new MyArrayExtensionA (new int [] {5, -3, 0});
+                       using (var xr = GetReader ("MyArrayExtensionA.xml")) {
+                               var des = XamlServices.Load (xr);
+                               // ProvideValue() returns an array
+                               Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_MyExtension ()
+               {
+                       //var obj = new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"};
+                       using (var xr = GetReader ("MyExtension.xml")) {
+                               var des = XamlServices.Load (xr);
+                               // ProvideValue() returns this.
+                               Assert.AreEqual ("provided_value", des, "#1");
+                       }
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidCastException))] // unable to cast string to MarkupExtension
+               [Category ("NotWorking")]
+               public void Write_MyExtension2 ()
+               {
+                       //var obj = new MyExtension2 () { Foo = typeof (int), Bar = "v2"};
+                       using (var xr = GetReader ("MyExtension2.xml")) {
+                               XamlServices.Load (xr);
+                       }
+               }
+
+               [Test]
+               public void Write_MyExtension3 ()
+               {
+                       //var obj = new MyExtension3 () { Foo = typeof (int), Bar = "v2"};
+                       using (var xr = GetReader ("MyExtension3.xml")) {
+                               var des = XamlServices.Load (xr);
+                               // StringConverter is used and the resulting value comes from ToString().
+                               Assert.AreEqual ("MonoTests.System.Xaml.MyExtension3", des, "#1");
+                       }
+               }
+
+               [Test]
+               [ExpectedException (typeof (XamlObjectWriterException))] // wrong TypeConverter input (input string for DateTimeConverter invalid)
+               public void Write_MyExtension4 ()
+               {
+                       var obj = new MyExtension4 () { Foo = typeof (int), Bar = "v2"};
+                       using (var xr = GetReader ("MyExtension4.xml")) {
+                               var des = XamlServices.Load (xr);
+                               Assert.AreEqual (obj, des, "#1");
+                       }
+               }
+
+               [Test]
+               public void Write_MyExtension6 ()
+               {
+                       //var obj = new MyExtension6 ("foo");
+                       using (var xr = GetReader ("MyExtension6.xml")) {
+                               var des = XamlServices.Load (xr);
+                               // ProvideValue() returns this.
+                               Assert.AreEqual ("foo", des, "#1");
+                       }
+               }
+               
+               [Test]
+               public void Write_PropertyDefinition ()
+               {
+                       //var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
+                       using (var xr = GetReader ("PropertyDefinition.xml")) {
+                               var des = (PropertyDefinition) XamlServices.Load (xr);
+                               Assert.AreEqual ("protected", des.Modifier, "#1");
+                               Assert.AreEqual ("foo", des.Name, "#2");
+                               Assert.AreEqual (XamlLanguage.String, des.Type, "#3");
+                       }
+               }
+               
+               [Test]
+               [Ignore ("this still does not give successful deserialization result - should there be any way?")]
+               public void Write_StaticExtensionWrapper ()
+               {
+                       //var obj = new StaticExtensionWrapper () { Param = new StaticExtension ("Foo") };
+                       using (var xr = GetReader ("StaticExtensionWrapper.xml")) {
+                               var des = (StaticExtensionWrapper) XamlServices.Load (xr);
+                               Assert.IsNotNull (des.Param, "#1");
+                               Assert.AreEqual ("Foo", des.Param.Member, "#2");
+                       }
+               }
+               
+               [Test]
+               [Ignore ("this still does not give successful deserialization result - should there be any way?")]
+               public void Write_TypeExtensionWrapper ()
+               {
+                       //var obj = new TypeExtensionWrapper () { Param = new TypeExtension ("Foo") };
+                       using (var xr = GetReader ("TypeExtensionWrapper.xml")) {
+                               var des = (TypeExtensionWrapper) XamlServices.Load (xr);
+                               Assert.IsNotNull (des.Param, "#1");
+                               // TypeName was not serialized into xml, hence deserialized as empty.
+                               Assert.AreEqual (String.Empty, des.Param.TypeName, "#2");
+                       }
+               }
        }
 }