Merge pull request #325 from adbre/iss5464
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / ToolStripMenuItemTest.cs
1 //
2 // ToolStripMenuItemTest.cs
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
11 // 
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 // 
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 //
23 // Copyright (c) 2006 Jonathan Pobst
24 //
25 // Authors:
26 //      Jonathan Pobst (monkey@jpobst.com)
27 //
28 #if NET_2_0
29 using System;
30 using System.Collections.Generic;
31 using System.Text;
32 using NUnit.Framework;
33 using System.Drawing;
34 using System.Windows.Forms;
35 using System.ComponentModel;
36
37 namespace MonoTests.System.Windows.Forms
38 {
39         [TestFixture]
40         public class ToolStripMenuItemTest : TestHelper
41         {
42                 [Test]
43                 public void Constructor ()
44                 {
45                         ToolStripMenuItem tsi = new ToolStripMenuItem ();
46
47                         Assert.AreEqual (false, tsi.Checked, "A1");
48                         Assert.AreEqual (false, tsi.CheckOnClick, "A2");
49                         Assert.AreEqual (CheckState.Unchecked, tsi.CheckState, "A3");
50                         Assert.AreEqual (true, tsi.Enabled, "A4");
51                         Assert.AreEqual (false, tsi.IsMdiWindowListEntry, "A5");
52                         Assert.AreEqual (ToolStripItemOverflow.Never, tsi.Overflow, "A6");
53                         Assert.AreEqual (null, tsi.ShortcutKeyDisplayString, "A7");
54                         Assert.AreEqual (Keys.None, tsi.ShortcutKeys, "A8");
55                         Assert.AreEqual (true, tsi.ShowShortcutKeys, "A9");
56                         Assert.AreEqual (SystemColors.ControlText, tsi.ForeColor, "A9-1");
57                         
58                         Assert.AreEqual ("System.Windows.Forms.ToolStripMenuItem+ToolStripMenuItemAccessibleObject", tsi.AccessibilityObject.GetType ().ToString (), "A10");
59                         int count = 0;
60                         EventHandler oc = new EventHandler (delegate (object sender, EventArgs e) { count++; });
61                         Image i = new Bitmap (1, 1);
62
63                         tsi = new ToolStripMenuItem (i);
64                         tsi.PerformClick ();
65                         Assert.AreEqual (null, tsi.Text, "A10-1");
66                         Assert.AreSame (i, tsi.Image, "A10-2");
67                         Assert.AreEqual (0, count, "A10-3");
68                         Assert.AreEqual (string.Empty, tsi.Name, "A10-4");
69
70                         tsi = new ToolStripMenuItem ("Text");
71                         tsi.PerformClick ();
72                         Assert.AreEqual ("Text", tsi.Text, "A10-5");
73                         Assert.AreSame (null, tsi.Image, "A11");
74                         Assert.AreEqual (0, count, "A12");
75                         Assert.AreEqual (string.Empty, tsi.Name, "A13");
76
77                         tsi = new ToolStripMenuItem ("Text", i);
78                         tsi.PerformClick ();
79                         Assert.AreEqual ("Text", tsi.Text, "A14");
80                         Assert.AreSame (i, tsi.Image, "A15");
81                         Assert.AreEqual (0, count, "A16");
82                         Assert.AreEqual (string.Empty, tsi.Name, "A17");
83
84                         tsi = new ToolStripMenuItem ("Text", i, oc);
85                         tsi.PerformClick ();
86                         Assert.AreEqual ("Text", tsi.Text, "A18");
87                         Assert.AreSame (i, tsi.Image, "A19");
88                         Assert.AreEqual (1, count, "A20");
89                         Assert.AreEqual (string.Empty, tsi.Name, "A21");
90
91                         tsi = new ToolStripMenuItem ("Text", i, oc, "Name");
92                         tsi.PerformClick ();
93                         Assert.AreEqual ("Text", tsi.Text, "A22");
94                         Assert.AreSame (i, tsi.Image, "A23");
95                         Assert.AreEqual (2, count, "A24");
96                         Assert.AreEqual ("Name", tsi.Name, "A25");
97                 }
98
99                 [Test]
100                 public void BehaviorKeyboardShortcuts ()
101                 {
102                         ExposeProtectedMethods tsmi = new ExposeProtectedMethods ();
103                         tsmi.ShortcutKeys = Keys.Control | Keys.D;
104
105                         Message m = new Message ();
106                         Assert.AreEqual (false, tsmi.PublicProcessCmdKey (ref m, Keys.D), "A1");
107                         Assert.AreEqual (false, tsmi.PublicProcessCmdKey (ref m, Keys.Control), "A2");
108                         Assert.AreEqual (true, tsmi.PublicProcessCmdKey (ref m, Keys.Control | Keys.D), "A3");
109                         Assert.AreEqual (false, tsmi.PublicProcessCmdKey (ref m, Keys.A), "A4");
110                         Assert.AreEqual (false, tsmi.PublicProcessCmdKey (ref m, Keys.Control | Keys.A), "A5");
111                         
112                         tsmi.ShowShortcutKeys = false;
113                         Assert.AreEqual (true, tsmi.PublicProcessCmdKey (ref m, Keys.Control | Keys.D), "A6");
114                         
115                         tsmi.ShortcutKeyDisplayString = "Moose";
116                         Assert.AreEqual (true, tsmi.PublicProcessCmdKey (ref m, Keys.Control | Keys.D), "A7");
117                 }
118                 
119                 [Test]
120                 public void BehaviorMdiWindowMenuItem ()
121                 {
122                         Form f = new Form ();
123                         f.ShowInTaskbar = false;
124                         f.IsMdiContainer = true;
125                         Form c1 = new Form ();
126                         c1.MdiParent = f;
127                         Form c2 = new Form ();
128                         c2.MdiParent = f;                               
129                 
130                         MenuStrip ms = new MenuStrip ();
131                         ToolStripMenuItem tsmi = (ToolStripMenuItem)ms.Items.Add ("Window");
132                         f.Controls.Add (ms);
133                         ms.MdiWindowListItem = tsmi;
134                         
135                         f.MainMenuStrip = ms;
136
137                         c1.Show ();
138                         f.Show ();
139                         Assert.AreEqual (true, (tsmi.DropDownItems[0] as ToolStripMenuItem).IsMdiWindowListEntry, "R1");
140                         
141                         f.Close ();
142                 }
143                 
144                 [Test]
145                 public void BehaviorShortcutText ()
146                 {
147                         ToolStripMenuItem tsmi = new ToolStripMenuItem ();
148                         
149                         tsmi.ShortcutKeys = Keys.Control | Keys.O;
150                         
151                         Assert.AreEqual (null, tsmi.ShortcutKeyDisplayString, "A1");
152                         
153                         tsmi.ShortcutKeyDisplayString = "Test String";
154                         Assert.AreEqual ("Test String", tsmi.ShortcutKeyDisplayString, "A2");
155
156                         tsmi.ShortcutKeys = Keys.Control | Keys.P;
157                         Assert.AreEqual ("Test String", tsmi.ShortcutKeyDisplayString, "A3");
158
159                         tsmi.ShortcutKeyDisplayString = string.Empty;
160                         Assert.AreEqual (string.Empty, tsmi.ShortcutKeyDisplayString, "A4");
161
162                         tsmi.ShortcutKeyDisplayString = null;
163                         Assert.AreEqual (null, tsmi.ShortcutKeyDisplayString, "A5");
164                 }
165                 
166                 [Test]
167                 [NUnit.Framework.Category ("NotWorking")]
168                 public void GetCurrentParent ()
169                 {
170                         ToolStripMenuItem tsmiFile = new ToolStripMenuItem ("File");
171                         ToolStripMenuItem tsmiHelp = new ToolStripMenuItem ("Help");
172                         ToolStripMenuItem tsmiQuit = new ToolStripMenuItem ("Quit");
173                         ToolStripMenuItem tsmiAbout = new ToolStripMenuItem ("About");
174                         tsmiFile.DropDownItems.Add (tsmiQuit);
175                         tsmiHelp.DropDownItems.Add (tsmiAbout);
176                         MenuStrip menu = new MenuStrip ();
177                         menu.Items.Add (tsmiFile);
178                         menu.Items.Add (tsmiHelp);
179                         
180                         ToolStrip parent = tsmiFile.GetCurrentParent ();
181                         Assert.IsNotNull (parent, "A1");
182                         Assert.AreEqual (parent.GetType ().Name, typeof (MenuStrip).Name, "A2");
183                         Assert.AreEqual (parent, menu, "A3");
184                         
185                         //because it's not visible?:
186                         Assert.IsNull (tsmiQuit.GetCurrentParent (), "A4");
187                 }
188                 
189                 [Test]
190                 public void Owner ()
191                 {
192                         ToolStripMenuItem tsmiFile = new ToolStripMenuItem ("File");
193                         ToolStripMenuItem tsmiHelp = new ToolStripMenuItem ("Help");
194                         ToolStripMenuItem tsmiQuit = new ToolStripMenuItem ("Quit");
195                         ToolStripMenuItem tsmiNew = new ToolStripMenuItem ("New");
196                         ToolStripMenuItem tsmiAbout = new ToolStripMenuItem ("About");
197                         tsmiQuit.DropDownItems.Add (tsmiNew);
198                         tsmiFile.DropDownItems.Add (tsmiQuit);
199                         tsmiHelp.DropDownItems.Add (tsmiAbout);
200                         MenuStrip menu = new MenuStrip ();
201                         menu.Items.Add (tsmiFile);
202                         menu.Items.Add (tsmiHelp);
203                         
204                         Assert.IsNotNull (tsmiFile.Owner);
205                         Assert.AreEqual (tsmiFile.Owner.GetType().Name, typeof (MenuStrip).Name);
206                         Assert.AreEqual (tsmiFile.Owner, menu);
207
208                         Assert.IsNotNull (tsmiQuit.Owner);
209                         Assert.AreEqual (tsmiQuit.Owner.GetType().Name, typeof (ToolStripDropDownMenu).Name);
210                         Assert.AreEqual (tsmiQuit.Owner, tsmiFile.DropDown);
211                 }
212                 
213                 [Test]
214                 public void OwnerItem ()
215                 {
216                         ToolStripMenuItem tsmiFile = new ToolStripMenuItem ("File");
217                         ToolStripMenuItem tsmiHelp = new ToolStripMenuItem ("Help");
218                         ToolStripMenuItem tsmiQuit = new ToolStripMenuItem ("Quit");
219                         ToolStripMenuItem tsmiNew = new ToolStripMenuItem ("New");
220                         ToolStripMenuItem tsmiAbout = new ToolStripMenuItem ("About");
221                         tsmiQuit.DropDownItems.Add (tsmiNew);
222                         tsmiFile.DropDownItems.Add (tsmiQuit);
223                         tsmiHelp.DropDownItems.Add (tsmiAbout);
224                         MenuStrip menu = new MenuStrip ();
225                         menu.Items.Add (tsmiFile);
226                         menu.Items.Add (tsmiHelp);
227
228                         Assert.IsNull (tsmiFile.OwnerItem);
229
230                         Assert.IsNotNull (tsmiQuit.OwnerItem);
231                         Assert.AreEqual (tsmiQuit.OwnerItem.GetType ().Name, typeof (ToolStripMenuItem).Name);
232                         Assert.AreEqual (tsmiQuit.OwnerItem, tsmiFile);
233                 }
234                 
235                 [Test]
236                 public void ToolStripDropDownButton_SelectChild ()
237                 {
238                         ToolStripDropDownButton tsddb = new ToolStripDropDownButton ();
239                         tsddb.DropDownClosed += Helper.FireEvent1;
240                         tsddb.DropDownItemClicked += Helper.FireEvent2;
241                         tsddb.DropDownOpened += Helper.FireEvent1;
242                         tsddb.DropDownOpening += Helper.FireEvent1;
243                         tsddb.Click += Helper.FireEvent1;
244
245                         Helper item1 = new Helper ();
246                         Helper item2 = new Helper ();
247
248                         tsddb.DropDownItems.Add (item1);
249                         tsddb.DropDownItems.Add (item2);
250                         ToolStripDropDownButton_SelectChildVerify (item1);
251                         ToolStrip ts = new ToolStrip ();
252                         ts.Items.Add (tsddb);
253                         ToolStripDropDownButton_SelectChildVerify (item2);
254                 }
255                 
256                 private static void ToolStripDropDownButton_SelectChildVerify (Helper item)
257                 {
258                         Assert.IsNull (item.MyParent);
259                         Assert.IsTrue (item.CanSelect);
260                         Assert.IsFalse (item.Selected);
261                         item.Select ();
262                         Assert.IsTrue (item.Selected);
263                         Assert.IsFalse (Helper.eventFired);
264                 }
265                 
266                 private class Helper : ToolStripMenuItem
267                 {
268                         internal Helper () {
269                                 this.DropDownClosed += Helper.FireEvent1;
270                                 this.DropDownItemClicked += Helper.FireEvent2;
271                                 this.DropDownOpened += Helper.FireEvent1;
272                                 this.DropDownOpening += Helper.FireEvent1;
273                                 this.Click += Helper.FireEvent1;
274                         }
275                         
276                         internal ToolStrip MyParent { get { return this.Parent; } }
277
278                         internal static bool eventFired = false;
279                         internal static void FireEvent1 (object o, EventArgs args) { eventFired = true; }
280                         internal static void FireEvent2 (object o, ToolStripItemClickedEventArgs args) { FireEvent1 (null, null); }
281                 }
282                 
283                 private class ExposeProtectedMethods : ToolStripMenuItem
284                 {
285                         public bool PublicProcessCmdKey (ref Message m, Keys keys)
286                         {
287                                 return this.ProcessCmdKey (ref m, keys);
288                         }
289                 }
290
291                 [Test]
292                 public void EventsTest ()
293                 {
294                         ToolStripMenuItem tsmi = new ToolStripMenuItem ("Sample");
295                         tsmi.CheckStateChanged += new EventHandler (tsmi_CheckStateChanged);
296                         tsmi.CheckedChanged += new EventHandler (tsmi_CheckedChanged);
297                         event_log = String.Empty;
298
299                         Assert.AreEqual (false, tsmi.Checked, "#A1");
300                         Assert.AreEqual (CheckState.Unchecked, tsmi.CheckState, "#A2");
301
302                         tsmi.Checked = true;
303                         Assert.AreEqual (true, tsmi.Checked, "#B1");
304                         Assert.AreEqual (CheckState.Checked, tsmi.CheckState, "#B2");
305                         Assert.AreEqual ("CheckedChanged=True;CheckStateChanged=Checked;", event_log, "#B3");
306
307                         event_log = String.Empty;
308
309                         tsmi.CheckState = CheckState.Unchecked;
310                         Assert.AreEqual (false, tsmi.Checked, "#C1");
311                         Assert.AreEqual (CheckState.Unchecked, tsmi.CheckState, "#C2");
312                         Assert.AreEqual ("CheckedChanged=False;CheckStateChanged=Unchecked;", event_log, "#C3");
313                 }
314
315                 string event_log;
316
317                 void tsmi_CheckedChanged (object sender, EventArgs e)
318                 {
319                         event_log += "CheckedChanged=" + ((ToolStripMenuItem)sender).Checked + ";";
320                 }
321
322                 void tsmi_CheckStateChanged (object sender, EventArgs e)
323                 {
324                         event_log += "CheckStateChanged=" + ((ToolStripMenuItem)sender).CheckState + ";";
325                 }
326         }
327 }
328 #endif