[bcl] Remove more NET_2_0 checks from class libs
[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 ItemSizeTestPadding ()
112                 {
113                         TabControl tc = new TabControl ();
114                         tc.TabPages.Add ("One"); // Need to add a page to force to calc the width
115                         tc.CreateControl (); // And create the control as well
116
117                         Assert.IsTrue (tc.ItemSize != Size.Empty, "#A0");
118
119                         Size item_size = tc.ItemSize;
120                         tc.Padding = new Point (tc.Padding.X * 2, tc.Padding.Y * 2);
121
122                         Assert.IsTrue (tc.ItemSize.Height > item_size.Height, "#B0");
123                         Assert.IsTrue (tc.ItemSize.Width > item_size.Width, "#B1");
124                 }
125
126                 [Test]
127                 public void ItemSizeTest ()
128                 {
129                         TabControl tc = new TabControl ();
130                         Assert.AreEqual (Size.Empty, tc.ItemSize, "#A0");
131
132                         tc.CreateControl ();
133                         Assert.IsTrue (tc.ItemSize.Width == 0, "#B0");
134                         Assert.IsTrue (tc.ItemSize.Height > 0, "#B1");
135
136                         tc.TabPages.Add ("A");
137                         Assert.IsTrue (tc.ItemSize.Width > 0, "#C0");
138                         Assert.IsTrue (tc.ItemSize.Height > 0, "#C1");
139
140                         // ItemSize.Height can change, depending on Font
141                         Size prev_size = tc.ItemSize;
142                         tc.Font = new Font (tc.Font.FontFamily, tc.Font.Height * 2);
143                         Assert.IsTrue (tc.ItemSize.Height > prev_size.Height, "#D0");
144
145                         // Images can cause a change as well
146                         prev_size = tc.ItemSize;
147                         ImageList image_list = new ImageList ();
148                         image_list.ImageSize = new Size (image_list.ImageSize.Width, tc.Font.Height * 2);
149                         tc.ImageList = image_list;
150                         Assert.IsTrue (tc.ItemSize.Height > prev_size.Height, "#E0");
151                 }
152
153                 [Test]
154                 public void ItemSizeFixedTest ()
155                 {
156                         TabControl tc = new TabControl ();
157                         tc.SizeMode = TabSizeMode.Fixed;
158                         Assert.AreEqual (Size.Empty, tc.ItemSize, "#A0");
159
160                         tc.CreateControl ();
161                         Assert.IsTrue (tc.ItemSize.Width == 0, "#B0");
162                         Assert.IsTrue (tc.ItemSize.Height > 0, "#B1");
163
164                         tc.TabPages.Add ("A");
165                         Assert.IsTrue (tc.ItemSize.Width == 96, "#C0");
166                         Assert.IsTrue (tc.ItemSize.Width > 0, "#C1");
167
168                         // Height can change automatically depending on Font,
169                         // but not Width
170                         Size prev_size = tc.ItemSize;
171                         tc.Font = new Font (tc.Font.FontFamily, tc.Font.Height * 2);
172                         Assert.IsTrue (tc.ItemSize.Width == 96, "#D0");
173                         Assert.IsTrue (tc.ItemSize.Height > prev_size.Height, "#D1");
174
175                         // Manually set ItemSize
176                         tc.ItemSize = new Size (100, 35);
177                         Assert.AreEqual (100, tc.ItemSize.Width, "#E0");
178                         Assert.AreEqual (35, tc.ItemSize.Height, "#E1");
179
180                         // Font size is decreased, but since we manually set
181                         // the size we can't automatically update it.
182                         tc.Font = new Font (tc.Font.FontFamily, tc.Font.Height / 2);
183                         Assert.AreEqual (100, tc.ItemSize.Width, "#F0");
184                         Assert.AreEqual (35, tc.ItemSize.Height, "#F1");
185
186                         // Manually set even if control has not been created.
187                         tc = new TabControl ();
188                         tc.SizeMode = TabSizeMode.Fixed;
189                         tc.ItemSize = new Size (100, 35);
190                         Assert.AreEqual (100, tc.ItemSize.Width, "#G0");
191                         Assert.AreEqual (35, tc.ItemSize.Height, "#G1");
192                 }
193
194                 [Test]
195                 public void ClearTabPagesTest ()
196                 {
197                         // no tab pages
198                         TabControl tab = new TabControl ();
199                         tab.TabPages.Clear ();
200                         Assert.AreEqual (-1, tab.SelectedIndex, "#A1");
201                         Assert.AreEqual (0, tab.TabPages.Count, "#A2");
202
203                         // single tab page
204                         tab.Controls.Add (new TabPage ());
205                         Assert.AreEqual (0, tab.SelectedIndex, "#B1");
206                         Assert.AreEqual (1, tab.TabPages.Count, "#B2");
207                         tab.TabPages.Clear();
208                         Assert.AreEqual (-1, tab.SelectedIndex, "#B3");
209                         Assert.AreEqual (0, tab.TabPages.Count, "#B4");
210
211                         // multiple tab pages
212                         tab.Controls.Add (new TabPage ());
213                         tab.Controls.Add (new TabPage ());
214                         tab.Controls.Add (new TabPage ());
215                         Assert.AreEqual (0, tab.SelectedIndex, "#C1");
216                         Assert.AreEqual (3, tab.TabPages.Count, "#C2");
217                         tab.SelectedIndex = 1;
218                         tab.TabPages.Clear ();
219                         Assert.AreEqual (-1, tab.SelectedIndex, "#C3");
220                         Assert.AreEqual (0, tab.TabPages.Count, "#C4");
221                 }
222
223                 [Test]
224                 [Category ("NotWorking")]
225                 public void Controls_Remove_HandleCreated ()
226                 {
227                         TabControl tab = new TabControl ();
228                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
229
230                         Form form = new Form ();
231                         form.ShowInTaskbar = false;
232                         form.Controls.Add (tab);
233                         form.Show ();
234
235                         tab.Controls.Add (new TabPage ());
236                         tab.Controls.Add (new TabPage ());
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
242                         Assert.AreEqual (0, tab.SelectedIndex, "#A1");
243                         Assert.AreEqual (6, tab.TabPages.Count, "#A2");
244                         Assert.AreEqual (0, _selected_index_changed, "#A3");
245
246                         // remove selected tab
247                         tab.SelectedIndex = 2;
248                         Assert.AreEqual (2, tab.SelectedIndex, "#B1");
249                         Assert.AreEqual (1, _selected_index_changed, "#B2");
250                         tab.Controls.RemoveAt (2);
251                         Assert.AreEqual (0, tab.SelectedIndex, "#B3");
252                         Assert.AreEqual (5, tab.TabPages.Count, "#B4");
253                         Assert.AreEqual (2, _selected_index_changed, "#B5");
254
255                         // remove not-selected tab
256                         Assert.AreEqual (0, tab.SelectedIndex, "#C1");
257                         Assert.AreEqual (2, _selected_index_changed, "#C2");
258                         tab.Controls.RemoveAt (3);
259                         Assert.AreEqual (0, tab.SelectedIndex, "#C3");
260                         Assert.AreEqual (4, tab.TabPages.Count, "#C4");
261                         Assert.AreEqual (2, _selected_index_changed, "#C5");
262
263                         // remove last tab
264                         tab.Controls.RemoveAt (3);
265                         Assert.AreEqual (0, tab.SelectedIndex, "#D1");
266                         Assert.AreEqual (3, tab.TabPages.Count, "#D2");
267                         Assert.AreEqual (2, _selected_index_changed, "#D3");
268
269                         // remove first tab
270                         tab.Controls.RemoveAt (0);
271                         Assert.AreEqual (0, tab.SelectedIndex, "#E1");
272                         Assert.AreEqual (2, tab.TabPages.Count, "#E2");
273                         Assert.AreEqual (3, _selected_index_changed, "#E3");
274
275                         // remove remaining tabs
276                         tab.Controls.RemoveAt (1);
277                         tab.Controls.RemoveAt (0);
278                         Assert.AreEqual (-1, tab.SelectedIndex, "#F1");
279                         Assert.AreEqual (0, tab.TabPages.Count, "#F2");
280                         Assert.AreEqual (4, _selected_index_changed, "#F3");
281                 }
282
283                 [Test]
284                 [Category ("NotWorking")]
285                 public void Controls_Remove_HandleNotCreated ()
286                 {
287                         TabControl tab = new TabControl ();
288                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
289                         tab.Controls.Add (new TabPage ());
290                         tab.Controls.Add (new TabPage ());
291                         tab.Controls.Add (new TabPage ());
292                         tab.Controls.Add (new TabPage ());
293                         tab.Controls.Add (new TabPage ());
294                         tab.Controls.Add (new TabPage ());
295
296                         Assert.AreEqual (-1, tab.SelectedIndex, "#A1");
297                         Assert.AreEqual (6, tab.TabPages.Count, "#A2");
298                         Assert.AreEqual (0, _selected_index_changed, "#A3");
299
300                         // remove selected tab
301                         tab.SelectedIndex = 2;
302                         Assert.AreEqual (2, tab.SelectedIndex, "#B1");
303                         Assert.AreEqual (0, _selected_index_changed, "#B2");
304                         tab.Controls.RemoveAt (2);
305                         Assert.AreEqual (0, tab.SelectedIndex, "#B3");
306                         Assert.AreEqual (5, tab.TabPages.Count, "#B4");
307                         Assert.AreEqual (0, _selected_index_changed, "#B5");
308
309                         // remove not-selected tab
310                         tab.Controls.RemoveAt (3);
311                         Assert.AreEqual (0, tab.SelectedIndex, "#C3");
312                         Assert.AreEqual (4, tab.TabPages.Count, "#C4");
313                         Assert.AreEqual (0, _selected_index_changed, "#C5");
314
315                         // remove last tab
316                         tab.Controls.RemoveAt (3);
317                         Assert.AreEqual (0, tab.SelectedIndex, "#D1");
318                         Assert.AreEqual (3, tab.TabPages.Count, "#D2");
319                         Assert.AreEqual (0, _selected_index_changed, "#D3");
320
321                         // remove first tab
322                         tab.Controls.RemoveAt (0);
323                         Assert.AreEqual (0, tab.SelectedIndex, "#E1");
324                         Assert.AreEqual (2, tab.TabPages.Count, "#E2");
325                         Assert.AreEqual (0, _selected_index_changed, "#E3");
326
327                         // remove remaining tabs
328                         tab.Controls.RemoveAt (1);
329                         tab.Controls.RemoveAt (0);
330                         Assert.AreEqual (0, tab.SelectedIndex, "#F1");
331                         Assert.AreEqual (0, tab.TabPages.Count, "#F2");
332                         Assert.AreEqual (0, _selected_index_changed, "#F3");
333
334                         Form form = new Form ();
335                         form.ShowInTaskbar = false;
336                         form.Controls.Add (tab);
337                         form.Show ();
338                         Assert.AreEqual (-1, tab.SelectedIndex, "#G1");
339                         Assert.AreEqual (0, tab.TabPages.Count, "#G2");
340                         Assert.AreEqual (0, _selected_index_changed, "#G3");
341                 }
342
343                 [Test]
344                 public void SelectedIndex ()
345                 {
346                         TabControl tab = new TabControl ();
347                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
348                         tab.Controls.Add (new TabPage ());
349                         tab.Controls.Add (new TabPage ());
350
351                         tab.SelectedIndex = 0;
352                         Assert.AreEqual (0, _selected_index_changed, "#A1");
353                         Assert.AreEqual (0, tab.SelectedIndex, "#A2");
354
355                         tab.SelectedIndex = -1;
356                         Assert.AreEqual (0, _selected_index_changed, "#B1");
357                         Assert.AreEqual (-1, tab.SelectedIndex, "#B2");
358
359                         tab.SelectedIndex = 1;
360                         Assert.AreEqual (0, _selected_index_changed, "#C1");
361                         Assert.AreEqual (1, tab.SelectedIndex, "#C2");
362
363                         tab.SelectedIndex = 1;
364                         Assert.AreEqual (0, _selected_index_changed, "#D1");
365                         Assert.AreEqual (1, tab.SelectedIndex, "#D2");
366
367
368                         tab.SelectedIndex = 6;
369                         Assert.AreEqual (0, _selected_index_changed, "#E1");
370                         Assert.AreEqual (6, tab.SelectedIndex, "#E2");
371
372                         tab.SelectedIndex = 6;
373                         Assert.AreEqual (0, _selected_index_changed, "#E31");
374                         Assert.AreEqual (6, tab.SelectedIndex, "#E4");
375
376                         Form form = new Form ();
377                         form.ShowInTaskbar = false;
378                         form.Controls.Add (tab);
379
380                         form.Show ();
381
382                         Assert.AreEqual (0, tab.SelectedIndex, "#E5");
383
384                         tab.SelectedIndex = 0;
385                         Assert.AreEqual (0, _selected_index_changed, "#F1");
386                         Assert.AreEqual (0, tab.SelectedIndex, "#F2");
387
388                         tab.SelectedIndex = -1;
389                         Assert.AreEqual (1, _selected_index_changed, "#G1");
390                         Assert.AreEqual (-1, tab.SelectedIndex, "#G2");
391
392                         tab.SelectedIndex = 1;
393                         Assert.AreEqual (2, _selected_index_changed, "#H1");
394                         Assert.AreEqual (1, tab.SelectedIndex, "#H2");
395
396                         tab.SelectedIndex = 1;
397                         Assert.AreEqual (2, _selected_index_changed, "#I1");
398                         Assert.AreEqual (1, tab.SelectedIndex, "#I2");
399
400                         form.Dispose ();
401                 }
402
403                 [Test] // bug #78395
404                 public void SelectedIndex_Ignore ()
405                 {
406                         TabControl c = new TabControl ();
407                         c.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
408                         c.SelectedIndex = 0;
409                         Assert.AreEqual (0, _selected_index_changed, "#1");
410
411                         c.TabPages.Add (new TabPage ());
412                         c.TabPages.Add (new TabPage ());
413                         Assert.AreEqual (0, c.SelectedIndex, "#2");
414                         Form f = new Form ();
415                         f.ShowInTaskbar = false;
416                         f.Controls.Add (c);
417                         f.Show ();
418                         Assert.AreEqual (0, _selected_index_changed, "#3");
419                         c.SelectedIndex = 2; // beyond the pages - ignored
420                         Assert.AreEqual (1, _selected_index_changed, "#4");
421                         Assert.AreEqual (0, c.SelectedIndex, "#4");
422                         f.Dispose ();
423                 }
424
425                 [Test]
426                 public void SelectedIndex_Negative ()
427                 {
428                         Form form = new Form ();
429                         form.ShowInTaskbar = false;
430                         TabControl tab = new TabControl ();
431                         tab.SelectedIndexChanged += new EventHandler (SelectedIndexChanged);
432                         form.Controls.Add (tab);
433
434                         Assert.AreEqual (-1, tab.SelectedIndex, "#A1");
435                         tab.SelectedIndex = -1;
436                         Assert.AreEqual (-1, tab.SelectedIndex, "#A2");
437                         Assert.AreEqual (0, _selected_index_changed, "#A3");
438
439                         try {
440                                 tab.SelectedIndex = -2;
441                                 Assert.Fail ("#B1");
442                         } catch (ArgumentOutOfRangeException ex) {
443                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
444                                 Assert.IsNotNull (ex.Message, "#B3");
445                                 Assert.IsTrue (ex.Message.IndexOf ("'-2'") != -1, "#B4");
446                                 Assert.IsTrue (ex.Message.IndexOf ("'SelectedIndex'") != -1, "#B5");
447                                 Assert.IsTrue (ex.Message.IndexOf ("-1") != -1, "#B6");
448                                 Assert.IsNotNull (ex.ParamName, "#B7");
449                                 Assert.AreEqual ("SelectedIndex", ex.ParamName, "#B8");
450                         }
451
452                         Assert.AreEqual (0, _selected_index_changed, "#C1");
453                         Assert.AreEqual (-1, tab.SelectedIndex, "#C2");
454                         form.Show ();
455                         Assert.AreEqual (0, _selected_index_changed, "#C3");
456                         Assert.AreEqual (-1, tab.SelectedIndex, "#C4");
457
458                         try {
459                                 tab.SelectedIndex = -5;
460                                 Assert.Fail ("#D1");
461                         } catch (ArgumentOutOfRangeException ex) {
462                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#D2");
463                                 Assert.IsNotNull (ex.Message, "#D3");
464                                 Assert.IsTrue (ex.Message.IndexOf ("'-5'") != -1, "#D4");
465                                 Assert.IsTrue (ex.Message.IndexOf ("'SelectedIndex'") != -1, "#D5");
466                                 Assert.IsTrue (ex.Message.IndexOf ("-1") != -1, "#D6");
467                                 Assert.IsNotNull (ex.ParamName, "#D7");
468                                 Assert.AreEqual ("SelectedIndex", ex.ParamName, "#D8");
469                         }
470
471                         Assert.AreEqual (-1, tab.SelectedIndex, "#E1");
472                         tab.SelectedIndex = -1;
473                         Assert.AreEqual (-1, tab.SelectedIndex, "#E2");
474                         Assert.AreEqual (0, _selected_index_changed, "#E3");
475
476                         form.Dispose ();
477                 }
478
479                 [Test]
480                 [Category ("NotWorking")]
481                 public void InputKeyTest ()
482                 {
483                         TabControlPoker p = new TabControlPoker ();
484
485                         foreach (Keys key in Enum.GetValues (typeof (Keys))) {
486                                 switch (key) {
487                                 case Keys.PageUp:
488                                 case Keys.PageDown:
489                                 case Keys.End:
490                                 case Keys.Home:
491                                         continue;
492                                 }
493                                 Assert.IsFalse (p.CheckIsInputKey (key), "FALSE- " + key);
494                         }
495
496                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageUp), "TRUE-pageup");
497                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageDown), "TRUE-pagedown");
498                         Assert.IsTrue (p.CheckIsInputKey (Keys.End), "TRUE-end");
499                         Assert.IsTrue (p.CheckIsInputKey (Keys.Home), "TRUE-home");
500
501                         // Create the handle, things are a little different with
502                         // the handle created
503                         IntPtr dummy = p.Handle;
504                         
505                         TestHelper.RemoveWarning (dummy);
506
507                         foreach (Keys key in Enum.GetValues (typeof (Keys))) {
508                                 switch (key) {
509                                 case Keys.Left:
510                                 case Keys.Right:
511                                 case Keys.Up:
512                                 case Keys.Down:
513                                 case Keys.PageUp:
514                                 case Keys.PageDown:
515                                 case Keys.End:
516                                 case Keys.Home:
517                                         continue;
518                                 }
519                                 Assert.IsFalse (p.CheckIsInputKey (key), "PH-FALSE- " + key);
520                         }
521
522                         Assert.IsTrue (p.CheckIsInputKey (Keys.Left), "PH-TRUE-left");
523                         Assert.IsTrue (p.CheckIsInputKey (Keys.Right), "PH-TRUE-right");
524                         Assert.IsTrue (p.CheckIsInputKey (Keys.Up), "PH-TRUE-up");
525                         Assert.IsTrue (p.CheckIsInputKey (Keys.Down), "PH-TRUE-down");
526                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageUp), "PH-TRUE-pageup");
527                         Assert.IsTrue (p.CheckIsInputKey (Keys.PageDown), "PH-TRUE-pagedown");
528                         Assert.IsTrue (p.CheckIsInputKey (Keys.End), "PH-TRUE-end");
529                         Assert.IsTrue (p.CheckIsInputKey (Keys.Home), "PH-TRUE-home");
530                 }
531
532                 [Test] // bug #79847
533                 public void NoTabPages ()
534                 {
535                         Form form = new Form ();
536                         TabControl tab = new TabControl ();
537                         tab.SelectedIndex = 0;
538                         Assert.AreEqual (0, tab.SelectedIndex, "#A1");
539
540                         form.Controls.Add (tab);
541
542                         Assert.AreEqual (0, tab.SelectedIndex, "#A2");
543
544                         form.ShowInTaskbar = false;
545                         form.Show ();
546
547                         Assert.AreEqual (-1, tab.SelectedIndex, "#A3");
548
549                         form.Dispose ();
550                 }
551
552                 [Test] // bug #81802. should not throw an exception
553                 public void NoTabPages2 ()
554                 {
555                         Form form = new Form ();
556                         form.Font = new Font ("Tahoma", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte) (0)));
557                         TabControl tab = new TabControl ();
558                         form.Controls.Add (tab);
559                         tab.Dispose ();
560                         form.Dispose ();
561                 }
562
563                 private void SelectedIndexChanged (object sender, EventArgs e)
564                 {
565                         _selected_index_changed++;
566                 }
567                 
568                 [Test]
569                 public void MethodSelectTab ()
570                 {
571                         TabControl tc = new TabControl ();
572                         tc.TabPages.Add ("One", "One");
573                         tc.TabPages.Add ("Two", "Two");
574                         tc.TabPages.Add ("Three", "Three");
575                         
576                         tc.SelectTab (1);
577                         Assert.AreEqual (1, tc.SelectedIndex, "A1");
578
579                         tc.SelectTab (tc.TabPages[2]);
580                         Assert.AreEqual (2, tc.SelectedIndex, "A2");
581
582                         tc.SelectTab ("One");
583                         Assert.AreEqual (0, tc.SelectedIndex, "A3");
584
585                         tc.SelectTab (1);
586                         tc.DeselectTab (1);
587                         Assert.AreEqual (2, tc.SelectedIndex, "A4");
588
589                         tc.DeselectTab (2);
590                         Assert.AreEqual (0, tc.SelectedIndex, "A5");
591
592                         tc.DeselectTab (tc.TabPages[0]);
593                         Assert.AreEqual (1, tc.SelectedIndex, "A6");            
594
595                         tc.DeselectTab (tc.TabPages[0]);
596                         Assert.AreEqual (1, tc.SelectedIndex, "A7");            
597
598                         tc.DeselectTab (tc.TabPages[1]);
599                         Assert.AreEqual (2, tc.SelectedIndex, "A7");            
600
601                         tc.DeselectTab ("Two");
602                         Assert.AreEqual (2, tc.SelectedIndex, "A8");            
603
604                         tc.DeselectTab ("Three");
605                         Assert.AreEqual (0, tc.SelectedIndex, "A8");            
606                 }
607
608                 [Test]
609                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
610                 public void MethodSelectTabAOORE ()
611                 {
612                         TabControl tc = new TabControl ();
613                         tc.TabPages.Add (new TabPage ("One"));
614                         tc.TabPages.Add (new TabPage ("Two"));
615
616                         tc.SelectTab (-1);
617                 }
618
619                 [Test]
620                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
621                 public void MethodSelectTabAOORE2 ()
622                 {
623                         TabControl tc = new TabControl ();
624                         tc.TabPages.Add (new TabPage ("One"));
625                         tc.TabPages.Add (new TabPage ("Two"));
626
627                         tc.SelectTab (2);
628                 }
629
630                 [Test]
631                 public void EventSelected ()
632                 {
633                         Form f = new Form ();
634                         TabControl tc = new TabControl ();
635                         TabControlEventArgs tcea1 = new TabControlEventArgs (null, 0, TabControlAction.Deselected);
636                         TabControlEventArgs tcea2 = new TabControlEventArgs (null, 0, TabControlAction.Selected);
637                         TabControlCancelEventArgs tccea1 = new TabControlCancelEventArgs (null, 0, false, TabControlAction.Deselecting);
638                         TabControlCancelEventArgs tccea2 = new TabControlCancelEventArgs (null, 0, false, TabControlAction.Selecting);
639                         
640                         f.Controls.Add (tc);
641                         string events = string.Empty;
642                         tc.SelectedIndexChanged += new EventHandler (delegate (Object obj, EventArgs e) { events += ("SelectedIndexChanged;"); });
643                         tc.Deselecting += new TabControlCancelEventHandler (delegate (Object obj, TabControlCancelEventArgs e) { events += ("Deselecting;"); tccea1 = e; });
644                         tc.Deselected += new TabControlEventHandler (delegate (Object obj, TabControlEventArgs e) { events += ("Deselected;"); tcea1 = e; });
645                         tc.Selecting += new TabControlCancelEventHandler (delegate (Object obj, TabControlCancelEventArgs e) { events += ("Selecting;"); tccea2 = e; });
646                         tc.Selected += new TabControlEventHandler (delegate (Object obj, TabControlEventArgs e) { events += ("Selected;"); tcea2 = e; });
647                         
648                         TabPage tp1 = new TabPage ("One");
649                         TabPage tp2 = new TabPage ("Two");
650                         
651                         tc.TabPages.Add (tp1);
652                         tc.TabPages.Add (tp2);
653                         
654                         f.Show ();
655                         tc.SelectTab (1);
656                         Assert.AreEqual ("Deselecting;Deselected;Selecting;Selected;SelectedIndexChanged;", events, "A1");
657                         Assert.AreEqual (TabControlAction.Deselecting, tccea1.Action, "A2");
658                         Assert.AreEqual (TabControlAction.Deselected, tcea1.Action, "A2");
659                         Assert.AreEqual (TabControlAction.Selecting, tccea2.Action, "A2");
660                         Assert.AreEqual (TabControlAction.Selected, tcea2.Action, "A2");
661                         Assert.AreSame (tp2, tcea2.TabPage, "A3");
662                         Assert.AreEqual (1, tcea2.TabPageIndex, "A4");
663                         f.Close ();
664                 }
665
666                 [Test]
667                 [Category ("NotWorking")]
668                 public void EnterLeaveEvents ()
669                 {
670                         Form f = new Form ();
671                         TabControl tc = new TabControl ();
672                         TabPage p1 = new TabPage ();
673                         string events = string.Empty;
674                         tc.Enter += new EventHandler (delegate (Object obj, EventArgs e) { events += ("tc_OnEnter;"); });
675                         tc.Leave += new EventHandler (delegate (Object obj, EventArgs e) { events += ("tc_OnLeave;"); });
676                         p1.Enter += new EventHandler (delegate (Object obj, EventArgs e) { events += ("p1_OnEnter;");});
677                         p1.Leave += new EventHandler (delegate (Object obj, EventArgs e) { events += ("p1_OnLeave;"); });
678                         tc.TabPages.Add (p1);
679
680                         Button b1 = new Button ();
681
682                         tc.TabIndex = 0;
683                         b1.TabIndex = 1;
684
685                         f.Controls.Add (b1);
686                         f.Controls.Add (tc);
687
688                         f.Show ();
689                         Assert.AreEqual ("tc_OnEnter;p1_OnEnter;", events, "A1");
690                         b1.Focus ();
691                         Assert.AreEqual ("tc_OnEnter;p1_OnEnter;p1_OnLeave;tc_OnLeave;", events, "A2");
692                 }
693
694                 [Test] // bug #499887
695                 public void SelectedIndexChangeFiresFocus ()
696                 {
697                         Form f = new Form ();
698                         TabControl tc = new TabControl ();
699                         TabPage p1 = new TabPage ();
700                         TabPage p2 = new TabPage ();
701                         string events = string.Empty;
702
703                         tc.TabPages.Add (p1);
704                         tc.TabPages.Add (p2);
705                         tc.SelectedIndex = 0;
706                         Button b1 = new Button ();
707                         Button b2 = new Button ();
708
709                         f.Controls.Add (b1);
710                         f.Controls.Add (b2);
711                         f.Controls.Add (tc);
712
713                         f.Show ();
714                         b1.Focus ();
715                         b2.GotFocus += new EventHandler (delegate (Object obj, EventArgs e) {
716                                 tc.SelectedIndex = 1;
717                         });
718                         
719                         tc.GotFocus += new EventHandler(delegate (Object obj, EventArgs e) { events += ("tc_OnGotFocus" + tc.SelectedIndex + ";"); });
720                         tc.SelectedIndexChanged += new EventHandler(delegate (Object obj, EventArgs e) { events += ("tc_OnSelectedIndexChanged" + tc.SelectedIndex + ";"); });
721                         p2.Enter += new EventHandler(delegate (Object obj, EventArgs e) { events += ("p2_OnEnter" + tc.SelectedIndex + ";"); });
722                         p2.Leave += new EventHandler (delegate (Object obj, EventArgs e) { events += ("p2_OnLeave;"); });
723         
724                         b2.Focus ();
725                         Assert.AreEqual ("tc_OnGotFocus0;p2_OnEnter1;tc_OnSelectedIndexChanged1;", events, "A1");
726                         Assert.IsTrue (tc.Focused, "A2");
727                 }
728
729                 // Make sure that setting focus for TabControl is *not* resetting SelectedIndex when
730                 // the value is -1
731                 [Test]
732                 public void GotFocusSelectedIndex ()
733                 {
734                         TabControl tc = new TabControl ();
735                         tc.TabPages.Add ("A");
736                         tc.TabPages.Add ("B");
737
738                         Button b = new Button (); // Dummy button to receive focus by default
739                         Form f = new Form ();
740                         f.Controls.AddRange (new Control [] { b, tc });
741                         f.Show ();
742
743                         tc.SelectedIndex = -1;
744
745                         // Make sure focus goes back to button
746                         b.Focus ();
747
748                         // Finally give focus back to TabControl
749                         tc.Focus ();
750
751                         Assert.AreEqual (-1, tc.SelectedIndex, "#A0");
752                 }
753         }
754
755         [TestFixture]
756         public class TabPageCollectionTest : TestHelper
757         {
758                 [Test]
759                 public void Indexer ()
760                 {
761                         TabControl tab = new TabControl ();
762                         TabControl.TabPageCollection tabPages = new TabControl.TabPageCollection (tab);
763                         TabPage tabPageA = new TabPage ();
764                         TabPage tabPageB = new TabPage ();
765                         TabPage tabPageC = new TabPage ();
766                         TabPage tabPageD = new TabPage ();
767                         tabPages.Add (tabPageA);
768                         Assert.AreSame (tabPageA, tabPages [0], "#1");
769                         tabPages [0] = tabPageB;
770                         Assert.AreSame (tabPageB, tabPages [0], "#2");
771                         tabPages.Add (tabPageC);
772                         Assert.AreSame (tabPageB, tabPages [0], "#3");
773                         Assert.AreSame (tabPageC, tabPages [1], "#4");
774                         tabPages.Remove (tabPageB);
775                         Assert.AreSame (tabPageC, tabPages [0], "#5");
776                         tabPages [0] = tabPageD;
777                         Assert.AreSame (tabPageD, tabPages [0], "#6");
778
779                         Form form = new Form ();
780                         form.ShowInTaskbar = false;
781                         form.Controls.Add (tab);
782                         form.Show ();
783                         form.Dispose ();
784                 }
785         }
786 }