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;
94 [ExpectedException (typeof (NotSupportedException))]
95 public void RestartNotSupportedExceptionTest ()
97 Application.Restart ();
101 public void OpenFormsTest ()
103 IntPtr dummy = IntPtr.Zero;
105 Form f1 = null, f2 = null;
107 f1 = new OpenFormsTestForm ();
108 Assert.AreEqual (0, Application.OpenForms.Count, "#1");
110 Assert.AreEqual (0, Application.OpenForms.Count, "#2");
112 Assert.AreEqual (0, Application.OpenForms.Count, "#3");
114 Assert.AreEqual (0, Application.OpenForms.Count, "#4");
116 f1 = new OpenFormsTestForm ();
117 Assert.AreEqual (0, Application.OpenForms.Count, "#5");
119 Assert.AreEqual (1, Application.OpenForms.Count, "#6");
121 Assert.AreEqual (0, Application.OpenForms.Count, "#7");
123 Assert.AreEqual (0, Application.OpenForms.Count, "#8");
125 f1 = new OpenFormsTestForm ();
126 Assert.AreEqual (0, Application.OpenForms.Count, "#9");
128 Assert.AreEqual (0, Application.OpenForms.Count, "#10");
129 f1.GetType ().GetMethod ("RecreateHandle", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.ExactBinding).Invoke (f1, new object [] {});
130 Assert.AreEqual (0, Application.OpenForms.Count, "#11");
132 Assert.AreEqual (0, Application.OpenForms.Count, "#12");
134 f1 = new OpenFormsTestForm ();
135 Assert.AreEqual (0, Application.OpenForms.Count, "#13");
137 Assert.AreEqual (1, Application.OpenForms.Count, "#14");
138 f2 = new OpenFormsTestForm ();
139 Assert.AreEqual (1, Application.OpenForms.Count, "#15");
141 Assert.AreEqual (2, Application.OpenForms.Count, "#16");
143 Assert.AreEqual (1, Application.OpenForms.Count, "#17");
145 Assert.AreEqual (0, Application.OpenForms.Count, "#18");
148 f1 = new OpenFormsTestForm ();
149 Assert.AreEqual (0, Application.OpenForms.Count, "#19");
151 Assert.AreEqual (1, Application.OpenForms.Count, "#20");
152 f2 = new OpenFormsTestForm ();
153 Assert.AreEqual (1, Application.OpenForms.Count, "#21");
155 Assert.AreEqual (2, Application.OpenForms.Count, "#22");
157 Assert.AreEqual (2, Application.OpenForms.Count, "#23");
159 Assert.AreEqual (2, Application.OpenForms.Count, "#24");
161 Assert.AreEqual (1, Application.OpenForms.Count, "#25");
163 Assert.AreEqual (0, Application.OpenForms.Count, "#26");
174 TestHelper.RemoveWarning (dummy);
178 public void MethodRaiseIdle ()
180 bool idle_raised = false;
182 Application.Idle += new EventHandler (delegate (Object obj, EventArgs e) { idle_raised = true; });
183 Application.RaiseIdle (EventArgs.Empty);
185 Assert.AreEqual (true, idle_raised, "R1");
188 void Application_Idle (object sender, EventArgs e)
190 throw new Exception ("The method or operation is not implemented.");
193 class OpenFormsTestForm : Form
195 public bool have_been_opened;
197 public bool IsInOpenForms ()
199 foreach (Form form in Application.OpenForms) {
201 have_been_opened = true;
208 protected override void OnLoad (EventArgs e)
210 Assert.AreEqual (false, IsInOpenForms (), "#OnLoad-A");
212 Assert.AreEqual (true, IsInOpenForms (), "#OnLoad-B");
215 protected override void OnCreateControl ()
217 Assert.AreEqual (false, IsInOpenForms (), "#OnCreateControl-A");
218 base.OnCreateControl ();
219 Assert.AreEqual (true, IsInOpenForms (), "#OnCreateControl-B");
222 // Activation may not be synchronous, causing too many false positives
223 protected override void OnActivated (EventArgs e)
225 bool dummy = IsInOpenForms ();
226 //Assert.AreEqual (true, IsInOpenForms (), "#OnActivated-A");
227 base.OnActivated (e);
228 dummy = IsInOpenForms ();
229 //Assert.AreEqual (true, IsInOpenForms (), "#OnActivated-B");
232 protected override void OnClosed (EventArgs e)
234 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosed-A");
236 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosed-B");
239 protected override void OnClosing (CancelEventArgs e)
241 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosing-A");
243 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnClosing-B");
246 protected override void OnDeactivate (EventArgs e)
248 Assert.AreEqual (true, IsInOpenForms (), "#OnDeactivate-A");
249 base.OnDeactivate (e);
250 Assert.AreEqual (true, IsInOpenForms (), "#OnDeactivate-B");
253 protected override void OnFormClosed (FormClosedEventArgs e)
255 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnFormClosed-A");
256 base.OnFormClosed (e);
257 Assert.AreEqual (false, IsInOpenForms (), "#OnFormClosed-B");
260 protected override void OnFormClosing (FormClosingEventArgs e)
262 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnFormClosing-A");
263 base.OnFormClosing (e);
264 Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnFormClosing-B");
267 protected override void OnHandleCreated (EventArgs e)
269 Assert.AreEqual (false, IsInOpenForms (), "#OnHandleCreated-A");
270 base.OnHandleCreated (e);
271 Assert.AreEqual (false, IsInOpenForms (), "#OnHandleCreated-B");
274 protected override void OnHandleDestroyed (EventArgs e)
276 //Assert.AreEqual (have_been_opened, IsInOpenForms (), "#OnHandleDestroyed-A");
277 base.OnHandleDestroyed (e);
278 Assert.AreEqual (false, IsInOpenForms (), "#OnHandleDestroyed-B");
281 protected override void SetVisibleCore (bool value)
284 Assert.AreEqual (false && value, IsInOpenForms (), "#SetVisibleCore-A");
285 base.SetVisibleCore (value);
286 Assert.AreEqual (true, IsInOpenForms (), "#SetVisibleCore-B");
289 protected override void OnVisibleChanged (EventArgs e)
291 Assert.AreEqual (true, IsInOpenForms (), "#OnVisibleChanged-A");
292 base.OnVisibleChanged (e);
293 Assert.AreEqual (true, IsInOpenForms (), "#OnVisibleChanged-B");
296 protected override void CreateHandle ()
298 Assert.AreEqual (false, IsInOpenForms (), "#CreateHandle-A");
299 base.CreateHandle ();
300 // We have a different stack trace here, so we're not matching MS
301 // Assert.AreEqual (false, IsInOpenForms (), "#CreateHandle-B");
304 protected override void DestroyHandle ()
306 //Dispose may be called several times, so this isn't correct
307 //Assert.AreEqual (have_been_opened, IsInOpenForms (), "#DestroyHandle-A");
308 base.DestroyHandle ();
309 Assert.AreEqual (false, IsInOpenForms (), "#DestroyHandle-B");
312 protected override void Dispose (bool disposing)
314 //Dispose may be called several times, so this isn't correct
315 //Assert.AreEqual (have_been_opened, IsInOpenForms (), "#Dispose-A");
316 base.Dispose (disposing);
317 Assert.AreEqual (false, IsInOpenForms (), "#Dispose-B");