Add test for bug 686486.
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / FormTest.cs
index a504ed1186e1070f9c440a81b1cd32194728b625..7b446fea570a4bfd9e536c97e57926c483c151b5 100644 (file)
@@ -21,7 +21,7 @@ using CategoryAttribute = NUnit.Framework.CategoryAttribute;
 namespace MonoTests.System.Windows.Forms
 {
        [TestFixture]
-       public class FormTest
+       public class FormTest : TestHelper
        {
                [Test]
                public void AcceptButton ()
@@ -656,14 +656,14 @@ namespace MonoTests.System.Windows.Forms
                                f.ShowDialog ();
 
                                Assert.AreEqual ("VisibleChanged", f.Reason, "#B0");
-                               Assert.AreEqual (1, log.CountEvents ("Closing"), "#B1");
 #if NET_2_0
+                               Assert.AreEqual (1, log.CountEvents ("Closing"), "#B1");
                                Assert.AreEqual (1, log.CountEvents ("FormClosing"), "#B2");
 #endif
                                Assert.AreEqual (1, log.CountEvents ("HandleDestroyed"), "#B3");
 
-                               Assert.AreEqual (1, log.CountEvents ("Closed"), "#B4");
 #if NET_2_0
+                               Assert.AreEqual (1, log.CountEvents ("Closed"), "#B4");
                                Assert.AreEqual (1, log.CountEvents ("FormClosed"), "#B5");
 #endif
                                Assert.AreEqual (0, log.CountEvents ("Disposed"), "#B6");
@@ -1143,6 +1143,21 @@ namespace MonoTests.System.Windows.Forms
                        }
                }
                
+               [Test]
+               public void UnparentForm ()
+               {
+                       Form f1 = new Form ();
+                       f1.Show ();
+
+                       Form f2 = new Form ();
+                       f2.TopLevel = false;
+                       f2.Parent = f1;
+                       Assert.AreSame (f1, f2.Parent, "#1");
+                       f2.Show ();
+                       f2.Parent = null;
+                       Assert.IsNull (f2.Parent, "#2");
+               }
+
                [Test] // bug #80791
                public void ClientSizeTest ()
                {
@@ -1998,19 +2013,22 @@ namespace MonoTests.System.Windows.Forms
                        Assert.IsFalse (myform.IsDisposed, "A2");
 
                        myform.Close ();
-
-                       Assert.IsFalse (myform.Visible, "A3");
-                       Assert.IsFalse (myform.IsDisposed, "A4");
+#if NET_2_0
+                       Assert.IsTrue (myform.IsDisposed, "A3");
+#else
+                       Assert.IsFalse (myform.Visible, "A4");
+                       Assert.IsFalse (myform.IsDisposed, "A5");
 
                        myform.Show ();
 
-                       Assert.IsTrue (myform.Visible, "A5");
-                       Assert.IsFalse (myform.IsDisposed, "A6");
+                       Assert.IsTrue (myform.Visible, "A6");
+                       Assert.IsFalse (myform.IsDisposed, "A7");
 
                        myform.Close ();
 
-                       Assert.IsFalse (myform.Visible, "A7");
-                       Assert.IsTrue (myform.IsDisposed, "A8");
+                       Assert.IsFalse (myform.Visible, "A8");
+                       Assert.IsTrue (myform.IsDisposed, "A9");
+#endif
                }
 
                [Test]
@@ -2023,11 +2041,13 @@ namespace MonoTests.System.Windows.Forms
                        Assert.IsFalse (f.Visible, "A1");
                        f.Close ();
                        Assert.AreEqual (0, f.close_count, "A2");
-
-
+#if NET_2_0
+                       Assert.IsTrue (f.IsDisposed, "A3");
+#else
                        f.Show ();
                        f.Close ();
