Implement FactoryMethod and Arguments support in XamlObjectWriter.
[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                         var ret = LoadTest<int[]> ("Array_Int32.xml");
119                         Assert.AreEqual (5, ret.Length, "#1");
120                         Assert.AreEqual (2147483647, ret [4], "#2");
121                 }
122
123                 [Test]
124                 public void Read_ListInt32 ()
125                 {
126                         ReadTest ("List_Int32.xml");
127                         var ret = LoadTest<List<int>> ("List_Int32.xml");
128                         Assert.AreEqual (5, ret.Count, "#1");
129                         Assert.AreEqual (2147483647, ret [4], "#2");
130                 }
131
132                 [Test]
133                 [Category ("NotWorking")]
134                 public void Read_DictionaryInt32String ()
135                 {
136                         ReadTest ("Dictionary_Int32_String.xml");
137                         //LoadTest<Dictionary<int,string>> ("Dictionary_Int32_String.xml");
138                 }
139
140                 [Test]
141                 [Category ("NotWorking")]
142                 public void Read_DictionaryStringType ()
143                 {
144                         ReadTest ("Dictionary_String_Type.xml");
145                         //LoadTest<Dictionary<string,Type>> ("Dictionary_String_Type.xml");
146                 }
147
148                 [Test]
149                 public void Read_SilverlightApp1 ()
150                 {
151                         ReadTest ("SilverlightApp1.xaml");
152                 }
153
154                 [Test]
155                 public void Read_Guid ()
156                 {
157                         ReadTest ("Guid.xml");
158                         var ret = LoadTest<Guid> ("Guid.xml");
159                         Assert.AreEqual (Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09"), ret, "ret");
160                 }
161
162                 [Test]
163                 public void Read_GuidFactoryMethod ()
164                 {
165                         ReadTest ("GuidFactoryMethod.xml");
166                         var ret = LoadTest<Guid> ("GuidFactoryMethod.xml");
167                         Assert.AreEqual (Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09"), ret, "ret");
168                 }
169
170                 [Test]
171                 public void ReadInt32Details ()
172                 {
173                         var r = GetReader ("Int32.xml");
174
175                         Assert.IsTrue (r.Read (), "ns#1");
176                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
177                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
178
179                         Assert.IsTrue (r.Read (), "so#1");
180                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
181                         Assert.AreEqual (XamlLanguage.Int32, r.Type, "so#3");
182
183                         Assert.IsTrue (r.Read (), "sbase#1");
184                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
185                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
186
187                         Assert.IsTrue (r.Read (), "vbase#1");
188                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
189                         Assert.IsTrue (r.Value is string, "vbase#3");
190
191                         Assert.IsTrue (r.Read (), "ebase#1");
192                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
193
194                         Assert.IsTrue (r.Read (), "sinit#1");
195                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
196                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
197
198                         Assert.IsTrue (r.Read (), "vinit#1");
199                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
200                         Assert.AreEqual ("5", r.Value, "vinit#3"); // string
201
202                         Assert.IsTrue (r.Read (), "einit#1");
203                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
204
205                         Assert.IsTrue (r.Read (), "eo#1");
206                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
207
208                         Assert.IsFalse (r.Read (), "end");
209                 }
210
211                 [Test]
212                 public void ReadDateTimeDetails ()
213                 {
214                         var r = GetReader ("DateTime.xml");
215
216                         Assert.IsTrue (r.Read (), "ns#1");
217                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
218                         Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
219
220                         Assert.IsTrue (r.Read (), "so#1");
221                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
222                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (DateTime)), r.Type, "so#3");
223
224                         Assert.IsTrue (r.Read (), "sbase#1");
225                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
226                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
227
228                         Assert.IsTrue (r.Read (), "vbase#1");
229                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
230                         Assert.IsTrue (r.Value is string, "vbase#3");
231
232                         Assert.IsTrue (r.Read (), "ebase#21");
233
234                         Assert.IsTrue (r.Read (), "sinit#1");
235                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
236                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
237
238                         Assert.IsTrue (r.Read (), "vinit#1");
239                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
240                         Assert.AreEqual ("2010-04-14", r.Value, "vinit#3"); // string
241
242                         Assert.IsTrue (r.Read (), "einit#1");
243                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
244
245                         Assert.IsTrue (r.Read (), "eo#1");
246                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
247                         Assert.IsFalse (r.Read (), "end");
248                 }
249
250                 [Test]
251                 public void ReadTypeDetails ()
252                 {
253                         var r = GetReader ("Type.xml");
254
255                         Assert.IsTrue (r.Read (), "ns#1");
256                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
257                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
258
259                         Assert.IsTrue (r.Read (), "so#1");
260                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
261                         Assert.AreEqual (XamlLanguage.Type, r.Type, "so#3");
262
263                         Assert.IsTrue (r.Read (), "sbase#1");
264                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
265                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
266
267                         Assert.IsTrue (r.Read (), "vbase#1");
268                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
269                         Assert.IsTrue (r.Value is string, "vbase#3");
270
271                         Assert.IsTrue (r.Read (), "ebase#1");
272                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
273
274                         Assert.IsTrue (r.Read (), "sinit#1");
275                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
276                         // FIXME: They are identical on .NET.
277                         // They aren't on mono, every GetMember() returns different object
278                         // (it is the same as .NET; see XamlMemberTest.EqualsTest.) 
279                         // and XamlMember is almost non-comparable unless they
280                         // are identical, so we fail here.
281                         Assert.AreEqual (XamlLanguage.Type.GetMember ("Type").ToString (), r.Member.ToString (), "sinit#3");
282                         //Assert.AreEqual (XamlLanguage.Type.GetMember ("Type"), r.Member, "sinit#3-2");
283                         //Assert.IsTrue (Object.ReferenceEquals (XamlLanguage.Type.GetMember ("Type"), r.Member), "sinit#3-3");
284
285                         Assert.IsTrue (r.Read (), "vinit#1");
286                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
287                         Assert.AreEqual ("x:Int32", r.Value, "vinit#3"); // string
288
289                         Assert.IsTrue (r.Read (), "einit#1");
290                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
291
292                         Assert.IsTrue (r.Read (), "eo#1");
293                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
294
295                         Assert.IsFalse (r.Read (), "end");
296                 }
297
298                 [Test]
299                 public void ReadListInt32Details ()
300                 {
301                         var r = GetReader ("List_Int32.xml");
302
303                         Assert.IsTrue (r.Read (), "ns#1");
304                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
305                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
306                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#4");
307
308                         Assert.IsTrue (r.Read (), "ns2#1");
309                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns2#2");
310                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns2#3");
311                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns2#4");
312
313                         Assert.IsTrue (r.Read (), "so#1");
314                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
315                         var xt = new XamlType (typeof (List<int>), r.SchemaContext);
316                         Assert.AreEqual (xt, r.Type, "so#3");
317
318                         Assert.IsTrue (r.Read (), "sbase#1");
319                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
320                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
321
322                         Assert.IsTrue (r.Read (), "vbase#1");
323                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
324                         Assert.IsTrue (r.Value is string, "vbase#3");
325
326                         Assert.IsTrue (r.Read (), "ebase#1");
327                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
328
329                         Assert.IsTrue (r.Read (), "scap#1");
330                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "scap#2");
331                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "scap#3");
332
333                         Assert.IsTrue (r.Read (), "vcap#1");
334                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vcap#2");
335                         Assert.AreEqual ("5", r.Value, "vcap#3"); // string
336
337                         Assert.IsTrue (r.Read (), "ecap#1");
338                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
339
340                         Assert.IsTrue (r.Read (), "sItems#1");
341                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
342                         Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
343
344                         int [] values = {4, -5, 0, 255, int.MaxValue};
345                         var ci = new CultureInfo ("en-US");
346
347                         for (int i = 0; i < 5; i++) {
348                                 Assert.IsTrue (r.Read (), "soItem#1." + i);
349                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
350                                 Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
351
352                                 Assert.IsTrue (r.Read (), "sItem#1." + i);
353                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
354                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
355
356                                 Assert.IsTrue (r.Read (), "vItem#1." + i);
357                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
358                                 Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
359
360                                 Assert.IsTrue (r.Read (), "eItem#1." + i);
361                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
362
363                                 Assert.IsTrue (r.Read (), "eoItem#1");
364                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
365                         }
366
367                         Assert.IsTrue (r.Read (), "eItems#1");
368                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
369
370                         Assert.IsTrue (r.Read (), "eo#1");
371                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
372
373                         Assert.IsFalse (r.Read (), "end");
374                 }
375
376                 [Test]
377                 public void ReadStringDetails ()
378                 {
379                         var r = GetReader ("String.xml");
380
381                         Assert.IsTrue (r.Read (), "ns#1");
382                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
383                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
384
385                         Assert.IsTrue (r.Read (), "so#1");
386                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
387                         Assert.AreEqual (XamlLanguage.String, r.Type, "so#3");
388
389                         Assert.IsTrue (r.Read (), "sbase#1");
390                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
391                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
392
393                         Assert.IsTrue (r.Read (), "vbase#1");
394                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
395                         Assert.IsTrue (r.Value is string, "vbase#3");
396
397                         Assert.IsTrue (r.Read (), "ebase#1");
398                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
399
400                         Assert.IsTrue (r.Read (), "sinit#1");
401                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
402                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
403
404                         Assert.IsTrue (r.Read (), "vinit#1");
405                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
406                         Assert.AreEqual ("foo", r.Value, "vinit#3"); // string
407
408                         Assert.IsTrue (r.Read (), "einit#1");
409                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
410
411                         Assert.IsTrue (r.Read (), "eo#1");
412                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
413
414                         Assert.IsFalse (r.Read (), "end");
415                 }
416
417                 [Test]
418                 public void ReadArrayInt32Details ()
419                 {
420                         var r = GetReader ("Array_Int32.xml");
421
422                         Assert.IsTrue (r.Read (), "ns#1");
423                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
424                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
425                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
426
427                         Assert.IsTrue (r.Read (), "soa#1");
428                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soa#2");
429                         var xt = new XamlType (typeof (ArrayExtension), r.SchemaContext);
430                         Assert.AreEqual (xt, r.Type, "soa#3");
431
432                         // base
433                         Assert.IsTrue (r.Read (), "sbase#1");
434                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
435                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
436
437                         Assert.IsTrue (r.Read (), "vbase#1");
438                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
439                         Assert.IsTrue (r.Value is string, "vbase#3");
440
441                         Assert.IsTrue (r.Read (), "ebase#1");
442                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
443
444                         // Type
445                         Assert.IsTrue (r.Read (), "stype#1");
446                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "stype#2");
447                         Assert.AreEqual (xt.GetMember ("Type"), r.Member, "stype#3");
448
449                         // Type
450                         Assert.IsTrue (r.Read (), "vtype#1");
451                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "type#2");
452                         Assert.AreEqual ("x:Int32", r.Value, "vtype#3"); // string value
453
454                         Assert.IsTrue (r.Read (), "etype#1");
455                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
456
457                         // Items
458                         Assert.IsTrue (r.Read (), "sItemsA#1");
459                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItemsA#2");
460                         Assert.AreEqual (xt.GetMember ("Items"), r.Member, "sItemsA#3");
461
462                         // (GetObject)
463                         Assert.IsTrue (r.Read (), "go#1");
464                         Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "go#2");
465                         Assert.IsNull (r.Type, "go#3");
466                         Assert.IsNull (r.Member, "go#4");
467                         Assert.IsNull (r.Value, "go#5");
468
469                         Assert.IsTrue (r.Read (), "sItems#1");
470                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
471                         Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
472
473                         int [] values = {4, -5, 0, 255, int.MaxValue};
474                         var ci = new CultureInfo ("en-US");
475
476                         for (int i = 0; i < 5; i++) {
477                                 Assert.IsTrue (r.Read (), "soItem#1." + i);
478                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
479                                 Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
480
481                                 Assert.IsTrue (r.Read (), "sItem#1." + i);
482                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
483                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
484
485                                 Assert.IsTrue (r.Read (), "vItem#1." + i);
486                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
487                                 Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
488
489                                 Assert.IsTrue (r.Read (), "eItem#1." + i);
490                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
491
492                                 Assert.IsTrue (r.Read (), "eoItem#1");
493                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
494                         }
495
496                         Assert.IsTrue (r.Read (), "eItems#1");
497                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
498
499                         // end of GetObject
500                         Assert.IsTrue (r.Read (), "eog#1");
501                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
502
503                         // end of ArrayExtension.Items
504                         Assert.IsTrue (r.Read (), "eItemsA#1");
505                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItemsA#2");
506
507                         // end of ArrayExtension
508                         Assert.IsTrue (r.Read (), "eoa#1");
509                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoa#2");
510
511                         Assert.IsFalse (r.Read (), "end");
512                 }
513
514                 [Test]
515                 public void ReadNullDetails ()
516                 {
517                         var r = GetReader ("NullExtension.xml");
518
519                         Assert.IsTrue (r.Read (), "ns#1");
520                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
521                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
522                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
523
524                         Assert.IsTrue (r.Read (), "so#1");
525                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
526                         var xt = new XamlType (typeof (NullExtension), r.SchemaContext);
527                         Assert.AreEqual (xt, r.Type, "so#3");
528
529                         // base
530                         Assert.IsTrue (r.Read (), "sbase#1");
531                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
532                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
533
534                         Assert.IsTrue (r.Read (), "vbase#1");
535                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
536                         Assert.IsTrue (r.Value is string, "vbase#3");
537
538                         Assert.IsTrue (r.Read (), "ebase#1");
539                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
540
541                         // end of NullExtension
542                         Assert.IsTrue (r.Read (), "eo#1");
543                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
544
545                         Assert.IsFalse (r.Read (), "end");
546                 }
547
548                 [Test]
549                 public void ReadReferenceDetails ()
550                 {
551                         var r = GetReader ("Reference.xml");
552
553                         Assert.IsTrue (r.Read (), "ns#1");
554                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
555                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
556                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4");
557
558                         Assert.IsTrue (r.Read (), "so#1");
559                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
560                         var xt = new XamlType (typeof (Reference), r.SchemaContext);
561                         Assert.AreEqual (xt, r.Type, "so#3");
562
563                         // base
564                         Assert.IsTrue (r.Read (), "sbase#1");
565                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
566                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
567
568                         Assert.IsTrue (r.Read (), "vbase#1");
569                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
570                         Assert.IsTrue (r.Value is string, "vbase#3");
571
572                         Assert.IsTrue (r.Read (), "ebase#1");
573                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
574
575                         // value
576                         Assert.IsTrue (r.Read (), "sinit#1");
577                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
578                         Assert.AreEqual (xt.GetMember ("Name"), r.Member, "sinit#3");
579
580                         Assert.IsTrue (r.Read (), "vinit#1");
581                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
582                         Assert.AreEqual ("FooBar", r.Value, "vinit#3"); // string
583
584                         Assert.IsTrue (r.Read (), "einit#1");
585                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
586
587                         // end of Reference
588                         Assert.IsTrue (r.Read (), "eo#1");
589                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
590
591                         Assert.IsFalse (r.Read (), "end");
592                 }
593
594                 [Test]
595                 public void ReadGuidFactoryMethodDetails ()
596                 {
597                         var r = GetReader ("GuidFactoryMethod.xml");
598
599                         Assert.IsTrue (r.Read (), "ns#1");
600                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
601                         Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
602                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#4");
603
604                         Assert.IsTrue (r.Read (), "ns2#1");
605                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns2#2");
606                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns2#3");
607                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns2#4");
608
609                         Assert.IsTrue (r.Read (), "so#1");
610                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
611                         var xt = r.SchemaContext.GetXamlType (typeof (Guid));
612                         Assert.AreEqual (xt, r.Type, "so#3");
613
614                         Assert.IsTrue (r.Read (), "sbase#1");
615                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
616                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
617
618                         Assert.IsTrue (r.Read (), "vbase#1");
619                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
620                         Assert.IsTrue (r.Value is string, "vbase#3");
621
622                         Assert.IsTrue (r.Read (), "ebase#1");
623                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
624
625                         Assert.IsTrue (r.Read (), "sfactory#1");
626                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sfactory#2");
627                         Assert.AreEqual (XamlLanguage.FactoryMethod, r.Member, "sfactory#3");
628
629                         Assert.IsTrue (r.Read (), "vfactory#1");
630                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vfactory#2");
631                         Assert.AreEqual ("Parse", r.Value, "vfactory#3"); // string
632
633                         Assert.IsTrue (r.Read (), "efactory#1");
634                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "efactory#2");
635
636                         Assert.IsTrue (r.Read (), "sarg#1");
637                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sarg#2");
638                         Assert.AreEqual (XamlLanguage.Arguments, r.Member, "sarg#3");
639
640                         Assert.IsTrue (r.Read (), "sarg1#1");
641                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "sarg1#2");
642                         Assert.AreEqual (XamlLanguage.String, r.Type, "sarg1#3");
643
644                         Assert.IsTrue (r.Read (), "sInit#1");
645                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sInit#2");
646                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sInit#3");
647
648                         Assert.IsTrue (r.Read (), "varg1#1");
649                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "varg1#2");
650                         Assert.AreEqual ("9c3345ec-8922-4662-8e8d-a4e41f47cf09", r.Value, "varg1#3");
651
652                         Assert.IsTrue (r.Read (), "eInit#1");
653                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eInit#2");
654
655                         Assert.IsTrue (r.Read (), "earg1#1");
656                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "earg1#2");
657
658                         Assert.IsTrue (r.Read (), "earg#1");
659                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "earg#2");
660
661
662                         Assert.IsTrue (r.Read (), "eo#1");
663                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
664
665                         Assert.IsFalse (r.Read (), "end");
666                 }
667         }
668 }