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 Category = NUnit.Framework.CategoryAttribute;
38 // Some test result remarks:
39 // - TypeExtension: [ConstructorArgument] -> PositionalParameters
40 // - StaticExtension: almost identical to TypeExtension
41 // - Reference: [ConstructorArgument], [ContentProperty] -> only ordinal member.
42 // - ArrayExtension: [ConstrutorArgument], [ContentProperty] -> no PositionalParameters, Items.
43 // - NullExtension: no member.
44 // - MyExtension: [ConstructorArgument] -> only ordinal members...hmm?
46 namespace MonoTests.System.Xaml
49 public class XamlObjectReaderTest
52 public void ConstructorNullObject ()
55 new XamlObjectReader (null);
59 [ExpectedException (typeof (ArgumentNullException))]
60 public void ConstructorNullSchemaContext ()
62 new XamlObjectReader ("foo", (XamlSchemaContext) null);
66 public void ConstructorNullSettings ()
68 new XamlObjectReader ("foo", (XamlObjectReaderSettings) null);
72 [ExpectedException (typeof (ArgumentNullException))]
73 public void ConstructorNullSchemaContext2 ()
75 new XamlObjectReader ("foo", null, new XamlObjectReaderSettings ());
79 public void ConstructorNullSettings2 ()
81 new XamlObjectReader ("foo", new XamlSchemaContext (null, null), null);
85 public void ReadNull ()
87 var r = new XamlObjectReader (null);
88 Assert.IsTrue (r.Read (), "#1");
89 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1-2");
90 Assert.IsTrue (r.Read (), "#2");
91 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-2");
92 Assert.AreEqual (XamlLanguage.Null, r.Type, "#2-3");
93 Assert.IsTrue (r.Read (), "#3");
94 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#3-2");
95 Assert.IsFalse (r.Read (), "#4");
96 Assert.AreEqual (XamlNodeType.None, r.NodeType, "#4-2");
102 var r = new XamlObjectReader ("Foo");
103 Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
104 Assert.IsNull (r.Member, "#2");
105 Assert.IsNull (r.Namespace, "#3");
106 Assert.IsNull (r.Member, "#4");
107 Assert.IsNull (r.Type, "#5");
108 Assert.IsNull (r.Value, "#6");
110 Assert.IsTrue (r.Read (), "#11");
111 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
112 Assert.IsNotNull (r.Namespace, "#13");
113 Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
114 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
116 Assert.IsTrue (r.Read (), "#21");
117 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
118 Assert.IsNotNull (r.Type, "#23");
119 Assert.AreEqual (new XamlType (typeof (string), r.SchemaContext), r.Type, "#23-2");
120 Assert.IsNull (r.Namespace, "#25");
122 Assert.IsTrue (r.Read (), "#31");
123 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
124 Assert.IsNotNull (r.Member, "#33");
125 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#33-2");
126 Assert.IsNull (r.Type, "#34");
128 Assert.IsTrue (r.Read (), "#41");
129 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
130 Assert.AreEqual ("Foo", r.Value, "#43");
131 Assert.IsNull (r.Member, "#44");
133 Assert.IsTrue (r.Read (), "#51");
134 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
135 Assert.IsNull (r.Type, "#53");
136 Assert.IsNull (r.Member, "#54");
138 Assert.IsTrue (r.Read (), "#61");
139 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
140 Assert.IsNull (r.Type, "#63");
142 Assert.IsFalse (r.Read (), "#71");
143 Assert.IsTrue (r.IsEof, "#72");
147 [ExpectedException (typeof (XamlObjectReaderException))]
148 public void ReadNonConstructible ()
150 // XamlType has no default constructor.
151 var r = new XamlObjectReader (XamlLanguage.String);
155 [ExpectedException (typeof (XamlObjectReaderException))]
156 public void NonPublicType ()
158 new XamlObjectReader (new TestClass1 ());
162 [ExpectedException (typeof (XamlObjectReaderException))]
163 public void NestedType ()
165 new XamlObjectReader (new TestClass2 ());
168 public class TestClass2
173 public void ConstructibleType ()
175 new XamlObjectReader (new TestClass3 ());
181 var r = new XamlObjectReader ("Foo");
183 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
185 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2");
187 Assert.IsTrue (r.IsEof, "#3");
193 var r = new XamlObjectReader ("Foo");
194 r.Read (); // NamespaceDeclaration
196 r.Read (); // Member (Initialization)
197 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#1");
199 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#2");
201 Assert.IsTrue (r.IsEof, "#3");
205 [Category ("NotWorking")]
208 var doc = new XmlDocument ();
209 doc.LoadXml ("<root xmlns='urn:foo'><elem attr='val' /></root>");
210 var r = new XamlObjectReader (doc);
212 for (int i = 0; i < 3; i++) {
214 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1-" + i);
218 Assert.AreEqual (new XamlType (typeof (XmlDocument), r.SchemaContext), r.Type, "#2");
220 var l = new List<XamlMember> ();
221 for (int i = 0; i < 5; i++) {
222 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-" + i);
226 l.First (m => m.Name == "Value");
227 l.First (m => m.Name == "InnerXml");
228 l.First (m => m.Name == "Prefix");
229 l.First (m => m.Name == "PreserveWhitespace");
230 l.First (m => m.Name == "Schemas");
231 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#4");
232 Assert.IsFalse (r.Read (), "#5");
236 public void Read_NonPrimitive ()
238 var r = new XamlObjectReader (new TestClass3 ());
239 Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
240 Assert.IsTrue (r.Read (), "#6");
241 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
242 Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#7-2");
243 Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#7-3");
245 Assert.IsTrue (r.Read (), "#11");
246 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
247 Assert.AreEqual ("x", r.Namespace.Prefix, "#12-2");
248 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#12-3");
250 Assert.IsTrue (r.Read (), "#16");
251 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#17");
252 var xt = new XamlType (typeof (TestClass3), r.SchemaContext);
253 Assert.AreEqual (xt, r.Type, "#17-2");
254 Assert.IsTrue (r.Instance is TestClass3, "#17-3");
256 Assert.IsTrue (r.Read (), "#21");
257 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#22");
258 Assert.AreEqual (xt.GetMember ("Nested"), r.Member, "#22-2");
260 Assert.IsTrue (r.Read (), "#26");
261 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#27");
262 Assert.AreEqual (XamlLanguage.Null, r.Type, "#27-2");
263 Assert.IsNull (r.Instance, "#27-3");
265 Assert.IsTrue (r.Read (), "#31");
266 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#32");
268 Assert.IsTrue (r.Read (), "#36");
269 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#37");
271 Assert.IsTrue (r.Read (), "#41");
272 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#42");
274 Assert.IsFalse (r.Read (), "#46");
275 Assert.IsTrue (r.IsEof, "#47");
279 public void Read_Type ()
281 var r = new XamlObjectReader (typeof (int));
282 Read_TypeOrTypeExtension (r);
286 public void Read_TypeExtension ()
288 var r = new XamlObjectReader (new TypeExtension (typeof (int)));
289 Read_TypeOrTypeExtension (r);
292 void Read_TypeOrTypeExtension (XamlObjectReader r)
294 Assert.IsTrue (r.Read (), "#11");
295 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
296 Assert.IsNotNull (r.Namespace, "#13");
297 Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
298 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
299 Assert.IsNull (r.Instance, "#14");
301 Assert.IsTrue (r.Read (), "#21");
302 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
303 Assert.IsNotNull (r.Type, "#23");
304 Assert.AreEqual (new XamlType (typeof (TypeExtension), r.SchemaContext), r.Type, "#23-2");
305 Assert.IsNull (r.Namespace, "#25");
306 Assert.IsTrue (r.Instance is TypeExtension, "#26");
308 Assert.IsTrue (r.Read (), "#31");
309 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
310 Assert.IsNotNull (r.Member, "#33");
311 Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#33-2");
312 Assert.IsNull (r.Type, "#34");
313 Assert.IsNull (r.Instance, "#35");
315 Assert.IsTrue (r.Read (), "#41");
316 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
317 Assert.IsNotNull (r.Value, "#43");
318 Assert.AreEqual ("x:Int32", r.Value, "#43-2");
319 Assert.IsNull (r.Member, "#44");
320 Assert.IsNull (r.Instance, "#45");
322 Assert.IsTrue (r.Read (), "#51");
323 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
324 Assert.IsNull (r.Type, "#53");
325 Assert.IsNull (r.Member, "#54");
326 Assert.IsNull (r.Instance, "#55");
328 Assert.IsTrue (r.Read (), "#61");
329 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
330 Assert.IsNull (r.Type, "#63");
332 Assert.IsFalse (r.Read (), "#71");
333 Assert.IsTrue (r.IsEof, "#72");
337 [Category ("NotWorking")] // namespace node differences
338 public void Read_Type2 ()
340 var r = new XamlObjectReader (typeof (TestClass1));
341 Read_TypeOrTypeExtension2 (r);
345 [Category ("NotWorking")] // namespace node differences
346 public void Read_TypeExtension2 ()
348 var r = new XamlObjectReader (new TypeExtension (typeof (TestClass1)));
349 Read_TypeOrTypeExtension2 (r);
352 void Read_TypeOrTypeExtension2 (XamlObjectReader r)
354 Assert.IsTrue (r.Read (), "#11");
355 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
357 var nsmap = new Dictionary<string,string> ();
358 nsmap ["x"] = XamlLanguage.Xaml2006Namespace;
359 nsmap [String.Empty] = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
361 Assert.IsTrue (nsmap.ContainsKey (r.Namespace.Prefix), "#13-2");
362 Assert.AreEqual (nsmap [r.Namespace.Prefix], r.Namespace.Namespace, "#13-3:" + r.Namespace.Prefix);
363 nsmap.Remove (r.Namespace.Prefix);
365 Assert.IsTrue (r.Read (), "#16");
366 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#17");
367 Assert.IsNotNull (r.Namespace, "#18");
368 Assert.IsTrue (nsmap.ContainsKey (r.Namespace.Prefix), "#18-2");
369 Assert.AreEqual (nsmap [r.Namespace.Prefix], r.Namespace.Namespace, "#18-3:" + r.Namespace.Prefix);
370 nsmap.Remove (r.Namespace.Prefix);
372 Assert.IsTrue (r.Read (), "#21");
373 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
374 Assert.AreEqual (new XamlType (typeof (TypeExtension), r.SchemaContext), r.Type, "#23-2");
375 Assert.IsTrue (r.Instance is TypeExtension, "#26");
377 Assert.IsTrue (r.Read (), "#31");
378 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
379 Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#33-2");
381 Assert.IsTrue (r.Read (), "#41");
382 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
383 Assert.AreEqual ("TestClass1", r.Value, "#43-2");
385 Assert.IsTrue (r.Read (), "#51");
386 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
388 Assert.IsTrue (r.Read (), "#61");
389 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
391 Assert.IsFalse (r.Read (), "#71");
392 Assert.IsTrue (r.IsEof, "#72");
396 public void Read_Reference ()
398 var r = new XamlObjectReader (new Reference ("TestName"));
399 Assert.IsTrue (r.Read (), "#11");
400 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
401 Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
402 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
404 Assert.IsTrue (r.Read (), "#21");
405 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
406 var xt = new XamlType (typeof (Reference), r.SchemaContext);
407 Assert.AreEqual (xt, r.Type, "#23-2");
408 Assert.IsTrue (r.Instance is Reference, "#26");
410 Assert.IsTrue (r.Read (), "#31");
411 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
412 // unlike TypeExtension there is no PositionalParameters.
413 Assert.AreEqual (xt.GetMember ("Name"), r.Member, "#33-2");
415 // It is a ContentProperty (besides [ConstructorArgument])
416 Assert.IsTrue (r.Read (), "#41");
417 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
418 Assert.AreEqual ("TestName", r.Value, "#43-2");
420 Assert.IsTrue (r.Read (), "#51");
421 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
423 Assert.IsTrue (r.Read (), "#61");
424 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
426 Assert.IsFalse (r.Read (), "#71");
427 Assert.IsTrue (r.IsEof, "#72");
432 public void Read_Null ()
434 var r = new XamlObjectReader (null);
435 Read_NullOrNullExtension (r, null);
439 public void Read_NullExtension ()
441 var o = new NullExtension ();
442 var r = new XamlObjectReader (o);
443 Read_NullOrNullExtension (r, o);
446 void Read_NullOrNullExtension (XamlObjectReader r, object instance)
448 Assert.IsTrue (r.Read (), "#11");
449 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
450 Assert.IsNotNull (r.Namespace, "#13");
451 Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
452 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
453 Assert.IsNull (r.Instance, "#14");
455 Assert.IsTrue (r.Read (), "#21");
456 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
457 Assert.AreEqual (new XamlType (typeof (NullExtension), r.SchemaContext), r.Type, "#23-2");
458 Assert.AreEqual (instance, r.Instance, "#26"); // null and NullExtension are different here.
460 Assert.IsTrue (r.Read (), "#61");
461 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
463 Assert.IsFalse (r.Read (), "#71");
464 Assert.IsTrue (r.IsEof, "#72");
467 [Test] // almost identical to TypeExtension (only type/instance difference)
468 [Category ("NotWorking")]
469 public void Read_StaticExtension ()
471 var r = new XamlObjectReader (new StaticExtension ("MyMember"));
472 Assert.IsTrue (r.Read (), "#11");
473 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
474 Assert.IsNotNull (r.Namespace, "#13");
475 Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
476 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
477 Assert.IsNull (r.Instance, "#14");
479 Assert.IsTrue (r.Read (), "#21");
480 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
481 Assert.AreEqual (new XamlType (typeof (StaticExtension), r.SchemaContext), r.Type, "#23-2");
482 Assert.IsTrue (r.Instance is StaticExtension, "#26");
484 Assert.IsTrue (r.Read (), "#31");
485 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
486 Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#33-2");
488 Assert.IsTrue (r.Read (), "#41");
489 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
490 Assert.AreEqual ("MyMember", r.Value, "#43-2");
492 Assert.IsTrue (r.Read (), "#51");
493 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
495 Assert.IsTrue (r.Read (), "#61");
496 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
498 Assert.IsFalse (r.Read (), "#71");
499 Assert.IsTrue (r.IsEof, "#72");
503 [Category ("NotWorking")]
504 public void Read_Array ()
506 var obj = new int [] {5, -3, 0};
507 var r = new XamlObjectReader (obj);
508 Read_ArrayOrArrayExtension (r, obj);
512 [Category ("NotWorking")]
513 public void Read_ArrayExtension ()
515 var obj = new ArrayExtension (new int [] {5, -3, 0});
516 var r = new XamlObjectReader (obj);
517 Read_ArrayOrArrayExtension (r, obj);
520 void Read_ArrayOrArrayExtension (XamlObjectReader r, object instance)
522 Assert.IsTrue (r.Read (), "#11");
523 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
524 Assert.IsNotNull (r.Namespace, "#13");
525 Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
526 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
528 Assert.IsTrue (r.Read (), "#21");
529 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
530 var xt = new XamlType (typeof (ArrayExtension), r.SchemaContext);
531 Assert.AreEqual (xt, r.Type, "#23");
532 Assert.AreEqual (instance, r.Instance, "#26"); // different between Array and ArrayExtension
534 Assert.IsTrue (r.Read (), "#31");
535 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
536 Assert.AreEqual (xt.GetMember ("Type"), r.Member, "#33");
538 Assert.IsTrue (r.Read (), "#41");
539 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
540 Assert.AreEqual ("x:Int32", r.Value, "#43");
542 Assert.IsTrue (r.Read (), "#51");
543 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
545 Assert.IsTrue (r.Read (), "#61");
546 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
547 Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
549 Assert.IsTrue (r.Read (), "#71");
550 Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "#71-2");
551 Assert.IsNull (r.Type, "#71-3");
552 Assert.IsNull (r.Member, "#71-4");
553 Assert.IsNull (r.Value, "#71-5");
555 Assert.IsTrue (r.Read (), "#72");
556 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
557 Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
559 string [] values = {"5", "-3", "0"};
560 for (int i = 0; i < 3; i++) {
561 Assert.IsTrue (r.Read (), i + "#73");
562 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
563 Assert.IsTrue (r.Read (), i + "#74");
564 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
565 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
566 Assert.IsTrue (r.Read (), i + "#75");
567 Assert.IsNotNull (r.Value, i + "#75-2");
568 Assert.AreEqual (values [i], r.Value, i + "#73-3");
569 Assert.IsTrue (r.Read (), i + "#74");
570 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
571 Assert.IsTrue (r.Read (), i + "#75");
572 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
575 Assert.IsTrue (r.Read (), "#81");
576 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
578 Assert.IsTrue (r.Read (), "#83");
579 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // GetObject
581 Assert.IsTrue (r.Read (), "#85");
582 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ArrayExtension.Items
584 Assert.IsTrue (r.Read (), "#87");
585 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ArrayExtension
587 Assert.IsFalse (r.Read (), "#89");
591 public void Read_DateTime ()
593 var obj = new DateTime (2010, 4, 15);
594 var r = new XamlObjectReader (obj);
595 Read_CommonClrType (r, obj);
596 Assert.AreEqual ("2010-04-15", Read_Initialization (r, null), "#1");
600 public void Read_TimeSpan ()
602 Read_CommonXamlPrimitive (TimeSpan.FromMinutes (4));
606 public void Read_Uri ()
608 Read_CommonXamlPrimitive (new Uri ("urn:foo"));
612 [ExpectedException (typeof (XamlObjectReaderException))]
613 [Category ("NotWorking")]
614 public void Read_XData ()
616 var r = new XamlObjectReader (new XData () {Text = "xdata text"}); // XmlReader implementation is not visible.
622 public void ReadStandardTypes ()
624 SimpleReadStandardType (new ArrayExtension ());
625 SimpleReadStandardType (new NullExtension ());
626 SimpleReadStandardType (new PropertyDefinition ());
627 SimpleReadStandardType (new Reference ());
628 SimpleReadStandardType (new StaticExtension ());
629 SimpleReadStandardType (new TypeExtension ());
633 public void Read_CustomMarkupExtension ()
635 var r = new XamlObjectReader (new MyExtension () { Foo = typeof (int), Bar = "v2"});
638 if (r.Type != null && r.Type.UnderlyingType == typeof (MyExtension))
641 Assert.IsFalse (r.IsEof, "#1");
645 if (r.Member != null && r.Member.Name == "Foo")
648 Assert.IsFalse (r.IsEof, "#2");
649 Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#3");
650 Assert.IsTrue (r.Read (), "#4");
651 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#5");
652 Assert.AreEqual ("x:Int32", r.Value, "#6");
655 void SimpleReadStandardType (object instance)
657 var r = new XamlObjectReader (instance);
662 void Read_CommonXamlPrimitive (object obj)
664 var r = new XamlObjectReader (obj);
665 Read_CommonXamlType (r);
666 Read_Initialization (r, obj);
669 // from StartMember of Initialization to EndMember
670 string Read_Initialization (XamlObjectReader r, object comparableValue)
672 Assert.IsTrue (r.Read (), "init#1");
673 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "init#2");
674 Assert.IsNotNull (r.Member, "init#3");
675 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "init#3-2");
676 Assert.IsTrue (r.Read (), "init#4");
677 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "init#5");
678 Assert.AreEqual (typeof (string), r.Value.GetType (), "init#6");
679 string ret = (string) r.Value;
680 if (comparableValue != null)
681 Assert.AreEqual (comparableValue.ToString (), r.Value, "init#6-2");
682 Assert.IsTrue (r.Read (), "init#7");
683 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "init#8");
687 // from initial to StartObject
688 void Read_CommonXamlType (XamlObjectReader r)
690 Assert.IsTrue (r.Read (), "ct#1");
691 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
692 Assert.IsNotNull (r.Namespace, "ct#3");
693 Assert.AreEqual ("x", r.Namespace.Prefix, "ct#3-2");
694 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ct#3-3");
695 Assert.IsNull (r.Instance, "ct#4");
697 Assert.IsTrue (r.Read (), "ct#5");
698 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#6");
701 // from initial to StartObject
702 void Read_CommonClrType (XamlObjectReader r, object obj)
704 Assert.IsTrue (r.Read (), "ct#1");
705 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
706 Assert.IsNotNull (r.Namespace, "ct#3");
707 Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ct#3-2");
708 Assert.AreEqual ("clr-namespace:" + obj.GetType ().Namespace + ";assembly=" + obj.GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ct#3-3");
711 Assert.IsTrue (r.Read (), "ct#4");
712 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#5");
713 Assert.IsNotNull (r.Namespace, "ct#6");
714 Assert.AreEqual ("x", r.Namespace.Prefix, "ct#6-2");
715 Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ct#6-3");
718 Assert.IsTrue (r.Read (), "ct#7");
719 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#8");
727 public class TestClass3
729 public TestClass3 Nested { get; set; }
732 [MarkupExtensionReturnType (typeof (Type))]
733 public class MyExtension : MarkupExtension
735 public MyExtension ()
739 public MyExtension (Type arg1, string arg2)
745 [ConstructorArgument ("arg1")]
746 public Type Foo { get; set; }
748 [ConstructorArgument ("arg2")]
749 public string Bar { get; set; }
751 public override object ProvideValue (IServiceProvider provider)
753 return "provided_value";