-                       Assert.AreEqual (1, f.close_count, "A3");
+                       Assert.AreEqual (1, f.close_count, "A4");
+#endif
                }
 
                class WMCloseWatcher : Form {
@@ -2066,9 +2086,9 @@ namespace MonoTests.System.Windows.Forms
                [Test]
                public void OnActivateEventHandlingTest1 ()
                {
-                       if (TestHelper.RunningOnUnix) {
-                               Assert.Ignore ("Relies on form.Show() synchronously generating WM_ACTIVATE");
-                       }
+//                     if (TestHelper.RunningOnUnix) {
+//                             Assert.Ignore ("Relies on form.Show() synchronously generating WM_ACTIVATE");
+//                     }
 
                        SwallowOnActivated f = new SwallowOnActivated ();
 
@@ -2288,6 +2308,39 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreEqual (new Size (292, 266), f.ClientSize, "A4");
                }
 #endif
+
+               [Test]  // bug #438866
+               public void MinMaxSize ()
+               {
+                       Form f = new Form ();
+                       
+                       f.MinimumSize = new Size (200, 200);
+                       f.MaximumSize = new Size (150, 150);
+
+                       Assert.AreEqual (new Size (150, 150), f.MinimumSize, "A1");
+                       Assert.AreEqual (new Size (150, 150), f.MaximumSize, "A2");
+                       
+                       f.MinimumSize = new Size (200, 200);
+
+                       Assert.AreEqual (new Size (200, 200), f.MinimumSize, "A3");
+                       Assert.AreEqual (new Size (200, 200), f.MaximumSize, "A4");
+                       
+                       f.Dispose ();
+               }
+
+               [Test]
+               public void MinSizeIssue ()
+               {
+                       Form f = new Form ();
+
+                       f.MinimumSize = new Size (100, 100);
+
+                       f.Show ();
+
+                       Assert.AreEqual (new Size (300, 300), f.Size, "A1");
+
+                       f.Dispose ();
+               }
                
                [Test]  // Bug #81582
                [Category ("NotWorking")]
@@ -2323,9 +2376,9 @@ namespace MonoTests.System.Windows.Forms
                [Test] // bug #339641
                public void ChildFocused ()
                {
-                       if (TestHelper.RunningOnUnix) {
-                               Assert.Ignore ("Relies on form.Show() synchronously generating WM_ACTIVATE");
-                       }
+//                     if (TestHelper.RunningOnUnix) {
+//                             Assert.Ignore ("Relies on form.Show() synchronously generating WM_ACTIVATE");
+//                     }
                        using (Form f = new TimeBombedForm ()) {
                                TreeView tv = new TreeView ();
                                EventLogger log = new EventLogger (tv);
@@ -2391,7 +2444,37 @@ namespace MonoTests.System.Windows.Forms
                {
                        ((Form)sender).Visible = false;
                }
-               
+
+               [Test]
+               public void Bug686486 ()
+               {
+                       using (Form f = new Bug686486Form ())
+                       {
+                               try
+                               {
+                                       f.ShowDialog ();
+                               }
+                               catch (StackOverflowException)
+                               {
+                                       Assert.Fail ("Setting DialogResult in FormClosing Event causes endless loop: StackOverflowException");
+                               }
+                       }
+               }
+
+               private class Bug686486Form : Form
+               {
+                       public Bug686486Form ()
+                       {
+                               this.FormClosing += SetDialogResultOK;
+                               this.Load += SetDialogResultOK;
+                       }
+
+                       private void SetDialogResultOK (object sender, EventArgs e)
+                       {
+                               this.DialogResult = DialogResult.OK;
+                       }
+               }
+
 #if NET_2_0
                [Test]
                public void AutoSizeGrowOnly ()
@@ -2736,7 +2819,157 @@ namespace MonoTests.System.Windows.Forms
                {
                        return new Size ((int)Math.Round (sizef.Width), (int)Math.Round (sizef.Height));
                }
+               
+               [Test] // Bug 354669
+               public void AutoScaleDetails ()
+               {
+                       ProtectedForm f = new ProtectedForm ();
+                       f.Show ();
+                       
+                       f.SuspendLayout ();
+                       
+                       // First AutoScaleMode shouldn't reset AutoScaleDimensions
+                       f.AutoScaleDimensions = new SizeF (3F, 3F);
+                       f.AutoScaleMode = AutoScaleMode.Font;
+                       Assert.AreEqual (new SizeF (3F, 3F), f.AutoScaleDimensions, "A1");
+                       
+                       // Subsequent calls will reset it to 0, 0
+                       f.AutoScaleMode = AutoScaleMode.Dpi;
+                       Assert.AreEqual (SizeF.Empty, f.AutoScaleDimensions, "A2");
+
+                       f.ResumeLayout ();
+                       
+                       // CurrentAutoScaleDimensions should be nonzero
+                       Assert.IsFalse (f.CurrentAutoScaleDimensions == SizeF.Empty, "A3");
+                       
+                       // AutoScaleDimensions and CurrentAutoScaleDimensions should match after ResumeLayout
+                       Assert.AreEqual (f.AutoScaleDimensions, f.CurrentAutoScaleDimensions, "A4");
+
+                       // CurrentAutoScaleDimensions should match AutoScaleDimensions for AutoScaleMode.None
+                       f.SuspendLayout ();
+                       f.AutoScaleMode = AutoScaleMode.None;
+                       f.AutoScaleDimensions = new SizeF (5F, 5F);
+
+                       Assert.AreEqual (new SizeF (5F, 5F), f.AutoScaleDimensions, "A5");
+                       Assert.AreEqual (f.AutoScaleDimensions, f.CurrentAutoScaleDimensions, "A6");
+
+                       // ResumeLayout changes nothing
+                       f.ResumeLayout ();
+
+                       Assert.AreEqual (new SizeF (5F, 5F), f.AutoScaleDimensions, "A7");
+                       Assert.AreEqual (f.AutoScaleDimensions, f.CurrentAutoScaleDimensions, "A8");
+
+                       // AutoScaleFactor should be ~2,2 if PerformAutoScale hasn't run
+                       f.ClientSize = new Size (150, 150);
+                       f.SuspendLayout ();
+                       f.AutoScaleMode = AutoScaleMode.Dpi;
+                       f.AutoScaleDimensions = new SizeF (f.CurrentAutoScaleDimensions.Width / 2F, f.CurrentAutoScaleDimensions.Height / 2F);
+                       f.ClientSize = new Size (200, 200);
+
+                       Assert.AreEqual (new Size (2, 2), RoundSizeF (f.GetPublicAutoScaleFactor ()), "A9");
+
+                       // AutoScaleFactor should be 1 after ResumeLayout
+                       f.ResumeLayout ();
+
+                       Assert.AreEqual (new SizeF (1F, 1F), f.GetPublicAutoScaleFactor (), "A10");
+                       Assert.AreEqual (new Size (400, 400), f.ClientSize, "A11");
+                       
+                       // PerformAutoScale happens immediately when layout not suspended
+                       f.ClientSize = new Size (125, 125);
+                       f.AutoScaleDimensions = new SizeF (f.CurrentAutoScaleDimensions.Width / 2F, f.CurrentAutoScaleDimensions.Height / 2F);
+                       Assert.AreEqual (new Size (250, 250), f.ClientSize, "A12");
+                       
+                       f.Dispose ();
+               }
+               
+               private class ProtectedForm : Form
+               {
+                       public SizeF GetPublicAutoScaleFactor ()
+                       {
+                               return AutoScaleFactor;
+                       }
+               }
+               
+               [Test] // Bug #355703
+               public void AutoScaleSticks ()
+               {
+                       Form f = new Form ();
+
+                       f.AutoScale = false;
+                       Assert.AreEqual (false, f.AutoScale, "A1");
+
+                       f.AutoScale = true;
+                       Assert.AreEqual (true, f.AutoScale, "A2");
+                       
+                       f.AutoScaleMode = AutoScaleMode.None;
+                       Assert.AreEqual (false, f.AutoScale, "A3");
+               }
+#endif
+
+               [Test] // Bug #359098
+               public void AutoScaleBounds ()
+               {
+                       AutoScaleForm a = new AutoScaleForm (false);
+                       a.Show ();
+                       Assert.AreEqual (new Size (213, 121), a.ClientSize, "A0");
+                       Assert.AreEqual (new Rectangle (  5, 107, 132,  9), new Rectangle (a.hScrollBar1.Location, a.hScrollBar1.Size), "A1");
+                       Assert.AreEqual (new Rectangle (151,  74,  60, 44), new Rectangle (a.treeView1.Location, a.treeView1.Size), "A2");
+                       Assert.AreEqual (new Rectangle (197,  21,   9, 39), new Rectangle (a.vScrollBar1.Location, a.vScrollBar1.Size), "A3");
+                       Assert.AreEqual (new Rectangle (139,  21,  54, 49), new Rectangle (a.listView1.Location, a.listView1.Size), "A4");
+                       Assert.AreEqual (new Rectangle ( 70,   5,  65, 37), new Rectangle (a.textBox2.Location, a.textBox2.Size), "A5");
+                       Assert.AreEqual (new Rectangle (139,   5,  70,  0), new Rectangle (a.comboBox1.Location, new Size (a.comboBox1.Width, 0)), "A6");
+                       Assert.AreEqual (new Rectangle (  5,  77,  43, 13), new Rectangle (a.button2.Location, a.button2.Size), "A7");
+                       Assert.AreEqual (new Rectangle ( 70,  44,  65, 37), new Rectangle (a.richTextBox1.Location, a.richTextBox1.Size), "A8");
+                       Assert.AreEqual (new Rectangle ( 53,  86,  21,  7), new Rectangle (a.label1.Location,a.label1.Size), "A9");
+                       Assert.AreEqual (new Rectangle ( 65,  84,  58,  0), new Rectangle (a.textBox1.Location, new Size (a.textBox1.Width, 0)), "A10");
+                       Assert.AreEqual (new Rectangle (  5,  63,  43, 13), new Rectangle (a.button1.Location, a.button1.Size), "A11");
+                       Assert.AreEqual (new Rectangle (  5,   5,  60, 47), new Rectangle (a.listBox1.Location, a.listBox1.Size), "A12");
+                       a.Dispose ();
+
+#if NET_2_0
+                       a = new AutoScaleForm (true);
+                       a.Show ();
+                       Assert.AreEqual (new Size (184, 104), a.ClientSize, "B0");
+                       Assert.AreEqual (new Rectangle (  4, 92, 114, 16), new Rectangle (a.hScrollBar1.Location, a.hScrollBar1.ClientSize), "B1");
+                       Assert.AreEqual (new Rectangle (130, 64,  50, 36), new Rectangle (a.treeView1.Location, a.treeView1.ClientSize), "B2");
+                       Assert.AreEqual (new Rectangle (170, 18,  16, 34), new Rectangle (a.vScrollBar1.Location, a.vScrollBar1.ClientSize), "B3");
+                       Assert.AreEqual (new Rectangle (120, 18,  44, 40), new Rectangle (a.listView1.Location, a.listView1.ClientSize), "B4");
+                       Assert.AreEqual (new Rectangle ( 60,  4,  54, 30), new Rectangle (a.textBox2.Location, a.textBox2.ClientSize), "B5");
+                       Assert.AreEqual (new Rectangle (120,  4,  62,  0), new Rectangle (a.comboBox1.Location, new Size (a.comboBox1.ClientSize.Width, 0)), "B6");
+                       Assert.AreEqual (new Rectangle (  4, 66,  38, 12), new Rectangle (a.button2.Location, a.button2.ClientSize), "B7");
+                       Assert.AreEqual (new Rectangle ( 60, 38,  54, 30), new Rectangle (a.richTextBox1.Location, a.richTextBox1.ClientSize), "B8");
+                       Assert.AreEqual (new Rectangle ( 46, 74,  18,  6), new Rectangle (a.label1.Location,a.label1.ClientSize), "B9");
+                       Assert.AreEqual (new Rectangle ( 56, 72,  48,  0), new Rectangle (a.textBox1.Location, new Size (a.textBox1.ClientSize.Width, 0)), "B10");
+                       Assert.AreEqual (new Rectangle (  4, 54,  38, 12), new Rectangle (a.button1.Location, a.button1.ClientSize), "B11");
+                       Assert.AreEqual (new Rectangle (  4,  4,  50, 39), new Rectangle (a.listBox1.Location, a.listBox1.ClientSize), "B12");
+                       a.Dispose ();
 #endif
+               }
+
+               [Test]
+               public void SettingIconToNull ()
+               {
+                       Form form = new Form ();
+                       Assert.IsNotNull (form.Icon, "1");
+                       form.Icon = null;
+                       Assert.IsNotNull (form.Icon, "2");
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void MinimizedWindowSize ()
+               {
+                       Form form = new Form ();
+                       form.WindowState = FormWindowState.Minimized;
+                       form.Show ();
+                       Assert.AreEqual (SystemInformation.MinimizedWindowSize, form.Size, "1");
+                       form.Close ();
+                       form = new Form ();
+                       form.Show ();
+                       form.WindowState = FormWindowState.Minimized;
+                       Assert.AreEqual (SystemInformation.MinimizedWindowSize, form.Size, "2");
+                       form.Close ();
+               }
        }
 
        public class TimeBombedForm : Form
@@ -2767,4 +3000,63 @@ namespace MonoTests.System.Windows.Forms
                        }
                }
        }
