* Test/System.Windows.Forms/TabControlTest.cs: Add test for
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / TabControlTest.cs
1 //
2 // TabControlTest.cs: Test cases for TabControl.
3 //
4 // Author:
5 //   Ritvik Mayank (mritvik@novell.com)
6 //
7 // (C) 2005 Novell, Inc. (http://www.novell.com)
8 //
9
10 using System;
11 using System.Drawing;
12 using System.Windows.Forms;
13
14 using NUnit.Framework;
15
16 namespace MonoTests.System.Windows.Forms
17 {
18         [TestFixture]
19         public class TabControlTest : TestHelper
20         {
21                 private int _selected_index_changed = 0;
22
23                 private class TabControlPoker : TabControl {
24
25                         public bool CheckIsInputKey (Keys key)
26                         {
27                                 return IsInputKey (key);
28                         }
29
30                         protected override void WndProc (ref Message m)
31                         {
32                                 base.WndProc (ref m);
33                         }
34                 }
35
36                 [SetUp]
37                 protected override void SetUp () {
38                         _selected_index_changed = 0;
39                         base.SetUp ();
40                 }
41
42                 [Test]
43                 public void TabControlPropertyTest ()
44                 {
45                         Form myForm = new Form ();
46                         myForm.ShowInTaskbar = false;
47                         TabControl myTabControl = new TabControl ();
48                         myTabControl.Visible = true;
49                         myTabControl.Name = "Mono TabControl";
50                 
51                         // A 
52                         Assert.AreEqual (TabAlignment.Top, myTabControl.Alignment, "A1");
53                         Assert.AreEqual (TabAppearance.Normal, myTabControl.Appearance, "#A2");
54                 
55                         // D 
56                         Assert.AreEqual (TabDrawMode.Normal, myTabControl.DrawMode, "#D5");
57                 
58                         // H
59                         Assert.AreEqual (false, myTabControl.HotTrack, "#H1");
60                 
61                         // I 
62                         Assert.AreEqual (null, myTabControl.ImageList, "#I1");
63
64                         // M 
65                         Assert.AreEqual (false, myTabControl.Multiline, "#M1");
66                 
67                         // P
68                         Assert.AreEqual (6, myTabControl.Padding.X, "#P1");
69                         Assert.AreEqual (3, myTabControl.Padding.Y, "#P1");
70
71                         // R
72                         Assert.AreEqual (0, myTabControl.RowCount, "#R1");
73
74                         // S
75                         Assert.AreEqual (-1, myTabControl.SelectedIndex, "#S1");
76                         Assert.AreEqual (null, myTabControl.SelectedTab, "#S2");
77                         Assert.AreEqual (false, myTabControl.ShowToolTips, "#S3");
78                         Assert.AreEqual (TabSizeMode.Normal, myTabControl.SizeMode, "#S4");
79
80                         // T
81                         Assert.AreEqual (0, myTabControl.TabCount, "#T1");
82                         Assert.AreEqual (0, myTabControl.TabPages.Count, "#T2");
83
84                         myForm.Dispose ();
85                 }
86
87                 [Test]
88                 [Category ("NotWorking")]
89                 public void GetTabRectTest ()
90                 {
91                         TabControl myTabControl = new TabControl ();
92                         TabPage myTabPage = new TabPage();
93                         myTabControl.Controls.Add(myTabPage);
94                         myTabPage.TabIndex = 0;
95                         Rectangle myTabRect = myTabControl.GetTabRect (0);
96                         Assert.AreEqual (2, myTabRect.X, "#GetT1");
97                         Assert.AreEqual (2, myTabRect.Y, "#GetT2");
98                         Assert.AreEqual (42, myTabRect.Width, "#GetT3");
99                         // It is environment dependent
100                         //Assert.AreEqual (18, myTabRect.Height, "#GetT4");
101                 }
102
103                 [Test]
104                 public void ToStringTest ()
105                 {
106                         TabControl myTabControl = new TabControl ();
107                         Assert.AreEqual ("System.Windows.Forms.TabControl, TabPages.Count: 0", myTabControl.ToString(), "#1");
108                 }
109
110                 [Test]
111                 public void ClearTabPagesTest ()
112                 {
113                         // no tab pages
114                         TabControl tab = new TabControl ();
115                         tab.TabPages.Clear ();
116                         Assert.AreEqual (-1, tab.SelectedIndex, "#A1");
117                         Assert.AreEqual (0, tab.TabPages.Count, "#A2");
118
119                         // single tab page
120                         tab.Controls.Add (new TabPage ());
121                         Assert.AreEqual (0, tab.SelectedIndex, "#B1");
122                         Assert.AreEqual (1, tab.TabPages.Count, "#B2");
123                         tab.TabPages.Clear();
124                         Assert.AreEqual (-1, tab.SelectedIndex, "#B3");
125                         Assert.AreEqual (0, tab.TabPages.Count, "#B4");
126
127                         // multiple tab pages
128                         tab.Controls.Add (new TabPage ());
129                         tab.Controls.Add (new TabPage ());
130                         tab.Controls.Add (new TabPage ());
131                         Assert.AreEqual (0, tab.SelectedIndex, "#C1");
132                         Assert.AreEqual (3, tab.TabPages.Count, "#C2");
133                         tab.SelectedIndex = 1;
134                         tab.TabPages.Clear ();
135                         Assert.AreEqual (-1, tab.SelectedIndex, "#C3");
136                         Assert.AreEqual (0, tab.TabPages.Count, "#C4");
137                 }
138
139                 [Test]
140                 [Category ("NotWorking")]
141                 public void Controls_Remove_HandleCreated ()
142                 {
143                         TabControl tab = new TabControl ();
144                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
145
146                         Form form = new Form ();
147                         form.ShowInTaskbar = false;
148                         form.Controls.Add (tab);
149                         form.Show ();
150
151                         tab.Controls.Add (new TabPage ());
152                         tab.Controls.Add (new TabPage ());
153                         tab.Controls.Add (new TabPage ());
154                         tab.Controls.Add (new TabPage ());
155                         tab.Controls.Add (new TabPage ());
156                         tab.Controls.Add (new TabPage ());
157
158                         Assert.AreEqual (0, tab.SelectedIndex, "#A1");
159                         Assert.AreEqual (6, tab.TabPages.Count, "#A2");
160                         Assert.AreEqual (0, _selected_index_changed, "#A3");
161
162                         // remove selected tab
163                         tab.SelectedIndex = 2;
164                         Assert.AreEqual (2, tab.SelectedIndex, "#B1");
165                         Assert.AreEqual (1, _selected_index_changed, "#B2");
166                         tab.Controls.RemoveAt (2);
167 #if NET_2_0
168                         Assert.AreEqual (0, tab.SelectedIndex, "#B3");
169 #else
170                         Assert.AreEqual (1, tab.SelectedIndex, "#B3");
171 #endif
172                         Assert.AreEqual (5, tab.TabPages.Count, "#B4");
173                         Assert.AreEqual (2, _selected_index_changed, "#B5");
174
175                         // remove not-selected tab
176 #if NET_2_0
177                         Assert.AreEqual (0, tab.SelectedIndex, "#C1");
178 #else
179                         Assert.AreEqual (1, tab.SelectedIndex, "#C1");
180 #endif
181                         Assert.AreEqual (2, _selected_index_changed, "#C2");
182                         tab.Controls.RemoveAt (3);
183 #if NET_2_0
184                         Assert.AreEqual (0, tab.SelectedIndex, "#C3");
185 #else
186                         Assert.AreEqual (2, tab.SelectedIndex, "#C3");
187 #endif
188                         Assert.AreEqual (4, tab.TabPages.Count, "#C4");
189 #if NET_2_0
190                         Assert.AreEqual (2, _selected_index_changed, "#C5");
191 #else
192                         Assert.AreEqual (3, _selected_index_changed, "#C5");
193 #endif
194
195                         // remove last tab
196                         tab.Controls.RemoveAt (3);
197 #if NET_2_0
198                         Assert.AreEqual (0, tab.SelectedIndex, "#D1");
199 #else
200                         Assert.AreEqual (2, tab.SelectedIndex, "#D1");
201 #endif
202                         Assert.AreEqual (3, tab.TabPages.Count, "#D2");
203 #if NET_2_0
204                         Assert.AreEqual (2, _selected_index_changed, "#D3");
205 #else
206                         Assert.AreEqual (3, _selected_index_changed, "#D3");
207 #endif
208
209                         // remove first tab
210                         tab.Controls.RemoveAt (0);
211                         Assert.AreEqual (0, tab.SelectedIndex, "#E1");
212                         Assert.AreEqual (2, tab.TabPages.Count, "#E2");
213 #if NET_2_0
214                         Assert.AreEqual (3, _selected_index_changed, "#E3");
215 #else
216                         Assert.AreEqual (4, _selected_index_changed, "#E3");
217 #endif
218
219                         // remove remaining tabs
220                         tab.Controls.RemoveAt (1);
221                         tab.Controls.RemoveAt (0);
222                         Assert.AreEqual (-1, tab.SelectedIndex, "#F1");
223                         Assert.AreEqual (0, tab.TabPages.Count, "#F2");
224 #if NET_2_0
225                         Assert.AreEqual (4, _selected_index_changed, "#F3");
226 #else
227                         Assert.AreEqual (5, _selected_index_changed, "#F3");
228 #endif
229                 }
230
231                 [Test]
232                 [Category ("NotWorking")]
233                 public void Controls_Remove_HandleNotCreated ()
234                 {
235                         TabControl tab = new TabControl ();
236                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
237                         tab.Controls.Add (new TabPage ());
238                         tab.Controls.Add (new TabPage ());
239                         tab.Controls.Add (new TabPage ());
240                         tab.Controls.Add (new TabPage ());
241                         tab.Controls.Add (new TabPage ());
242                         tab.Controls.Add (new TabPage ());
243
244                         Assert.AreEqual (-1, tab.SelectedIndex, "#A1");
245                         Assert.AreEqual (6, tab.TabPages.Count, "#A2");
246                         Assert.AreEqual (0, _selected_index_changed, "#A3");
247
248                         // remove selected tab
249                         tab.SelectedIndex = 2;
250                         Assert.AreEqual (2, tab.SelectedIndex, "#B1");
251 #if NET_2_0
252                         Assert.AreEqual (0, _selected_index_changed, "#B2");
253 #else
254                         Assert.AreEqual (1, _selected_index_changed, "#B2");
255 #endif
256                         tab.Controls.RemoveAt (2);
257 #if NET_2_0
258                         Assert.AreEqual (0, tab.SelectedIndex, "#B3");
259 #else
260                         Assert.AreEqual (1, tab.SelectedIndex, "#B3");
261 #endif
262                         Assert.AreEqual (5, tab.TabPages.Count, "#B4");
263 #if NET_2_0
264                         Assert.AreEqual (0, _selected_index_changed, "#B5");
265 #else
266                         Assert.AreEqual (2, _selected_index_changed, "#B5");
267 #endif
268
269                         // remove not-selected tab
270                         tab.Controls.RemoveAt (3);
271 #if NET_2_0
272                         Assert.AreEqual (0, tab.SelectedIndex, "#C3");
273 #else
274                         Assert.AreEqual (2, tab.SelectedIndex, "#C3");
275 #endif
276                         Assert.AreEqual (4, tab.TabPages.Count, "#C4");
277 #if NET_2_0
278                         Assert.AreEqual (0, _selected_index_changed, "#C5");
279 #else
280                         Assert.AreEqual (3, _selected_index_changed, "#C5");
281 #endif
282
283                         // remove last tab
284                         tab.Controls.RemoveAt (3);
285 #if NET_2_0
286                         Assert.AreEqual (0, tab.SelectedIndex, "#D1");
287 #else
288                         Assert.AreEqual (2, tab.SelectedIndex, "#D1");
289 #endif
290                         Assert.AreEqual (3, tab.TabPages.Count, "#D2");
291 #if NET_2_0
292                         Assert.AreEqual (0, _selected_index_changed, "#D3");
293 #else
294                         Assert.AreEqual (3, _selected_index_changed, "#D3");
295 #endif
296
297                         // remove first tab
298                         tab.Controls.RemoveAt (0);
299                         Assert.AreEqual (0, tab.SelectedIndex, "#E1");
300                         Assert.AreEqual (2, tab.TabPages.Count, "#E2");
301 #if NET_2_0
302                         Assert.AreEqual (0, _selected_index_changed, "#E3");
303 #else
304                         Assert.AreEqual (4, _selected_index_changed, "#E3");
305 #endif
306
307                         // remove remaining tabs
308                         tab.Controls.RemoveAt (1);
309                         tab.Controls.RemoveAt (0);
310                         Assert.AreEqual (0, tab.SelectedIndex, "#F1");
311                         Assert.AreEqual (0, tab.TabPages.Count, "#F2");
312 #if NET_2_0
313                         Assert.AreEqual (0, _selected_index_changed, "#F3");
314 #else
315                         Assert.AreEqual (4, _selected_index_changed, "#F3");
316 #endif
317
318                         Form form = new Form ();
319                         form.ShowInTaskbar = false;
320                         form.Controls.Add (tab);
321                         form.Show ();
322                         Assert.AreEqual (-1, tab.SelectedIndex, "#G1");
323                         Assert.AreEqual (0, tab.TabPages.Count, "#G2");
324 #if NET_2_0
325                         Assert.AreEqual (0, _selected_index_changed, "#G3");
326 #else
327                         Assert.AreEqual (4, _selected_index_changed, "#G3");
328 #endif
329                 }
330
331                 [Test]
332                 public void SelectedIndex ()
333                 {
334                         TabControl tab = new TabControl ();
335                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
336                         tab.Controls.Add (new TabPage ());
337                         tab.Controls.Add (new TabPage ());
338
339                         tab.SelectedIndex = 0;
340 #if NET_2_0
341                         Assert.AreEqual (0, _selected_index_changed, "#A1");
342 #else
343                         Assert.AreEqual (1, _selected_index_changed, "#A1");
344 #endif
345                         Assert.AreEqual (0, tab.SelectedIndex, "#A2");
346
347                         tab.SelectedIndex = -1;
348 #if NET_2_0
349                         Assert.AreEqual (0, _selected_index_changed, "#B1");
350 #else
351                         Assert.AreEqual (2, _selected_index_changed, "#B1");
352 #endif
353                         Assert.AreEqual (-1, tab.SelectedIndex, "#B2");
354
355                         tab.SelectedIndex = 1;
356 #if NET_2_0
357                         Assert.AreEqual (0, _selected_index_changed, "#C1");
358 #else
359                         Assert.AreEqual (3, _selected_index_changed, "#C1");
360 #endif
361                         Assert.AreEqual (1, tab.SelectedIndex, "#C2");
362
363                         tab.SelectedIndex = 1;
364 #if NET_2_0
365                         Assert.AreEqual (0, _selected_index_changed, "#D1");
366 #else
367                         Assert.AreEqual (3, _selected_index_changed, "#D1");
368 #endif
369                         Assert.AreEqual (1, tab.SelectedIndex, "#D2");
370
371
372                         tab.SelectedIndex = 6;
373 #if NET_2_0
374                         Assert.AreEqual (0, _selected_index_changed, "#E1");
375 #else
376                         Assert.AreEqual (4, _selected_index_changed, "#E1");
377 #endif
378                         Assert.AreEqual (6, tab.SelectedIndex, "#E2");
379
380                         tab.SelectedIndex = 6;
381 #if NET_2_0
382                         Assert.AreEqual (0, _selected_index_changed, "#E31");
383 #else
384                         Assert.AreEqual (4, _selected_index_changed, "#E3");
385 #endif
386                         Assert.AreEqual (6, tab.SelectedIndex, "#E4");
387
388                         Form form = new Form ();
389                         form.ShowInTaskbar = false;
390                         form.Controls.Add (tab);
391
392                         form.Show ();
393
394                         Assert.AreEqual (0, tab.SelectedIndex, "#E5");
395
396                         tab.SelectedIndex = 0;
397 #if NET_2_0
398                         Assert.AreEqual (0, _selected_index_changed, "#F1");
399 #else
400                         Assert.AreEqual (4, _selected_index_changed, "#F1");
401 #endif
402                         Assert.AreEqual (0, tab.SelectedIndex, "#F2");
403
404                         tab.SelectedIndex = -1;
405 #if NET_2_0
406                         Assert.AreEqual (1, _selected_index_changed, "#G1");
407 #else
408                         Assert.AreEqual (5, _selected_index_changed, "#G1");
409 #endif
410                         Assert.AreEqual (-1, tab.SelectedIndex, "#G2");
411
412                         tab.SelectedIndex = 1;
413 #if NET_2_0
414                         Assert.AreEqual (2, _selected_index_changed, "#H1");
415 #else
416                         Assert.AreEqual (6, _selected_index_changed, "#H1");
417 #endif
418                         Assert.AreEqual (1, tab.SelectedIndex, "#H2");
419
420                         tab.SelectedIndex = 1;
421 #if NET_2_0
422                         Assert.AreEqual (2, _selected_index_changed, "#I1");
423 #else
424                         Assert.AreEqual (6, _selected_index_changed, "#I1");
425 #endif
426                         Assert.AreEqual (1, tab.SelectedIndex, "#I2");
427
428                         form.Dispose ();
429                 }
430
431                 [Test] // bug #78395
432                 public void SelectedIndex_Ignore ()
433                 {
434                         TabControl c = new TabControl ();
435                         c.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
436                         c.SelectedIndex = 0;
437 #if NET_2_0
438                         Assert.AreEqual (0, _selected_index_changed, "#1");
439 #else
440                         Assert.AreEqual (1, _selected_index_changed, "#1");
441 #endif
442
443                         c.TabPages.Add (new TabPage ());
444                         c.TabPages.Add (new TabPage ());
445                         Assert.AreEqual (0, c.SelectedIndex, "#2");
446                         Form f = new Form ();
447                         f.ShowInTaskbar = false;
448                         f.Controls.Add (c);
449                         f.Show ();
450 #if NET_2_0
451                         Assert.AreEqual (0, _selected_index_changed, "#3");
452 #else
453                         Assert.AreEqual (1, _selected_index_changed, "#3");
454 #endif
455                         c.SelectedIndex = 2; // beyond the pages - ignored
456 #if NET_2_0
457                         Assert.AreEqual (1, _selected_index_changed, "#4");
458 #else
459                         Assert.AreEqual (2, _selected_index_changed, "#4");
460 #endif
461                         Assert.AreEqual (0, c.SelectedIndex, "#4");
462                         f.Dispose ();
463                 }
464
465                 [Test]
466                 public void SelectedIndex_Negative ()
467                 {
468                         Form form = new Form ();
469                         form.ShowInTaskbar = false;
470                         TabControl tab = new TabControl ();
471                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
472                         form.Controls.Add (tab);
473
474                         Assert.AreEqual (-1, tab.SelectedIndex, "#A1");
475                         tab.SelectedIndex = -1;
476                         Assert.AreEqual (-1, tab.SelectedIndex, "#A2");
477                         Assert.AreEqual (0, _selected_index_changed, "#A3");
478
479                         try {
480                                 tab.SelectedIndex = -2;
481                                 Assert.Fail ("#B1");
482 #if NET_2_0
483                         } catch (ArgumentOutOfRangeException ex) {
484                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
485                                 Assert.IsNotNull (ex.Message, "#B3");
486                                 Assert.IsTrue (ex.Message.IndexOf ("'-2'") != -1, "#B4");
487                                 Assert.IsTrue (ex.Message.IndexOf ("'SelectedIndex'") != -1, "#B5");
488                                 Assert.IsTrue (ex.Message.IndexOf ("-1") != -1, "#B6");
489                                 Assert.IsNotNull (ex.ParamName, "#B7");
490                                 Assert.AreEqual ("SelectedIndex", ex.ParamName, "#B8");
491                         }
492 #else
493                         } catch (ArgumentException ex) {
494                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
495                                 Assert.IsNotNull (ex.Message, "#B3");
496                                 Assert.IsTrue (ex.Message.IndexOf ("'-2'") != -1, "#B4");
497                                 Assert.IsTrue (ex.Message.IndexOf ("'value'") != -1, "#B5");
498                                 Assert.IsTrue (ex.Message.IndexOf ("-1") != -1, "#B6");
499                                 Assert.IsNull (ex.ParamName, "#B7");
500                         }
501 #endif
502
503                         Assert.AreEqual (0, _selected_index_changed, "#C1");
504                         Assert.AreEqual (-1, tab.SelectedIndex, "#C2");
505                         form.Show ();
506                         Assert.AreEqual (0, _selected_index_changed, "#C3");
507                         Assert.AreEqual (-1, tab.SelectedIndex, "#C4");
508
509                         try {
510                                 tab.SelectedIndex = -5;
511                                 Assert.Fail ("#D1");
512 #if NET_2_0
513                         } catch (ArgumentOutOfRangeException ex) {
514                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#D2");
515                                 Assert.IsNotNull (ex.Message, "#D3");
516                                 Assert.IsTrue (ex.Message.IndexOf ("'-5'") != -1, "#D4");
517                                 Assert.IsTrue (ex.Message.IndexOf ("'SelectedIndex'") != -1, "#D5");
518                                 Assert.IsTrue (ex.Message.IndexOf ("-1") != -1, "#D6");
519                                 Assert.IsNotNull (ex.ParamName, "#D7");
520                                 Assert.AreEqual ("SelectedIndex", ex.ParamName, "#D8");
521                         }
522 #else
523                         } catch (ArgumentException ex) {
524                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
525                                 Assert.IsNotNull (ex.Message, "#D3");
526                                 Assert.IsTrue (ex.Message.IndexOf ("'-5'") != -1, "#D4");
527                                 Assert.IsTrue (ex.Message.IndexOf ("'value'") != -1, "#D5");
528                                 Assert.IsTrue (ex.Message.IndexOf ("-1") != -1, "#D6");
529                                 Assert.IsNull (ex.ParamName, "#D7");
530                         }
531 #endif
532
533                         Assert.AreEqual (-1, tab.SelectedIndex, "#E1");
534                         tab.SelectedIndex = -1;
535                         Assert.AreEqual (-1, tab.SelectedIndex, "#E2");
536                         Assert.AreEqual (0, _selected_index_changed, "#E3");
537
538                         form.Dispose ();
539                 }
540
541                 [Test]
542                 [Category ("NotWorking")]
543                 public void InputKeyTest ()
544                 {
545                         TabControlPoker p = new TabControlPoker ();
546
547                         foreach (Keys key in Enum.GetValues (typeof (Keys))) {
548                                 switch (key) {
549                                 case Keys.PageUp:
550                                 case Keys.PageDown:
551                                 case Keys.End:
552                                 case Keys.Home:
553                                         continue;
554                                 }
555                                 Assert.IsFalse (p.CheckIsInputKey (key), "FALSE- " + key);
556                         }
557
558                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageUp), "TRUE-pageup");
559                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageDown), "TRUE-pagedown");
560                         Assert.IsTrue (p.CheckIsInputKey (Keys.End), "TRUE-end");
561                         Assert.IsTrue (p.CheckIsInputKey (Keys.Home), "TRUE-home");
562
563                         // Create the handle, things are a little different with
564                         // the handle created
565                         IntPtr dummy = p.Handle;
566                         
567                         TestHelper.RemoveWarning (dummy);
568
569                         foreach (Keys key in Enum.GetValues (typeof (Keys))) {
570                                 switch (key) {
571                                 case Keys.Left:
572                                 case Keys.Right:
573                                 case Keys.Up:
574                                 case Keys.Down:
575                                 case Keys.PageUp:
576                                 case Keys.PageDown:
577                                 case Keys.End:
578                                 case Keys.Home:
579                                         continue;
580                                 }
581                                 Assert.IsFalse (p.CheckIsInputKey (key), "PH-FALSE- " + key);
582                         }
583
584                         Assert.IsTrue (p.CheckIsInputKey (Keys.Left), "PH-TRUE-left");
585                         Assert.IsTrue (p.CheckIsInputKey (Keys.Right), "PH-TRUE-right");
586                         Assert.IsTrue (p.CheckIsInputKey (Keys.Up), "PH-TRUE-up");
587                         Assert.IsTrue (p.CheckIsInputKey (Keys.Down), "PH-TRUE-down");
588                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageUp), "PH-TRUE-pageup");
589                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageDown), "PH-TRUE-pagedown");
590                         Assert.IsTrue (p.CheckIsInputKey (Keys.End), "PH-TRUE-end");
591                         Assert.IsTrue (p.CheckIsInputKey (Keys.Home), "PH-TRUE-home");
592                 }
593
594                 [Test] // bug #79847
595                 public void NoTabPages ()
596                 {
597                         Form form = new Form ();
598                         TabControl tab = new TabControl ();
599                         tab.SelectedIndex = 0;
600                         Assert.AreEqual (0, tab.SelectedIndex, "#A1");
601
602                         form.Controls.Add (tab);
603
604                         Assert.AreEqual (0, tab.SelectedIndex, "#A2");
605
606                         form.ShowInTaskbar = false;
607                         form.Show ();
608
609                         Assert.AreEqual (-1, tab.SelectedIndex, "#A3");
610
611                         form.Dispose ();
612                 }
613
614                 [Test] // bug #81802. should not throw an exception
615                 public void NoTabPages2 ()
616                 {
617                         Form form = new Form ();
618                         form.Font = new Font ("Tahoma", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte) (0)));
619                         TabControl tab = new TabControl ();
620                         form.Controls.Add (tab);
621                         tab.Dispose ();
622                         form.Dispose ();
623                 }
624
625                 private void SelectedIndexChanged (object sender, EventArgs e)
626                 {
627                         _selected_index_changed++;
628                 }
629                 
630 #if NET_2_0
631                 [Test]
632                 public void MethodSelectTab ()
633                 {
634                         TabControl tc = new TabControl ();
635                         tc.TabPages.Add ("One", "One");
636                         tc.TabPages.Add ("Two", "Two");
637                         tc.TabPages.Add ("Three", "Three");
638                         
639                         tc.SelectTab (1);
640                         Assert.AreEqual (1, tc.SelectedIndex, "A1");
641
642                         tc.SelectTab (tc.TabPages[2]);
643                         Assert.AreEqual (2, tc.SelectedIndex, "A2");
644
645                         tc.SelectTab ("One");
646                         Assert.AreEqual (0, tc.SelectedIndex, "A3");
647
648                         tc.SelectTab (1);
649                         tc.DeselectTab (1);
650                         Assert.AreEqual (2, tc.SelectedIndex, "A4");
651
652                         tc.DeselectTab (2);
653                         Assert.AreEqual (0, tc.SelectedIndex, "A5");
654
655                         tc.DeselectTab (tc.TabPages[0]);
656                         Assert.AreEqual (1, tc.SelectedIndex, "A6");            
657
658                         tc.DeselectTab (tc.TabPages[0]);
659                         Assert.AreEqual (1, tc.SelectedIndex, "A7");            
660
661                         tc.DeselectTab (tc.TabPages[1]);
662                         Assert.AreEqual (2, tc.SelectedIndex, "A7");            
663
664                         tc.DeselectTab ("Two");
665                         Assert.AreEqual (2, tc.SelectedIndex, "A8");            
666
667                         tc.DeselectTab ("Three");
668                         Assert.AreEqual (0, tc.SelectedIndex, "A8");            
669 }
670
671                 [Test]
672                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
673                 public void MethodSelectTabAOORE ()
674                 {
675                         TabControl tc = new TabControl ();
676                         tc.TabPages.Add (new TabPage ("One"));
677                         tc.TabPages.Add (new TabPage ("Two"));
678
679                         tc.SelectTab (-1);
680                 }
681
682                 [Test]
683                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
684                 public void MethodSelectTabAOORE2 ()
685                 {
686                         TabControl tc = new TabControl ();
687                         tc.TabPages.Add (new TabPage ("One"));
688                         tc.TabPages.Add (new TabPage ("Two"));
689
690                         tc.SelectTab (2);
691                 }
692
693                 [Test]
694                 public void EventSelected ()
695                 {
696                         Form f = new Form ();
697                         TabControl tc = new TabControl ();
698                         TabControlEventArgs tcea1 = new TabControlEventArgs (null, 0, TabControlAction.Deselected);
699                         TabControlEventArgs tcea2 = new TabControlEventArgs (null, 0, TabControlAction.Selected);
700                         TabControlCancelEventArgs tccea1 = new TabControlCancelEventArgs (null, 0, false, TabControlAction.Deselecting);
701                         TabControlCancelEventArgs tccea2 = new TabControlCancelEventArgs (null, 0, false, TabControlAction.Selecting);
702                         
703                         f.Controls.Add (tc);
704                         string events = string.Empty;
705                         tc.SelectedIndexChanged += new EventHandler (delegate (Object obj, EventArgs e) { events += ("SelectedIndexChanged;"); });
706                         tc.Deselecting += new TabControlCancelEventHandler (delegate (Object obj, TabControlCancelEventArgs e) { events += ("Deselecting;"); tccea1 = e; });
707                         tc.Deselected += new TabControlEventHandler (delegate (Object obj, TabControlEventArgs e) { events += ("Deselected;"); tcea1 = e; });
708                         tc.Selecting += new TabControlCancelEventHandler (delegate (Object obj, TabControlCancelEventArgs e) { events += ("Selecting;"); tccea2 = e; });
709                         tc.Selected += new TabControlEventHandler (delegate (Object obj, TabControlEventArgs e) { events += ("Selected;"); tcea2 = e; });
710                         
711                         TabPage tp1 = new TabPage ("One");
712                         TabPage tp2 = new TabPage ("Two");
713                         
714                         tc.TabPages.Add (tp1);
715                         tc.TabPages.Add (tp2);
716                         
717                         f.Show ();
718                         tc.SelectTab (1);
719                         Assert.AreEqual ("Deselecting;Deselected;Selecting;Selected;SelectedIndexChanged;", events, "A1");
720                         Assert.AreEqual (TabControlAction.Deselecting, tccea1.Action, "A2");
721                         Assert.AreEqual (TabControlAction.Deselected, tcea1.Action, "A2");
722                         Assert.AreEqual (TabControlAction.Selecting, tccea2.Action, "A2");
723                         Assert.AreEqual (TabControlAction.Selected, tcea2.Action, "A2");
724                         Assert.AreSame (tp2, tcea2.TabPage, "A3");
725                         Assert.AreEqual (1, tcea2.TabPageIndex, "A4");
726                         f.Close ();
727                 }
728
729                 [Test]
730                 [Category ("NotWorking")]
731                 public void EnterLeaveEvents ()
732                 {
733                         Form f = new Form ();
734                         TabControl tc = new TabControl ();
735                         TabPage p1 = new TabPage ();
736                         string events = string.Empty;
737                         tc.Enter += new EventHandler (delegate (Object obj, EventArgs e) { events += ("tc_OnEnter;"); });
738                         tc.Leave += new EventHandler (delegate (Object obj, EventArgs e) { events += ("tc_OnLeave;"); });
739                         p1.Enter += new EventHandler (delegate (Object obj, EventArgs e) { events += ("p1_OnEnter;");});
740                         p1.Leave += new EventHandler (delegate (Object obj, EventArgs e) { events += ("p1_OnLeave;"); });
741                         tc.TabPages.Add (p1);
742
743                         Button b1 = new Button ();
744
745                         tc.TabIndex = 0;
746                         b1.TabIndex = 1;
747
748                         f.Controls.Add (b1);
749                         f.Controls.Add (tc);
750
751                         f.Show ();
752                         Assert.AreEqual ("tc_OnEnter;p1_OnEnter;", events, "A1");
753                         b1.Focus ();
754                         Assert.AreEqual ("tc_OnEnter;p1_OnEnter;p1_OnLeave;tc_OnLeave;", events, "A2");
755                 }
756
757                 [Test] // bug #499887
758                 [Category ("NotWorking")]
759                 public void FireFocusWhenSettingSelectionIndex ()
760                 {
761                         Form f = new Form ();
762                         TabControl tc = new TabControl ();
763                         TabPage p1 = new TabPage ();
764                         TabPage p2 = new TabPage ();
765                         string events = string.Empty;
766
767                         tc.TabPages.Add (p1);
768                         tc.TabPages.Add (p2);
769                         tc.SelectedIndex = 0;
770                         Button b1 = new Button ();
771                         Button b2 = new Button ();
772
773                         f.Controls.Add (b1);
774                         f.Controls.Add (b2);
775                         f.Controls.Add (tc);
776
777                         f.Show ();
778                         b1.Focus ();
779                         b2.GotFocus += new EventHandler (delegate (Object obj, EventArgs e) {
780                                 tc.SelectedIndex = 1;
781                         });
782                         
783                         tc.GotFocus += new EventHandler (delegate (Object obj, EventArgs e) { events += ("tc_OnGotFocus;"); });
784                         p2.Enter += new EventHandler (delegate (Object obj, EventArgs e) { events += ("p2_OnEnter;");});
785                         p2.Leave += new EventHandler (delegate (Object obj, EventArgs e) { events += ("p2_OnLeave;"); });
786         
787                         b2.Focus ();
788                         Assert.AreEqual ("tc_OnGotFocus;p2_OnEnter;", events, "A1");
789                         Assert.IsTrue (tc.Focused, "A2");
790                 }
791
792
793 #endif
794         }
795
796         [TestFixture]
797         public class TabPageCollectionTest : TestHelper
798         {
799                 [Test]
800                 public void Indexer ()
801                 {
802                         TabControl tab = new TabControl ();
803                         TabControl.TabPageCollection tabPages = new TabControl.TabPageCollection (tab);
804                         TabPage tabPageA = new TabPage ();
805                         TabPage tabPageB = new TabPage ();
806                         TabPage tabPageC = new TabPage ();
807                         TabPage tabPageD = new TabPage ();
808                         tabPages.Add (tabPageA);
809                         Assert.AreSame (tabPageA, tabPages [0], "#1");
810                         tabPages [0] = tabPageB;
811                         Assert.AreSame (tabPageB, tabPages [0], "#2");
812                         tabPages.Add (tabPageC);
813                         Assert.AreSame (tabPageB, tabPages [0], "#3");
814                         Assert.AreSame (tabPageC, tabPages [1], "#4");
815                         tabPages.Remove (tabPageB);
816                         Assert.AreSame (tabPageC, tabPages [0], "#5");
817                         tabPages [0] = tabPageD;
818                         Assert.AreSame (tabPageD, tabPages [0], "#6");
819
820                         Form form = new Form ();
821                         form.ShowInTaskbar = false;
822                         form.Controls.Add (tab);
823                         form.Show ();
824                         form.Dispose ();
825                 }
826         }
827 }