Use MarkupExtension.ProvideValue() so that XamlObjectReader can return expected Resul...
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlXmlReaderTest.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.Globalization;
28 using System.IO;
29 using System.Linq;
30 using System.Reflection;
31 using System.Windows.Markup;
32 using System.Xaml;
33 using System.Xaml.Schema;
34 using System.Xml;
35 using NUnit.Framework;
36
37 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
38
39 namespace MonoTests.System.Xaml
40 {
41         [TestFixture]
42         public class XamlXmlReaderTest
43         {
44
45                 // read test
46
47                 XamlReader GetReader (string filename)
48                 {
49                         return new XamlXmlReader (XmlReader.Create (Path.Combine ("Test/XmlFiles", filename), new XmlReaderSettings () { CloseInput =true }));
50                 }
51
52                 void ReadTest (string filename)
53                 {
54                         var r = GetReader (filename);
55                         while (!r.IsEof)
56                                 r.Read ();
57                 }
58
59                 T LoadTest<T> (string filename)
60                 {
61                         Type type = typeof (T);
62                         var obj = XamlServices.Load (GetReader (filename));
63                         Assert.AreEqual (type, obj.GetType (), "type");
64                         return (T) obj;
65                 }
66
67                 [Test]
68                 public void Read_String ()
69                 {
70                         ReadTest ("String.xml");
71                         var ret = LoadTest<string> ("String.xml");
72                         Assert.AreEqual ("foo", ret, "ret");
73                 }
74
75                 [Test]
76                 public void Read_Int32 ()
77                 {
78                         ReadTest ("Int32.xml");
79                         var ret = LoadTest<int> ("Int32.xml");
80                         Assert.AreEqual (5, ret, "ret");
81                 }
82
83                 [Test]
84                 public void Read_DateTime ()
85                 {
86                         ReadTest ("DateTime.xml");
87                         var ret = LoadTest<DateTime> ("DateTime.xml");
88                         Assert.AreEqual (new DateTime (2010, 4, 14), ret, "ret");
89                 }
90
91                 [Test]
92                 public void Read_TimeSpan ()
93                 {
94                         ReadTest ("TimeSpan.xml");
95                         var ret = LoadTest<TimeSpan> ("TimeSpan.xml");
96                         Assert.AreEqual (TimeSpan.FromMinutes (7), ret, "ret");
97                 }
98
99                 [Test]
100                 public void Read_Null ()
101                 {
102                         ReadTest ("NullExtension.xml");
103                         Assert.IsNull (XamlServices.Load (GetReader ("NullExtension.xml")));
104                 }
105
106                 [Test]
107                 public void Read_Reference ()
108                 {
109                         ReadTest ("Reference.xml");
110                         var ret = XamlServices.Load (GetReader ("Reference.xml"));
111                         Assert.IsNotNull (ret, "#1"); // the returned value is however not a Reference (in .NET 4.0 it is MS.Internal.Xaml.Context.NameFixupToken).
112                 }
113
114                 [Test]
115                 public void Read_ArrayInt32 ()
116                 {
117                         ReadTest ("Array_Int32.xml");
118                         //LoadTest<int[]> ("Array_Int32.xml");
119                 }
120
121                 [Test]
122                 public void Read_ListInt32 ()
123                 {
124                         ReadTest ("List_Int32.xml");
125                         var ret = LoadTest<List<int>> ("List_Int32.xml");
126                         Assert.AreEqual (5, ret.Count, "#1");
127                         Assert.AreEqual (2147483647, ret [4], "#2");
128                 }
129
130                 [Test]
131                 [Category ("NotWorking")]
132                 public void Read_DictionaryInt32String ()
133                 {
134                         ReadTest ("Dictionary_Int32_String.xml");
135                         //LoadTest<Dictionary<int,string>> ("Dictionary_Int32_String.xml");
136                 }
137
138                 [Test]
139                 [Category ("NotWorking")]
140                 public void Read_DictionaryStringType ()
141                 {
142                         ReadTest ("Dictionary_String_Type.xml");
143                         //LoadTest<Dictionary<string,Type>> ("Dictionary_String_Type.xml");
144                 }
145
146                 [Test]
147                 public void Read_SilverlightApp1 ()
148                 {
149                         ReadTest ("SilverlightApp1.xaml");
150                 }
151
152                 [Test]
153                 public void ReadInt32Details ()
154                 {
155                         var r = GetReader ("Int32.xml");
156
157                         Assert.IsTrue (r.Read (), "ns#1");
158                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
159                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
160
161                         Assert.IsTrue (r.Read (), "so#1");
162                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
163                         Assert.AreEqual (XamlLanguage.Int32, r.Type, "so#3");
164
165                         Assert.IsTrue (r.Read (), "sbase#1");
166                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
167                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
168
169                         Assert.IsTrue (r.Read (), "vbase#1");
170                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
171                         Assert.IsTrue (r.Value is string, "vbase#3");
172
173                         Assert.IsTrue (r.Read (), "ebase#1");
174                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
175
176                         Assert.IsTrue (r.Read (), "sinit#1");
177                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
178                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
179
180                         Assert.IsTrue (r.Read (), "vinit#1");
181                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
182                         Assert.AreEqual ("5", r.Value, "vinit#3"); // string
183
184                         Assert.IsTrue (r.Read (), "einit#1");
185                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
186
187                         Assert.IsTrue (r.Read (), "eo#1");
188                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
189
190                         Assert.IsFalse (r.Read (), "end");
191                 }
192
193                 [Test]
194                 public void ReadDateTimeDetails ()
195                 {
196                         var r = GetReader ("DateTime.xml");
197
198                         Assert.IsTrue (r.Read (), "ns#1");
199                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
200                         Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
201
202                         Assert.IsTrue (r.Read (), "so#1");
203                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
204                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (DateTime)), r.Type, "so#3");
205
206                         Assert.IsTrue (r.Read (), "sbase#1");
207                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
208                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
209
210                         Assert.IsTrue (r.Read (), "vbase#1");
211                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
212                         Assert.IsTrue (r.Value is string, "vbase#3");
213
214                         Assert.IsTrue (r.Read (), "ebase#21");
215
216                         Assert.IsTrue (r.Read (), "sinit#1");
217                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
218                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
219
220                         Assert.IsTrue (r.Read (), "vinit#1");
221                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
222                         Assert.AreEqual ("2010-04-14", r.Value, "vinit#3"); // string
223
224                         Assert.IsTrue (r.Read (), "einit#1");
225                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
226
227                         Assert.IsTrue (r.Read (), "eo#1");
228                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
229                         Assert.IsFalse (r.Read (), "end");
230                 }
231
232                 [Test]
233                 public void ReadTypeDetails ()
234                 {
235                         var r = GetReader ("Type.xml");
236
237                         Assert.IsTrue (r.Read (), "ns#1");
238                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
239                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
240
241                         Assert.IsTrue (r.Read (), "so#1");
242                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
243                         Assert.AreEqual (XamlLanguage.Type, r.Type, "so#3");
244
245                         Assert.IsTrue (r.Read (), "sbase#1");
246                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
247                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
248
249                         Assert.IsTrue (r.Read (), "vbase#1");
250                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
251                         Assert.IsTrue (r.Value is string, "vbase#3");
252
253                         Assert.IsTrue (r.Read (), "ebase#1");
254                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
255
256                         Assert.IsTrue (r.Read (), "sinit#1");
257                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
258                         // FIXME: They are identical on .NET.
259                         // They aren't on mono, every GetMember() returns different object
260                         // (it is the same as .NET; see XamlMemberTest.EqualsTest.) 
261                         // and XamlMember is almost non-comparable unless they
262                         // are identical, so we fail here.
263                         Assert.AreEqual (XamlLanguage.Type.GetMember ("Type").ToString (), r.Member.ToString (), "sinit#3");
264                         //Assert.AreEqual (XamlLanguage.Type.GetMember ("Type"), r.Member, "sinit#3-2");
265                         //Assert.IsTrue (Object.ReferenceEquals (XamlLanguage.Type.GetMember ("Type"), r.Member), "sinit#3-3");
266
267                         Assert.IsTrue (r.Read (), "vinit#1");
268                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
269                         Assert.AreEqual ("x:Int32", r.Value, "vinit#3"); // string
270
271                         Assert.IsTrue (r.Read (), "einit#1");
272                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
273
274                         Assert.IsTrue (r.Read (), "eo#1");
275                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
276
277                         Assert.IsFalse (r.Read (), "end");
278                 }
279
280                 [Test]
281                 public void ReadListInt32Details ()
282                 {
283                         var r = GetReader ("List_Int32.xml");
284
285                         Assert.IsTrue (r.Read (), "ns#1");
286                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
287                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
288                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#4");
289
290                         Assert.IsTrue (r.Read (), "ns2#1");
291                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns2#2");
292                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns2#3");
293                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns2#4");
294
295                         Assert.IsTrue (r.Read (), "so#1");
296                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
297                         var xt = new XamlType (typeof (List<int>), r.SchemaContext);
298                         Assert.AreEqual (xt, r.Type, "so#3");
299
300                         Assert.IsTrue (r.Read (), "sbase#1");
301                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
302                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
303
304                         Assert.IsTrue (r.Read (), "vbase#1");
305                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
306                         Assert.IsTrue (r.Value is string, "vbase#3");
307
308                         Assert.IsTrue (r.Read (), "ebase#1");
309                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
310
311                         Assert.IsTrue (r.Read (), "scap#1");
312                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "scap#2");
313                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "scap#3");
314
315                         Assert.IsTrue (r.Read (), "vcap#1");
316                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vcap#2");
317                         Assert.AreEqual ("5", r.Value, "vcap#3"); // string
318
319                         Assert.IsTrue (r.Read (), "ecap#1");
320                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
321
322                         Assert.IsTrue (r.Read (), "sItems#1");
323                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
324                         Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
325
326                         int [] values = {4, -5, 0, 255, int.MaxValue};
327                         var ci = new CultureInfo ("en-US");
328
329                         for (int i = 0; i < 5; i++) {
330                                 Assert.IsTrue (r.Read (), "soItem#1." + i);
331                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
332                                 Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
333
334                                 Assert.IsTrue (r.Read (), "sItem#1." + i);
335                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
336                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
337
338                                 Assert.IsTrue (r.Read (), "vItem#1." + i);
339                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
340                                 Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
341
342                                 Assert.IsTrue (r.Read (), "eItem#1." + i);
343                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
344
345                                 Assert.IsTrue (r.Read (), "eoItem#1");
346                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
347                         }
348
349                         Assert.IsTrue (r.Read (), "eItems#1");
350                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
351
352                         Assert.IsTrue (r.Read (), "eo#1");
353                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
354
355                         Assert.IsFalse (r.Read (), "end");
356                 }
357
358                 [Test]
359                 public void ReadStringDetails ()
360                 {
361                         var r = GetReader ("String.xml");
362
363                         Assert.IsTrue (r.Read (), "ns#1");
364                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
365                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
366
367                         Assert.IsTrue (r.Read (), "so#1");
368                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
369                         Assert.AreEqual (XamlLanguage.String, r.Type, "so#3");
370
371                         Assert.IsTrue (r.Read (), "sbase#1");
372                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
373                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
374
375                         Assert.IsTrue (r.Read (), "vbase#1");
376                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
377                         Assert.IsTrue (r.Value is string, "vbase#3");
378
379                         Assert.IsTrue (r.Read (), "ebase#1");
380                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
381
382                         Assert.IsTrue (r.Read (), "sinit#1");
383                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
384                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
385
386                         Assert.IsTrue (r.Read (), "vinit#1");
387                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
388                         Assert.AreEqual ("foo", r.Value, "vinit#3"); // string
389
390                         Assert.IsTrue (r.Read (), "einit#1");
391                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
392
393                         Assert.IsTrue (r.Read (), "eo#1");
394                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
395
396                         Assert.IsFalse (r.Read (), "end");
397                 }
398
399                 [Test]
400                 [Category ("NotWorking")]
401                 public void ReadArrayInt32Details ()
402                 {
403                         var r = GetReader ("Array_Int32.xml");
404
405                         Assert.IsTrue (r.Read (), "ns#1");
406                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
407                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
408                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
409
410                         Assert.IsTrue (r.Read (), "soa#1");
411                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soa#2");
412                         var xt = new XamlType (typeof (ArrayExtension), r.SchemaContext);
413                         Assert.AreEqual (xt, r.Type, "soa#3");
414
415                         // base
416                         Assert.IsTrue (r.Read (), "sbase#1");
417                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
418                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
419
420                         Assert.IsTrue (r.Read (), "vbase#1");
421                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
422                         Assert.IsTrue (r.Value is string, "vbase#3");
423
424                         Assert.IsTrue (r.Read (), "ebase#1");
425                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
426
427                         // Type
428                         Assert.IsTrue (r.Read (), "stype#1");
429                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "stype#2");
430                         Assert.AreEqual (xt.GetMember ("Type"), r.Member, "stype#3");
431
432                         // Type
433                         Assert.IsTrue (r.Read (), "vtype#1");
434                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "type#2");
435                         Assert.AreEqual ("x:Int32", r.Value, "vtype#3"); // string value
436
437                         Assert.IsTrue (r.Read (), "etype#1");
438                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
439
440                         // Items
441                         Assert.IsTrue (r.Read (), "sItemsA#1");
442                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItemsA#2");
443                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "sItemsA#3");
444
445                         // (GetObject)
446                         Assert.IsTrue (r.Read (), "go#1");
447                         Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "go#2");
448                         Assert.IsNull (r.Type, "go#3");
449                         Assert.IsNull (r.Member, "go#4");
450                         Assert.IsNull (r.Value, "go#5");
451
452                         Assert.IsTrue (r.Read (), "sItems#1");
453                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
454                         Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
455
456                         int [] values = {4, -5, 0, 255, int.MaxValue};
457                         var ci = new CultureInfo ("en-US");
458
459                         for (int i = 0; i < 5; i++) {
460                                 Assert.IsTrue (r.Read (), "soItem#1." + i);
461                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
462                                 Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
463
464                                 Assert.IsTrue (r.Read (), "sItem#1." + i);
465                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
466                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
467
468                                 Assert.IsTrue (r.Read (), "vItem#1." + i);
469                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
470                                 Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
471
472                                 Assert.IsTrue (r.Read (), "eItem#1." + i);
473                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
474
475                                 Assert.IsTrue (r.Read (), "eoItem#1");
476                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
477                         }
478
479                         Assert.IsTrue (r.Read (), "eItems#1");
480                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
481
482                         // end of GetObject
483                         Assert.IsTrue (r.Read (), "eog#1");
484                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
485
486                         // end of ArrayExtension.Items
487                         Assert.IsTrue (r.Read (), "eItemsA#1");
488                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItemsA#2");
489
490                         // end of ArrayExtension
491                         Assert.IsTrue (r.Read (), "eoa#1");
492                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoa#2");
493
494                         Assert.IsFalse (r.Read (), "end");
495                 }
496
497                 [Test]
498                 public void ReadNullDetails ()
499                 {
500                         var r = GetReader ("NullExtension.xml");
501
502                         Assert.IsTrue (r.Read (), "ns#1");
503                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
504                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
505                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
506
507                         Assert.IsTrue (r.Read (), "so#1");
508                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
509                         var xt = new XamlType (typeof (NullExtension), r.SchemaContext);
510                         Assert.AreEqual (xt, r.Type, "so#3");
511
512                         // base
513                         Assert.IsTrue (r.Read (), "sbase#1");
514                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
515                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
516
517                         Assert.IsTrue (r.Read (), "vbase#1");
518                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
519                         Assert.IsTrue (r.Value is string, "vbase#3");
520
521                         Assert.IsTrue (r.Read (), "ebase#1");
522                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
523
524                         // end of NullExtension
525                         Assert.IsTrue (r.Read (), "eo#1");
526                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
527
528                         Assert.IsFalse (r.Read (), "end");
529                 }
530
531                 [Test]
532                 public void ReadReferenceDetails ()
533                 {
534                         var r = GetReader ("Reference.xml");
535
536                         Assert.IsTrue (r.Read (), "ns#1");
537                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
538                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
539                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
540
541                         Assert.IsTrue (r.Read (), "so#1");
542                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
543                         var xt = new XamlType (typeof (Reference), r.SchemaContext);
544                         Assert.AreEqual (xt, r.Type, "so#3");
545
546                         // base
547                         Assert.IsTrue (r.Read (), "sbase#1");
548                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
549                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
550
551                         Assert.IsTrue (r.Read (), "vbase#1");
552                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
553                         Assert.IsTrue (r.Value is string, "vbase#3");
554
555                         Assert.IsTrue (r.Read (), "ebase#1");
556                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
557
558                         // value
559                         Assert.IsTrue (r.Read (), "sinit#1");
560                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
561                         Assert.AreEqual (xt.GetMember ("Name"), r.Member, "sinit#3");
562
563                         Assert.IsTrue (r.Read (), "vinit#1");
564                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
565                         Assert.AreEqual ("FooBar", r.Value, "vinit#3"); // string
566
567                         Assert.IsTrue (r.Read (), "einit#1");
568                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
569
570                         // end of Reference
571                         Assert.IsTrue (r.Read (), "eo#1");
572                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
573
574                         Assert.IsFalse (r.Read (), "end");
575                 }
576         }
577 }