Fix bug #2927: lookup event bound methods from root instance, not current object.
[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                 [Test]
693                 public void WriteAttachableProperty ()
694                 {
695                         Attached2 result = null;
696                         
697                         var rsettings = new XamlXmlReaderSettings ();
698                         using (var reader = new XamlXmlReader (new StringReader (String.Format (@"<Attached2 AttachedWrapper3.Property=""Test"" xmlns=""clr-namespace:MonoTests.System.Xaml;assembly={0}""></Attached2>", typeof (AttachedWrapper3).Assembly.GetName ().Name)), rsettings)) {
699                                 var wsettings = new XamlObjectWriterSettings ();
700                                 using (var writer = new XamlObjectWriter (reader.SchemaContext, wsettings)) {
701                                         XamlServices.Transform (reader, writer, false);
702                                         result = (Attached2) writer.Result;
703                                 }
704                         }
705
706                         Assert.AreEqual ("Test", result.Property, "#1");
707                 }
708
709                 // extra use case based tests.
710
711                 [Test]
712                 public void WriteEx_Type_WriteString ()
713                 {
714                         var ow = new XamlObjectWriter (sctx);
715                         ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
716                         ));
717                         ow.WriteStartObject (XamlLanguage.Type);
718                         ow.WriteStartMember (XamlLanguage.PositionalParameters);
719                         ow.WriteValue ("x:Int32");
720                         ow.Close ();
721                         Assert.AreEqual (typeof (int), ow.Result, "#1");
722                 }
723
724                 [Test]
725                 public void WriteEx_Type_WriteType ()
726                 {
727                         var ow = new XamlObjectWriter (sctx);
728                         ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
729                         ));
730                         ow.WriteStartObject (XamlLanguage.Type);
731                         ow.WriteStartMember (XamlLanguage.PositionalParameters);
732                         ow.WriteValue (typeof (int));
733                         ow.Close ();
734                         Assert.AreEqual (typeof (int), ow.Result, "#1");
735                 }
736
737                 [Test]
738                 public void LookupCorrectEventBoundMethod ()
739                 {
740                         var o = (XamarinBug2927.MyRootClass) XamlServices.Load (GetReader ("LookupCorrectEvent.xml"));
741                         o.Child.Descendant.Work ();
742                         Assert.IsTrue (o.Invoked, "#1");
743                         Assert.IsFalse (o.Child.Invoked, "#2");
744                         Assert.IsFalse (o.Child.Descendant.Invoked, "#3");
745                 }
746                 
747                 [Test]
748                 [ExpectedException (typeof (XamlObjectWriterException))]
749                 public void LookupCorrectEventBoundMethod2 ()
750                 {
751                         XamlServices.Load (GetReader ("LookupCorrectEvent2.xml"));
752                 }
753                 
754                 [Test]
755                 public void LookupCorrectEventBoundMethod3 ()
756                 {
757                         XamlServices.Load (GetReader ("LookupCorrectEvent3.xml"));
758                 }
759                 
760                 // common use case based tests (to other readers/writers).
761
762                 XamlReader GetReader (string filename)
763                 {
764                         return new XamlXmlReader (XmlReader.Create (Path.Combine ("Test/XmlFiles", filename), new XmlReaderSettings () { CloseInput =true }));
765                 }
766
767                 [Test]
768                 public void Write_String ()
769                 {
770                         using (var xr = GetReader ("String.xml")) {
771                                 var des = XamlServices.Load (xr);
772                                 Assert.AreEqual ("foo", des, "#1");
773                         }
774                 }
775
776                 [Test]
777                 public void Write_Int32 ()
778                 {
779                         using (var xr = GetReader ("Int32.xml")) {
780                                 var des = XamlServices.Load (xr);
781                                 Assert.AreEqual (5, des, "#1");
782                         }
783                 }
784
785                 [Test]
786                 public void Write_DateTime ()
787                 {
788                         using (var xr = GetReader ("DateTime.xml")) {
789                                 var des = XamlServices.Load (xr);
790                                 Assert.AreEqual (new DateTime (2010, 4, 14), des, "#1");
791                         }
792                 }
793
794                 [Test]
795                 public void Write_TimeSpan ()
796                 {
797                         using (var xr = GetReader ("TimeSpan.xml")) {
798                                 var des = XamlServices.Load (xr);
799                                 Assert.AreEqual (TimeSpan.FromMinutes (7), des, "#1");
800                         }
801                 }
802
803                 [Test]
804                 public void Write_Uri ()
805                 {
806                         using (var xr = GetReader ("Uri.xml")) {
807                                 var des = XamlServices.Load (xr);
808                                 Assert.AreEqual (new Uri ("urn:foo"), des, "#1");
809                         }
810                 }
811
812                 [Test]
813                 public void Write_Null ()
814                 {
815                         using (var xr = GetReader ("NullExtension.xml")) {
816                                 var des = XamlServices.Load (xr);
817                                 Assert.IsNull (des, "#1");
818                         }
819                 }
820
821                 [Test]
822                 public void Write_Type ()
823                 {
824                         using (var xr = GetReader ("Type.xml")) {
825                                 var des = XamlServices.Load (xr);
826                                 Assert.AreEqual (typeof (int), des, "#1");
827                         }
828                 }
829
830                 [Test]
831                 public void Write_Type2 ()
832                 {
833                         var obj = typeof (MonoTests.System.Xaml.TestClass1);
834                         using (var xr = GetReader ("Type2.xml")) {
835                                 var des = XamlServices.Load (xr);
836                                 Assert.AreEqual (obj, des, "#1");
837                         }
838                 }
839
840                 [Test]
841                 public void Write_Guid ()
842                 {
843                         var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
844                         using (var xr = GetReader ("Guid.xml")) {
845                                 var des = XamlServices.Load (xr);
846                                 Assert.AreEqual (obj, des, "#1");
847                         }
848                 }
849
850                 [Test]
851                 public void Write_GuidFactoryMethod ()
852                 {
853                         var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
854                         using (var xr = GetReader ("GuidFactoryMethod.xml")) {
855                                 var des = XamlServices.Load (xr);
856                                 Assert.AreEqual (obj, des, "#1");
857                         }
858                 }
859
860                 [Test]
861                 [ExpectedException (typeof (XamlObjectWriterException))] // cannot resolve the StaticExtension value.
862                 public void Write_StaticExtension ()
863                 {
864                         var obj = new StaticExtension ("FooBar");
865                         using (var xr = GetReader ("StaticExtension.xml")) {
866                                 var des = XamlServices.Load (xr);
867                                 Assert.AreEqual (obj, des, "#1");
868                         }
869                 }
870
871                 [Test]
872                 [Ignore ("Not sure why MemberType is NOT serialized. Needs investigation")]
873                 public void Write_StaticExtension2 ()
874                 {
875                         var obj = new StaticExtension ("FooBar"); //incorrect
876                         using (var xr = GetReader ("StaticExtension2.xml")) {
877                                 var des = XamlServices.Load (xr);
878                                 Assert.AreEqual (obj, des, "#1");
879                         }
880                 }
881
882                 [Test]
883                 public void Write_Reference ()
884                 {
885                         using (var xr = GetReader ("Reference.xml")) {
886                                 var des = XamlServices.Load (xr);
887                                 // .NET does not return Reference.
888                                 // Its ProvideValue() returns MS.Internal.Xaml.Context.NameFixupToken,
889                                 // which is assumed (by name) to resolve to the referenced object.
890                                 Assert.IsNotNull (des, "#1");
891                                 //Assert.AreEqual (new Reference ("FooBar"), des, "#1");
892                         }
893                 }
894
895                 [Test]
896                 public void Write_ArrayInt32 ()
897                 {
898                         var obj = new int [] {4, -5, 0, 255, int.MaxValue};
899                         using (var xr = GetReader ("Array_Int32.xml")) {
900                                 var des = XamlServices.Load (xr);
901                                 Assert.AreEqual (obj, des, "#1");
902                         }
903                 }
904
905                 [Test]
906                 public void Write_ListInt32 ()
907                 {
908                         var obj = new int [] {5, -3, int.MaxValue, 0}.ToList ();
909                         using (var xr = GetReader ("List_Int32.xml")) {
910                                 var des = (List<int>) XamlServices.Load (xr);
911                                 Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
912                         }
913                 }
914
915                 [Test]
916                 public void Write_ListInt32_2 ()
917                 {
918                         var obj = new List<int> (new int [0]) { Capacity = 0 }; // set explicit capacity for trivial implementation difference
919                         using (var xr = GetReader ("List_Int32_2.xml")) {
920                                 var des = (List<int>) XamlServices.Load (xr);
921                                 Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
922                         }
923                 }
924
925                 [Test]
926                 public void Write_ListType ()
927                 {
928                         var obj = new List<Type> (new Type [] {typeof (int), typeof (Dictionary<Type, XamlType>)}) { Capacity = 2 };
929                         using (var xr = GetReader ("List_Type.xml")) {
930                                 var des = XamlServices.Load (xr);
931                                 Assert.AreEqual (obj, des, "#1");
932                         }
933                 }
934
935                 [Test]
936                 public void Write_ListArray ()
937                 {
938                         var obj = new List<Array> (new Array [] { new int [] { 1,2,3}, new string [] { "foo", "bar", "baz" }}) { Capacity = 2 };
939                         using (var xr = GetReader ("List_Array.xml")) {
940                                 var des = (List<Array>) XamlServices.Load (xr);
941                                 Assert.AreEqual (obj, des, "#1");
942                         }
943                 }
944
945                 [Test]
946                 public void Write_DictionaryInt32String ()
947                 {
948                         var dic = new Dictionary<int,string> ();
949                         dic.Add (0, "foo");
950                         dic.Add (5, "bar");
951                         dic.Add (-2, "baz");
952                         using (var xr = GetReader ("Dictionary_Int32_String.xml")) {
953                                 var des = XamlServices.Load (xr);
954                                 Assert.AreEqual (dic, des, "#1");
955                         }
956                 }
957
958                 [Test]
959                 public void Write_DictionaryStringType ()
960                 {
961                         var dic = new Dictionary<string,Type> ();
962                         dic.Add ("t1", typeof (int));
963                         dic.Add ("t2", typeof (int []));
964                         dic.Add ("t3", typeof (int?));
965                         dic.Add ("t4", typeof (List<int>));
966                         dic.Add ("t5", typeof (Dictionary<int,DateTime>));
967                         dic.Add ("t6", typeof (List<KeyValuePair<int,DateTime>>));
968                         using (var xr = GetReader ("Dictionary_String_Type.xml")) {
969                                 var des = XamlServices.Load (xr);
970                                 Assert.AreEqual (dic, des, "#1");
971                         }
972                 }
973
974                 [Test]
975                 [Ignore ("Needs to get successfully deserialized. Currently we can't")]
976                 public void Write_PositionalParameters1Wrapper ()
977                 {
978                         // Unlike the above case, this has the wrapper object and hence PositionalParametersClass1 can be written as an attribute (markup extension)
979                         var obj = new PositionalParametersWrapper ("foo", 5);
980                         using (var xr = GetReader ("PositionalParametersWrapper.xml")) {
981                                 var des = XamlServices.Load (xr);
982                                 Assert.AreEqual (obj, des, "#1");
983                         }
984                 }
985                 
986                 [Test]
987                 public void Write_ArgumentAttributed ()
988                 {
989                         //var obj = new ArgumentAttributed ("foo", "bar");
990                         using (var xr = GetReader ("ArgumentAttributed.xml")) {
991                                 var des = (ArgumentAttributed) XamlServices.Load (xr);
992                                 Assert.AreEqual ("foo", des.Arg1, "#1");
993                                 Assert.AreEqual ("bar", des.Arg2, "#2");
994                         }
995                 }
996
997                 [Test]
998                 public void Write_ArrayExtension2 ()
999                 {
1000                         //var obj = new ArrayExtension (typeof (int));
1001                         using (var xr = GetReader ("ArrayExtension2.xml")) {
1002                                 var des = XamlServices.Load (xr);
1003                                 // The resulting object is not ArrayExtension.
1004                                 Assert.AreEqual (new int [0], des, "#1");
1005                         }
1006                 }
1007
1008                 [Test]
1009                 public void Write_ArrayList ()
1010                 {
1011                         var obj = new ArrayList (new int [] {5, -3, 0});
1012                         using (var xr = GetReader ("ArrayList.xml")) {
1013                                 var des = XamlServices.Load (xr);
1014                                 Assert.AreEqual (obj, des, "#1");
1015                         }
1016                 }
1017
1018                 [Test]
1019                 [Ignore ("Needs to get successfully deserialized. Currently we can't")]
1020                 public void ComplexPositionalParameterWrapper ()
1021                 {
1022                         //var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
1023                         using (var xr = GetReader ("ComplexPositionalParameterWrapper.xml")) {
1024                                 var des = (ComplexPositionalParameterWrapper) XamlServices.Load (xr);
1025                                 Assert.IsNotNull (des.Param, "#1");
1026                                 Assert.AreEqual ("foo", des.Param.Value, "#2");
1027                         }
1028                 }
1029
1030                 [Test]
1031                 public void Write_ListWrapper ()
1032                 {
1033                         var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
1034                         using (var xr = GetReader ("ListWrapper.xml")) {
1035                                 var des = (ListWrapper) XamlServices.Load (xr);
1036                                 Assert.IsNotNull (des, "#1");
1037                                 Assert.IsNotNull (des.Items, "#2");
1038                                 Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
1039                         }
1040                 }
1041
1042                 [Test]
1043                 public void Write_ListWrapper2 ()
1044                 {
1045                         var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
1046                         using (var xr = GetReader ("ListWrapper2.xml")) {
1047                                 var des = (ListWrapper2) XamlServices.Load (xr);
1048                                 Assert.IsNotNull (des, "#1");
1049                                 Assert.IsNotNull (des.Items, "#2");
1050                                 Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
1051                         }
1052                 }
1053
1054                 [Test]
1055                 public void Write_MyArrayExtension ()
1056                 {
1057                         //var obj = new MyArrayExtension (new int [] {5, -3, 0});
1058                         using (var xr = GetReader ("MyArrayExtension.xml")) {
1059                                 var des = XamlServices.Load (xr);
1060                                 // ProvideValue() returns an array
1061                                 Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
1062                         }
1063                 }
1064
1065                 [Test]
1066                 public void Write_MyArrayExtensionA ()
1067                 {
1068                         //var obj = new MyArrayExtensionA (new int [] {5, -3, 0});
1069                         using (var xr = GetReader ("MyArrayExtensionA.xml")) {
1070                                 var des = XamlServices.Load (xr);
1071                                 // ProvideValue() returns an array
1072                                 Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
1073                         }
1074                 }
1075
1076                 [Test]
1077                 public void Write_MyExtension ()
1078                 {
1079                         //var obj = new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"};
1080                         using (var xr = GetReader ("MyExtension.xml")) {
1081                                 var des = XamlServices.Load (xr);
1082                                 // ProvideValue() returns this.
1083                                 Assert.AreEqual ("provided_value", des, "#1");
1084                         }
1085                 }
1086
1087                 [Test]
1088                 [ExpectedException (typeof (InvalidCastException))] // unable to cast string to MarkupExtension
1089                 [Category ("NotWorking")]
1090                 public void Write_MyExtension2 ()
1091                 {
1092                         //var obj = new MyExtension2 () { Foo = typeof (int), Bar = "v2"};
1093                         using (var xr = GetReader ("MyExtension2.xml")) {
1094                                 XamlServices.Load (xr);
1095                         }
1096                 }
1097
1098                 [Test]
1099                 public void Write_MyExtension3 ()
1100                 {
1101                         //var obj = new MyExtension3 () { Foo = typeof (int), Bar = "v2"};
1102                         using (var xr = GetReader ("MyExtension3.xml")) {
1103                                 var des = XamlServices.Load (xr);
1104                                 // StringConverter is used and the resulting value comes from ToString().
1105                                 Assert.AreEqual ("MonoTests.System.Xaml.MyExtension3", des, "#1");
1106                         }
1107                 }
1108
1109                 [Test]
1110                 [ExpectedException (typeof (XamlObjectWriterException))] // wrong TypeConverter input (input string for DateTimeConverter invalid)
1111                 public void Write_MyExtension4 ()
1112                 {
1113                         var obj = new MyExtension4 () { Foo = typeof (int), Bar = "v2"};
1114                         using (var xr = GetReader ("MyExtension4.xml")) {
1115                                 var des = XamlServices.Load (xr);
1116                                 Assert.AreEqual (obj, des, "#1");
1117                         }
1118                 }
1119
1120                 [Test]
1121                 public void Write_MyExtension6 ()
1122                 {
1123                         //var obj = new MyExtension6 ("foo");
1124                         using (var xr = GetReader ("MyExtension6.xml")) {
1125                                 var des = XamlServices.Load (xr);
1126                                 // ProvideValue() returns this.
1127                                 Assert.AreEqual ("foo", des, "#1");
1128                         }
1129                 }
1130                 
1131                 [Test]
1132                 public void Write_PropertyDefinition ()
1133                 {
1134                         //var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
1135                         using (var xr = GetReader ("PropertyDefinition.xml")) {
1136                                 var des = (PropertyDefinition) XamlServices.Load (xr);
1137                                 Assert.AreEqual ("protected", des.Modifier, "#1");
1138                                 Assert.AreEqual ("foo", des.Name, "#2");
1139                                 Assert.AreEqual (XamlLanguage.String, des.Type, "#3");
1140                         }
1141                 }
1142                 
1143                 [Test]
1144                 [Ignore ("this still does not give successful deserialization result - should there be any way?")]
1145                 public void Write_StaticExtensionWrapper ()
1146                 {
1147                         //var obj = new StaticExtensionWrapper () { Param = new StaticExtension ("Foo") };
1148                         using (var xr = GetReader ("StaticExtensionWrapper.xml")) {
1149                                 var des = (StaticExtensionWrapper) XamlServices.Load (xr);
1150                                 Assert.IsNotNull (des.Param, "#1");
1151                                 Assert.AreEqual ("Foo", des.Param.Member, "#2");
1152                         }
1153                 }
1154                 
1155                 [Test]
1156                 [Ignore ("this still does not give successful deserialization result - should there be any way?")]
1157                 public void Write_TypeExtensionWrapper ()
1158                 {
1159                         //var obj = new TypeExtensionWrapper () { Param = new TypeExtension ("Foo") };
1160                         using (var xr = GetReader ("TypeExtensionWrapper.xml")) {
1161                                 var des = (TypeExtensionWrapper) XamlServices.Load (xr);
1162                                 Assert.IsNotNull (des.Param, "#1");
1163                                 // TypeName was not serialized into xml, hence deserialized as empty.
1164                                 Assert.AreEqual (String.Empty, des.Param.TypeName, "#2");
1165                         }
1166                 }
1167                 
1168                 [Test]
1169                 public void Write_NamedItems ()
1170                 {
1171                         // foo
1172                         // - bar
1173                         // -- foo
1174                         // - baz
1175                         var obj = new NamedItem ("foo");
1176                         var obj2 = new NamedItem ("bar");
1177                         obj.References.Add (obj2);
1178                         obj.References.Add (new NamedItem ("baz"));
1179                         obj2.References.Add (obj);
1180
1181                         using (var xr = GetReader ("NamedItems.xml")) {
1182                                 var des = (NamedItem) XamlServices.Load (xr);
1183                                 Assert.IsNotNull (des, "#1");
1184                                 Assert.AreEqual (2, des.References.Count, "#2");
1185                                 Assert.AreEqual (typeof (NamedItem), des.References [0].GetType (), "#3");
1186                                 Assert.AreEqual (typeof (NamedItem), des.References [1].GetType (), "#4");
1187                                 Assert.AreEqual (des, des.References [0].References [0], "#5");
1188                         }
1189                 }
1190                 
1191                 [Test]
1192                 public void Write_NamedItems2 ()
1193                 {
1194                         // i1
1195                         // - i2
1196                         // -- i3
1197                         // - i4
1198                         // -- i3
1199                         var obj = new NamedItem2 ("i1");
1200                         var obj2 = new NamedItem2 ("i2");
1201                         var obj3 = new NamedItem2 ("i3");
1202                         var obj4 = new NamedItem2 ("i4");
1203                         obj.References.Add (obj2);
1204                         obj.References.Add (obj4);
1205                         obj2.References.Add (obj3);
1206                         obj4.References.Add (obj3);
1207
1208                         using (var xr = GetReader ("NamedItems2.xml")) {
1209                                 var des = (NamedItem2) XamlServices.Load (xr);
1210                                 Assert.IsNotNull (des, "#1");
1211                                 Assert.AreEqual (2, des.References.Count, "#2");
1212                                 Assert.AreEqual (typeof (NamedItem2), des.References [0].GetType (), "#3");
1213                                 Assert.AreEqual (typeof (NamedItem2), des.References [1].GetType (), "#4");
1214                                 Assert.AreEqual (1, des.References [0].References.Count, "#5");
1215                                 Assert.AreEqual (1, des.References [1].References.Count, "#6");
1216                                 Assert.AreEqual (des.References [0].References [0], des.References [1].References [0], "#7");
1217                         }
1218                 }
1219
1220                 [Test]
1221                 public void Write_XmlSerializableWrapper ()
1222                 {
1223                         var assns = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
1224                         using (var xr = GetReader ("XmlSerializableWrapper.xml")) {
1225                                 var des = (XmlSerializableWrapper) XamlServices.Load (xr);
1226                                 Assert.IsNotNull (des, "#1");
1227                                 Assert.IsNotNull (des.Value, "#2");
1228                                 Assert.AreEqual ("<root xmlns=\"" + assns + "\" />", des.Value.GetRaw (), "#3");
1229                         }
1230                 }
1231
1232                 [Test]
1233                 public void Write_XmlSerializable ()
1234                 {
1235                         using (var xr = GetReader ("XmlSerializable.xml")) {
1236                                 var des = (XmlSerializable) XamlServices.Load (xr);
1237                                 Assert.IsNotNull (des, "#1");
1238                         }
1239                 }
1240
1241                 [Test]
1242                 public void Write_ListXmlSerializable ()
1243                 {
1244                         using (var xr = GetReader ("List_XmlSerializable.xml")) {
1245                                 var des = (List<XmlSerializable>) XamlServices.Load (xr);
1246                                 Assert.AreEqual (1, des.Count, "#1");
1247                         }
1248                 }
1249
1250                 [Test]
1251                 public void Write_AttachedProperty ()
1252                 {
1253                         using (var xr = GetReader ("AttachedProperty.xml")) {
1254                                 AttachedWrapper des = null;
1255                                 try {
1256                                         des = (AttachedWrapper) XamlServices.Load (xr);
1257                                         Assert.IsNotNull (des.Value, "#1");
1258                                         Assert.AreEqual ("x", Attachable.GetFoo (des), "#2");
1259                                         Assert.AreEqual ("y", Attachable.GetFoo (des.Value), "#3");
1260                                 } finally {
1261                                         if (des != null) {
1262                                                 Attachable.SetFoo (des, null);
1263                                                 Attachable.SetFoo (des.Value, null);
1264                                         }
1265                                 }
1266                         }
1267                 }
1268
1269                 [Test]
1270                 public void Write_EventStore ()
1271                 {
1272                         using (var xr = GetReader ("EventStore.xml")) {
1273                                 var res = (EventStore) XamlServices.Load (xr);
1274                                 Assert.AreEqual ("foo", res.Examine (), "#1");
1275                                 Assert.IsTrue (res.Method1Invoked, "#2");
1276                         }
1277                 }
1278
1279                 [Test]
1280                 [ExpectedException (typeof (XamlDuplicateMemberException))] // for two occurence of Event1 ...
1281                 public void Write_EventStore2 ()
1282                 {
1283                         using (var xr = GetReader ("EventStore2.xml")) {
1284                                 XamlServices.Load (xr);
1285                         }
1286                 }
1287
1288                 [Test]
1289                 [ExpectedException (typeof (XamlObjectWriterException))] // attaching nonexistent method
1290                 public void Write_EventStore3 ()
1291                 {
1292                         using (var xr = GetReader ("EventStore3.xml")) {
1293                                 XamlServices.Load (xr);
1294                         }
1295                 }
1296
1297                 [Test]
1298                 [Category ("NotWorking")] // type resolution failure.
1299                 public void Write_EventStore4 ()
1300                 {
1301                         using (var xr = GetReader ("EventStore4.xml")) {
1302                                 var res = (EventStore2<EventArgs>) XamlServices.Load (xr);
1303                                 Assert.AreEqual ("foo", res.Examine (), "#1");
1304                                 Assert.IsTrue (res.Method1Invoked, "#2");
1305                         }
1306                 }
1307
1308                 [Test]
1309                 public void Write_AbstractWrapper ()
1310                 {
1311                         using (var xr = GetReader ("AbstractContainer.xml")) {
1312                                 var res = (AbstractContainer) XamlServices.Load (xr);
1313                                 Assert.IsNull (res.Value1, "#1");
1314                                 Assert.IsNotNull (res.Value2, "#2");
1315                                 Assert.AreEqual ("x", res.Value2.Foo, "#3");
1316                         }
1317                 }
1318
1319                 [Test]
1320                 public void Write_ReadOnlyPropertyContainer ()
1321                 {
1322                         using (var xr = GetReader ("ReadOnlyPropertyContainer.xml")) {
1323                                 var res = (ReadOnlyPropertyContainer) XamlServices.Load (xr);
1324                                 Assert.AreEqual ("x", res.Foo, "#1");
1325                                 Assert.AreEqual ("x", res.Bar, "#2");
1326                         }
1327                 }
1328
1329                 [Test]
1330                 public void Write_TypeConverterOnListMember ()
1331                 {
1332                         using (var xr = GetReader ("TypeConverterOnListMember.xml")) {
1333                                 var res = (SecondTest.TypeOtherAssembly) XamlServices.Load (xr);
1334                                 Assert.AreEqual (3, res.Values.Count, "#1");
1335                                 Assert.AreEqual (3, res.Values [2], "#2");
1336                         }
1337                 }
1338
1339                 [Test]
1340                 public void Write_EnumContainer ()
1341                 {
1342                         using (var xr = GetReader ("EnumContainer.xml")) {
1343                                 var res = (EnumContainer) XamlServices.Load (xr);
1344                                 Assert.AreEqual (EnumValueType.Two, res.EnumProperty, "#1");
1345                         }
1346                 }
1347
1348                 [Test]
1349                 public void Write_CollectionContentProperty ()
1350                 {
1351                         using (var xr = GetReader ("CollectionContentProperty.xml")) {
1352                                 var res = (CollectionContentProperty) XamlServices.Load (xr);
1353                                 Assert.AreEqual (4, res.ListOfItems.Count, "#1");
1354                         }
1355                 }
1356
1357                 [Test]
1358                 public void Write_CollectionContentProperty2 ()
1359                 {
1360                         using (var xr = GetReader ("CollectionContentProperty2.xml")) {
1361                                 var res = (CollectionContentProperty) XamlServices.Load (xr);
1362                                 Assert.AreEqual (4, res.ListOfItems.Count, "#1");
1363                         }
1364                 }
1365
1366                 [Test]
1367                 public void Write_AmbientPropertyContainer ()
1368                 {
1369                         using (var xr = GetReader ("AmbientPropertyContainer.xml")) {
1370                                 var res = (SecondTest.ResourcesDict) XamlServices.Load (xr);
1371                                 Assert.AreEqual (2, res.Count, "#1");
1372                                 Assert.IsTrue (res.ContainsKey ("TestDictItem"), "#2");
1373                                 Assert.IsTrue (res.ContainsKey ("okay"), "#3");
1374                                 var i1 = res ["TestDictItem"] as SecondTest.TestObject;
1375                                 Assert.IsNull (i1.TestProperty, "#4");
1376                                 var i2 = res ["okay"] as SecondTest.TestObject;
1377                                 Assert.AreEqual (i1, i2.TestProperty, "#5");
1378                         }
1379                 }
1380
1381                 [Test] // bug #682102
1382                 public void Write_AmbientPropertyContainer2 ()
1383                 {
1384                         using (var xr = GetReader ("AmbientPropertyContainer2.xml")) {
1385                                 var res = (SecondTest.ResourcesDict) XamlServices.Load (xr);
1386                                 Assert.AreEqual (2, res.Count, "#1");
1387                                 Assert.IsTrue (res.ContainsKey ("TestDictItem"), "#2");
1388                                 Assert.IsTrue (res.ContainsKey ("okay"), "#3");
1389                                 var i1 = res ["TestDictItem"] as SecondTest.TestObject;
1390                                 Assert.IsNull (i1.TestProperty, "#4");
1391                                 var i2 = res ["okay"] as SecondTest.TestObject;
1392                                 Assert.AreEqual (i1, i2.TestProperty, "#5");
1393                         }
1394                 }
1395
1396                 [Test]
1397                 public void Write_NullableContainer ()
1398                 {
1399                         using (var xr = GetReader ("NullableContainer.xml")) {
1400                                 var res = (NullableContainer) XamlServices.Load (xr);
1401                                 Assert.AreEqual (5, res.TestProp, "#1");
1402                         }
1403                 }
1404
1405                 [Test]
1406                 public void Write_DirectListContainer ()
1407                 {
1408                         using (var xr = GetReader ("DirectListContainer.xml")) {
1409                                 var res = (DirectListContainer) XamlServices.Load (xr);
1410                                 Assert.AreEqual (3, res.Items.Count, "#1");
1411                                 Assert.AreEqual ("Hello3", res.Items [2].Value, "#2");
1412                         }
1413                 }
1414
1415                 [Test]
1416                 public void Write_DirectDictionaryContainer ()
1417                 {
1418                         using (var xr = GetReader ("DirectDictionaryContainer.xml")) {
1419                                 var res = (DirectDictionaryContainer) XamlServices.Load (xr);
1420                                 Assert.AreEqual (3, res.Items.Count, "#1");
1421                                 Assert.AreEqual (40, res.Items [EnumValueType.Three], "#2");
1422                         }
1423                 }
1424
1425                 [Test]
1426                 public void Write_DirectDictionaryContainer2 ()
1427                 {
1428                         using (var xr = GetReader ("DirectDictionaryContainer2.xml")) {
1429                                 var res = (SecondTest.ResourcesDict2) XamlServices.Load (xr);
1430                                 Assert.AreEqual (2, res.Count, "#1");
1431                                 Assert.AreEqual ("1", ((SecondTest.TestObject2) res ["1"]).TestProperty, "#2");
1432                                 Assert.AreEqual ("two", ((SecondTest.TestObject2) res ["two"]).TestProperty, "#3");
1433                         }
1434                 }
1435         }
1436 }