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");
148 public void Read_XmlDocument ()
150 var doc = new XmlDocument ();
151 doc.LoadXml ("<root xmlns='urn:foo'><elem attr='val' /></root>");
152 var r = new XamlObjectReader (doc);
153 Read_XmlDocument (r);
157 public void Read_NonPrimitive ()
159 var r = new XamlObjectReader (new TestClass3 ());
160 Read_NonPrimitive (r);
164 public void Read_Type ()
166 var r = new XamlObjectReader (typeof (int));
167 Read_TypeOrTypeExtension (r);
171 public void Read_TypeExtension ()
173 var tx = new TypeExtension (typeof (int));
174 var r = new XamlObjectReader (tx);
175 Read_TypeOrTypeExtension (r);
178 void Read_TypeOrTypeExtension (XamlObjectReader r)
180 Read_TypeOrTypeExtension (r, delegate {
181 Assert.IsTrue (r.Instance is TypeExtension, "#26");
182 }, XamlLanguage.PositionalParameters);
186 public void Read_Type2 ()
188 var r = new XamlObjectReader (typeof (TestClass1));
189 Read_TypeOrTypeExtension2 (r);
193 public void Read_TypeExtension2 ()
195 var r = new XamlObjectReader (new TypeExtension (typeof (TestClass1)));
196 Read_TypeOrTypeExtension2 (r);
199 void Read_TypeOrTypeExtension2 (XamlObjectReader r)
201 Read_TypeOrTypeExtension2 (r, delegate {
202 Assert.IsTrue (r.Instance is TypeExtension, "#26");
203 }, XamlLanguage.PositionalParameters);
207 public void Read_Reference ()
209 var r = new XamlObjectReader (new Reference ("FooBar"));
214 public void Read_Null ()
216 var r = new XamlObjectReader (null);
217 Read_NullOrNullExtension (r, (object) null);
221 public void Read_NullExtension ()
223 var o = new NullExtension ();
224 var r = new XamlObjectReader (o);
225 Read_NullOrNullExtension (r, o);
228 void Read_NullOrNullExtension (XamlObjectReader r, object instance)
230 Read_NullOrNullExtension (r, delegate {
231 Assert.AreEqual (instance, r.Instance, "#26"); // null and NullExtension are different here.
236 public void Read_StaticExtension ()
238 var r = new XamlObjectReader (new StaticExtension ("FooBar"));
239 Read_StaticExtension (r, XamlLanguage.PositionalParameters);
243 public void Read_ListInt32 ()
245 var obj = new List<int> (new int [] {5, -3, int.MaxValue, 0});
246 Read_ListInt32 (obj);
250 public void Read_ListInt32_2 ()
252 var obj = new List<int> (new int [0]);
253 Read_ListInt32 (obj);
256 void Read_ListInt32 (List<int> obj)
258 var r = new XamlObjectReader (obj);
259 Read_ListInt32 (r, delegate {
260 Assert.AreEqual (obj, r.Instance, "#26");
265 public void Read_ListType ()
267 var obj = new List<Type> (new Type [] {typeof (int), typeof (Dictionary<Type, XamlType>)}) { Capacity = 2 };
268 var r = new XamlObjectReader (obj);
269 Read_ListType (r, true);
273 public void Read_ListArray ()
275 var obj = new List<Array> (new Array [] { new int [] { 1,2,3}, new string [] { "foo", "bar", "baz" }}) { Capacity = 2 };
276 var r = new XamlObjectReader (obj);
281 public void Read_ArrayList ()
283 var obj = new ArrayList (new int [] {5, -3, 0});
284 var r = new XamlObjectReader (obj);
289 public void Read_Array ()
291 var obj = new int [] {5, -3, 0};
292 var r = new XamlObjectReader (obj);
293 Read_ArrayOrArrayExtension (r, obj);
297 public void Read_ArrayExtension ()
299 var obj = new ArrayExtension (new int [] {5, -3, 0});
300 var r = new XamlObjectReader (obj);
301 Read_ArrayOrArrayExtension (r, obj);
305 public void Read_MyArrayExtension ()
307 var obj = new MyArrayExtension (new int [] {5, -3, 0});
308 var r = new XamlObjectReader (obj);
309 Read_ArrayOrArrayExtensionOrMyArrayExtension (r, obj, typeof (MyArrayExtension));
312 void Read_ArrayOrArrayExtension (XamlObjectReader r, object instance)
314 Read_ArrayOrArrayExtensionOrMyArrayExtension (r, instance, typeof (ArrayExtension));
317 void Read_ArrayOrArrayExtensionOrMyArrayExtension (XamlObjectReader r, object instance, Type extType)
319 Read_ArrayOrArrayExtensionOrMyArrayExtension (r, delegate {
320 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)
325 public void Read_ArrayExtension2 ()
327 var r = new XamlObjectReader (new ArrayExtension (typeof (int)));
328 Read_ArrayExtension2 (r);
332 public void Read_DateTime ()
334 var obj = new DateTime (2010, 4, 15);
335 var r = new XamlObjectReader (obj);
336 Read_CommonClrType (r, obj);
337 Assert.AreEqual ("2010-04-15", Read_Initialization (r, null), "#1");
341 public void Read_TimeSpan ()
343 Read_CommonXamlPrimitive (TimeSpan.FromMinutes (4));
347 public void Read_Uri ()
349 Read_CommonXamlPrimitive (new Uri ("urn:foo"));
353 public void Read_Guid ()
355 var obj = Guid.NewGuid ();
356 var r = new XamlObjectReader (obj);
357 Assert.IsNotNull (r.SchemaContext.GetXamlType (typeof (Guid)).TypeConverter, "premise#1");
358 Read_CommonClrType (r, obj);
359 Assert.AreEqual (obj.ToString (), Read_Initialization (r, null), "#1");
363 [ExpectedException (typeof (XamlObjectReaderException))]
364 [Category ("NotWorking")]
365 public void Read_XData ()
367 var r = new XamlObjectReader (new XData () {Text = "xdata text"}); // XmlReader implementation is not visible.
373 [ExpectedException (typeof (XamlObjectReaderException))]
374 [Category ("NotWorking")]
375 public void Read_XDataWrapper ()
377 var obj = new XDataWrapper () { Markup = new XData () {Text = "<my_xdata/>" } };
378 var r = new XamlObjectReader (obj);
384 public void ReadStandardTypes ()
386 SimpleReadStandardType (new ArrayExtension ());
387 SimpleReadStandardType (new NullExtension ());
388 SimpleReadStandardType (new PropertyDefinition ());
389 SimpleReadStandardType (new Reference ());
390 SimpleReadStandardType (new StaticExtension ());
391 SimpleReadStandardType (new TypeExtension ());
394 void SimpleReadStandardType (object instance)
396 var r = new XamlObjectReader (instance);
402 public void Read_CustomMarkupExtension ()
404 var r = new XamlObjectReader (new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"});
405 Read_CustomMarkupExtension (r);
409 public void Read_CustomMarkupExtension2 ()
411 var r = new XamlObjectReader (new MyExtension2 () { Foo = typeof (int), Bar = "v2"});
412 Read_CustomMarkupExtension2 (r);
416 public void Read_CustomMarkupExtension3 ()
418 var r = new XamlObjectReader (new MyExtension3 () { Foo = typeof (int), Bar = "v2"});
419 Read_CustomMarkupExtension3 (r);
423 public void Read_CustomMarkupExtension4 ()
425 var r = new XamlObjectReader (new MyExtension4 () { Foo = typeof (int), Bar = "v2"});
426 Read_CustomMarkupExtension4 (r);
430 public void Read_CustomMarkupExtension5 ()
432 // This cannot be written to XamlXmlWriter though...
434 var r = new XamlObjectReader (new MyExtension5 ("foo", "bar"));
435 Read_CustomMarkupExtension5 (r);
439 public void Read_CustomMarkupExtension6 ()
441 var r = new XamlObjectReader (new MyExtension6 ("foo"));
442 Read_CustomMarkupExtension6 (r);
446 public void Read_ArgumentAttributed ()
448 var obj = new ArgumentAttributed ("foo", "bar");
449 var r = new XamlObjectReader (obj);
450 Read_ArgumentAttributed (r, obj);
454 public void Read_Dictionary ()
456 var obj = new Dictionary<string,object> ();
459 var r = new XamlObjectReader (obj);
464 public void Read_Dictionary2 ()
466 var obj = new Dictionary<string,Type> ();
467 obj ["Foo"] = typeof (int);
468 obj ["Bar"] = typeof (Dictionary<Type,XamlType>);
469 var r = new XamlObjectReader (obj);
470 Read_Dictionary2 (r, XamlLanguage.PositionalParameters);
474 public void PositionalParameters1 ()
476 // Note: this can be read, but cannot be written to XML.
477 var obj = new PositionalParametersClass1 ("foo", 5);
478 var r = new XamlObjectReader (obj);
479 PositionalParameters1 (r);
483 public void PositionalParameters2 ()
485 var obj = new PositionalParametersWrapper ("foo", 5);
486 var r = new XamlObjectReader (obj);
487 PositionalParameters2 (r);
491 public void ComplexPositionalParameters ()
493 var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
494 var r = new XamlObjectReader (obj);
495 ComplexPositionalParameters (r);
499 public void Read_ListWrapper ()
501 var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}));
502 var r = new XamlObjectReader (obj);
503 Read_ListWrapper (r);
507 public void Read_ListWrapper2 () // read-write list member.
509 var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}));
510 var r = new XamlObjectReader (obj);
511 Read_ListWrapper2 (r);
515 public void Read_ContentIncluded ()
517 var obj = new ContentIncludedClass () { Content = "foo" };
518 var r = new XamlObjectReader (obj);
519 Read_ContentIncluded (r);
523 public void Read_PropertyDefinition ()
525 var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
526 var r = new XamlObjectReader (obj);
527 Read_PropertyDefinition (r);
531 public void Read_StaticExtensionWrapper ()
533 var obj = new StaticExtensionWrapper () { Param = new StaticExtension ("StaticExtensionWrapper.Foo") };
534 var r = new XamlObjectReader (obj);
535 Read_StaticExtensionWrapper (r);
539 public void Read_TypeExtensionWrapper ()
541 var obj = new TypeExtensionWrapper () { Param = new TypeExtension ("Foo") };
542 var r = new XamlObjectReader (obj);
543 Read_TypeExtensionWrapper (r);
547 public void Read_EventContainer ()
549 var obj = new EventContainer ();
550 obj.Run += delegate { Console.Error.WriteLine ("done"); };
551 var xr = new XamlObjectReader (obj);
552 Read_EventContainer (xr);
556 public void Read_NamedItems ()
562 var obj = new NamedItem ("foo");
563 var obj2 = new NamedItem ("bar");
564 obj.References.Add (obj2);
565 obj.References.Add (new NamedItem ("baz"));
566 obj2.References.Add (obj);
568 var xr = new XamlObjectReader (obj);
569 Read_NamedItems (xr, true);
573 public void Read_NamedItems2 ()
580 var obj = new NamedItem2 ("i1");
581 var obj2 = new NamedItem2 ("i2");
582 var obj3 = new NamedItem2 ("i3");
583 var obj4 = new NamedItem2 ("i4");
584 obj.References.Add (obj2);
585 obj.References.Add (obj4);
586 obj2.References.Add (obj3);
587 obj4.References.Add (obj3);
589 var xr = new XamlObjectReader (obj);
590 Read_NamedItems2 (xr, true);
594 [Category ("NotWorking")]
595 public void Read_XmlSerializableWrapper ()
597 var obj = new XmlSerializableWrapper (new XmlSerializable ("<root/>"));
598 var xr = new XamlObjectReader (obj);
599 Read_XmlSerializableWrapper (xr, true);
602 [Test] // If it is root, it is not serialized as IXmlSerializable.
603 public void Read_XmlSerializable ()
605 var obj = new XmlSerializable ("<root/>");
606 var xr = new XamlObjectReader (obj);
607 Read_XmlSerializable (xr);
610 [Test] // List contents are (sort of) treated as top-level too, so it is not serialized as IXmlSerializable(!)
611 public void Read_ListXmlSerializable ()
613 var obj = new List<XmlSerializable> ();
614 obj.Add (new XmlSerializable ("<root/>"));
615 var xr = new XamlObjectReader (obj);
616 Read_ListXmlSerializable (xr);