2 // Copyright (C) 2010 Novell Inc. http://novell.com
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.ComponentModel;
29 using System.Reflection;
30 using System.Windows.Markup;
32 using System.Xaml.Schema;
34 using NUnit.Framework;
36 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
38 namespace MonoTests.System.Xaml
41 public partial class XamlObjectReaderTest : XamlReaderTestBase
44 public void ConstructorNullObject ()
47 new XamlObjectReader (null);
51 [ExpectedException (typeof (ArgumentNullException))]
52 public void ConstructorNullSchemaContext ()
54 new XamlObjectReader ("foo", (XamlSchemaContext) null);
58 public void ConstructorNullSettings ()
60 new XamlObjectReader ("foo", (XamlObjectReaderSettings) null);
64 [ExpectedException (typeof (ArgumentNullException))]
65 public void ConstructorNullSchemaContext2 ()
67 new XamlObjectReader ("foo", null, new XamlObjectReaderSettings ());
71 public void ConstructorNullSettings2 ()
73 new XamlObjectReader ("foo", new XamlSchemaContext (null, null), null);
77 [ExpectedException (typeof (XamlObjectReaderException))]
78 public void ReadNonConstructible ()
80 // XamlType has no default constructor.
81 new XamlObjectReader (XamlLanguage.String);
85 [ExpectedException (typeof (XamlObjectReaderException))]
86 public void NonPublicType ()
88 new XamlObjectReader (new TestClass1 ());
92 [ExpectedException (typeof (XamlObjectReaderException))]
93 public void NestedType ()
95 new XamlObjectReader (new TestClass2 ());
98 public class TestClass2
103 public void ConstructibleType ()
105 new XamlObjectReader (new TestClass3 ());
108 // Based on Common tests
111 public void Read_String ()
113 var r = new XamlObjectReader ("foo");
118 public void WriteNullMemberAsObject ()
120 var r = new XamlObjectReader (new TestClass4 ());
121 WriteNullMemberAsObject (r, delegate {
122 Assert.IsNull (r.Instance, "#x"); }
127 public void StaticMember ()
129 var r = new XamlObjectReader (new TestClass5 ());
136 var r = new XamlObjectReader ("Foo");
143 var r = new XamlObjectReader ("Foo");
150 var r = new XamlObjectReader (new ReadOnlyPropertyContainer () { Foo = "x" });
151 while (r.NodeType != XamlNodeType.StartMember)
154 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#1");
158 public void Read_XmlDocument ()
160 var doc = new XmlDocument ();
161 doc.LoadXml ("<root xmlns='urn:foo'><elem attr='val' /></root>");
162 var r = new XamlObjectReader (doc);
163 Read_XmlDocument (r);
167 public void Read_NonPrimitive ()
169 var r = new XamlObjectReader (new TestClass3 ());
170 Read_NonPrimitive (r);
174 public void Read_Type ()
176 var r = new XamlObjectReader (typeof (int));
177 Read_TypeOrTypeExtension (r);
181 public void Read_TypeExtension ()
183 var tx = new TypeExtension (typeof (int));
184 var r = new XamlObjectReader (tx);
185 Read_TypeOrTypeExtension (r);
188 void Read_TypeOrTypeExtension (XamlObjectReader r)
190 Read_TypeOrTypeExtension (r, delegate {
191 Assert.IsTrue (r.Instance is TypeExtension, "#26");
192 }, XamlLanguage.PositionalParameters);
196 public void Read_Type2 ()
198 var r = new XamlObjectReader (typeof (TestClass1));
199 Read_TypeOrTypeExtension2 (r);
203 public void Read_TypeExtension2 ()
205 var r = new XamlObjectReader (new TypeExtension (typeof (TestClass1)));
206 Read_TypeOrTypeExtension2 (r);
209 void Read_TypeOrTypeExtension2 (XamlObjectReader r)
211 Read_TypeOrTypeExtension2 (r, delegate {
212 Assert.IsTrue (r.Instance is TypeExtension, "#26");
213 }, XamlLanguage.PositionalParameters);
217 public void Read_Reference ()
219 var r = new XamlObjectReader (new Reference ("FooBar"));
224 public void Read_Null ()
226 var r = new XamlObjectReader (null);
227 Read_NullOrNullExtension (r, (object) null);
231 public void Read_NullExtension ()
233 var o = new NullExtension ();
234 var r = new XamlObjectReader (o);
235 Read_NullOrNullExtension (r, o);
238 void Read_NullOrNullExtension (XamlObjectReader r, object instance)
240 Read_NullOrNullExtension (r, delegate {
241 Assert.AreEqual (instance, r.Instance, "#26"); // null and NullExtension are different here.
246 public void Read_StaticExtension ()
248 var r = new XamlObjectReader (new StaticExtension ("FooBar"));
249 Read_StaticExtension (r, XamlLanguage.PositionalParameters);
253 public void Read_ListInt32 ()
255 var obj = new List<int> (new int [] {5, -3, int.MaxValue, 0});
256 Read_ListInt32 (obj);
260 public void Read_ListInt32_2 ()
262 var obj = new List<int> (new int [0]);
263 Read_ListInt32 (obj);
266 void Read_ListInt32 (List<int> obj)
268 var r = new XamlObjectReader (obj);
269 Read_ListInt32 (r, delegate {
270 Assert.AreEqual (obj, r.Instance, "#26");
275 public void Read_ListType ()
277 var obj = new List<Type> (new Type [] {typeof (int), typeof (Dictionary<Type, XamlType>)}) { Capacity = 2 };
278 var r = new XamlObjectReader (obj);
279 Read_ListType (r, true);
283 public void Read_ListArray ()
285 var obj = new List<Array> (new Array [] { new int [] { 1,2,3}, new string [] { "foo", "bar", "baz" }}) { Capacity = 2 };
286 var r = new XamlObjectReader (obj);
291 public void Read_ArrayList ()
293 var obj = new ArrayList (new int [] {5, -3, 0});
294 var r = new XamlObjectReader (obj);
299 public void Read_Array ()
301 var obj = new int [] {5, -3, 0};
302 var r = new XamlObjectReader (obj);
303 Read_ArrayOrArrayExtension (r, obj);
307 public void Read_ArrayExtension ()
309 var obj = new ArrayExtension (new int [] {5, -3, 0});
310 var r = new XamlObjectReader (obj);
311 Read_ArrayOrArrayExtension (r, obj);
315 public void Read_MyArrayExtension ()
317 var obj = new MyArrayExtension (new int [] {5, -3, 0});
318 var r = new XamlObjectReader (obj);
319 Read_ArrayOrArrayExtensionOrMyArrayExtension (r, obj, typeof (MyArrayExtension));
322 void Read_ArrayOrArrayExtension (XamlObjectReader r, object instance)
324 Read_ArrayOrArrayExtensionOrMyArrayExtension (r, instance, typeof (ArrayExtension));
327 void Read_ArrayOrArrayExtensionOrMyArrayExtension (XamlObjectReader r, object instance, Type extType)
329 Read_ArrayOrArrayExtensionOrMyArrayExtension (r, delegate {
330 Assert.AreEqual (instance, r.Instance, "#26"); // different between Array and ArrayExtension. Also, different from Type and TypeExtension (Type returns TypeExtension, while Array remains to return Array)
335 public void Read_ArrayExtension2 ()
337 var r = new XamlObjectReader (new ArrayExtension (typeof (int)));
338 Read_ArrayExtension2 (r);
342 public void Read_DateTime ()
344 var obj = new DateTime (2010, 4, 15);
345 var r = new XamlObjectReader (obj);
346 Read_CommonClrType (r, obj);
347 Assert.AreEqual ("2010-04-15", Read_Initialization (r, null), "#1");
351 public void Read_TimeSpan ()
353 Read_CommonXamlPrimitive (TimeSpan.FromMinutes (4));
357 public void Read_Uri ()
359 Read_CommonXamlPrimitive (new Uri ("urn:foo"));
363 public void Read_Guid ()
365 var obj = Guid.NewGuid ();
366 var r = new XamlObjectReader (obj);
367 Assert.IsNotNull (r.SchemaContext.GetXamlType (typeof (Guid)).TypeConverter, "premise#1");
368 Read_CommonClrType (r, obj);
369 Assert.AreEqual (obj.ToString (), Read_Initialization (r, null), "#1");
373 [ExpectedException (typeof (XamlObjectReaderException))]
374 [Category ("NotWorking")]
375 public void Read_XData ()
377 var r = new XamlObjectReader (new XData () {Text = "xdata text"}); // XmlReader implementation is not visible.
383 [ExpectedException (typeof (XamlObjectReaderException))]
384 [Category ("NotWorking")]
385 public void Read_XDataWrapper ()
387 var obj = new XDataWrapper () { Markup = new XData () {Text = "<my_xdata/>" } };
388 var r = new XamlObjectReader (obj);
394 public void ReadStandardTypes ()
396 SimpleReadStandardType (new ArrayExtension ());
397 SimpleReadStandardType (new NullExtension ());
398 SimpleReadStandardType (new PropertyDefinition ());
399 SimpleReadStandardType (new Reference ());
400 SimpleReadStandardType (new StaticExtension ());
401 SimpleReadStandardType (new TypeExtension ());
404 void SimpleReadStandardType (object instance)
406 var r = new XamlObjectReader (instance);
412 public void Read_CustomMarkupExtension ()
414 var r = new XamlObjectReader (new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"});
415 Read_CustomMarkupExtension (r);
419 public void Read_CustomMarkupExtension2 ()
421 var r = new XamlObjectReader (new MyExtension2 () { Foo = typeof (int), Bar = "v2"});
422 Read_CustomMarkupExtension2 (r);
426 public void Read_CustomMarkupExtension3 ()
428 var r = new XamlObjectReader (new MyExtension3 () { Foo = typeof (int), Bar = "v2"});
429 Read_CustomMarkupExtension3 (r);
433 public void Read_CustomMarkupExtension4 ()
435 var r = new XamlObjectReader (new MyExtension4 () { Foo = typeof (int), Bar = "v2"});
436 Read_CustomMarkupExtension4 (r);
440 public void Read_CustomMarkupExtension5 ()
442 // This cannot be written to XamlXmlWriter though...
444 var r = new XamlObjectReader (new MyExtension5 ("foo", "bar"));
445 Read_CustomMarkupExtension5 (r);
449 public void Read_CustomMarkupExtension6 ()
451 var r = new XamlObjectReader (new MyExtension6 ("foo"));
452 Read_CustomMarkupExtension6 (r);
456 public void Read_ArgumentAttributed ()
458 var obj = new ArgumentAttributed ("foo", "bar");
459 var r = new XamlObjectReader (obj);
460 Read_ArgumentAttributed (r, obj);
464 public void Read_Dictionary ()
466 var obj = new Dictionary<string,object> ();
469 var r = new XamlObjectReader (obj);
474 public void Read_Dictionary2 ()
476 var obj = new Dictionary<string,Type> ();
477 obj ["Foo"] = typeof (int);
478 obj ["Bar"] = typeof (Dictionary<Type,XamlType>);
479 var r = new XamlObjectReader (obj);
480 Read_Dictionary2 (r, XamlLanguage.PositionalParameters);
484 public void PositionalParameters1 ()
486 // Note: this can be read, but cannot be written to XML.
487 var obj = new PositionalParametersClass1 ("foo", 5);
488 var r = new XamlObjectReader (obj);
489 PositionalParameters1 (r);
493 public void PositionalParameters2 ()
495 var obj = new PositionalParametersWrapper ("foo", 5);
496 var r = new XamlObjectReader (obj);
497 PositionalParameters2 (r);
501 public void ComplexPositionalParameters ()
503 var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
504 var r = new XamlObjectReader (obj);
505 ComplexPositionalParameters (r);
509 public void Read_ListWrapper ()
511 var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}));
512 var r = new XamlObjectReader (obj);
513 Read_ListWrapper (r);
517 public void Read_ListWrapper2 () // read-write list member.
519 var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}));
520 var r = new XamlObjectReader (obj);
521 Read_ListWrapper2 (r);
525 public void Read_ContentIncluded ()
527 var obj = new ContentIncludedClass () { Content = "foo" };
528 var r = new XamlObjectReader (obj);
529 Read_ContentIncluded (r);
533 public void Read_PropertyDefinition ()
535 var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
536 var r = new XamlObjectReader (obj);
537 Read_PropertyDefinition (r);
541 public void Read_StaticExtensionWrapper ()
543 var obj = new StaticExtensionWrapper () { Param = new StaticExtension ("StaticExtensionWrapper.Foo") };
544 var r = new XamlObjectReader (obj);
545 Read_StaticExtensionWrapper (r);
549 public void Read_TypeExtensionWrapper ()
551 var obj = new TypeExtensionWrapper () { Param = new TypeExtension ("Foo") };
552 var r = new XamlObjectReader (obj);
553 Read_TypeExtensionWrapper (r);
557 public void Read_EventContainer ()
559 var obj = new EventContainer ();
560 obj.Run += delegate { Console.Error.WriteLine ("done"); };
561 var xr = new XamlObjectReader (obj);
562 Read_EventContainer (xr);
566 public void Read_NamedItems ()
572 var obj = new NamedItem ("foo");
573 var obj2 = new NamedItem ("bar");
574 obj.References.Add (obj2);
575 obj.References.Add (new NamedItem ("baz"));
576 obj2.References.Add (obj);
578 var xr = new XamlObjectReader (obj);
579 Read_NamedItems (xr, true);
583 public void Read_NamedItems2 ()
590 var obj = new NamedItem2 ("i1");
591 var obj2 = new NamedItem2 ("i2");
592 var obj3 = new NamedItem2 ("i3");
593 var obj4 = new NamedItem2 ("i4");
594 obj.References.Add (obj2);
595 obj.References.Add (obj4);
596 obj2.References.Add (obj3);
597 obj4.References.Add (obj3);
599 var xr = new XamlObjectReader (obj);
600 Read_NamedItems2 (xr, true);
604 public void Read_XmlSerializableWrapper ()
606 var obj = new XmlSerializableWrapper (new XmlSerializable ("<root/>"));
607 var xr = new XamlObjectReader (obj);
608 Read_XmlSerializableWrapper (xr, true);
611 [Test] // If it is root, it is not serialized as IXmlSerializable.
612 public void Read_XmlSerializable ()
614 var obj = new XmlSerializable ("<root/>");
615 var xr = new XamlObjectReader (obj);
616 Read_XmlSerializable (xr);
619 [Test] // List contents are (sort of) treated as top-level too, so it is not serialized as IXmlSerializable(!)
620 public void Read_ListXmlSerializable ()
622 var obj = new List<XmlSerializable> ();
623 obj.Add (new XmlSerializable ("<root/>"));
624 var xr = new XamlObjectReader (obj);
625 Read_ListXmlSerializable (xr);
629 public void Read_AttachedProperty ()
631 var obj = new AttachedWrapper ();
632 Attachable.SetFoo (obj, "x");
633 Attachable.SetFoo (obj.Value, "y");
635 var xr = new XamlObjectReader (obj);
636 Read_AttachedProperty (xr);
638 Attachable.SetFoo (obj, null);
639 Attachable.SetFoo (obj.Value, null);
644 [Ignore ("Foo does not work as attached properties in this test yet")]
645 public void Read_AttachedProperty2 ()
647 var obj = new AttachedWrapper2 ();
648 AttachedWrapper2.SetFoo (obj, "x");
649 AttachedWrapper2.SetFoo (obj.Value, "y");
651 var xr = new XamlObjectReader (obj);
652 //while (xr.Read ()) Console.Error.WriteLine ("{0} {1} {2} {3}", xr.NodeType, xr.Type, xr.Member, xr.Value);
654 AttachedWrapper2.SetFoo (obj, null);
655 AttachedWrapper2.SetFoo (obj.Value, null);
660 public void Read_AbstractContainer ()
662 var obj = new AbstractContainer () { Value2 = new DerivedObject () { Foo = "x" } };
663 var xr = new XamlObjectReader (obj);
669 public void Read_ReadOnlyPropertyContainer ()
671 var obj = new ReadOnlyPropertyContainer () { Foo = "x" };
672 var xr = new XamlObjectReader (obj);
673 var xt = xr.SchemaContext.GetXamlType (obj.GetType ());
675 if (xr.NodeType == XamlNodeType.StartMember)
677 Assert.AreEqual (xt.GetMember ("Foo"), xr.Member, "#1");
683 public void Read_TypeConverterOnListMember ()
685 var obj = new SecondTest.TypeOtherAssembly ();
686 obj.Values.AddRange (new uint? [] {1, 2, 3});
687 var xr = new XamlObjectReader (obj);
688 Read_TypeConverterOnListMember (xr);
692 public void Read_EnumContainer ()
694 var obj = new EnumContainer () { EnumProperty = EnumValueType.Two };
695 var xr = new XamlObjectReader (obj);
696 Read_EnumContainer (xr);
700 public void Read_CollectionContentProperty ()
702 var obj = new CollectionContentProperty ();
703 for (int i = 0; i < 4; i++)
704 obj.ListOfItems.Add (new SimpleClass ());
705 var xr = new XamlObjectReader (obj);
706 Read_CollectionContentProperty (xr, false);
710 public void Read_CollectionContentPropertyX ()
712 var obj = new CollectionContentPropertyX ();
713 var l = new List<object> ();
714 obj.ListOfItems.Add (l);
715 for (int i = 0; i < 4; i++)
716 l.Add (new SimpleClass ());
717 var xr = new XamlObjectReader (obj);
718 Read_CollectionContentPropertyX (xr, false);
722 [Category ("NotWorking")] // only member ordering difference, maybe.
723 public void Read_AmbientPropertyContainer ()
725 var obj = new SecondTest.ResourcesDict ();
726 var t1 = new SecondTest.TestObject ();
727 obj.Add ("TestDictItem", t1);
728 var t2 = new SecondTest.TestObject ();
729 t2.TestProperty = t1;
730 obj.Add ("okay", t2);
731 var xr = new XamlObjectReader (obj);
732 Read_AmbientPropertyContainer (xr, false);
736 [Category ("NotWorking")] // only member ordering difference, maybe.
737 public void Read_AmbientPropertyContainer2 ()
739 var obj = new SecondTest.ResourcesDict ();
740 var t1 = new SecondTest.TestObject ();
741 obj.Add ("TestDictItem", t1);
742 obj.Add ("okay", new SecondTest.ResourceExtension (t1));
743 var xr = new XamlObjectReader (obj);
744 Read_AmbientPropertyContainer (xr, true);
748 public void Read_NullableContainer ()
750 var obj = new NullableContainer () { TestProp = 5 };
751 var xr = new XamlObjectReader (obj);
752 Read_NullableContainer (xr);