Merge pull request #201 from QuickJack/master
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / TreeViewTest.cs
1 using System;
2 using System.Collections;
3 using System.Drawing;
4 using System.Globalization;
5 using System.Windows.Forms;
6
7 using NUnit.Framework;
8
9 namespace MonoTests.System.Windows.Forms
10 {
11         [TestFixture]
12         public class TreeViewTest : TestHelper
13         {
14                 [Test] // bug #80620
15                 public void ClientRectangle_Borders ()
16                 {
17                         TreeView tv = new TreeView ();
18                         tv.CreateControl ();
19                         Assert.AreEqual (tv.ClientRectangle, new TreeView ().ClientRectangle);
20                 }
21
22                 [Test]
23                 public void CollapseAll_NoNodes ()
24                 {
25                         TreeView tv = new TreeView ();
26                         tv.CollapseAll ();
27                 }
28         
29                 [Test]
30                 public void DefaultCtor ()
31                 {
32                         TreeView tv = new TreeView ();
33                         Assert.AreEqual (121, tv.Width, "#1");
34                         Assert.AreEqual (97, tv.Height, "#2");
35
36                         Assert.IsTrue (tv.Scrollable, "#3");
37                         Assert.AreEqual (tv.SelectedNode, null, "#4");
38                 }
39
40 #if NET_2_0
41                 [Test] // bug #81424
42                 public void DoubleBuffered ()
43                 {
44                         MockTreeView tv = new MockTreeView ();
45                         Assert.IsFalse (tv.IsDoubleBuffered, "#A1");
46                         Assert.IsTrue (tv.GetControlStyle (ControlStyles.AllPaintingInWmPaint), "#A2");
47                         Assert.IsFalse (tv.GetControlStyle (ControlStyles.DoubleBuffer), "#A3");
48                         Assert.IsFalse (tv.GetControlStyle (ControlStyles.OptimizedDoubleBuffer), "#A4");
49                         Assert.IsFalse (tv.GetControlStyle (ControlStyles.UserPaint), "#A5");
50                         Assert.IsFalse (tv.GetControlStyle (ControlStyles.StandardClick), "#A6");
51
52                         tv.IsDoubleBuffered = true;
53                         Assert.IsTrue (tv.IsDoubleBuffered, "#B1");
54                         Assert.IsTrue (tv.GetControlStyle (ControlStyles.AllPaintingInWmPaint), "#B2");
55                         Assert.IsFalse (tv.GetControlStyle (ControlStyles.DoubleBuffer), "#B3");
56                         Assert.IsTrue (tv.GetControlStyle (ControlStyles.OptimizedDoubleBuffer), "#B4");
57                         Assert.IsFalse (tv.GetControlStyle (ControlStyles.UserPaint), "#B5");
58                 }
59 #endif
60
61                 [Test]
62                 public void SimpleShowTest ()
63                 {
64                         Form f = new Form ();
65                         f.ShowInTaskbar = false;
66                         TreeView tv = new TreeView ();
67                         //tv.BorderStyle = BorderStyle.FixedSingle;
68                         tv.Location = new Point (20, 20);
69                         //tv.Text = "adssssss";
70
71                         f.Controls.Add (tv);
72                         f.Show ();
73                         f.Dispose ();
74                 }
75
76                 [Test]
77                 public void NodeAddIndex ()
78                 {
79                         TreeView tv = new TreeView ();
80
81                         TreeNode tn1 = new TreeNode ("blah");
82                         TreeNode tn2 = new TreeNode ("blah2");
83                         TreeNode tn3 = new TreeNode ("blah3");
84
85                         Assert.AreEqual (0, tv.Nodes.Add (tn1), "A1");
86                         Assert.AreEqual (1, tv.Nodes.Add (tn2), "A2");
87                         Assert.AreEqual (2, tv.Nodes.Add (tn3), "A3");
88                 }
89                 
90                 [Test]
91                 public void NodesCopyToTest ()
92                 {
93                         TreeView tv = new TreeView();
94                         TreeNode one = new TreeNode ("one");
95                         TreeNode two = new TreeNode ("two");
96                         TreeNode three = new TreeNode ("three");
97
98                         tv.Nodes.Add (one);
99                         tv.Nodes.Add (two);
100                         tv.Nodes.Add (three);
101
102                         ArrayList al = new ArrayList (tv.Nodes);
103
104                         Assert.AreEqual (al [0], tv.Nodes [0], "A1");
105                         Assert.AreEqual (al [1], tv.Nodes [1], "A2");
106                         Assert.AreEqual (al [2], tv.Nodes [2], "A3");
107                 }
108
109                 [Test]
110                 public void ExpandAll_Flat_Created ()
111                 {
112                         TreeView tv = new TreeView ();
113                         tv.Size = new Size (300, 100);
114
115                         for (int i = 0; i <= 100; i++)
116                                 tv.Nodes.Add (i.ToString (CultureInfo.InvariantCulture));
117
118                         Form form = new Form ();
119                         form.ShowInTaskbar = false;
120                         form.Controls.Add (tv);
121                         form.Show ();
122
123                         Assert.IsFalse (tv.Nodes [0].IsExpanded, "#A1");
124                         Assert.IsFalse (tv.Nodes [99].IsExpanded, "#A2");
125
126                         Assert.IsTrue (tv.Nodes [0].IsVisible, "#B1");
127                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#B2");
128
129                         tv.ExpandAll ();
130
131                         Assert.IsFalse (tv.Nodes [0].IsExpanded, "#C1");
132                         Assert.IsFalse (tv.Nodes [99].IsExpanded, "#C2");
133
134                         Assert.IsTrue (tv.Nodes [0].IsVisible, "#D1");
135                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#D2");
136                         
137                         form.Close ();
138                 }
139
140                 [Test]
141                 public void ExpandAll_Tree_Created ()
142                 {
143                         TreeView tv = new TreeView ();
144                         tv.Size = new Size (300, 100);
145
146                         for (int i = 0; i <= 100; i++) {
147                                 TreeNode node = tv.Nodes.Add (i.ToString (CultureInfo.InvariantCulture));
148                                 node.Nodes.Add ("child");
149                         }
150
151                         Form form = new Form ();
152                         form.ShowInTaskbar = false;
153                         form.Controls.Add (tv);
154                         form.Show ();
155
156                         Assert.IsFalse (tv.Nodes [0].IsExpanded, "#A1");
157                         Assert.IsFalse (tv.Nodes [99].IsExpanded, "#A2");
158
159                         Assert.IsTrue (tv.Nodes [0].IsVisible, "#B1");
160                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#B2");
161
162                         tv.ExpandAll ();
163
164                         Assert.IsTrue (tv.Nodes [0].IsExpanded, "#C1");
165                         Assert.IsTrue (tv.Nodes [99].IsExpanded, "#C2");
166
167                         Assert.IsFalse (tv.Nodes [0].IsVisible, "#D1");
168                         Assert.IsTrue (tv.Nodes [99].IsVisible, "#D2");
169                         
170                         form.Close ();
171                 }
172
173                 [Test]
174                 public void ExpandAll_Flat_NotCreated ()
175                 {
176                         TreeView tv = new TreeView ();
177                         tv.Size = new Size (300, 100);
178
179                         for (int i = 0; i <= 100; i++)
180                                 tv.Nodes.Add (i.ToString (CultureInfo.InvariantCulture));
181
182                         Assert.IsFalse (tv.Nodes [0].IsExpanded, "#A1");
183                         Assert.IsFalse (tv.Nodes [99].IsExpanded, "#A2");
184
185                         Assert.IsFalse (tv.Nodes [0].IsVisible, "#B1");
186                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#B2");
187
188                         tv.ExpandAll ();
189
190                         Assert.IsTrue (tv.Nodes [0].IsExpanded, "#C1");
191                         Assert.IsTrue (tv.Nodes [99].IsExpanded, "#C2");
192
193                         Assert.IsFalse (tv.Nodes [0].IsVisible, "#D1");
194                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#D2");
195
196                         Form form = new Form ();
197                         form.ShowInTaskbar = false;
198                         form.Controls.Add (tv);
199                         form.Show ();
200
201                         Assert.IsFalse (tv.Nodes [0].IsExpanded, "#E1");
202                         Assert.IsFalse (tv.Nodes [99].IsExpanded, "#E2");
203
204                         Assert.IsTrue (tv.Nodes [0].IsVisible, "#F1");
205                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#F2");
206
207                         form.Dispose ();
208                 }
209
210                 [Test] // bug #80284
211                 public void ExpandAll_Tree_NotCreated ()
212                 {
213                         TreeView tv = new TreeView ();
214                         tv.Size = new Size (300, 100);
215
216                         for (int i = 0; i <= 100; i++) {
217                                 TreeNode node = tv.Nodes.Add (i.ToString (CultureInfo.InvariantCulture));
218                                 node.Nodes.Add ("child");
219                         }
220
221                         Assert.IsFalse (tv.Nodes [0].IsExpanded, "#A1");
222                         Assert.IsFalse (tv.Nodes [99].IsExpanded, "#A2");
223
224                         Assert.IsFalse (tv.Nodes [0].IsVisible, "#B1");
225                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#B2");
226
227                         tv.ExpandAll ();
228
229                         Assert.IsTrue (tv.Nodes [0].IsExpanded, "#C1");
230                         Assert.IsTrue (tv.Nodes [99].IsExpanded, "#C2");
231
232                         Assert.IsFalse (tv.Nodes [0].IsVisible, "#D1");
233                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#D2");
234
235                         Form form = new Form ();
236                         form.ShowInTaskbar = false;
237                         form.Controls.Add (tv);
238                         form.Show ();
239
240                         Assert.IsTrue (tv.Nodes [0].IsExpanded, "#E1");
241                         Assert.IsTrue (tv.Nodes [99].IsExpanded, "#E2");
242
243 #if NET_2_0
244                         Assert.IsTrue (tv.Nodes [0].IsVisible, "#F1");
245                         Assert.IsFalse (tv.Nodes [99].IsVisible, "#F2");
246 #else
247                         Assert.IsFalse (tv.Nodes [0].IsVisible, "#F1");
248                         Assert.IsTrue (tv.Nodes [99].IsVisible, "#F2");
249 #endif
250
251                         form.Dispose ();
252                 }
253
254                 class MockTreeView : TreeView
255                 {
256                         public bool GetControlStyle (ControlStyles style)
257                         {
258                                 return base.GetStyle (style);
259                         }
260
261 #if NET_2_0
262                         public bool IsDoubleBuffered {
263                                 get { return DoubleBuffered; }
264                                 set { DoubleBuffered = value; }
265                         }
266 #endif
267                 }
268
269                 [Test]
270                 public void MethodIsInputChar ()
271                 {
272                         // Basically, show that this method always returns true
273                         InputCharControl m = new InputCharControl ();
274                         bool result = true;
275
276                         for (int i = 0; i < 256; i++)
277                                 result &= m.PublicIsInputChar ((char)i);
278
279                         Assert.AreEqual (true, result, "I1");
280                 }
281
282                 private class InputCharControl : TreeView
283                 {
284                         public bool PublicIsInputChar (char charCode)
285                         {
286                                 return base.IsInputChar (charCode);
287                         }
288                 }
289                 
290 #if NET_2_0
291                 [Test]
292                 public void SelectedNodeNullTest ()
293                 {
294                         Form f = new Form ();
295                         f.ShowInTaskbar = false;
296                         
297                         TreeView tv = new TreeView ();
298                         tv.Nodes.Add ("Node 1");
299                         
300                         f.Controls.Add (tv);
301                         f.Show ();
302                         
303                         tv.BeforeSelect += new TreeViewCancelEventHandler (delegate (object sender, TreeViewCancelEventArgs e) { if (e.Node == null) Assert.Fail ("BeforeSelect should not be called with a null node"); });
304                         tv.AfterSelect += new TreeViewEventHandler (delegate (object sender, TreeViewEventArgs e) { if (e.Node == null) Assert.Fail ("AfterSelect should not be called with a null node"); });
305                         
306                         tv.SelectedNode = null;
307                         
308                         f.Dispose ();
309                 }
310
311                 [Test]
312                 public void SortChangesSorted ()
313                 {
314                         TreeView tv = new TreeView ();
315                         
316                         Assert.AreEqual (false, tv.Sorted, "A1");
317                         
318                         tv.Sort ();
319                         Assert.AreEqual (true, tv.Sorted, "A2");
320                 }
321                 
322                 [Test]
323                 public void SortedBeforeNodeAdd ()
324                 {
325                         TreeView tv = new TreeView ();
326                         tv.Sort ();
327                         
328                         tv.Nodes.Add ("bbb");
329                         tv.Nodes.Add ("aaa");
330                         
331                         Assert.AreEqual ("aaa", tv.Nodes[0].Text, "A1");
332                 }
333
334                 [Test]
335                 public void SortBeginUpdate ()
336                 {
337                         TreeView tv = new TreeView ();
338                         tv.Sorted = true;
339                         tv.BeginUpdate ();
340                         tv.Nodes.Add ("x");
341                         tv.Nodes.Add ("f");
342                         tv.Nodes.Add ("a");
343
344                         // Even if BeginUpdate was called, Sort is called.
345                         Assert.AreEqual ("a", tv.Nodes [0].Text, "#A1");
346                         Assert.AreEqual ("f", tv.Nodes [1].Text, "#A2");
347                         Assert.AreEqual ("x", tv.Nodes [2].Text, "#A3");
348                 }
349 #endif
350
351                 [Test]
352                 public void MethodToString ()
353                 {
354                         TreeView tv = new TreeView ();
355
356                         Assert.AreEqual (@"System.Windows.Forms.TreeView, Nodes.Count: 0", tv.ToString (), "A1");
357
358                         tv.Nodes.Add ("A");
359                         tv.Nodes.Add ("B");
360
361                         Assert.AreEqual (@"System.Windows.Forms.TreeView, Nodes.Count: 2, Nodes[0]: TreeNode: A", tv.ToString (), "A2");
362                 }
363         }
364
365         [TestFixture]
366         public class BeforeSelectEvent : TestHelper
367         {
368                 int beforeSelect;
369                 TreeViewCancelEventArgs cancelEventArgs;
370                 bool cancel;
371
372                 public void TreeView_BeforeSelect (object sender, TreeViewCancelEventArgs e)
373                 {
374                         beforeSelect++;
375                         cancelEventArgs = e;
376                         if (cancel)
377                                 e.Cancel = true;
378                 }
379
380                 [SetUp]
381                 protected override void SetUp () {
382                         beforeSelect = 0;
383                         cancelEventArgs = null;
384                         cancel = false;
385                         base.SetUp ();
386                 }
387
388                 [Test]
389                 [Category ("NotWorking")]
390                 public void CancelBeforeCreationOfHandle ()
391                 {
392                         TreeView tvw = new TreeView ();
393                         tvw.BeforeSelect += new TreeViewCancelEventHandler (TreeView_BeforeSelect);
394                         cancel = true;
395
396                         TreeNode nodeA = tvw.Nodes.Add ("A");
397                         Assert.AreEqual (0, beforeSelect, "#A1");
398                         tvw.SelectedNode = nodeA;
399                         Assert.AreEqual (0, beforeSelect, "#A2");
400                         Assert.IsNull (cancelEventArgs, "#A3");
401                         Assert.IsFalse (nodeA.IsSelected, "#A4");
402                         Assert.AreSame (nodeA, tvw.SelectedNode, "#A5");
403
404                         TreeNode nodeB = tvw.Nodes.Add ("B");
405                         Assert.AreEqual (0, beforeSelect, "#B1");
406                         tvw.SelectedNode = nodeB;
407                         Assert.AreEqual (0, beforeSelect, "#B2");
408                         Assert.IsNull (cancelEventArgs, "#B3");
409                         Assert.IsFalse (nodeB.IsSelected, "#B4");
410                         Assert.AreSame (nodeB, tvw.SelectedNode, "#B5");
411
412                         Form form = new Form ();
413                         form.ShowInTaskbar = false;
414                         form.Controls.Add (tvw);
415                         form.Show ();
416
417                         Assert.AreEqual (2, beforeSelect, "#C1");
418                         Assert.IsNotNull (cancelEventArgs, "#C2");
419                         Assert.AreEqual (TreeViewAction.Unknown, cancelEventArgs.Action, "#C3");
420                         Assert.AreSame (nodeA, cancelEventArgs.Node, "#C4");
421                         Assert.IsFalse (nodeA.IsSelected, "#C5");
422                         Assert.IsFalse (nodeB.IsSelected, "#C6");
423                         Assert.IsNull (tvw.SelectedNode, "#C7");
424                 }
425
426                 [Test]
427                 public void SelectBeforeCreationOfHandle ()
428                 {
429                         TreeView tvw = new TreeView ();
430                         tvw.BeforeSelect += new TreeViewCancelEventHandler (TreeView_BeforeSelect);
431
432                         TreeNode nodeA =  tvw.Nodes.Add ("A");
433                         Assert.AreEqual (0, beforeSelect, "#A1");
434                         tvw.SelectedNode = nodeA;
435                         Assert.AreEqual (0, beforeSelect, "#A2");
436                         Assert.IsNull (cancelEventArgs, "#A3");
437                         Assert.IsFalse (nodeA.IsSelected, "#A4");
438                         Assert.AreSame (nodeA, tvw.SelectedNode, "#A5");
439
440                         TreeNode nodeB = tvw.Nodes.Add ("B");
441                         Assert.AreEqual (0, beforeSelect, "#B1");
442                         tvw.SelectedNode = nodeB;
443                         Assert.AreEqual (0, beforeSelect, "#B2");
444                         Assert.IsNull (cancelEventArgs, "#B3");
445                         Assert.IsFalse (nodeB.IsSelected, "#B4");
446                         Assert.AreSame (nodeB, tvw.SelectedNode, "#B5");
447
448                         Form form = new Form ();
449                         form.ShowInTaskbar = false;
450                         form.Controls.Add (tvw);
451                         form.Show ();
452
453                         Assert.AreEqual (1, beforeSelect, "#C1");
454                         Assert.IsNotNull (cancelEventArgs, "#C2");
455                         Assert.AreEqual (TreeViewAction.Unknown, cancelEventArgs.Action, "#C3");
456                         Assert.AreSame (nodeB, cancelEventArgs.Node, "#C4");
457                         Assert.IsFalse (nodeA.IsSelected, "#C5");
458                         Assert.IsTrue (nodeB.IsSelected, "#C6");
459                         Assert.AreSame (nodeB, tvw.SelectedNode, "#C7");
460                         form.Close ();
461                 }
462
463                 [Test]
464                 public void CancelAfterCreationOfHandle ()
465                 {
466                         TreeView tvw = new TreeView ();
467                         tvw.BeforeSelect += new TreeViewCancelEventHandler (TreeView_BeforeSelect);
468                         cancel = true;
469
470                         Form form = new Form ();
471                         form.ShowInTaskbar = false;
472                         form.Controls.Add (tvw);
473                         form.Show ();
474
475                         TreeNode nodeA = tvw.Nodes.Add ("A");
476                         Assert.AreEqual (0, beforeSelect, "#A1");
477                         tvw.SelectedNode = nodeA;
478                         Assert.AreEqual (1, beforeSelect, "#A2");
479                         Assert.IsNotNull (cancelEventArgs, "#A3");
480                         Assert.AreEqual (TreeViewAction.Unknown, cancelEventArgs.Action, "#A4");
481                         Assert.AreSame (nodeA, cancelEventArgs.Node, "#A5");
482                         Assert.IsFalse (nodeA.IsSelected, "#A6");
483                         Assert.IsNull (tvw.SelectedNode, "#A7");
484
485                         TreeNode nodeB = tvw.Nodes.Add ("B");
486                         Assert.AreEqual (1, beforeSelect, "#B1");
487                         tvw.SelectedNode = nodeB;
488                         Assert.AreEqual (2, beforeSelect, "#B2");
489                         Assert.IsNotNull (cancelEventArgs, "#B3");
490                         Assert.AreEqual (TreeViewAction.Unknown, cancelEventArgs.Action, "#B4");
491                         Assert.AreSame (nodeB, cancelEventArgs.Node, "#B5");
492                         Assert.IsFalse (nodeB.IsSelected, "#B6");
493                         Assert.IsNull (tvw.SelectedNode, "#B7");
494                         form.Close ();
495                 }
496
497                 [Test]
498                 [Category ("NotWorking")]
499                 public void SelectAfterCreationOfHandle ()
500                 {
501                         TreeView tvw = new TreeView ();
502                         tvw.BeforeSelect += new TreeViewCancelEventHandler (TreeView_BeforeSelect);
503
504                         Form form = new Form ();
505                         form.ShowInTaskbar = false;
506                         form.Controls.Add (tvw);
507                         form.Show ();
508
509                         TreeNode nodeA = tvw.Nodes.Add ("A");
510                         Assert.AreEqual (0, beforeSelect, "#A1");
511                         tvw.SelectedNode = nodeA;
512                         Assert.AreEqual (1, beforeSelect, "#A2");
513                         Assert.IsNotNull (cancelEventArgs, "#A3");
514                         Assert.AreEqual (TreeViewAction.Unknown, cancelEventArgs.Action, "#A4");
515                         Assert.AreSame (nodeA, cancelEventArgs.Node, "#A5");
516                         Assert.IsTrue (nodeA.IsSelected, "#A6");
517                         Assert.AreSame (nodeA, tvw.SelectedNode, "#A7");
518
519                         TreeNode nodeB = tvw.Nodes.Add ("B");
520                         Assert.AreEqual (1, beforeSelect, "#B1");
521                         tvw.SelectedNode = nodeB;
522                         Assert.AreEqual (2, beforeSelect, "#B2");
523                         Assert.IsNotNull (cancelEventArgs, "#B3");
524                         Assert.AreEqual (TreeViewAction.Unknown, cancelEventArgs.Action, "#B4");
525                         Assert.AreSame (nodeB, cancelEventArgs.Node, "#B5");
526                         Assert.IsTrue (nodeB.IsSelected, "#B6");
527                         Assert.AreSame (nodeB, tvw.SelectedNode, "#B7");
528                 }
529         }
530
531         [TestFixture]
532         public class AfterSelectEvent : TestHelper
533         {
534                 [SetUp]
535                 protected override void SetUp () {
536                         afterSelect = 0;
537                         base.SetUp ();
538                 }
539
540                 [Test] // bug #81319
541                 [Category ("NotWorking")]
542                 public void SelectedNode_Created ()
543                 {
544                         TreeView tv = new TreeView ();
545                         tv.AfterSelect += new TreeViewEventHandler (TreeView_AfterSelect);
546                         TreeNode one = new TreeNode ("one");
547                         TreeNode two = new TreeNode ("two");
548
549                         tv.Nodes.Add (one);
550                         tv.Nodes.Add (two);
551
552                         Form form = new Form ();
553                         form.ShowInTaskbar = false;
554                         form.Controls.Add (tv);
555                         form.Show ();
556
557                         Assert.IsNotNull (tv.SelectedNode, "#A1");
558                         Assert.AreSame (one, tv.SelectedNode, "#A2");
559                         Assert.IsTrue (one.IsSelected, "#A3");
560                         Assert.IsFalse (two.IsSelected, "#A4");
561                         Assert.AreEqual (1, afterSelect, "#A5");
562
563                         tv.SelectedNode = null;
564                         Assert.IsNull (tv.SelectedNode, "#C1");
565                         Assert.IsFalse (one.IsSelected, "#C2");
566                         Assert.IsFalse (two.IsSelected, "#C3");
567                         Assert.AreEqual (1, afterSelect, "#C4");
568
569                         tv.SelectedNode = two;
570                         Assert.IsNotNull (tv.SelectedNode, "#D1");
571                         Assert.AreSame (two, tv.SelectedNode, "#D2");
572                         Assert.IsFalse (one.IsSelected, "#D3");
573                         Assert.IsTrue (two.IsSelected, "#D4");
574                         Assert.AreEqual (2, afterSelect, "#D5");
575
576                         form.Dispose ();
577                 }
578
579                 [Test]
580                 public void SelectedNode_NotCreated ()
581                 {
582                         TreeView tv = new TreeView ();
583                         tv.AfterSelect += new TreeViewEventHandler (TreeView_AfterSelect);
584                         TreeNode one = new TreeNode ("one");
585                         TreeNode two = new TreeNode ("two");
586
587                         tv.Nodes.Add (one);
588                         tv.Nodes.Add (two);
589
590                         Assert.IsNull (tv.SelectedNode, "#A1");
591                         Assert.IsFalse (one.IsSelected, "#A2");
592                         Assert.IsFalse (two.IsSelected, "#A3");
593                         Assert.AreEqual (0, afterSelect, "#A4");
594
595                         tv.SelectedNode = two;
596                         Assert.IsNotNull (tv.SelectedNode, "#B1");
597                         Assert.AreSame (two, tv.SelectedNode, "#B2");
598                         Assert.IsFalse (one.IsSelected, "#B3");
599                         Assert.IsFalse (two.IsSelected, "#B4");
600                         Assert.AreEqual (0, afterSelect, "#B5");
601
602                         tv.SelectedNode = null;
603                         Assert.IsNull (tv.SelectedNode, "#C1");
604                         Assert.IsFalse (one.IsSelected, "#C2");
605                         Assert.IsFalse (two.IsSelected, "#C3");
606                         Assert.AreEqual (0, afterSelect, "#C4");
607
608                         tv.SelectedNode = one;
609                         Assert.IsNotNull (tv.SelectedNode, "#D1");
610                         Assert.AreSame (one, tv.SelectedNode, "#D2");
611                         Assert.IsFalse (one.IsSelected, "#D3");
612                         Assert.IsFalse (two.IsSelected, "#D4");
613                         Assert.AreEqual (0, afterSelect, "#D5");
614                 }
615
616                 void TreeView_AfterSelect (object sender, TreeViewEventArgs e)
617                 {
618                         afterSelect++;
619                 }
620
621                 int afterSelect;
622         }
623
624 #if NET_2_0
625         [TestFixture]
626         public class TreeViewNodeSorterTest : TestHelper {
627                 static bool node_sorter_called;
628
629                 [Test]
630                 public void SortedAfterTreeViewNodeSorterIsSetToSomething() {
631                         TreeView t = new TreeView();
632                         t.TreeViewNodeSorter = new NodeSorter();
633                         Assert.IsTrue(t.Sorted);
634                 }
635
636                 [Test]
637                 public void SortedAfterTreeViewNodeSorterIsSetToNull() {
638                         TreeView t = new TreeView();
639                         t.TreeViewNodeSorter = null;
640                         Assert.IsFalse(t.Sorted);
641                 }
642
643                 [Test]
644                 public void NormalTreeViewNodeSorter() {
645                         TreeView t = new TreeView();
646                         t.Nodes.Add("2");
647                         t.Nodes.Add("1");
648                         node_sorter_called = false;
649                         t.TreeViewNodeSorter = new NodeSorter();
650                         Assert.IsTrue(node_sorter_called, "Node sorter called");
651                         Assert.IsTrue(t.Nodes[0].Text == "2", "Order");
652                 }
653
654                 [Test]
655                 public void NormalSorted() {
656                         TreeView t = new TreeView();
657                         t.Nodes.Add("2");
658                         t.Nodes.Add("1");
659                         t.Sorted = true;
660                         Assert.IsTrue(t.Nodes[0].Text == "1", "Order");
661                 }
662
663                 [Test]
664                 public void SortedDoesNotSortWhenTreeViewNodeSorterIsSet() {
665                         TreeView t = new TreeView();
666                         t.Nodes.Add("2");
667                         t.Nodes.Add("1");
668                         t.TreeViewNodeSorter = new NodeSorter();
669                         t.Sorted = false;
670                         t.Sorted = true;
671                         Assert.IsTrue(t.Nodes[0].Text == "2", "Order");
672                 }
673
674                 [Test]
675                 public void SortedDoesNotSortWhenItIsAlreadyTrue() {
676                         TreeView t = new TreeView();
677                         t.Nodes.Add("2");
678                         t.Nodes.Add("1");
679                         t.TreeViewNodeSorter = new NodeSorter();
680                         t.TreeViewNodeSorter = null;
681                         t.Sorted = true;
682                         Assert.IsTrue(t.Nodes[0].Text == "2", "Order");
683                 }
684
685                 [Test]
686                 public void SortedSorts() {
687                         TreeView t = new TreeView();
688                         t.Nodes.Add("2");
689                         t.Nodes.Add("1");
690                         t.TreeViewNodeSorter = new NodeSorter();
691                         t.TreeViewNodeSorter = null;
692                         t.Sorted = false;
693                         t.Sorted = true;
694                         Assert.IsTrue(t.Nodes[0].Text == "1", "Order");
695                 }
696
697                 class NodeSorter : IComparer {
698                         public int Compare(object x, object y) {
699                                 node_sorter_called = true;
700                                 if (x == y)
701                                         return 0;
702                                 return ((TreeNode)x).Text == "2" ? -1 : 1;
703                         }
704                 }
705
706                 [Test]
707                 public void SortedRecursive ()
708                 {
709                         TreeView tv = new TreeView ();
710                         tv.TreeViewNodeSorter = new InverseNodeSorter ();
711                         tv.BeginUpdate ();
712                         TreeNode root_node = tv.Nodes.Add ("Root");
713                         for (char c = 'a'; c <= 'f'; c++) {
714                                 TreeNode node = new TreeNode (c.ToString ());
715                                 for (int i = 0; i < 3; i++)
716                                         node.Nodes.Add (i.ToString ());
717
718                                 root_node.Nodes.Add (node);
719                         }
720                         tv.EndUpdate ();
721
722                         // Make sure we are sorted
723                         tv.Sort ();
724
725                         Assert.AreEqual ("f", root_node.Nodes [0].Text, "#A1");
726                         Assert.AreEqual ("e", root_node.Nodes [1].Text, "#A2");
727                         Assert.AreEqual ("d", root_node.Nodes [2].Text, "#A3");
728                         Assert.AreEqual ("c", root_node.Nodes [3].Text, "#A4");
729                         Assert.AreEqual ("b", root_node.Nodes [4].Text, "#A5");
730                         Assert.AreEqual ("a", root_node.Nodes [5].Text, "#A5");
731
732                         foreach (TreeNode n in root_node.Nodes) {
733                                 Assert.AreEqual ("2", n.Nodes [0].Text, "#B1");
734                                 Assert.AreEqual ("1", n.Nodes [1].Text, "#B2");
735                                 Assert.AreEqual ("0", n.Nodes [2].Text, "#B3");
736                         }
737                 }
738
739                 [Test]
740                 public void SortedAutomatically ()
741                 {
742                         TreeView tv = new TreeView ();
743                         tv.Nodes.Add ("z");
744                         tv.Nodes.Add ("a");
745                         tv.Nodes.Add ("c");
746
747                         // One way to sort them automatically is to set Sorted to true
748                         // and let the TreeView use the default comparer
749                         tv.Sorted = true;
750                         Assert.AreEqual ("a", tv.Nodes [0].Text, "#A1");
751                         Assert.AreEqual ("c", tv.Nodes [1].Text, "#A2");
752                         Assert.AreEqual ("z", tv.Nodes [2].Text, "#A3");
753                         Assert.AreEqual (true, tv.Sorted, "#A4");
754
755                         tv.Nodes.Add ("d");
756                         Assert.AreEqual ("a", tv.Nodes [0].Text, "#B1");
757                         Assert.AreEqual ("c", tv.Nodes [1].Text, "#B2");
758                         Assert.AreEqual ("d", tv.Nodes [2].Text, "#B3");
759                         Assert.AreEqual ("z", tv.Nodes [3].Text, "#B4");
760
761                         // Another way is to set TreeViewNodeSorter,
762                         // which will set Sorted to true automatically
763                         tv.Sorted = false;
764                         Assert.AreEqual (false, tv.Sorted, "#C0");
765
766                         tv.TreeViewNodeSorter = new InverseNodeSorter ();
767                         Assert.AreEqual ("z", tv.Nodes [0].Text, "#C1");
768                         Assert.AreEqual ("d", tv.Nodes [1].Text, "#C2");
769                         Assert.AreEqual ("c", tv.Nodes [2].Text, "#C3");
770                         Assert.AreEqual ("a", tv.Nodes [3].Text, "#C4");
771                         Assert.AreEqual (true, tv.Sorted, "#C5");
772
773                         tv.Nodes.Add ("i");
774                         Assert.AreEqual ("z", tv.Nodes [0].Text, "#D1");
775                         Assert.AreEqual ("i", tv.Nodes [1].Text, "#D2");
776                         Assert.AreEqual ("d", tv.Nodes [2].Text, "#D3");
777                         Assert.AreEqual ("c", tv.Nodes [3].Text, "#D4");
778                         Assert.AreEqual ("a", tv.Nodes [4].Text, "#D5");
779
780                         tv.Sorted = false;
781                         Assert.AreEqual (false, tv.Sorted, "#E0");
782
783                         // If we have set a TreeViewNodeSorter, 
784                         // it will sort the nodes automatically when adding/inserting a new one,
785                         // setting Sorted to true.
786                         tv.Nodes.Add ("f");
787                         Assert.AreEqual ("z", tv.Nodes [0].Text, "#E1");
788                         Assert.AreEqual ("i", tv.Nodes [1].Text, "#E2");
789                         Assert.AreEqual ("f", tv.Nodes [2].Text, "#E3");
790                         Assert.AreEqual ("d", tv.Nodes [3].Text, "#E4");
791                         Assert.AreEqual ("c", tv.Nodes [4].Text, "#E5");
792                         Assert.AreEqual ("a", tv.Nodes [5].Text, "#E6");
793                         Assert.AreEqual (true, tv.Sorted, "#E7");
794
795                         // After setting the node sorter to null and testing,
796                         // I'm curious about the interaction between Sort and Sorted.
797                         tv.TreeViewNodeSorter = null;
798                         Assert.AreEqual (null, tv.TreeViewNodeSorter, "#F1");
799                         Assert.AreEqual (true, tv.Sorted, "#F2");
800
801                         // Finally, no NodeSorter to automatically set Sorted to true
802                         tv.Sorted = false;
803                         Assert.AreEqual (false, tv.Sorted, "#F0");
804                         tv.Nodes.Add ("k");
805                         Assert.AreEqual ("z", tv.Nodes [0].Text, "#G1");
806                         Assert.AreEqual ("i", tv.Nodes [1].Text, "#G2");
807                         Assert.AreEqual ("f", tv.Nodes [2].Text, "#G3");
808                         Assert.AreEqual ("d", tv.Nodes [3].Text, "#G4");
809                         Assert.AreEqual ("c", tv.Nodes [4].Text, "#G5");
810                         Assert.AreEqual ("a", tv.Nodes [5].Text, "#G6");
811                         Assert.AreEqual ("k", tv.Nodes [6].Text, "#G7");
812                 }
813
814                 class InverseNodeSorter : IComparer
815                 {
816                         public int Compare (object a, object b)
817                         {
818                                 TreeNode node_a = (TreeNode)a;
819                                 TreeNode node_b = (TreeNode)b;
820                                 return String.Compare (node_b.Text, node_a.Text);
821                         }
822                 }
823         }
824 #endif
825 }