context: /**
   * SendKeysTest.cs: Test cases for SendKeys
   * 
   * These tests can only run in ms.net one at a time.
   * Since ms.net apparently hooks the keyboard to 
   * implement this, running two tests in a row
   * makes the second test run before the hook
   * of the first test is released, effectively
   * hanging the keyboard. CTRL-ALT-DEL releases
   * the keyboard, but the test still hangs.
   * Running each test separately works.
   * 
   * Author:
   *		Andreia Gaita (avidigal@novell.com)
   * 
   * (C) 2005 Novell, Inc. (http://www.novell.com)
   * 
  */ 
  
  using System;
  using System.Windows.Forms;
  using System.Drawing;
  using System.Reflection;
  using System.Text;
  using System.Collections;
  using NUnit.Framework;
  
  namespace MonoTests.System.Windows.Forms
  {
  	[TestFixture]	
  	[Category("NotDotNet")]
  	[Category("NotWithXvfb")]
  	[Category("Interactive")]
  	public class SendKeysTest  : TestHelper {
  
  		static Queue keys = new Queue();
  
  		internal struct Keys {
  			public string key;
  			public bool up;
  			public bool shift;
  			public bool ctrl;
  			public bool alt;
  
  			public Keys(string key, bool up, bool shift, bool ctrl, bool alt) {
  				this.key = key;
  				this.up = up;
  				this.shift = shift;
  				this.ctrl = ctrl;
  				this.alt = alt;
  			}
  		}
  
  		internal class Custom: TextBox {
  
  			protected override void OnKeyDown(KeyEventArgs e) {
  				keys.Enqueue(new Keys(e.KeyData.ToString(), false, e.Shift, e.Control, e.Alt));
  				base.OnKeyDown (e);
  			}
  
  			protected override void OnKeyUp(KeyEventArgs e) {
  				keys.Enqueue(new Keys(e.KeyData.ToString(), true, e.Shift, e.Control, e.Alt));
  				base.OnKeyUp (e);
  			}
  		}
  
  		
  		
  		public SendKeysTest() {
  		}
  
  		Form f;
  		Timer t;
  		Custom c;
  
  		[Test]
  		public void SendKeysTest1() {
  			f = new Form();
  			f.Activated +=new EventHandler(SendKeysTest1_activated);
  			c = new Custom();
  			f.Controls.Add(c);
  			Application.Run(f);
  			c.Dispose();
  		}
  
  		private void SendKeysTest1_activated(object sender, EventArgs e) {
  			SendKeys.SendWait("a");
  
  			t = new  Timer();
  			t.Interval = 1;
  			t.Tick +=new EventHandler(SendKeysTest1_tick);
  			t.Start();
  			
  		}
  
  		private void SendKeysTest1_tick(object sender, EventArgs e) {
  			if (f.InvokeRequired) {
  				f.Invoke (new EventHandler (SendKeysTest1_tick), new object [] { sender, e });
  				return;
  			}
  			t.Stop();
  			Assert.AreEqual(2, keys.Count, "#A1");
  			Keys k = (Keys)keys.Dequeue();
  			Assert.IsFalse(k.up, "#A2");
  			Assert.IsFalse(k.shift, "#A3");
  			Assert.IsFalse(k.ctrl, "#A4");
  			Assert.IsFalse(k.alt, "#A5");
  			Assert.AreEqual("A", k.key, "#A6");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsTrue(k.up, "#A2");
  			Assert.IsFalse(k.shift, "#A3");
  			Assert.IsFalse(k.ctrl, "#A4");
  			Assert.IsFalse(k.alt, "#A5");
  			Assert.AreEqual("A", k.key, "#A6");
  			
  			t.Dispose();
  			f.Close ();
  		}
  
  		[SetUp]
  		protected override void SetUp () {
  			keys.Clear();
  			base.SetUp ();
  		}
  
  
  		[Test]
  		public void SendKeysTest2() {
  			f = new Form();
  			f.Activated +=new EventHandler(SendKeysTest2_activated);
  			c = new Custom();
  			f.Controls.Add(c);
  			Application.Run(f);
  			c.Dispose();
  		}
  
  
  		private void SendKeysTest2_activated(object sender, EventArgs e) {
  			SendKeys.SendWait("+(abc){BACKSPACE 2}");
  
  			t = new Timer();
  			t.Interval = 1;
  			t.Tick +=new EventHandler(SendKeysTest2_tick);
  			t.Start();
  			
  		}
  
  		private void SendKeysTest2_tick(object sender, EventArgs e) {
  			t.Stop();
  			if (f.InvokeRequired) {
  				f.Invoke (new EventHandler (SendKeysTest2_tick), new object [] {sender, e});
  				return;
  			}
  			Assert.AreEqual(12, keys.Count, "#A1");
  
  			Keys k = (Keys)keys.Dequeue();
  			Assert.IsFalse(k.up, "#A2");
  			Assert.IsTrue(k.shift, "#A3");
  			Assert.IsFalse(k.ctrl, "#A4");
  			Assert.IsFalse(k.alt, "#A5");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsFalse(k.up, "#A7");
  			Assert.IsTrue(k.shift, "#A8");
  			Assert.IsFalse(k.ctrl, "#A9");
  			Assert.IsFalse(k.alt, "#A10");
  			Assert.AreEqual("A, Shift", k.key, "#A11");
  			
  			k = (Keys)keys.Dequeue();
  			Assert.IsTrue(k.up, "#A12");
  			Assert.IsTrue(k.shift, "#A13");
  			Assert.IsFalse(k.ctrl, "#A14");
  			Assert.IsFalse(k.alt, "#A15");
  			Assert.AreEqual("A, Shift", k.key, "#A16");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsFalse(k.up, "#A17");
  			Assert.IsTrue(k.shift, "#A18");
  			Assert.IsFalse(k.ctrl, "#A19");
  			Assert.IsFalse(k.alt, "#A20");
  			Assert.AreEqual("B, Shift", k.key, "#A21");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsTrue(k.up, "#A22");
  			Assert.IsTrue(k.shift, "#A23");
  			Assert.IsFalse(k.ctrl, "#A24");
  			Assert.IsFalse(k.alt, "#A25");
  			Assert.AreEqual("B, Shift", k.key, "#A26");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsFalse(k.up, "#A27");
  			Assert.IsTrue(k.shift, "#A28");
  			Assert.IsFalse(k.ctrl, "#A28");
  			Assert.IsFalse(k.alt, "#A29");
  			Assert.AreEqual("C, Shift", k.key, "#A30");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsTrue(k.up, "#A31");
  			Assert.IsTrue(k.shift, "#A32");
  			Assert.IsFalse(k.ctrl, "#A33");
  			Assert.IsFalse(k.alt, "#A34");
  			Assert.AreEqual("C, Shift", k.key, "#A35");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsTrue(k.up, "#A36");
  			Assert.IsFalse(k.shift, "#A37");
  			Assert.IsFalse(k.ctrl, "#A38");
  			Assert.IsFalse(k.alt, "#A39");
  			Assert.AreEqual("ShiftKey", k.key, "#A40");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsFalse(k.up, "#b1");
  			Assert.IsFalse(k.shift, "#b2");
  			Assert.IsFalse(k.ctrl, "#b3");
  			Assert.IsFalse(k.alt, "#b4");
  			Assert.AreEqual("Back", k.key, "#b5");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsTrue(k.up, "#b6");
  			Assert.IsFalse(k.shift, "#b7");
  			Assert.IsFalse(k.ctrl, "#b8");
  			Assert.IsFalse(k.alt, "#b9");
  			Assert.AreEqual("Back", k.key, "#b10");
  
  			k = (Keys)keys.Dequeue();
  			Assert.IsFalse(k.up, "#c1");
  			Assert.IsFalse(k.shift, "#c2");
  			Assert.IsFalse(k.ctrl, "#c3");
  			Assert.IsFalse(k.alt, "#c4");
  			Assert.AreEqual("Back", k.key, "#c5");
  
  
gt: 			k = (Keys)keys.Dequeue();