2 // ListViewTest.cs: Test cases for ListView.
5 // Ritvik Mayank (mritvik@novell.com)
7 // (C) 2005 Novell, Inc. (http://www.novell.com)
11 using System.Collections;
13 using System.Reflection;
14 using System.Windows.Forms;
16 using NUnit.Framework;
18 namespace MonoTests.System.Windows.Forms
21 public class ListViewTest : TestHelper
24 public void ListViewPropertyTest ()
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 Assert.AreEqual (false, mylistview.ShowItemToolTips, "#31");
61 Assert.AreEqual (false, mylistview.HotTracking, "#31");
65 public void ArrangeIconsTest ()
67 Form myform = new Form ();
68 myform.ShowInTaskbar = false;
69 ListView mylistview = new ListView ();
70 myform.Controls.Add (mylistview);
71 mylistview.Items.Add ("Item 1");
72 mylistview.Items.Add ("Item 2");
73 mylistview.View = View.LargeIcon;
74 mylistview.ArrangeIcons ();
80 public void BeginEndUpdateTest ()
82 Form myform = new Form ();
83 myform.ShowInTaskbar = false;
84 myform.Visible = true;
85 ListView mylistview = new ListView();
86 mylistview.Items.Add ("A");
87 mylistview.Visible = true;
88 myform.Controls.Add (mylistview);
89 mylistview.BeginUpdate ();
90 for(int x = 1 ; x < 5000 ; x++){
91 mylistview.Items.Add ("Item " + x.ToString());
93 mylistview.EndUpdate ();
98 public void CheckBoxes ()
100 Form form = new Form ();
101 form.ShowInTaskbar = false;
102 ListView lvw = new ListView ();
103 form.Controls.Add (lvw);
105 ListViewItem itemB = lvw.Items.Add ("B");
107 itemB.Checked = true;
109 Assert.AreEqual (0, lvw.CheckedItems.Count, "#A1");
110 Assert.AreEqual (0, lvw.CheckedIndices.Count, "#A2");
112 lvw.CheckBoxes = true;
114 Assert.AreEqual (1, lvw.CheckedItems.Count, "#B1");
115 Assert.AreSame (itemB, lvw.CheckedItems [0], "#B2");
116 Assert.AreEqual (1, lvw.CheckedIndices.Count, "#B3");
117 Assert.AreEqual (1, lvw.CheckedIndices [0], "#B4");
121 Assert.AreEqual (1, lvw.CheckedItems.Count, "#C1");
122 Assert.AreSame (itemB, lvw.CheckedItems [0], "#C2");
123 Assert.AreEqual (1, lvw.CheckedIndices.Count, "#C3");
124 Assert.AreEqual (1, lvw.CheckedIndices [0], "#C4");
126 lvw.CheckBoxes = false;
128 Assert.AreEqual (0, lvw.CheckedItems.Count, "#D1");
129 Assert.AreEqual (0, lvw.CheckedIndices.Count, "#D2");
131 lvw.CheckBoxes = true;
133 Assert.AreEqual (1, lvw.CheckedItems.Count, "#E1");
134 Assert.AreSame (itemB, lvw.CheckedItems [0], "#E2");
135 Assert.AreEqual (1, lvw.CheckedIndices.Count, "#E3");
136 Assert.AreEqual (1, lvw.CheckedIndices [0], "#E4");
141 public void ClearTest ()
143 Form myform = new Form ();
144 myform.ShowInTaskbar = false;
145 myform.Visible = true;
146 ListView mylistview = new ListView ();
147 ListViewItem itemA = mylistview.Items.Add ("A");
148 ColumnHeader colA = mylistview.Columns.Add ("Item Column", -2, HorizontalAlignment.Left);
149 Assert.AreSame (mylistview, itemA.ListView, "#1");
150 Assert.AreSame (mylistview, colA.ListView, "#2");
151 mylistview.Visible = true;
152 myform.Controls.Add (mylistview);
153 Assert.AreEqual (1, mylistview.Columns.Count, "#3");
154 Assert.AreEqual (1, mylistview.Items.Count, "#4");
156 Assert.AreEqual (0, mylistview.Columns.Count, "#5");
157 Assert.AreEqual (0, mylistview.Items.Count, "#6");
158 Assert.IsNull (itemA.ListView, "#7");
159 Assert.IsNull (colA.ListView, "#8");
164 public void ClientRectangle_Borders ()
166 ListView lv = new ListView ();
168 Assert.AreEqual (lv.ClientRectangle, new ListView ().ClientRectangle);
172 public void DisposeTest ()
174 ListView lv = new ListView ();
175 lv.View = View.Details;
177 lv.LargeImageList = new ImageList ();
178 lv.SmallImageList = new ImageList ();
180 ListViewItem lvi = new ListViewItem ();
183 ColumnHeader col = new ColumnHeader ();
184 lv.Columns.Add (col);
188 Assert.IsNull (lvi.ListView, "#A1");
189 Assert.IsNull (col.ListView, "#A2");
191 Assert.IsNull (lv.LargeImageList, "#B1");
192 Assert.IsNull (lv.SmallImageList, "#B2");
193 Assert.IsNull(lv.StateImageList, "#B3");
199 public void DisposeLayoutTest ()
201 Form f = new Form ();
202 ListView lv = new ListView ();
206 dispose_log = String.Empty;
207 lv.Layout += DisposeOnLayout;
208 lv.Dispose (); // just to be sure.
211 Assert.AreEqual (0, dispose_log.Length, "#A0");
214 void DisposeOnLayout (object o, LayoutEventArgs args)
216 dispose_log = "OnLayout";
221 public void EnsureVisibleTest ()
223 Form myform = new Form ();
224 myform.ShowInTaskbar = false;
225 myform.Visible = true;
226 ListView mylistview = new ListView ();
227 mylistview.Items.Add ("A");
228 myform.Controls.Add (mylistview);
229 mylistview.BeginUpdate ();
230 for(int x = 1 ; x < 5000 ; x++) {
231 mylistview.Items.Add ("Item " + x.ToString());
233 mylistview.EndUpdate ();
234 mylistview.EnsureVisible (4999);
239 public void GetItemRectTest ()
241 ListView mylistview = new ListView ();
242 mylistview.Items.Add ("Item 1");
243 mylistview.Items.Add ("Item 2");
244 Rectangle r = mylistview.GetItemRect (1);
245 Assert.AreEqual (0, r.Top, "#35a");
246 Assert.IsTrue (r.Bottom > 0, "#35b");
247 Assert.IsTrue (r.Right > 0, "#35c");
248 Assert.IsTrue (r.Left > 0, "#35d");
249 Assert.IsTrue (r.Height > 0, "#35e");
250 Assert.IsTrue (r.Width > 0, "#35f");
254 public void bug79076 ()
256 ListView entryList = new ListView ();
257 entryList.Sorting = SortOrder.Descending;
259 entryList.BeginUpdate ();
260 entryList.Columns.Add ("Type", 100, HorizontalAlignment.Left);
262 ListViewItem item = new ListViewItem (new string [] { "A" });
263 entryList.Items.Add (item);
264 item = new ListViewItem (new string [] { "B" });
265 entryList.Items.Add (item);
269 public void MultiSelect ()
271 Form form = new Form ();
272 form.ShowInTaskbar = false;
273 ListView lvw = CreateListView (View.Details);
274 form.Controls.Add (lvw);
275 lvw.MultiSelect = true;
276 lvw.Items [0].Selected = true;
277 lvw.Items [2].Selected = true;
279 Assert.AreEqual (0, lvw.SelectedItems.Count, "#A1");
280 Assert.AreEqual (0, lvw.SelectedIndices.Count, "#A2");
282 lvw.Items [0].Selected = false;
284 Assert.AreEqual (0, lvw.SelectedItems.Count, "#B1");
285 Assert.AreEqual (0, lvw.SelectedIndices.Count, "#B2");
287 lvw.Items [0].Selected = true;
289 Assert.AreEqual (0, lvw.SelectedItems.Count, "#C1");
290 Assert.AreEqual (0, lvw.SelectedIndices.Count, "#C2");
294 Assert.AreEqual (2, lvw.SelectedItems.Count, "#D1");
295 Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#D2");
296 Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#D3");
297 Assert.AreEqual (2, lvw.SelectedIndices.Count, "#D4");
298 Assert.AreEqual (0, lvw.SelectedIndices [0], "#D5");
299 Assert.AreEqual (2, lvw.SelectedIndices [1], "#D6");
302 lvw.Items [2].Selected = false;
304 Assert.AreEqual (1, lvw.SelectedItems.Count, "#E1");
305 Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#E2");
306 Assert.AreEqual (1, lvw.SelectedIndices.Count, "#E3");
307 Assert.AreEqual (0, lvw.SelectedIndices [0], "#E4");
309 // re-select that item
310 lvw.Items [2].Selected = true;
312 Assert.AreEqual (2, lvw.SelectedItems.Count, "#F1");
313 Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#F2");
314 Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#F3");
315 Assert.AreEqual (2, lvw.SelectedIndices.Count, "#F4");
316 Assert.AreEqual (0, lvw.SelectedIndices [0], "#F5");
317 Assert.AreEqual (2, lvw.SelectedIndices [1], "#F6");
319 // dis-allow selection of multiple items
320 lvw.MultiSelect = false;
322 // setting MultiSelect to false when multiple items have been
323 // selected does not deselect items
324 Assert.AreEqual (2, lvw.SelectedItems.Count, "#G1");
325 Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#G2");
326 Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#G3");
327 Assert.AreEqual (2, lvw.SelectedIndices.Count, "#G4");
328 Assert.AreEqual (0, lvw.SelectedIndices [0], "#G5");
329 Assert.AreEqual (2, lvw.SelectedIndices [1], "#G6");
331 // de-select that item again
332 lvw.Items [2].Selected = false;
334 Assert.AreEqual (1, lvw.SelectedItems.Count, "#H1");
335 Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#H2");
336 Assert.AreEqual (1, lvw.SelectedIndices.Count, "#H3");
337 Assert.AreEqual (0, lvw.SelectedIndices [0], "#H4");
339 // re-select that item again
340 lvw.Items [2].Selected = true;
342 // when MultiSelect is false, and you attempt to select more than
343 // one item, then all items will first be de-selected and then
344 // the item in question is selected
345 Assert.AreEqual (1, lvw.SelectedItems.Count, "#I1");
346 Assert.AreEqual ("C", lvw.SelectedItems [0].Text, "#I2");
347 Assert.AreEqual (1, lvw.SelectedIndices.Count, "#I3");
348 Assert.AreEqual (2, lvw.SelectedIndices [0], "#I4");
353 public void TopItem ()
355 ListView lvw = CreateListView (View.List);
358 Assert.AreEqual (lvw.Items [0], lvw.TopItem, "#A1");
360 lvw.TopItem = new ListViewItem ();
361 Assert.AreEqual (lvw.Items [0], lvw.TopItem, "#A2");
365 public void TopItem_Exceptions ()
367 ListView lvw = CreateListView (View.LargeIcon);
368 ListViewItem item = null;
371 lvw.TopItem = lvw.Items [2];
373 } catch (InvalidOperationException) {
379 } catch (InvalidOperationException) {
382 lvw.View = View.SmallIcon;
384 lvw.TopItem = lvw.Items [2];
386 } catch (InvalidOperationException) {
392 } catch (InvalidOperationException) {
395 lvw.View = View.Tile;
397 lvw.TopItem = lvw.Items [2];
399 } catch (InvalidOperationException) {
405 } catch (InvalidOperationException) {
410 public void Selected ()
412 Form form = new Form ();
413 form.ShowInTaskbar = false;
414 ListView lvw = CreateListView (View.Details);
415 form.Controls.Add (lvw);
416 lvw.MultiSelect = true;
417 lvw.Items [0].Selected = true;
418 lvw.Items [2].Selected = true;
420 Assert.AreEqual (0, lvw.SelectedItems.Count, "#A1");
421 Assert.AreEqual (0, lvw.SelectedIndices.Count, "#A2");
425 Assert.AreEqual (2, lvw.SelectedItems.Count, "#C1");
426 Assert.AreEqual ("B", lvw.SelectedItems [0].Text, "#C2");
427 Assert.AreEqual ("C", lvw.SelectedItems [1].Text, "#C3");
428 Assert.AreEqual (2, lvw.SelectedIndices.Count, "#C4");
429 Assert.AreEqual (0, lvw.SelectedIndices [0], "#C5");
430 Assert.AreEqual (2, lvw.SelectedIndices [1], "#C6");
435 public void FindItemWithText ()
437 ListView lvw = new ListView();
438 ListViewItem lvi1 = new ListViewItem (String.Empty);
439 ListViewItem lvi2 = new ListViewItem ("angle bracket");
440 ListViewItem lvi3 = new ListViewItem ("bracket holder");
441 ListViewItem lvi4 = new ListViewItem ("bracket");
442 lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4 });
444 Assert.AreEqual (lvi1, lvw.FindItemWithText (String.Empty), "#A1");
445 Assert.AreEqual (lvi3, lvw.FindItemWithText ("bracket"), "#A2");
446 Assert.AreEqual (lvi3, lvw.FindItemWithText ("BrackeT"), "#A3");
447 Assert.IsNull (lvw.FindItemWithText ("holder"), "#A5");
449 Assert.AreEqual (lvw.Items [3], lvw.FindItemWithText ("bracket", true, 3), "#B1");
451 Assert.AreEqual (lvw.Items [2], lvw.FindItemWithText ("bracket", true, 0, true), "#C1");
452 Assert.AreEqual (lvw.Items [3], lvw.FindItemWithText ("bracket", true, 0, false), "#C2");
453 Assert.AreEqual(lvw.Items [3], lvw.FindItemWithText("BrackeT", true, 0, false), "#C3");
454 Assert.IsNull (lvw.FindItemWithText ("brack", true, 0, false), "#C4");
456 // Sub item search tests
460 lvi1.SubItems.Add ("car bracket");
461 lvi1.SubItems.Add ("C");
464 lvi2.SubItems.Add ("car");
468 lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3 });
470 Assert.AreEqual (lvi1, lvw.FindItemWithText ("car", true, 0), "#D1");
471 Assert.AreEqual (lvi3, lvw.FindItemWithText ("C", true, 0), "#D2");
472 Assert.AreEqual (lvi2, lvw.FindItemWithText ("car", true, 1), "#D3");
473 Assert.IsNull (lvw.FindItemWithText ("car", false, 0), "#D4");
475 Assert.AreEqual (lvi1, lvw.FindItemWithText ("car", true, 0, true), "#E1");
476 Assert.AreEqual (lvi2, lvw.FindItemWithText ("car", true, 0, false), "#E2");
477 Assert.AreEqual (lvi2, lvw.FindItemWithText ("CaR", true, 0, false), "#E3");
481 public void FindItemWithText_Exceptions ()
483 ListView lvw = new ListView ();
485 // Shouldn't throw any exception
486 lvw.FindItemWithText (null);
489 lvw.FindItemWithText (null, false, 0);
491 } catch (ArgumentOutOfRangeException) {
495 lvw.FindItemWithText (null, false, lvw.Items.Count);
497 } catch (ArgumentOutOfRangeException) {
501 lvw.Items.Add ("bracket");
504 lvw.FindItemWithText (null);
506 } catch (ArgumentNullException) {
510 lvw.FindItemWithText ("bracket", false, -1);
512 } catch (ArgumentOutOfRangeException) {
516 lvw.FindItemWithText ("bracket", false, lvw.Items.Count);
518 } catch (ArgumentOutOfRangeException) {
523 public void FindNearestItem_Exceptions ()
525 ListView lvw = new ListView ();
529 lvw.View = View.Details;
531 lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
533 } catch (InvalidOperationException) {
536 lvw.View = View.List;
538 lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
540 } catch (InvalidOperationException) {
543 lvw.View = View.Tile;
545 lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
547 } catch (InvalidOperationException) {
550 lvw.View = View.LargeIcon;
552 lvw.FindNearestItem ((SearchDirectionHint)666, 0, 0);
553 } catch (ArgumentOutOfRangeException) {
558 public void FocusedItem ()
560 ListView lvw = CreateListView (View.LargeIcon);
561 Form form = new Form ();
564 // FocusedItem setter ignores the value until form is shown
565 lvw.FocusedItem = lvw.Items [2];
566 Assert.AreEqual (null, lvw.FocusedItem, "#A1");
568 // It's not enough to create the ListView control
571 lvw.FocusedItem = lvw.Items [2];
572 Assert.AreEqual (lvw.Items [2], lvw.FocusedItem, "#A2");
574 lvw.FocusedItem = new ListViewItem ();
575 Assert.AreEqual (lvw.Items [2], lvw.FocusedItem, "#A3");
577 lvw.FocusedItem = null;
578 Assert.AreEqual (lvw.Items [2], lvw.FocusedItem, "#A4");
584 public void HotTracking ()
586 ListView lvw = new ListView ();
588 lvw.HotTracking = true;
589 Assert.AreEqual (true, lvw.HotTracking, "#A1");
590 Assert.AreEqual (true, lvw.HoverSelection, "#A2");
591 Assert.AreEqual (ItemActivation.OneClick, lvw.Activation, "#A3");
593 // HoverSelection and Activation keep the previous value
594 lvw.HotTracking = false;
595 Assert.AreEqual (false, lvw.HotTracking, "#B1");
596 Assert.AreEqual (true, lvw.HoverSelection, "#B2");
597 Assert.AreEqual (ItemActivation.OneClick, lvw.Activation, "#B3");
599 lvw.HotTracking = true;
601 lvw.HoverSelection = false;
603 } catch (ArgumentException) {
607 lvw.Activation = ItemActivation.Standard;
609 } catch (ArgumentException) {
614 public void RedrawItems_Exceptions ()
616 ListView lvw = new ListView ();
621 lvw.RedrawItems (-1, 1, true);
623 } catch (ArgumentOutOfRangeException) {
627 lvw.RedrawItems (0, -1, true);
629 } catch (ArgumentOutOfRangeException) {
633 lvw.RedrawItems (lvw.Items.Count, 1, true);
635 } catch (ArgumentOutOfRangeException) {
639 lvw.RedrawItems (0, lvw.Items.Count, true);
641 } catch (ArgumentOutOfRangeException) {
645 lvw.RedrawItems (1, 0, true);
647 } catch (ArgumentException) {
651 const int item_count = 3;
652 ListViewItem [] items = new ListViewItem [item_count];
655 public void VirtualMode ()
657 ListView lvw = new ListView ();
658 lvw.VirtualListSize = item_count;
659 lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
660 lvw.VirtualMode = true;
662 CreateListViewItems (item_count);
664 Assert.AreEqual (item_count, lvw.Items.Count, "#A1");
665 Assert.AreEqual (true, lvw.VirtualMode, "#A2");
667 Assert.AreEqual (items [0], lvw.Items [0], "#B1");
668 Assert.AreEqual (items [1], lvw.Items [1], "#B2");
669 Assert.AreEqual (items [2], lvw.Items [2], "#B3");
670 Assert.AreEqual (0, lvw.Items [0].Index, "#B4");
671 Assert.AreEqual (1, lvw.Items [1].Index, "#B5");
672 Assert.AreEqual (2, lvw.Items [2].Index, "#B6");
673 Assert.AreEqual (lvw, lvw.Items [0].ListView, "#B7");
674 Assert.AreEqual (lvw, lvw.Items [1].ListView, "#B8");
675 Assert.AreEqual (lvw, lvw.Items [2].ListView, "#B9");
677 // force to re-create the items, because we need a blank state
679 CreateListViewItems (item_count);
680 items [0].Name = "A";
681 items [1].Name = "B";
682 items [2].Name = "C";
684 Assert.AreEqual (items [0], lvw.Items ["A"], "#C1");
685 Assert.AreEqual (items [1], lvw.Items ["B"], "#C2");
686 Assert.AreEqual (items [2], lvw.Items ["C"], "#C3");
687 Assert.AreEqual (0, lvw.Items ["A"].Index, "#C4");
688 Assert.AreEqual (1, lvw.Items ["B"].Index, "#C5");
689 Assert.AreEqual (2, lvw.Items ["C"].Index, "#C6");
690 Assert.AreEqual (lvw, lvw.Items ["A"].ListView, "#C7");
691 Assert.AreEqual (lvw, lvw.Items ["B"].ListView, "#C8");
692 Assert.AreEqual (lvw, lvw.Items ["C"].ListView, "#C9");
693 Assert.IsNull (lvw.Items ["Invalid key"], "#C10");
694 Assert.IsNull (lvw.Items [String.Empty], "#C11");
696 Assert.AreEqual (false, lvw.Items.ContainsKey (String.Empty), "#D1");
697 Assert.AreEqual (false, lvw.Items.ContainsKey (null), "#D2");
698 Assert.AreEqual (true, lvw.Items.ContainsKey ("A"), "#D3");
699 Assert.AreEqual (true, lvw.Items.ContainsKey ("a"), "#D4");
700 Assert.AreEqual (true, lvw.Items.ContainsKey ("B"), "#D5");
703 void ListViewRetrieveVirtualItemHandler (object o, RetrieveVirtualItemEventArgs args)
705 args.Item = items [args.ItemIndex];
708 void CreateListViewItems(int count)
710 items = new ListViewItem [count];
712 for (int i = 0; i < count; i++)
713 items [i] = new ListViewItem (String.Empty);
717 public void VirtualMode_Exceptions()
719 ListView lvw = new ListView ();
721 lvw.Items.Add ("Simple item");
723 lvw.VirtualMode = true;
725 } catch (InvalidOperationException) {
729 lvw.VirtualMode = true;
730 lvw.VirtualListSize = 1;
732 lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
733 CreateListViewItems (1);
738 } catch (InvalidOperationException) {
743 public void VirtualListSize ()
745 ListView lvw = new ListView ();
747 lvw.VirtualListSize = item_count;
748 Assert.AreEqual (item_count, lvw.VirtualListSize, "#A1");
749 Assert.AreEqual (0, lvw.Items.Count, "#A2");
751 lvw.VirtualMode = true;
752 Assert.AreEqual (item_count, lvw.VirtualListSize, "#B1");
753 Assert.AreEqual (item_count, lvw.Items.Count, "#B2");
755 lvw.VirtualMode = false;
756 Assert.AreEqual (item_count, lvw.VirtualListSize, "#C1");
757 Assert.AreEqual (0, lvw.Items.Count, "#C2");
761 public void VirtualListSize_Exceptions ()
763 ListView lvw = new ListView ();
765 lvw.VirtualListSize = -1;
767 } catch (ArgumentException) {
772 public void Sort_Details_Checked ()
774 AssertSort_Checked (View.Details);
778 public void Sort_Details_Created ()
780 AssertSortNoIcon_Created (View.Details);
784 public void Sort_Details_NotCreated ()
786 AssertSortNoIcon_NotCreated (View.Details);
790 public void Sort_Details_Selected ()
792 AssertSort_Selected (View.Details);
796 public void Sort_LargeIcon_Checked ()
798 AssertSort_Checked (View.LargeIcon);
802 public void Sort_LargeIcon_Created ()
804 AssertSortIcon_Created (View.LargeIcon);
808 public void Sort_LargeIcon_NotCreated ()
810 AssertSortIcon_NotCreated (View.LargeIcon);
814 public void Sort_LargeIcon_Selected ()
816 AssertSort_Selected (View.LargeIcon);
820 public void Sort_List_Checked ()
822 AssertSort_Checked (View.List);
826 public void Sort_List_Created ()
828 AssertSortNoIcon_Created (View.List);
832 public void Sort_List_NotCreated ()
834 AssertSortNoIcon_NotCreated (View.List);
838 public void Sort_List_Selection ()
840 AssertSort_Selected (View.List);
844 public void Sort_SmallIcon_Checked ()
846 AssertSort_Checked (View.SmallIcon);
850 public void Sort_SmallIcon_Created ()
852 AssertSortIcon_Created (View.SmallIcon);
856 public void Sort_SmallIcon_NotCreated ()
858 AssertSortIcon_NotCreated (View.SmallIcon);
862 public void Sort_SmallIcon_Selection ()
864 AssertSort_Selected (View.SmallIcon);
868 [ExpectedException (typeof (NotSupportedException))]
869 public void Sort_Tile_Checked ()
871 AssertSort_Checked (View.Tile);
875 public void Sort_Tile_Created ()
877 AssertSortNoIcon_Created (View.Tile);
881 public void Sort_Tile_NotCreated ()
883 AssertSortNoIcon_NotCreated (View.Tile);
887 public void Sort_Tile_Selection ()
889 AssertSort_Selected (View.Tile);
892 private void AssertSortIcon_Created (View view)
894 int compareCount = 0;
896 Form form = new Form ();
897 form.ShowInTaskbar = false;
898 ListView lvw = CreateListView (view);
899 form.Controls.Add (lvw);
900 Assert.IsNull (lvw.ListViewItemSorter, "#A");
904 Assert.IsNull (lvw.ListViewItemSorter, "#B1");
905 Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
906 Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
907 Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
909 lvw.Sorting = SortOrder.None;
910 Assert.IsNull (lvw.ListViewItemSorter, "#C1");
911 Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
912 Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
913 Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
915 lvw.Sorting = SortOrder.Descending;
916 Assert.IsNotNull (lvw.ListViewItemSorter, "#D1");
917 Assert.AreEqual ("C", lvw.Items [0].Text, "#D2");
918 Assert.AreEqual ("B", lvw.Items [1].Text, "#D3");
919 Assert.AreEqual ("A", lvw.Items [2].Text, "#D4");
921 lvw.Sorting = SortOrder.Ascending;
922 Assert.IsNotNull (lvw.ListViewItemSorter, "#E1");
923 Assert.AreEqual ("A", lvw.Items [0].Text, "#E2");
924 Assert.AreEqual ("B", lvw.Items [1].Text, "#E3");
925 Assert.AreEqual ("C", lvw.Items [2].Text, "#E4");
927 lvw.Sorting = SortOrder.None;
928 Assert.IsNotNull (lvw.ListViewItemSorter, "#F1");
929 Assert.AreEqual ("A", lvw.Items [0].Text, "#F2");
930 Assert.AreEqual ("B", lvw.Items [1].Text, "#F3");
931 Assert.AreEqual ("C", lvw.Items [2].Text, "#F4");
933 lvw.Sorting = SortOrder.Ascending;
934 Assert.IsNotNull (lvw.ListViewItemSorter, "#G1");
935 Assert.AreEqual ("A", lvw.Items [0].Text, "#G2");
936 Assert.AreEqual ("B", lvw.Items [1].Text, "#G3");
937 Assert.AreEqual ("C", lvw.Items [2].Text, "#G4");
939 lvw.Sorting = SortOrder.Descending;
940 Assert.IsNotNull (lvw.ListViewItemSorter, "#G1");
941 Assert.AreEqual ("C", lvw.Items [0].Text, "#G2");
942 Assert.AreEqual ("B", lvw.Items [1].Text, "#G3");
943 Assert.AreEqual ("A", lvw.Items [2].Text, "#G4");
945 lvw.Sorting = SortOrder.None;
946 Assert.IsNotNull (lvw.ListViewItemSorter, "#H1");
947 Assert.AreEqual ("C", lvw.Items [0].Text, "#H2");
948 Assert.AreEqual ("B", lvw.Items [1].Text, "#H3");
949 Assert.AreEqual ("A", lvw.Items [2].Text, "#H4");
951 // when Sorting is None and a new item is added, the collection is
952 // sorted using the previous Sorting value
953 lvw.Items.Add ("BB");
954 Assert.IsNotNull (lvw.ListViewItemSorter, "#I1");
955 Assert.AreEqual ("C", lvw.Items [0].Text, "#I2");
956 Assert.AreEqual ("BB", lvw.Items [1].Text, "#I3");
957 Assert.AreEqual ("B", lvw.Items [2].Text, "#I4");
958 Assert.AreEqual ("A", lvw.Items [3].Text, "#I5");
960 lvw.Sorting = SortOrder.Ascending;
961 Assert.IsNotNull (lvw.ListViewItemSorter, "#J1");
962 Assert.AreEqual ("A", lvw.Items [0].Text, "#J2");
963 Assert.AreEqual ("B", lvw.Items [1].Text, "#J3");
964 Assert.AreEqual ("BB", lvw.Items [2].Text, "#J4");
965 Assert.AreEqual ("C", lvw.Items [3].Text, "#J5");
967 // when Sorting is not None and a new item is added, the
968 // collection is re-sorted automatically
969 lvw.Items.Add ("BA");
970 Assert.IsNotNull (lvw.ListViewItemSorter, "#K1");
971 Assert.AreEqual ("A", lvw.Items [0].Text, "#K2");
972 Assert.AreEqual ("B", lvw.Items [1].Text, "#K3");
973 Assert.AreEqual ("BA", lvw.Items [2].Text, "#K4");
974 Assert.AreEqual ("BB", lvw.Items [3].Text, "#K5");
975 Assert.AreEqual ("C", lvw.Items [4].Text, "#K6");
977 // assign a custom comparer
978 MockComparer mc = new MockComparer (false);
979 lvw.ListViewItemSorter = mc;
981 // when a custom IComparer is assigned, the collection is immediately
983 Assert.IsTrue (mc.CompareCount > compareCount, "#L1");
984 Assert.IsNotNull (lvw.ListViewItemSorter, "#L2");
985 Assert.AreSame (mc, lvw.ListViewItemSorter, "#L3");
986 Assert.AreEqual ("C", lvw.Items [0].Text, "#L4");
987 Assert.AreEqual ("BB", lvw.Items [1].Text, "#L5");
988 Assert.AreEqual ("BA", lvw.Items [2].Text, "#L6");
989 Assert.AreEqual ("B", lvw.Items [3].Text, "#L7");
990 Assert.AreEqual ("A", lvw.Items [4].Text, "#L8");
992 // record compare count
993 compareCount = mc.CompareCount;
995 // modifying Sorting results in re-sort
996 lvw.Sorting = SortOrder.Descending;
997 Assert.IsTrue (mc.CompareCount > compareCount, "#M1");
998 Assert.IsNotNull (lvw.ListViewItemSorter, "#M2");
999 Assert.AreSame (mc, lvw.ListViewItemSorter, "#M3");
1000 Assert.AreEqual ("A", lvw.Items [0].Text, "#M4");
1001 Assert.AreEqual ("B", lvw.Items [1].Text, "#M5");
1002 Assert.AreEqual ("BA", lvw.Items [2].Text, "#M6");
1003 Assert.AreEqual ("BB", lvw.Items [3].Text, "#M7");
1004 Assert.AreEqual ("C", lvw.Items [4].Text, "#M8");
1006 // record compare count
1007 compareCount = mc.CompareCount;
1009 // setting Sorting to the same value does not result in a sort
1011 lvw.Sorting = SortOrder.Descending;
1012 Assert.AreEqual (compareCount, mc.CompareCount, "#N1");
1013 Assert.IsNotNull (lvw.ListViewItemSorter, "#N2");
1014 Assert.AreSame (mc, lvw.ListViewItemSorter, "#N3");
1015 Assert.AreEqual ("A", lvw.Items [0].Text, "#N4");
1016 Assert.AreEqual ("B", lvw.Items [1].Text, "#N5");
1017 Assert.AreEqual ("BA", lvw.Items [2].Text, "#N6");
1018 Assert.AreEqual ("BB", lvw.Items [3].Text, "#N7");
1019 Assert.AreEqual ("C", lvw.Items [4].Text, "#N8");
1021 // modifying Sorting results in re-sort
1022 lvw.Sorting = SortOrder.Ascending;
1023 Assert.IsTrue (mc.CompareCount > compareCount, "#O1");
1024 Assert.IsNotNull (lvw.ListViewItemSorter, "#O2");
1025 Assert.AreSame (mc, lvw.ListViewItemSorter, "#O3");
1026 Assert.AreEqual ("C", lvw.Items [0].Text, "#O4");
1027 Assert.AreEqual ("BB", lvw.Items [1].Text, "#O5");
1028 Assert.AreEqual ("BA", lvw.Items [2].Text, "#O6");
1029 Assert.AreEqual ("B", lvw.Items [3].Text, "#O7");
1030 Assert.AreEqual ("A", lvw.Items [4].Text, "#O8");
1032 // record compare count
1033 compareCount = mc.CompareCount;
1035 // adding an item when Sorting is not None causes re-sort
1036 lvw.Items.Add ("BC");
1037 Assert.IsTrue (mc.CompareCount > compareCount, "#P1");
1038 Assert.IsNotNull (lvw.ListViewItemSorter, "#P2");
1039 Assert.AreSame (mc, lvw.ListViewItemSorter, "#P3");
1040 Assert.AreEqual ("C", lvw.Items [0].Text, "#P4");
1041 Assert.AreEqual ("BC", lvw.Items [1].Text, "#P5");
1042 Assert.AreEqual ("BB", lvw.Items [2].Text, "#P6");
1043 Assert.AreEqual ("BA", lvw.Items [3].Text, "#P7");
1044 Assert.AreEqual ("B", lvw.Items [4].Text, "#P8");
1045 Assert.AreEqual ("A", lvw.Items [5].Text, "#P9");
1047 // record compare count
1048 compareCount = mc.CompareCount;
1050 // assigning the same custom IComparer again does not result in a
1052 lvw.ListViewItemSorter = mc;
1053 Assert.AreEqual (compareCount, mc.CompareCount, "#Q1");
1054 Assert.IsNotNull (lvw.ListViewItemSorter, "#Q2");
1055 Assert.AreSame (mc, lvw.ListViewItemSorter, "#Q3");
1056 Assert.AreEqual ("C", lvw.Items [0].Text, "#Q4");
1057 Assert.AreEqual ("BC", lvw.Items [1].Text, "#Q5");
1058 Assert.AreEqual ("BB", lvw.Items [2].Text, "#Q6");
1059 Assert.AreEqual ("BA", lvw.Items [3].Text, "#Q7");
1060 Assert.AreEqual ("B", lvw.Items [4].Text, "#Q8");
1061 Assert.AreEqual ("A", lvw.Items [5].Text, "#Q9");
1063 // setting Sorting to None does not perform a sort
1064 lvw.Sorting = SortOrder.None;
1065 Assert.AreEqual (compareCount, mc.CompareCount, "#R1");
1066 Assert.IsNotNull (lvw.ListViewItemSorter, "#R2");
1067 Assert.AreSame (mc, lvw.ListViewItemSorter, "#R3");
1068 Assert.AreEqual ("C", lvw.Items [0].Text, "#R4");
1069 Assert.AreEqual ("BC", lvw.Items [1].Text, "#R5");
1070 Assert.AreEqual ("BB", lvw.Items [2].Text, "#R6");
1071 Assert.AreEqual ("BA", lvw.Items [3].Text, "#R7");
1072 Assert.AreEqual ("B", lvw.Items [4].Text, "#R8");
1073 Assert.AreEqual ("A", lvw.Items [5].Text, "#R9");
1075 // assigning the custom IComparer again does not result in a
1077 lvw.ListViewItemSorter = mc;
1078 Assert.AreEqual (compareCount, mc.CompareCount, "#S1");
1079 Assert.IsNotNull (lvw.ListViewItemSorter, "#S2");
1080 Assert.AreSame (mc, lvw.ListViewItemSorter, "#S3");
1081 Assert.AreEqual ("C", lvw.Items [0].Text, "#S4");
1082 Assert.AreEqual ("BC", lvw.Items [1].Text, "#S5");
1083 Assert.AreEqual ("BB", lvw.Items [2].Text, "#S6");
1084 Assert.AreEqual ("BA", lvw.Items [3].Text, "#S7");
1085 Assert.AreEqual ("B", lvw.Items [4].Text, "#S8");
1086 Assert.AreEqual ("A", lvw.Items [5].Text, "#S9");
1088 // set Sorting to Ascending again
1089 lvw.Sorting = SortOrder.Ascending;
1090 Assert.IsTrue (mc.CompareCount > compareCount, "#T1");
1091 Assert.IsNotNull (lvw.ListViewItemSorter, "#T2");
1092 Assert.AreSame (mc, lvw.ListViewItemSorter, "#T3");
1093 Assert.AreEqual ("C", lvw.Items [0].Text, "#T4");
1094 Assert.AreEqual ("BC", lvw.Items [1].Text, "#T5");
1095 Assert.AreEqual ("BB", lvw.Items [2].Text, "#T6");
1096 Assert.AreEqual ("BA", lvw.Items [3].Text, "#T7");
1097 Assert.AreEqual ("B", lvw.Items [4].Text, "#T8");
1098 Assert.AreEqual ("A", lvw.Items [5].Text, "#T9");
1100 // record compare count
1101 compareCount = mc.CompareCount;
1103 // explicitly calling Sort results in a sort operation
1105 Assert.IsTrue (mc.CompareCount > compareCount, "#U1");
1106 Assert.IsNotNull (lvw.ListViewItemSorter, "#U2");
1107 Assert.AreSame (mc, lvw.ListViewItemSorter, "#U3");
1108 Assert.AreEqual ("C", lvw.Items [0].Text, "#U4");
1109 Assert.AreEqual ("BC", lvw.Items [1].Text, "#U5");
1110 Assert.AreEqual ("BB", lvw.Items [2].Text, "#U6");
1111 Assert.AreEqual ("BA", lvw.Items [3].Text, "#U7");
1112 Assert.AreEqual ("B", lvw.Items [4].Text, "#U8");
1113 Assert.AreEqual ("A", lvw.Items [5].Text, "#U9");
1114 lvw.Sorting = SortOrder.None;
1116 // record compare count
1117 compareCount = mc.CompareCount;
1119 // adding an item when Sorting is None causes re-sort
1120 lvw.Items.Add ("BD");
1121 Assert.IsTrue (mc.CompareCount > compareCount, "#V1");
1122 Assert.IsNotNull (lvw.ListViewItemSorter, "#V2");
1123 Assert.AreSame (mc, lvw.ListViewItemSorter, "#V3");
1124 Assert.AreEqual ("A", lvw.Items [0].Text, "#V4");
1125 Assert.AreEqual ("B", lvw.Items [1].Text, "#V5");
1126 Assert.AreEqual ("BA", lvw.Items [2].Text, "#V6");
1127 Assert.AreEqual ("BB", lvw.Items [3].Text, "#V7");
1128 Assert.AreEqual ("BC", lvw.Items [4].Text, "#V8");
1129 Assert.AreEqual ("BD", lvw.Items [5].Text, "#V9");
1130 Assert.AreEqual ("C", lvw.Items [6].Text, "#V10");
1132 // record compare count
1133 compareCount = mc.CompareCount;
1135 // explicitly calling Sort when Sorting is None causes a re-sort
1137 Assert.IsTrue (mc.CompareCount > compareCount, "#W1");
1138 Assert.IsNotNull (lvw.ListViewItemSorter, "#W2");
1139 Assert.AreSame (mc, lvw.ListViewItemSorter, "#W3");
1140 Assert.AreEqual ("A", lvw.Items [0].Text, "#W4");
1141 Assert.AreEqual ("B", lvw.Items [1].Text, "#W5");
1142 Assert.AreEqual ("BA", lvw.Items [2].Text, "#W6");
1143 Assert.AreEqual ("BB", lvw.Items [3].Text, "#W7");
1144 Assert.AreEqual ("BC", lvw.Items [4].Text, "#W8");
1145 Assert.AreEqual ("BD", lvw.Items [5].Text, "#W9");
1146 Assert.AreEqual ("C", lvw.Items [6].Text, "#W10");
1148 // record compare count
1149 compareCount = mc.CompareCount;
1153 private void AssertSortIcon_NotCreated (View view)
1155 Form form = new Form ();
1156 form.ShowInTaskbar = false;
1157 ListView lvw = CreateListView (view);
1158 form.Controls.Add (lvw);
1160 Assert.IsNull (lvw.ListViewItemSorter, "#A1");
1161 Assert.AreEqual ("B", lvw.Items [0].Text, "#A2");
1162 Assert.AreEqual ("A", lvw.Items [1].Text, "#A3");
1163 Assert.AreEqual ("C", lvw.Items [2].Text, "#A4");
1165 lvw.Sorting = SortOrder.None;
1166 Assert.IsNull (lvw.ListViewItemSorter, "#B1");
1167 Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
1168 Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
1169 Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
1171 lvw.Sorting = SortOrder.Descending;
1172 Assert.IsNotNull (lvw.ListViewItemSorter, "#C1");
1173 Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
1174 Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
1175 Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
1177 lvw.Sorting = SortOrder.Ascending;
1178 Assert.IsNotNull (lvw.ListViewItemSorter, "#D1");
1179 Assert.AreEqual ("B", lvw.Items [0].Text, "#D2");
1180 Assert.AreEqual ("A", lvw.Items [1].Text, "#D3");
1181 Assert.AreEqual ("C", lvw.Items [2].Text, "#D4");
1183 // when the handle is not created and a new item is added, the new
1184 // item is just appended to the collection
1185 lvw.Items.Add ("BB");
1186 Assert.IsNotNull (lvw.ListViewItemSorter, "#E1");
1187 Assert.AreEqual ("B", lvw.Items [0].Text, "#E2");
1188 Assert.AreEqual ("A", lvw.Items [1].Text, "#E3");
1189 Assert.AreEqual ("C", lvw.Items [2].Text, "#E4");
1190 Assert.AreEqual ("BB", lvw.Items [3].Text, "#E5");
1192 // assign a custom comparer
1193 MockComparer mc = new MockComparer (false);
1194 lvw.ListViewItemSorter = mc;
1196 // assigning a custom IComparer has no effect
1197 Assert.AreEqual (0, mc.CompareCount, "#F1");
1198 Assert.IsNotNull (lvw.ListViewItemSorter, "#F2");
1199 Assert.AreSame (mc, lvw.ListViewItemSorter, "#F3");
1200 Assert.AreEqual ("B", lvw.Items [0].Text, "#F4");
1201 Assert.AreEqual ("A", lvw.Items [1].Text, "#F5");
1202 Assert.AreEqual ("C", lvw.Items [2].Text, "#F6");
1203 Assert.AreEqual ("BB", lvw.Items [3].Text, "#F7");
1205 // modifying Sorting does not result in sort operation
1206 lvw.Sorting = SortOrder.Descending;
1207 Assert.AreEqual (0, mc.CompareCount, "#G1");
1208 Assert.IsNotNull (lvw.ListViewItemSorter, "#G2");
1209 Assert.AreSame (mc, lvw.ListViewItemSorter, "#G3");
1210 Assert.AreEqual ("B", lvw.Items [0].Text, "#G4");
1211 Assert.AreEqual ("A", lvw.Items [1].Text, "#G5");
1212 Assert.AreEqual ("C", lvw.Items [2].Text, "#G6");
1213 Assert.AreEqual ("BB", lvw.Items [3].Text, "#G7");
1215 // setting Sorting to the same value does not result in a sort
1217 lvw.Sorting = SortOrder.Descending;
1218 Assert.AreEqual (0, mc.CompareCount, "#H1");
1219 Assert.IsNotNull (lvw.ListViewItemSorter, "#H2");
1220 Assert.AreSame (mc, lvw.ListViewItemSorter, "#H3");
1221 Assert.AreEqual ("B", lvw.Items [0].Text, "#H4");
1222 Assert.AreEqual ("A", lvw.Items [1].Text, "#H5");
1223 Assert.AreEqual ("C", lvw.Items [2].Text, "#H6");
1224 Assert.AreEqual ("BB", lvw.Items [3].Text, "#H7");
1226 // setting Sorting to None does not result in a sort operation
1227 lvw.Sorting = SortOrder.None;
1228 Assert.AreEqual (0, mc.CompareCount, "#I1");
1229 Assert.IsNotNull (lvw.ListViewItemSorter, "#I2");
1230 Assert.AreSame (mc, lvw.ListViewItemSorter, "#I3");
1231 Assert.AreEqual ("B", lvw.Items [0].Text, "#I4");
1232 Assert.AreEqual ("A", lvw.Items [1].Text, "#I5");
1233 Assert.AreEqual ("C", lvw.Items [2].Text, "#I6");
1234 Assert.AreEqual ("BB", lvw.Items [3].Text, "#I7");
1236 // explicitly calling Sort when Sorting is None does not result
1237 // in a sort operation
1239 Assert.AreEqual (0, mc.CompareCount, "#J1");
1240 Assert.IsNotNull (lvw.ListViewItemSorter, "#J2");
1241 Assert.AreSame (mc, lvw.ListViewItemSorter, "#J3");
1242 Assert.AreEqual ("B", lvw.Items [0].Text, "#J4");
1243 Assert.AreEqual ("A", lvw.Items [1].Text, "#J5");
1244 Assert.AreEqual ("C", lvw.Items [2].Text, "#J6");
1245 Assert.AreEqual ("BB", lvw.Items [3].Text, "#J7");
1247 // setting Sorting again does not result in a sort operation
1248 lvw.Sorting = SortOrder.Ascending;
1249 Assert.AreEqual (0, mc.CompareCount, "#K1");
1250 Assert.IsNotNull (lvw.ListViewItemSorter, "#K2");
1251 Assert.AreSame (mc, lvw.ListViewItemSorter, "#K3");
1252 Assert.AreEqual ("B", lvw.Items [0].Text, "#K4");
1253 Assert.AreEqual ("A", lvw.Items [1].Text, "#K5");
1254 Assert.AreEqual ("C", lvw.Items [2].Text, "#K6");
1255 Assert.AreEqual ("BB", lvw.Items [3].Text, "#K7");
1257 // explicitly calling Sort when Sorting is Ascending does not
1258 // result in a sort operation
1260 Assert.AreEqual (0, mc.CompareCount, "#L1");
1261 Assert.IsNotNull (lvw.ListViewItemSorter, "#L2");
1262 Assert.AreSame (mc, lvw.ListViewItemSorter, "#L3");
1263 Assert.AreEqual ("B", lvw.Items [0].Text, "#L4");
1264 Assert.AreEqual ("A", lvw.Items [1].Text, "#L5");
1265 Assert.AreEqual ("C", lvw.Items [2].Text, "#L6");
1266 Assert.AreEqual ("BB", lvw.Items [3].Text, "#L7");
1268 // show the form to create the handle
1271 // when the handle is created, the items are immediately sorted
1272 Assert.IsTrue (mc.CompareCount > 0, "#L1");
1273 Assert.IsNotNull (lvw.ListViewItemSorter, "#M2");
1274 Assert.AreSame (mc, lvw.ListViewItemSorter, "#M3");
1275 Assert.AreEqual ("C", lvw.Items [0].Text, "#M4");
1276 Assert.AreEqual ("BB", lvw.Items [1].Text, "#M5");
1277 Assert.AreEqual ("B", lvw.Items [2].Text, "#M6");
1278 Assert.AreEqual ("A", lvw.Items [3].Text, "#M7");
1280 // setting ListViewItemSorter to null does not result in sort
1282 lvw.ListViewItemSorter = null;
1283 Assert.IsNull (lvw.ListViewItemSorter, "#N1");
1284 Assert.AreEqual ("C", lvw.Items [0].Text, "#N2");
1285 Assert.AreEqual ("BB", lvw.Items [1].Text, "#N3");
1286 Assert.AreEqual ("B", lvw.Items [2].Text, "#N4");
1287 Assert.AreEqual ("A", lvw.Items [3].Text, "#N5");
1289 // explicitly calling sort does not result in sort operation
1291 Assert.IsNull (lvw.ListViewItemSorter, "#O1");
1292 Assert.AreEqual ("C", lvw.Items [0].Text, "#O2");
1293 Assert.AreEqual ("BB", lvw.Items [1].Text, "#O3");
1294 Assert.AreEqual ("B", lvw.Items [2].Text, "#O4");
1295 Assert.AreEqual ("A", lvw.Items [3].Text, "#O5");
1300 private void AssertSortNoIcon_Created (View view)
1302 int compareCount = 0;
1304 Form form = new Form ();
1305 form.ShowInTaskbar = false;
1306 ListView lvw = CreateListView (view);
1307 form.Controls.Add (lvw);
1308 Assert.IsNull (lvw.ListViewItemSorter, "#A");
1312 Assert.IsNull (lvw.ListViewItemSorter, "#B1");
1313 Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
1314 Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
1315 Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
1317 lvw.Sorting = SortOrder.None;
1318 Assert.IsNull (lvw.ListViewItemSorter, "#C1");
1319 Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
1320 Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
1321 Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
1323 lvw.Sorting = SortOrder.Ascending;
1324 Assert.IsNull (lvw.ListViewItemSorter, "#D1");
1325 Assert.AreEqual ("A", lvw.Items [0].Text, "#D2");
1326 Assert.AreEqual ("B", lvw.Items [1].Text, "#D3");
1327 Assert.AreEqual ("C", lvw.Items [2].Text, "#D4");
1329 lvw.Sorting = SortOrder.Descending;
1330 Assert.IsNull (lvw.ListViewItemSorter, "#E1");
1331 Assert.AreEqual ("C", lvw.Items [0].Text, "#E2");
1332 Assert.AreEqual ("B", lvw.Items [1].Text, "#E3");
1333 Assert.AreEqual ("A", lvw.Items [2].Text, "#E4");
1335 lvw.Sorting = SortOrder.None;
1336 Assert.IsNull (lvw.ListViewItemSorter, "#F1");
1337 Assert.AreEqual ("C", lvw.Items [0].Text, "#F2");
1338 Assert.AreEqual ("B", lvw.Items [1].Text, "#F3");
1339 Assert.AreEqual ("A", lvw.Items [2].Text, "#F4");
1341 // when Sorting is None and a new item is added, the item is
1342 // appended to the collection
1343 lvw.Items.Add ("BB");
1344 Assert.IsNull (lvw.ListViewItemSorter, "#G1");
1345 Assert.AreEqual ("C", lvw.Items [0].Text, "#G2");
1346 Assert.AreEqual ("B", lvw.Items [1].Text, "#G3");
1347 Assert.AreEqual ("A", lvw.Items [2].Text, "#G4");
1348 Assert.AreEqual ("BB", lvw.Items [3].Text, "#G5");
1350 lvw.Sorting = SortOrder.Ascending;
1351 Assert.IsNull (lvw.ListViewItemSorter, "#H1");
1352 Assert.AreEqual ("A", lvw.Items [0].Text, "#H2");
1353 Assert.AreEqual ("B", lvw.Items [1].Text, "#H3");
1354 Assert.AreEqual ("BB", lvw.Items [2].Text, "#H4");
1355 Assert.AreEqual ("C", lvw.Items [3].Text, "#H5");
1357 // when Sorting is not None and a new item is added, the
1358 // collection is re-sorted automatically
1359 lvw.Items.Add ("BA");
1360 Assert.IsNull (lvw.ListViewItemSorter, "#I1");
1361 Assert.AreEqual ("A", lvw.Items [0].Text, "#I2");
1362 Assert.AreEqual ("B", lvw.Items [1].Text, "#I3");
1363 Assert.AreEqual ("BA", lvw.Items [2].Text, "#I4");
1364 Assert.AreEqual ("BB", lvw.Items [3].Text, "#I5");
1365 Assert.AreEqual ("C", lvw.Items [4].Text, "#I6");
1367 // assign a custom comparer
1368 MockComparer mc = new MockComparer (false);
1369 lvw.ListViewItemSorter = mc;
1371 // when a custom IComparer is assigned, the collection is immediately
1373 Assert.IsTrue (mc.CompareCount > compareCount, "#J1");
1374 Assert.IsNotNull (lvw.ListViewItemSorter, "#J2");
1375 Assert.AreSame (mc, lvw.ListViewItemSorter, "#J3");
1376 Assert.AreEqual ("C", lvw.Items [0].Text, "#J4");
1377 Assert.AreEqual ("BB", lvw.Items [1].Text, "#J5");
1378 Assert.AreEqual ("BA", lvw.Items [2].Text, "#J6");
1379 Assert.AreEqual ("B", lvw.Items [3].Text, "#J7");
1380 Assert.AreEqual ("A", lvw.Items [4].Text, "#J8");
1382 // record compare count
1383 compareCount = mc.CompareCount;
1385 // modifying the sort order results in a sort
1386 lvw.Sorting = SortOrder.Descending;
1387 Assert.IsTrue (mc.CompareCount > compareCount, "#L1");
1388 Assert.IsNotNull (lvw.ListViewItemSorter, "#K2");
1389 Assert.AreSame (mc, lvw.ListViewItemSorter, "#K3");
1390 Assert.AreEqual ("A", lvw.Items [0].Text, "#K4");
1391 Assert.AreEqual ("B", lvw.Items [1].Text, "#K5");
1392 Assert.AreEqual ("BA", lvw.Items [2].Text, "#K6");
1393 Assert.AreEqual ("BB", lvw.Items [3].Text, "#K7");
1394 Assert.AreEqual ("C", lvw.Items [4].Text, "#K8");
1396 // record compare count
1397 compareCount = mc.CompareCount;
1399 // set the sort order to the same value does not result in a sort
1401 lvw.Sorting = SortOrder.Descending;
1402 Assert.AreEqual (compareCount, mc.CompareCount, "#L1");
1403 Assert.IsNotNull (lvw.ListViewItemSorter, "#L2");
1404 Assert.AreSame (mc, lvw.ListViewItemSorter, "#L3");
1405 Assert.AreEqual ("A", lvw.Items [0].Text, "#L4");
1406 Assert.AreEqual ("B", lvw.Items [1].Text, "#L5");
1407 Assert.AreEqual ("BA", lvw.Items [2].Text, "#L6");
1408 Assert.AreEqual ("BB", lvw.Items [3].Text, "#L7");
1409 Assert.AreEqual ("C", lvw.Items [4].Text, "#L8");
1411 // modifying the sort order results in a sort
1412 lvw.Sorting = SortOrder.Ascending;
1413 Assert.IsTrue (mc.CompareCount > compareCount, "#M1");
1414 Assert.IsNotNull (lvw.ListViewItemSorter, "#M2");
1415 Assert.AreSame (mc, lvw.ListViewItemSorter, "#M3");
1416 Assert.AreEqual ("C", lvw.Items [0].Text, "#M4");
1417 Assert.AreEqual ("BB", lvw.Items [1].Text, "#M5");
1418 Assert.AreEqual ("BA", lvw.Items [2].Text, "#M6");
1419 Assert.AreEqual ("B", lvw.Items [3].Text, "#M7");
1420 Assert.AreEqual ("A", lvw.Items [4].Text, "#M8");
1422 // record compare count
1423 compareCount = mc.CompareCount;
1425 // adding an item when Sorting is not None caused a re-sort
1426 lvw.Items.Add ("BC");
1427 Assert.IsTrue (mc.CompareCount > compareCount, "#N1");
1428 Assert.IsNotNull (lvw.ListViewItemSorter, "#N2");
1429 Assert.AreSame (mc, lvw.ListViewItemSorter, "#N3");
1430 Assert.AreEqual ("C", lvw.Items [0].Text, "#N4");
1431 Assert.AreEqual ("BC", lvw.Items [1].Text, "#N5");
1432 Assert.AreEqual ("BB", lvw.Items [2].Text, "#N6");
1433 Assert.AreEqual ("BA", lvw.Items [3].Text, "#N7");
1434 Assert.AreEqual ("B", lvw.Items [4].Text, "#N8");
1435 Assert.AreEqual ("A", lvw.Items [5].Text, "#N9");
1437 // record compare count
1438 compareCount = mc.CompareCount;
1440 // assigning the same custom IComparer again does not result in a
1442 lvw.ListViewItemSorter = mc;
1443 Assert.AreEqual (compareCount, mc.CompareCount, "#O1");
1444 Assert.IsNotNull (lvw.ListViewItemSorter, "#O2");
1445 Assert.AreSame (mc, lvw.ListViewItemSorter, "#O3");
1446 Assert.AreEqual ("C", lvw.Items [0].Text, "#O4");
1447 Assert.AreEqual ("BC", lvw.Items [1].Text, "#O5");
1448 Assert.AreEqual ("BB", lvw.Items [2].Text, "#O6");
1449 Assert.AreEqual ("BA", lvw.Items [3].Text, "#O7");
1450 Assert.AreEqual ("B", lvw.Items [4].Text, "#O8");
1451 Assert.AreEqual ("A", lvw.Items [5].Text, "#O9");
1453 // setting sort order to None does not perform a sort and resets
1454 // the ListViewItemSorter
1455 lvw.Sorting = SortOrder.None;
1456 Assert.AreEqual (compareCount, mc.CompareCount, "#P1");
1457 Assert.IsNull (lvw.ListViewItemSorter, "#P2");
1458 Assert.AreEqual ("C", lvw.Items [0].Text, "#P3");
1459 Assert.AreEqual ("BC", lvw.Items [1].Text, "#P4");
1460 Assert.AreEqual ("BB", lvw.Items [2].Text, "#P5");
1461 Assert.AreEqual ("BA", lvw.Items [3].Text, "#P6");
1462 Assert.AreEqual ("B", lvw.Items [4].Text, "#P7");
1463 Assert.AreEqual ("A", lvw.Items [5].Text, "#P8");
1466 lvw.ListViewItemSorter = mc;
1467 // assigning the previous custom IComparer again results in a
1469 Assert.IsTrue (mc.CompareCount > compareCount, "#Q1");
1470 Assert.IsNotNull (lvw.ListViewItemSorter, "#Q2");
1471 Assert.AreSame (mc, lvw.ListViewItemSorter, "#Q3");
1472 Assert.AreEqual ("A", lvw.Items [0].Text, "#Q4");
1473 Assert.AreEqual ("B", lvw.Items [1].Text, "#Q5");
1474 Assert.AreEqual ("BA", lvw.Items [2].Text, "#Q6");
1475 Assert.AreEqual ("BB", lvw.Items [3].Text, "#Q7");
1476 Assert.AreEqual ("BC", lvw.Items [4].Text, "#Q8");
1477 Assert.AreEqual ("C", lvw.Items [5].Text, "#Q9");
1479 // record compare count
1480 compareCount = mc.CompareCount;
1482 // set Sorting to Ascending again to verify that the internal
1483 // IComparer is not used when we reset Sorting to None
1484 // (as the items would then be sorted alfabetically)
1485 lvw.Sorting = SortOrder.Ascending;
1486 Assert.IsTrue (mc.CompareCount > compareCount, "#R1");
1487 Assert.IsNotNull (lvw.ListViewItemSorter, "#R2");
1488 Assert.AreSame (mc, lvw.ListViewItemSorter, "#R3");
1489 Assert.AreEqual ("C", lvw.Items [0].Text, "#R4");
1490 Assert.AreEqual ("BC", lvw.Items [1].Text, "#R5");
1491 Assert.AreEqual ("BB", lvw.Items [2].Text, "#R6");
1492 Assert.AreEqual ("BA", lvw.Items [3].Text, "#R7");
1493 Assert.AreEqual ("B", lvw.Items [4].Text, "#R8");
1494 Assert.AreEqual ("A", lvw.Items [5].Text, "#R9");
1496 // record compare count
1497 compareCount = mc.CompareCount;
1499 lvw.Sorting = SortOrder.None;
1500 Assert.AreEqual (compareCount, mc.CompareCount, "#S1");
1501 Assert.IsNull (lvw.ListViewItemSorter, "#S2");
1502 Assert.AreEqual ("C", lvw.Items [0].Text, "#S3");
1503 Assert.AreEqual ("BC", lvw.Items [1].Text, "#S4");
1504 Assert.AreEqual ("BB", lvw.Items [2].Text, "#S5");
1505 Assert.AreEqual ("BA", lvw.Items [3].Text, "#S6");
1506 Assert.AreEqual ("B", lvw.Items [4].Text, "#S7");
1507 Assert.AreEqual ("A", lvw.Items [5].Text, "#S8");
1509 // record compare count
1510 compareCount = mc.CompareCount;
1512 lvw.Items.Add ("BD");
1513 // adding an item when Sorting is None does not cause a re-sort
1514 Assert.AreEqual (compareCount, mc.CompareCount, "#T1");
1515 Assert.IsNull (lvw.ListViewItemSorter, "#T2");
1516 Assert.AreEqual ("C", lvw.Items [0].Text, "#T3");
1517 Assert.AreEqual ("BC", lvw.Items [1].Text, "#T4");
1518 Assert.AreEqual ("BB", lvw.Items [2].Text, "#T5");
1519 Assert.AreEqual ("BA", lvw.Items [3].Text, "#T6");
1520 Assert.AreEqual ("B", lvw.Items [4].Text, "#T7");
1521 Assert.AreEqual ("A", lvw.Items [5].Text, "#T8");
1522 Assert.AreEqual ("BD", lvw.Items [6].Text, "#T9");
1524 // record compare count
1525 compareCount = mc.CompareCount;
1528 // explicitly calling Sort when Sorting is None does nothing
1529 Assert.AreEqual (compareCount, mc.CompareCount, "#U1");
1530 Assert.IsNull (lvw.ListViewItemSorter, "#U2");
1531 Assert.AreEqual ("C", lvw.Items [0].Text, "#U3");
1532 Assert.AreEqual ("BC", lvw.Items [1].Text, "#U4");
1533 Assert.AreEqual ("BB", lvw.Items [2].Text, "#U5");
1534 Assert.AreEqual ("BA", lvw.Items [3].Text, "#U6");
1535 Assert.AreEqual ("B", lvw.Items [4].Text, "#U7");
1536 Assert.AreEqual ("A", lvw.Items [5].Text, "#U8");
1537 Assert.AreEqual ("BD", lvw.Items [6].Text, "#U9");
1539 // record compare count
1540 compareCount = mc.CompareCount;
1542 lvw.Sorting = SortOrder.Ascending;
1543 // setting Sorting again, does not reinstate the custom IComparer
1544 // but sorting is actually performed using an internal non-visible
1546 Assert.AreEqual (compareCount, mc.CompareCount, "#V1");
1547 Assert.IsNull (lvw.ListViewItemSorter, "#V2");
1548 Assert.AreEqual ("A", lvw.Items [0].Text, "#V3");
1549 Assert.AreEqual ("B", lvw.Items [1].Text, "#V4");
1550 Assert.AreEqual ("BA", lvw.Items [2].Text, "#V5");
1551 Assert.AreEqual ("BB", lvw.Items [3].Text, "#V6");
1552 Assert.AreEqual ("BC", lvw.Items [4].Text, "#V7");
1553 Assert.AreEqual ("BD", lvw.Items [5].Text, "#V8");
1554 Assert.AreEqual ("C", lvw.Items [6].Text, "#V9");
1556 // record compare count
1557 compareCount = mc.CompareCount;
1560 // explicitly calling Sort, does not reinstate the custom IComparer
1561 // but sorting is actually performed using an internal non-visible
1563 Assert.AreEqual (compareCount, mc.CompareCount, "#W1");
1564 Assert.IsNull (lvw.ListViewItemSorter, "#W2");
1565 Assert.AreEqual ("A", lvw.Items [0].Text, "#W3");
1566 Assert.AreEqual ("B", lvw.Items [1].Text, "#W4");
1567 Assert.AreEqual ("BA", lvw.Items [2].Text, "#W5");
1568 Assert.AreEqual ("BB", lvw.Items [3].Text, "#W6");
1569 Assert.AreEqual ("BC", lvw.Items [4].Text, "#W7");
1570 Assert.AreEqual ("BD", lvw.Items [5].Text, "#W8");
1571 Assert.AreEqual ("C", lvw.Items [6].Text, "#W9");
1573 // record compare count
1574 compareCount = mc.CompareCount;
1579 private void AssertSortNoIcon_NotCreated (View view)
1581 Form form = new Form ();
1582 form.ShowInTaskbar = false;
1583 ListView lvw = CreateListView (view);
1584 form.Controls.Add (lvw);
1586 Assert.IsNull (lvw.ListViewItemSorter, "#A1");
1587 Assert.AreEqual ("B", lvw.Items [0].Text, "#A2");
1588 Assert.AreEqual ("A", lvw.Items [1].Text, "#A3");
1589 Assert.AreEqual ("C", lvw.Items [2].Text, "#A4");
1591 lvw.Sorting = SortOrder.None;
1592 Assert.IsNull (lvw.ListViewItemSorter, "#B1");
1593 Assert.AreEqual ("B", lvw.Items [0].Text, "#B2");
1594 Assert.AreEqual ("A", lvw.Items [1].Text, "#B3");
1595 Assert.AreEqual ("C", lvw.Items [2].Text, "#B4");
1597 lvw.Sorting = SortOrder.Ascending;
1598 Assert.IsNull (lvw.ListViewItemSorter, "#C1");
1599 Assert.AreEqual ("B", lvw.Items [0].Text, "#C2");
1600 Assert.AreEqual ("A", lvw.Items [1].Text, "#C3");
1601 Assert.AreEqual ("C", lvw.Items [2].Text, "#C4");
1603 lvw.Sorting = SortOrder.Descending;
1604 Assert.IsNull (lvw.ListViewItemSorter, "#D1");
1605 Assert.AreEqual ("B", lvw.Items [0].Text, "#D2");
1606 Assert.AreEqual ("A", lvw.Items [1].Text, "#D3");
1607 Assert.AreEqual ("C", lvw.Items [2].Text, "#D4");
1609 lvw.Sorting = SortOrder.None;
1610 Assert.IsNull (lvw.ListViewItemSorter, "#E1");
1611 Assert.AreEqual ("B", lvw.Items [0].Text, "#E2");
1612 Assert.AreEqual ("A", lvw.Items [1].Text, "#E3");
1613 Assert.AreEqual ("C", lvw.Items [2].Text, "#E4");
1615 lvw.Sorting = SortOrder.Ascending;
1616 Assert.IsNull (lvw.ListViewItemSorter, "#F1");
1617 Assert.AreEqual ("B", lvw.Items [0].Text, "#F2");
1618 Assert.AreEqual ("A", lvw.Items [1].Text, "#F3");
1619 Assert.AreEqual ("C", lvw.Items [2].Text, "#F4");
1621 // when the handle is not created and a new item is added, the new
1622 // item is just appended to the collection
1623 lvw.Items.Add ("BB");
1624 Assert.IsNull (lvw.ListViewItemSorter, "#G1");
1625 Assert.AreEqual ("B", lvw.Items [0].Text, "#G2");
1626 Assert.AreEqual ("A", lvw.Items [1].Text, "#G3");
1627 Assert.AreEqual ("C", lvw.Items [2].Text, "#G4");
1628 Assert.AreEqual ("BB", lvw.Items [3].Text, "#G5");
1630 // assign a custom comparer
1631 MockComparer mc = new MockComparer (false);
1632 lvw.ListViewItemSorter = mc;
1634 // assigning a custom IComparer has no effect
1635 Assert.AreEqual (0, mc.CompareCount, "#H1");
1636 Assert.IsNotNull (lvw.ListViewItemSorter, "#H2");
1637 Assert.AreSame (mc, lvw.ListViewItemSorter, "#H3");
1638 Assert.AreEqual ("B", lvw.Items [0].Text, "#H4");
1639 Assert.AreEqual ("A", lvw.Items [1].Text, "#H5");
1640 Assert.AreEqual ("C", lvw.Items [2].Text, "#H6");
1641 Assert.AreEqual ("BB", lvw.Items [3].Text, "#H7");
1643 // modifying Sorting has no effect
1644 lvw.Sorting = SortOrder.Descending;
1645 Assert.AreEqual (0, mc.CompareCount, "#I1");
1646 Assert.IsNotNull (lvw.ListViewItemSorter, "#I2");
1647 Assert.AreSame (mc, lvw.ListViewItemSorter, "#I3");
1648 Assert.AreEqual ("B", lvw.Items [0].Text, "#I4");
1649 Assert.AreEqual ("A", lvw.Items [1].Text, "#I5");
1650 Assert.AreEqual ("C", lvw.Items [2].Text, "#I6");
1651 Assert.AreEqual ("BB", lvw.Items [3].Text, "#I7");
1653 // setting Sorting to the same value does not result in a sort
1655 lvw.Sorting = SortOrder.Descending;
1656 Assert.AreEqual (0, mc.CompareCount, "#J1");
1657 Assert.IsNotNull (lvw.ListViewItemSorter, "#J2");
1658 Assert.AreSame (mc, lvw.ListViewItemSorter, "#J3");
1659 Assert.AreEqual ("B", lvw.Items [0].Text, "#J4");
1660 Assert.AreEqual ("A", lvw.Items [1].Text, "#J5");
1661 Assert.AreEqual ("C", lvw.Items [2].Text, "#J6");
1662 Assert.AreEqual ("BB", lvw.Items [3].Text, "#J7");
1664 // setting Sorting to another value does not result in a sort
1666 lvw.Sorting = SortOrder.Ascending;
1667 Assert.AreEqual (0, mc.CompareCount, "#K1");
1668 Assert.IsNotNull (lvw.ListViewItemSorter, "#K2");
1669 Assert.AreSame (mc, lvw.ListViewItemSorter, "#K3");
1670 Assert.AreEqual ("B", lvw.Items [0].Text, "#K4");
1671 Assert.AreEqual ("A", lvw.Items [1].Text, "#K5");
1672 Assert.AreEqual ("C", lvw.Items [2].Text, "#K6");
1673 Assert.AreEqual ("BB", lvw.Items [3].Text, "#K7");
1675 lvw.Sorting = SortOrder.None;
1676 Assert.AreEqual (0, mc.CompareCount, "#L1");
1677 // setting Sorting to None does not perform a sort and resets the
1678 // ListViewItemSorter
1679 Assert.IsNull (lvw.ListViewItemSorter, "#L2");
1680 Assert.AreEqual ("B", lvw.Items [0].Text, "#L3");
1681 Assert.AreEqual ("A", lvw.Items [1].Text, "#L4");
1682 Assert.AreEqual ("C", lvw.Items [2].Text, "#L5");
1683 Assert.AreEqual ("BB", lvw.Items [3].Text, "#L6");
1685 // explicitly calling Sort when Sorting is None does nothing
1687 Assert.AreEqual (0, mc.CompareCount, "#M1");
1688 Assert.IsNull (lvw.ListViewItemSorter, "#M2");
1689 Assert.AreEqual ("B", lvw.Items [0].Text, "#M3");
1690 Assert.AreEqual ("A", lvw.Items [1].Text, "#M4");
1691 Assert.AreEqual ("C", lvw.Items [2].Text, "#M5");
1692 Assert.AreEqual ("BB", lvw.Items [3].Text, "#M6");
1694 lvw.Sorting = SortOrder.Ascending;
1695 Assert.AreEqual (0, mc.CompareCount, "#N1");
1696 Assert.IsNull (lvw.ListViewItemSorter, "#N2");
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");
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");
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");
1722 // show the form to create the handle
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");
1734 // setting ListViewItemSorter to null does not result in sort
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");
1743 // explicitly calling sort does not result in sort operation
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");
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");
1762 private void AssertSort_Checked (View view)
1764 Form form = new Form ();
1765 form.ShowInTaskbar = false;
1766 ListView lvw = CreateListView (view);
1767 lvw.CheckBoxes = true;
1768 form.Controls.Add (lvw);
1772 Assert.AreEqual (0, lvw.CheckedItems.Count, "#A1");
1773 Assert.AreEqual (0, lvw.CheckedIndices.Count, "#A2");
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");
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");
1789 // add an item, which ends up before the selected item after the
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");
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");
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");
1811 // assign a custom comparer
1812 MockComparer mc = new MockComparer (false);
1813 lvw.ListViewItemSorter = mc;
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");
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");
1831 private void AssertSort_Selected (View view)
1833 Form form = new Form ();
1834 form.ShowInTaskbar = false;
1835 ListView lvw = CreateListView (view);
1836 form.Controls.Add (lvw);
1840 Assert.AreEqual (0, lvw.SelectedItems.Count, "#A1");
1841 Assert.AreEqual (0, lvw.SelectedIndices.Count, "#A2");
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");
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");
1857 // add an item, which ends up before the selected item after the
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");
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");
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");
1879 // assign a custom comparer
1880 MockComparer mc = new MockComparer (false);
1881 lvw.ListViewItemSorter = mc;
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");
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");
1899 private ListView CreateListView (View view)
1901 ListView lvw = new ListView ();
1903 lvw.Items.Add ("B");
1904 lvw.Items.Add ("A");
1905 lvw.Items.Add ("C");
1909 private class MockComparer : IComparer
1912 bool _throwException;
1914 public MockComparer (bool throwException)
1916 _throwException = throwException;
1919 public int CompareCount {
1920 get { return _compareCount; }
1923 public int Compare (object x, object y)
1926 if (_throwException)
1927 throw new InvalidOperationException ();
1929 ListViewItem item_x = x as ListViewItem;
1930 ListViewItem item_y = y as ListViewItem;
1931 SortOrder sortOrder = item_x.ListView.Sorting;
1933 // we'll actually perform a reverse-sort
1934 if (sortOrder == SortOrder.Ascending)
1935 return String.Compare (item_y.Text, item_x.Text);
1937 return String.Compare (item_x.Text, item_y.Text);
1942 public void MethodIsInputChar ()
1944 // Basically, show that this method always returns true
1945 InputCharControl m = new InputCharControl ();
1948 for (int i = 0; i < 256; i++)
1949 result &= m.PublicIsInputChar ((char)i);
1951 Assert.AreEqual (true, result, "I1");
1954 private class InputCharControl : ListView
1956 public bool PublicIsInputChar (char charCode)
1958 return base.IsInputChar (charCode);
1962 [Test] // Should not throw IndexOutOfBoundsException
1963 public void ReaddingItem ()
1965 Form form = new Form ();
1966 form.ShowInTaskbar = false;
1967 ListView lvw1 = new ListView ();
1968 ListView lvw2 = new ListView ();
1969 lvw1.View = View.Details;
1970 lvw2.View = View.Details;
1971 lvw1.Columns.Add (new ColumnHeader ("1"));
1972 lvw2.Columns.Add (new ColumnHeader ("2"));
1973 form.Controls.Add (lvw1);
1974 form.Controls.Add (lvw2);
1977 for (int i = 0; i < 50; i++)
1978 lvw1.Items.Add ("A");
1979 lvw2.Items.Add ("B1");
1981 ListViewItem item = lvw1.Items [lvw1.Items.Count - 1];
1982 item.Selected = true;
1984 lvw2.Items.Add (item);
1985 item.Selected = true;
1987 Assert.AreEqual (lvw1.Items.Count, 49, "#1");
1988 Assert.AreEqual (lvw2.Items.Count, 2, "#2");
1989 Assert.AreEqual (lvw2.Items [1].Selected, true, "#3");
1994 [Test] // Should not throw ArgumentOutOfRangeException
1995 public void DeleteNotFocusedItem ()
1997 Form form = new Form ();
1998 form.ShowInTaskbar = false;
1999 ListView lvw = new ListView ();
2000 form.Controls.Add (lvw);
2003 for (int i = 0; i < 3; i++)
2004 lvw.Items.Add ("A");
2006 lvw.Items [lvw.Items.Count - 1].Focused = true;
2007 lvw.Items [0].Remove ();
2008 lvw.Items [0].Remove ();