Make it strict to apply PositionalParameters to limit to only simple arguments.
[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 PositionalParameters1 ()
1203                 {
1204                         // ns1 > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
1205
1206                         // Note: this can be read, but cannot be written to XML.
1207                         var obj = new PositionalParametersClass1 ("foo", 5);
1208                         var r = new XamlObjectReader (obj);
1209
1210                         Assert.IsTrue (r.Read (), "ns#1-1");
1211                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1212                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1213                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1214                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
1215
1216                         Assert.IsTrue (r.Read (), "so#1-1");
1217                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1218                         var xt = new XamlType (typeof (PositionalParametersClass1), r.SchemaContext);
1219                         Assert.AreEqual (xt, r.Type, "so#1-3");
1220                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1221
1222                         Assert.IsTrue (r.Read (), "sposprm#1");
1223                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
1224                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sposprm#3");
1225
1226                         Assert.IsTrue (r.Read (), "sva#1-1");
1227                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
1228                         Assert.AreEqual ("foo", r.Value, "sva#1-3");
1229
1230                         Assert.IsTrue (r.Read (), "sva#2-1");
1231                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#2-2");
1232                         Assert.AreEqual ("5", r.Value, "sva#2-3");
1233
1234                         Assert.IsTrue (r.Read (), "eposprm#1");
1235                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2"); // XamlLanguage.PositionalParameters
1236
1237                         Assert.IsTrue (r.Read (), "eo#1-1");
1238                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
1239
1240                         Assert.IsFalse (r.Read (), "end");
1241                 }
1242                 
1243                 [Test]
1244                 public void PositionalParameters2 ()
1245                 {
1246                         // ns1 > T:PositionalParametersWrapper > M:Body > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
1247
1248                         var obj = new PositionalParametersWrapper ("foo", 5);
1249                         var r = new XamlObjectReader (obj);
1250
1251                         Assert.IsTrue (r.Read (), "ns#1-1");
1252                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1253                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1254                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1255                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
1256
1257                         Assert.IsTrue (r.Read (), "so#1-1");
1258                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1259                         var xt = new XamlType (typeof (PositionalParametersWrapper), r.SchemaContext);
1260                         Assert.AreEqual (xt, r.Type, "so#1-3");
1261                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1262
1263                         Assert.IsTrue (r.Read (), "sm#1-1");
1264                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#1-2");
1265                         Assert.AreEqual (xt.GetMember ("Body"), r.Member, "sm#1-3");
1266
1267                         xt = new XamlType (typeof (PositionalParametersClass1), r.SchemaContext);
1268                         Assert.IsTrue (r.Read (), "so#2-1");
1269                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2-2");
1270                         Assert.AreEqual (xt, r.Type, "so#2-3");
1271                         Assert.AreEqual (obj.Body, r.Instance, "so#2-4");
1272
1273                         Assert.IsTrue (r.Read (), "sposprm#1");
1274                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
1275                         Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sposprm#3");
1276
1277                         Assert.IsTrue (r.Read (), "sva#1-1");
1278                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
1279                         Assert.AreEqual ("foo", r.Value, "sva#1-3");
1280
1281                         Assert.IsTrue (r.Read (), "sva#2-1");
1282                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#2-2");
1283                         Assert.AreEqual ("5", r.Value, "sva#2-3");
1284
1285                         Assert.IsTrue (r.Read (), "eposprm#1");
1286                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2"); // XamlLanguage.PositionalParameters
1287
1288                         Assert.IsTrue (r.Read (), "eo#2-1");
1289                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2-2");
1290
1291                         Assert.IsTrue (r.Read (), "em#1-1");
1292                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eo#1-2");
1293
1294                         Assert.IsTrue (r.Read (), "eo#1-1");
1295                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
1296
1297                         Assert.IsFalse (r.Read (), "end");
1298                 }
1299                 
1300                 [Test]
1301                 public void ComplexPositionalParameters ()
1302                 {
1303                         var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
1304                         var r = new XamlObjectReader (obj);
1305
1306                         Assert.IsTrue (r.Read (), "ns#1-1");
1307                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
1308                         Assert.IsNotNull (r.Namespace, "ns#1-3");
1309                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-4");
1310                         Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
1311
1312                         Assert.IsTrue (r.Read (), "ns#2-1");
1313                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2-2");
1314                         Assert.IsNotNull (r.Namespace, "ns#2-3");
1315                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#2-4");
1316                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#2-5");
1317
1318                         Assert.IsTrue (r.Read (), "so#1-1");
1319                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
1320                         var xt = new XamlType (obj.GetType (), r.SchemaContext);
1321                         Assert.AreEqual (xt, r.Type, "so#1-3");
1322                         Assert.AreEqual (obj, r.Instance, "so#1-4");
1323
1324                         Assert.IsTrue (r.Read (), "sm#1-1");
1325                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#1-2");
1326                         Assert.AreEqual (xt.GetMember ("Param"), r.Member, "sm#1-3");
1327
1328                         xt = r.SchemaContext.GetXamlType (typeof (ComplexPositionalParameterClass));
1329                         Assert.IsTrue (r.Read (), "so#2-1");
1330                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2-2");
1331                         Assert.AreEqual (xt, r.Type, "so#2-3");
1332                         Assert.AreEqual (obj.Param, r.Instance, "so#2-4");
1333
1334                         Assert.IsTrue (r.Read (), "sarg#1");
1335                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sarg#2");
1336                         Assert.AreEqual (XamlLanguage.Arguments, r.Member, "sarg#3");
1337
1338                         Assert.IsTrue (r.Read (), "so#3-1");
1339                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#3-2");
1340                         xt = r.SchemaContext.GetXamlType (typeof (ComplexPositionalParameterValue));
1341                         Assert.AreEqual (xt, r.Type, "so#3-3");
1342
1343                         Assert.IsTrue (r.Read (), "sm#3-1");
1344                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#3-2");
1345                         Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "sm#3-3");
1346                         Assert.IsTrue (r.Read (), "v#3-1");
1347                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#3-2");
1348                         Assert.AreEqual ("foo", r.Value, "v#3-3");
1349
1350                         Assert.IsTrue (r.Read (), "em#3-1");
1351                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#3-2");
1352                         Assert.IsTrue (r.Read (), "eo#3-1");
1353                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#3-2");
1354
1355                         Assert.IsTrue (r.Read (), "earg#1");
1356                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "earg#2"); // XamlLanguage.Arguments
1357
1358                         Assert.IsTrue (r.Read (), "eo#2-1");
1359                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2-2");
1360
1361                         Assert.IsTrue (r.Read (), "em#1-1");
1362                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eo#1-2");
1363
1364                         Assert.IsTrue (r.Read (), "eo#1-1");
1365                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
1366
1367                         Assert.IsFalse (r.Read (), "end");
1368                 }
1369
1370                 [Test]
1371                 public void Read_ListWrapper ()
1372                 {
1373                         var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}));
1374                         var r = new XamlObjectReader (obj);
1375                         
1376                         Assert.IsTrue (r.Read (), "#1");
1377                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
1378                         Assert.IsNotNull (r.Namespace, "#3");
1379                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
1380
1381                         Assert.IsTrue (r.Read (), "#11");
1382                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
1383                         Assert.IsNotNull (r.Namespace, "#13");
1384                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
1385                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
1386
1387                         Assert.IsTrue (r.Read (), "#21");
1388                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
1389                         var xt = new XamlType (obj.GetType (), r.SchemaContext);
1390                         Assert.AreEqual (xt, r.Type, "#23");
1391                         Assert.AreEqual (obj, r.Instance, "#26");
1392
1393                         Assert.IsTrue (r.Read (), "#61");
1394                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
1395                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
1396
1397                         Assert.IsTrue (r.Read (), "#71");
1398                         Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "#71-2");
1399                         Assert.IsNull (r.Type, "#71-3");
1400                         Assert.IsNull (r.Member, "#71-4");
1401                         Assert.IsNull (r.Value, "#71-5");
1402
1403                         Assert.IsTrue (r.Read (), "#72");
1404                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
1405                         Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
1406
1407                         string [] values = {"5", "-3", "0"};
1408                         for (int i = 0; i < 3; i++) {
1409                                 Assert.IsTrue (r.Read (), i + "#73");
1410                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
1411                                 Assert.IsTrue (r.Read (), i + "#74");
1412                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
1413                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
1414                                 Assert.IsTrue (r.Read (), i + "#75");
1415                                 Assert.IsNotNull (r.Value, i + "#75-2");
1416                                 Assert.AreEqual (values [i], r.Value, i + "#73-3");
1417                                 Assert.IsTrue (r.Read (), i + "#74");
1418                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
1419                                 Assert.IsTrue (r.Read (), i + "#75");
1420                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
1421                         }
1422
1423                         Assert.IsTrue (r.Read (), "#81");
1424                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
1425
1426                         Assert.IsTrue (r.Read (), "#83");
1427                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // GetObject
1428
1429                         Assert.IsTrue (r.Read (), "#85");
1430                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ListWrapper.Items
1431
1432                         Assert.IsTrue (r.Read (), "#87");
1433                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ListWrapper
1434
1435                         Assert.IsFalse (r.Read (), "#89");
1436                 }
1437
1438                 [Test]
1439                 public void Read_ListWrapper2 () // read-write list member.
1440                 {
1441                         var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}));
1442                         var r = new XamlObjectReader (obj);
1443                         
1444                         Assert.IsTrue (r.Read (), "#1");
1445                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
1446                         Assert.IsNotNull (r.Namespace, "#3");
1447                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
1448
1449                         Assert.IsTrue (r.Read (), "#6");
1450                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
1451                         Assert.IsNotNull (r.Namespace, "#8");
1452                         Assert.AreEqual ("scg", r.Namespace.Prefix, "#8-2");
1453                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "#8-3");
1454
1455                         Assert.IsTrue (r.Read (), "#11");
1456                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
1457                         Assert.IsNotNull (r.Namespace, "#13");
1458                         Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
1459                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
1460
1461                         Assert.IsTrue (r.Read (), "#21");
1462                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
1463                         var xt = new XamlType (obj.GetType (), r.SchemaContext);
1464                         Assert.AreEqual (xt, r.Type, "#23");
1465                         Assert.AreEqual (obj, r.Instance, "#26");
1466
1467                         Assert.IsTrue (r.Read (), "#61");
1468                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
1469                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
1470
1471                         Assert.IsTrue (r.Read (), "#71");
1472                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#71-2");
1473                         xt = r.SchemaContext.GetXamlType (typeof (List<int>));
1474                         Assert.AreEqual (xt, r.Type, "#71-3");
1475                         Assert.IsNull (r.Member, "#71-4");
1476                         Assert.IsNull (r.Value, "#71-5");
1477
1478                         // Capacity
1479                         Assert.IsTrue (r.Read (), "#31");
1480                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
1481                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "#33");
1482
1483                         Assert.IsTrue (r.Read (), "#41");
1484                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
1485                         // The value is implementation details, not testable.
1486                         //Assert.AreEqual ("3", r.Value, "#43");
1487
1488                         Assert.IsTrue (r.Read (), "#51");
1489                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
1490
1491                         // Items
1492                         Assert.IsTrue (r.Read (), "#72");
1493                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
1494                         Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
1495
1496                         string [] values = {"5", "-3", "0"};
1497                         for (int i = 0; i < 3; i++) {
1498                                 Assert.IsTrue (r.Read (), i + "#73");
1499                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
1500                                 Assert.IsTrue (r.Read (), i + "#74");
1501                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
1502                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
1503                                 Assert.IsTrue (r.Read (), i + "#75");
1504                                 Assert.IsNotNull (r.Value, i + "#75-2");
1505                                 Assert.AreEqual (values [i], r.Value, i + "#73-3");
1506                                 Assert.IsTrue (r.Read (), i + "#74");
1507                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
1508                                 Assert.IsTrue (r.Read (), i + "#75");
1509                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
1510                         }
1511
1512                         Assert.IsTrue (r.Read (), "#81");
1513                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
1514
1515                         Assert.IsTrue (r.Read (), "#83");
1516                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // StartObject(of List<int>)
1517
1518                         Assert.IsTrue (r.Read (), "#85");
1519                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ListWrapper.Items
1520
1521                         Assert.IsTrue (r.Read (), "#87");
1522                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ListWrapper
1523
1524                         Assert.IsFalse (r.Read (), "#89");
1525                 }
1526
1527                 void SimpleReadStandardType (object instance)
1528                 {
1529                         var r = new XamlObjectReader (instance);
1530                         while (!r.IsEof)
1531                                 r.Read ();
1532                 }
1533
1534                 void Read_CommonXamlPrimitive (object obj)
1535                 {
1536                         var r = new XamlObjectReader (obj);
1537                         Read_CommonXamlType (r);
1538                         Read_Initialization (r, obj);
1539                 }
1540
1541                 // from StartMember of Initialization to EndMember
1542                 string Read_Initialization (XamlObjectReader r, object comparableValue)
1543                 {
1544                         Assert.IsTrue (r.Read (), "init#1");
1545                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "init#2");
1546                         Assert.IsNotNull (r.Member, "init#3");
1547                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "init#3-2");
1548                         Assert.IsTrue (r.Read (), "init#4");
1549                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "init#5");
1550                         Assert.AreEqual (typeof (string), r.Value.GetType (), "init#6");
1551                         string ret = (string) r.Value;
1552                         if (comparableValue != null)
1553                                 Assert.AreEqual (comparableValue.ToString (), r.Value, "init#6-2");
1554                         Assert.IsTrue (r.Read (), "init#7");
1555                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "init#8");
1556                         return ret;
1557                 }
1558
1559                 object [] Read_AttributedArguments_String (XamlObjectReader r, string [] argNames) // valid only for string arguments.
1560                 {
1561                         object [] ret = new object [argNames.Length];
1562
1563                         Assert.IsTrue (r.Read (), "attarg.Arguments.Start1");
1564                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "attarg.Arguments.Start2");
1565                         Assert.IsNotNull (r.Member, "attarg.Arguments.Start3");
1566                         Assert.AreEqual (XamlLanguage.Arguments, r.Member, "attarg.Arguments.Start4");
1567                         for (int i = 0; i < argNames.Length; i++) {
1568                                 string arg = argNames [i];
1569                                 Assert.IsTrue (r.Read (), "attarg.ArgStartObject1." + arg);
1570                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "attarg.ArgStartObject2." + arg);
1571                                 Assert.AreEqual (typeof (string), r.Type.UnderlyingType, "attarg.ArgStartObject3." + arg);
1572                                 Assert.IsTrue (r.Read (), "attarg.ArgStartMember1." + arg);
1573                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "attarg.ArgStartMember2." + arg);
1574                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "attarg.ArgStartMember3." + arg); // (as the argument is string here by definition)
1575                                 Assert.IsTrue (r.Read (), "attarg.ArgValue1." + arg);
1576                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "attarg.ArgValue2." + arg);
1577                                 Assert.AreEqual (typeof (string), r.Value.GetType (), "attarg.ArgValue3." + arg);
1578                                 ret [i] = r.Value;
1579                                 Assert.IsTrue (r.Read (), "attarg.ArgEndMember1." + arg);
1580                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "attarg.ArgEndMember2." + arg);
1581                                 Assert.IsTrue (r.Read (), "attarg.ArgEndObject1." + arg);
1582                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "attarg.ArgEndObject2." + arg);
1583                         }
1584                         Assert.IsTrue (r.Read (), "attarg.Arguments.End1");
1585                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "attarg.Arguments.End2");
1586                         return ret;
1587                 }
1588
1589                 // from initial to StartObject
1590                 void Read_CommonXamlType (XamlObjectReader r)
1591                 {
1592                         Assert.IsTrue (r.Read (), "ct#1");
1593                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
1594                         Assert.IsNotNull (r.Namespace, "ct#3");
1595                         Assert.AreEqual ("x", r.Namespace.Prefix, "ct#3-2");
1596                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ct#3-3");
1597                         Assert.IsNull (r.Instance, "ct#4");
1598
1599                         Assert.IsTrue (r.Read (), "ct#5");
1600                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#6");
1601                 }
1602
1603                 // from initial to StartObject
1604                 void Read_CommonClrType (XamlObjectReader r, object obj, params KeyValuePair<string,string> [] additionalNamespaces)
1605                 {
1606                         Assert.IsTrue (r.Read (), "ct#1");
1607                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
1608                         Assert.IsNotNull (r.Namespace, "ct#3");
1609                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ct#3-2");
1610                         Assert.AreEqual ("clr-namespace:" + obj.GetType ().Namespace + ";assembly=" + obj.GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ct#3-3");
1611
1612                         foreach (var kvp in additionalNamespaces) {
1613                                 Assert.IsTrue (r.Read (), "ct#4." + kvp.Key);
1614                                 Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#5." + kvp.Key);
1615                                 Assert.IsNotNull (r.Namespace, "ct#6." + kvp.Key);
1616                                 Assert.AreEqual (kvp.Key, r.Namespace.Prefix, "ct#6-2." + kvp.Key);
1617                                 Assert.AreEqual (kvp.Value, r.Namespace.Namespace, "ct#6-3." + kvp.Key);
1618                         }
1619
1620                         Assert.IsTrue (r.Read (), "ct#7");
1621                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#8");
1622                 }
1623         }
1624 }