XamlXmlReader didn't update current_member after EndMember and kept old one.
authorAtsushi Eno <atsushi@ximian.com>
Mon, 28 Mar 2011 07:05:17 +0000 (16:05 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Mon, 28 Mar 2011 07:05:17 +0000 (16:05 +0900)
Fixed bug #682933.

mcs/class/System.Xaml/System.Xaml/XamlXmlReader.cs
mcs/class/System.Xaml/Test/System.Xaml/TestedTypes.cs
mcs/class/System.Xaml/Test/System.Xaml/XamlObjectWriterTest.cs
mcs/class/System.Xaml/Test/System.Xaml/XamlReaderTestBase.cs
mcs/class/System.Xaml/Test/System.Xaml/XamlXmlReaderTest.cs
mcs/class/System.Xaml/Test/XmlFiles/DirectDictionaryContainer2.xml [new file with mode: 0644]

index 9627045d286d89b4f88a45905cffc26628e51261..ae133d01f05d83f18439527534c2ada9ef312270 100644 (file)
@@ -199,6 +199,9 @@ namespace System.Xaml
                        if (is_eof)
                                return false;
 
+                       if (node_type == XamlNodeType.EndMember && members.Count > 0)
+                               current_member = members.Peek (); // set parent member _after_ EndMember.
+
                        // check this before is_empty_* so that they aren't ignored.
                        if (MoveToNextStoredMember ())
                                return true;
index 1da0f29ab0411d9dd6981b5688b094311c2a053c..72aca046e305a2a7d5e8848813c411a1db6e1a30 100755 (executable)
@@ -1035,6 +1035,15 @@ namespace SecondTest
        }
 
        #endregion
+
+       public class ResourcesDict2 : Dictionary<object, object>
+       {
+       }
+
+       public class TestObject2
+       {
+               public string TestProperty { get; set; }
+       }
 }
 
 
index 17ca8c8aff924b6d1b857e61fba4ea6ae832d557..d1138c7286c7c7d797342cc4f17febca518e4fd7 100755 (executable)
@@ -1381,5 +1381,16 @@ namespace MonoTests.System.Xaml
                                Assert.AreEqual (40, res.Items [EnumValueType.Three], "#2");
                        }
                }
+
+               [Test]
+               public void Write_DirectDictionaryContainer2 ()
+               {
+                       using (var xr = GetReader ("DirectDictionaryContainer2.xml")) {
+                               var res = (SecondTest.ResourcesDict2) XamlServices.Load (xr);
+                               Assert.AreEqual (2, res.Count, "#1");
+                               Assert.AreEqual ("1", ((SecondTest.TestObject2) res ["1"]).TestProperty, "#2");
+                               Assert.AreEqual ("two", ((SecondTest.TestObject2) res ["two"]).TestProperty, "#3");
+                       }
+               }
        }
 }
index bf865dcc9eeb66ada41027f7bb14c948fac63044..bdc81f0038f76b7c680fb85261d555036d6a8dca 100644 (file)
@@ -2998,6 +2998,76 @@ namespace MonoTests.System.Xaml
 
                        Assert.IsFalse (r.Read (), "end");
                }
+
+               protected void Read_DirectDictionaryContainer2 (XamlReader r)
+               {
+                       ReadNamespace (r, String.Empty, "http://www.domain.com/path", "ns#1");
+                       ReadNamespace (r, "x", XamlLanguage.Xaml2006Namespace, "ns#2");
+
+                       // t:DirectDictionaryContainer
+                       Assert.IsTrue (r.Read (), "so#1-1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
+                       var xt = new XamlType (typeof (SecondTest.ResourcesDict2), r.SchemaContext);
+                       Assert.AreEqual (xt, r.Type, "so#1-3");
+
+                       if (r is XamlXmlReader)
+                               ReadBase (r);
+
+                       // m:Items
+                       Assert.IsTrue (r.Read (), "sm1#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm1#2");
+                       Assert.AreEqual (XamlLanguage.Items, r.Member, "sm1#3");
+
+                       xt = r.SchemaContext.GetXamlType (typeof (SecondTest.TestObject2));
+                       for (int i = 0; i < 2; i++) {
+                               // t:TestObject
+                               Assert.IsTrue (r.Read (), "so#x-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#x-2." + i);
+                               Assert.AreEqual (xt, r.Type, "so#x-3." + i);
+
+                               // m:Key
+                               Assert.IsTrue (r.Read (), "sm#y1");
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#y2");
+                               Assert.AreEqual (XamlLanguage.Key, r.Member, "sm#y3");
+
+                               // value
+                               Assert.IsTrue (r.Read (), "v#y-1");
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#y-2");
+                               Assert.AreEqual (i == 0 ? "1" : "two", r.Value, "v#y-3");
+
+                               // /m:Key
+                               Assert.IsTrue (r.Read (), "em#y-1");
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#y-2");
+
+                               // m:TestProperty
+                               Assert.IsTrue (r.Read (), "sm#x1");
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#x2");
+                               Assert.AreEqual (xt.GetMember ("TestProperty"), r.Member, "sm#x3");
+
+                               // x:Value
+                               Assert.IsTrue (r.Read (), "v#x-1");
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#x-2");
+                               Assert.AreEqual (i == 0 ? "1" : "two", r.Value, "v#x-3");
+
+                               // /m:TestProperty
+                               Assert.IsTrue (r.Read (), "em#x-1");
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#x-2");
+
+                               // /t:TestObject
+                               Assert.IsTrue (r.Read (), "eo#x-1");
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#x-2");
+                       }
+
+                       // /m:Items
+                       Assert.IsTrue (r.Read (), "em#1-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#1-2");
+
+                       // /t:DirectDictionaryContainer
+                       Assert.IsTrue (r.Read (), "eo#1-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
                
                protected void Read_AttachedProperty (XamlReader r)
                {
index bbb3c02ce519e41d28940dd6ce1500ecdcd8544b..4922aba97f4e4149f570aa21d1a7f57885852f19 100755 (executable)
@@ -701,6 +701,14 @@ namespace MonoTests.System.Xaml
                        Read_DirectDictionaryContainer (r);
                }
 
+               // It is not really a common test; it just makes use of base helper methods.
+               [Test]
+               public void Read_DirectDictionaryContainer2 ()
+               {
+                       var r = GetReader ("DirectDictionaryContainer2.xml");
+                       Read_DirectDictionaryContainer2 (r);
+               }
+
                #region non-common tests
                [Test]
                public void Bug680385 ()
diff --git a/mcs/class/System.Xaml/Test/XmlFiles/DirectDictionaryContainer2.xml b/mcs/class/System.Xaml/Test/XmlFiles/DirectDictionaryContainer2.xml
new file mode 100644 (file)
index 0000000..2c2f3b9
--- /dev/null
@@ -0,0 +1,6 @@
+<ResourcesDict2 xmlns="http://www.domain.com/path"
+                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+        <TestObject2 x:Key="1" TestProperty="1" />
+        <TestObject2 x:Key="two" TestProperty="two" />
+</ResourcesDict2>
+