Add more complicated state transition to XamlXmlReader and now it can handle GetObject.
[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                 public void ReadArrayInt32Details ()
401                 {
402                         var r = GetReader ("Array_Int32.xml");
403
404                         Assert.IsTrue (r.Read (), "ns#1");
405                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
406                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
407                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
408
409                         Assert.IsTrue (r.Read (), "soa#1");
410                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soa#2");
411                         var xt = new XamlType (typeof (ArrayExtension), r.SchemaContext);
412                         Assert.AreEqual (xt, r.Type, "soa#3");
413
414                         // base
415                         Assert.IsTrue (r.Read (), "sbase#1");
416                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
417                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
418
419                         Assert.IsTrue (r.Read (), "vbase#1");
420                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
421                         Assert.IsTrue (r.Value is string, "vbase#3");
422
423                         Assert.IsTrue (r.Read (), "ebase#1");
424                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
425
426                         // Type
427                         Assert.IsTrue (r.Read (), "stype#1");
428                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "stype#2");
429                         Assert.AreEqual (xt.GetMember ("Type"), r.Member, "stype#3");
430
431                         // Type
432                         Assert.IsTrue (r.Read (), "vtype#1");
433                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "type#2");
434                         Assert.AreEqual ("x:Int32", r.Value, "vtype#3"); // string value
435
436                         Assert.IsTrue (r.Read (), "etype#1");
437                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
438
439                         // Items
440                         Assert.IsTrue (r.Read (), "sItemsA#1");
441                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItemsA#2");
442                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "sItemsA#3");
443
444                         // (GetObject)
445                         Assert.IsTrue (r.Read (), "go#1");
446                         Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "go#2");
447                         Assert.IsNull (r.Type, "go#3");
448                         Assert.IsNull (r.Member, "go#4");
449                         Assert.IsNull (r.Value, "go#5");
450
451                         Assert.IsTrue (r.Read (), "sItems#1");
452                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
453                         Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
454
455                         int [] values = {4, -5, 0, 255, int.MaxValue};
456                         var ci = new CultureInfo ("en-US");
457
458                         for (int i = 0; i < 5; i++) {
459                                 Assert.IsTrue (r.Read (), "soItem#1." + i);
460                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
461                                 Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
462
463                                 Assert.IsTrue (r.Read (), "sItem#1." + i);
464                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
465                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
466
467                                 Assert.IsTrue (r.Read (), "vItem#1." + i);
468                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
469                                 Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
470
471                                 Assert.IsTrue (r.Read (), "eItem#1." + i);
472                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
473
474                                 Assert.IsTrue (r.Read (), "eoItem#1");
475                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
476                         }
477
478                         Assert.IsTrue (r.Read (), "eItems#1");
479                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
480
481                         // end of GetObject
482                         Assert.IsTrue (r.Read (), "eog#1");
483                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
484
485                         // end of ArrayExtension.Items
486                         Assert.IsTrue (r.Read (), "eItemsA#1");
487                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItemsA#2");
488
489                         // end of ArrayExtension
490                         Assert.IsTrue (r.Read (), "eoa#1");
491                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoa#2");
492
493                         Assert.IsFalse (r.Read (), "end");
494                 }
495
496                 [Test]
497                 public void ReadNullDetails ()
498                 {
499                         var r = GetReader ("NullExtension.xml");
500
501                         Assert.IsTrue (r.Read (), "ns#1");
502                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
503                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
504                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
505
506                         Assert.IsTrue (r.Read (), "so#1");
507                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
508                         var xt = new XamlType (typeof (NullExtension), r.SchemaContext);
509                         Assert.AreEqual (xt, r.Type, "so#3");
510
511                         // base
512                         Assert.IsTrue (r.Read (), "sbase#1");
513                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
514                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
515
516                         Assert.IsTrue (r.Read (), "vbase#1");
517                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
518                         Assert.IsTrue (r.Value is string, "vbase#3");
519
520                         Assert.IsTrue (r.Read (), "ebase#1");
521                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
522
523                         // end of NullExtension
524                         Assert.IsTrue (r.Read (), "eo#1");
525                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
526
527                         Assert.IsFalse (r.Read (), "end");
528                 }
529
530                 [Test]
531                 public void ReadReferenceDetails ()
532                 {
533                         var r = GetReader ("Reference.xml");
534
535                         Assert.IsTrue (r.Read (), "ns#1");
536                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
537                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
538                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
539
540                         Assert.IsTrue (r.Read (), "so#1");
541                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
542                         var xt = new XamlType (typeof (Reference), r.SchemaContext);
543                         Assert.AreEqual (xt, r.Type, "so#3");
544
545                         // base
546                         Assert.IsTrue (r.Read (), "sbase#1");
547                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
548                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
549
550                         Assert.IsTrue (r.Read (), "vbase#1");
551                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
552                         Assert.IsTrue (r.Value is string, "vbase#3");
553
554                         Assert.IsTrue (r.Read (), "ebase#1");
555                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
556
557                         // value
558                         Assert.IsTrue (r.Read (), "sinit#1");
559                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
560                         Assert.AreEqual (xt.GetMember ("Name"), r.Member, "sinit#3");
561
562                         Assert.IsTrue (r.Read (), "vinit#1");
563                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
564                         Assert.AreEqual ("FooBar", r.Value, "vinit#3"); // string
565
566                         Assert.IsTrue (r.Read (), "einit#1");
567                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
568
569                         // end of Reference
570                         Assert.IsTrue (r.Read (), "eo#1");
571                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
572
573                         Assert.IsFalse (r.Read (), "end");
574                 }
575         }
576 }