2 // Copyright (C) 2010 Novell Inc. http://novell.com
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:
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
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.
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.ComponentModel;
29 using System.Reflection;
30 using System.Windows.Markup;
32 using System.Xaml.Schema;
34 using NUnit.Framework;
36 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
38 namespace MonoTests.System.Xaml
41 public class XamlObjectWriterTest
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;
48 public XamlObjectWriterTest ()
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);
59 public class TestClass1
65 public string TestProp1 { get; set; }
67 public TestClass1 TestProp2 { get; set; }
68 public string TestProp3 { get; set; }
69 public int TestProp4 { get; set; }
72 public class Foo : List<int>
76 Bar = new List<string> ();
78 public List<string> Bar { get; private set; }
79 public List<string> Baz { get; set; }
80 public string Ext { get; set; }
84 [ExpectedException (typeof (ArgumentNullException))]
85 public void SchemaContextNull ()
87 new XamlObjectWriter (null);
91 public void SettingsNull ()
94 var w = new XamlObjectWriter (sctx, null);
95 Assert.AreEqual (sctx, w.SchemaContext, "#1");
99 [ExpectedException (typeof (XamlObjectWriterException))]
100 public void InitWriteEndMember ()
102 new XamlObjectWriter (sctx, null).WriteEndMember ();
106 [ExpectedException (typeof (XamlObjectWriterException))]
107 public void InitWriteEndObject ()
109 new XamlObjectWriter (sctx, null).WriteEndObject ();
113 [ExpectedException (typeof (XamlObjectWriterException))]
114 public void InitWriteGetObject ()
116 new XamlObjectWriter (sctx, null).WriteGetObject ();
120 [ExpectedException (typeof (XamlObjectWriterException))]
121 public void InitWriteValue ()
123 new XamlObjectWriter (sctx, null).WriteValue ("foo");
127 [ExpectedException (typeof (XamlObjectWriterException))]
128 public void InitWriteStartMember ()
130 new XamlObjectWriter (sctx, null).WriteStartMember (new XamlMember (str_len, sctx));
134 public void InitWriteNamespace ()
136 var xw = new XamlObjectWriter (sctx, null);
137 xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "x")); // ignored.
139 Assert.IsNull (xw.Result, "#1");
143 [ExpectedException (typeof (ArgumentNullException))]
144 public void WriteNamespaceNull ()
146 new XamlObjectWriter (sctx, null).WriteNamespace (null);
150 public void InitWriteStartObject ()
152 var xw = new XamlObjectWriter (sctx, null);
153 xw.WriteStartObject (new XamlType (typeof (int), sctx));
155 Assert.AreEqual (0, xw.Result, "#1");
159 [ExpectedException (typeof (XamlObjectWriterException))]
160 public void GetObjectAfterStartObject ()
162 var xw = new XamlObjectWriter (sctx, null);
163 xw.WriteStartObject (xt3);
164 xw.WriteGetObject ();
168 //[ExpectedException (typeof (XamlObjectWriterException))]
169 public void WriteStartObjectAfterTopLevel ()
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);
179 [ExpectedException (typeof (XamlObjectWriterException))]
180 public void WriteEndObjectExcess ()
182 var xw = new XamlObjectWriter (sctx, null);
183 xw.WriteStartObject (xt3);
184 xw.WriteEndObject ();
185 xw.WriteEndObject ();
189 [ExpectedException (typeof (XamlObjectWriterException))]
190 public void StartObjectWriteEndMember ()
192 var xw = new XamlObjectWriter (sctx, null);
193 xw.WriteStartObject (xt3);
194 xw.WriteEndMember ();
198 public void WriteObjectAndMember ()
200 var xw = new XamlObjectWriter (sctx, null);
201 xw.WriteStartObject (xt3);
202 xw.WriteStartMember (xm2);
203 xw.WriteValue ("foo");
204 xw.WriteEndMember ();
209 public void StartMemberWriteEndMember ()
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...
219 [ExpectedException (typeof (XamlObjectWriterException))]
220 public void StartMemberWriteStartMember ()
222 var xw = new XamlObjectWriter (sctx, null);
223 xw.WriteStartObject (xt3);
224 xw.WriteStartMember (xm3);
225 xw.WriteStartMember (xm3);
229 public void WriteObjectInsideMember ()
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 ();
241 [ExpectedException (typeof (XamlDuplicateMemberException))]
242 public void ValueAfterObject ()
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 ();
256 [ExpectedException (typeof (XamlDuplicateMemberException))]
257 public void ValueAfterObject2 ()
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");
267 xw.WriteEndMember (); // Though this raises an error.
271 [ExpectedException (typeof (XamlDuplicateMemberException))]
272 public void DuplicateAssignment ()
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 ();
284 [ExpectedException (typeof (XamlDuplicateMemberException))]
285 public void DuplicateAssignment2 ()
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);
297 //[ExpectedException (typeof (ArgumentException))] // oh? XamlXmlWriter raises this.
298 [Category ("NotWorking")] // so, it's not worthy of passing.
299 public void WriteValueTypeMismatch ()
301 var xw = new XamlObjectWriter (sctx, null);
302 xw.WriteStartObject (xt);
303 xw.WriteStartMember (XamlLanguage.Initialization);
304 xw.WriteValue (new TestClass1 ());
305 xw.WriteEndMember ();
307 Assert.IsNotNull (xw.Result, "#1");
308 Assert.AreEqual (typeof (TestClass1), xw.Result.GetType (), "#2");
312 [ExpectedException (typeof (XamlObjectWriterException))] // it fails to convert type and set property value.
313 public void WriteValueTypeMismatch2 ()
315 var xw = new XamlObjectWriter (sctx, null);
316 xw.WriteStartObject (xt3);
317 xw.WriteStartMember (xm3);
318 xw.WriteValue ("foo");
319 xw.WriteEndMember ();
323 public void WriteValueTypeOK ()
325 var xw = new XamlObjectWriter (sctx, null);
326 xw.WriteStartObject (xt);
327 xw.WriteStartMember (XamlLanguage.Initialization);
328 xw.WriteValue ("foo");
329 xw.WriteEndMember ();
331 Assert.AreEqual ("foo", xw.Result, "#1");
335 // This behavior is different from XamlXmlWriter. Compare to XamlXmlWriterTest.WriteValueList().
336 [Category ("NotWorking")] // not worthy of passing
337 public void WriteValueList ()
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 ();
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");
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).
360 [ExpectedException (typeof (XamlObjectWriterException))]
361 [Ignore ("See the comment in XamlObjectWriterTest.cs")]
362 public void CloseWithoutEndMember ()
364 var xw = new XamlObjectWriter (sctx, null);
365 xw.WriteStartObject (xt);
366 xw.WriteStartMember (XamlLanguage.Initialization);
367 xw.WriteValue ("foo");
372 [ExpectedException (typeof (XamlObjectWriterException))]
373 public void WriteValueAfterValue ()
375 var xw = new XamlObjectWriter (sctx, null);
376 xw.WriteStartObject (xt);
377 xw.WriteValue ("foo");
378 xw.WriteValue ("bar");
382 [ExpectedException (typeof (XamlObjectWriterException))]
383 public void WriteValueAfterNullValue ()
385 var xw = new XamlObjectWriter (sctx, null);
386 xw.WriteStartObject (xt);
387 xw.WriteValue (null);
388 xw.WriteValue ("bar");
391 [ExpectedException (typeof (XamlObjectWriterException))]
392 public void StartMemberWriteEndObject ()
394 var xw = new XamlObjectWriter (sctx, null);
395 xw.WriteStartObject (xt3);
396 xw.WriteStartMember (xm3);
397 xw.WriteEndObject ();
401 public void WriteNamespace ()
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 ();
410 Assert.IsTrue (ret is TestClass1, "#1");
414 [ExpectedException (typeof (XamlObjectWriterException))]
415 public void StartObjectStartObject ()
417 var xw = new XamlObjectWriter (sctx, null);
418 xw.WriteStartObject (xt3);
419 xw.WriteStartObject (xt3);
423 [ExpectedException (typeof (XamlObjectWriterException))]
424 public void StartObjectValue ()
426 var xw = new XamlObjectWriter (sctx, null);
427 xw.WriteStartObject (xt3);
428 xw.WriteValue ("foo");
432 [ExpectedException (typeof (XamlDuplicateMemberException))] // duplicate member assignment
433 public void ObjectContainsObjectAndObject ()
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
447 [ExpectedException (typeof (XamlDuplicateMemberException))] // duplicate member assignment
448 public void ObjectContainsObjectAndValue ()
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 ...
457 xw.WriteEndMember (); // Though this raises an error.
461 [ExpectedException (typeof (XamlDuplicateMemberException))] // duplicate member assignment
462 public void ObjectContainsObjectAndValue2 ()
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.
474 [ExpectedException (typeof (XamlObjectWriterException))] // unlike XamlXmlWriter (IOE)
475 public void EndObjectAfterNamespace ()
477 var xw = new XamlObjectWriter (sctx, null);
478 xw.WriteStartObject (xt3);
479 xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
480 xw.WriteEndObject ();
484 [ExpectedException (typeof (XamlObjectWriterException))] // ... unlike XamlXmlWriter (throws IOE)
485 public void WriteValueAfterNamespace ()
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");
495 [ExpectedException (typeof (XamlObjectWriterException))] // ... unlike XamlXmlWriter (allowed)
496 public void ValueThenStartObject ()
498 var xw = new XamlObjectWriter (sctx, null);
499 xw.WriteStartObject (xt3);
500 xw.WriteStartMember (xm2);
501 xw.WriteValue ("foo");
502 xw.WriteStartObject (xt3);
507 [ExpectedException (typeof (XamlObjectWriterException))] // ... unlike XamlXmlWriter (allowed, as it allows StartObject after Value)
508 public void ValueThenNamespace ()
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)
518 [ExpectedException (typeof (XamlObjectWriterException))] // strange, this does *not* result in IOE...
519 public void ValueThenNamespaceThenEndMember ()
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 ();
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 ()
533 var xw = new XamlObjectWriter (sctx, null);
534 xw.WriteStartObject (xt3);
535 xw.WriteNamespace (new NamespaceDeclaration ("urn:foo", "y"));
539 [Category ("NotWorking")] // not worthy of passing
540 public void StartMemberBeforeNamespace ()
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 ();
551 [ExpectedException (typeof (XamlObjectWriterException))]
552 public void StartMemberBeforeNamespace2 ()
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");
565 [ExpectedException (typeof (XamlObjectWriterException))]
566 public void EndMemberThenStartObject ()
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);
576 // The semantics on WriteGetObject() is VERY different from XamlXmlWriter.
579 [ExpectedException (typeof (XamlObjectWriterException))]
580 public void GetObjectOnNullValue ()
582 var xw = new XamlObjectWriter (sctx, null);
583 xw.WriteStartObject (xt3);
584 xw.WriteStartMember (xm2);
585 xw.WriteGetObject ();
589 [ExpectedException (typeof (XamlObjectWriterException))]
590 public void GetObjectOnNullValue2 ()
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.
599 public void GetObjectOnIntValue ()
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 ();
609 // String is not treated as a collection on XamlXmlWriter, while this XamlObjectWriter does.
610 public void GetObjectOnNonNullString ()
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");
621 public void GetObjectOnCollection ()
623 var xw = new XamlObjectWriter (sctx, null);
624 xw.WriteStartObject (xt4);
625 xw.WriteStartMember (new XamlMember (typeof (Foo).GetProperty ("Bar"), sctx));
626 xw.WriteGetObject ();
631 [ExpectedException (typeof (XamlObjectWriterException))]
632 public void ValueAfterGetObject ()
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");
642 [ExpectedException (typeof (XamlObjectWriterException))]
643 public void StartObjectAfterGetObject ()
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);
653 [ExpectedException (typeof (XamlObjectWriterException))]
654 public void EndMemberAfterGetObject ()
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 (); // ...!?
664 public void StartMemberAfterGetObject ()
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"));
673 xw.WriteEndMember ();
675 xw.WriteEndObject (); // got object
676 xw.WriteEndMember (); // Bar
677 xw.WriteEndObject (); // started object
683 public void EndObjectAfterGetObject ()
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 ();
693 public void WriteAttachableProperty ()
695 Attached2 result = null;
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;
706 Assert.AreEqual ("Test", result.Property, "#1");
710 public void OnSetValueAndHandledFalse () // part of bug #3003
713 string ver = "net_4_5";
715 string ver = "net_4_0";
719 var obj = new TestClass3 ();
720 obj.Nested = new TestClass3 ();
721 var sw = new StringWriter ();
722 var xxw = new XamlXmlWriter (XmlWriter.Create (sw), new XamlSchemaContext ());
723 XamlServices.Transform (new XamlObjectReader (obj), xxw);
724 Console.Error.WriteLine (sw);
726 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);
727 var settings = new XamlObjectWriterSettings ();
728 bool invoked = false;
729 settings.XamlSetValueHandler = (sender, e) => {
731 Assert.IsNotNull (sender, "#1");
732 Assert.AreEqual (typeof (TestClass3), sender.GetType (), "#2");
733 Assert.AreEqual ("Nested", e.Member.Name, "#3");
734 Assert.IsTrue (sender != e.Member.Invoker.GetValue (sender), "#4");
735 Assert.IsFalse (e.Handled, "#5");
736 // ... and leave Handled as false, to invoke the actual setter
738 var xow = new XamlObjectWriter (new XamlSchemaContext (), settings);
739 var xxr = new XamlXmlReader (XmlReader.Create (new StringReader (xml)));
740 XamlServices.Transform (xxr, xow);
741 Assert.IsTrue (invoked, "#6");
742 Assert.IsNotNull (xow.Result, "#7");
743 var ret = xow.Result as TestClass3;
744 Assert.IsNotNull (ret.Nested, "#8");
747 [Test] // bug #3003 repro
748 public void EventsAndProcessingOrder ()
750 var asm = Assembly.GetExecutingAssembly ();
751 var context = new XamlSchemaContext (new Assembly [] { asm });
752 var output = XamarinBug3003.TestContext.Writer;
755 var reader = new XamlXmlReader (XmlReader.Create (new StringReader (XamarinBug3003.TestContext.XmlInput)), context);
757 var writerSettings = new XamlObjectWriterSettings ();
758 writerSettings.AfterBeginInitHandler = (sender, e) => {
759 output.WriteLine ("XamlObjectWriterSettings.AfterBeginInit: {0}", e.Instance);
761 writerSettings.AfterEndInitHandler = (sender, e) => {
762 output.WriteLine ("XamlObjectWriterSettings.AfterEndInit: {0}", e.Instance);
765 writerSettings.BeforePropertiesHandler = (sender, e) => {
766 output.WriteLine ("XamlObjectWriterSettings.BeforeProperties: {0}", e.Instance);
768 writerSettings.AfterPropertiesHandler = (sender, e) => {
769 output.WriteLine ("XamlObjectWriterSettings.AfterProperties: {0}", e.Instance);
771 writerSettings.XamlSetValueHandler = (sender, e) => {
772 output.WriteLine ("XamlObjectWriterSettings.XamlSetValue: {0}, Member: {1}", e.Value, e.Member.Name);
775 var writer = new XamlObjectWriter (context, writerSettings);
776 XamlServices.Transform (reader, writer);
777 var obj = writer.Result as XamarinBug3003.Parent;
779 output.WriteLine ("Loaded {0}", obj);
781 Assert.AreEqual (XamarinBug3003.TestContext.ExpectedResult.Replace ("\r\n", "\n"), output.ToString ().Replace ("\r\n", "\n"), "#1");
783 Assert.AreEqual (2, obj.Children.Count, "#2");
786 // extra use case based tests.
789 public void WriteEx_Type_WriteString ()
791 var ow = new XamlObjectWriter (sctx);
792 ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
794 ow.WriteStartObject (XamlLanguage.Type);
795 ow.WriteStartMember (XamlLanguage.PositionalParameters);
796 ow.WriteValue ("x:Int32");
798 Assert.AreEqual (typeof (int), ow.Result, "#1");
802 public void WriteEx_Type_WriteType ()
804 var ow = new XamlObjectWriter (sctx);
805 ow.WriteNamespace (new NamespaceDeclaration (XamlLanguage.Xaml2006Namespace, "x"
807 ow.WriteStartObject (XamlLanguage.Type);
808 ow.WriteStartMember (XamlLanguage.PositionalParameters);
809 ow.WriteValue (typeof (int));
811 Assert.AreEqual (typeof (int), ow.Result, "#1");
815 public void LookupCorrectEventBoundMethod ()
817 var o = (XamarinBug2927.MyRootClass) XamlServices.Load (GetReader ("LookupCorrectEvent.xml"));
818 o.Child.Descendant.Work ();
819 Assert.IsTrue (o.Invoked, "#1");
820 Assert.IsFalse (o.Child.Invoked, "#2");
821 Assert.IsFalse (o.Child.Descendant.Invoked, "#3");
825 [ExpectedException (typeof (XamlObjectWriterException))]
826 public void LookupCorrectEventBoundMethod2 ()
828 XamlServices.Load (GetReader ("LookupCorrectEvent2.xml"));
832 public void LookupCorrectEventBoundMethod3 ()
834 XamlServices.Load (GetReader ("LookupCorrectEvent3.xml"));
837 // common use case based tests (to other readers/writers).
839 XamlReader GetReader (string filename)
842 string ver = "net_4_5";
844 string ver = "net_4_0";
846 string xml = File.ReadAllText (Path.Combine ("Test/XmlFiles", filename)).Replace ("net_4_0", ver);
847 return new XamlXmlReader (XmlReader.Create (new StringReader (xml)));
851 public void Write_String ()
853 using (var xr = GetReader ("String.xml")) {
854 var des = XamlServices.Load (xr);
855 Assert.AreEqual ("foo", des, "#1");
860 public void Write_Int32 ()
862 using (var xr = GetReader ("Int32.xml")) {
863 var des = XamlServices.Load (xr);
864 Assert.AreEqual (5, des, "#1");
869 public void Write_DateTime ()
871 using (var xr = GetReader ("DateTime.xml")) {
872 var des = XamlServices.Load (xr);
873 Assert.AreEqual (new DateTime (2010, 4, 14), des, "#1");
878 public void Write_TimeSpan ()
880 using (var xr = GetReader ("TimeSpan.xml")) {
881 var des = XamlServices.Load (xr);
882 Assert.AreEqual (TimeSpan.FromMinutes (7), des, "#1");
887 public void Write_Uri ()
889 using (var xr = GetReader ("Uri.xml")) {
890 var des = XamlServices.Load (xr);
891 Assert.AreEqual (new Uri ("urn:foo"), des, "#1");
896 public void Write_Null ()
898 using (var xr = GetReader ("NullExtension.xml")) {
899 var des = XamlServices.Load (xr);
900 Assert.IsNull (des, "#1");
905 public void Write_Type ()
907 using (var xr = GetReader ("Type.xml")) {
908 var des = XamlServices.Load (xr);
909 Assert.AreEqual (typeof (int), des, "#1");
914 public void Write_Type2 ()
916 var obj = typeof (MonoTests.System.Xaml.TestClass1);
917 using (var xr = GetReader ("Type2.xml")) {
918 var des = XamlServices.Load (xr);
919 Assert.AreEqual (obj, des, "#1");
924 public void Write_Guid ()
926 var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
927 using (var xr = GetReader ("Guid.xml")) {
928 var des = XamlServices.Load (xr);
929 Assert.AreEqual (obj, des, "#1");
934 public void Write_GuidFactoryMethod ()
936 var obj = Guid.Parse ("9c3345ec-8922-4662-8e8d-a4e41f47cf09");
937 using (var xr = GetReader ("GuidFactoryMethod.xml")) {
938 var des = XamlServices.Load (xr);
939 Assert.AreEqual (obj, des, "#1");
944 [ExpectedException (typeof (XamlObjectWriterException))] // cannot resolve the StaticExtension value.
945 public void Write_StaticExtension ()
947 var obj = new StaticExtension ("FooBar");
948 using (var xr = GetReader ("StaticExtension.xml")) {
949 var des = XamlServices.Load (xr);
950 Assert.AreEqual (obj, des, "#1");
955 [Ignore ("Not sure why MemberType is NOT serialized. Needs investigation")]
956 public void Write_StaticExtension2 ()
958 var obj = new StaticExtension ("FooBar"); //incorrect
959 using (var xr = GetReader ("StaticExtension2.xml")) {
960 var des = XamlServices.Load (xr);
961 Assert.AreEqual (obj, des, "#1");
966 public void Write_Reference ()
968 using (var xr = GetReader ("Reference.xml")) {
969 var des = XamlServices.Load (xr);
970 // .NET does not return Reference.
971 // Its ProvideValue() returns MS.Internal.Xaml.Context.NameFixupToken,
972 // which is assumed (by name) to resolve to the referenced object.
973 Assert.IsNotNull (des, "#1");
974 //Assert.AreEqual (new Reference ("FooBar"), des, "#1");
979 public void Write_ArrayInt32 ()
981 var obj = new int [] {4, -5, 0, 255, int.MaxValue};
982 using (var xr = GetReader ("Array_Int32.xml")) {
983 var des = XamlServices.Load (xr);
984 Assert.AreEqual (obj, des, "#1");
989 public void Write_ListInt32 ()
991 var obj = new int [] {5, -3, int.MaxValue, 0}.ToList ();
992 using (var xr = GetReader ("List_Int32.xml")) {
993 var des = (List<int>) XamlServices.Load (xr);
994 Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
999 public void Write_ListInt32_2 ()
1001 var obj = new List<int> (new int [0]) { Capacity = 0 }; // set explicit capacity for trivial implementation difference
1002 using (var xr = GetReader ("List_Int32_2.xml")) {
1003 var des = (List<int>) XamlServices.Load (xr);
1004 Assert.AreEqual (obj.ToArray (), des.ToArray (), "#1");
1009 public void Write_ListType ()
1011 var obj = new List<Type> (new Type [] {typeof (int), typeof (Dictionary<Type, XamlType>)}) { Capacity = 2 };
1012 using (var xr = GetReader ("List_Type.xml")) {
1013 var des = XamlServices.Load (xr);
1014 Assert.AreEqual (obj, des, "#1");
1019 public void Write_ListArray ()
1021 var obj = new List<Array> (new Array [] { new int [] { 1,2,3}, new string [] { "foo", "bar", "baz" }}) { Capacity = 2 };
1022 using (var xr = GetReader ("List_Array.xml")) {
1023 var des = (List<Array>) XamlServices.Load (xr);
1024 Assert.AreEqual (obj, des, "#1");
1029 public void Write_DictionaryInt32String ()
1031 var dic = new Dictionary<int,string> ();
1034 dic.Add (-2, "baz");
1035 using (var xr = GetReader ("Dictionary_Int32_String.xml")) {
1036 var des = XamlServices.Load (xr);
1037 Assert.AreEqual (dic, des, "#1");
1042 public void Write_DictionaryStringType ()
1044 var dic = new Dictionary<string,Type> ();
1045 dic.Add ("t1", typeof (int));
1046 dic.Add ("t2", typeof (int []));
1047 dic.Add ("t3", typeof (int?));
1048 dic.Add ("t4", typeof (List<int>));
1049 dic.Add ("t5", typeof (Dictionary<int,DateTime>));
1050 dic.Add ("t6", typeof (List<KeyValuePair<int,DateTime>>));
1051 using (var xr = GetReader ("Dictionary_String_Type.xml")) {
1052 var des = XamlServices.Load (xr);
1053 Assert.AreEqual (dic, des, "#1");
1058 [Ignore ("Needs to get successfully deserialized. Currently we can't")]
1059 public void Write_PositionalParameters1Wrapper ()
1061 // Unlike the above case, this has the wrapper object and hence PositionalParametersClass1 can be written as an attribute (markup extension)
1062 var obj = new PositionalParametersWrapper ("foo", 5);
1063 using (var xr = GetReader ("PositionalParametersWrapper.xml")) {
1064 var des = XamlServices.Load (xr);
1065 Assert.AreEqual (obj, des, "#1");
1070 public void Write_ArgumentAttributed ()
1072 //var obj = new ArgumentAttributed ("foo", "bar");
1073 using (var xr = GetReader ("ArgumentAttributed.xml")) {
1074 var des = (ArgumentAttributed) XamlServices.Load (xr);
1075 Assert.AreEqual ("foo", des.Arg1, "#1");
1076 Assert.AreEqual ("bar", des.Arg2, "#2");
1081 public void Write_ArrayExtension2 ()
1083 //var obj = new ArrayExtension (typeof (int));
1084 using (var xr = GetReader ("ArrayExtension2.xml")) {
1085 var des = XamlServices.Load (xr);
1086 // The resulting object is not ArrayExtension.
1087 Assert.AreEqual (new int [0], des, "#1");
1092 public void Write_ArrayList ()
1094 var obj = new ArrayList (new int [] {5, -3, 0});
1095 using (var xr = GetReader ("ArrayList.xml")) {
1096 var des = XamlServices.Load (xr);
1097 Assert.AreEqual (obj, des, "#1");
1102 [Ignore ("Needs to get successfully deserialized. Currently we can't")]
1103 public void ComplexPositionalParameterWrapper ()
1105 //var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
1106 using (var xr = GetReader ("ComplexPositionalParameterWrapper.xml")) {
1107 var des = (ComplexPositionalParameterWrapper) XamlServices.Load (xr);
1108 Assert.IsNotNull (des.Param, "#1");
1109 Assert.AreEqual ("foo", des.Param.Value, "#2");
1114 public void Write_ListWrapper ()
1116 var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
1117 using (var xr = GetReader ("ListWrapper.xml")) {
1118 var des = (ListWrapper) XamlServices.Load (xr);
1119 Assert.IsNotNull (des, "#1");
1120 Assert.IsNotNull (des.Items, "#2");
1121 Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
1126 public void Write_ListWrapper2 ()
1128 var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}) { Capacity = 3}); // set explicit capacity for trivial implementation difference
1129 using (var xr = GetReader ("ListWrapper2.xml")) {
1130 var des = (ListWrapper2) XamlServices.Load (xr);
1131 Assert.IsNotNull (des, "#1");
1132 Assert.IsNotNull (des.Items, "#2");
1133 Assert.AreEqual (obj.Items.ToArray (), des.Items.ToArray (), "#3");
1138 public void Write_MyArrayExtension ()
1140 //var obj = new MyArrayExtension (new int [] {5, -3, 0});
1141 using (var xr = GetReader ("MyArrayExtension.xml")) {
1142 var des = XamlServices.Load (xr);
1143 // ProvideValue() returns an array
1144 Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
1149 public void Write_MyArrayExtensionA ()
1151 //var obj = new MyArrayExtensionA (new int [] {5, -3, 0});
1152 using (var xr = GetReader ("MyArrayExtensionA.xml")) {
1153 var des = XamlServices.Load (xr);
1154 // ProvideValue() returns an array
1155 Assert.AreEqual (new int [] {5, -3, 0}, des, "#1");
1160 public void Write_MyExtension ()
1162 //var obj = new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"};
1163 using (var xr = GetReader ("MyExtension.xml")) {
1164 var des = XamlServices.Load (xr);
1165 // ProvideValue() returns this.
1166 Assert.AreEqual ("provided_value", des, "#1");
1171 [ExpectedException (typeof (InvalidCastException))] // unable to cast string to MarkupExtension
1172 [Category ("NotWorking")]
1173 public void Write_MyExtension2 ()
1175 //var obj = new MyExtension2 () { Foo = typeof (int), Bar = "v2"};
1176 using (var xr = GetReader ("MyExtension2.xml")) {
1177 XamlServices.Load (xr);
1182 public void Write_MyExtension3 ()
1184 //var obj = new MyExtension3 () { Foo = typeof (int), Bar = "v2"};
1185 using (var xr = GetReader ("MyExtension3.xml")) {
1186 var des = XamlServices.Load (xr);
1187 // StringConverter is used and the resulting value comes from ToString().
1188 Assert.AreEqual ("MonoTests.System.Xaml.MyExtension3", des, "#1");
1193 [ExpectedException (typeof (XamlObjectWriterException))] // wrong TypeConverter input (input string for DateTimeConverter invalid)
1194 public void Write_MyExtension4 ()
1196 var obj = new MyExtension4 () { Foo = typeof (int), Bar = "v2"};
1197 using (var xr = GetReader ("MyExtension4.xml")) {
1198 var des = XamlServices.Load (xr);
1199 Assert.AreEqual (obj, des, "#1");
1204 public void Write_MyExtension6 ()
1206 //var obj = new MyExtension6 ("foo");
1207 using (var xr = GetReader ("MyExtension6.xml")) {
1208 var des = XamlServices.Load (xr);
1209 // ProvideValue() returns this.
1210 Assert.AreEqual ("foo", des, "#1");
1215 public void Write_PropertyDefinition ()
1217 //var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
1218 using (var xr = GetReader ("PropertyDefinition.xml")) {
1219 var des = (PropertyDefinition) XamlServices.Load (xr);
1220 Assert.AreEqual ("protected", des.Modifier, "#1");
1221 Assert.AreEqual ("foo", des.Name, "#2");
1222 Assert.AreEqual (XamlLanguage.String, des.Type, "#3");
1227 [Ignore ("this still does not give successful deserialization result - should there be any way?")]
1228 public void Write_StaticExtensionWrapper ()
1230 //var obj = new StaticExtensionWrapper () { Param = new StaticExtension ("Foo") };
1231 using (var xr = GetReader ("StaticExtensionWrapper.xml")) {
1232 var des = (StaticExtensionWrapper) XamlServices.Load (xr);
1233 Assert.IsNotNull (des.Param, "#1");
1234 Assert.AreEqual ("Foo", des.Param.Member, "#2");
1239 [Ignore ("this still does not give successful deserialization result - should there be any way?")]
1240 public void Write_TypeExtensionWrapper ()
1242 //var obj = new TypeExtensionWrapper () { Param = new TypeExtension ("Foo") };
1243 using (var xr = GetReader ("TypeExtensionWrapper.xml")) {
1244 var des = (TypeExtensionWrapper) XamlServices.Load (xr);
1245 Assert.IsNotNull (des.Param, "#1");
1246 // TypeName was not serialized into xml, hence deserialized as empty.
1247 Assert.AreEqual (String.Empty, des.Param.TypeName, "#2");
1252 public void Write_NamedItems ()
1258 var obj = new NamedItem ("foo");
1259 var obj2 = new NamedItem ("bar");
1260 obj.References.Add (obj2);
1261 obj.References.Add (new NamedItem ("baz"));
1262 obj2.References.Add (obj);
1264 using (var xr = GetReader ("NamedItems.xml")) {
1265 var des = (NamedItem) XamlServices.Load (xr);
1266 Assert.IsNotNull (des, "#1");
1267 Assert.AreEqual (2, des.References.Count, "#2");
1268 Assert.AreEqual (typeof (NamedItem), des.References [0].GetType (), "#3");
1269 Assert.AreEqual (typeof (NamedItem), des.References [1].GetType (), "#4");
1270 Assert.AreEqual (des, des.References [0].References [0], "#5");
1275 public void Write_NamedItems2 ()
1282 var obj = new NamedItem2 ("i1");
1283 var obj2 = new NamedItem2 ("i2");
1284 var obj3 = new NamedItem2 ("i3");
1285 var obj4 = new NamedItem2 ("i4");
1286 obj.References.Add (obj2);
1287 obj.References.Add (obj4);
1288 obj2.References.Add (obj3);
1289 obj4.References.Add (obj3);
1291 using (var xr = GetReader ("NamedItems2.xml")) {
1292 var des = (NamedItem2) XamlServices.Load (xr);
1293 Assert.IsNotNull (des, "#1");
1294 Assert.AreEqual (2, des.References.Count, "#2");
1295 Assert.AreEqual (typeof (NamedItem2), des.References [0].GetType (), "#3");
1296 Assert.AreEqual (typeof (NamedItem2), des.References [1].GetType (), "#4");
1297 Assert.AreEqual (1, des.References [0].References.Count, "#5");
1298 Assert.AreEqual (1, des.References [1].References.Count, "#6");
1299 Assert.AreEqual (des.References [0].References [0], des.References [1].References [0], "#7");
1304 public void Write_XmlSerializableWrapper ()
1306 var assns = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
1307 using (var xr = GetReader ("XmlSerializableWrapper.xml")) {
1308 var des = (XmlSerializableWrapper) XamlServices.Load (xr);
1309 Assert.IsNotNull (des, "#1");
1310 Assert.IsNotNull (des.Value, "#2");
1311 Assert.AreEqual ("<root xmlns=\"" + assns + "\" />", des.Value.GetRaw (), "#3");
1316 public void Write_XmlSerializable ()
1318 using (var xr = GetReader ("XmlSerializable.xml")) {
1319 var des = (XmlSerializable) XamlServices.Load (xr);
1320 Assert.IsNotNull (des, "#1");
1325 public void Write_ListXmlSerializable ()
1327 using (var xr = GetReader ("List_XmlSerializable.xml")) {
1328 var des = (List<XmlSerializable>) XamlServices.Load (xr);
1329 Assert.AreEqual (1, des.Count, "#1");
1334 public void Write_AttachedProperty ()
1336 using (var xr = GetReader ("AttachedProperty.xml")) {
1337 AttachedWrapper des = null;
1339 des = (AttachedWrapper) XamlServices.Load (xr);
1340 Assert.IsNotNull (des.Value, "#1");
1341 Assert.AreEqual ("x", Attachable.GetFoo (des), "#2");
1342 Assert.AreEqual ("y", Attachable.GetFoo (des.Value), "#3");
1345 Attachable.SetFoo (des, null);
1346 Attachable.SetFoo (des.Value, null);
1353 public void Write_EventStore ()
1355 using (var xr = GetReader ("EventStore.xml")) {
1356 var res = (EventStore) XamlServices.Load (xr);
1357 Assert.AreEqual ("foo", res.Examine (), "#1");
1358 Assert.IsTrue (res.Method1Invoked, "#2");
1363 [ExpectedException (typeof (XamlDuplicateMemberException))] // for two occurence of Event1 ...
1364 public void Write_EventStore2 ()
1366 using (var xr = GetReader ("EventStore2.xml")) {
1367 XamlServices.Load (xr);
1372 [ExpectedException (typeof (XamlObjectWriterException))] // attaching nonexistent method
1373 public void Write_EventStore3 ()
1375 using (var xr = GetReader ("EventStore3.xml")) {
1376 XamlServices.Load (xr);
1381 [Category ("NotWorking")] // type resolution failure.
1382 public void Write_EventStore4 ()
1384 using (var xr = GetReader ("EventStore4.xml")) {
1385 var res = (EventStore2<EventArgs>) XamlServices.Load (xr);
1386 Assert.AreEqual ("foo", res.Examine (), "#1");
1387 Assert.IsTrue (res.Method1Invoked, "#2");
1392 public void Write_AbstractWrapper ()
1394 using (var xr = GetReader ("AbstractContainer.xml")) {
1395 var res = (AbstractContainer) XamlServices.Load (xr);
1396 Assert.IsNull (res.Value1, "#1");
1397 Assert.IsNotNull (res.Value2, "#2");
1398 Assert.AreEqual ("x", res.Value2.Foo, "#3");
1403 public void Write_ReadOnlyPropertyContainer ()
1405 using (var xr = GetReader ("ReadOnlyPropertyContainer.xml")) {
1406 var res = (ReadOnlyPropertyContainer) XamlServices.Load (xr);
1407 Assert.AreEqual ("x", res.Foo, "#1");
1408 Assert.AreEqual ("x", res.Bar, "#2");
1413 public void Write_TypeConverterOnListMember ()
1415 using (var xr = GetReader ("TypeConverterOnListMember.xml")) {
1416 var res = (SecondTest.TypeOtherAssembly) XamlServices.Load (xr);
1417 Assert.AreEqual (3, res.Values.Count, "#1");
1418 Assert.AreEqual (3, res.Values [2], "#2");
1423 public void Write_EnumContainer ()
1425 using (var xr = GetReader ("EnumContainer.xml")) {
1426 var res = (EnumContainer) XamlServices.Load (xr);
1427 Assert.AreEqual (EnumValueType.Two, res.EnumProperty, "#1");
1432 public void Write_CollectionContentProperty ()
1434 using (var xr = GetReader ("CollectionContentProperty.xml")) {
1435 var res = (CollectionContentProperty) XamlServices.Load (xr);
1436 Assert.AreEqual (4, res.ListOfItems.Count, "#1");
1441 public void Write_CollectionContentProperty2 ()
1443 using (var xr = GetReader ("CollectionContentProperty2.xml")) {
1444 var res = (CollectionContentProperty) XamlServices.Load (xr);
1445 Assert.AreEqual (4, res.ListOfItems.Count, "#1");
1450 public void Write_AmbientPropertyContainer ()
1452 using (var xr = GetReader ("AmbientPropertyContainer.xml")) {
1453 var res = (SecondTest.ResourcesDict) XamlServices.Load (xr);
1454 Assert.AreEqual (2, res.Count, "#1");
1455 Assert.IsTrue (res.ContainsKey ("TestDictItem"), "#2");
1456 Assert.IsTrue (res.ContainsKey ("okay"), "#3");
1457 var i1 = res ["TestDictItem"] as SecondTest.TestObject;
1458 Assert.IsNull (i1.TestProperty, "#4");
1459 var i2 = res ["okay"] as SecondTest.TestObject;
1460 Assert.AreEqual (i1, i2.TestProperty, "#5");
1464 [Test] // bug #682102
1465 public void Write_AmbientPropertyContainer2 ()
1467 using (var xr = GetReader ("AmbientPropertyContainer2.xml")) {
1468 var res = (SecondTest.ResourcesDict) XamlServices.Load (xr);
1469 Assert.AreEqual (2, res.Count, "#1");
1470 Assert.IsTrue (res.ContainsKey ("TestDictItem"), "#2");
1471 Assert.IsTrue (res.ContainsKey ("okay"), "#3");
1472 var i1 = res ["TestDictItem"] as SecondTest.TestObject;
1473 Assert.IsNull (i1.TestProperty, "#4");
1474 var i2 = res ["okay"] as SecondTest.TestObject;
1475 Assert.AreEqual (i1, i2.TestProperty, "#5");
1480 public void Write_NullableContainer ()
1482 using (var xr = GetReader ("NullableContainer.xml")) {
1483 var res = (NullableContainer) XamlServices.Load (xr);
1484 Assert.AreEqual (5, res.TestProp, "#1");
1489 public void Write_DirectListContainer ()
1491 using (var xr = GetReader ("DirectListContainer.xml")) {
1492 var res = (DirectListContainer) XamlServices.Load (xr);
1493 Assert.AreEqual (3, res.Items.Count, "#1");
1494 Assert.AreEqual ("Hello3", res.Items [2].Value, "#2");
1499 public void Write_DirectDictionaryContainer ()
1501 using (var xr = GetReader ("DirectDictionaryContainer.xml")) {
1502 var res = (DirectDictionaryContainer) XamlServices.Load (xr);
1503 Assert.AreEqual (3, res.Items.Count, "#1");
1504 Assert.AreEqual (40, res.Items [EnumValueType.Three], "#2");
1509 public void Write_DirectDictionaryContainer2 ()
1511 using (var xr = GetReader ("DirectDictionaryContainer2.xml")) {
1512 var res = (SecondTest.ResourcesDict2) XamlServices.Load (xr);
1513 Assert.AreEqual (2, res.Count, "#1");
1514 Assert.AreEqual ("1", ((SecondTest.TestObject2) res ["1"]).TestProperty, "#2");
1515 Assert.AreEqual ("two", ((SecondTest.TestObject2) res ["two"]).TestProperty, "#3");