Implement XObjectChange.Value for XAttribute
authorAlan McGovern <alan.mcgovern@gmail.com>
Fri, 20 Jul 2012 09:56:19 +0000 (10:56 +0100)
committerAlan McGovern <alan.mcgovern@gmail.com>
Fri, 20 Jul 2012 15:41:05 +0000 (16:41 +0100)
We now emit the correct Changing/Changed events when modifying the
value of an XAttribute. Added tests covering the changes.

mcs/class/System.Xml.Linq/System.Xml.Linq/XAttribute.cs
mcs/class/System.Xml.Linq/System.Xml.Linq/XObject.cs
mcs/class/System.Xml.Linq/Test/System.Xml.Linq/XAttributeTest.cs

index fc66a51336040d1b9ba01319181a5cdf357b1588..f5214b78446423852c81530d07766cd274e6cc2b 100644 (file)
@@ -301,7 +301,7 @@ namespace System.Xml.Linq
 
                public string Value {
                        get { return XUtil.ToString (value); }
-                       set { this.value = value; }
+                       set { SetValue (value); }
                }
 
                public void Remove ()
@@ -328,7 +328,10 @@ namespace System.Xml.Linq
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
+
+                       OnValueChanging (this);
                        this.value = XUtil.ToString (value);
+                       OnValueChanged (this);
                }
 
                static readonly char [] escapeChars = new char [] {'<', '>', '&', '"', '\r', '\n', '\t'};
index 6570bdf1998ff743cdfe529576ef9a4a9d4b6007..4e3d410d7f35660fe7672243cec3d46f22d71fdc 100644 (file)
@@ -172,19 +172,27 @@ namespace System.Xml.Linq
                {
                        OnChanged (addedObject, new XObjectChangeEventArgs (XObjectChange.Add));
                }
-
                
-               public void OnRemovingObject (object removedObject)
+               internal void OnRemovingObject (object removedObject)
                {
                        OnChanging (removedObject, new XObjectChangeEventArgs (XObjectChange.Remove));
                }
 
-
-               public void OnRemovedObject (object removedObject)
+               internal void OnRemovedObject (object removedObject)
                {
                        OnChanged (removedObject, new XObjectChangeEventArgs (XObjectChange.Remove));
                }
 
+               internal void OnValueChanging (object changedObject)
+               {
+                       OnChanging (changedObject, new XObjectChangeEventArgs (XObjectChange.Value));
+               }
+
+               internal void OnValueChanged (object changedObject)
+               {
+                       OnChanged (changedObject, new XObjectChangeEventArgs (XObjectChange.Value));
+               }
+
                
                void OnChanging (object sender, XObjectChangeEventArgs args)
                {
index 5e81c3c25701140716097f05c6bde9f99c9ebc25..afdc2b6a2b8ee5f82931eeb2bdc647d2476dc255 100644 (file)
@@ -98,6 +98,87 @@ namespace MonoTests.System.Xml.Linq
                        Assert.AreEqual ("<?xml version=\"1.0\"?>", a.Value, "#1");
                }
 
+               [Test]
+               public void SetValue_Null()
+               {
+                       var a = new XAttribute("foo", "bar");
+                       AssertThrows<ArgumentNullException>(() => a.Value = null, "#1");
+                       AssertThrows<ArgumentNullException>(() => a.SetValue (null), "#2");
+               }
+
+               [Test]
+               public void SetValue_ChangeTriggers()
+               {
+                       bool changing = false;
+                       bool changed = false;
+
+                       var a = new XAttribute("foo", "bar");
+                       a.Changing += (o, e) => {
+                               Assert.IsFalse(changing, "#1");
+                               Assert.IsFalse(changed, "#2");
+                               Assert.AreSame(a, o, "#3");
+                               Assert.AreEqual(XObjectChange.Value, e.ObjectChange, "#4");
+                               changing = true;
+                       };
+                       a.Changed += (o, e) => {
+                               Assert.IsTrue(changing, "#5");
+                               Assert.IsFalse(changed, "#6");
+                               Assert.AreSame(a, o, "#7");
+                               Assert.AreEqual(XObjectChange.Value, e.ObjectChange, "#8");
+                               changed = true;
+                       };
+                       a.Value = "foo";
+                       Assert.IsTrue(changing, "changing");
+                       Assert.IsTrue(changed, "changed");
+               }
+
+               [Test]
+               public void SetValue2_ChangeTriggers()
+               {
+                       bool changing = false;
+                       bool changed = false;
+                       
+                       var a = new XAttribute("foo", "bar");
+                       a.Changing += (o, e) =>
+                       {
+                               Assert.IsFalse(changing, "#1");
+                               Assert.IsFalse(changed, "#2");
+                               Assert.AreSame(a, o, "#3");
+                               Assert.AreEqual(XObjectChange.Value, e.ObjectChange, "#4");
+                               changing = true;
+                       };
+                       a.Changed += (o, e) =>
+                       {
+                               Assert.IsTrue(changing, "#5");
+                               Assert.IsFalse(changed, "#6");
+                               Assert.AreSame(a, o, "#7");
+                               Assert.AreEqual(XObjectChange.Value, e.ObjectChange, "#8");
+                               changed = true;
+                       };
+                       a.SetValue("zap");
+                       Assert.IsTrue(changing, "changing");
+                       Assert.IsTrue(changed, "changed");
+               }
+
+               [Test]
+               public void SetValue_SameValue_ChangeTrigger()
+               {
+                       int changed = 0;
+                       int changing = 0;
+
+                       var a = new XAttribute("foo", "bar");
+                       a.Changed += (o, e) => changed++;
+                       a.Changing += (o, e) => changing++;
+
+                       a.SetValue("bar");
+                       Assert.AreEqual(1, changed, "#1");
+                       Assert.AreEqual(1, changing, "#2");
+
+                       a.Value = "bar";
+                       Assert.AreEqual(2, changed, "#3");
+                       Assert.AreEqual(2, changing, "#4");
+               }
+
                [Test]
                public void ToString ()
                {