Merge pull request #835 from HorstKakuschke/master
[mono.git] / mcs / class / System / Test / System.ComponentModel / ContainerTest.cs
index 28f3045a17a1ef1f5867a954c8468678e0e24509..16a6a4124dccb83b45d44b3d889503340b92f153 100644 (file)
@@ -9,6 +9,8 @@
 // Copyright (c) 2006 Ivan N. Zlatev
 //
 
+#if !MOBILE
+
 using NUnit.Framework;
 using System;
 using System.ComponentModel;
@@ -39,7 +41,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 +377,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 ()
@@ -494,6 +489,15 @@ namespace MonoTests.System.ComponentModel
                        Assert.IsNull (compB.Site, "#D5");
                }
 
+               [Test] // bug #522474
+               public void Dispose_Recursive ()
+               {
+                       MyComponent comp = new MyComponent ();
+                       Container container = comp.CreateContainer ();
+                       comp.Dispose ();
+                       Assert.AreEqual (0, container.Components.Count);
+               }
+
                [Test]
                public void GetService ()
                {
@@ -511,7 +515,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 ()
                {
@@ -604,6 +715,28 @@ namespace MonoTests.System.ComponentModel
 
                class MyComponent : Component
                {
+                       private Container container;
+
+                       protected override void Dispose (bool disposing)
+                       {
+                               if (container != null)
+                                       container.Dispose ();
+                               base.Dispose (disposing);
+                       }
+
+                       public Container CreateContainer ()
+                       {
+                               if (container != null)
+                                       throw new InvalidOperationException ();
+                               container = new Container ();
+                               container.Add (new MyComponent ());
+                               container.Add (this);
+                               return container;
+                       }
+
+                       public Container Container {
+                               get { return container; }
+                       }
                }
 
                class MyContainer : IContainer
@@ -641,3 +774,5 @@ namespace MonoTests.System.ComponentModel
                }
        }
 }
+
+#endif