Fixed member order in Dictionary key and item in XamlObjectReader.
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlObjectReaderTest.cs
1 //
2 // Copyright (C) 2010 Novell Inc. http://novell.com
3 //
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:
11 // 
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 // 
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.
22 //
23 using System;
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.ComponentModel;
27 using System.IO;
28 using System.Linq;
29 using System.Reflection;
30 using System.Windows.Markup;
31 using System.Xaml;
32 using System.Xaml.Schema;
33 using System.Xml;
34 using NUnit.Framework;
35
36 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
37
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?
45
46 namespace MonoTests.System.Xaml
47 {
48         [TestFixture]
49         public class XamlObjectReaderTest
50         {
51                 [Test]
52                 public void ConstructorNullObject ()
53                 {
54                         // allowed.
55                         new XamlObjectReader (null);
56                 }
57
58                 [Test]
59                 [ExpectedException (typeof (ArgumentNullException))]
60                 public void ConstructorNullSchemaContext ()
61                 {
62                         new XamlObjectReader ("foo", (XamlSchemaContext) null);
63                 }
64
65                 [Test]
66                 public void ConstructorNullSettings ()
67                 {
68                         new XamlObjectReader ("foo", (XamlObjectReaderSettings) null);
69                 }
70
71                 [Test]
72                 [ExpectedException (typeof (ArgumentNullException))]
73                 public void ConstructorNullSchemaContext2 ()
74                 {
75                         new XamlObjectReader ("foo", null, new XamlObjectReaderSettings ());
76                 }
77
78                 [Test]
79                 public void ConstructorNullSettings2 ()
80                 {
81                         new XamlObjectReader ("foo", new XamlSchemaContext (null, null), null);
82                 }
83
84                 [Test]
85                 public void ReadNull ()
86                 {
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");
97                 }
98
99                 [Test]
100                 public void Read1 ()
101                 {
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");
109
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");
115
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");
121
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");
127
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");
132
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");
137
138                         Assert.IsTrue (r.Read (), "#61");
139                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
140                         Assert.IsNull (r.Type, "#63");
141
142                         Assert.IsFalse (r.Read (), "#71");
143                         Assert.IsTrue (r.IsEof, "#72");
144                 }
145
146                 [Test]
147                 [ExpectedException (typeof (XamlObjectReaderException))]
148                 public void ReadNonConstructible ()
149                 {
150                         // XamlType has no default constructor.
151                         var r = new XamlObjectReader (XamlLanguage.String);
152                 }
153
154                 [Test]
155                 [ExpectedException (typeof (XamlObjectReaderException))]
156                 public void NonPublicType ()
157                 {
158                         new XamlObjectReader (new TestClass1 ());
159                 }
160
161                 [Test]
162                 [ExpectedException (typeof (XamlObjectReaderException))]
163                 public void NestedType ()
164                 {
165                         new XamlObjectReader (new TestClass2 ());
166                 }
167                 
168                 public class TestClass2
169                 {
170                 }
171
172                 [Test]
173                 public void ConstructibleType ()
174                 {
175                         new XamlObjectReader (new TestClass3 ());
176                 }
177
178                 [Test]
179                 public void WriteNullMemberAsObject ()
180                 {
181                         var r = new XamlObjectReader (new TestClass4 ());
182
183                         Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
184                         Assert.IsTrue (r.Read (), "#6");
185                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
186                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#7-2");
187                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#7-3");
188
189                         Assert.IsTrue (r.Read (), "#11");
190                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
191                         Assert.AreEqual ("x", r.Namespace.Prefix, "#12-2");
192                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#12-3");
193
194                         Assert.IsTrue (r.Read (), "#16");
195                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#17");
196                         var xt = new XamlType (typeof (TestClass4), r.SchemaContext);
197                         Assert.AreEqual (xt, r.Type, "#17-2");
198                         Assert.IsTrue (r.Instance is TestClass4, "#17-3");
199                         Assert.AreEqual (2, xt.GetAllMembers ().Count, "#17-4");
200
201                         Assert.IsTrue (r.Read (), "#21");
202                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#22");
203                         Assert.AreEqual (xt.GetMember ("Bar"), r.Member, "#22-2");
204
205                         Assert.IsTrue (r.Read (), "#26");
206                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#27");
207                         Assert.AreEqual (XamlLanguage.Null, r.Type, "#27-2");
208                         Assert.IsNull (r.Instance, "#27-3");
209
210                         Assert.IsTrue (r.Read (), "#31");
211                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#32");
212
213                         Assert.IsTrue (r.Read (), "#36");
214                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#37");
215
216                         Assert.IsTrue (r.Read (), "#41");
217                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#42");
218                         Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#42-2");
219
220                         Assert.IsTrue (r.Read (), "#43");
221                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#43-2");
222                         Assert.AreEqual (XamlLanguage.Null, r.Type, "#43-3");
223                         Assert.IsNull (r.Instance, "#43-4");
224
225                         Assert.IsTrue (r.Read (), "#44");
226                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#44-2");
227
228                         Assert.IsTrue (r.Read (), "#46");
229                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#47");
230
231                         Assert.IsTrue (r.Read (), "#51");
232                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#52");
233
234                         Assert.IsFalse (r.Read (), "#56");
235                         Assert.IsTrue (r.IsEof, "#57");
236                 }
237
238                 [Test]
239                 public void StaticMember ()
240                 {
241                         var r = new XamlObjectReader (new TestClass5 ());
242
243                         Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
244                         Assert.IsTrue (r.Read (), "#6");
245                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
246                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#7-2");
247                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#7-3");
248
249                         Assert.IsTrue (r.Read (), "#11");
250                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
251                         Assert.AreEqual ("x", r.Namespace.Prefix, "#12-2");
252                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#12-3");
253
254                         Assert.IsTrue (r.Read (), "#16");
255                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#17");
256                         var xt = new XamlType (typeof (TestClass5), r.SchemaContext);
257                         Assert.AreEqual (xt, r.Type, "#17-2");
258                         Assert.IsTrue (r.Instance is TestClass5, "#17-3");
259                         Assert.AreEqual (2, xt.GetAllMembers ().Count, "#17-4");
260                         Assert.IsTrue (xt.GetAllMembers ().Any (xm => xm.Name == "Bar"), "#17-5");
261                         Assert.IsTrue (xt.GetAllMembers ().Any (xm => xm.Name == "Baz"), "#17-6");
262
263                         Assert.IsTrue (r.Read (), "#21");
264                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#22");
265                         Assert.AreEqual (xt.GetMember ("Bar"), r.Member, "#22-2");
266
267                         Assert.IsTrue (r.Read (), "#26");
268                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#27");
269                         Assert.AreEqual (XamlLanguage.Null, r.Type, "#27-2");
270                         Assert.IsNull (r.Instance, "#27-3");
271
272                         Assert.IsTrue (r.Read (), "#31");
273                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#32");
274
275                         Assert.IsTrue (r.Read (), "#36");
276                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#37");
277                         // static Foo is not included in GetAllXembers() return value.
278                         // ReadOnly is not included in GetAllMembers() return value neither.
279                         // nonpublic Baz is a member, but does not appear in the reader.
280
281                         Assert.IsTrue (r.Read (), "#51");
282                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#52");
283
284                         Assert.IsFalse (r.Read (), "#56");
285                         Assert.IsTrue (r.IsEof, "#57");
286                 }
287
288                 [Test]
289                 public void Skip ()
290                 {
291                         var r = new XamlObjectReader ("Foo");
292                         r.Skip ();
293                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
294                         r.Skip ();
295                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2");
296                         r.Skip ();
297                         Assert.IsTrue (r.IsEof, "#3");
298                 }
299
300                 [Test]
301                 public void Skip2 ()
302                 {
303                         var r = new XamlObjectReader ("Foo");
304                         r.Read (); // NamespaceDeclaration
305                         r.Read (); // Type
306                         r.Read (); // Member (Initialization)
307                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#1");
308                         r.Skip ();
309                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#2");
310                         r.Skip ();
311                         Assert.IsTrue (r.IsEof, "#3");
312                 }
313
314                 [Test]
315                 public void Read2 ()
316                 {
317                         var doc = new XmlDocument ();
318                         doc.LoadXml ("<root xmlns='urn:foo'><elem attr='val' /></root>");
319                         var r = new XamlObjectReader (doc);
320
321                         for (int i = 0; i < 3; i++) {
322                                 r.Read ();
323                                 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1-" + i);
324                         }
325                         r.Read ();
326
327                         Assert.AreEqual (new XamlType (typeof (XmlDocument), r.SchemaContext), r.Type, "#2");
328                         r.Read ();
329                         var l = new List<XamlMember> ();
330                         while (r.NodeType == XamlNodeType.StartMember) {
331                         // It depends on XmlDocument's implenentation details. It fails on mono only because XmlDocument.SchemaInfo overrides both getter and setter.
332                         //for (int i = 0; i < 5; i++) {
333                         //      Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-" + i);
334                                 l.Add (r.Member);
335                                 r.Skip ();
336                         }
337                         Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "Value"), "#4-1");
338                         Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "InnerXml"), "#4-2");
339                         Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "Prefix"), "#4-3");
340                         Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "PreserveWhitespace"), "#4-4");
341                         Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "Schemas"), "#4-5");
342                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#5");
343                         Assert.IsFalse (r.Read (), "#6");
344                 }
345
346                 [Test]
347                 public void Read_NonPrimitive ()
348                 {
349                         var r = new XamlObjectReader (new TestClass3 ());
350                         Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
351                         Assert.IsTrue (r.Read (), "#6");
352                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
353                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#7-2");
354                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#7-3");
355
356                         Assert.IsTrue (r.Read (), "#11");
357                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
358                         Assert.AreEqual ("x", r.Namespace.Prefix, "#12-2");
359                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#12-3");
360
361                         Assert.IsTrue (r.Read (), "#16");
362                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#17");
363                         var xt = new XamlType (typeof (TestClass3), r.SchemaContext);
364                         Assert.AreEqual (xt, r.Type, "#17-2");
365                         Assert.IsTrue (r.Instance is TestClass3, "#17-3");
366
367                         Assert.IsTrue (r.Read (), "#21");
368                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#22");
369                         Assert.AreEqual (xt.GetMember ("Nested"), r.Member, "#22-2");
370
371                         Assert.IsTrue (r.Read (), "#26");
372                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#27");
373                         Assert.AreEqual (XamlLanguage.Null, r.Type, "#27-2");
374                         Assert.IsNull (r.Instance, "#27-3");
375
376                         Assert.IsTrue (r.Read (), "#31");
377                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#32");
378
379                         Assert.IsTrue (r.Read (), "#36");
380                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#37");
381
382                         Assert.IsTrue (r.Read (), "#41");
383                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#42");
384
385                         Assert.IsFalse (r.Read (), "#46");
386                         Assert.IsTrue (r.IsEof, "#47");
387                 }
388
389                 [Test]
390                 public void Read_Type ()
391                 {
392                         var r = new XamlObjectReader (typeof (int));
393                         Read_TypeOrTypeExtension (r, typeof (int));
394                 }
395                 
396                 [Test]
397                 public void Read_TypeExtension ()
398                 {
399                         var tx = new TypeExtension (typeof (int));
400                         var r = new XamlObjectReader (tx);
401                         Read_TypeOrTypeExtension (r, tx);
402                 }
403
404                 void Read_TypeOrTypeExtension (XamlObjectReader r, object obj)
405                 {
406                         Assert.IsTrue (r.Read (), "#11");
407                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
408                         Assert.IsNotNull (r.Namespace, "#13");
409                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
410                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
411                         Assert.IsNull (r.Instance, "#14");
412
413                         Assert.IsTrue (r.Read (), "#21");
414                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
415                         Assert.IsNotNull (r.Type, "#23");
416                         Assert.AreEqual (new XamlType (typeof (TypeExtension), r.SchemaContext), r.Type, "#23-2");
417                         Assert.IsNull (r.Namespace, "#25");
418                         Assert.IsTrue (r.Instance is TypeExtension, "#26");
419
420                         Assert.IsTrue (r.Read (), "#31");
421                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
422                         Assert.IsNotNull (r.Member, "#33");
423                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#33-2");
424                         Assert.IsNull (r.Type, "#34");
425                         Assert.IsNull (r.Instance, "#35");
426
427                         Assert.IsTrue (r.Read (), "#41");
428                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
429                         Assert.IsNotNull (r.Value, "#43");
430                         Assert.AreEqual ("x:Int32", r.Value, "#43-2");
431                         Assert.IsNull (r.Member, "#44");
432                         Assert.IsNull (r.Instance, "#45");
433
434                         Assert.IsTrue (r.Read (), "#51");
435                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
436                         Assert.IsNull (r.Type, "#53");
437                         Assert.IsNull (r.Member, "#54");
438                         Assert.IsNull (r.Instance, "#55");
439
440                         Assert.IsTrue (r.Read (), "#61");
441                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
442                         Assert.IsNull (r.Type, "#63");
443
444                         Assert.IsFalse (r.Read (), "#71");
445                         Assert.IsTrue (r.IsEof, "#72");
446                 }
447
448                 [Test]
449                 public void Read_Type2 ()
450                 {
451                         var r = new XamlObjectReader (typeof (TestClass1));
452                         Read_TypeOrTypeExtension2 (r);
453                 }
454                 
455                 [Test]
456                 public void Read_TypeExtension2 ()
457                 {
458                         var r = new XamlObjectReader (new TypeExtension (typeof (TestClass1)));
459                         Read_TypeOrTypeExtension2 (r);
460                 }
461
462                 void Read_TypeOrTypeExtension2 (XamlObjectReader r)
463                 {
464                         Assert.IsTrue (r.Read (), "#11");
465                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
466
467                         var defns = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
468
469                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#13-2");
470                         Assert.AreEqual (defns, r.Namespace.Namespace, "#13-3:" + r.Namespace.Prefix);
471
472                         Assert.IsTrue (r.Read (), "#16");
473                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#17");
474                         Assert.IsNotNull (r.Namespace, "#18");
475                         Assert.AreEqual ("x", r.Namespace.Prefix, "#18-2");
476                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#18-3:" + r.Namespace.Prefix);
477
478                         Assert.IsTrue (r.Read (), "#21");
479                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
480                         Assert.AreEqual (new XamlType (typeof (TypeExtension), r.SchemaContext), r.Type, "#23-2");
481                         Assert.IsTrue (r.Instance is TypeExtension, "#26");
482
483                         Assert.IsTrue (r.Read (), "#31");
484                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
485                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#33-2");
486
487                         Assert.IsTrue (r.Read (), "#41");
488                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
489                         Assert.AreEqual ("TestClass1", r.Value, "#43-2");
490
491                         Assert.IsTrue (r.Read (), "#51");
492                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
493
494                         Assert.IsTrue (r.Read (), "#61");
495                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
496
497                         Assert.IsFalse (r.Read (), "#71");
498                         Assert.IsTrue (r.IsEof, "#72");
499                 }
500
501                 [Test]
502                 public void Read_Reference ()
503                 {
504                         var r = new XamlObjectReader (new Reference ("TestName"));
505                         Assert.IsTrue (r.Read (), "#11");
506                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
507                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
508                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
509
510                         Assert.IsTrue (r.Read (), "#21");
511                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
512                         var xt = new XamlType (typeof (Reference), r.SchemaContext);
513                         Assert.AreEqual (xt, r.Type, "#23-2");
514                         Assert.IsTrue (r.Instance is Reference, "#26");
515
516                         Assert.IsTrue (r.Read (), "#31");
517                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
518                         // unlike TypeExtension there is no PositionalParameters.
519                         Assert.AreEqual (xt.GetMember ("Name"), r.Member, "#33-2");
520
521                         // It is a ContentProperty (besides [ConstructorArgument])
522                         Assert.IsTrue (r.Read (), "#41");
523                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
524                         Assert.AreEqual ("TestName", r.Value, "#43-2");
525
526                         Assert.IsTrue (r.Read (), "#51");
527                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
528
529                         Assert.IsTrue (r.Read (), "#61");
530                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
531
532                         Assert.IsFalse (r.Read (), "#71");
533                         Assert.IsTrue (r.IsEof, "#72");
534                 }
535
536
537                 [Test]
538                 public void Read_Null ()
539                 {
540                         var r = new XamlObjectReader (null);
541                         Read_NullOrNullExtension (r, null);
542                 }
543
544                 [Test]
545                 public void Read_NullExtension ()
546                 {
547                         var o = new NullExtension ();
548                         var r = new XamlObjectReader (o);
549                         Read_NullOrNullExtension (r, o);
550                 }
551                 
552                 void Read_NullOrNullExtension (XamlObjectReader r, object instance)
553                 {
554                         Assert.IsTrue (r.Read (), "#11");
555                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
556                         Assert.IsNotNull (r.Namespace, "#13");
557                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
558                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
559                         Assert.IsNull (r.Instance, "#14");
560
561                         Assert.IsTrue (r.Read (), "#21");
562                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
563                         Assert.AreEqual (new XamlType (typeof (NullExtension), r.SchemaContext), r.Type, "#23-2");
564                         Assert.AreEqual (instance, r.Instance, "#26"); // null and NullExtension are different here.
565
566                         Assert.IsTrue (r.Read (), "#61");
567                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
568
569                         Assert.IsFalse (r.Read (), "#71");
570                         Assert.IsTrue (r.IsEof, "#72");
571                 }
572
573                 [Test] // almost identical to TypeExtension (only type/instance difference)
574                 public void Read_StaticExtension ()
575                 {
576                         var r = new XamlObjectReader (new StaticExtension ("MyMember"));
577                         Assert.IsTrue (r.Read (), "#11");
578                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
579                         Assert.IsNotNull (r.Namespace, "#13");
580                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
581                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
582                         Assert.IsNull (r.Instance, "#14");
583
584                         Assert.IsTrue (r.Read (), "#21");
585                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
586                         Assert.AreEqual (new XamlType (typeof (StaticExtension), r.SchemaContext), r.Type, "#23-2");
587                         Assert.IsTrue (r.Instance is StaticExtension, "#26");
588
589                         Assert.IsTrue (r.Read (), "#31");
590                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
591                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#33-2");
592
593                         Assert.IsTrue (r.Read (), "#41");
594                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
595                         Assert.AreEqual ("MyMember", r.Value, "#43-2");
596
597                         Assert.IsTrue (r.Read (), "#51");
598                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
599
600                         Assert.IsTrue (r.Read (), "#61");
601                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
602
603                         Assert.IsFalse (r.Read (), "#71");
604                         Assert.IsTrue (r.IsEof, "#72");
605                 }
606
607                 [Test]
608                 public void Read_ListInt32 ()
609                 {
610                         var obj = new List<int> (new int [] {5, -3, 0});
611                         Read_ListInt32 (obj);
612                 }
613                 
614                 [Test]
615                 public void Read_ListInt32_2 ()
616                 {
617                         var obj = new List<int> (new int [0]);
618                         Read_ListInt32 (obj);
619                 }
620                 
621                 void Read_ListInt32 (List<int> obj)
622                 {
623                         var r = new XamlObjectReader (obj);
624                         Assert.IsTrue (r.Read (), "ns#1-1");
625                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
626
627                         var defns = "clr-namespace:System.Collections.Generic;assembly=mscorlib";
628
629                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-3");
630                         Assert.AreEqual (defns, r.Namespace.Namespace, "ns#1-4");
631
632                         Assert.IsTrue (r.Read (), "#11");
633                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
634                         Assert.IsNotNull (r.Namespace, "#13");
635                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
636                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
637
638                         Assert.IsTrue (r.Read (), "#21");
639                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
640                         var xt = new XamlType (typeof (List<int>), r.SchemaContext);
641                         Assert.AreEqual (xt, r.Type, "#23");
642                         Assert.AreEqual (obj, r.Instance, "#26");
643                         Assert.IsTrue (xt.IsCollection, "#27");
644
645                         // This assumption on member ordering ("Type" then "Items") is somewhat wrong, and we might have to adjust it in the future.
646
647                         Assert.IsTrue (r.Read (), "#31");
648                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
649                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "#33");
650
651                         Assert.IsTrue (r.Read (), "#41");
652                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
653                         // The value is implementation details, not testable.
654                         //Assert.AreEqual ("3", r.Value, "#43");
655
656                         Assert.IsTrue (r.Read (), "#51");
657                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
658
659                         if (obj.Count > 0) { // only when items exist.
660
661                         Assert.IsTrue (r.Read (), "#72");
662                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
663                         Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
664
665                         string [] values = {"5", "-3", "0"};
666                         for (int i = 0; i < 3; i++) {
667                                 Assert.IsTrue (r.Read (), i + "#73");
668                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
669                                 Assert.IsTrue (r.Read (), i + "#74");
670                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
671                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
672                                 Assert.IsTrue (r.Read (), i + "#75");
673                                 Assert.IsNotNull (r.Value, i + "#75-2");
674                                 Assert.AreEqual (values [i], r.Value, i + "#73-3");
675                                 Assert.IsTrue (r.Read (), i + "#74");
676                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
677                                 Assert.IsTrue (r.Read (), i + "#75");
678                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
679                         }
680
681                         Assert.IsTrue (r.Read (), "#81");
682                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
683                         
684                         } // end of "if count > 0".
685
686                         Assert.IsTrue (r.Read (), "#87");
687                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88");
688
689                         Assert.IsFalse (r.Read (), "#89");
690                 }
691
692                 [Test]
693                 public void Read_ArrayList ()
694                 {
695                         var obj = new ArrayList (new int [] {5, -3, 0});
696
697                         var r = new XamlObjectReader (obj);
698                         Assert.IsTrue (r.Read (), "ns#1-1");
699                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
700
701                         var defns = "clr-namespace:System.Collections;assembly=mscorlib";
702
703                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-3");
704                         Assert.AreEqual (defns, r.Namespace.Namespace, "ns#1-4");
705
706                         Assert.IsTrue (r.Read (), "#11");
707                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
708                         Assert.IsNotNull (r.Namespace, "#13");
709                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
710                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
711
712                         Assert.IsTrue (r.Read (), "#21");
713                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
714                         var xt = new XamlType (typeof (ArrayList), r.SchemaContext);
715                         Assert.AreEqual (xt, r.Type, "#23");
716                         Assert.AreEqual (obj, r.Instance, "#26");
717                         Assert.IsTrue (xt.IsCollection, "#27");
718
719                         // This assumption on member ordering ("Type" then "Items") is somewhat wrong, and we might have to adjust it in the future.
720
721                         Assert.IsTrue (r.Read (), "#31");
722                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
723                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "#33");
724
725                         Assert.IsTrue (r.Read (), "#41");
726                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
727                         // The value is implementation details, not testable.
728                         //Assert.AreEqual ("3", r.Value, "#43");
729
730                         Assert.IsTrue (r.Read (), "#51");
731                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
732
733                         Assert.IsTrue (r.Read (), "#72");
734                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
735                         Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
736
737                         string [] values = {"5", "-3", "0"};
738                         for (int i = 0; i < 3; i++) {
739                                 Assert.IsTrue (r.Read (), i + "#73");
740                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
741                                 Assert.IsTrue (r.Read (), i + "#74");
742                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
743                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
744                                 Assert.IsTrue (r.Read (), i + "#75");
745                                 Assert.IsNotNull (r.Value, i + "#75-2");
746                                 Assert.AreEqual (values [i], r.Value, i + "#73-3");
747                                 Assert.IsTrue (r.Read (), i + "#74");
748                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
749                                 Assert.IsTrue (r.Read (), i + "#75");
750                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
751                         }
752
753                         Assert.IsTrue (r.Read (), "#81");
754                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
755
756                         Assert.IsTrue (r.Read (), "#87");
757                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88");
758
759                         Assert.IsFalse (r.Read (), "#89");
760                 }
761
762                 [Test]
763                 public void Read_Array ()
764                 {
765                         var obj = new int [] {5, -3, 0};
766                         var r = new XamlObjectReader (obj);
767                         Read_ArrayOrArrayExtension (r, obj);
768                 }
769                 
770                 [Test]
771                 public void Read_ArrayExtension ()
772                 {
773                         var obj = new ArrayExtension (new int [] {5, -3, 0});
774                         var r = new XamlObjectReader (obj);
775                         Read_ArrayOrArrayExtension (r, obj);
776                 }
777                 
778                 [Test]
779                 public void Read_MyArrayExtension ()
780                 {
781                         var obj = new MyArrayExtension (new int [] {5, -3, 0});
782                         var r = new XamlObjectReader (obj);
783                         Read_ArrayOrArrayExtensionOrMyArrayExtension (r, obj, typeof (MyArrayExtension));
784                 }
785
786                 void Read_ArrayOrArrayExtension (XamlObjectReader r, object instance)
787                 {
788                         Read_ArrayOrArrayExtensionOrMyArrayExtension (r, instance, typeof (ArrayExtension));
789                 }
790
791                 void Read_ArrayOrArrayExtensionOrMyArrayExtension (XamlObjectReader r, object instance, Type extType)
792                 {
793                         if (extType == typeof (MyArrayExtension)) {
794                                 Assert.IsTrue (r.Read (), "#1");
795                                 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
796                                 Assert.IsNotNull (r.Namespace, "#3");
797                                 Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
798                         }
799                         Assert.IsTrue (r.Read (), "#11");
800                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
801                         Assert.IsNotNull (r.Namespace, "#13");
802                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
803                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
804
805                         Assert.IsTrue (r.Read (), "#21");
806                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
807                         var xt = new XamlType (extType, r.SchemaContext);
808                         Assert.AreEqual (xt, r.Type, "#23");
809                         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)
810
811                         // This assumption on member ordering ("Type" then "Items") is somewhat wrong, and we might have to adjust it in the future.
812
813                         Assert.IsTrue (r.Read (), "#31");
814                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
815                         Assert.AreEqual (xt.GetMember ("Type"), r.Member, "#33");
816
817                         Assert.IsTrue (r.Read (), "#41");
818                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
819                         Assert.AreEqual ("x:Int32", r.Value, "#43");
820
821                         Assert.IsTrue (r.Read (), "#51");
822                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
823
824                         Assert.IsTrue (r.Read (), "#61");
825                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
826                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
827
828                         Assert.IsTrue (r.Read (), "#71");
829                         Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "#71-2");
830                         Assert.IsNull (r.Type, "#71-3");
831                         Assert.IsNull (r.Member, "#71-4");
832                         Assert.IsNull (r.Value, "#71-5");
833
834                         Assert.IsTrue (r.Read (), "#72");
835                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
836                         Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
837
838                         string [] values = {"5", "-3", "0"};
839                         for (int i = 0; i < 3; i++) {
840                                 Assert.IsTrue (r.Read (), i + "#73");
841                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
842                                 Assert.IsTrue (r.Read (), i + "#74");
843                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
844                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
845                                 Assert.IsTrue (r.Read (), i + "#75");
846                                 Assert.IsNotNull (r.Value, i + "#75-2");
847                                 Assert.AreEqual (values [i], r.Value, i + "#73-3");
848                                 Assert.IsTrue (r.Read (), i + "#74");
849                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
850                                 Assert.IsTrue (r.Read (), i + "#75");
851                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
852                         }
853
854                         Assert.IsTrue (r.Read (), "#81");
855                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
856
857                         Assert.IsTrue (r.Read (), "#83");
858                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // GetObject
859
860                         Assert.IsTrue (r.Read (), "#85");
861                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ArrayExtension.Items
862
863                         Assert.IsTrue (r.Read (), "#87");
864                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ArrayExtension
865
866                         Assert.IsFalse (r.Read (), "#89");
867                 }
868
869                 [Test] // It gives Type member, not PositionalParameters... and no Items member here.
870                 public void Read_ArrayExtension2 ()
871                 {
872                         var r = new XamlObjectReader (new ArrayExtension (typeof (int)));
873                         Assert.IsTrue (r.Read (), "#11");
874                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
875                         Assert.IsNotNull (r.Namespace, "#13");
876                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
877                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
878                         Assert.IsNull (r.Instance, "#14");
879
880                         Assert.IsTrue (r.Read (), "#21");
881                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
882                         var xt = new XamlType (typeof (ArrayExtension), r.SchemaContext);
883                         Assert.AreEqual (xt, r.Type, "#23-2");
884                         Assert.IsTrue (r.Instance is ArrayExtension, "#26");
885
886                         Assert.IsTrue (r.Read (), "#31");
887                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
888                         Assert.AreEqual (xt.GetMember ("Type"), r.Member, "#33-2");
889
890                         Assert.IsTrue (r.Read (), "#41");
891                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
892                         Assert.AreEqual ("x:Int32", r.Value, "#43-2");
893
894                         Assert.IsTrue (r.Read (), "#51");
895                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
896
897                         Assert.IsTrue (r.Read (), "#61");
898                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
899
900                         Assert.IsFalse (r.Read (), "#71");
901                         Assert.IsTrue (r.IsEof, "#72");
902                 }
903
904                 [Test]
905                 public void Read_DateTime ()
906                 {
907                         var obj = new DateTime (2010, 4, 15);
908                         var r = new XamlObjectReader (obj);
909                         Read_CommonClrType (r, obj);
910                         Assert.AreEqual ("2010-04-15", Read_Initialization (r, null), "#1");
911                 }
912
913                 [Test]
914                 public void Read_TimeSpan ()
915                 {
916                         Read_CommonXamlPrimitive (TimeSpan.FromMinutes (4));
917                 }
918
919                 [Test]
920                 public void Read_Uri ()
921                 {
922                         Read_CommonXamlPrimitive (new Uri ("urn:foo"));
923                 }
924
925                 [Test]
926                 public void Read_Guid ()
927                 {
928                         var obj = Guid.NewGuid ();
929                         var r = new XamlObjectReader (obj);
930                         Assert.IsNotNull (r.SchemaContext.GetXamlType (typeof (Guid)).TypeConverter, "premise#1");
931                         Read_CommonClrType (r, obj);
932                         Assert.AreEqual (obj.ToString (), Read_Initialization (r, null), "#1");
933                 }
934
935                 [Test]
936                 [ExpectedException (typeof (XamlObjectReaderException))]
937                 [Category ("NotWorking")]
938                 public void Read_XData ()
939                 {
940                         var r = new XamlObjectReader (new XData () {Text = "xdata text"}); // XmlReader implementation is not visible.
941                         while (!r.IsEof)
942                                 r.Read ();
943                 }
944
945                 [Test]
946                 public void ReadStandardTypes ()
947                 {
948                         SimpleReadStandardType (new ArrayExtension ());
949                         SimpleReadStandardType (new NullExtension ());
950                         SimpleReadStandardType (new PropertyDefinition ());
951                         SimpleReadStandardType (new Reference ());
952                         SimpleReadStandardType (new StaticExtension ());
953                         SimpleReadStandardType (new TypeExtension ());
954                 }
955
956                 [Test]
957                 public void Read_CustomMarkupExtension ()
958                 {
959                         var r = new XamlObjectReader (new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"});
960                         r.Read (); // ns
961                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
962                         r.Read (); // ns
963                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1-2");
964                         r.Read ();
965                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
966                         Assert.IsFalse (r.IsEof, "#1");
967                         var xt = r.Type;
968
969                         r.Read ();
970                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#2-1");
971                         Assert.IsFalse (r.IsEof, "#2-2");
972                         Assert.AreEqual (xt.GetMember ("Bar"), r.Member, "#2-3");
973
974                         Assert.IsTrue (r.Read (), "#2-4");
975                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#2-5");
976                         Assert.AreEqual ("v2", r.Value, "#2-6");
977
978                         Assert.IsTrue (r.Read (), "#2-7");
979                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#2-8");
980
981                         r.Read ();
982                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-1");
983                         Assert.IsFalse (r.IsEof, "#3-2");
984                         Assert.AreEqual (xt.GetMember ("Baz"), r.Member, "#3-3");
985
986                         Assert.IsTrue (r.Read (), "#3-4");
987                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#3-5");
988                         Assert.AreEqual ("v7", r.Value, "#3-6");
989
990                         Assert.IsTrue (r.Read (), "#3-7");
991                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#3-8");
992                         
993                         r.Read ();
994                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#4-1");
995                         Assert.IsFalse (r.IsEof, "#4-2");
996                         Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#4-3");
997                         Assert.IsTrue (r.Read (), "#4-4");
998                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#4-5");
999                         Assert.AreEqual ("x:Int32", r.Value, "#4-6");
1000
1001                         Assert.IsTrue (r.Read (), "#4-7");
1002                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#4-8");
1003
1004                         Assert.IsTrue (r.Read (), "#5");
1005                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#5-2");
1006
1007                         Assert.IsFalse (r.Read (), "#6");
1008                 }
1009
1010                 [Test]
1011                 public void Read_CustomMarkupExtension2 ()
1012                 {
1013                         var r = new XamlObjectReader (new MyExtension2 () { Foo = typeof (int), Bar = "v2"});
1014                         r.Read (); // ns
1015                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
1016                         r.Read (); // note that there wasn't another NamespaceDeclaration.
1017                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
1018                         var xt = r.Type;
1019                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension2)), xt, "#2");
1020                         Assert.IsTrue (r.Read (), "#3");
1021                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
1022                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#4");
1023                         Assert.IsTrue (r.Read (), "#5");
1024                         Assert.AreEqual ("MonoTests.System.Xaml.MyExtension2", r.Value, "#6");
1025                         Assert.IsTrue (r.Read (), "#7"); // EndMember
1026                         Assert.IsTrue (r.Read (), "#8"); // EndObject
1027                         Assert.IsFalse (r.Read (), "#9");
1028                 }
1029
1030                 [Test]
1031                 public void Read_CustomMarkupExtension3 ()
1032                 {
1033                         var r = new XamlObjectReader (new MyExtension3 () { Foo = typeof (int), Bar = "v2"});
1034                         r.Read (); // ns
1035                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
1036                         r.Read (); // note that there wasn't another NamespaceDeclaration.
1037                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
1038                         var xt = r.Type;
1039                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension3)), xt, "#2");
1040                         Assert.IsTrue (r.Read (), "#3");
1041                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
1042                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#4");
1043                         Assert.IsTrue (r.Read (), "#5");
1044                         Assert.AreEqual ("MonoTests.System.Xaml.MyExtension3", r.Value, "#6");
1045                         Assert.IsTrue (r.Read (), "#7"); // EndMember
1046                         Assert.IsTrue (r.Read (), "#8"); // EndObject
1047                         Assert.IsFalse (r.Read (), "#9");
1048                 }
1049
1050                 [Test]
1051                 public void Read_CustomMarkupExtension4 ()
1052                 {
1053                         var r = new XamlObjectReader (new MyExtension4 () { Foo = typeof (int), Bar = "v2"});
1054                         r.Read (); // ns
1055                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
1056                         r.Read (); // note that there wasn't another NamespaceDeclaration.
1057                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
1058                         var xt = r.Type;
1059                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension4)), xt, "#2");
1060                         Assert.IsTrue (r.Read (), "#3");
1061                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
1062                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#4");
1063                         Assert.IsTrue (r.Read (), "#5");
1064                         Assert.AreEqual ("MonoTests.System.Xaml.MyExtension4", r.Value, "#6");
1065                         Assert.IsTrue (r.Read (), "#7"); // EndMember
1066                         Assert.IsTrue (r.Read (), "#8"); // EndObject
1067                         Assert.IsFalse (r.Read (), "#9");
1068                 }
1069
1070                 [Test]
1071                 public void Read_CustomMarkupExtension5 ()
1072                 {
1073                         // This cannot be written to XamlXmlWriter though...
1074
1075                         var r = new XamlObjectReader (new MyExtension5 ("foo", "bar"));
1076                         r.Read (); // ns
1077                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
1078                         r.Read (); // note that there wasn't another NamespaceDeclaration.
1079                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
1080                         var xt = r.Type;
1081                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension5)), xt, "#2");
1082                         Assert.IsTrue (r.Read (), "#3");
1083                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
1084                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#4");
1085                         Assert.IsTrue (r.Read (), "#5");
1086                         Assert.AreEqual ("foo", r.Value, "#6");
1087                         Assert.IsTrue (r.Read (), "#7");
1088                         Assert.AreEqual ("bar", r.Value, "#8");
1089                         Assert.IsTrue (r.Read (), "#9");
1090                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#10");
1091                         Assert.IsTrue (r.Read (), "#11");
1092                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#12");
1093                         Assert.IsFalse (r.Read (), "#13");
1094                 }
1095
1096                 [Test]
1097                 public void Read_CustomMarkupExtension6 ()
1098                 {
1099                         var r = new XamlObjectReader (new MyExtension6 ("foo"));
1100                         r.Read (); // ns
1101                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
1102                         r.Read (); // note that there wasn't another NamespaceDeclaration.
1103                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
1104                         var xt = r.Type;
1105                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension6)), xt, "#2");
1106                         Assert.IsTrue (r.Read (), "#3");
1107                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
1108                         Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#4"); // this is the difference between MyExtension5 and MyExtension6: it outputs constructor arguments as normal members
1109                         Assert.IsTrue (r.Read (), "#5");
1110                         Assert.AreEqual ("foo", r.Value, "#6");
1111                         Assert.IsTrue (r.Read (), "#7"); // EndMember
1112                         Assert.IsTrue (r.Read (), "#8"); // EndObject
1113                         Assert.IsFalse (r.Read (), "#9");
1114                 }
1115
1116                 [Test]
1117                 public void Read_ArgumentAttributed ()
1118                 {
1119                         var obj = new ArgumentAttributed ("foo", "bar");
1120                         var r = new XamlObjectReader (obj);
1121                         Read_CommonClrType (r, obj, new KeyValuePair<string,string> ("x", XamlLanguage.Xaml2006Namespace));
1122                         var args = Read_AttributedArguments_String (r, new string [] {"arg1", "arg2"});
1123                         Assert.AreEqual ("foo", args [0], "#1");
1124                         Assert.AreEqual ("bar", args [1], "#2");
1125                 }
1126
1127                 [Test]
1128                 public void Read_Dictionary ()
1129                 {
1130                         var obj = new Dictionary<string,object> ();
1131                         obj ["Foo"] = 5.0;
1132                         obj ["Bar"] = -6.5;
1133                         var r = new XamlObjectReader (obj);
1134
1135                         Assert.IsTrue (r.Read (), "ns#1-1");
1136                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1137                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1138                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1139                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#1-5");
1140
1141                         Assert.IsTrue (r.Read (), "ns#2-1");
1142                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2-2");
1143                         Assert.IsNotNull (r.Namespace, "ns#2-3");
1144                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#2-4");
1145                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#2-5");
1146
1147                         Assert.IsTrue (r.Read (), "so#1-1");
1148                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1149                         var xt = new XamlType (typeof (Dictionary<string,object>), r.SchemaContext);
1150                         Assert.AreEqual (xt, r.Type, "so#1-3");
1151                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1152
1153                         Assert.IsTrue (r.Read (), "smitems#1");
1154                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smitems#2");
1155                         Assert.AreEqual (XamlLanguage.Items, r.Member, "smitems#3");
1156
1157                         for (int i = 0; i < 2; i++) {
1158
1159                                 // start of an item
1160                                 Assert.IsTrue (r.Read (), "soi#1-1." + i);
1161                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soi#1-2." + i);
1162                                 var xt2 = new XamlType (typeof (double), r.SchemaContext);
1163                                 Assert.AreEqual (xt2, r.Type, "soi#1-3." + i);
1164
1165                                 Assert.IsTrue (r.Read (), "smi#1-1." + i);
1166                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#1-2." + i);
1167                                 Assert.AreEqual (XamlLanguage.Key, r.Member, "smi#1-3." + i);
1168
1169                                 Assert.IsTrue (r.Read (), "svi#1-1." + i);
1170                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#1-2." + i);
1171                                 Assert.AreEqual (i == 0 ? "Foo" : "Bar", r.Value, "svi#1-3." + i);
1172
1173                                 Assert.IsTrue (r.Read (), "emi#1-1." + i);
1174                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#1-2." + i);
1175
1176                                 Assert.IsTrue (r.Read (), "smi#2-1." + i);
1177                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#2-2." + i);
1178                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "smi#2-3." + i);
1179
1180                                 Assert.IsTrue (r.Read (), "svi#2-1." + i);
1181                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#2-2." + i);
1182                                 Assert.AreEqual (i == 0 ? "5" : "-6.5", r.Value, "svi#2-3." + i); // converted to string(!)
1183
1184                                 Assert.IsTrue (r.Read (), "emi#2-1." + i);
1185                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#2-2." + i);
1186
1187                                 Assert.IsTrue (r.Read (), "eoi#1-1." + i);
1188                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoi#1-2." + i);
1189                                 // end of an item
1190                         }
1191
1192                         Assert.IsTrue (r.Read (), "emitems#1");
1193                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emitems#2"); // XamlLanguage.Items
1194
1195                         Assert.IsTrue (r.Read (), "eo#1-1");
1196                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2"); // Dictionary
1197
1198                         Assert.IsFalse (r.Read (), "end");
1199                 }
1200
1201                 [Test]
1202                 public void Read_Dictionary2 ()
1203                 {
1204                         var obj = new Dictionary<string,Type> ();
1205                         obj ["Foo"] = typeof (int);
1206                         obj ["Bar"] = typeof (Dictionary<Type,XamlType>);
1207                         var r = new XamlObjectReader (obj);
1208
1209                         Assert.IsTrue (r.Read (), "ns#1-1");
1210                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1211                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1212                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1213                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#1-5");
1214
1215                         Assert.IsTrue (r.Read (), "ns#2-1");
1216                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2-2");
1217                         Assert.IsNotNull (r.Namespace, "ns#2-3");
1218                         Assert.AreEqual ("s", r.Namespace.Prefix, "ns#2-4");
1219                         Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#2-5");
1220
1221                         Assert.IsTrue (r.Read (), "ns#3-1");
1222                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#3-2");
1223                         Assert.IsNotNull (r.Namespace, "ns#3-3");
1224                         Assert.AreEqual ("sx", r.Namespace.Prefix, "ns#3-4");
1225                         Assert.AreEqual ("clr-namespace:System.Xaml;assembly=System.Xaml", r.Namespace.Namespace, "ns#3-5");
1226
1227                         Assert.IsTrue (r.Read (), "ns#4-1");
1228                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#4-2");
1229                         Assert.IsNotNull (r.Namespace, "ns#4-3");
1230                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4-4");
1231                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#4-5");
1232
1233                         Assert.IsTrue (r.Read (), "so#1-1");
1234                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1235                         var xt = new XamlType (typeof (Dictionary<string,Type>), r.SchemaContext);
1236                         Assert.AreEqual (xt, r.Type, "so#1-3");
1237                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1238
1239                         Assert.IsTrue (r.Read (), "smitems#1");
1240                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smitems#2");
1241                         Assert.AreEqual (XamlLanguage.Items, r.Member, "smitems#3");
1242
1243                         for (int i = 0; i < 2; i++) {
1244
1245                                 // start of an item
1246                                 Assert.IsTrue (r.Read (), "soi#1-1." + i);
1247                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soi#1-2." + i);
1248                                 var xt2 = XamlLanguage.Type;
1249                                 Assert.AreEqual (xt2, r.Type, "soi#1-3." + i);
1250
1251                                 Assert.IsTrue (r.Read (), "smi#1-1." + i);
1252                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#1-2." + i);
1253                                 Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "smi#1-3." + i);
1254
1255                                 Assert.IsTrue (r.Read (), "svi#1-1." + i);
1256                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#1-2." + i);
1257                                 Assert.AreEqual (i == 0 ? "x:Int32" : "Dictionary(s:Type, sx:XamlType)", r.Value, "svi#1-3." + i);
1258
1259                                 Assert.IsTrue (r.Read (), "emi#1-1." + i);
1260                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#1-2." + i);
1261
1262                                 Assert.IsTrue (r.Read (), "smi#2-1." + i);
1263                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#2-2." + i);
1264                                 Assert.AreEqual (XamlLanguage.Key, r.Member, "smi#2-3." + i);
1265
1266                                 Assert.IsTrue (r.Read (), "svi#2-1." + i);
1267                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#2-2." + i);
1268                                 Assert.AreEqual (i == 0 ? "Foo" : "Bar", r.Value, "svi#2-3." + i);
1269
1270                                 Assert.IsTrue (r.Read (), "emi#2-1." + i);
1271                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#2-2." + i);
1272
1273                                 Assert.IsTrue (r.Read (), "eoi#1-1." + i);
1274                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoi#1-2." + i);
1275                                 // end of an item
1276                         }
1277
1278                         Assert.IsTrue (r.Read (), "emitems#1");
1279                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emitems#2"); // XamlLanguage.Items
1280
1281                         Assert.IsTrue (r.Read (), "eo#1-1");
1282                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2"); // Dictionary
1283
1284                         Assert.IsFalse (r.Read (), "end");
1285                 }
1286                 
1287                 [Test]
1288                 public void PositionalParameters1 ()
1289                 {
1290                         // ns1 > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
1291
1292                         // Note: this can be read, but cannot be written to XML.
1293                         var obj = new PositionalParametersClass1 ("foo", 5);
1294                         var r = new XamlObjectReader (obj);
1295
1296                         Assert.IsTrue (r.Read (), "ns#1-1");
1297                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1298                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1299                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1300                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
1301
1302                         Assert.IsTrue (r.Read (), "so#1-1");
1303                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1304                         var xt = new XamlType (typeof (PositionalParametersClass1), r.SchemaContext);
1305                         Assert.AreEqual (xt, r.Type, "so#1-3");
1306                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1307
1308                         Assert.IsTrue (r.Read (), "sposprm#1");
1309                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
1310                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sposprm#3");
1311
1312                         Assert.IsTrue (r.Read (), "sva#1-1");
1313                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
1314                         Assert.AreEqual ("foo", r.Value, "sva#1-3");
1315
1316                         Assert.IsTrue (r.Read (), "sva#2-1");
1317                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#2-2");
1318                         Assert.AreEqual ("5", r.Value, "sva#2-3");
1319
1320                         Assert.IsTrue (r.Read (), "eposprm#1");
1321                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2"); // XamlLanguage.PositionalParameters
1322
1323                         Assert.IsTrue (r.Read (), "eo#1-1");
1324                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
1325
1326                         Assert.IsFalse (r.Read (), "end");
1327                 }
1328                 
1329                 [Test]
1330                 public void PositionalParameters2 ()
1331                 {
1332                         // ns1 > T:PositionalParametersWrapper > M:Body > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
1333
1334                         var obj = new PositionalParametersWrapper ("foo", 5);
1335                         var r = new XamlObjectReader (obj);
1336
1337                         Assert.IsTrue (r.Read (), "ns#1-1");
1338                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1339                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1340                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1341                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
1342
1343                         Assert.IsTrue (r.Read (), "so#1-1");
1344                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1345                         var xt = new XamlType (typeof (PositionalParametersWrapper), r.SchemaContext);
1346                         Assert.AreEqual (xt, r.Type, "so#1-3");
1347                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1348
1349                         Assert.IsTrue (r.Read (), "sm#1-1");
1350                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#1-2");
1351                         Assert.AreEqual (xt.GetMember ("Body"), r.Member, "sm#1-3");
1352
1353                         xt = new XamlType (typeof (PositionalParametersClass1), r.SchemaContext);
1354                         Assert.IsTrue (r.Read (), "so#2-1");
1355                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2-2");
1356                         Assert.AreEqual (xt, r.Type, "so#2-3");
1357                         Assert.AreEqual (obj.Body, r.Instance, "so#2-4");
1358
1359                         Assert.IsTrue (r.Read (), "sposprm#1");
1360                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
1361                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sposprm#3");
1362
1363                         Assert.IsTrue (r.Read (), "sva#1-1");
1364                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
1365                         Assert.AreEqual ("foo", r.Value, "sva#1-3");
1366
1367                         Assert.IsTrue (r.Read (), "sva#2-1");
1368                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#2-2");
1369                         Assert.AreEqual ("5", r.Value, "sva#2-3");
1370
1371                         Assert.IsTrue (r.Read (), "eposprm#1");
1372                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2"); // XamlLanguage.PositionalParameters
1373
1374                         Assert.IsTrue (r.Read (), "eo#2-1");
1375                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2-2");
1376
1377                         Assert.IsTrue (r.Read (), "em#1-1");
1378                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eo#1-2");
1379
1380                         Assert.IsTrue (r.Read (), "eo#1-1");
1381                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
1382
1383                         Assert.IsFalse (r.Read (), "end");
1384                 }
1385                 
1386                 [Test]
1387                 public void ComplexPositionalParameters ()
1388                 {
1389                         var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
1390                         var r = new XamlObjectReader (obj);
1391
1392                         Assert.IsTrue (r.Read (), "ns#1-1");
1393                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1394                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1395                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1396                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
1397
1398                         Assert.IsTrue (r.Read (), "ns#2-1");
1399                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2-2");
1400                         Assert.IsNotNull (r.Namespace, "ns#2-3");
1401                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#2-4");
1402                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#2-5");
1403
1404                         Assert.IsTrue (r.Read (), "so#1-1");
1405                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1406                         var xt = new XamlType (obj.GetType (), r.SchemaContext);
1407                         Assert.AreEqual (xt, r.Type, "so#1-3");
1408                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1409
1410                         Assert.IsTrue (r.Read (), "sm#1-1");
1411                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#1-2");
1412                         Assert.AreEqual (xt.GetMember ("Param"), r.Member, "sm#1-3");
1413
1414                         xt = r.SchemaContext.GetXamlType (typeof (ComplexPositionalParameterClass));
1415                         Assert.IsTrue (r.Read (), "so#2-1");
1416                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2-2");
1417                         Assert.AreEqual (xt, r.Type, "so#2-3");
1418                         Assert.AreEqual (obj.Param, r.Instance, "so#2-4");
1419
1420                         Assert.IsTrue (r.Read (), "sarg#1");
1421                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sarg#2");
1422                         Assert.AreEqual (XamlLanguage.Arguments, r.Member, "sarg#3");
1423
1424                         Assert.IsTrue (r.Read (), "so#3-1");
1425                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#3-2");
1426                         xt = r.SchemaContext.GetXamlType (typeof (ComplexPositionalParameterValue));
1427                         Assert.AreEqual (xt, r.Type, "so#3-3");
1428
1429                         Assert.IsTrue (r.Read (), "sm#3-1");
1430                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#3-2");
1431                         Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "sm#3-3");
1432                         Assert.IsTrue (r.Read (), "v#3-1");
1433                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#3-2");
1434                         Assert.AreEqual ("foo", r.Value, "v#3-3");
1435
1436                         Assert.IsTrue (r.Read (), "em#3-1");
1437                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#3-2");
1438                         Assert.IsTrue (r.Read (), "eo#3-1");
1439                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#3-2");
1440
1441                         Assert.IsTrue (r.Read (), "earg#1");
1442                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "earg#2"); // XamlLanguage.Arguments
1443
1444                         Assert.IsTrue (r.Read (), "eo#2-1");
1445                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2-2");
1446
1447                         Assert.IsTrue (r.Read (), "em#1-1");
1448                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eo#1-2");
1449
1450                         Assert.IsTrue (r.Read (), "eo#1-1");
1451                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
1452
1453                         Assert.IsFalse (r.Read (), "end");
1454                 }
1455
1456                 [Test]
1457                 public void Read_ListWrapper ()
1458                 {
1459                         var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}));
1460                         var r = new XamlObjectReader (obj);
1461                         
1462                         Assert.IsTrue (r.Read (), "#1");
1463                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
1464                         Assert.IsNotNull (r.Namespace, "#3");
1465                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
1466
1467                         Assert.IsTrue (r.Read (), "#11");
1468                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
1469                         Assert.IsNotNull (r.Namespace, "#13");
1470                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
1471                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
1472
1473                         Assert.IsTrue (r.Read (), "#21");
1474                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
1475                         var xt = new XamlType (obj.GetType (), r.SchemaContext);
1476                         Assert.AreEqual (xt, r.Type, "#23");
1477                         Assert.AreEqual (obj, r.Instance, "#26");
1478
1479                         Assert.IsTrue (r.Read (), "#61");
1480                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
1481                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
1482
1483                         Assert.IsTrue (r.Read (), "#71");
1484                         Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "#71-2");
1485                         Assert.IsNull (r.Type, "#71-3");
1486                         Assert.IsNull (r.Member, "#71-4");
1487                         Assert.IsNull (r.Value, "#71-5");
1488
1489                         Assert.IsTrue (r.Read (), "#72");
1490                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
1491                         Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
1492
1493                         string [] values = {"5", "-3", "0"};
1494                         for (int i = 0; i < 3; i++) {
1495                                 Assert.IsTrue (r.Read (), i + "#73");
1496                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
1497                                 Assert.IsTrue (r.Read (), i + "#74");
1498                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
1499                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
1500                                 Assert.IsTrue (r.Read (), i + "#75");
1501                                 Assert.IsNotNull (r.Value, i + "#75-2");
1502                                 Assert.AreEqual (values [i], r.Value, i + "#73-3");
1503                                 Assert.IsTrue (r.Read (), i + "#74");
1504                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
1505                                 Assert.IsTrue (r.Read (), i + "#75");
1506                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
1507                         }
1508
1509                         Assert.IsTrue (r.Read (), "#81");
1510                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
1511
1512                         Assert.IsTrue (r.Read (), "#83");
1513                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // GetObject
1514
1515                         Assert.IsTrue (r.Read (), "#85");
1516                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ListWrapper.Items
1517
1518                         Assert.IsTrue (r.Read (), "#87");
1519                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ListWrapper
1520
1521                         Assert.IsFalse (r.Read (), "#89");
1522                 }
1523
1524                 [Test]
1525                 public void Read_ListWrapper2 () // read-write list member.
1526                 {
1527                         var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}));
1528                         var r = new XamlObjectReader (obj);
1529                         
1530                         Assert.IsTrue (r.Read (), "#1");
1531                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
1532                         Assert.IsNotNull (r.Namespace, "#3");
1533                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
1534
1535                         Assert.IsTrue (r.Read (), "#6");
1536                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
1537                         Assert.IsNotNull (r.Namespace, "#8");
1538                         Assert.AreEqual ("scg", r.Namespace.Prefix, "#8-2");
1539                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "#8-3");
1540
1541                         Assert.IsTrue (r.Read (), "#11");
1542                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
1543                         Assert.IsNotNull (r.Namespace, "#13");
1544                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
1545                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
1546
1547                         Assert.IsTrue (r.Read (), "#21");
1548                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
1549                         var xt = new XamlType (obj.GetType (), r.SchemaContext);
1550                         Assert.AreEqual (xt, r.Type, "#23");
1551                         Assert.AreEqual (obj, r.Instance, "#26");
1552
1553                         Assert.IsTrue (r.Read (), "#61");
1554                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
1555                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
1556
1557                         Assert.IsTrue (r.Read (), "#71");
1558                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#71-2");
1559                         xt = r.SchemaContext.GetXamlType (typeof (List<int>));
1560                         Assert.AreEqual (xt, r.Type, "#71-3");
1561                         Assert.IsNull (r.Member, "#71-4");
1562                         Assert.IsNull (r.Value, "#71-5");
1563
1564                         // Capacity
1565                         Assert.IsTrue (r.Read (), "#31");
1566                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
1567                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "#33");
1568
1569                         Assert.IsTrue (r.Read (), "#41");
1570                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
1571                         // The value is implementation details, not testable.
1572                         //Assert.AreEqual ("3", r.Value, "#43");
1573
1574                         Assert.IsTrue (r.Read (), "#51");
1575                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
1576
1577                         // Items
1578                         Assert.IsTrue (r.Read (), "#72");
1579                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
1580                         Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
1581
1582                         string [] values = {"5", "-3", "0"};
1583                         for (int i = 0; i < 3; i++) {
1584                                 Assert.IsTrue (r.Read (), i + "#73");
1585                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
1586                                 Assert.IsTrue (r.Read (), i + "#74");
1587                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
1588                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
1589                                 Assert.IsTrue (r.Read (), i + "#75");
1590                                 Assert.IsNotNull (r.Value, i + "#75-2");
1591                                 Assert.AreEqual (values [i], r.Value, i + "#73-3");
1592                                 Assert.IsTrue (r.Read (), i + "#74");
1593                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
1594                                 Assert.IsTrue (r.Read (), i + "#75");
1595                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
1596                         }
1597
1598                         Assert.IsTrue (r.Read (), "#81");
1599                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
1600
1601                         Assert.IsTrue (r.Read (), "#83");
1602                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // StartObject(of List<int>)
1603
1604                         Assert.IsTrue (r.Read (), "#85");
1605                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ListWrapper.Items
1606
1607                         Assert.IsTrue (r.Read (), "#87");
1608                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ListWrapper
1609
1610                         Assert.IsFalse (r.Read (), "#89");
1611                 }
1612                 
1613                 [Test]
1614                 public void ContentIncluded ()
1615                 {
1616                         var obj = new ContentIncludedClass () { Content = "foo" };
1617                         var r = new XamlObjectReader (obj);
1618
1619                         Assert.IsTrue (r.Read (), "ns#1-1");
1620                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1621                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1622                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1623                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
1624
1625                         Assert.IsTrue (r.Read (), "so#1-1");
1626                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1627                         var xt = new XamlType (typeof (ContentIncludedClass), r.SchemaContext);
1628                         Assert.AreEqual (xt, r.Type, "so#1-3");
1629                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1630
1631                         Assert.IsTrue (r.Read (), "sposprm#1");
1632                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
1633                         Assert.AreEqual (xt.GetMember ("Content"), r.Member, "sposprm#3");
1634
1635                         Assert.IsTrue (r.Read (), "sva#1-1");
1636                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
1637                         Assert.AreEqual ("foo", r.Value, "sva#1-3");
1638
1639                         Assert.IsTrue (r.Read (), "eposprm#1");
1640                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2"); // XamlLanguage.PositionalParameters
1641
1642                         Assert.IsTrue (r.Read (), "eo#1-1");
1643                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
1644
1645                         Assert.IsFalse (r.Read (), "end");
1646                 }
1647
1648                 void SimpleReadStandardType (object instance)
1649                 {
1650                         var r = new XamlObjectReader (instance);
1651                         while (!r.IsEof)
1652                                 r.Read ();
1653                 }
1654
1655                 void Read_CommonXamlPrimitive (object obj)
1656                 {
1657                         var r = new XamlObjectReader (obj);
1658                         Read_CommonXamlType (r);
1659                         Read_Initialization (r, obj);
1660                 }
1661
1662                 // from StartMember of Initialization to EndMember
1663                 string Read_Initialization (XamlObjectReader r, object comparableValue)
1664                 {
1665                         Assert.IsTrue (r.Read (), "init#1");
1666                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "init#2");
1667                         Assert.IsNotNull (r.Member, "init#3");
1668                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "init#3-2");
1669                         Assert.IsTrue (r.Read (), "init#4");
1670                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "init#5");
1671                         Assert.AreEqual (typeof (string), r.Value.GetType (), "init#6");
1672                         string ret = (string) r.Value;
1673                         if (comparableValue != null)
1674                                 Assert.AreEqual (comparableValue.ToString (), r.Value, "init#6-2");
1675                         Assert.IsTrue (r.Read (), "init#7");
1676                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "init#8");
1677                         return ret;
1678                 }
1679
1680                 object [] Read_AttributedArguments_String (XamlObjectReader r, string [] argNames) // valid only for string arguments.
1681                 {
1682                         object [] ret = new object [argNames.Length];
1683
1684                         Assert.IsTrue (r.Read (), "attarg.Arguments.Start1");
1685                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "attarg.Arguments.Start2");
1686                         Assert.IsNotNull (r.Member, "attarg.Arguments.Start3");
1687                         Assert.AreEqual (XamlLanguage.Arguments, r.Member, "attarg.Arguments.Start4");
1688                         for (int i = 0; i < argNames.Length; i++) {
1689                                 string arg = argNames [i];
1690                                 Assert.IsTrue (r.Read (), "attarg.ArgStartObject1." + arg);
1691                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "attarg.ArgStartObject2." + arg);
1692                                 Assert.AreEqual (typeof (string), r.Type.UnderlyingType, "attarg.ArgStartObject3." + arg);
1693                                 Assert.IsTrue (r.Read (), "attarg.ArgStartMember1." + arg);
1694                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "attarg.ArgStartMember2." + arg);
1695                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "attarg.ArgStartMember3." + arg); // (as the argument is string here by definition)
1696                                 Assert.IsTrue (r.Read (), "attarg.ArgValue1." + arg);
1697                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "attarg.ArgValue2." + arg);
1698                                 Assert.AreEqual (typeof (string), r.Value.GetType (), "attarg.ArgValue3." + arg);
1699                                 ret [i] = r.Value;
1700                                 Assert.IsTrue (r.Read (), "attarg.ArgEndMember1." + arg);
1701                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "attarg.ArgEndMember2." + arg);
1702                                 Assert.IsTrue (r.Read (), "attarg.ArgEndObject1." + arg);
1703                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "attarg.ArgEndObject2." + arg);
1704                         }
1705                         Assert.IsTrue (r.Read (), "attarg.Arguments.End1");
1706                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "attarg.Arguments.End2");
1707                         return ret;
1708                 }
1709
1710                 // from initial to StartObject
1711                 void Read_CommonXamlType (XamlObjectReader r)
1712                 {
1713                         Assert.IsTrue (r.Read (), "ct#1");
1714                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
1715                         Assert.IsNotNull (r.Namespace, "ct#3");
1716                         Assert.AreEqual ("x", r.Namespace.Prefix, "ct#3-2");
1717                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ct#3-3");
1718                         Assert.IsNull (r.Instance, "ct#4");
1719
1720                         Assert.IsTrue (r.Read (), "ct#5");
1721                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#6");
1722                 }
1723
1724                 // from initial to StartObject
1725                 void Read_CommonClrType (XamlObjectReader r, object obj, params KeyValuePair<string,string> [] additionalNamespaces)
1726                 {
1727                         Assert.IsTrue (r.Read (), "ct#1");
1728                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
1729                         Assert.IsNotNull (r.Namespace, "ct#3");
1730                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ct#3-2");
1731                         Assert.AreEqual ("clr-namespace:" + obj.GetType ().Namespace + ";assembly=" + obj.GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ct#3-3");
1732
1733                         foreach (var kvp in additionalNamespaces) {
1734                                 Assert.IsTrue (r.Read (), "ct#4." + kvp.Key);
1735                                 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#5." + kvp.Key);
1736                                 Assert.IsNotNull (r.Namespace, "ct#6." + kvp.Key);
1737                                 Assert.AreEqual (kvp.Key, r.Namespace.Prefix, "ct#6-2." + kvp.Key);
1738                                 Assert.AreEqual (kvp.Value, r.Namespace.Namespace, "ct#6-3." + kvp.Key);
1739                         }
1740
1741                         Assert.IsTrue (r.Read (), "ct#7");
1742                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#8");
1743                 }
1744         }
1745 }