* Container.cs: Avoid NRE in Remove and RemoveWithoutUnsiting.
authorGert Driesen <drieseng@users.sourceforge.net>
Sat, 18 Jul 2009 09:56:51 +0000 (09:56 -0000)
committerGert Driesen <drieseng@users.sourceforge.net>
Sat, 18 Jul 2009 09:56:51 +0000 (09:56 -0000)
* ContainerTest.cs: Added tests for Remove and RemoveWithoutUnsiting.

svn path=/trunk/mcs/; revision=138175

mcs/class/System/System.ComponentModel/ChangeLog
mcs/class/System/System.ComponentModel/Container.cs
mcs/class/System/Test/System.ComponentModel/ChangeLog
mcs/class/System/Test/System.ComponentModel/ContainerTest.cs

index 2765e0d538b32042cd8739d994d98ab9c7a6ffea..c89952f2c14030deecad14924819dad88a103203 100644 (file)
@@ -1,3 +1,7 @@
+2009-07-19  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * Container.cs: Avoid NRE in Remove and RemoveWithoutUnsiting.
+
 2009-07-18  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * Container.cs: Changed Dispose(bool) behaviour to match .NET, based
index fb1295b03c7375055b462ecb8ae448f91470b600..d6dd9682d21660359e79661b12cea560f7fd529d 100644 (file)
@@ -61,9 +61,9 @@ namespace System.ComponentModel {
                
                class DefaultSite : ISite {
 
-                       private IComponent component;
-                       private Container container;
-                       private string     name;
+                       private readonly IComponent component;
+                       private readonly Container container;
+                       private string name;
                        
                        public DefaultSite (string name, IComponent component, Container container)
                        {
@@ -108,13 +108,6 @@ namespace System.ComponentModel {
                                return container.GetService (t);
                        }
                }
-               
-               // <summary>
-               //   Container constructor
-               // </summary>
-               public Container ()
-               {
-               }
 
                public virtual ComponentCollection Components {
                        get {
@@ -187,36 +180,33 @@ namespace System.ComponentModel {
 
                protected virtual object GetService (Type service)
                {
-                       if (typeof(IContainer) != service) {
-                               return null; 
-                       }
+                       if (typeof(IContainer) != service)
+                               return null;
                        return this;
                }
 
                public virtual void Remove (IComponent component)
                {
-                       Remove (component, true);               
+                       Remove (component, true);
                }
 
-               private void Remove (IComponent component, bool unsite)
+               void Remove (IComponent component, bool unsite)
                {
-                       if (component.Site != null && component.Site.Container == this) {
-                               if (unsite) {
-                                       component.Site = null;
+                       if (component != null) {
+                               if (component.Site != null && component.Site.Container == this) {
+                                       if (unsite)
+                                               component.Site = null;
+                                       c.Remove (component);
                                }
-                               c.Remove (component);
-                       }                                       
+                       }
                }
 
 #if NET_2_0
                protected void RemoveWithoutUnsiting (IComponent component)
                {
-                       if (component.Site != null && component.Site.Container == this) {
-                               Remove (component, false);
-                       }
+                       Remove (component, false);
                }
 #endif
-               
        }
        
 }
index b6a2aa7fb87b71e26eeaeca3e926ae29c35f8531..2be3219b973b281875c825fd0b9dbc53b597876b 100644 (file)
@@ -1,3 +1,7 @@
+2009-07-18  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * ContainerTest.cs: Added tests for Remove and RemoveWithoutUnsiting.
+
 2009-07-18  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * ContainerTest.cs: Added tests for Add, Dispose, ValidateName and
index 28f3045a17a1ef1f5867a954c8468678e0e24509..589f27ddcd62e172b131ead02fc29f5498685c43 100644 (file)
@@ -39,7 +39,7 @@ namespace MonoTests.System.ComponentModel
                }
 
 #if NET_2_0
-               public void Remove_WithoutUnsiting (IComponent component)
+               public new void RemoveWithoutUnsiting (IComponent component)
                {
                        base.RemoveWithoutUnsiting (component);
                }
@@ -375,13 +375,6 @@ namespace MonoTests.System.ComponentModel
                        _container.Remove (component);
                        Assert.IsNull (component.Site, "#3");
                        Assert.IsFalse (_container.Contains (component), "#4");
-
-#if NET_2_0
-                       _container.Add (component);
-                       _container.Remove_WithoutUnsiting (component);
-                       Assert.IsNotNull (component.Site, "#5");
-                       Assert.IsFalse (_container.Contains (component), "#6");
-#endif
                }
 
                [Test] // Dispose ()
@@ -511,7 +504,114 @@ namespace MonoTests.System.ComponentModel
                        Assert.IsNull (service, "#4");
                }
 
+               [Test]
+               public void Remove ()
+               {
+                       TestComponent compA;
+                       TestComponent compB;
+                       ISite siteA;
+                       ISite siteB;
+
+                       compA = new TestComponent ();
+                       _container.Add (compA);
+                       siteA = compA.Site;
+                       compB = new TestComponent ();
+                       _container.Add (compB);
+                       siteB = compB.Site;
+                       _container.Remove (compB);
+                       Assert.AreSame (siteA, compA.Site, "#A1");
+                       Assert.IsNull (compB.Site, "#A2");
+                       Assert.AreEqual (1, _container.Components.Count, "#A3");
+                       Assert.AreSame (compA, _container.Components [0], "#A4");
+
+                       // remove component with no site
+                       compB = new TestComponent ();
+                       _container.Remove (compB);
+                       Assert.AreSame (siteA, compA.Site, "#B1");
+                       Assert.IsNull (compB.Site, "#B2");
+                       Assert.AreEqual (1, _container.Components.Count, "#B3");
+                       Assert.AreSame (compA, _container.Components [0], "#B4");
+
+                       // remove component associated with other container
+                       TestContainer container2 = new TestContainer ();
+                       compB = new TestComponent ();
+                       container2.Add (compB);
+                       siteB = compB.Site;
+                       _container.Remove (compB);
+                       Assert.AreSame (siteA, compA.Site, "#C1");
+                       Assert.AreSame (siteB, compB.Site, "#C2");
+                       Assert.AreEqual (1, _container.Components.Count, "#C3");
+                       Assert.AreSame (compA, _container.Components [0], "#C4");
+                       Assert.AreEqual (1, container2.Components.Count, "#C5");
+                       Assert.AreSame (compB, container2.Components [0], "#C6");
+               }
+
+               [Test]
+               public void Remove_Component_Null ()
+               {
+                       _container.Add (new TestComponent ());
+                       _container.Remove ((IComponent) null);
+                       Assert.AreEqual (1, _container.Components.Count);
+               }
+
 #if NET_2_0
+               [Test]
+               public void RemoveWithoutUnsiting ()
+               {
+                       TestComponent compA;
+                       TestComponent compB;
+                       ISite siteA;
+                       ISite siteB;
+
+                       compA = new TestComponent ();
+                       _container.Add (compA);
+                       siteA = compA.Site;
+                       compB = new TestComponent ();
+                       _container.Add (compB);
+                       siteB = compB.Site;
+                       _container.RemoveWithoutUnsiting (compB);
+                       Assert.AreSame (siteA, compA.Site, "#A1");
+                       Assert.AreSame (siteB, compB.Site, "#A2");
+                       Assert.AreEqual (1, _container.Components.Count, "#A3");
+                       Assert.AreSame (compA, _container.Components [0], "#A4");
+
+                       // remove component with no site
+                       compB = new TestComponent ();
+                       _container.RemoveWithoutUnsiting (compB);
+                       Assert.AreSame (siteA, compA.Site, "#B1");
+                       Assert.IsNull (compB.Site, "#B2");
+                       Assert.AreEqual (1, _container.Components.Count, "#B3");
+                       Assert.AreSame (compA, _container.Components [0], "#B4");
+
+                       // remove component associated with other container
+                       TestContainer container2 = new TestContainer ();
+                       compB = new TestComponent ();
+                       container2.Add (compB);
+                       siteB = compB.Site;
+                       _container.RemoveWithoutUnsiting (compB);
+                       Assert.AreSame (siteA, compA.Site, "#C1");
+                       Assert.AreSame (siteB, compB.Site, "#C2");
+                       Assert.AreEqual (1, _container.Components.Count, "#C3");
+                       Assert.AreSame (compA, _container.Components [0], "#C4");
+                       Assert.AreEqual (1, container2.Components.Count, "#C5");
+                       Assert.AreSame (compB, container2.Components [0], "#C6");
+               }
+
+               [Test]
+               public void RemoveWithoutUnsiting_Component_Null ()
+               {
+                       ISite site;
+                       TestComponent component;
+
+                       component = new TestComponent ();
+                       _container.Add (component);
+                       site = component.Site;
+                       _container.RemoveWithoutUnsiting ((IComponent) null);
+                       Assert.AreSame (site, component.Site, "#1");
+                       Assert.AreEqual (1, _container.Components.Count, "#2");
+                       Assert.AreSame (component, _container.Components [0], "#3");
+               }
+
                [Test]
                public void ValidateName_Component_Null ()
                {