Support get-based property value (as omitted StartObject form) in XamlXmlReader.
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlObjectWriterTest.cs
1 //
2 // Copyright (C) 2010 Novell Inc. http://novell.com
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
11 // 
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 // 
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 //
23 using System;
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.ComponentModel;
27 using System.IO;
28 using System.Linq;
29 using System.Reflection;
30 using System.Windows.Markup;
31 using System.Xaml;
32 using System.Xaml.Schema;
33 using System.Xml;
34 using NUnit.Framework;
35
36 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
37
38 namespace MonoTests.System.Xaml
39 {
40         [TestFixture]
41         public class XamlObjectWriterTest
42         {
43                 PropertyInfo str_len = typeof (string).GetProperty ("Length");
44                 XamlSchemaContext sctx = new XamlSchemaContext (null, null);
45                 XamlType xt, xt2, xt3, xt4;
46                 XamlMember xm, xm2, xm3;
47
48                 public XamlObjectWriterTest ()
49                 {
50                         xt = new XamlType (typeof (string), sctx);
51                         xt2 = new XamlType (typeof (List<int>), sctx);
52                         xt3 = new XamlType (typeof (TestClass1), sctx);
53                         xt4 = new XamlType (typeof (Foo), sctx);
54                         xm = new XamlMember (str_len, sctx);
55                         xm2 = new XamlMember (typeof (TestClass1).GetProperty ("TestProp1"), sctx);
56                         xm3 = new XamlMember (typeof (TestClass1).GetProperty ("TestProp2"), sctx);
57                 }
58                 
59                 public class TestClass1
60                 {
61                         public TestClass1 ()
62                         {
63                                 TestProp3 = "foobar";
64                         }
65                         public string TestProp1 { get; set; }
66                         // nested.
67                         public TestClass1 TestProp2 { get; set; }
68                         public string TestProp3 { get; set; }
69                         public int TestProp4 { get; set; }
70                 }
71
72                 public class Foo : List<int>
73                 {
74                         public Foo ()
75                         {
76                                 Bar = new List<string> ();
77                         }
78                         public List<string> Bar { get; private set; }
79                         public List<string> Baz { get; set; }
80                         public string Ext { get; set; }
81                 }
82                 
83                 [Test]
84                 [ExpectedException (typeof (ArgumentNullException))]
85                 public void SchemaContextNull ()
86                 {
87                         new XamlObjectWriter (null);
88                 }
89
90                 [Test]
91                 public void SettingsNull ()
92                 {
93                         // allowed.
94                         var w = new XamlObjectWriter (sctx, null);
95                         Assert.AreEqual (sctx, w.SchemaContext, "#1");
96                 }
97
98                 [Test]
99                 [ExpectedException (typeof (XamlObjectWriterException))]
100                 public void InitWriteEndMember ()
101                 {
102                         new XamlObjectWriter (sctx, null).WriteEndMember ();
103                 }
104
105                 [Test]
106                 [ExpectedException (typeof (XamlObjectWriterException))]
107                 public void InitWriteEndObject ()
108                 {
109                         new XamlObjectWriter (sctx, null).WriteEndObject ();
110                 }
111
112                 [Test]
113                 [ExpectedException (typeof (XamlObjectWriterException))]
114                 public void InitWriteGetObject ()
115                 {
116                         new XamlObjectWriter (sctx, null).WriteGetObject ();
117                 }
118
119                 [Test]
120                 [ExpectedException (typeof (XamlObjectWriterException))]
121                 public void InitWriteValue ()
122                 {
123                         new XamlObjectWriter (sctx, null).WriteValue ("foo");
124                 }
125
126                 [Test]
127                 [ExpectedException (typeof (XamlObjectWriterException))]
128                 public void InitWriteStartMember ()
129                 {
130                         new XamlObjectWriter (sctx, null).WriteStartMember (new XamlMember (str_len, sctx));
131                 }
132
133                 [Test]
134                 public void InitWriteNamespace ()
135                 {
136                         var xw = new XamlObjectWriter (sctx, null);
137                         xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "x")); // ignored.
138                         xw.Close ();
139                         Assert.IsNull (xw.Result, "#1");
140                 }
141
142                 [Test]
143                 [ExpectedException (typeof (ArgumentNullException))]
144                 public void WriteNamespaceNull ()
145                 {
146                         new XamlObjectWriter (sctx, null).WriteNamespace (null);
147                 }
148
149                 [Test]
150                 public void InitWriteStartObject ()
151                 {
152                         var xw = new XamlObjectWriter (sctx, null);
153                         xw.WriteStartObject (new XamlType (typeof (int), sctx));
154                         xw.Close ();
155                         Assert.AreEqual (0, xw.Result, "#1");
156                 }
157
158                 [Test]
159                 [ExpectedException (typeof (XamlObjectWriterException))]
160                 public void GetObjectAfterStartObject ()
161                 {
162                         var xw = new XamlObjectWriter (sctx, null);
163                         xw.WriteStartObject (xt3);
164                         xw.WriteGetObject ();
165                 }
166
167                 [Test]
168                 //[ExpectedException (typeof (XamlObjectWriterException))]
169                 public void WriteStartObjectAfterTopLevel ()
170                 {
171                         var xw = new XamlObjectWriter (sctx, null);
172                         xw.WriteStartObject (xt3);
173                         xw.WriteEndObject ();
174                         // writing another root is <del>not</del> allowed.
175                         xw.WriteStartObject (xt3);
176                 }
177
178                 [Test]
179                 [ExpectedException (typeof (XamlObjectWriterException))]
180                 public void WriteEndObjectExcess ()
181                 {
182                         var xw = new XamlObjectWriter (sctx, null);
183                         xw.WriteStartObject (xt3);
184                         xw.WriteEndObject ();
185                         xw.WriteEndObject ();
186                 }
187
188                 [Test]
189                 [ExpectedException (typeof (XamlObjectWriterException))]
190                 public void StartObjectWriteEndMember ()
191                 {
192                         var xw = new XamlObjectWriter (sctx, null);
193                         xw.WriteStartObject (xt3);
194                         xw.WriteEndMember ();
195                 }
196
197                 [Test]
198                 public void WriteObjectAndMember ()
199                 {
200                         var xw = new XamlObjectWriter (sctx, null);
201                         xw.WriteStartObject (xt3);
202                         xw.WriteStartMember (xm2);
203                         xw.WriteValue ("foo");
204                         xw.WriteEndMember ();
205                         xw.Close ();
206                 }
207
208                 [Test]
209                 public void StartMemberWriteEndMember ()
210                 {
211                         var xw = new XamlObjectWriter (sctx, null);
212                         xw.WriteStartObject (xt3);
213                         xw.WriteStartMember (xm3);
214                         xw.WriteEndMember (); // unlike XamlXmlWriter, it is not treated as an error...
215                         xw.Close ();
216                 }
217
218                 [Test]
219                 [ExpectedException (typeof (XamlObjectWriterException))]
220                 public void StartMemberWriteStartMember ()
221                 {
222                         var xw = new XamlObjectWriter (sctx, null);
223                         xw.WriteStartObject (xt3);
224                         xw.WriteStartMember (xm3);
225                         xw.WriteStartMember (xm3);
226                 }
227
228                 [Test]
229                 public void WriteObjectInsideMember ()
230                 {
231                         var xw = new XamlObjectWriter (sctx, null);
232                         xw.WriteStartObject (xt3);
233                         xw.WriteStartMember (xm3);
234                         xw.WriteStartObject (xt3);
235                         xw.WriteEndObject ();
236                         xw.WriteEndMember ();
237                         xw.Close ();
238                 }
239
240                 [Test]
241                 [ExpectedException (typeof (XamlDuplicateMemberException))]
242                 public void ValueAfterObject ()
243                 {
244                         var xw = new XamlObjectWriter (sctx, null);
245                         xw.WriteStartObject (xt3);
246                         xw.WriteStartMember (xm3);
247                         xw.WriteStartObject (xt3);
248                         xw.WriteEndObject ();
249                         // passes here, but ...
250                         xw.WriteValue ("foo");
251                         // rejected here, unlike XamlXmlWriter.
252                         xw.WriteEndMember ();
253                 }
254
255                 [Test]
256                 [ExpectedException (typeof (XamlDuplicateMemberException))]
257                 public void ValueAfterObject2 ()
258                 {
259                         var xw = new XamlObjectWriter (sctx, null);
260                         xw.WriteStartObject (xt3);
261                         xw.WriteStartMember (xm3);
262                         xw.WriteStartObject (xt3);
263                         xw.WriteEndObject ();
264                         // passes here, but should be rejected later.
265                         xw.WriteValue ("foo");
266
267                         xw.WriteEndMember (); // Though this raises an error.
268                 }
269
270                 [Test]
271                 [ExpectedException (typeof (XamlDuplicateMemberException))]
272                 public void DuplicateAssignment ()
273                 {
274                         var xw = new XamlObjectWriter (sctx, null);
275                         xw.WriteStartObject (xt3);
276                         xw.WriteStartMember (xm3);
277                         xw.WriteStartObject (xt3);
278                         xw.WriteEndObject ();
279                         xw.WriteValue ("foo"); // causes duplicate assignment.
280                         xw.WriteEndMember ();
281                 }
282
283                 [Test]
284                 [ExpectedException (typeof (XamlDuplicateMemberException))]
285                 public void DuplicateAssignment2 ()
286                 {
287                         var xw = new XamlObjectWriter (sctx, null);
288                         xw.WriteStartObject (xt3);
289                         xw.WriteStartMember (xm3);
290                         xw.WriteStartObject (xt3);
291                         xw.WriteEndObject ();
292                         xw.WriteEndMember ();
293                         xw.WriteStartMember (xm3);
294                 }
295
296                 [Test]
297                 //[ExpectedException (typeof (ArgumentException))] // oh? XamlXmlWriter raises this.
298                 [Category ("NotWorking")] // so, it's not worthy of passing.
299                 public void WriteValueTypeMismatch ()
300                 {
301                         var xw = new XamlObjectWriter (sctx, null);
302                         xw.WriteStartObject (xt);
303                         xw.WriteStartMember (XamlLanguage.Initialization);
304                         xw.WriteValue (new TestClass1 ());
305                         xw.WriteEndMember ();
306                         xw.Close ();
307                         Assert.IsNotNull (xw.Result, "#1");
308                         Assert.AreEqual (typeof (TestClass1), xw.Result.GetType (), "#2");
309                 }
310
311                 [Test]
312                 [ExpectedException (typeof (XamlObjectWriterException))] // it fails to convert type and set property value.
313                 public void WriteValueTypeMismatch2 ()
314                 {
315                         var xw = new XamlObjectWriter (sctx, null);
316                         xw.WriteStartObject (xt3);
317                         xw.WriteStartMember (xm3);
318                         xw.WriteValue ("foo");
319                         xw.WriteEndMember ();
320                 }
321
322                 [Test]
323                 public void WriteValueTypeOK ()
324                 {
325                         var xw = new XamlObjectWriter (sctx, null);
326                         xw.WriteStartObject (xt);
327                         xw.WriteStartMember (XamlLanguage.Initialization);
328                         xw.WriteValue ("foo");
329                         xw.WriteEndMember ();
330                         xw.Close ();
331                         Assert.AreEqual ("foo", xw.Result, "#1");
332                 }
333
334                 [Test]
335                 // This behavior is different from XamlXmlWriter. Compare to XamlXmlWriterTest.WriteValueList().
336                 [Category ("NotWorking")] // not worthy of passing
337                 public void WriteValueList ()
338                 {
339                         var xw = new XamlObjectWriter (sctx, null);
340                         xw.WriteStartObject (new XamlType (typeof (List<string>), sctx));
341                         xw.WriteStartMember (XamlLanguage.Items);
342                         xw.WriteValue ("foo");
343                         xw.WriteValue ("bar");
344                         xw.WriteEndMember ();
345                         xw.Close ();
346                         var l = xw.Result as List<string>;
347                         Assert.IsNotNull (l, "#1");
348                         Assert.AreEqual ("foo", l [0], "#2");
349                         Assert.AreEqual ("bar", l [1], "#3");
350                 }
351
352                 // I believe .NET XamlObjectWriter.Dispose() is hack and should
353                 // be fixed to exactly determine which of End (member or object)
354                 // to call that results in this ExpectedException.
355                 // Surprisingly, PositionalParameters is allowed to be closed
356                 // without EndMember. So it smells that .NET is hacky.
357                 // We should disable this test and introduce better code (which
358                 // is already in XamlWriterInternalBase).
359                 [Test]
360                 [ExpectedException (typeof (XamlObjectWriterException))]
361                 [Ignore ("See the comment in XamlObjectWriterTest.cs")]
362                 public void CloseWithoutEndMember ()
363                 {
364                         var xw = new XamlObjectWriter (sctx, null);
365                         xw.WriteStartObject (xt);
366                         xw.WriteStartMember (XamlLanguage.Initialization);
367                         xw.WriteValue ("foo");
368                         xw.Close ();
369                 }
370
371                 [Test]
372                 [ExpectedException (typeof (XamlObjectWriterException))]
373                 public void WriteValueAfterValue ()
374                 {
375                         var xw = new XamlObjectWriter (sctx, null);
376                         xw.WriteStartObject (xt);
377                         xw.WriteValue ("foo");
378                         xw.WriteValue ("bar");
379                 }
380
381                 [Test]
382                 [ExpectedException (typeof (XamlObjectWriterException))]
383                 public void WriteValueAfterNullValue ()
384                 {
385                         var xw = new XamlObjectWriter (sctx, null);
386                         xw.WriteStartObject (xt);
387                         xw.WriteValue (null);
388                         xw.WriteValue ("bar");
389                 }
390
391                 [ExpectedException (typeof (XamlObjectWriterException))]
392                 public void StartMemberWriteEndObject ()
393                 {
394                         var xw = new XamlObjectWriter (sctx, null);
395                         xw.WriteStartObject (xt3);
396                         xw.WriteStartMember (xm3);
397                         xw.WriteEndObject ();
398                 }
399
400                 [Test]
401                 public void WriteNamespace ()
402                 {
403                         var xw = new XamlObjectWriter (sctx, null);
404                         xw.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"));
405                         xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
406                         xw.WriteStartObject (xt3);
407                         xw.WriteEndObject ();
408                         xw.Close ();
409                         var ret = xw.Result;
410                         Assert.IsTrue (ret is TestClass1, "#1");
411                 }
412
413                 [Test]
414                 [ExpectedException (typeof (XamlObjectWriterException))]
415                 public void StartObjectStartObject ()
416                 {
417                         var xw = new XamlObjectWriter (sctx, null);
418                         xw.WriteStartObject (xt3);
419                         xw.WriteStartObject (xt3);
420                 }
421
422                 [Test]
423                 [ExpectedException (typeof (XamlObjectWriterException))]
424                 public void StartObjectValue ()
425                 {
426                         var xw = new XamlObjectWriter (sctx, null);
427                         xw.WriteStartObject (xt3);
428                         xw.WriteValue ("foo");
429                 }
430
431                 [Test]
432                 [ExpectedException (typeof (XamlDuplicateMemberException))] // duplicate member assignment
433                 public void ObjectContainsObjectAndObject ()
434                 {
435                         var xw = new XamlObjectWriter (sctx, null);
436                         xw.WriteStartObject (xt3);
437                         xw.WriteStartMember (xm3);
438                         xw.WriteStartObject (xt3);
439                         xw.WriteEndObject ();
440                         xw.WriteStartObject (xt3);
441                         xw.WriteEndObject (); // the exception happens *here*
442                         // FIXME: so, WriteEndMember() should not be required, but we fail here. Practically this difference should not matter.
443                         xw.WriteEndMember (); // of xm3
444                 }
445
446                 [Test]
447                 [ExpectedException (typeof (XamlDuplicateMemberException))] // duplicate member assignment
448                 public void ObjectContainsObjectAndValue ()
449                 {
450                         var xw = new XamlObjectWriter (sctx, null);
451                         xw.WriteStartObject (xt3);
452                         xw.WriteStartMember (xm3);
453                         xw.WriteStartObject (xt3);
454                         xw.WriteEndObject ();
455                         xw.WriteValue ("foo"); // but this is allowed ...
456
457                         xw.WriteEndMember (); // Though this raises an error.
458                 }
459
460                 [Test]
461                 [ExpectedException (typeof (XamlDuplicateMemberException))] // duplicate member assignment
462                 public void ObjectContainsObjectAndValue2 ()
463                 {
464                         var xw = new XamlObjectWriter (sctx, null);
465                         xw.WriteStartObject (xt3);
466                         xw.WriteStartMember (xm3);
467                         xw.WriteStartObject (xt3);
468                         xw.WriteEndObject ();
469                         xw.WriteValue ("foo");
470                         xw.WriteEndMember (); // ... until here.
471                 }
472
473                 [Test]
474                 [ExpectedException (typeof (XamlObjectWriterException))] // unlike XamlXmlWriter (IOE)
475                 public void EndObjectAfterNamespace ()
476                 {
477                         var xw = new XamlObjectWriter (sctx, null);
478                         xw.WriteStartObject (xt3);
479                         xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
480                         xw.WriteEndObject ();
481                 }
482
483                 [Test]
484                 [ExpectedException (typeof (XamlObjectWriterException))] // ... unlike XamlXmlWriter (throws IOE)
485                 public void WriteValueAfterNamespace ()
486                 {
487                         var xw = new XamlObjectWriter (sctx, null);
488                         xw.WriteStartObject (xt);
489                         xw.WriteStartMember (XamlLanguage.Initialization);
490                         xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
491                         xw.WriteValue ("foo");
492                 }
493
494                 [Test]
495                 [ExpectedException (typeof (XamlObjectWriterException))] // ... unlike XamlXmlWriter (allowed)
496                 public void ValueThenStartObject ()
497                 {
498                         var xw = new XamlObjectWriter (sctx, null);
499                         xw.WriteStartObject (xt3);
500                         xw.WriteStartMember (xm2);
501                         xw.WriteValue ("foo");
502                         xw.WriteStartObject (xt3);
503                         xw.Close ();
504                 }
505
506                 [Test]
507                 [ExpectedException (typeof (XamlObjectWriterException))] // ... unlike XamlXmlWriter (allowed, as it allows StartObject after Value)
508                 public void ValueThenNamespace ()
509                 {
510                         var xw = new XamlObjectWriter (sctx, null);
511                         xw.WriteStartObject (xt3);
512                         xw.WriteStartMember (xm2);
513                         xw.WriteValue ("foo");
514                         xw.WriteNamespace (new NamespaceDeclaration ("y", "urn:foo")); // this does not raise an error (since it might start another object)
515                 }
516
517                 [Test]
518                 [ExpectedException (typeof (XamlObjectWriterException))] // strange, this does *not* result in IOE...
519                 public void ValueThenNamespaceThenEndMember ()
520                 {
521                         var xw = new XamlObjectWriter (sctx, null);
522                         xw.WriteStartObject (xt3);
523                         xw.WriteStartMember (xm2);
524                         xw.WriteValue ("foo");
525                         xw.WriteNamespace (new NamespaceDeclaration ("y", "urn:foo"));
526                         xw.WriteEndMember ();
527                 }
528
529                 [Test]
530                 [ExpectedException (typeof (XamlObjectWriterException))] // This is also very different, requires exactly opposite namespace output manner to XamlXmlWriter (namespace first, object follows).
531                 public void StartMemberAfterNamespace ()
532                 {
533                         var xw = new XamlObjectWriter (sctx, null);
534                         xw.WriteStartObject (xt3);
535                         xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
536                 }
537
538                 [Test]
539                 [Category ("NotWorking")] // not worthy of passing
540                 public void StartMemberBeforeNamespace ()
541                 {
542                         var xw = new XamlObjectWriter (sctx, null);
543                         xw.WriteStartObject (xt3);
544                         xw.WriteStartMember (xm2); // note that it should be done *after* WriteNamespace in XamlXmlWriter. SO inconsistent.
545                         xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
546                         xw.WriteEndMember ();
547                         xw.Close ();
548                 }
549
550                 [Test]
551                 [ExpectedException (typeof (XamlObjectWriterException))]
552                 public void StartMemberBeforeNamespace2 ()
553                 {
554                         var xw = new XamlObjectWriter (sctx, null);
555                         xw.WriteStartObject (xt3);
556                         xw.WriteStartMember (xm2);
557                         xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
558                         // and here, NamespaceDeclaration is written as if it 
559                         // were another value object( unlike XamlXmlWriter)
560                         // and rejects further value.
561                         xw.WriteValue ("foo");
562                 }
563
564                 [Test]
565                 [ExpectedException (typeof (XamlObjectWriterException))]
566                 public void EndMemberThenStartObject ()
567                 {
568                         var xw = new XamlObjectWriter (sctx, null);
569                         xw.WriteStartObject (xt3);
570                         xw.WriteStartMember (xm2);
571                         xw.WriteValue ("foo");
572                         xw.WriteEndMember ();
573                         xw.WriteStartObject (xt3);
574                 }
575
576                 // The semantics on WriteGetObject() is VERY different from XamlXmlWriter.
577
578                 [Test]
579                 [ExpectedException (typeof (XamlObjectWriterException))]
580                 public void GetObjectOnNullValue ()
581                 {
582                         var xw = new XamlObjectWriter (sctx, null);
583                         xw.WriteStartObject (xt3);
584                         xw.WriteStartMember (xm2);
585                         xw.WriteGetObject ();
586                 }
587
588                 [Test]
589                 [ExpectedException (typeof (XamlObjectWriterException))]
590                 public void GetObjectOnNullValue2 ()
591                 {
592                         var xw = new XamlObjectWriter (sctx, null);
593                         xw.WriteStartObject (xt4);
594                         xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Baz"), sctx)); // unlike Bar, Baz is not initialized.
595                         xw.WriteGetObject (); // fails, because it is null.
596                 }
597
598                 [Test]
599                 public void GetObjectOnIntValue ()
600                 {
601                         var xw = new XamlObjectWriter (sctx, null);
602                         xw.WriteStartObject (xt3);
603                         xw.WriteStartMember (xt3.GetMember ("TestProp4")); // int
604                         xw.WriteGetObject (); // passes!!! WTF
605                         xw.WriteEndObject ();
606                 }
607
608                 [Test]
609                 // String is not treated as a collection on XamlXmlWriter, while this XamlObjectWriter does.
610                 public void GetObjectOnNonNullString ()
611                 {
612                         var xw = new XamlObjectWriter (sctx, null);
613                         xw.WriteStartObject (xt3);
614                         Assert.IsNull (xw.Result, "#1");
615                         xw.WriteStartMember (xt3.GetMember ("TestProp3"));
616                         xw.WriteGetObject ();
617                         Assert.IsNull (xw.Result, "#2");
618                 }
619
620                 [Test]
621                 public void GetObjectOnCollection ()
622                 {
623                         var xw = new XamlObjectWriter (sctx, null);
624                         xw.WriteStartObject (xt4);
625                         xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Bar"), sctx));
626                         xw.WriteGetObject ();
627                         xw.Close ();
628                 }
629
630                 [Test]
631                 [ExpectedException (typeof (XamlObjectWriterException))]
632                 public void ValueAfterGetObject ()
633                 {
634                         var xw = new XamlObjectWriter (sctx, null);
635                         xw.WriteStartObject (xt4);
636                         xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Bar"), sctx));
637                         xw.WriteGetObject ();
638                         xw.WriteValue ("foo");
639                 }
640
641                 [Test]
642                 [ExpectedException (typeof (XamlObjectWriterException))]
643                 public void StartObjectAfterGetObject ()
644                 {
645                         var xw = new XamlObjectWriter (sctx, null);
646                         xw.WriteStartObject (xt4);
647                         xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Bar"), sctx));
648                         xw.WriteGetObject ();
649                         xw.WriteStartObject (xt);
650                 }
651
652                 [Test]
653                 [ExpectedException (typeof (XamlObjectWriterException))]
654                 public void EndMemberAfterGetObject ()
655                 {
656                         var xw = new XamlObjectWriter (sctx, null);
657                         xw.WriteStartObject (xt4);
658                         xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Bar"), sctx));
659                         xw.WriteGetObject ();
660                         xw.WriteEndMember (); // ...!?
661                 }
662
663                 [Test]
664                 public void StartMemberAfterGetObject ()
665                 {
666                         var xw = new XamlObjectWriter (sctx, null);
667                         xw.WriteStartObject (xt4);
668                         var xmm = xt4.GetMember ("Bar");
669                         xw.WriteStartMember (xmm); // <List.Bar>
670                         xw.WriteGetObject (); // shifts current member to List<T>.
671                         xw.WriteStartMember (xmm.Type.GetMember ("Capacity"));
672                         xw.WriteValue (5);
673                         xw.WriteEndMember ();
674                         /*
675                         xw.WriteEndObject (); // got object
676                         xw.WriteEndMember (); // Bar
677                         xw.WriteEndObject (); // started object
678                         */
679                         xw.Close ();
680                 }
681
682                 [Test]
683                 public void EndObjectAfterGetObject ()
684                 {
685                         var xw = new XamlObjectWriter (sctx, null);
686                         xw.WriteStartObject (xt4);
687                         xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Bar"), sctx));
688                         xw.WriteGetObject ();
689                         xw.WriteEndObject ();
690                 }
691
692                 // extra use case based tests.
693
694                 [Test]
695                 public void WriteEx_Type_WriteString ()
696                 {
697                         var ow = new XamlObjectWriter (sctx);
698                         ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
699                         ));
700                         ow.WriteStartObject (XamlLanguage.Type);
701                         ow.WriteStartMember (XamlLanguage.PositionalParameters);
702                         ow.WriteValue ("x:Int32");
703                         ow.Close ();
704                         Assert.AreEqual (typeof (int), ow.Result, "#1");
705                 }
706
707                 [Test]
708                 public void WriteEx_Type_WriteType ()
709                 {
710                         var ow = new XamlObjectWriter (sctx);
711                         ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
712                         ));
713                         ow.WriteStartObject (XamlLanguage.Type);
714                         ow.WriteStartMember (XamlLanguage.PositionalParameters);
715                         ow.WriteValue (typeof (int));
716                         ow.Close ();
717                         Assert.AreEqual (typeof (int), ow.Result, "#1");
718                 }
719                 
720                 // common use case based tests (to other readers/writers).
721
722                 XamlReader GetReader (string filename)
723                 {
724                         return new XamlXmlReader (XmlReader.Create (Path.Combine ("Test/XmlFiles", filename), new XmlReaderSettings () { CloseInput =true }));
725                 }
726
727                 [Test]
728                 public void Write_String ()
729                 {
730                         using (var xr = GetReader ("String.xml")) {
731                                 var des = XamlServices.Load (xr);
732                                 Assert.AreEqual ("foo", des, "#1");
733                         }
734                 }
735
736                 [Test]
737                 public void Write_Int32 ()
738                 {
739                         using (var xr = GetReader ("Int32.xml")) {
740                                 var des = XamlServices.Load (xr);
741                                 Assert.AreEqual (5, des, "#1");
742                         }
743                 }
744
745                 [Test]
746                 public void Write_DateTime ()
747                 {
748                         using (var xr = GetReader ("DateTime.xml")) {
749                                 var des = XamlServices.Load (xr);
750                                 Assert.AreEqual (new DateTime (2010, 4, 14), des, "#1");
751                         }
752                 }
753
754                 [Test]
755                 public void Write_TimeSpan ()
756                 {
757                         using (var xr = GetReader ("TimeSpan.xml")) {
758                                 var des = XamlServices.Load (xr);
759                                 Assert.AreEqual (TimeSpan.FromMinutes (7), des, "#1");
760                         }
761                 }
762
763                 [Test]
764                 public void Write_Uri ()
765                 {
766                         using (var xr = GetReader ("Uri.xml")) {
767                                 var des = XamlServices.Load (xr);
768                                 Assert.AreEqual (new Uri ("urn:foo"), des, "#1");
769                         }
770                 }
771
772                 [Test]
773                 public void Write_Null ()
774                 {
775                         using (var xr = GetReader ("NullExtension.xml")) {
776                                 var des = XamlServices.Load (xr);
777                                 Assert.IsNull (des, "#1");
778                         }
779                 }
780
781                 [Test]
782                 public void Write_Type ()
783                 {
784                         using (var xr = GetReader ("Type.xml")) {
785                                 var des = XamlServices.Load (xr);
786                                 Assert.AreEqual (typeof (int), des, "#1");
787                         }
788                 }
789
790                 [Test]
791                 public void Write_Type2 ()
792                 {
793                         var obj = typeof (MonoTests.System.Xaml.TestClass1);
794                         using (var xr = GetReader ("Type2.xml")) {
795                                 var des = XamlServices.Load (xr);
796                                 Assert.AreEqual (obj, des, "#1");
797                         }
798                 }
799
800                 [Test]
801                 public void Write_Guid ()
802                 {
803                         var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
804                         using (var xr = GetReader ("Guid.xml")) {
805                                 var des = XamlServices.Load (xr);
806                                 Assert.AreEqual (obj, des, "#1");
807                         }
808                 }
809
810                 [Test]
811                 public void Write_GuidFactoryMethod ()
812                 {
813                         var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
814                         using (var xr = GetReader ("GuidFactoryMethod.xml")) {
815                                 var des = XamlServices.Load (xr);
816                                 Assert.AreEqual (obj, des, "#1");
817                         }
818                 }
819
820                 [Test]
821                 [ExpectedException (typeof (XamlObjectWriterException))] // cannot resolve the StaticExtension value.
822                 public void Write_StaticExtension ()
823                 {
824                         var obj = new StaticExtension ("FooBar");
825                         using (var xr = GetReader ("StaticExtension.xml")) {
826                                 var des = XamlServices.Load (xr);
827                                 Assert.AreEqual (obj, des, "#1");
828                         }
829                 }
830
831                 [Test]
832                 [Ignore ("Not sure why MemberType is NOT serialized. Needs investigation")]
833                 public void Write_StaticExtension2 ()
834                 {
835                         var obj = new StaticExtension ("FooBar"); //incorrect
836                         using (var xr = GetReader ("StaticExtension2.xml")) {
837                                 var des = XamlServices.Load (xr);
838                                 Assert.AreEqual (obj, des, "#1");
839                         }
840                 }
841
842                 [Test]
843                 public void Write_Reference ()
844                 {
845                         using (var xr = GetReader ("Reference.xml")) {
846                                 var des = XamlServices.Load (xr);
847                                 // .NET does not return Reference.
848                                 // Its ProvideValue() returns MS.Internal.Xaml.Context.NameFixupToken,
849                                 // which is assumed (by name) to resolve to the referenced object.
850                                 Assert.IsNotNull (des, "#1");
851                                 //Assert.AreEqual (new Reference ("FooBar"), des, "#1");
852                         }
853                 }
854
855                 [Test]
856                 public void Write_ArrayInt32 ()
857                 {
858                         var obj = new int [] {4, -5, 0, 255, int.MaxValue};
859                         using (var xr = GetReader ("Array_Int32.xml")) {
860                                 var des = XamlServices.Load (xr);
861                                 Assert.AreEqual (obj, des, "#1");
862                         }
863                 }
864
865                 [Test]
866                 public void Write_ListInt32 ()
867                 {
868                         var obj = new int [] {5, -3, int.MaxValue, 0}.ToList ();
869                         using (var xr = GetReader ("List_Int32.xml")) {
870                                 var des = (List<int>) XamlServices.Load (xr);
871                                 Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
872                         }
873                 }
874
875                 [Test]
876                 public void Write_ListInt32_2 ()
877                 {
878                         var obj = new List<int> (new int [0]) { Capacity = 0 }; // set explicit capacity for trivial implementation difference
879                         using (var xr = GetReader ("List_Int32_2.xml")) {
880                                 var des = (List<int>) XamlServices.Load (xr);
881                                 Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
882                         }
883                 }
884
885                 [Test]
886                 public void Write_ListType ()
887                 {
888                         var obj = new List<Type> (new Type [] {typeof (int), typeof (Dictionary<Type, XamlType>)}) { Capacity = 2 };
889                         using (var xr = GetReader ("List_Type.xml")) {
890                                 var des = XamlServices.Load (xr);
891                                 Assert.AreEqual (obj, des, "#1");
892                         }
893                 }
894
895                 [Test]
896                 public void Write_ListArray ()
897                 {
898                         var obj = new List<Array> (new Array [] { new int [] { 1,2,3}, new string [] { "foo", "bar", "baz" }}) { Capacity = 2 };
899                         using (var xr = GetReader ("List_Array.xml")) {
900                                 var des = (List<Array>) XamlServices.Load (xr);
901                                 Assert.AreEqual (obj, des, "#1");
902                         }
903                 }
904
905                 [Test]
906                 public void Write_DictionaryInt32String ()
907                 {
908                         var dic = new Dictionary<int,string> ();
909                         dic.Add (0, "foo");
910                         dic.Add (5, "bar");
911                         dic.Add (-2, "baz");
912                         using (var xr = GetReader ("Dictionary_Int32_String.xml")) {
913                                 var des = XamlServices.Load (xr);
914                                 Assert.AreEqual (dic, des, "#1");
915                         }
916                 }
917
918                 [Test]
919                 public void Write_DictionaryStringType ()
920                 {
921                         var dic = new Dictionary<string,Type> ();
922                         dic.Add ("t1", typeof (int));
923                         dic.Add ("t2", typeof (int []));
924                         dic.Add ("t3", typeof (int?));
925                         dic.Add ("t4", typeof (List<int>));
926                         dic.Add ("t5", typeof (Dictionary<int,DateTime>));
927                         dic.Add ("t6", typeof (List<KeyValuePair<int,DateTime>>));
928                         using (var xr = GetReader ("Dictionary_String_Type.xml")) {
929                                 var des = XamlServices.Load (xr);
930                                 Assert.AreEqual (dic, des, "#1");
931                         }
932                 }
933
934                 [Test]
935                 [Ignore ("Needs to get successfully deserialized. Currently we can't")]
936                 public void Write_PositionalParameters1Wrapper ()
937                 {
938                         // Unlike the above case, this has the wrapper object and hence PositionalParametersClass1 can be written as an attribute (markup extension)
939                         var obj = new PositionalParametersWrapper ("foo", 5);
940                         using (var xr = GetReader ("PositionalParametersWrapper.xml")) {
941                                 var des = XamlServices.Load (xr);
942                                 Assert.AreEqual (obj, des, "#1");
943                         }
944                 }
945                 
946                 [Test]
947                 public void Write_ArgumentAttributed ()
948                 {
949                         //var obj = new ArgumentAttributed ("foo", "bar");
950                         using (var xr = GetReader ("ArgumentAttributed.xml")) {
951                                 var des = (ArgumentAttributed) XamlServices.Load (xr);
952                                 Assert.AreEqual ("foo", des.Arg1, "#1");
953                                 Assert.AreEqual ("bar", des.Arg2, "#2");
954                         }
955                 }
956
957                 [Test]
958                 public void Write_ArrayExtension2 ()
959                 {
960                         //var obj = new ArrayExtension (typeof (int));
961                         using (var xr = GetReader ("ArrayExtension2.xml")) {
962                                 var des = XamlServices.Load (xr);
963                                 // The resulting object is not ArrayExtension.
964                                 Assert.AreEqual (new int [0], des, "#1");
965                         }
966                 }
967
968                 [Test]
969                 public void Write_ArrayList ()
970                 {
971                         var obj = new ArrayList (new int [] {5, -3, 0});
972                         using (var xr = GetReader ("ArrayList.xml")) {
973                                 var des = XamlServices.Load (xr);
974                                 Assert.AreEqual (obj, des, "#1");
975                         }
976                 }
977
978                 [Test]
979                 [Ignore ("Needs to get successfully deserialized. Currently we can't")]
980                 public void ComplexPositionalParameterWrapper ()
981                 {
982                         //var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
983                         using (var xr = GetReader ("ComplexPositionalParameterWrapper.xml")) {
984                                 var des = (ComplexPositionalParameterWrapper) XamlServices.Load (xr);
985                                 Assert.IsNotNull (des.Param, "#1");
986                                 Assert.AreEqual ("foo", des.Param.Value, "#2");
987                         }
988                 }
989
990                 [Test]
991                 public void Write_ListWrapper ()
992                 {
993                         var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
994                         using (var xr = GetReader ("ListWrapper.xml")) {
995                                 var des = (ListWrapper) XamlServices.Load (xr);
996                                 Assert.IsNotNull (des, "#1");
997                                 Assert.IsNotNull (des.Items, "#2");
998                                 Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
999                         }
1000                 }
1001
1002                 [Test]
1003                 public void Write_ListWrapper2 ()
1004                 {
1005                         var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
1006                         using (var xr = GetReader ("ListWrapper2.xml")) {
1007                                 var des = (ListWrapper2) XamlServices.Load (xr);
1008                                 Assert.IsNotNull (des, "#1");
1009                                 Assert.IsNotNull (des.Items, "#2");
1010                                 Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
1011                         }
1012                 }
1013
1014                 [Test]
1015                 public void Write_MyArrayExtension ()
1016                 {
1017                         //var obj = new MyArrayExtension (new int [] {5, -3, 0});
1018                         using (var xr = GetReader ("MyArrayExtension.xml")) {
1019                                 var des = XamlServices.Load (xr);
1020                                 // ProvideValue() returns an array
1021                                 Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
1022                         }
1023                 }
1024
1025                 [Test]
1026                 public void Write_MyArrayExtensionA ()
1027                 {
1028                         //var obj = new MyArrayExtensionA (new int [] {5, -3, 0});
1029                         using (var xr = GetReader ("MyArrayExtensionA.xml")) {
1030                                 var des = XamlServices.Load (xr);
1031                                 // ProvideValue() returns an array
1032                                 Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
1033                         }
1034                 }
1035
1036                 [Test]
1037                 public void Write_MyExtension ()
1038                 {
1039                         //var obj = new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"};
1040                         using (var xr = GetReader ("MyExtension.xml")) {
1041                                 var des = XamlServices.Load (xr);
1042                                 // ProvideValue() returns this.
1043                                 Assert.AreEqual ("provided_value", des, "#1");
1044                         }
1045                 }
1046
1047                 [Test]
1048                 [ExpectedException (typeof (InvalidCastException))] // unable to cast string to MarkupExtension
1049                 [Category ("NotWorking")]
1050                 public void Write_MyExtension2 ()
1051                 {
1052                         //var obj = new MyExtension2 () { Foo = typeof (int), Bar = "v2"};
1053                         using (var xr = GetReader ("MyExtension2.xml")) {
1054                                 XamlServices.Load (xr);
1055                         }
1056                 }
1057
1058                 [Test]
1059                 public void Write_MyExtension3 ()
1060                 {
1061                         //var obj = new MyExtension3 () { Foo = typeof (int), Bar = "v2"};
1062                         using (var xr = GetReader ("MyExtension3.xml")) {
1063                                 var des = XamlServices.Load (xr);
1064                                 // StringConverter is used and the resulting value comes from ToString().
1065                                 Assert.AreEqual ("MonoTests.System.Xaml.MyExtension3", des, "#1");
1066                         }
1067                 }
1068
1069                 [Test]
1070                 [ExpectedException (typeof (XamlObjectWriterException))] // wrong TypeConverter input (input string for DateTimeConverter invalid)
1071                 public void Write_MyExtension4 ()
1072                 {
1073                         var obj = new MyExtension4 () { Foo = typeof (int), Bar = "v2"};
1074                         using (var xr = GetReader ("MyExtension4.xml")) {
1075                                 var des = XamlServices.Load (xr);
1076                                 Assert.AreEqual (obj, des, "#1");
1077                         }
1078                 }
1079
1080                 [Test]
1081                 public void Write_MyExtension6 ()
1082                 {
1083                         //var obj = new MyExtension6 ("foo");
1084                         using (var xr = GetReader ("MyExtension6.xml")) {
1085                                 var des = XamlServices.Load (xr);
1086                                 // ProvideValue() returns this.
1087                                 Assert.AreEqual ("foo", des, "#1");
1088                         }
1089                 }
1090                 
1091                 [Test]
1092                 public void Write_PropertyDefinition ()
1093                 {
1094                         //var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
1095                         using (var xr = GetReader ("PropertyDefinition.xml")) {
1096                                 var des = (PropertyDefinition) XamlServices.Load (xr);
1097                                 Assert.AreEqual ("protected", des.Modifier, "#1");
1098                                 Assert.AreEqual ("foo", des.Name, "#2");
1099                                 Assert.AreEqual (XamlLanguage.String, des.Type, "#3");
1100                         }
1101                 }
1102                 
1103                 [Test]
1104                 [Ignore ("this still does not give successful deserialization result - should there be any way?")]
1105                 public void Write_StaticExtensionWrapper ()
1106                 {
1107                         //var obj = new StaticExtensionWrapper () { Param = new StaticExtension ("Foo") };
1108                         using (var xr = GetReader ("StaticExtensionWrapper.xml")) {
1109                                 var des = (StaticExtensionWrapper) XamlServices.Load (xr);
1110                                 Assert.IsNotNull (des.Param, "#1");
1111                                 Assert.AreEqual ("Foo", des.Param.Member, "#2");
1112                         }
1113                 }
1114                 
1115                 [Test]
1116                 [Ignore ("this still does not give successful deserialization result - should there be any way?")]
1117                 public void Write_TypeExtensionWrapper ()
1118                 {
1119                         //var obj = new TypeExtensionWrapper () { Param = new TypeExtension ("Foo") };
1120                         using (var xr = GetReader ("TypeExtensionWrapper.xml")) {
1121                                 var des = (TypeExtensionWrapper) XamlServices.Load (xr);
1122                                 Assert.IsNotNull (des.Param, "#1");
1123                                 // TypeName was not serialized into xml, hence deserialized as empty.
1124                                 Assert.AreEqual (String.Empty, des.Param.TypeName, "#2");
1125                         }
1126                 }
1127                 
1128                 [Test]
1129                 public void Write_NamedItems ()
1130                 {
1131                         // foo
1132                         // - bar
1133                         // -- foo
1134                         // - baz
1135                         var obj = new NamedItem ("foo");
1136                         var obj2 = new NamedItem ("bar");
1137                         obj.References.Add (obj2);
1138                         obj.References.Add (new NamedItem ("baz"));
1139                         obj2.References.Add (obj);
1140
1141                         using (var xr = GetReader ("NamedItems.xml")) {
1142                                 var des = (NamedItem) XamlServices.Load (xr);
1143                                 Assert.IsNotNull (des, "#1");
1144                                 Assert.AreEqual (2, des.References.Count, "#2");
1145                                 Assert.AreEqual (typeof (NamedItem), des.References [0].GetType (), "#3");
1146                                 Assert.AreEqual (typeof (NamedItem), des.References [1].GetType (), "#4");
1147                                 Assert.AreEqual (des, des.References [0].References [0], "#5");
1148                         }
1149                 }
1150                 
1151                 [Test]
1152                 public void Write_NamedItems2 ()
1153                 {
1154                         // i1
1155                         // - i2
1156                         // -- i3
1157                         // - i4
1158                         // -- i3
1159                         var obj = new NamedItem2 ("i1");
1160                         var obj2 = new NamedItem2 ("i2");
1161                         var obj3 = new NamedItem2 ("i3");
1162                         var obj4 = new NamedItem2 ("i4");
1163                         obj.References.Add (obj2);
1164                         obj.References.Add (obj4);
1165                         obj2.References.Add (obj3);
1166                         obj4.References.Add (obj3);
1167
1168                         using (var xr = GetReader ("NamedItems2.xml")) {
1169                                 var des = (NamedItem2) XamlServices.Load (xr);
1170                                 Assert.IsNotNull (des, "#1");
1171                                 Assert.AreEqual (2, des.References.Count, "#2");
1172                                 Assert.AreEqual (typeof (NamedItem2), des.References [0].GetType (), "#3");
1173                                 Assert.AreEqual (typeof (NamedItem2), des.References [1].GetType (), "#4");
1174                                 Assert.AreEqual (1, des.References [0].References.Count, "#5");
1175                                 Assert.AreEqual (1, des.References [1].References.Count, "#6");
1176                                 Assert.AreEqual (des.References [0].References [0], des.References [1].References [0], "#7");
1177                         }
1178                 }
1179
1180                 [Test]
1181                 public void Write_XmlSerializableWrapper ()
1182                 {
1183                         var assns = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
1184                         using (var xr = GetReader ("XmlSerializableWrapper.xml")) {
1185                                 var des = (XmlSerializableWrapper) XamlServices.Load (xr);
1186                                 Assert.IsNotNull (des, "#1");
1187                                 Assert.IsNotNull (des.Value, "#2");
1188                                 Assert.AreEqual ("<root xmlns=\"" + assns + "\" />", des.Value.GetRaw (), "#3");
1189                         }
1190                 }
1191
1192                 [Test]
1193                 public void Write_XmlSerializable ()
1194                 {
1195                         using (var xr = GetReader ("XmlSerializable.xml")) {
1196                                 var des = (XmlSerializable) XamlServices.Load (xr);
1197                                 Assert.IsNotNull (des, "#1");
1198                         }
1199                 }
1200
1201                 [Test]
1202                 public void Write_ListXmlSerializable ()
1203                 {
1204                         using (var xr = GetReader ("List_XmlSerializable.xml")) {
1205                                 var des = (List<XmlSerializable>) XamlServices.Load (xr);
1206                                 Assert.AreEqual (1, des.Count, "#1");
1207                         }
1208                 }
1209
1210                 [Test]
1211                 public void Write_AttachedProperty ()
1212                 {
1213                         using (var xr = GetReader ("AttachedProperty.xml")) {
1214                                 AttachedWrapper des = null;
1215                                 try {
1216                                         des = (AttachedWrapper) XamlServices.Load (xr);
1217                                         Assert.IsNotNull (des.Value, "#1");
1218                                         Assert.AreEqual ("x", Attachable.GetFoo (des), "#2");
1219                                         Assert.AreEqual ("y", Attachable.GetFoo (des.Value), "#3");
1220                                 } finally {
1221                                         if (des != null) {
1222                                                 Attachable.SetFoo (des, null);
1223                                                 Attachable.SetFoo (des.Value, null);
1224                                         }
1225                                 }
1226                         }
1227                 }
1228
1229                 [Test]
1230                 public void Write_EventStore ()
1231                 {
1232                         using (var xr = GetReader ("EventStore.xml")) {
1233                                 var res = (EventStore) XamlServices.Load (xr);
1234                                 Assert.AreEqual ("foo", res.Examine (), "#1");
1235                                 Assert.IsTrue (res.Method1Invoked, "#2");
1236                         }
1237                 }
1238
1239                 [Test]
1240                 [ExpectedException (typeof (XamlDuplicateMemberException))] // for two occurence of Event1 ...
1241                 public void Write_EventStore2 ()
1242                 {
1243                         using (var xr = GetReader ("EventStore2.xml")) {
1244                                 XamlServices.Load (xr);
1245                         }
1246                 }
1247
1248                 [Test]
1249                 [ExpectedException (typeof (XamlObjectWriterException))] // attaching nonexistent method
1250                 public void Write_EventStore3 ()
1251                 {
1252                         using (var xr = GetReader ("EventStore3.xml")) {
1253                                 XamlServices.Load (xr);
1254                         }
1255                 }
1256
1257                 [Test]
1258                 [Category ("NotWorking")] // type resolution failure.
1259                 public void Write_EventStore4 ()
1260                 {
1261                         using (var xr = GetReader ("EventStore4.xml")) {
1262                                 var res = (EventStore2<EventArgs>) XamlServices.Load (xr);
1263                                 Assert.AreEqual ("foo", res.Examine (), "#1");
1264                                 Assert.IsTrue (res.Method1Invoked, "#2");
1265                         }
1266                 }
1267
1268                 [Test]
1269                 public void Write_AbstractWrapper ()
1270                 {
1271                         using (var xr = GetReader ("AbstractContainer.xml")) {
1272                                 var res = (AbstractContainer) XamlServices.Load (xr);
1273                                 Assert.IsNull (res.Value1, "#1");
1274                                 Assert.IsNotNull (res.Value2, "#2");
1275                                 Assert.AreEqual ("x", res.Value2.Foo, "#3");
1276                         }
1277                 }
1278
1279                 [Test]
1280                 public void Write_ReadOnlyPropertyContainer ()
1281                 {
1282                         using (var xr = GetReader ("ReadOnlyPropertyContainer.xml")) {
1283                                 var res = (ReadOnlyPropertyContainer) XamlServices.Load (xr);
1284                                 Assert.AreEqual ("x", res.Foo, "#1");
1285                                 Assert.AreEqual ("x", res.Bar, "#2");
1286                         }
1287                 }
1288
1289                 [Test]
1290                 public void Write_TypeConverterOnListMember ()
1291                 {
1292                         using (var xr = GetReader ("TypeConverterOnListMember.xml")) {
1293                                 var res = (SecondTest.TypeOtherAssembly) XamlServices.Load (xr);
1294                                 Assert.AreEqual (3, res.Values.Count, "#1");
1295                                 Assert.AreEqual (3, res.Values [2], "#2");
1296                         }
1297                 }
1298
1299                 [Test]
1300                 public void Write_EnumContainer ()
1301                 {
1302                         using (var xr = GetReader ("EnumContainer.xml")) {
1303                                 var res = (EnumContainer) XamlServices.Load (xr);
1304                                 Assert.AreEqual (EnumValueType.Two, res.EnumProperty, "#1");
1305                         }
1306                 }
1307
1308                 [Test]
1309                 public void Write_CollectionContentProperty ()
1310                 {
1311                         using (var xr = GetReader ("CollectionContentProperty.xml")) {
1312                                 var res = (CollectionContentProperty) XamlServices.Load (xr);
1313                                 Assert.AreEqual (4, res.ListOfItems.Count, "#1");
1314                         }
1315                 }
1316
1317                 [Test]
1318                 public void Write_CollectionContentProperty2 ()
1319                 {
1320                         using (var xr = GetReader ("CollectionContentProperty2.xml")) {
1321                                 var res = (CollectionContentProperty) XamlServices.Load (xr);
1322                                 Assert.AreEqual (4, res.ListOfItems.Count, "#1");
1323                         }
1324                 }
1325
1326                 [Test]
1327                 public void Write_AmbientPropertyContainer ()
1328                 {
1329                         using (var xr = GetReader ("AmbientPropertyContainer.xml")) {
1330                                 var res = (SecondTest.ResourcesDict) XamlServices.Load (xr);
1331                                 Assert.AreEqual (2, res.Count, "#1");
1332                                 Assert.IsTrue (res.ContainsKey ("TestDictItem"), "#2");
1333                                 Assert.IsTrue (res.ContainsKey ("okay"), "#3");
1334                                 var i1 = res ["TestDictItem"] as SecondTest.TestObject;
1335                                 Assert.IsNull (i1.TestProperty, "#4");
1336                                 var i2 = res ["okay"] as SecondTest.TestObject;
1337                                 Assert.AreEqual (i1, i2.TestProperty, "#5");
1338                         }
1339                 }
1340
1341                 [Test] // bug #682102
1342                 public void Write_AmbientPropertyContainer2 ()
1343                 {
1344                         using (var xr = GetReader ("AmbientPropertyContainer2.xml")) {
1345                                 var res = (SecondTest.ResourcesDict) XamlServices.Load (xr);
1346                                 Assert.AreEqual (2, res.Count, "#1");
1347                                 Assert.IsTrue (res.ContainsKey ("TestDictItem"), "#2");
1348                                 Assert.IsTrue (res.ContainsKey ("okay"), "#3");
1349                                 var i1 = res ["TestDictItem"] as SecondTest.TestObject;
1350                                 Assert.IsNull (i1.TestProperty, "#4");
1351                                 var i2 = res ["okay"] as SecondTest.TestObject;
1352                                 Assert.AreEqual (i1, i2.TestProperty, "#5");
1353                         }
1354                 }
1355
1356                 [Test]
1357                 public void Write_NullableContainer ()
1358                 {
1359                         using (var xr = GetReader ("NullableContainer.xml")) {
1360                                 var res = (NullableContainer) XamlServices.Load (xr);
1361                                 Assert.AreEqual (5, res.TestProp, "#1");
1362                         }
1363                 }
1364
1365                 [Test]
1366                 public void Write_DirectListContainer ()
1367                 {
1368                         using (var xr = GetReader ("DirectListContainer.xml")) {
1369                                 var res = (DirectListContainer) XamlServices.Load (xr);
1370                                 Assert.AreEqual (3, res.Items.Count, "#1");
1371                                 Assert.AreEqual ("Hello3", res.Items [2].Value, "#2");
1372                         }
1373                 }
1374         }
1375 }