2 // ApplicationContextTest.cs
5 // Chris Toshok (toshok@ximian.com)
7 // (C) 2006 Novell, Inc. (http://www.novell.com)
11 using System.ComponentModel;
12 using System.Windows.Forms;
14 using System.Reflection;
15 using System.Threading;
16 using NUnit.Framework;
18 namespace MonoTests.System.Windows.Forms
21 public class ApplicationTest : TestHelper
23 ApplicationContext ctx;
25 void form_visible_changed (object sender, EventArgs e)
27 Assert.AreEqual (sender, ctx.MainForm, "1");
28 ((Form)sender).Close();
32 public void ContextMainFormTest ()
34 Form f1 = new Form ();
35 f1.ShowInTaskbar = false;
36 ctx = new ApplicationContext (f1);
38 f1.VisibleChanged += new EventHandler (form_visible_changed);
40 Application.Run (ctx);
42 Assert.IsNull (ctx.MainForm, "2");
47 public void Bug694908 ()
49 Application.ThreadException += CrashingForm.HandleThreadException;
51 using (var form = new CrashingForm ())
54 Application.DoEvents ();
56 // with bug 694908 we don't come here. Instead NUnit exits.
57 Assert.IsTrue (CrashingForm.HasHandledException);
60 class CrashingForm: Form
62 private static Form _thisForm;
64 public CrashingForm ()
67 var btn = new Button ();
70 btn.Paint += OnButtonPaint;
77 private void OnButtonPaint (object sender, PaintEventArgs e)
79 throw new ArgumentException ();
82 public static bool HasHandledException { get; private set; }
84 public static void HandleThreadException (object sender, ThreadExceptionEventArgs args)
87 Application.DoEvents ();
88 HasHandledException = true;
95 [ExpectedException (typeof (NotSupportedException))]
96 public void RestartNotSupportedExceptionTest ()
98 Application.Restart ();
102 public void OpenFormsTest ()
104 IntPtr dummy = IntPtr.Zero;
106 Form f1 = null, f2 = null;
108 f1 = new OpenFormsTestForm ();
109 Assert.AreEqual (0, Application.OpenForms.Count, "#1");
111 Assert.AreEqual (0, Application.OpenForms.Count, "#2");
113 Assert.AreEqual (0, Application.OpenForms.Count, "#3");
115 Assert.AreEqual (0, Application.OpenForms.Count, "#4");
117 f1 = new OpenFormsTestForm ();
118 Assert.AreEqual (0, Application.OpenForms.Count, "#5");
120 Assert.AreEqual (1, Application.OpenForms.Count, "#6");
122 Assert.AreEqual (0, Application.OpenForms.Count, "#7");
124 Assert.AreEqual (0, Application.OpenForms.Count, "#8");
126 f1 = new OpenFormsTestForm ();
127 Assert.AreEqual (0, Application.OpenForms.Count, "#9");
129 Assert.AreEqual (0, Application.OpenForms.Count, "#10");
130 f1.GetType ().GetMethod ("RecreateHandle", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.ExactBinding).Invoke (f1, new object [] {});
131 Assert.AreEqual (0, Application.OpenForms.Count, "#11");
133 Assert.AreEqual (0, Application.OpenForms.Count, "#12");
135 f1 = new OpenFormsTestForm ();
136 Assert.AreEqual (0, Application.OpenForms.Count, "#13");
138 Assert.AreEqual (1, Application.OpenForms.Count, "#14");
139 f2 = new OpenFormsTestForm ();
140 Assert.AreEqual (1, Application.OpenForms.Count, "#15");
142 Assert.AreEqual (2, Application.OpenForms.Count, "#16");
144 Assert.AreEqual (1, Application.OpenForms.Count, "#17");
146 Assert.AreEqual (0, Application.OpenForms.Count, "#18");
149 f1 = new OpenFormsTestForm ();
150 Assert.AreEqual (0, Application.OpenForms.Count, "#19");
152 Assert.AreEqual (1, Application.OpenForms.Count, "#20");
153 f2 = new OpenFormsTestForm ();
154 Assert.AreEqual (1, Application.OpenForms.Count, "#21");
156 Assert.AreEqual (2, Application.OpenForms.Count, "#22");
158 Assert.AreEqual (2, Application.OpenForms.Count, "#23");
160 Assert.AreEqual (2, Application.OpenForms.Count, "#24");
162 Assert.AreEqual (1, Application.OpenForms.Count, "#25");
164 Assert.AreEqual (0, Application.OpenForms.Count, "#26");
175 TestHelper.RemoveWarning (dummy);
179 public void MethodRaiseIdle ()
181 bool idle_raised = false;
183 Application.Idle += new EventHandler (delegate (Object obj, EventArgs e) { idle_raised = true; });
184 Application.RaiseIdle (EventArgs.Empty);
186 Assert.AreEqual (true, idle_raised, "R1");
189 void Application_Idle (object sender, EventArgs e)
191 throw new Exception ("The method or operation is not implemented.");
194 class OpenFormsTestForm : Form
196 public bool have_been_opened;
198 public bool IsInOpenForms ()
200 foreach (Form form in Application.OpenForms) {
202 have_been_opened = true;
209 protected override void OnLoad (EventArgs e)
211 Assert.AreEqual (false, IsInOpenForms (), "#OnLoad-A");
213 Assert.AreEqual (true, IsInOpenForms (), "#OnLoad-B");
216 protected override void OnCreateControl ()
218 Assert.AreEqual (false, IsInOpenForms (), "#OnCreateControl-A");
219 base.OnCreateControl ();
220 Assert.AreEqual (true, IsInOpenForms (), "#OnCreateControl-B");
223 // Activation may not be synchronous, causing too many false positives
224 protected override void OnActivated (EventArgs e)
226 bool dummy = IsInOpenForms ();
227 //Assert.AreEqual (true, IsInOpenForms (), "#OnActivated-A");
228 base.OnActivated (e);
229 dummy = IsInOpenForms ();
230 //Assert.AreEqual (true, IsInOpenForms (), "#OnActivated-B");
233 protected override void OnClosed (EventArgs e)
235 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosed-A");
237 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosed-B");
240 protected override void OnClosing (CancelEventArgs e)
242 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosing-A");
244 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosing-B");
247 protected override void OnDeactivate (EventArgs e)
249 Assert.AreEqual (true, IsInOpenForms (), "#OnDeactivate-A");
250 base.OnDeactivate (e);
251 Assert.AreEqual (true, IsInOpenForms (), "#OnDeactivate-B");
254 protected override void OnFormClosed (FormClosedEventArgs e)
256 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnFormClosed-A");
257 base.OnFormClosed (e);
258 Assert.AreEqual (false, IsInOpenForms (), "#OnFormClosed-B");
261 protected override void OnFormClosing (FormClosingEventArgs e)
263 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnFormClosing-A");
264 base.OnFormClosing (e);
265 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnFormClosing-B");
268 protected override void OnHandleCreated (EventArgs e)
270 Assert.AreEqual (false, IsInOpenForms (), "#OnHandleCreated-A");
271 base.OnHandleCreated (e);
272 Assert.AreEqual (false, IsInOpenForms (), "#OnHandleCreated-B");
275 protected override void OnHandleDestroyed (EventArgs e)
277 //Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnHandleDestroyed-A");
278 base.OnHandleDestroyed (e);
279 Assert.AreEqual (false, IsInOpenForms (), "#OnHandleDestroyed-B");
282 protected override void SetVisibleCore (bool value)
285 Assert.AreEqual (false && value, IsInOpenForms (), "#SetVisibleCore-A");
286 base.SetVisibleCore (value);
287 Assert.AreEqual (true, IsInOpenForms (), "#SetVisibleCore-B");
290 protected override void OnVisibleChanged (EventArgs e)
292 Assert.AreEqual (true, IsInOpenForms (), "#OnVisibleChanged-A");
293 base.OnVisibleChanged (e);
294 Assert.AreEqual (true, IsInOpenForms (), "#OnVisibleChanged-B");
297 protected override void CreateHandle ()
299 Assert.AreEqual (false, IsInOpenForms (), "#CreateHandle-A");
300 base.CreateHandle ();
301 // We have a different stack trace here, so we're not matching MS
302 // Assert.AreEqual (false, IsInOpenForms (), "#CreateHandle-B");
305 protected override void DestroyHandle ()
307 //Dispose may be called several times, so this isn't correct
308 //Assert.AreEqual (have_been_opened, IsInOpenForms (), "#DestroyHandle-A");
309 base.DestroyHandle ();
310 Assert.AreEqual (false, IsInOpenForms (), "#DestroyHandle-B");
313 protected override void Dispose (bool disposing)
315 //Dispose may be called several times, so this isn't correct
316 //Assert.AreEqual (have_been_opened, IsInOpenForms (), "#Dispose-A");
317 base.Dispose (disposing);
318 Assert.AreEqual (false, IsInOpenForms (), "#Dispose-B");