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