+
+       public class AutoScaleForm : Form
+       {
+               public ListBox listBox1 = new ListBox ();
+               public ComboBox comboBox1 = new ComboBox ();
+               public Button button1 = new Button ();
+               public Button button2 = new Button ();
+               public Label label1 = new Label ();
+               public TextBox textBox1 = new TextBox ();
+               public TextBox textBox2 = new TextBox ();
+               public RichTextBox richTextBox1 = new RichTextBox ();
+               public ListView listView1 = new ListView ();
+               public TreeView treeView1 = new TreeView ();
+               public VScrollBar vScrollBar1 = new VScrollBar ();
+               public HScrollBar hScrollBar1 = new HScrollBar ();
+
+               public AutoScaleForm (bool use_new_auto_scale)
+               {
+                       ShowInTaskbar = false;
+                       
+                       SuspendLayout ();
+
+                       listBox1.IntegralHeight = false;
+                       listBox1.SetBounds (8, 8, 104, 82);
+                       comboBox1.SetBounds (240, 8, 121, 21);
+                       button1.SetBounds (8, 108, 75, 23);
+                       button2.SetBounds (8, 132, 75, 23);
+                       label1.SetBounds (92, 148, 35, 13);
+                       textBox1.SetBounds (112, 144, 100, 20);
+                       textBox2.Multiline = true;
+                       textBox2.SetBounds (120, 8, 112, 64);
+                       richTextBox1.SetBounds (120, 76, 112, 64);
+                       listView1.SetBounds (240, 36, 92, 84);
+                       treeView1.SetBounds (260, 128, 104, 76);
+                       vScrollBar1.SetBounds (340, 36, 16, 68);
+                       hScrollBar1.SetBounds (8, 184, 228, 16);
+
+                       ClientSize = new Size (368, 209);
+
+                       Controls.AddRange ( new Control [] { listBox1, comboBox1, button1, button2, label1, textBox1,
+                               textBox2, richTextBox1, listView1, treeView1, vScrollBar1, hScrollBar1 } );
+
+                       if (use_new_auto_scale) {
+#if NET_2_0
+                               AutoScaleMode = AutoScaleMode.Dpi;
+                               SizeF s = CurrentAutoScaleDimensions;
+                               AutoScaleDimensions = new SizeF (s.Width * 2, s.Height * 2);
+#endif
+                       }
+                       else {
+                               AutoScale = true;
+                               SizeF s = Form.GetAutoScaleSize (Font);
+                               AutoScaleBaseSize = new Size ((int)Math.Round (s.Width) * 2, (int)s.Height * 2);
+                       }
+
+                       ResumeLayout (false);
+                       PerformLayout ();
+               }
+       }
 }