2007-01-10 Chris Toshok <toshok@ximian.com>
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / FormTest.cs
1 //
2 // FormTest.cs: Test cases for Form.
3 //
4 // Author:
5 //   Ritvik Mayank (mritvik@novell.com)
6 //
7 // (C) 2005 Novell, Inc. (http://www.novell.com)
8 //
9
10 using System;
11 using System.ComponentModel;
12 using System.Drawing;
13 using System.Reflection;
14 using System.Windows.Forms;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.System.Windows.Forms
19 {
20         [TestFixture]
21         public class FormTest
22         {
23                 [Test]
24                 public void FormPropertyTest ()
25                 {
26                         Form myform = new Form ();
27                         myform.Visible = true;
28                         myform.Text = "NewForm";
29                         myform.Name = "FormTest";
30                         Assert.IsNull (myform.AcceptButton, "#1");
31                         Assert.IsNull (myform.ActiveMdiChild, "#2"); 
32                         Assert.IsFalse (myform.AutoScale, "#3");
33                         Assert.IsNull (myform.CancelButton, "#6");
34                         Assert.IsTrue (myform.ControlBox, "#9");
35                         Assert.IsTrue (myform.DesktopBounds.X > 0, "#10a");
36                         Assert.IsTrue (myform.DesktopBounds.Y > 0, "#10b");
37                         Assert.AreEqual (300, myform.DesktopBounds.Height, "#10c");
38                         Assert.AreEqual (300, myform.DesktopBounds.Width, "#10d");
39                         Assert.IsTrue (myform.DesktopLocation.X > 0, "#11a");
40                         Assert.IsTrue (myform.DesktopLocation.Y > 0, "#11b");
41                         Assert.AreEqual (DialogResult.None, myform.DialogResult, "#12");
42                         Assert.AreEqual (FormBorderStyle.Sizable, myform.FormBorderStyle, "#13");
43                         Assert.IsFalse (myform.HelpButton, "#14");
44                         Assert.AreEqual ("System.Drawing.Icon", myform.Icon.GetType ().ToString (), "#15");
45                         Assert.IsFalse (myform.IsMdiChild, "#16");
46                         Assert.IsFalse (myform.IsMdiContainer, "#17");
47                         Assert.IsFalse (myform.KeyPreview, "#18");
48                         Assert.IsTrue (myform.MaximizeBox, "#19");
49                         Assert.AreEqual (0, myform.MaximumSize.Height, "#20a");
50                         Assert.AreEqual (0, myform.MaximumSize.Width, "#20b");
51                         Assert.AreEqual (0, myform.MdiChildren.Length, "#21a");
52                         Assert.AreEqual (1, myform.MdiChildren.Rank, "#21b");
53                         Assert.IsFalse (myform.MdiChildren.IsSynchronized, "#21c");
54                         Assert.IsNull (myform.MdiParent, "#22");
55                         Assert.IsNull (myform.Menu, "#23");
56                         Assert.IsNull (myform.MergedMenu, "#24");
57                         Assert.IsTrue (myform.MinimizeBox, "#25");
58                         Assert.AreEqual (0, myform.MinimumSize.Height, "#26a");
59                         Assert.AreEqual (0, myform.MinimumSize.Width, "#26b");
60                         Assert.IsTrue (myform.MinimumSize.IsEmpty, "#26c");
61                         Assert.IsFalse (myform.Modal, "#27");
62                         Assert.AreEqual (1, myform.Opacity, "#28");
63                         Assert.AreEqual (0, myform.OwnedForms.Length, "#29a");
64                         Assert.AreEqual (1, myform.OwnedForms.Rank, "#29b");
65                         Assert.IsNull (myform.Owner, "#30");
66                         Assert.IsTrue (myform.ShowInTaskbar, "#31");
67                         Assert.AreEqual (300, myform.Size.Height, "#32a");
68                         Assert.AreEqual (300, myform.Size.Width, "#32b");
69                         Assert.AreEqual (SizeGripStyle.Auto, myform.SizeGripStyle, "#33");
70                         Assert.AreEqual (FormStartPosition.WindowsDefaultLocation, myform.StartPosition, "#34");
71                         Assert.IsTrue (myform.TopLevel, "#35");
72                         Assert.IsFalse (myform.TopMost, "#36");
73                         Assert.AreEqual (Color.Empty, myform.TransparencyKey, "#37");
74                         Assert.AreEqual (FormWindowState.Normal, myform.WindowState, "#38");
75                         Assert.AreEqual (ImeMode.NoControl, myform.ImeMode, "#39");
76                         myform.Dispose ();
77                 }
78
79                 [Test]
80                 [NUnit.Framework.Category ("NotWorking")]
81                 public void ActivateTest ()
82                 {
83                         Form myform = new Form ();
84                         myform.ShowInTaskbar = false;
85                         myform.Visible = true;
86                         myform.Text = "NewForm";
87                         myform.Name = "FormTest";
88                         myform.Activate ();
89                         Assert.AreEqual (true, myform.Focus (), "#40");
90                         myform.Dispose ();
91                 }
92
93                 [Test]
94                 public void AddOwnedFormTest ()
95                 {
96                         Form parent = new Form ();
97                         parent.ShowInTaskbar = false;
98                         parent.Text = "NewParent";
99                         Form ownedForm = new Form ();
100                         ownedForm.ShowInTaskbar = false;
101                         ownedForm.Text = "Owned Form";
102                         parent.AddOwnedForm (ownedForm);
103                         ownedForm.Show ();
104                         Assert.AreEqual ("NewParent", ownedForm.Owner.Text, "#41");
105                         ownedForm.Dispose ();
106                         parent.Dispose ();
107                 }
108
109                 [Test] // bug #80020
110                 [NUnit.Framework.Category ("NotWorking")]
111                 public void IsHandleCreated ()
112                 {
113                         Form main = new Form ();
114                         main.Name = "main";
115                         main.IsMdiContainer = true;
116                         main.ShowInTaskbar = false;
117                         Assert.IsFalse (main.IsHandleCreated, "#1");
118
119                         Form child = new Form ();
120                         child.MdiParent = main;
121                         child.WindowState = FormWindowState.Maximized;
122                         Assert.IsFalse (main.IsHandleCreated, "#2");
123
124                         child.Show ();
125                         Assert.IsFalse (child.IsHandleCreated, "#3");
126                         Assert.IsFalse (main.IsHandleCreated, "#4");
127
128                         main.Show ();
129                         Assert.IsTrue (child.IsHandleCreated, "#5");
130                         Assert.IsTrue (main.IsHandleCreated, "#6");
131
132                         child.Dispose ();
133                         main.Dispose ();
134                 }
135
136                 [Test]
137                 public void RemoveOwnedFormTest ()
138                 {
139                         Form myform = new Form ();
140                         myform.ShowInTaskbar = false;
141                         myform.Text = "NewForm";
142                         myform.Name = "FormTest";
143                         myform.RemoveOwnedForm (myform);
144                         myform.Show ();
145                         Assert.AreEqual (null, myform.Owner, "#44");
146                         myform.Dispose ();
147                 }
148
149                 [Test]
150                 public void SetDesktopBoundsTest ()
151                 {
152                         Form myform = new Form ();
153                         myform.ShowInTaskbar = false;
154                         myform.Visible = true;
155                         myform.Text = "NewForm";
156                         myform.Name = "FormTest";
157                         myform.SetDesktopBounds (10, 10, 200 , 200);
158                         Assert.AreEqual (200, myform.DesktopBounds.Height, "#45");
159                         myform.Dispose ();
160                 }
161
162                 [Test]
163                 public void SetDesktopLocationTest ()
164                 {
165                         Form myform = new Form ();
166                         myform.ShowInTaskbar = false;
167                         myform.Visible = true;
168                         myform.Text = "NewForm";
169                         myform.Name = "FormTest";
170                         myform.SetDesktopLocation (10, 10);
171                         Assert.AreEqual (10, myform.DesktopLocation.X, "#46");
172                         myform.Dispose ();
173                 }
174
175                 [Test]
176                 public void SetDialogResultOutOfRange ()
177                 {
178                         Form myform = new Form ();
179                         myform.ShowInTaskbar = false;
180                         try {
181                                 myform.DialogResult = (DialogResult) (-1);
182                                 Assert.Fail ("#48");
183                         } catch (InvalidEnumArgumentException) {
184                         }
185
186                         try {
187                                 myform.DialogResult = (DialogResult) ((int) DialogResult.No + 1);
188                                 Assert.Fail ("#49");
189                         } catch (InvalidEnumArgumentException) {
190                         }
191                         myform.Dispose ();
192                 }
193
194                 void myform_set_dialogresult (object sender, EventArgs e)
195                 {
196                         Form f = (Form)sender;
197
198                         f.DialogResult = DialogResult.OK;
199                 }
200
201                 void myform_close (object sender, EventArgs e)
202                 {
203                         Form f = (Form)sender;
204
205                         f.Close();
206                 }
207
208                 [Test]
209                 public void SetDialogResult ()
210                 {
211                         Form myform = new Form ();
212                         myform.ShowInTaskbar = false;
213                         myform.Visible = true;
214
215                         myform.DialogResult = DialogResult.Cancel;
216
217                         Assert.IsTrue (myform.Visible, "A1");
218                         Assert.IsFalse (myform.IsDisposed, "A2");
219
220                         myform.Close ();
221
222                         Assert.IsFalse (myform.Visible, "A3");
223                         Assert.IsTrue (myform.IsDisposed, "A4");
224
225                         DialogResult result;
226
227                         myform = new Form ();
228                         myform.ShowInTaskbar = false;
229                         myform.VisibleChanged += new EventHandler (myform_set_dialogresult);
230                         result = myform.ShowDialog ();
231
232                         Assert.AreEqual (result, DialogResult.OK, "A5");
233                         Assert.IsFalse (myform.Visible, "A6");
234                         Assert.IsFalse (myform.IsDisposed, "A7");
235
236                         myform = new Form ();
237                         myform.ShowInTaskbar = false;
238                         myform.VisibleChanged += new EventHandler (myform_close);
239                         result = myform.ShowDialog ();
240
241                         Assert.AreEqual (result, DialogResult.Cancel, "A8");
242                         Assert.IsFalse (myform.Visible, "A9");
243                         Assert.IsFalse (myform.IsDisposed, "A10");
244                 }
245
246                 [Test] // bug #80052
247                 [NUnit.Framework.Category ("NotWorking")]
248                 public void Location ()
249                 {
250                         // 
251                         // CenterParent
252                         // 
253
254                         Form formA = new Form ();
255                         formA.ShowInTaskbar = false;
256                         formA.StartPosition = FormStartPosition.CenterParent;
257                         formA.Location = new Point (151, 251);
258                         formA.Show ();
259
260                         Assert.AreEqual (FormStartPosition.CenterParent, formA.StartPosition, "#A1");
261                         Assert.IsFalse (formA.Location.X == 151, "#A2");
262                         Assert.IsFalse (formA.Location.Y == 251, "#A3");
263
264                         formA.Location = new Point (311, 221);
265
266                         Assert.AreEqual (FormStartPosition.CenterParent, formA.StartPosition, "#A4");
267                         Assert.AreEqual (311, formA.Location.X, "#A5");
268                         Assert.AreEqual (221, formA.Location.Y, "#A6");
269
270                         formA.Dispose ();
271
272                         // 
273                         // CenterScreen
274                         // 
275
276                         Form formB = new Form ();
277                         formB.ShowInTaskbar = false;
278                         formB.StartPosition = FormStartPosition.CenterScreen;
279                         formB.Location = new Point (151, 251);
280                         formB.Show ();
281
282                         Assert.AreEqual (FormStartPosition.CenterScreen, formB.StartPosition, "#B1");
283                         Assert.IsFalse (formB.Location.X == 151, "#B2");
284                         Assert.IsFalse (formB.Location.Y == 251, "#B3");
285
286                         formB.Location = new Point (311, 221);
287
288                         Assert.AreEqual (FormStartPosition.CenterScreen, formB.StartPosition, "#B4");
289                         Assert.AreEqual (311, formB.Location.X, "#B5");
290                         Assert.AreEqual (221, formB.Location.Y, "#B6");
291
292                         formB.Dispose ();
293
294                         // 
295                         // Manual
296                         // 
297
298                         Form formC = new Form ();
299                         formC.ShowInTaskbar = false;
300                         formC.StartPosition = FormStartPosition.Manual;
301                         formC.Location = new Point (151, 251);
302                         formC.Show ();
303
304                         Assert.AreEqual (FormStartPosition.Manual, formC.StartPosition, "#C1");
305                         Assert.AreEqual (151, formC.Location.X, "#C2");
306                         Assert.AreEqual (251, formC.Location.Y, "#C3");
307
308                         formC.Location = new Point (311, 221);
309
310                         Assert.AreEqual (FormStartPosition.Manual, formC.StartPosition, "#C4");
311                         Assert.AreEqual (311, formC.Location.X, "#C5");
312                         Assert.AreEqual (221, formC.Location.Y, "#C6");
313
314                         formC.Dispose ();
315
316                         // 
317                         // WindowsDefaultBounds
318                         // 
319
320                         Form formD = new Form ();
321                         formD.ShowInTaskbar = false;
322                         formD.StartPosition = FormStartPosition.WindowsDefaultBounds;
323                         formD.Location = new Point (151, 251);
324                         formD.Show ();
325
326                         Assert.AreEqual (FormStartPosition.WindowsDefaultBounds, formD.StartPosition, "#D1");
327                         Assert.IsFalse (formD.Location.X == 151, "#D2");
328                         Assert.IsFalse (formD.Location.Y == 251, "#D3");
329
330                         formD.Location = new Point (311, 221);
331
332                         Assert.AreEqual (FormStartPosition.WindowsDefaultBounds, formD.StartPosition, "#D4");
333                         Assert.AreEqual (311, formD.Location.X, "#D5");
334                         Assert.AreEqual (221, formD.Location.Y, "#D6");
335
336                         formD.Dispose ();
337
338                         // 
339                         // WindowsDefaultLocation
340                         // 
341
342                         Form formE = new Form ();
343                         formE.ShowInTaskbar = false;
344                         formE.Location = new Point (151, 251);
345                         formE.Show ();
346
347                         Assert.AreEqual (FormStartPosition.WindowsDefaultLocation, formE.StartPosition, "#E1");
348                         Assert.IsFalse (formE.Location.X == 151, "#E2");
349                         Assert.IsFalse (formE.Location.Y == 251, "#E3");
350
351                         formE.Location = new Point (311, 221);
352
353                         Assert.AreEqual (FormStartPosition.WindowsDefaultLocation, formE.StartPosition, "#E4");
354                         Assert.AreEqual (311, formE.Location.X, "#E5");
355                         Assert.AreEqual (221, formE.Location.Y, "#E6");
356
357                         formE.Dispose ();
358                 }
359
360                 [Test]
361                 public void DisposeOwnerTest ()
362                 {
363                         Form f1 = new Form ();
364                         Form f2 = new Form ();
365
366                         f2.Owner = f1;
367
368                         f1.Dispose ();
369
370                         Assert.IsNull (f2.Owner, "1");
371                         Assert.AreEqual (0, f1.OwnedForms.Length, "2");
372                 }
373
374                 [Test]
375                 [ExpectedException (typeof (ObjectDisposedException))]
376                 public void AccessDisposedForm ()
377                 {
378                         Form myform = new Form ();
379                         myform.ShowInTaskbar = false;
380
381                         myform.Show ();
382                         myform.Close (); // this should result in the form being disposed
383                         myform.Show (); // and this line should result in the ODE being thrown
384                 }
385
386                 class MyForm : Form
387                 {
388                         public void DoDestroyHandle ()
389                         {
390                                 DestroyHandle();
391                         }
392                         public void DoRecreateHandle ()
393                         {
394                                 RecreateHandle();
395                         }
396                 }
397
398                 int handle_destroyed_count;
399                 void handle_destroyed (object sender, EventArgs e)
400                 {
401                         handle_destroyed_count++;
402                 }
403
404                 [Test]
405                 public void DestroyHandleTest ()
406                 {
407                         handle_destroyed_count = 0;
408
409                         MyForm f1 = new MyForm ();
410                         f1.HandleDestroyed += new EventHandler (handle_destroyed);
411                         f1.Show ();
412                         f1.DoDestroyHandle ();
413                         Assert.AreEqual (1, handle_destroyed_count, "1");
414
415                         f1 = new MyForm ();
416                         f1.HandleDestroyed += new EventHandler (handle_destroyed);
417                         f1.Show ();
418                         f1.DoRecreateHandle ();
419                         Assert.AreEqual (2, handle_destroyed_count, "2");
420                 }
421
422                 [Test]
423                 public void FormClose ()
424                 {
425                         Form myform = new Form ();
426                         myform.ShowInTaskbar = false;
427
428                         Assert.IsFalse (myform.Visible, "A1");
429                         Assert.IsFalse (myform.IsDisposed, "A2");
430
431                         myform.Close ();
432
433                         Assert.IsFalse (myform.Visible, "A3");
434                         Assert.IsFalse (myform.IsDisposed, "A4");
435
436                         myform.Show ();
437
438                         Assert.IsTrue (myform.Visible, "A5");
439                         Assert.IsFalse (myform.IsDisposed, "A6");
440
441                         myform.Close ();
442
443                         Assert.IsFalse (myform.Visible, "A7");
444                         Assert.IsTrue (myform.IsDisposed, "A8");
445                 }
446
447                 [Test]
448                 public void FormClose2 ()
449                 {
450                         WMCloseWatcher f = new WMCloseWatcher ();
451                         f.ShowInTaskbar = false;
452
453                         f.close_count = 0;
454                         Assert.IsFalse (f.Visible, "A1");
455                         f.Close ();
456                         Assert.AreEqual (0, f.close_count, "A2");
457
458
459                         f.Show ();
460                         f.Close ();
461                         Assert.AreEqual (1, f.close_count, "A3");
462                 }
463
464                 class WMCloseWatcher : Form {
465                         public int close_count;
466
467                         protected override void WndProc (ref Message msg) {
468                                 if (msg.Msg == 0x0010 /* WM_CLOSE */) {
469                                         close_count ++;
470                                 }
471
472                                 base.WndProc (ref msg);
473                         }
474                 }
475
476                 class SwallowOnActivated : Form {
477                         protected override void OnActivated (EventArgs e)
478                         {
479                                 // do nothing
480                         }
481
482                         protected override void OnCreateControl () {
483                                 base.OnCreateControl ();
484                         }
485                 }
486
487                 class EnterTest : Button {
488                         protected override void OnEnter (EventArgs e)
489                         {
490                                 on_enter = true;
491                                 base.OnEnter (e);
492                         }
493
494                         public bool on_enter;
495                 }
496
497                 [Test]
498                 [NUnit.Framework.CategoryAttribute ("NotWorking")] // works on windows but not mono+linux, since f.Show() is async there.
499                 public void OnActivateEventHandlingTest1 ()
500                 {
501                         SwallowOnActivated f = new SwallowOnActivated ();
502
503                         f.ShowInTaskbar = false;
504
505                         EnterTest c = new EnterTest ();
506                         f.Controls.Add (c);
507
508                         f.Show ();
509
510                         Assert.IsTrue (c.on_enter, "1");
511
512                         f.Dispose ();
513                 }
514                 
515 #if NET_2_0
516                 [Test]
517                 public void FormClosingEvents ()
518                 {
519                         // Standard Close
520                         Form f = new Form ();
521                         string events = string.Empty;
522
523                         f.Closing += new CancelEventHandler (delegate (Object obj, CancelEventArgs e) { events += ("Closing;"); });
524                         f.FormClosing += new FormClosingEventHandler (delegate (Object obj, FormClosingEventArgs e) { events += string.Format ("FormClosing [Reason:{0} - Cancel:{1}]", e.CloseReason, e.Cancel); });
525         
526                         f.Show ();
527                         f.Close ();
528                         
529                         Assert.AreEqual ("Closing;FormClosing [Reason:UserClosing - Cancel:False]", events, "A1");                      
530                 }
531
532                 [Test]
533                 public void FormClosingEventsCancel ()
534                 {
535                         // Shows that setting Cancel in Closing flows through to FormClosing
536                         Form f = new Form ();
537                         string events = string.Empty;
538
539                         f.Closing += new CancelEventHandler (delegate (Object obj, CancelEventArgs e) { events += ("Closing;"); e.Cancel = true; });
540                         f.FormClosing += new FormClosingEventHandler (delegate (Object obj, FormClosingEventArgs e) { events += string.Format("FormClosing [Reason:{0} - Cancel:{1}]", e.CloseReason, e.Cancel); e.Cancel = false; });
541
542                         f.Show ();
543                         f.Close ();
544
545                         Assert.AreEqual ("Closing;FormClosing [Reason:UserClosing - Cancel:True]", events, "A1");
546                 }
547 #endif
548         }
549 }