Add new tests.
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / ListViewTest.cs
1 //
2 // ListViewTest.cs: Test cases for ListView.
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.Collections;
12 using System.Drawing;
13 using System.Reflection;
14 using System.Windows.Forms;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.System.Windows.Forms
19 {
20         [TestFixture]
21         public class ListViewTest
22         {
23                 [Test]
24                 public void ListViewPropertyTest ()
25                 {
26                         ListView mylistview = new ListView ();
27                         Assert.AreEqual (ItemActivation.Standard, mylistview.Activation, "#1");
28                         Assert.AreEqual (ListViewAlignment.Top, mylistview.Alignment, "#2");
29                         Assert.AreEqual (false, mylistview.AllowColumnReorder, "#3");
30                         Assert.AreEqual (true, mylistview.AutoArrange, "#4");
31                         Assert.AreEqual (BorderStyle.Fixed3D , mylistview.BorderStyle, "#5");
32                         Assert.AreEqual (false, mylistview.CheckBoxes, "#6");
33                         Assert.AreEqual (0, mylistview.CheckedIndices.Count, "#7");
34                         Assert.AreEqual (0, mylistview.CheckedItems.Count, "#8");
35                         Assert.AreEqual (0, mylistview.Columns.Count, "#9");
36                         Assert.AreEqual (null, mylistview.FocusedItem, "#10");
37                         Assert.AreEqual (false, mylistview.FullRowSelect, "#11");
38                         Assert.AreEqual (false, mylistview.GridLines, "#12");
39                         Assert.AreEqual (ColumnHeaderStyle.Clickable, mylistview.HeaderStyle, "#13");
40                         Assert.AreEqual (true, mylistview.HideSelection, "#14");
41                         Assert.AreEqual (false, mylistview.HoverSelection, "#15");
42                         ListViewItem item1 = new ListViewItem ("A", -1);
43                         mylistview.Items.Add (item1);
44                         Assert.AreEqual (1, mylistview.Items.Count, "#16");
45                         Assert.AreEqual (false, mylistview.LabelEdit, "#17");
46                         Assert.AreEqual (true, mylistview.LabelWrap, "#18");
47                         Assert.AreEqual (null, mylistview.LargeImageList, "#19");
48                         Assert.AreEqual (null, mylistview.ListViewItemSorter, "#20");
49                         Assert.AreEqual (true, mylistview.MultiSelect, "#21");
50                         Assert.AreEqual (true, mylistview.Scrollable, "#22");
51                         Assert.AreEqual (0, mylistview.SelectedIndices.Count, "#23");
52                         Assert.AreEqual (0, mylistview.SelectedItems.Count, "#24");
53                         Assert.AreEqual (null, mylistview.SmallImageList, "#25");
54                         Assert.AreEqual (null, mylistview.LargeImageList, "#26");
55                         Assert.AreEqual (SortOrder.None, mylistview.Sorting, "#27");
56                         Assert.AreEqual (null, mylistview.StateImageList, "#28");
57                         Assert.AreEqual (View.LargeIcon, mylistview.View, "#29");
58                         mylistview.View = View.List;
59                         Assert.AreEqual (false, mylistview.TopItem.Checked, "#30");
60 #if NET_2_0
61                         Assert.AreEqual (false, mylistview.ShowItemToolTips, "#31");
62                         Assert.AreEqual (false, mylistview.HotTracking, "#31");
63 #endif
64                 }
65
66                 [Test]
67                 public void ArrangeIconsTest ()
68                 {
69                         Form myform = new Form ();
70                         myform.ShowInTaskbar = false;
71                         ListView mylistview = new ListView ();
72                         myform.Controls.Add (mylistview);
73                         mylistview.Items.Add ("Item 1");
74                         mylistview.Items.Add ("Item 2");
75                         mylistview.View = View.LargeIcon;
76                         mylistview.ArrangeIcons ();
77                         myform.Dispose ();
78                 }
79
80                 [Test]
81                 public void BeginEndUpdateTest ()
82                 {
83                         Form myform = new Form ();
84                         myform.ShowInTaskbar = false;
85                         myform.Visible = true;
86                         ListView mylistview = new ListView();
87                         mylistview.Items.Add ("A");
88                         mylistview.Visible = true;
89                         myform.Controls.Add (mylistview);
90                         mylistview.BeginUpdate ();
91                         for(int x = 1 ; x < 5000 ; x++){
92                                 mylistview.Items.Add ("Item " + x.ToString());   
93                         }
94                         mylistview.EndUpdate ();
95                         myform.Dispose ();
96                 }       
97
98                 [Test]
99                 public void CheckBoxes ()
100                 {
101                         Form form = new Form ();
102                         form.ShowInTaskbar = false;
103                         ListView lvw = new ListView ();
104                         form.Controls.Add (lvw);
105                         lvw.Items.Add ("A");
106                         ListViewItem itemB = lvw.Items.Add ("B");
107                         lvw.Items.Add ("C");
108                         itemB.Checked = true;
109
110                         Assert.AreEqual (0, lvw.CheckedItems.Count, "#A1");
111                         Assert.AreEqual (0, lvw.CheckedIndices.Count, "#A2");
112
113                         lvw.CheckBoxes = true;
114
115                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#B1");
116                         Assert.AreSame (itemB, lvw.CheckedItems [0], "#B2");
117                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#B3");
118                         Assert.AreEqual (1, lvw.CheckedIndices [0], "#B4");
119
120                         form.Show ();
121
122                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#C1");
123                         Assert.AreSame (itemB, lvw.CheckedItems [0], "#C2");
124                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#C3");
125                         Assert.AreEqual (1, lvw.CheckedIndices [0], "#C4");
126
127                         lvw.CheckBoxes = false;
128
129                         Assert.AreEqual (0, lvw.CheckedItems.Count, "#D1");
130                         Assert.AreEqual (0, lvw.CheckedIndices.Count, "#D2");
131
132                         lvw.CheckBoxes = true;
133
134                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#E1");
135                         Assert.AreSame (itemB, lvw.CheckedItems [0], "#E2");
136                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#E3");
137                         Assert.AreEqual (1, lvw.CheckedIndices [0], "#E4");
138                         form.Dispose ();
139                 }
140
141                 [Test]
142                 public void ClearTest ()
143                 {
144                         Form myform = new Form ();
145                         myform.ShowInTaskbar = false;
146                         myform.Visible = true;
147                         ListView mylistview = new ListView ();
148                         ListViewItem itemA = mylistview.Items.Add ("A");
149                         ColumnHeader colA = mylistview.Columns.Add ("Item Column", -2, HorizontalAlignment.Left);
150                         Assert.AreSame (mylistview, itemA.ListView, "#1");
151                         Assert.AreSame (mylistview, colA.ListView, "#2");
152                         mylistview.Visible = true;
153                         myform.Controls.Add (mylistview);
154                         Assert.AreEqual (1, mylistview.Columns.Count, "#3");
155                         Assert.AreEqual (1, mylistview.Items.Count, "#4");
156                         mylistview.Clear ();
157                         Assert.AreEqual (0, mylistview.Columns.Count, "#5");
158                         Assert.AreEqual (0, mylistview.Items.Count, "#6");
159                         Assert.IsNull (itemA.ListView, "#7");
160                         Assert.IsNull (colA.ListView, "#8");
161                         myform.Dispose ();
162                 }
163
164                 [Test] // bug #80620
165                 public void ClientRectangle_Borders ()
166                 {
167                         ListView lv = new ListView ();
168                         lv.CreateControl ();
169                         Assert.AreEqual (lv.ClientRectangle, new ListView ().ClientRectangle);
170                 }
171
172                 [Test]
173                 public void DisposeTest ()
174                 {
175                         ListView lv = new ListView ();
176                         lv.View = View.Details;
177
178                         lv.LargeImageList = new ImageList ();
179                         lv.SmallImageList = new ImageList ();
180
181                         ListViewItem lvi = new ListViewItem ();
182                         lv.Items.Add (lvi);
183
184                         ColumnHeader col = new ColumnHeader ();
185                         lv.Columns.Add (col);
186
187                         lv.Dispose ();
188
189                         Assert.IsNull (lvi.ListView, "#A1");
190                         Assert.IsNull (col.ListView, "#A2");
191
192                         Assert.IsNull (lv.LargeImageList, "#B1");
193                         Assert.IsNull (lv.SmallImageList, "#B2");
194                         Assert.IsNull(lv.StateImageList, "#B3");
195                 }
196
197                 [Test]
198                 public void EnsureVisibleTest ()
199                 {
200                         Form myform = new Form ();
201                         myform.ShowInTaskbar = false;
202                         myform.Visible = true;
203                         ListView mylistview = new ListView ();
204                         mylistview.Items.Add ("A");
205                         myform.Controls.Add (mylistview);
206                         mylistview.BeginUpdate ();
207                         for(int x = 1 ; x < 5000 ; x++) {
208                                 mylistview.Items.Add ("Item " + x.ToString());   
209                         }
210                         mylistview.EndUpdate ();
211                         mylistview.EnsureVisible (4999);
212                         myform.Dispose ();
213                 }
214
215                 [Test]
216                 public void GetItemRectTest ()
217                 {
218                         ListView mylistview = new ListView ();
219                         mylistview.Items.Add ("Item 1");
220                         mylistview.Items.Add ("Item 2");
221                         Rectangle r = mylistview.GetItemRect (1);
222                         Assert.AreEqual (0, r.Top, "#35a");
223                         Assert.IsTrue (r.Bottom > 0, "#35b");
224                         Assert.IsTrue (r.Right > 0, "#35c");
225                         Assert.IsTrue (r.Left > 0, "#35d");
226                         Assert.IsTrue (r.Height > 0, "#35e");
227                         Assert.IsTrue (r.Width > 0, "#35f");
228                 }
229
230                 [Test]
231                 public void bug79076 ()
232                 {
233                         ListView entryList = new ListView ();
234                         entryList.Sorting = SortOrder.Descending;
235
236                         entryList.BeginUpdate ();
237                         entryList.Columns.Add ("Type", 100, HorizontalAlignment.Left);
238
239                         ListViewItem item = new ListViewItem (new string [] { "A" });
240                         entryList.Items.Add (item);
241                         item = new ListViewItem (new string [] { "B" });
242                         entryList.Items.Add (item);
243                 }
244
245                 [Test] // bug #79416
246                 public void MultiSelect ()
247                 {
248                         Form form = new Form ();
249                         form.ShowInTaskbar = false;
250                         ListView lvw = CreateListView (View.Details);
251                         form.Controls.Add (lvw);
252                         lvw.MultiSelect = true;
253                         lvw.Items [0].Selected = true;
254                         lvw.Items [2].Selected = true;
255
256                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#A1");
257                         Assert.AreEqual (0, lvw.SelectedIndices.Count, "#A2");
258
259                         lvw.Items [0].Selected = false;
260
261                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#B1");
262                         Assert.AreEqual (0, lvw.SelectedIndices.Count, "#B2");
263
264                         lvw.Items [0].Selected = true;
265
266                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#C1");
267                         Assert.AreEqual (0, lvw.SelectedIndices.Count, "#C2");
268
269                         form.Show ();
270
271                         Assert.AreEqual (2, lvw.SelectedItems.Count, "#D1");
272                         Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#D2");
273                         Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#D3");
274                         Assert.AreEqual (2, lvw.SelectedIndices.Count, "#D4");
275                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#D5");
276                         Assert.AreEqual (2, lvw.SelectedIndices [1], "#D6");
277
278                         // de-select an item
279                         lvw.Items [2].Selected = false;
280
281                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#E1");
282                         Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#E2");
283                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#E3");
284                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#E4");
285
286                         // re-select that item
287                         lvw.Items [2].Selected = true;
288
289                         Assert.AreEqual (2, lvw.SelectedItems.Count, "#F1");
290                         Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#F2");
291                         Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#F3");
292                         Assert.AreEqual (2, lvw.SelectedIndices.Count, "#F4");
293                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#F5");
294                         Assert.AreEqual (2, lvw.SelectedIndices [1], "#F6");
295
296                         // dis-allow selection of multiple items
297                         lvw.MultiSelect = false;
298
299                         // setting MultiSelect to false when multiple items have been
300                         // selected does not deselect items
301                         Assert.AreEqual (2, lvw.SelectedItems.Count, "#G1");
302                         Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#G2");
303                         Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#G3");
304                         Assert.AreEqual (2, lvw.SelectedIndices.Count, "#G4");
305                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#G5");
306                         Assert.AreEqual (2, lvw.SelectedIndices [1], "#G6");
307
308                         // de-select that item again
309                         lvw.Items [2].Selected = false;
310
311                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#H1");
312                         Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#H2");
313                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#H3");
314                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#H4");
315
316                         // re-select that item again
317                         lvw.Items [2].Selected = true;
318
319                         // when MultiSelect is false, and you attempt to select more than
320                         // one item, then all items will first be de-selected and then
321                         // the item in question is selected
322                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#I1");
323                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#I2");
324                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#I3");
325                         Assert.AreEqual (2, lvw.SelectedIndices [0], "#I4");
326                         form.Dispose ();
327                 }
328
329                 [Test]
330                 public void Selected ()
331                 {
332                         Form form = new Form ();
333                         form.ShowInTaskbar = false;
334                         ListView lvw = CreateListView (View.Details);
335                         form.Controls.Add (lvw);
336                         lvw.MultiSelect = true;
337                         lvw.Items [0].Selected = true;
338                         lvw.Items [2].Selected = true;
339
340                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#A1");
341                         Assert.AreEqual (0, lvw.SelectedIndices.Count, "#A2");
342
343                         form.Show ();
344
345                         Assert.AreEqual (2, lvw.SelectedItems.Count, "#C1");
346                         Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#C2");
347                         Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#C3");
348                         Assert.AreEqual (2, lvw.SelectedIndices.Count, "#C4");
349                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#C5");
350                         Assert.AreEqual (2, lvw.SelectedIndices [1], "#C6");
351                         form.Dispose ();
352                 }
353
354 #if NET_2_0
355                 [Test]
356                 public void FindItemWithText ()
357                 {
358                         ListView lvw = new ListView();
359                         ListViewItem lvi1 = new ListViewItem (String.Empty);
360                         ListViewItem lvi2 = new ListViewItem ("angle bracket");
361                         ListViewItem lvi3 = new ListViewItem ("bracket holder");
362                         ListViewItem lvi4 = new ListViewItem ("bracket");
363                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4 });
364
365                         Assert.AreEqual (lvi1, lvw.FindItemWithText (String.Empty), "#A1");
366                         Assert.AreEqual (lvi3, lvw.FindItemWithText ("bracket"), "#A2");
367                         Assert.AreEqual (lvi3, lvw.FindItemWithText ("BrackeT"), "#A3");
368                         Assert.IsNull (lvw.FindItemWithText ("holder"), "#A5");
369
370                         Assert.AreEqual (lvw.Items [3], lvw.FindItemWithText ("bracket", true, 3), "#B1");
371
372                         Assert.AreEqual (lvw.Items [2], lvw.FindItemWithText ("bracket", true, 0, true), "#C1");
373                         Assert.AreEqual (lvw.Items [3], lvw.FindItemWithText ("bracket", true, 0, false), "#C2");
374                         Assert.AreEqual(lvw.Items [3], lvw.FindItemWithText("BrackeT", true, 0, false), "#C3");
375                         Assert.IsNull (lvw.FindItemWithText ("brack", true, 0, false), "#C4");
376
377                         // Sub item search tests
378                         lvw.Items.Clear ();
379
380                         lvi1.Text = "A";
381                         lvi1.SubItems.Add ("car bracket");
382                         lvi1.SubItems.Add ("C");
383
384                         lvi2.Text = "B";
385                         lvi2.SubItems.Add ("car");
386
387                         lvi3.Text = "C";
388
389                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3 });
390
391                         Assert.AreEqual (lvi1, lvw.FindItemWithText ("car", true, 0), "#D1");
392                         Assert.AreEqual (lvi3, lvw.FindItemWithText ("C", true, 0), "#D2");
393                         Assert.AreEqual (lvi2, lvw.FindItemWithText ("car", true, 1), "#D3");
394                         Assert.IsNull (lvw.FindItemWithText ("car", false, 0), "#D4");
395
396                         Assert.AreEqual (lvi1, lvw.FindItemWithText ("car", true, 0, true), "#E1");
397                         Assert.AreEqual (lvi2, lvw.FindItemWithText ("car", true, 0, false), "#E2");
398                         Assert.AreEqual (lvi2, lvw.FindItemWithText ("CaR", true, 0, false), "#E3");
399                 }
400
401                 [Test]
402                 public void FindItemWithText_Exceptions ()
403                 {
404                         ListView lvw = new ListView ();
405
406                         // Shouldn't throw any exception
407                         lvw.FindItemWithText (null);
408
409                         try {
410                                 lvw.FindItemWithText (null, false, 0);
411                                 Assert.Fail ("#A1");
412                         } catch (ArgumentOutOfRangeException) {
413                         }
414
415                         try {
416                                 lvw.FindItemWithText (null, false, lvw.Items.Count);
417                                 Assert.Fail ("#A2");
418                         } catch (ArgumentOutOfRangeException) {
419                         }
420
421                         // Add a single item
422                         lvw.Items.Add ("bracket");
423
424                         try {
425                                 lvw.FindItemWithText (null);
426                                 Assert.Fail ("#A3");
427                         } catch (ArgumentNullException) {
428                         }
429
430                         try {
431                                 lvw.FindItemWithText ("bracket", false, -1);
432                                 Assert.Fail ("#A4");
433                         } catch (ArgumentOutOfRangeException) {
434                         }
435
436                         try {
437                                 lvw.FindItemWithText ("bracket", false, lvw.Items.Count);
438                                 Assert.Fail ("#A5");
439                         } catch (ArgumentOutOfRangeException) {
440                         }
441                 }
442
443                 [Test]
444                 public void HotTracking ()
445                 {
446                         ListView lvw = new ListView ();
447
448                         lvw.HotTracking = true;
449                         Assert.AreEqual (true, lvw.HotTracking, "#A1");
450                         Assert.AreEqual (true, lvw.HoverSelection, "#A2");
451                         Assert.AreEqual (ItemActivation.OneClick, lvw.Activation, "#A3");
452
453                         // HoverSelection and Activation keep the previous value
454                         lvw.HotTracking = false;
455                         Assert.AreEqual (false, lvw.HotTracking, "#B1");
456                         Assert.AreEqual (true, lvw.HoverSelection, "#B2");
457                         Assert.AreEqual (ItemActivation.OneClick, lvw.Activation, "#B3");
458
459                         lvw.HotTracking = true;
460                         try {
461                                 lvw.HoverSelection = false;
462                                 Assert.Fail ("#C1");
463                         } catch (ArgumentException) {
464                         }
465
466                         try {
467                                 lvw.Activation = ItemActivation.Standard;
468                                 Assert.Fail ("#C2");
469                         } catch (ArgumentException) {
470                         }
471                 }
472
473                 [Test]
474                 public void RedrawItems_Exceptions ()
475                 {
476                         ListView lvw = new ListView ();
477                         lvw.Items.Add ("A");
478                         lvw.Items.Add ("B");
479
480                         try {
481                                 lvw.RedrawItems (-1, 1, true);
482                                 Assert.Fail ("#A1");
483                         } catch (ArgumentOutOfRangeException) {
484                         }
485
486                         try {
487                                 lvw.RedrawItems (0, -1, true);
488                                 Assert.Fail ("#A2");
489                         } catch (ArgumentOutOfRangeException) {
490                         }
491
492                         try {
493                                 lvw.RedrawItems (lvw.Items.Count, 1, true);
494                                 Assert.Fail ("#A3");
495                         } catch (ArgumentOutOfRangeException) {
496                         }
497
498                         try {
499                                 lvw.RedrawItems (0, lvw.Items.Count, true);
500                                 Assert.Fail ("#A4");
501                         } catch (ArgumentOutOfRangeException) {
502                         }
503
504                         try {
505                                 lvw.RedrawItems (1, 0, true);
506                                 Assert.Fail ("#A5");
507                         } catch (ArgumentException) {
508                         }
509                 }
510
511                 const int item_count = 3;
512                 ListViewItem [] items = new ListViewItem [item_count];
513
514                 [Test]
515                 public void VirtualMode ()
516                 {
517                         ListView lvw = new ListView ();
518                         lvw.VirtualListSize = item_count;
519                         lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
520                         lvw.VirtualMode = true;
521
522                         CreateListViewItems (item_count);
523
524                         Assert.AreEqual (item_count, lvw.Items.Count, "#A1");
525                         Assert.AreEqual (true, lvw.VirtualMode, "#A2");
526
527                         Assert.AreEqual (items [0], lvw.Items [0], "#B1");
528                         Assert.AreEqual (items [1], lvw.Items [1], "#B2");
529                         Assert.AreEqual (items [2], lvw.Items [2], "#B3");
530                         Assert.AreEqual (0, lvw.Items [0].Index, "#B4");
531                         Assert.AreEqual (1, lvw.Items [1].Index, "#B5");
532                         Assert.AreEqual (2, lvw.Items [2].Index, "#B6");
533                         Assert.AreEqual (lvw, lvw.Items [0].ListView, "#B7");
534                         Assert.AreEqual (lvw, lvw.Items [1].ListView, "#B8");
535                         Assert.AreEqual (lvw, lvw.Items [2].ListView, "#B9");
536
537                         // force to re-create the items, because we need a blank state
538                         // for our items
539                         CreateListViewItems (item_count);
540                         items [0].Name = "A";
541                         items [1].Name = "B";
542                         items [2].Name = "C";
543
544                         Assert.AreEqual (items [0], lvw.Items ["A"], "#C1");
545                         Assert.AreEqual (items [1], lvw.Items ["B"], "#C2");
546                         Assert.AreEqual (items [2], lvw.Items ["C"], "#C3");
547                         Assert.AreEqual (0, lvw.Items ["A"].Index, "#C4");
548                         Assert.AreEqual (1, lvw.Items ["B"].Index, "#C5");
549                         Assert.AreEqual (2, lvw.Items ["C"].Index, "#C6");
550                         Assert.AreEqual (lvw, lvw.Items ["A"].ListView, "#C7");
551                         Assert.AreEqual (lvw, lvw.Items ["B"].ListView, "#C8");
552                         Assert.AreEqual (lvw, lvw.Items ["C"].ListView, "#C9");
553                         Assert.IsNull (lvw.Items ["Invalid key"], "#C10");
554                         Assert.IsNull (lvw.Items [String.Empty], "#C11");
555
556                         Assert.AreEqual (false, lvw.Items.ContainsKey (String.Empty), "#D1");
557                         Assert.AreEqual (false, lvw.Items.ContainsKey (null), "#D2");
558                         Assert.AreEqual (true, lvw.Items.ContainsKey ("A"), "#D3");
559                         Assert.AreEqual (true, lvw.Items.ContainsKey ("a"), "#D4");
560                         Assert.AreEqual (true, lvw.Items.ContainsKey ("B"), "#D5");
561                 }
562
563                 void ListViewRetrieveVirtualItemHandler (object o, RetrieveVirtualItemEventArgs args)
564                 {
565                         args.Item = items [args.ItemIndex];
566                 }
567
568                 void CreateListViewItems(int count)
569                 {
570                         items = new ListViewItem [count];
571
572                         for (int i = 0; i < count; i++)
573                                 items [i] = new ListViewItem (String.Empty);
574                 }
575
576                 [Test]
577                 public void VirtualMode_Exceptions()
578                 {
579                         ListView lvw = new ListView ();
580
581                         lvw.Items.Add ("Simple item");
582                         try {
583                                 lvw.VirtualMode = true;
584                                 Assert.Fail ("#A1");
585                         } catch (InvalidOperationException) {
586                         }
587
588                         lvw.Items.Clear();
589                         lvw.VirtualMode = true;
590                         lvw.VirtualListSize = 1;
591
592                         lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
593                         CreateListViewItems (1);
594
595                         try {
596                                 lvw.Sort ();
597                                 Assert.Fail ("#A3");
598                         } catch (InvalidOperationException) {
599                         }
600                 }
601
602                 [Test]
603                 public void VirtualListSize ()
604                 {
605                         ListView lvw = new ListView ();
606
607                         lvw.VirtualListSize = item_count;
608                         Assert.AreEqual (item_count, lvw.VirtualListSize, "#A1");
609                         Assert.AreEqual (0, lvw.Items.Count, "#A2");
610
611                         lvw.VirtualMode = true;
612                         Assert.AreEqual (item_count, lvw.VirtualListSize, "#B1");
613                         Assert.AreEqual (item_count, lvw.Items.Count, "#B2");
614
615                         lvw.VirtualMode = false;
616                         Assert.AreEqual (item_count, lvw.VirtualListSize, "#C1");
617                         Assert.AreEqual (0, lvw.Items.Count, "#C2");
618                 }
619
620                 [Test]
621                 public void VirtualListSize_Exceptions ()
622                 {
623                         ListView lvw = new ListView ();
624                         try {
625                                 lvw.VirtualListSize = -1;
626                                 Assert.Fail ("#A1");
627                         } catch (ArgumentException) {
628                         }
629                 }
630 #endif
631
632                 [Test]
633                 public void Sort_Details_Checked ()
634                 {
635                         AssertSort_Checked (View.Details);
636                 }
637
638                 [Test]
639                 public void Sort_Details_Created ()
640                 {
641                         AssertSortNoIcon_Created (View.Details);
642                 }
643
644                 [Test]
645                 public void Sort_Details_NotCreated ()
646                 {
647                         AssertSortNoIcon_NotCreated (View.Details);
648                 }
649
650                 [Test]
651                 public void Sort_Details_Selected ()
652                 {
653                         AssertSort_Selected (View.Details);
654                 }
655
656                 [Test]
657                 public void Sort_LargeIcon_Checked ()
658                 {
659                         AssertSort_Checked (View.LargeIcon);
660                 }
661
662                 [Test]
663                 public void Sort_LargeIcon_Created ()
664                 {
665                         AssertSortIcon_Created (View.LargeIcon);
666                 }
667
668                 [Test]
669                 public void Sort_LargeIcon_NotCreated ()
670                 {
671                         AssertSortIcon_NotCreated (View.LargeIcon);
672                 }
673
674                 [Test]
675                 public void Sort_LargeIcon_Selected ()
676                 {
677                         AssertSort_Selected (View.LargeIcon);
678                 }
679
680                 [Test]
681                 public void Sort_List_Checked ()
682                 {
683                         AssertSort_Checked (View.List);
684                 }
685
686                 [Test]
687                 public void Sort_List_Created ()
688                 {
689                         AssertSortNoIcon_Created (View.List);
690                 }
691
692                 [Test]
693                 public void Sort_List_NotCreated ()
694                 {
695                         AssertSortNoIcon_NotCreated (View.List);
696                 }
697
698                 [Test]
699                 public void Sort_List_Selection ()
700                 {
701                         AssertSort_Selected (View.List);
702                 }
703
704                 [Test]
705                 public void Sort_SmallIcon_Checked ()
706                 {
707                         AssertSort_Checked (View.SmallIcon);
708                 }
709
710                 [Test]
711                 public void Sort_SmallIcon_Created ()
712                 {
713                         AssertSortIcon_Created (View.SmallIcon);
714                 }
715
716                 [Test]
717                 public void Sort_SmallIcon_NotCreated ()
718                 {
719                         AssertSortIcon_NotCreated (View.SmallIcon);
720                 }
721
722                 [Test]
723                 public void Sort_SmallIcon_Selection ()
724                 {
725                         AssertSort_Selected (View.SmallIcon);
726                 }
727
728 #if NET_2_0
729                 [Test]
730                 [ExpectedException (typeof (NotSupportedException))]
731                 public void Sort_Tile_Checked ()
732                 {
733                         AssertSort_Checked (View.Tile);
734                 }
735
736                 [Test]
737                 public void Sort_Tile_Created ()
738                 {
739                         AssertSortNoIcon_Created (View.Tile);
740                 }
741
742                 [Test]
743                 public void Sort_Tile_NotCreated ()
744                 {
745                         AssertSortNoIcon_NotCreated (View.Tile);
746                 }
747
748                 [Test]
749                 public void Sort_Tile_Selection ()
750                 {
751                         AssertSort_Selected (View.Tile);
752                 }
753 #endif
754
755                 private void AssertSortIcon_Created (View view)
756                 {
757                         int compareCount = 0;
758
759                         Form form = new Form ();
760                         form.ShowInTaskbar = false;
761                         ListView lvw = CreateListView (view);
762                         form.Controls.Add (lvw);
763                         Assert.IsNull (lvw.ListViewItemSorter, "#A");
764
765                         form.Show ();
766
767                         Assert.IsNull (lvw.ListViewItemSorter, "#B1");
768                         Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
769                         Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
770                         Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
771
772                         lvw.Sorting = SortOrder.None;
773                         Assert.IsNull (lvw.ListViewItemSorter, "#C1");
774                         Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
775                         Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
776                         Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
777
778                         lvw.Sorting = SortOrder.Descending;
779                         Assert.IsNotNull (lvw.ListViewItemSorter, "#D1");
780                         Assert.AreEqual ("C", lvw.Items [0].Text, "#D2");
781                         Assert.AreEqual ("B", lvw.Items [1].Text, "#D3");
782                         Assert.AreEqual ("A", lvw.Items [2].Text, "#D4");
783
784                         lvw.Sorting = SortOrder.Ascending;
785                         Assert.IsNotNull (lvw.ListViewItemSorter, "#E1");
786 #if NET_2_0
787                         Assert.AreEqual ("A", lvw.Items [0].Text, "#E2");
788                         Assert.AreEqual ("B", lvw.Items [1].Text, "#E3");
789                         Assert.AreEqual ("C", lvw.Items [2].Text, "#E4");
790 #else
791                         // in .NET 1.1, changing Sorting does not have any effect for
792                         // SmallIcon and LargeIcon view if no custom comparer is used
793                         Assert.AreEqual ("C", lvw.Items [0].Text, "#E2");
794                         Assert.AreEqual ("B", lvw.Items [1].Text, "#E3");
795                         Assert.AreEqual ("A", lvw.Items [2].Text, "#E4");
796 #endif
797
798                         lvw.Sorting = SortOrder.None;
799                         Assert.IsNotNull (lvw.ListViewItemSorter, "#F1");
800 #if NET_2_0
801                         Assert.AreEqual ("A", lvw.Items [0].Text, "#F2");
802                         Assert.AreEqual ("B", lvw.Items [1].Text, "#F3");
803                         Assert.AreEqual ("C", lvw.Items [2].Text, "#F4");
804 #else
805                         // in .NET 1.1, changing Sorting does not have any effect for
806                         // SmallIcon and LargeIcon view if no custom comparer is used
807                         Assert.AreEqual ("C", lvw.Items [0].Text, "#E2");
808                         Assert.AreEqual ("B", lvw.Items [1].Text, "#E3");
809                         Assert.AreEqual ("A", lvw.Items [2].Text, "#E4");
810 #endif
811
812                         lvw.Sorting = SortOrder.Ascending;
813                         Assert.IsNotNull (lvw.ListViewItemSorter, "#G1");
814 #if NET_2_0
815                         Assert.AreEqual ("A", lvw.Items [0].Text, "#G2");
816                         Assert.AreEqual ("B", lvw.Items [1].Text, "#G3");
817                         Assert.AreEqual ("C", lvw.Items [2].Text, "#G4");
818 #else
819                         // in .NET 1.1, changing Sorting does not have any effect for
820                         // SmallIcon and LargeIcon view if no custom comparer is used
821                         Assert.AreEqual ("C", lvw.Items [0].Text, "#G2");
822                         Assert.AreEqual ("B", lvw.Items [1].Text, "#G3");
823                         Assert.AreEqual ("A", lvw.Items [2].Text, "#G4");
824 #endif
825
826                         lvw.Sorting = SortOrder.Descending;
827                         Assert.IsNotNull (lvw.ListViewItemSorter, "#G1");
828                         Assert.AreEqual ("C", lvw.Items [0].Text, "#G2");
829                         Assert.AreEqual ("B", lvw.Items [1].Text, "#G3");
830                         Assert.AreEqual ("A", lvw.Items [2].Text, "#G4");
831
832                         lvw.Sorting = SortOrder.None;
833                         Assert.IsNotNull (lvw.ListViewItemSorter, "#H1");
834                         Assert.AreEqual ("C", lvw.Items [0].Text, "#H2");
835                         Assert.AreEqual ("B", lvw.Items [1].Text, "#H3");
836                         Assert.AreEqual ("A", lvw.Items [2].Text, "#H4");
837
838                         // when Sorting is None and a new item is added, the collection is
839                         // sorted using the previous Sorting value
840                         lvw.Items.Add ("BB");
841                         Assert.IsNotNull (lvw.ListViewItemSorter, "#I1");
842                         Assert.AreEqual ("C", lvw.Items [0].Text, "#I2");
843                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#I3");
844                         Assert.AreEqual ("B", lvw.Items [2].Text, "#I4");
845                         Assert.AreEqual ("A", lvw.Items [3].Text, "#I5");
846
847                         lvw.Sorting = SortOrder.Ascending;
848                         Assert.IsNotNull (lvw.ListViewItemSorter, "#J1");
849 #if NET_2_0
850                         Assert.AreEqual ("A", lvw.Items [0].Text, "#J2");
851                         Assert.AreEqual ("B", lvw.Items [1].Text, "#J3");
852                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#J4");
853                         Assert.AreEqual ("C", lvw.Items [3].Text, "#J5");
854 #else
855                         // in .NET 1.1, changing Sorting does not have any effect for
856                         // SmallIcon and LargeIcon view if no custom comparer is used
857                         Assert.AreEqual ("C", lvw.Items [0].Text, "#J2");
858                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#J3");
859                         Assert.AreEqual ("B", lvw.Items [2].Text, "#J4");
860                         Assert.AreEqual ("A", lvw.Items [3].Text, "#J5");
861 #endif
862
863                         // when Sorting is not None and a new item is added, the
864                         // collection is re-sorted automatically
865                         lvw.Items.Add ("BA");
866                         Assert.IsNotNull (lvw.ListViewItemSorter, "#K1");
867 #if NET_2_0
868                         Assert.AreEqual ("A", lvw.Items [0].Text, "#K2");
869                         Assert.AreEqual ("B", lvw.Items [1].Text, "#K3");
870                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#K4");
871                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#K5");
872                         Assert.AreEqual ("C", lvw.Items [4].Text, "#K6");
873 #else
874                         // in .NET 1.1, changing Sorting does not have any effect for
875                         // SmallIcon and LargeIcon view if no custom comparer is used
876                         Assert.AreEqual ("C", lvw.Items [0].Text, "#K2");
877                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#K3");
878                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#K4");
879                         Assert.AreEqual ("B", lvw.Items [3].Text, "#K5");
880                         Assert.AreEqual ("A", lvw.Items [4].Text, "#K6");
881 #endif
882
883                         // assign a custom comparer
884                         MockComparer mc = new MockComparer (false);
885                         lvw.ListViewItemSorter = mc;
886
887                         // when a custom IComparer is assigned, the collection is immediately
888                         // re-sorted
889                         Assert.IsTrue (mc.CompareCount > compareCount, "#L1");
890                         Assert.IsNotNull (lvw.ListViewItemSorter, "#L2");
891                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#L3");
892                         Assert.AreEqual ("C", lvw.Items [0].Text, "#L4");
893                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#L5");
894                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#L6");
895                         Assert.AreEqual ("B", lvw.Items [3].Text, "#L7");
896                         Assert.AreEqual ("A", lvw.Items [4].Text, "#L8");
897
898                         // record compare count
899                         compareCount = mc.CompareCount;
900
901                         // modifying Sorting results in re-sort
902                         lvw.Sorting = SortOrder.Descending;
903                         Assert.IsTrue (mc.CompareCount > compareCount, "#M1");
904                         Assert.IsNotNull (lvw.ListViewItemSorter, "#M2");
905                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#M3");
906                         Assert.AreEqual ("A", lvw.Items [0].Text, "#M4");
907                         Assert.AreEqual ("B", lvw.Items [1].Text, "#M5");
908                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#M6");
909                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#M7");
910                         Assert.AreEqual ("C", lvw.Items [4].Text, "#M8");
911
912                         // record compare count
913                         compareCount = mc.CompareCount;
914
915                         // setting Sorting to the same value does not result in a sort
916                         // operation
917                         lvw.Sorting = SortOrder.Descending;
918                         Assert.AreEqual (compareCount, mc.CompareCount, "#N1");
919                         Assert.IsNotNull (lvw.ListViewItemSorter, "#N2");
920                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#N3");
921                         Assert.AreEqual ("A", lvw.Items [0].Text, "#N4");
922                         Assert.AreEqual ("B", lvw.Items [1].Text, "#N5");
923                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#N6");
924                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#N7");
925                         Assert.AreEqual ("C", lvw.Items [4].Text, "#N8");
926
927                         // modifying Sorting results in re-sort
928                         lvw.Sorting = SortOrder.Ascending;
929                         Assert.IsTrue (mc.CompareCount > compareCount, "#O1");
930                         Assert.IsNotNull (lvw.ListViewItemSorter, "#O2");
931                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#O3");
932                         Assert.AreEqual ("C", lvw.Items [0].Text, "#O4");
933                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#O5");
934                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#O6");
935                         Assert.AreEqual ("B", lvw.Items [3].Text, "#O7");
936                         Assert.AreEqual ("A", lvw.Items [4].Text, "#O8");
937
938                         // record compare count
939                         compareCount = mc.CompareCount;
940
941                         // adding an item when Sorting is not None causes re-sort
942                         lvw.Items.Add ("BC");
943                         Assert.IsTrue (mc.CompareCount > compareCount, "#P1");
944                         Assert.IsNotNull (lvw.ListViewItemSorter, "#P2");
945                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#P3");
946                         Assert.AreEqual ("C", lvw.Items [0].Text, "#P4");
947                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#P5");
948                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#P6");
949                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#P7");
950                         Assert.AreEqual ("B", lvw.Items [4].Text, "#P8");
951                         Assert.AreEqual ("A", lvw.Items [5].Text, "#P9");
952
953                         // record compare count
954                         compareCount = mc.CompareCount;
955
956                         // assigning the same custom IComparer again does not result in a
957                         // re-sort
958                         lvw.ListViewItemSorter = mc;
959                         Assert.AreEqual (compareCount, mc.CompareCount, "#Q1");
960                         Assert.IsNotNull (lvw.ListViewItemSorter, "#Q2");
961                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#Q3");
962                         Assert.AreEqual ("C", lvw.Items [0].Text, "#Q4");
963                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#Q5");
964                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#Q6");
965                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#Q7");
966                         Assert.AreEqual ("B", lvw.Items [4].Text, "#Q8");
967                         Assert.AreEqual ("A", lvw.Items [5].Text, "#Q9");
968
969                         // setting Sorting to None does not perform a sort
970                         lvw.Sorting = SortOrder.None;
971                         Assert.AreEqual (compareCount, mc.CompareCount, "#R1");
972                         Assert.IsNotNull (lvw.ListViewItemSorter, "#R2");
973                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#R3");
974                         Assert.AreEqual ("C", lvw.Items [0].Text, "#R4");
975                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#R5");
976                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#R6");
977                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#R7");
978                         Assert.AreEqual ("B", lvw.Items [4].Text, "#R8");
979                         Assert.AreEqual ("A", lvw.Items [5].Text, "#R9");
980
981                         // assigning the custom IComparer again does not result in a
982                         // re-sort
983                         lvw.ListViewItemSorter = mc;
984                         Assert.AreEqual (compareCount, mc.CompareCount, "#S1");
985                         Assert.IsNotNull (lvw.ListViewItemSorter, "#S2");
986                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#S3");
987                         Assert.AreEqual ("C", lvw.Items [0].Text, "#S4");
988                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#S5");
989                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#S6");
990                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#S7");
991                         Assert.AreEqual ("B", lvw.Items [4].Text, "#S8");
992                         Assert.AreEqual ("A", lvw.Items [5].Text, "#S9");
993
994                         // set Sorting to Ascending again
995                         lvw.Sorting = SortOrder.Ascending;
996                         Assert.IsTrue (mc.CompareCount > compareCount, "#T1");
997                         Assert.IsNotNull (lvw.ListViewItemSorter, "#T2");
998                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#T3");
999                         Assert.AreEqual ("C", lvw.Items [0].Text, "#T4");
1000                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#T5");
1001                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#T6");
1002                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#T7");
1003                         Assert.AreEqual ("B", lvw.Items [4].Text, "#T8");
1004                         Assert.AreEqual ("A", lvw.Items [5].Text, "#T9");
1005
1006                         // record compare count
1007                         compareCount = mc.CompareCount;
1008
1009                         // explicitly calling Sort results in a sort operation
1010                         lvw.Sort ();
1011                         Assert.IsTrue (mc.CompareCount > compareCount, "#U1");
1012                         Assert.IsNotNull (lvw.ListViewItemSorter, "#U2");
1013                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#U3");
1014                         Assert.AreEqual ("C", lvw.Items [0].Text, "#U4");
1015                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#U5");
1016                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#U6");
1017                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#U7");
1018                         Assert.AreEqual ("B", lvw.Items [4].Text, "#U8");
1019                         Assert.AreEqual ("A", lvw.Items [5].Text, "#U9");
1020                         lvw.Sorting = SortOrder.None;
1021
1022                         // record compare count
1023                         compareCount = mc.CompareCount;
1024
1025                         // adding an item when Sorting is None causes re-sort
1026                         lvw.Items.Add ("BD");
1027                         Assert.IsTrue (mc.CompareCount > compareCount, "#V1");
1028                         Assert.IsNotNull (lvw.ListViewItemSorter, "#V2");
1029                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#V3");
1030                         Assert.AreEqual ("A", lvw.Items [0].Text, "#V4");
1031                         Assert.AreEqual ("B", lvw.Items [1].Text, "#V5");
1032                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#V6");
1033                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#V7");
1034                         Assert.AreEqual ("BC", lvw.Items [4].Text, "#V8");
1035                         Assert.AreEqual ("BD", lvw.Items [5].Text, "#V9");
1036                         Assert.AreEqual ("C", lvw.Items [6].Text, "#V10");
1037
1038                         // record compare count
1039                         compareCount = mc.CompareCount;
1040
1041                         // explicitly calling Sort when Sorting is None causes a re-sort
1042                         lvw.Sort ();
1043                         Assert.IsTrue (mc.CompareCount > compareCount, "#W1");
1044                         Assert.IsNotNull (lvw.ListViewItemSorter, "#W2");
1045                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#W3");
1046                         Assert.AreEqual ("A", lvw.Items [0].Text, "#W4");
1047                         Assert.AreEqual ("B", lvw.Items [1].Text, "#W5");
1048                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#W6");
1049                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#W7");
1050                         Assert.AreEqual ("BC", lvw.Items [4].Text, "#W8");
1051                         Assert.AreEqual ("BD", lvw.Items [5].Text, "#W9");
1052                         Assert.AreEqual ("C", lvw.Items [6].Text, "#W10");
1053
1054                         // record compare count
1055                         compareCount = mc.CompareCount;
1056                         form.Dispose ();
1057                 }
1058
1059                 private void AssertSortIcon_NotCreated (View view)
1060                 {
1061                         Form form = new Form ();
1062                         form.ShowInTaskbar = false;
1063                         ListView lvw = CreateListView (view);
1064                         form.Controls.Add (lvw);
1065
1066                         Assert.IsNull (lvw.ListViewItemSorter, "#A1");
1067                         Assert.AreEqual ("B", lvw.Items [0].Text, "#A2");
1068                         Assert.AreEqual ("A", lvw.Items [1].Text, "#A3");
1069                         Assert.AreEqual ("C", lvw.Items [2].Text, "#A4");
1070
1071                         lvw.Sorting = SortOrder.None;
1072                         Assert.IsNull (lvw.ListViewItemSorter, "#B1");
1073                         Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
1074                         Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
1075                         Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
1076
1077                         lvw.Sorting = SortOrder.Descending;
1078                         Assert.IsNotNull (lvw.ListViewItemSorter, "#C1");
1079                         Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
1080                         Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
1081                         Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
1082
1083                         lvw.Sorting = SortOrder.Ascending;
1084                         Assert.IsNotNull (lvw.ListViewItemSorter, "#D1");
1085                         Assert.AreEqual ("B", lvw.Items [0].Text, "#D2");
1086                         Assert.AreEqual ("A", lvw.Items [1].Text, "#D3");
1087                         Assert.AreEqual ("C", lvw.Items [2].Text, "#D4");
1088
1089                         // when the handle is not created and a new item is added, the new
1090                         // item is just appended to the collection
1091                         lvw.Items.Add ("BB");
1092                         Assert.IsNotNull (lvw.ListViewItemSorter, "#E1");
1093                         Assert.AreEqual ("B", lvw.Items [0].Text, "#E2");
1094                         Assert.AreEqual ("A", lvw.Items [1].Text, "#E3");
1095                         Assert.AreEqual ("C", lvw.Items [2].Text, "#E4");
1096                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#E5");
1097
1098                         // assign a custom comparer
1099                         MockComparer mc = new MockComparer (false);
1100                         lvw.ListViewItemSorter = mc;
1101
1102                         // assigning a custom IComparer has no effect
1103                         Assert.AreEqual (0, mc.CompareCount, "#F1");
1104                         Assert.IsNotNull (lvw.ListViewItemSorter, "#F2");
1105                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#F3");
1106                         Assert.AreEqual ("B", lvw.Items [0].Text, "#F4");
1107                         Assert.AreEqual ("A", lvw.Items [1].Text, "#F5");
1108                         Assert.AreEqual ("C", lvw.Items [2].Text, "#F6");
1109                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#F7");
1110
1111                         // modifying Sorting does not result in sort operation
1112                         lvw.Sorting = SortOrder.Descending;
1113                         Assert.AreEqual (0, mc.CompareCount, "#G1");
1114                         Assert.IsNotNull (lvw.ListViewItemSorter, "#G2");
1115                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#G3");
1116                         Assert.AreEqual ("B", lvw.Items [0].Text, "#G4");
1117                         Assert.AreEqual ("A", lvw.Items [1].Text, "#G5");
1118                         Assert.AreEqual ("C", lvw.Items [2].Text, "#G6");
1119                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#G7");
1120
1121                         // setting Sorting to the same value does not result in a sort
1122                         // operation
1123                         lvw.Sorting = SortOrder.Descending;
1124                         Assert.AreEqual (0, mc.CompareCount, "#H1");
1125                         Assert.IsNotNull (lvw.ListViewItemSorter, "#H2");
1126                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#H3");
1127                         Assert.AreEqual ("B", lvw.Items [0].Text, "#H4");
1128                         Assert.AreEqual ("A", lvw.Items [1].Text, "#H5");
1129                         Assert.AreEqual ("C", lvw.Items [2].Text, "#H6");
1130                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#H7");
1131
1132                         // setting Sorting to None does not result in a sort operation
1133                         lvw.Sorting = SortOrder.None;
1134                         Assert.AreEqual (0, mc.CompareCount, "#I1");
1135                         Assert.IsNotNull (lvw.ListViewItemSorter, "#I2");
1136                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#I3");
1137                         Assert.AreEqual ("B", lvw.Items [0].Text, "#I4");
1138                         Assert.AreEqual ("A", lvw.Items [1].Text, "#I5");
1139                         Assert.AreEqual ("C", lvw.Items [2].Text, "#I6");
1140                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#I7");
1141
1142                         // explicitly calling Sort when Sorting is None does not result
1143                         // in a sort operation
1144                         lvw.Sort ();
1145                         Assert.AreEqual (0, mc.CompareCount, "#J1");
1146                         Assert.IsNotNull (lvw.ListViewItemSorter, "#J2");
1147                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#J3");
1148                         Assert.AreEqual ("B", lvw.Items [0].Text, "#J4");
1149                         Assert.AreEqual ("A", lvw.Items [1].Text, "#J5");
1150                         Assert.AreEqual ("C", lvw.Items [2].Text, "#J6");
1151                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#J7");
1152
1153                         // setting Sorting again does not result in a sort operation
1154                         lvw.Sorting = SortOrder.Ascending;
1155                         Assert.AreEqual (0, mc.CompareCount, "#K1");
1156                         Assert.IsNotNull (lvw.ListViewItemSorter, "#K2");
1157                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#K3");
1158                         Assert.AreEqual ("B", lvw.Items [0].Text, "#K4");
1159                         Assert.AreEqual ("A", lvw.Items [1].Text, "#K5");
1160                         Assert.AreEqual ("C", lvw.Items [2].Text, "#K6");
1161                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#K7");
1162
1163                         // explicitly calling Sort when Sorting is Ascending does not 
1164                         // result in a sort operation
1165                         lvw.Sort ();
1166                         Assert.AreEqual (0, mc.CompareCount, "#L1");
1167                         Assert.IsNotNull (lvw.ListViewItemSorter, "#L2");
1168                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#L3");
1169                         Assert.AreEqual ("B", lvw.Items [0].Text, "#L4");
1170                         Assert.AreEqual ("A", lvw.Items [1].Text, "#L5");
1171                         Assert.AreEqual ("C", lvw.Items [2].Text, "#L6");
1172                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#L7");
1173
1174                         // show the form to create the handle
1175                         form.Show ();
1176
1177                         // when the handle is created, the items are immediately sorted
1178                         Assert.IsTrue (mc.CompareCount > 0, "#L1");
1179                         Assert.IsNotNull (lvw.ListViewItemSorter, "#M2");
1180                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#M3");
1181                         Assert.AreEqual ("C", lvw.Items [0].Text, "#M4");
1182                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#M5");
1183                         Assert.AreEqual ("B", lvw.Items [2].Text, "#M6");
1184                         Assert.AreEqual ("A", lvw.Items [3].Text, "#M7");
1185
1186                         // setting ListViewItemSorter to null does not result in sort
1187                         // operation
1188                         lvw.ListViewItemSorter = null;
1189                         Assert.IsNull (lvw.ListViewItemSorter, "#N1");
1190                         Assert.AreEqual ("C", lvw.Items [0].Text, "#N2");
1191                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#N3");
1192                         Assert.AreEqual ("B", lvw.Items [2].Text, "#N4");
1193                         Assert.AreEqual ("A", lvw.Items [3].Text, "#N5");
1194
1195                         // explicitly calling sort does not result in sort operation
1196                         lvw.Sort ();
1197                         Assert.IsNull (lvw.ListViewItemSorter, "#O1");
1198                         Assert.AreEqual ("C", lvw.Items [0].Text, "#O2");
1199                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#O3");
1200                         Assert.AreEqual ("B", lvw.Items [2].Text, "#O4");
1201                         Assert.AreEqual ("A", lvw.Items [3].Text, "#O5");
1202
1203                         form.Dispose ();
1204                 }
1205
1206                 private void AssertSortNoIcon_Created (View view)
1207                 {
1208                         int compareCount = 0;
1209
1210                         Form form = new Form ();
1211                         form.ShowInTaskbar = false;
1212                         ListView lvw = CreateListView (view);
1213                         form.Controls.Add (lvw);
1214                         Assert.IsNull (lvw.ListViewItemSorter, "#A");
1215
1216                         form.Show ();
1217
1218                         Assert.IsNull (lvw.ListViewItemSorter, "#B1");
1219                         Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
1220                         Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
1221                         Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
1222
1223                         lvw.Sorting = SortOrder.None;
1224                         Assert.IsNull (lvw.ListViewItemSorter, "#C1");
1225                         Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
1226                         Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
1227                         Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
1228
1229                         lvw.Sorting = SortOrder.Ascending;
1230                         Assert.IsNull (lvw.ListViewItemSorter, "#D1");
1231                         Assert.AreEqual ("A", lvw.Items [0].Text, "#D2");
1232                         Assert.AreEqual ("B", lvw.Items [1].Text, "#D3");
1233                         Assert.AreEqual ("C", lvw.Items [2].Text, "#D4");
1234
1235                         lvw.Sorting = SortOrder.Descending;
1236                         Assert.IsNull (lvw.ListViewItemSorter, "#E1");
1237                         Assert.AreEqual ("C", lvw.Items [0].Text, "#E2");
1238                         Assert.AreEqual ("B", lvw.Items [1].Text, "#E3");
1239                         Assert.AreEqual ("A", lvw.Items [2].Text, "#E4");
1240
1241                         lvw.Sorting = SortOrder.None;
1242                         Assert.IsNull (lvw.ListViewItemSorter, "#F1");
1243                         Assert.AreEqual ("C", lvw.Items [0].Text, "#F2");
1244                         Assert.AreEqual ("B", lvw.Items [1].Text, "#F3");
1245                         Assert.AreEqual ("A", lvw.Items [2].Text, "#F4");
1246
1247                         // when Sorting is None and a new item is added, the item is
1248                         // appended to the collection
1249                         lvw.Items.Add ("BB");
1250                         Assert.IsNull (lvw.ListViewItemSorter, "#G1");
1251                         Assert.AreEqual ("C", lvw.Items [0].Text, "#G2");
1252                         Assert.AreEqual ("B", lvw.Items [1].Text, "#G3");
1253                         Assert.AreEqual ("A", lvw.Items [2].Text, "#G4");
1254                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#G5");
1255
1256                         lvw.Sorting = SortOrder.Ascending;
1257                         Assert.IsNull (lvw.ListViewItemSorter, "#H1");
1258                         Assert.AreEqual ("A", lvw.Items [0].Text, "#H2");
1259                         Assert.AreEqual ("B", lvw.Items [1].Text, "#H3");
1260                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#H4");
1261                         Assert.AreEqual ("C", lvw.Items [3].Text, "#H5");
1262
1263                         // when Sorting is not None and a new item is added, the 
1264                         // collection is re-sorted automatically
1265                         lvw.Items.Add ("BA");
1266                         Assert.IsNull (lvw.ListViewItemSorter, "#I1");
1267                         Assert.AreEqual ("A", lvw.Items [0].Text, "#I2");
1268                         Assert.AreEqual ("B", lvw.Items [1].Text, "#I3");
1269                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#I4");
1270                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#I5");
1271                         Assert.AreEqual ("C", lvw.Items [4].Text, "#I6");
1272
1273                         // assign a custom comparer
1274                         MockComparer mc = new MockComparer (false);
1275                         lvw.ListViewItemSorter = mc;
1276
1277                         // when a custom IComparer is assigned, the collection is immediately
1278                         // re-sorted
1279                         Assert.IsTrue (mc.CompareCount > compareCount, "#J1");
1280                         Assert.IsNotNull (lvw.ListViewItemSorter, "#J2");
1281                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#J3");
1282                         Assert.AreEqual ("C", lvw.Items [0].Text, "#J4");
1283                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#J5");
1284                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#J6");
1285                         Assert.AreEqual ("B", lvw.Items [3].Text, "#J7");
1286                         Assert.AreEqual ("A", lvw.Items [4].Text, "#J8");
1287
1288                         // record compare count
1289                         compareCount = mc.CompareCount;
1290
1291                         // modifying the sort order results in a sort
1292                         lvw.Sorting = SortOrder.Descending;
1293                         Assert.IsTrue (mc.CompareCount > compareCount, "#L1");
1294                         Assert.IsNotNull (lvw.ListViewItemSorter, "#K2");
1295                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#K3");
1296                         Assert.AreEqual ("A", lvw.Items [0].Text, "#K4");
1297                         Assert.AreEqual ("B", lvw.Items [1].Text, "#K5");
1298                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#K6");
1299                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#K7");
1300                         Assert.AreEqual ("C", lvw.Items [4].Text, "#K8");
1301
1302                         // record compare count
1303                         compareCount = mc.CompareCount;
1304
1305                         // set the sort order to the same value does not result in a sort
1306                         // operation
1307                         lvw.Sorting = SortOrder.Descending;
1308                         Assert.AreEqual (compareCount, mc.CompareCount, "#L1");
1309                         Assert.IsNotNull (lvw.ListViewItemSorter, "#L2");
1310                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#L3");
1311                         Assert.AreEqual ("A", lvw.Items [0].Text, "#L4");
1312                         Assert.AreEqual ("B", lvw.Items [1].Text, "#L5");
1313                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#L6");
1314                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#L7");
1315                         Assert.AreEqual ("C", lvw.Items [4].Text, "#L8");
1316
1317                         // modifying the sort order results in a sort
1318                         lvw.Sorting = SortOrder.Ascending;
1319                         Assert.IsTrue (mc.CompareCount > compareCount, "#M1");
1320                         Assert.IsNotNull (lvw.ListViewItemSorter, "#M2");
1321                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#M3");
1322                         Assert.AreEqual ("C", lvw.Items [0].Text, "#M4");
1323                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#M5");
1324                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#M6");
1325                         Assert.AreEqual ("B", lvw.Items [3].Text, "#M7");
1326                         Assert.AreEqual ("A", lvw.Items [4].Text, "#M8");
1327
1328                         // record compare count
1329                         compareCount = mc.CompareCount;
1330
1331                         // adding an item when Sorting is not None caused a re-sort
1332                         lvw.Items.Add ("BC");
1333                         Assert.IsTrue (mc.CompareCount > compareCount, "#N1");
1334                         Assert.IsNotNull (lvw.ListViewItemSorter, "#N2");
1335                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#N3");
1336                         Assert.AreEqual ("C", lvw.Items [0].Text, "#N4");
1337                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#N5");
1338                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#N6");
1339                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#N7");
1340                         Assert.AreEqual ("B", lvw.Items [4].Text, "#N8");
1341                         Assert.AreEqual ("A", lvw.Items [5].Text, "#N9");
1342
1343                         // record compare count
1344                         compareCount = mc.CompareCount;
1345
1346                         // assigning the same custom IComparer again does not result in a
1347                         // re-sort
1348                         lvw.ListViewItemSorter = mc;
1349                         Assert.AreEqual (compareCount, mc.CompareCount, "#O1");
1350                         Assert.IsNotNull (lvw.ListViewItemSorter, "#O2");
1351                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#O3");
1352                         Assert.AreEqual ("C", lvw.Items [0].Text, "#O4");
1353                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#O5");
1354                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#O6");
1355                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#O7");
1356                         Assert.AreEqual ("B", lvw.Items [4].Text, "#O8");
1357                         Assert.AreEqual ("A", lvw.Items [5].Text, "#O9");
1358
1359                         // setting sort order to None does not perform a sort and resets
1360                         // the ListViewItemSorter
1361                         lvw.Sorting = SortOrder.None;
1362                         Assert.AreEqual (compareCount, mc.CompareCount, "#P1");
1363 #if NET_2_0
1364                         Assert.IsNull (lvw.ListViewItemSorter, "#P2");
1365 #else
1366                         Assert.IsNotNull (lvw.ListViewItemSorter, "#P2a");
1367                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#P2b");
1368 #endif
1369                         Assert.AreEqual ("C", lvw.Items [0].Text, "#P3");
1370                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#P4");
1371                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#P5");
1372                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#P6");
1373                         Assert.AreEqual ("B", lvw.Items [4].Text, "#P7");
1374                         Assert.AreEqual ("A", lvw.Items [5].Text, "#P8");
1375
1376
1377                         lvw.ListViewItemSorter = mc;
1378 #if NET_2_0
1379                         // assigning the previous custom IComparer again results in a
1380                         // re-sort
1381                         Assert.IsTrue (mc.CompareCount > compareCount, "#Q1");
1382                         Assert.IsNotNull (lvw.ListViewItemSorter, "#Q2");
1383                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#Q3");
1384                         Assert.AreEqual ("A", lvw.Items [0].Text, "#Q4");
1385                         Assert.AreEqual ("B", lvw.Items [1].Text, "#Q5");
1386                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#Q6");
1387                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#Q7");
1388                         Assert.AreEqual ("BC", lvw.Items [4].Text, "#Q8");
1389                         Assert.AreEqual ("C", lvw.Items [5].Text, "#Q9");
1390 #else
1391                         Assert.AreEqual (compareCount, mc.CompareCount, "#Q1");
1392                         Assert.IsNotNull (lvw.ListViewItemSorter, "#Q2");
1393                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#Q3");
1394                         Assert.AreEqual ("C", lvw.Items [0].Text, "#Q4");
1395                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#Q5");
1396                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#Q6");
1397                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#Q7");
1398                         Assert.AreEqual ("B", lvw.Items [4].Text, "#Q8");
1399                         Assert.AreEqual ("A", lvw.Items [5].Text, "#Q9");
1400 #endif
1401
1402                         // record compare count
1403                         compareCount = mc.CompareCount;
1404
1405                         // set Sorting to Ascending again to verify that the internal
1406                         // IComparer is not used when we reset Sorting to None
1407                         // (as the items would then be sorted alfabetically)
1408                         lvw.Sorting = SortOrder.Ascending;
1409                         Assert.IsTrue (mc.CompareCount > compareCount, "#R1");
1410                         Assert.IsNotNull (lvw.ListViewItemSorter, "#R2");
1411                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#R3");
1412                         Assert.AreEqual ("C", lvw.Items [0].Text, "#R4");
1413                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#R5");
1414                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#R6");
1415                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#R7");
1416                         Assert.AreEqual ("B", lvw.Items [4].Text, "#R8");
1417                         Assert.AreEqual ("A", lvw.Items [5].Text, "#R9");
1418
1419                         // record compare count
1420                         compareCount = mc.CompareCount;
1421
1422                         lvw.Sorting = SortOrder.None;
1423                         Assert.AreEqual (compareCount, mc.CompareCount, "#S1");
1424 #if NET_2_0
1425                         Assert.IsNull (lvw.ListViewItemSorter, "#S2");
1426 #else
1427                         Assert.IsNotNull (lvw.ListViewItemSorter, "#S2a");
1428                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#S2b");
1429 #endif
1430                         Assert.AreEqual ("C", lvw.Items [0].Text, "#S3");
1431                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#S4");
1432                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#S5");
1433                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#S6");
1434                         Assert.AreEqual ("B", lvw.Items [4].Text, "#S7");
1435                         Assert.AreEqual ("A", lvw.Items [5].Text, "#S8");
1436
1437                         // record compare count
1438                         compareCount = mc.CompareCount;
1439
1440                         lvw.Items.Add ("BD");
1441 #if NET_2_0
1442                         // adding an item when Sorting is None does not cause a re-sort
1443                         Assert.AreEqual (compareCount, mc.CompareCount, "#T1");
1444                         Assert.IsNull (lvw.ListViewItemSorter, "#T2");
1445                         Assert.AreEqual ("C", lvw.Items [0].Text, "#T3");
1446                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#T4");
1447                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#T5");
1448                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#T6");
1449                         Assert.AreEqual ("B", lvw.Items [4].Text, "#T7");
1450                         Assert.AreEqual ("A", lvw.Items [5].Text, "#T8");
1451                         Assert.AreEqual ("BD", lvw.Items [6].Text, "#T9");
1452 #else
1453                         // adding an item when Sorting is None results in a re-sort
1454                         Assert.IsTrue (mc.CompareCount > compareCount, "#T1");
1455                         Assert.IsNotNull (lvw.ListViewItemSorter, "#T2");
1456                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#T3");
1457                         Assert.AreEqual ("A", lvw.Items [0].Text, "#T4");
1458                         Assert.AreEqual ("B", lvw.Items [1].Text, "#T5");
1459                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#T6");
1460                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#T7");
1461                         Assert.AreEqual ("BC", lvw.Items [4].Text, "#T8");
1462                         Assert.AreEqual ("BD", lvw.Items [5].Text, "#T9");
1463                         Assert.AreEqual ("C", lvw.Items [6].Text, "#T10");
1464 #endif
1465
1466                         // record compare count
1467                         compareCount = mc.CompareCount;
1468
1469                         lvw.Sort ();
1470 #if NET_2_0
1471                         // explicitly calling Sort when Sorting is None does nothing
1472                         Assert.AreEqual (compareCount, mc.CompareCount, "#U1");
1473                         Assert.IsNull (lvw.ListViewItemSorter, "#U2");
1474                         Assert.AreEqual ("C", lvw.Items [0].Text, "#U3");
1475                         Assert.AreEqual ("BC", lvw.Items [1].Text, "#U4");
1476                         Assert.AreEqual ("BB", lvw.Items [2].Text, "#U5");
1477                         Assert.AreEqual ("BA", lvw.Items [3].Text, "#U6");
1478                         Assert.AreEqual ("B", lvw.Items [4].Text, "#U7");
1479                         Assert.AreEqual ("A", lvw.Items [5].Text, "#U8");
1480                         Assert.AreEqual ("BD", lvw.Items [6].Text, "#U9");
1481 #else
1482                         // explicitly calling Sort when Sorting is None results in a re-sort
1483                         Assert.IsTrue (mc.CompareCount > compareCount, "#U1");
1484                         Assert.IsNotNull (lvw.ListViewItemSorter, "#U2");
1485                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#U3");
1486                         Assert.AreEqual ("A", lvw.Items [0].Text, "#U4");
1487                         Assert.AreEqual ("B", lvw.Items [1].Text, "#U5");
1488                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#U6");
1489                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#U7");
1490                         Assert.AreEqual ("BC", lvw.Items [4].Text, "#U8");
1491                         Assert.AreEqual ("BD", lvw.Items [5].Text, "#U9");
1492                         Assert.AreEqual ("C", lvw.Items [6].Text, "#U10");
1493 #endif
1494
1495                         // record compare count
1496                         compareCount = mc.CompareCount;
1497
1498                         lvw.Sorting = SortOrder.Ascending;
1499 #if NET_2_0
1500                         // setting Sorting again, does not reinstate the custom IComparer
1501                         // but sorting is actually performed using an internal non-visible
1502                         // comparer
1503                         Assert.AreEqual (compareCount, mc.CompareCount, "#V1");
1504                         Assert.IsNull (lvw.ListViewItemSorter, "#V2");
1505                         Assert.AreEqual ("A", lvw.Items [0].Text, "#V3");
1506                         Assert.AreEqual ("B", lvw.Items [1].Text, "#V4");
1507                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#V5");
1508                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#V6");
1509                         Assert.AreEqual ("BC", lvw.Items [4].Text, "#V7");
1510                         Assert.AreEqual ("BD", lvw.Items [5].Text, "#V8");
1511                         Assert.AreEqual ("C", lvw.Items [6].Text, "#V9");
1512 #else
1513                         // setting Sorting again, uses the custom IComparer to sort the items
1514                         Assert.IsTrue (mc.CompareCount > compareCount, "#V1");
1515                         Assert.IsNotNull (lvw.ListViewItemSorter, "#V2");
1516                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#V3");
1517                         Assert.AreEqual ("C", lvw.Items [0].Text, "#V4");
1518                         Assert.AreEqual ("BD", lvw.Items [1].Text, "#V5");
1519                         Assert.AreEqual ("BC", lvw.Items [2].Text, "#V6");
1520                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#V7");
1521                         Assert.AreEqual ("BA", lvw.Items [4].Text, "#V8");
1522                         Assert.AreEqual ("B", lvw.Items [5].Text, "#V9");
1523                         Assert.AreEqual ("A", lvw.Items [6].Text, "#V10");
1524 #endif
1525
1526                         // record compare count
1527                         compareCount = mc.CompareCount;
1528
1529                         lvw.Sort ();
1530 #if NET_2_0
1531                         // explicitly calling Sort, does not reinstate the custom IComparer
1532                         // but sorting is actually performed using an internal non-visible
1533                         // comparer
1534                         Assert.AreEqual (compareCount, mc.CompareCount, "#W1");
1535                         Assert.IsNull (lvw.ListViewItemSorter, "#W2");
1536                         Assert.AreEqual ("A", lvw.Items [0].Text, "#W3");
1537                         Assert.AreEqual ("B", lvw.Items [1].Text, "#W4");
1538                         Assert.AreEqual ("BA", lvw.Items [2].Text, "#W5");
1539                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#W6");
1540                         Assert.AreEqual ("BC", lvw.Items [4].Text, "#W7");
1541                         Assert.AreEqual ("BD", lvw.Items [5].Text, "#W8");
1542                         Assert.AreEqual ("C", lvw.Items [6].Text, "#W9");
1543 #else
1544                         // setting Sorting again, uses the custom IComparer to sort the items
1545                         Assert.IsTrue (mc.CompareCount > compareCount, "#W1");
1546                         Assert.IsNotNull (lvw.ListViewItemSorter, "#W2");
1547                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#W3");
1548                         Assert.AreEqual ("C", lvw.Items [0].Text, "#W4");
1549                         Assert.AreEqual ("BD", lvw.Items [1].Text, "#W5");
1550                         Assert.AreEqual ("BC", lvw.Items [2].Text, "#W6");
1551                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#W7");
1552                         Assert.AreEqual ("BA", lvw.Items [4].Text, "#W8");
1553                         Assert.AreEqual ("B", lvw.Items [5].Text, "#W9");
1554                         Assert.AreEqual ("A", lvw.Items [6].Text, "#W10");
1555 #endif
1556
1557                         // record compare count
1558                         compareCount = mc.CompareCount;
1559
1560                         form.Dispose ();
1561                 }
1562
1563                 private void AssertSortNoIcon_NotCreated (View view)
1564                 {
1565                         Form form = new Form ();
1566                         form.ShowInTaskbar = false;
1567                         ListView lvw = CreateListView (view);
1568                         form.Controls.Add (lvw);
1569
1570                         Assert.IsNull (lvw.ListViewItemSorter, "#A1");
1571                         Assert.AreEqual ("B", lvw.Items [0].Text, "#A2");
1572                         Assert.AreEqual ("A", lvw.Items [1].Text, "#A3");
1573                         Assert.AreEqual ("C", lvw.Items [2].Text, "#A4");
1574
1575                         lvw.Sorting = SortOrder.None;
1576                         Assert.IsNull (lvw.ListViewItemSorter, "#B1");
1577                         Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
1578                         Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
1579                         Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
1580
1581                         lvw.Sorting = SortOrder.Ascending;
1582                         Assert.IsNull (lvw.ListViewItemSorter, "#C1");
1583                         Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
1584                         Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
1585                         Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
1586
1587                         lvw.Sorting = SortOrder.Descending;
1588                         Assert.IsNull (lvw.ListViewItemSorter, "#D1");
1589                         Assert.AreEqual ("B", lvw.Items [0].Text, "#D2");
1590                         Assert.AreEqual ("A", lvw.Items [1].Text, "#D3");
1591                         Assert.AreEqual ("C", lvw.Items [2].Text, "#D4");
1592
1593                         lvw.Sorting = SortOrder.None;
1594                         Assert.IsNull (lvw.ListViewItemSorter, "#E1");
1595                         Assert.AreEqual ("B", lvw.Items [0].Text, "#E2");
1596                         Assert.AreEqual ("A", lvw.Items [1].Text, "#E3");
1597                         Assert.AreEqual ("C", lvw.Items [2].Text, "#E4");
1598
1599                         lvw.Sorting = SortOrder.Ascending;
1600                         Assert.IsNull (lvw.ListViewItemSorter, "#F1");
1601                         Assert.AreEqual ("B", lvw.Items [0].Text, "#F2");
1602                         Assert.AreEqual ("A", lvw.Items [1].Text, "#F3");
1603                         Assert.AreEqual ("C", lvw.Items [2].Text, "#F4");
1604
1605                         // when the handle is not created and a new item is added, the new
1606                         // item is just appended to the collection
1607                         lvw.Items.Add ("BB");
1608                         Assert.IsNull (lvw.ListViewItemSorter, "#G1");
1609                         Assert.AreEqual ("B", lvw.Items [0].Text, "#G2");
1610                         Assert.AreEqual ("A", lvw.Items [1].Text, "#G3");
1611                         Assert.AreEqual ("C", lvw.Items [2].Text, "#G4");
1612                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#G5");
1613
1614                         // assign a custom comparer
1615                         MockComparer mc = new MockComparer (false);
1616                         lvw.ListViewItemSorter = mc;
1617
1618                         // assigning a custom IComparer has no effect
1619                         Assert.AreEqual (0, mc.CompareCount, "#H1");
1620                         Assert.IsNotNull (lvw.ListViewItemSorter, "#H2");
1621                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#H3");
1622                         Assert.AreEqual ("B", lvw.Items [0].Text, "#H4");
1623                         Assert.AreEqual ("A", lvw.Items [1].Text, "#H5");
1624                         Assert.AreEqual ("C", lvw.Items [2].Text, "#H6");
1625                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#H7");
1626
1627                         // modifying Sorting has no effect
1628                         lvw.Sorting = SortOrder.Descending;
1629                         Assert.AreEqual (0, mc.CompareCount, "#I1");
1630                         Assert.IsNotNull (lvw.ListViewItemSorter, "#I2");
1631                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#I3");
1632                         Assert.AreEqual ("B", lvw.Items [0].Text, "#I4");
1633                         Assert.AreEqual ("A", lvw.Items [1].Text, "#I5");
1634                         Assert.AreEqual ("C", lvw.Items [2].Text, "#I6");
1635                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#I7");
1636
1637                         // setting Sorting to the same value does not result in a sort
1638                         // operation
1639                         lvw.Sorting = SortOrder.Descending;
1640                         Assert.AreEqual (0, mc.CompareCount, "#J1");
1641                         Assert.IsNotNull (lvw.ListViewItemSorter, "#J2");
1642                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#J3");
1643                         Assert.AreEqual ("B", lvw.Items [0].Text, "#J4");
1644                         Assert.AreEqual ("A", lvw.Items [1].Text, "#J5");
1645                         Assert.AreEqual ("C", lvw.Items [2].Text, "#J6");
1646                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#J7");
1647
1648                         // setting Sorting to another value does not result in a sort
1649                         // operation
1650                         lvw.Sorting = SortOrder.Ascending;
1651                         Assert.AreEqual (0, mc.CompareCount, "#K1");
1652                         Assert.IsNotNull (lvw.ListViewItemSorter, "#K2");
1653                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#K3");
1654                         Assert.AreEqual ("B", lvw.Items [0].Text, "#K4");
1655                         Assert.AreEqual ("A", lvw.Items [1].Text, "#K5");
1656                         Assert.AreEqual ("C", lvw.Items [2].Text, "#K6");
1657                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#K7");
1658
1659                         lvw.Sorting = SortOrder.None;
1660                         Assert.AreEqual (0, mc.CompareCount, "#L1");
1661 #if NET_2_0
1662                         // setting Sorting to None does not perform a sort and resets the
1663                         // ListViewItemSorter
1664                         Assert.IsNull (lvw.ListViewItemSorter, "#L2");
1665 #else
1666                         // setting Sorting to None does not perform a sort
1667                         Assert.IsNotNull (lvw.ListViewItemSorter, "#L2a");
1668                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#L2b");
1669 #endif
1670                         Assert.AreEqual ("B", lvw.Items [0].Text, "#L3");
1671                         Assert.AreEqual ("A", lvw.Items [1].Text, "#L4");
1672                         Assert.AreEqual ("C", lvw.Items [2].Text, "#L5");
1673                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#L6");
1674
1675                         // explicitly calling Sort when Sorting is None does nothing
1676                         lvw.Sort ();
1677                         Assert.AreEqual (0, mc.CompareCount, "#M1");
1678 #if NET_2_0
1679                         Assert.IsNull (lvw.ListViewItemSorter, "#M2");
1680 #else
1681                         Assert.IsNotNull (lvw.ListViewItemSorter, "#M2a");
1682                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#M2b");
1683 #endif
1684                         Assert.AreEqual ("B", lvw.Items [0].Text, "#M3");
1685                         Assert.AreEqual ("A", lvw.Items [1].Text, "#M4");
1686                         Assert.AreEqual ("C", lvw.Items [2].Text, "#M5");
1687                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#M6");
1688
1689                         lvw.Sorting = SortOrder.Ascending;
1690                         Assert.AreEqual (0, mc.CompareCount, "#N1");
1691 #if NET_2_0
1692                         Assert.IsNull (lvw.ListViewItemSorter, "#N2");
1693 #else
1694                         Assert.IsNotNull (lvw.ListViewItemSorter, "#N2a");
1695                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#N2b");
1696 #endif
1697                         Assert.AreEqual ("B", lvw.Items [0].Text, "#N3");
1698                         Assert.AreEqual ("A", lvw.Items [1].Text, "#N4");
1699                         Assert.AreEqual ("C", lvw.Items [2].Text, "#N5");
1700                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#N6");
1701
1702                         // explicitly set the custom IComparer again
1703                         lvw.ListViewItemSorter = mc;
1704                         Assert.AreEqual (0, mc.CompareCount, "#O1");
1705                         Assert.IsNotNull (lvw.ListViewItemSorter, "#O2");
1706                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#O3");
1707                         Assert.AreEqual ("B", lvw.Items [0].Text, "#O4");
1708                         Assert.AreEqual ("A", lvw.Items [1].Text, "#O5");
1709                         Assert.AreEqual ("C", lvw.Items [2].Text, "#O6");
1710                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#O7");
1711
1712                         // explicitly calling Sort when handle is not created does not
1713                         // result in sort operation
1714                         Assert.AreEqual (0, mc.CompareCount, "#P1");
1715                         Assert.IsNotNull (lvw.ListViewItemSorter, "#P2");
1716                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#P3");
1717                         Assert.AreEqual ("B", lvw.Items [0].Text, "#P4");
1718                         Assert.AreEqual ("A", lvw.Items [1].Text, "#P5");
1719                         Assert.AreEqual ("C", lvw.Items [2].Text, "#P6");
1720                         Assert.AreEqual ("BB", lvw.Items [3].Text, "#P7");
1721
1722                         // show the form to create the handle
1723                         form.Show ();
1724
1725                         // when the handle is created, the items are immediately sorted
1726                         Assert.IsTrue (mc.CompareCount > 0, "#Q1");
1727                         Assert.IsNotNull (lvw.ListViewItemSorter, "#Q2");
1728                         Assert.AreSame (mc, lvw.ListViewItemSorter, "#Q3");
1729                         Assert.AreEqual ("C", lvw.Items [0].Text, "#Q4");
1730                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#Q5");
1731                         Assert.AreEqual ("B", lvw.Items [2].Text, "#Q6");
1732                         Assert.AreEqual ("A", lvw.Items [3].Text, "#Q7");
1733
1734                         // setting ListViewItemSorter to null does not result in sort
1735                         // operation
1736                         lvw.ListViewItemSorter = null;
1737                         Assert.IsNull (lvw.ListViewItemSorter, "#R1");
1738                         Assert.AreEqual ("C", lvw.Items [0].Text, "#R2");
1739                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#R3");
1740                         Assert.AreEqual ("B", lvw.Items [2].Text, "#R4");
1741                         Assert.AreEqual ("A", lvw.Items [3].Text, "#R5");
1742
1743                         // explicitly calling sort does not result in sort operation
1744                         lvw.Sort ();
1745                         Assert.IsNull (lvw.ListViewItemSorter, "#S1");
1746                         Assert.AreEqual ("C", lvw.Items [0].Text, "#S2");
1747                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#S3");
1748                         Assert.AreEqual ("B", lvw.Items [2].Text, "#S4");
1749                         Assert.AreEqual ("A", lvw.Items [3].Text, "#S5");
1750
1751                         // modifying Sorting does not result in sort operation
1752                         lvw.Sorting = SortOrder.Ascending;
1753                         Assert.IsNull (lvw.ListViewItemSorter, "#T1");
1754                         Assert.AreEqual ("C", lvw.Items [0].Text, "#T2");
1755                         Assert.AreEqual ("BB", lvw.Items [1].Text, "#T3");
1756                         Assert.AreEqual ("B", lvw.Items [2].Text, "#T4");
1757                         Assert.AreEqual ("A", lvw.Items [3].Text, "#T5");
1758
1759                         form.Dispose ();
1760                 }
1761
1762                 private void AssertSort_Checked (View view)
1763                 {
1764                         Form form = new Form ();
1765                         form.ShowInTaskbar = false;
1766                         ListView lvw = CreateListView (view);
1767                         lvw.CheckBoxes = true;
1768                         form.Controls.Add (lvw);
1769
1770                         form.Show ();
1771
1772                         Assert.AreEqual (0, lvw.CheckedItems.Count, "#A1");
1773                         Assert.AreEqual (0, lvw.CheckedIndices.Count, "#A2");
1774
1775                         // select an item
1776                         lvw.Items [2].Checked = true;
1777                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#B1");
1778                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#B2");
1779                         Assert.AreEqual ("C", lvw.CheckedItems [0].Text, "#B3");
1780                         Assert.AreEqual (2, lvw.CheckedIndices [0], "#B4");
1781
1782                         // sort the items descending
1783                         lvw.Sorting = SortOrder.Descending;
1784                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#C1");
1785                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#C2");
1786                         Assert.AreEqual ("C", lvw.CheckedItems [0].Text, "#C3");
1787                         Assert.AreEqual (0, lvw.CheckedIndices [0], "#C4");
1788
1789                         // add an item, which ends up before the selected item after the
1790                         // sort operation
1791                         ListViewItem item = lvw.Items.Add ("D");
1792                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#D1");
1793                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#D2");
1794                         Assert.AreEqual ("C", lvw.CheckedItems [0].Text, "#D3");
1795                         Assert.AreEqual (1, lvw.CheckedIndices [0], "#D4");
1796
1797                         // remove an item before the selected item
1798                         lvw.Items.Remove (item);
1799                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#E1");
1800                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#E2");
1801                         Assert.AreEqual ("C", lvw.CheckedItems [0].Text, "#E3");
1802                         Assert.AreEqual (0, lvw.CheckedIndices [0], "#E4");
1803
1804                         // insert an item before the selected item
1805                         lvw.Items.Insert (0, "D");
1806                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#F1");
1807                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#F2");
1808                         Assert.AreEqual ("C", lvw.CheckedItems [0].Text, "#F3");
1809                         Assert.AreEqual (1, lvw.CheckedIndices [0], "#F4");
1810
1811                         // assign a custom comparer
1812                         MockComparer mc = new MockComparer (false);
1813                         lvw.ListViewItemSorter = mc;
1814
1815                         // items are re-sorted automatically
1816                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#G1");
1817                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#G2");
1818                         Assert.AreEqual ("C", lvw.CheckedItems [0].Text, "#G3");
1819                         Assert.AreEqual (2, lvw.CheckedIndices [0], "#G4");
1820
1821                         // modify sort order
1822                         lvw.Sorting = SortOrder.Ascending;
1823                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#H1");
1824                         Assert.AreEqual (1, lvw.CheckedIndices.Count, "#H2");
1825                         Assert.AreEqual ("C", lvw.CheckedItems [0].Text, "#H3");
1826                         Assert.AreEqual (1, lvw.CheckedIndices [0], "#H4");
1827
1828                         form.Dispose ();
1829                 }
1830
1831                 private void AssertSort_Selected (View view)
1832                 {
1833                         Form form = new Form ();
1834                         form.ShowInTaskbar = false;
1835                         ListView lvw = CreateListView (view);
1836                         form.Controls.Add (lvw);
1837
1838                         form.Show ();
1839
1840                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#A1");
1841                         Assert.AreEqual (0, lvw.SelectedIndices.Count, "#A2");
1842
1843                         // select an item
1844                         lvw.Items [2].Selected = true;
1845                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#B1");
1846                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#B2");
1847                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#B3");
1848                         Assert.AreEqual (2, lvw.SelectedIndices [0], "#B4");
1849
1850                         // sort the items descending
1851                         lvw.Sorting = SortOrder.Descending;
1852                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#C1");
1853                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#C2");
1854                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#C3");
1855                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#C4");
1856
1857                         // add an item, which ends up before the selected item after the
1858                         // sort operation
1859                         ListViewItem item = lvw.Items.Add ("D");
1860                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#D1");
1861                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#D2");
1862                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#D3");
1863                         Assert.AreEqual (1, lvw.SelectedIndices [0], "#D4");
1864
1865                         // remove an item before the selected item
1866                         lvw.Items.Remove (item);
1867                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#E1");
1868                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#E2");
1869                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#E3");
1870                         Assert.AreEqual (0, lvw.SelectedIndices [0], "#E4");
1871
1872                         // insert an item before the selected item
1873                         lvw.Items.Insert (0, "D");
1874                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#F1");
1875                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#F2");
1876                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#F3");
1877                         Assert.AreEqual (1, lvw.SelectedIndices [0], "#F4");
1878
1879                         // assign a custom comparer
1880                         MockComparer mc = new MockComparer (false);
1881                         lvw.ListViewItemSorter = mc;
1882
1883                         // items are re-sorted automatically
1884                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#G1");
1885                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#G2");
1886                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#G3");
1887                         Assert.AreEqual (2, lvw.SelectedIndices [0], "#G4");
1888
1889                         // modify sort order
1890                         lvw.Sorting = SortOrder.Ascending;
1891                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#H1");
1892                         Assert.AreEqual (1, lvw.SelectedIndices.Count, "#H2");
1893                         Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#H3");
1894                         Assert.AreEqual (1, lvw.SelectedIndices [0], "#H4");
1895
1896                         form.Dispose ();
1897                 }
1898
1899                 private ListView CreateListView (View view)
1900                 {
1901                         ListView lvw = new ListView ();
1902                         lvw.View = view;
1903                         lvw.Items.Add ("B");
1904                         lvw.Items.Add ("A");
1905                         lvw.Items.Add ("C");
1906                         return lvw;
1907                 }
1908
1909                 private class MockComparer : IComparer
1910                 {
1911                         int _compareCount;
1912                         bool _throwException;
1913
1914                         public MockComparer (bool throwException)
1915                         {
1916                                 _throwException = throwException;
1917                         }
1918
1919                         public int CompareCount {
1920                                 get { return _compareCount; }
1921                         }
1922
1923                         public int Compare (object x, object y)
1924                         {
1925                                 _compareCount++;
1926                                 if (_throwException)
1927                                         throw new InvalidOperationException ();
1928
1929                                 ListViewItem item_x = x as ListViewItem;
1930                                 ListViewItem item_y = y as ListViewItem;
1931                                 SortOrder sortOrder = item_x.ListView.Sorting;
1932
1933                                 // we'll actually perform a reverse-sort
1934                                 if (sortOrder == SortOrder.Ascending)
1935                                         return String.Compare (item_y.Text, item_x.Text);
1936                                 else
1937                                         return String.Compare (item_x.Text, item_y.Text);
1938                         }
1939                 }
1940         }
1941 }