diff options
author | Miguel de Icaza <miguel@gnome.org> | 2012-07-21 20:04:58 +0400 |
---|---|---|
committer | Miguel de Icaza <miguel@gnome.org> | 2012-07-21 20:04:58 +0400 |
commit | dba2dd4098aefe507818a8b739cd966e23edc9f5 (patch) | |
tree | 58a7f84f49c74d0a71af469c8e6911a6e60f02e2 /mcs/class/Managed.Windows.Forms/Test | |
parent | f4a44a474ea9dbf49544cf9c97d727645c2d8e4a (diff) | |
parent | 38bdbad5071487a11f4330077c383375dce39840 (diff) |
Merge pull request #337 from robwilkens/IdleThreadsFixes
Fix:Idle event handler was called on every thread rather than thread ass...
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/Test')
-rw-r--r-- | mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs index c2f3c375158..9a7e9bcfb40 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs @@ -624,6 +624,80 @@ namespace MonoTests.System.Windows.Forms _form.MinimumSize = new Size(100, 100); Assert.AreEqual (true, eventhandled, "#A10"); } + + /** + ** This next test is in response to a bug report + ** which pointed out that the idle events were being + ** sent to every thread rather than just the thread + ** they were assigned on. + ** + ** Report: https://bugzilla.novell.com/show_bug.cgi?id=321541 + **/ + private static Form form1_OneIdlePerThread = null; + private static Form form2_OneIdlePerThread = null; + private static int count1_OIPT = 0; + private static int count2_OIPT = 0; + private static ThreadStart OIPT_ThreadStart2; + private static Thread OIPT_Thread2; + private static int oipt_t1 = 0; + private static int oipt_t2 = 0; + [Test] + public void OneIdlePerThread () { + Thread t = Thread.CurrentThread; + oipt_t1 = t.ManagedThreadId; + count1_OIPT = 0; + count2_OIPT = 0; + form1_OneIdlePerThread = new Form (); + form2_OneIdlePerThread = new Form (); + form1_OneIdlePerThread.Show (); + + OIPT_ThreadStart2 = new ThreadStart (TIPT_Two); + OIPT_Thread2=new Thread (OIPT_ThreadStart2); + OIPT_Thread2.IsBackground = true; + OIPT_Thread2.SetApartmentState (ApartmentState.STA); + OIPT_Thread2.Start (); + Application.Idle += new EventHandler (TestIdlePerThread); + Application.Run (form1_OneIdlePerThread); + if (!OIPT_Thread2.Join (1000)){ + OIPT_Thread2.Abort(); + } + + Assert.AreEqual (true, count1_OIPT == 1, + "#Idle: idle #1 hit too many times"); + Assert.AreEqual (true, count2_OIPT == 1, + "#Idle: idle #2 hit too many times"); + } + public static void TIPT_Two (){ + Thread t = Thread.CurrentThread; + oipt_t2 = t.ManagedThreadId; + Application.Idle += + new EventHandler (TestIdlePerThread2); + Application.Run (form2_OneIdlePerThread); + } + public static void TestIdlePerThread (object o, EventArgs e) { + Thread t = Thread.CurrentThread; + count1_OIPT++; + Application.Idle -= + new EventHandler (TestIdlePerThread); + /* Give thread2 time to finish before we close */ + Thread.Sleep(100); + if (form1_OneIdlePerThread != null) + form1_OneIdlePerThread.Close (); + Assert.AreEqual (true, oipt_t1 == t.ManagedThreadId, + "#Idle:Wrong Thread-t1"); + } + public static void TestIdlePerThread2 (object o, EventArgs e) { + Thread t = Thread.CurrentThread; + count2_OIPT++; + Application.Idle -= + new EventHandler(TestIdlePerThread2); + if (form2_OneIdlePerThread != null) + form2_OneIdlePerThread.Invoke + (new MethodInvoker (form2_OneIdlePerThread.Close)); + Assert.AreEqual (true, oipt_t2 == t.ManagedThreadId, + "#Idle:Wrong Thread-t2"); + } + } [TestFixture] |