2007-03-28 Igor Zelmanovich <igorz@mainsoft.com>
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / ListViewCollectionsTest.cs
index f4957574f19805fd71453b665fe65ebd6ea18c84..a65fa32da27b564e1f97c5924fa5d6fb0cc4e3ec 100644 (file)
@@ -56,33 +56,105 @@ namespace MonoTests.System.Windows.Forms
                public void ColumnHeaderCollectionTest_AddTest ()
                {
                        ListView listview = new ListView ();
+                       ColumnHeader colA = new ColumnHeader ();
+                       ColumnHeader colB = new ColumnHeader ();
 
                        // Duplicated elements with same text added
-                       listview.Columns.Add (new ColumnHeader ());
-                       listview.Columns.Add (new ColumnHeader ());
-                       Assert.AreEqual (2, listview.Columns.Count, "ColumnHeaderCollectionTest_AddTest#1");
-                       Assert.AreEqual ("ColumnHeader", listview.Columns[0].Text, "ColumnHeaderCollectionTest_AddTest#2");
+                       listview.Columns.Add (colA);
+                       listview.Columns.Add (colB);
+                       Assert.AreEqual (2, listview.Columns.Count, "#1");
+                       Assert.AreEqual ("ColumnHeader", listview.Columns[0].Text, "#2");
+                       Assert.AreSame (listview, colA.ListView, "#3");
+                       Assert.AreSame (listview, colB.ListView, "#4");
                }
 
                [Test]
                public void ColumnHeaderCollectionTest_ClearTest ()
                {
                        ListView listview = new ListView ();
-
-                       // Duplicated elements with same text added
-                       listview.Columns.Add (new ColumnHeader ());
+                       ColumnHeader colA = new ColumnHeader ();
+                       ColumnHeader colB = new ColumnHeader ();
+                       listview.Columns.Add (colA);
+                       listview.Columns.Add (colB);
                        listview.Columns.Clear ();
-                       Assert.AreEqual (0, listview.Columns.Count, "ColumnHeaderCollectionTest_ClearTest#1");
+                       Assert.AreEqual (0, listview.Columns.Count, "#1");
+                       Assert.IsNull (colA.ListView, "#2");
+                       Assert.IsNull (colB.ListView, "#3");
                }
 
-               // Exceptions
-               [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
-               public void ColumnHeaderCollectionTest_GetItem_ExceptionTest ()
+               [Test]
+               public void ColumnHeaderCollectionTest_Remove ()
+               {
+                       ListView listview = new ListView ();
+                       ColumnHeader colA = new ColumnHeader ();
+                       ColumnHeader colB = new ColumnHeader ();
+                       ColumnHeader colC = new ColumnHeader ();
+                       listview.Columns.Add (colA);
+                       listview.Columns.Add (colB);
+                       listview.Columns.Add (colC);
+
+                       listview.Columns.Remove (colB);
+                       Assert.AreEqual (2, listview.Columns.Count, "#A1");
+                       Assert.AreSame (colA, listview.Columns [0], "#A2");
+                       Assert.AreSame (colC, listview.Columns [1], "#A3");
+                       Assert.AreSame (listview, colA.ListView, "#A4");
+                       Assert.IsNull (colB.ListView, "#A5");
+                       Assert.AreSame (listview, colC.ListView, "#A6");
+                       Assert.AreEqual (0, colA.Index, "#A7");
+                       Assert.AreEqual (-1, colB.Index, "#A8");
+                       Assert.AreEqual (1, colC.Index, "#A9");
+
+                       listview.Columns.Remove (colC);
+                       Assert.AreEqual (1, listview.Columns.Count, "#B1");
+                       Assert.AreSame (colA, listview.Columns [0], "#B2");
+                       Assert.AreSame (listview, colA.ListView, "#B3");
+                       Assert.IsNull (colB.ListView, "#B4");
+                       Assert.IsNull (colC.ListView, "#B5");
+                       Assert.AreEqual (0, colA.Index, "#B6");
+                       Assert.AreEqual (-1, colB.Index, "#B7");
+                       Assert.AreEqual (-1, colC.Index, "#B8");
+
+                       listview.Columns.Remove (colA);
+                       Assert.AreEqual (0, listview.Columns.Count, "#C1");
+                       Assert.IsNull (colA.ListView, "#C2");
+                       Assert.IsNull (colB.ListView, "#C3");
+                       Assert.IsNull (colC.ListView, "#C4");
+                       Assert.AreEqual (-1, colA.Index, "#C5");
+                       Assert.AreEqual (-1, colB.Index, "#C6");
+                       Assert.AreEqual (-1, colC.Index, "#C7");
+               }
+
+               [Test]
+               public void ColumnHeaderCollectionTest_RemoveAt ()
                {
-                       // Duplicated elements not added
                        ListView listview = new ListView ();
-                       ColumnHeader item = listview.Columns[5];
-                       Assert.Fail ("#1: " + item.Text); // avoid CS0219 warning
+                       ColumnHeader colA = new ColumnHeader ();
+                       ColumnHeader colB = new ColumnHeader ();
+                       ColumnHeader colC = new ColumnHeader ();
+                       listview.Columns.Add (colA);
+                       listview.Columns.Add (colB);
+                       listview.Columns.Add (colC);
+
+                       listview.Columns.RemoveAt (1);
+                       Assert.AreEqual (2, listview.Columns.Count, "#A1");
+                       Assert.AreSame (colA, listview.Columns [0], "#A2");
+                       Assert.AreSame (colC, listview.Columns [1], "#A3");
+                       Assert.AreSame (listview, colA.ListView, "#A4");
+                       Assert.IsNull (colB.ListView, "#A5");
+                       Assert.AreSame (listview, colC.ListView, "#A6");
+
+                       listview.Columns.RemoveAt (0);
+                       Assert.AreEqual (1, listview.Columns.Count, "#B1");
+                       Assert.AreSame (colC, listview.Columns [0], "#B2");
+                       Assert.IsNull (colA.ListView, "#B3");
+                       Assert.IsNull (colB.ListView, "#B4");
+                       Assert.AreSame (listview, colC.ListView, "#B5");
+
+                       listview.Columns.RemoveAt (0);
+                       Assert.AreEqual (0, listview.Columns.Count, "#C1");
+                       Assert.IsNull (colA.ListView, "#C2");
+                       Assert.IsNull (colB.ListView, "#C3");
+                       Assert.IsNull (colC.ListView, "#C4");
                }
 
                /*
@@ -149,6 +221,56 @@ namespace MonoTests.System.Windows.Forms
                        ((IList)listview.CheckedItems).Add (5);
                }
 
+               [Test]
+               public void CheckedItemCollectionTest_Order ()
+               {
+                       Form form = new Form ();
+                       form.ShowInTaskbar = false;
+                       ListView lvw = new ListView ();
+                       lvw.CheckBoxes = true;
+                       form.Controls.Add (lvw);
+                       ListViewItem itemA = lvw.Items.Add ("A");
+                       itemA.Checked = true;
+                       ListViewItem itemB = lvw.Items.Add ("B");
+                       itemB.Checked = true;
+                       ListViewItem itemC = lvw.Items.Add ("C");
+                       itemC.Checked = true;
+
+                       Assert.AreEqual (3, lvw.CheckedItems.Count, "#A1");
+                       Assert.AreSame (itemA, lvw.CheckedItems [0], "#A2");
+                       Assert.AreSame (itemB, lvw.CheckedItems [1], "#A3");
+                       Assert.AreSame (itemC, lvw.CheckedItems [2], "#A3");
+
+                       itemB.Checked = false;
+
+                       Assert.AreEqual (2, lvw.CheckedItems.Count, "#B1");
+                       Assert.AreSame (itemA, lvw.CheckedItems [0], "#B2");
+                       Assert.AreSame (itemC, lvw.CheckedItems [1], "#B3");
+
+                       itemB.Checked = true;
+
+                       Assert.AreEqual (3, lvw.CheckedItems.Count, "#C1");
+                       Assert.AreSame (itemA, lvw.CheckedItems [0], "#C2");
+                       Assert.AreSame (itemB, lvw.CheckedItems [1], "#C3");
+                       Assert.AreSame (itemC, lvw.CheckedItems [2], "#C4");
+
+                       lvw.Sorting = SortOrder.Descending;
+
+                       Assert.AreEqual (3, lvw.CheckedItems.Count, "#D1");
+                       Assert.AreSame (itemA, lvw.CheckedItems [0], "#D2");
+                       Assert.AreSame (itemB, lvw.CheckedItems [1], "#D3");
+                       Assert.AreSame (itemC, lvw.CheckedItems [2], "#D4");
+
+                       // sorting only takes effect when listview is created
+                       form.Show ();
+
+                       Assert.AreEqual (3, lvw.CheckedItems.Count, "#E1");
+                       Assert.AreSame (itemC, lvw.CheckedItems [0], "#E2");
+                       Assert.AreSame (itemB, lvw.CheckedItems [1], "#E3");
+                       Assert.AreSame (itemA, lvw.CheckedItems [2], "#E4");
+                       form.Dispose ();
+               }
+
                [Test, ExpectedException (typeof (NotSupportedException))]
                public void CheckedItemCollectionTest_PropertiesTest_Remove_ExceptionTest ()
                {
@@ -172,15 +294,92 @@ namespace MonoTests.System.Windows.Forms
                        ListView listview = new ListView ();
 
                        // Properties
+#if !NET_2_0
                        Assert.AreEqual (true, listview.SelectedIndices.IsReadOnly, "SelectedIndexCollectionTest_PropertiesTest#1");
+                       Assert.AreEqual (true, ((IList)listview.SelectedIndices).IsFixedSize, "SelectedIndexCollectionTest_PropertiesTest#4");
+#else
+                       Assert.AreEqual (false, listview.SelectedIndices.IsReadOnly, "SelectedIndexCollectionTest_PropertiesTest#1");
+                       Assert.AreEqual (false, ((IList)listview.SelectedIndices).IsFixedSize, "SelectedIndexCollectionTest_PropertiesTest#4");
+#endif
                        Assert.AreEqual (false, ((ICollection)listview.SelectedIndices).IsSynchronized, "SelectedIndexCollectionTest_PropertiesTest#2");
                        Assert.AreEqual (listview.SelectedIndices, ((ICollection)listview.SelectedIndices).SyncRoot, "SelectedIndexCollectionTest_PropertiesTest#3");
-                       Assert.AreEqual (true, ((IList)listview.SelectedIndices).IsFixedSize, "SelectedIndexCollectionTest_PropertiesTest#4");
                        Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_PropertiesTest#5");
                }
 
+#if NET_2_0
+               [Test]
+               public void SelectedIndexCollectionTest_AddTest ()
+               {
+                       ListView listview = new ListView ();
+                       listview.Items.Add ("A");
+
+                       int n = listview.SelectedIndices.Add (0);
+                       Assert.AreEqual (0, n, "SelectedIndexCollectionTest_AddTest#1");
+                       Assert.AreEqual (true, listview.Items [0].Selected, "SelectedIndexCollectionTest_AddTest#2");
+
+                       // Force to create the handle
+                       listview.CreateControl ();
+                       Assert.AreEqual (1, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_AddTest#4");
+
+                       n = listview.SelectedIndices.Add (0);
+                       Assert.AreEqual (1, n, "SelectedIndexCollectionTest_AddTest#5");
+                       Assert.AreEqual (1, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_AddTest#6");
+                       Assert.AreEqual (true, listview.Items [0].Selected, "SelectedIndexCollectionTest_AddTest#7");
+               }
+
+               [Test]
+               public void SelectedIndexCollectionTest_ClearTest ()
+               {
+                       ListView listview = new ListView ();
+                       listview.Items.Add ("A");
+                       listview.Items.Add ("B");
+                       listview.Items.Add ("C");
+
+                       listview.SelectedIndices.Add (0);
+                       listview.SelectedIndices.Add (2);
+
+                       // Nothing if handle hasn't been created
+                       listview.SelectedIndices.Clear (); 
+                       Assert.AreEqual (true, listview.Items [0].Selected, "SelectedIndexCollectionTest_ClearTest#2");
+                       Assert.AreEqual (false, listview.Items [1].Selected, "SelectedIndexCollectionTest_ClearTest#3");
+                       Assert.AreEqual (true, listview.Items [2].Selected, "SelectedIndexCollectionTest_ClearTest#4");
+
+                       // Force to create the handle
+                       listview.CreateControl ();
+
+                       listview.SelectedIndices.Add (0);
+                       listview.SelectedIndices.Add (2);
+
+                       listview.SelectedIndices.Clear ();
+                       Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_ClearTest#5");
+                       Assert.AreEqual (false, listview.Items [0].Selected, "SelectedIndexCollectionTest_ClearTest#6");
+                       Assert.AreEqual (false, listview.Items [1].Selected, "SelectedIndexCollectionTest_ClearTest#7");
+                       Assert.AreEqual (false, listview.Items [2].Selected, "SelectedIndexCollectionTest_ClearTest#8");
+               }
+
+               [Test]
+               public void SelectedIndexCollectionTest_RemoveTest ()
+               {
+                       ListView listview = new ListView ();
+                       listview.Items.Add ("A");
+
+                       listview.SelectedIndices.Add (0);
+                       listview.SelectedIndices.Remove (0);
+                       Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_RemoveTest#1");
+                       Assert.AreEqual (false, listview.Items [0].Selected, "SelectedIndexCollectionTest_RemoveTest#2");
+
+                       // Force to create the handle
+                       listview.CreateControl ();
+
+                       listview.SelectedIndices.Add (0);
+                       listview.SelectedIndices.Remove (0);
+                       Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_RemoveTest#3");
+                       Assert.AreEqual (false, listview.Items [0].Selected, "SelectedIndexCollectionTest_RemoveTest#4");
+               }
+#endif
 
                // Exceptions
+#if !NET_2_0
                [Test, ExpectedException (typeof (NotSupportedException))]
                public void SelectedIndexCollectionTest_Add_ExceptionTest ()
                {
@@ -194,6 +393,7 @@ namespace MonoTests.System.Windows.Forms
                        ListView listview = new ListView ();
                        ((IList)listview.SelectedIndices).Remove (5);
                }
+#endif
 
                [Test, ExpectedException (typeof (NotSupportedException))]
                public void SelectedIndexCollectionTest_RemoveAt_ExceptionTest ()
@@ -202,6 +402,42 @@ namespace MonoTests.System.Windows.Forms
                        ((IList)listview.SelectedIndices).RemoveAt (5);
                }
 
+#if NET_2_0
+               [Test]
+               public void SelectedIndexCollectionTest_Remove_ExceptionTest ()
+               {
+                       ListView listview = new ListView ();
+                       try {
+                               listview.SelectedIndices.Remove (-1);
+                               Assert.Fail ("SelectedIndexCollectionTest_Remove_ExceptionTest#1");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               listview.SelectedIndices.Remove (listview.Items.Count);
+                               Assert.Fail ("SelectedIndexCollectionTest_Remove_ExceptionTest#2");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+               }
+
+               [Test]
+               public void SelectedIndexCollectionTest_Add_ExceptionTest ()
+               {
+                       ListView listview = new ListView ();
+                       try {
+                               listview.SelectedIndices.Add (-1);
+                               Assert.Fail ("SelectedIndexCollectionTest_Add_ExceptionTest#1");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               listview.SelectedIndices.Add (listview.Items.Count);
+                               Assert.Fail ("SelectedIndexCollectionTest_Add_ExceptionTest#2");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+               }
+#endif
+
                /*
                        SelectedItemCollection
                */
@@ -245,6 +481,7 @@ namespace MonoTests.System.Windows.Forms
                public void SelectedItemCollectionTest_Clear ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        ListViewItem item = lvw.Items.Add ("Title");
@@ -268,12 +505,14 @@ namespace MonoTests.System.Windows.Forms
                        Assert.IsFalse (item.Selected, "#C1");
                        Assert.AreEqual (0, lvw.SelectedItems.Count, "#C2");
                        Assert.IsFalse (lvw.SelectedItems.Contains (item), "#C3");
+                       form.Dispose ();
                }
 
                [Test]
                public void SelectedItemCollectionTest_Contains ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        ListViewItem item = lvw.Items.Add ("Title");
@@ -291,12 +530,14 @@ namespace MonoTests.System.Windows.Forms
                        Assert.IsFalse (lvw.SelectedItems.Contains (new ListViewItem ()), "#B2");
                        Assert.IsTrue (list.Contains (item), "#B3");
                        Assert.IsFalse (list.Contains (new ListViewItem ()), "#B4");
+                       form.Dispose ();
                }
 
                [Test]
                public void SelectedItemCollectionTest_CopyTo ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        ListViewItem item = lvw.Items.Add ("Title");
@@ -318,12 +559,14 @@ namespace MonoTests.System.Windows.Forms
                                Assert.Fail ("#B2");
                        } catch (ArgumentException) {
                        }
+                       form.Dispose ();
                }
 
                [Test]
                public void SelectedItemCollectionTest_Count ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        ListViewItem item = lvw.Items.Add ("Title");
@@ -332,12 +575,14 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreEqual (0, lvw.SelectedItems.Count, "#1");
                        form.Show ();
                        Assert.AreEqual (1, lvw.SelectedItems.Count, "#2");
+                       form.Dispose ();
                }
 
                [Test]
                public void SelectedItemCollectionTest_GetEnumerator ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        ListViewItem item = lvw.Items.Add ("Title");
@@ -348,12 +593,15 @@ namespace MonoTests.System.Windows.Forms
                        form.Show ();
 
                        Assert.IsTrue (lvw.SelectedItems.GetEnumerator ().MoveNext (), "#B1");
+
+                       form.Dispose ();
                }
 
                [Test]
                public void SelectedItemCollectionTest_Indexer ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        ListViewItem item = lvw.Items.Add ("Title");
@@ -362,13 +610,13 @@ namespace MonoTests.System.Windows.Forms
 
                        try  {
                                ListViewItem x = lvw.SelectedItems [0];
-                               Assert.Fail ("#A1" + x.ToString ());
+                               Assert.Fail ("#A1" + x.ToString ());
                        } catch (ArgumentOutOfRangeException) {
                        }
 
                        try {
                                ListViewItem x = list [0] as ListViewItem;
-                               Assert.Fail ("#A2" + x.ToString ());
+                               Assert.Fail ("#A2" + x.ToString ());
                        } catch (ArgumentOutOfRangeException) {
                        }
 
@@ -376,12 +624,15 @@ namespace MonoTests.System.Windows.Forms
 
                        Assert.AreSame (item, lvw.SelectedItems [0], "#B1");
                        Assert.AreSame (item, list [0], "#B2");
+
+                       form.Dispose ();
                }
 
                [Test]
                public void SelectedItemCollectionTest_IndexOf ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        ListViewItem item = lvw.Items.Add ("Title");
@@ -399,6 +650,137 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreEqual (-1, lvw.SelectedItems.IndexOf (new ListViewItem ()), "#B2");
                        Assert.AreEqual (0, list.IndexOf (item), "#B3");
                        Assert.AreEqual (-1, list.IndexOf (new ListViewItem ()), "#B4");
+
+                       form.Dispose ();
+               }
+
+#if NET_2_0
+               [Test]
+               public void SelectedItemCollectionTest_IndexOfKey ()
+               {
+                       ListView lvw = new ListView ();
+                       ListViewItem lvi1 = new ListViewItem ("A");
+                       lvi1.Name = "A name";
+                       lvi1.Selected = true;
+                       ListViewItem lvi2 = new ListViewItem ("B");
+                       lvi2.Name = "Same name";
+                       lvi2.Selected = false;
+                       ListViewItem lvi3 = new ListViewItem ("C");
+                       lvi3.Name = "Same name";
+                       lvi3.Selected = true;
+                       ListViewItem lvi4 = new ListViewItem ("D");
+                       lvi4.Name = String.Empty;
+                       lvi4.Selected = true;
+                       ListViewItem lvi5 = new ListViewItem ("E");
+                       lvi5.Name = "E name";
+                       lvi5.Selected = false;
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
+
+                       // Force to create the control
+                       lvw.CreateControl ();
+
+                       Assert.AreEqual (3, lvw.SelectedItems.Count, "#A1");
+                       Assert.AreEqual (-1, lvw.SelectedItems.IndexOfKey (String.Empty), "#A2");
+                       Assert.AreEqual (-1, lvw.SelectedItems.IndexOfKey (null), "#A3");
+                       Assert.AreEqual (0, lvw.SelectedItems.IndexOfKey ("A name"), "#A4");
+                       Assert.AreEqual (0, lvw.SelectedItems.IndexOfKey ("a NAME"), "#A5");
+                       Assert.AreEqual (1, lvw.SelectedItems.IndexOfKey ("Same name"), "#A6");
+                       Assert.AreEqual (-1, lvw.SelectedItems.IndexOfKey ("E name"), "#A7");
+
+                       ListViewItem lvi6 = new ListViewItem ("F");
+                       lvw.Items.Add (lvi6);
+                       lvi6.Selected = true;
+                       lvi6.Name = "F name";
+
+                       Assert.AreEqual (4, lvw.SelectedItems.Count, "#B1");
+                       Assert.AreEqual (3, lvw.SelectedItems.IndexOfKey ("F name"), "#B2");
+               }
+
+               [Test]
+               public void SelectedItemCollectionTest_Indexer2 ()
+               {
+                       ListView lvw = new ListView ();
+                       ListViewItem lvi1 = new ListViewItem ("A");
+                       lvi1.Name = "A name";
+                       lvi1.Selected = true;
+                       ListViewItem lvi2 = new ListViewItem ("B");
+                       lvi2.Name = "Same name";
+                       lvi2.Selected = false;
+                       ListViewItem lvi3 = new ListViewItem ("C");
+                       lvi3.Name = "Same name";
+                       lvi3.Selected = true;
+                       ListViewItem lvi4 = new ListViewItem ("D");
+                       lvi4.Name = String.Empty;
+                       lvi4.Selected = true;
+                       ListViewItem lvi5 = new ListViewItem ("E");
+                       lvi5.Name = "E name";
+                       lvi5.Selected = false;
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
+
+                       // Force to create the control
+                       lvw.CreateControl ();
+
+                       Assert.AreEqual (3, lvw.SelectedItems.Count, "#A1");
+                       Assert.AreEqual (null, lvw.SelectedItems [String.Empty], "#A2");
+                       Assert.AreEqual (null, lvw.SelectedItems [null], "#A3");
+                       Assert.AreEqual (lvi1, lvw.SelectedItems ["A name"], "#A4");
+                       Assert.AreEqual (lvi1, lvw.SelectedItems ["a NAME"], "#A5");
+                       Assert.AreEqual (lvi3, lvw.SelectedItems ["Same name"], "#A6");
+                       Assert.AreEqual (null, lvw.SelectedItems ["E name"], "#A7");
+
+                       ListViewItem lvi6 = new ListViewItem ("F");
+                       lvw.Items.Add (lvi6);
+                       lvi6.Selected = true;
+                       lvi6.Name = "F name";
+
+                       Assert.AreEqual (4, lvw.SelectedItems.Count, "#B1");
+                       Assert.AreEqual (lvi6, lvw.SelectedItems ["F name"], "#B2");
+               }
+#endif
+
+               [Test]
+               public void SelectedItemCollectionTest_Order ()
+               {
+                       Form form = new Form ();
+                       form.ShowInTaskbar = false;
+                       ListView lvw = new ListView ();
+                       lvw.MultiSelect = true;
+                       form.Controls.Add (lvw);
+                       ListViewItem itemA = lvw.Items.Add ("A");
+                       itemA.Selected = true;
+                       ListViewItem itemB = lvw.Items.Add ("B");
+                       itemB.Selected = true;
+                       ListViewItem itemC = lvw.Items.Add ("C");
+                       itemC.Selected = true;
+
+                       form.Show ();
+
+                       Assert.AreEqual (3, lvw.SelectedItems.Count, "#A1");
+                       Assert.AreSame (itemA, lvw.SelectedItems [0], "#A2");
+                       Assert.AreSame (itemB, lvw.SelectedItems [1], "#A3");
+                       Assert.AreSame (itemC, lvw.SelectedItems [2], "#A3");
+
+                       itemB.Selected = false;
+
+                       Assert.AreEqual (2, lvw.SelectedItems.Count, "#B1");
+                       Assert.AreSame (itemA, lvw.SelectedItems [0], "#B2");
+                       Assert.AreSame (itemC, lvw.SelectedItems [1], "#B3");
+
+                       itemB.Selected = true;
+
+                       Assert.AreEqual (3, lvw.SelectedItems.Count, "#C1");
+                       Assert.AreSame (itemA, lvw.SelectedItems [0], "#C2");
+                       Assert.AreSame (itemB, lvw.SelectedItems [1], "#C3");
+                       Assert.AreSame (itemC, lvw.SelectedItems [2], "#C4");
+
+                       lvw.Sorting = SortOrder.Descending;
+
+                       Assert.AreEqual (3, lvw.SelectedItems.Count, "#D1");
+                       Assert.AreSame (itemC, lvw.SelectedItems [0], "#D2");
+                       Assert.AreSame (itemB, lvw.SelectedItems [1], "#D3");
+                       Assert.AreSame (itemA, lvw.SelectedItems [2], "#D4");
+
+                       form.Dispose ();
                }
 
                /*
@@ -444,6 +826,168 @@ namespace MonoTests.System.Windows.Forms
                        lvw.Items.Add (itemA);
                }
 
+               [Test]
+               [ExpectedException (typeof (ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
+               public void ListViewItemCollectionTest_Add_OwnedItem ()
+               {
+                       ListView lv1 = new ListView ();
+                       ListView lv2 = new ListView ();
+                       ListViewItem item = lv1.Items.Add ("A");
+                       lv2.Items.Add (item);
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_Add_Junk ()
+               {
+                       ListView lv1 = new ListView ();
+
+                       ListViewItem item4 = lv1.Items.Add("Item4", 4);
+                       Assert.AreEqual(item4, lv1.Items[0], "#D1");
+#if NET_2_0
+                       Assert.AreEqual(string.Empty, lv1.Items[0].Name, "#D2");
+#endif
+                       Assert.AreEqual("Item4", lv1.Items[0].Text, "#D3");
+                       Assert.AreEqual(4, lv1.Items[0].ImageIndex, "#D4");
+
+                       string text = null;
+                       ListViewItem item5 = lv1.Items.Add(text);
+                       Assert.AreEqual(item5, lv1.Items[1], "#E1");
+#if NET_2_0
+                       Assert.AreEqual(string.Empty, lv1.Items[1].Name, "#E2");
+#endif
+                       Assert.AreEqual(string.Empty, lv1.Items[1].Text, "#E3");
+
+                       ListViewItem item6 = lv1.Items.Add(null, 5);
+                       Assert.AreEqual(item6, lv1.Items[2], "#F1");
+#if NET_2_0
+                       Assert.AreEqual(string.Empty, lv1.Items[2].Name, "#F2");
+#endif
+                       Assert.AreEqual(string.Empty, lv1.Items[2].Text, "#F3");
+                       Assert.AreEqual(5, lv1.Items[2].ImageIndex, "#F4");
+#if NET_2_0
+                       ListViewItem item1 = lv1.Items.Add("ItemKey1", "Item1", 1);
+                       Assert.AreEqual(item1, lv1.Items[3], "#A1");
+                       Assert.AreEqual("ItemKey1", lv1.Items[3].Name, "#A2");
+                       Assert.AreEqual("Item1", lv1.Items[3].Text, "#A3");
+                       Assert.AreEqual(1, lv1.Items[3].ImageIndex, "#A4");
+
+                       ListViewItem item2 = lv1.Items.Add("ItemKey2", "Item2", "Image2");
+                       Assert.AreEqual(item2, lv1.Items[4], "#B1");
+                       Assert.AreEqual("ItemKey2", lv1.Items[4].Name, "#B2");
+                       Assert.AreEqual("Item2", lv1.Items[4].Text, "#B3");
+                       Assert.AreEqual("Image2", lv1.Items[4].ImageKey, "#B4");
+
+                       ListViewItem item3 = lv1.Items.Add("Item3", "Image3");
+                       Assert.AreEqual(item3, lv1.Items[5], "#C1");
+                       Assert.AreEqual(string.Empty, lv1.Items[5].Name, "#C2");
+                       Assert.AreEqual("Item3", lv1.Items[5].Text, "#C3");
+                       Assert.AreEqual("Image3", lv1.Items[5].ImageKey, "#C4");
+
+                       ListViewItem item7 = lv1.Items.Add(null, "Item6", 6);
+                       Assert.AreEqual(item7, lv1.Items[6], "#G1");
+                       Assert.AreEqual(string.Empty, lv1.Items[6].Name, "#G2");
+                       Assert.AreEqual("Item6", lv1.Items[6].Text, "#G3");
+                       Assert.AreEqual(6, lv1.Items[6].ImageIndex, "#G4");
+
+                       ListViewItem item8 = lv1.Items.Add("ItemKey7", null, 7);
+                       Assert.AreEqual(item8, lv1.Items[7], "#H1");
+                       Assert.AreEqual("ItemKey7", lv1.Items[7].Name, "#H2");
+                       Assert.AreEqual(string.Empty, lv1.Items[7].Text, "#H3");
+                       Assert.AreEqual(7, lv1.Items[7].ImageIndex, "#H4");
+
+                       ListViewItem item9 = lv1.Items.Add("ItemKey8", "Item8", null);
+                       Assert.AreEqual(item9, lv1.Items[8], "#I1");
+                       Assert.AreEqual("ItemKey8", lv1.Items[8].Name, "#I2");
+                       Assert.AreEqual("Item8", lv1.Items[8].Text, "#I3");
+                       Assert.AreEqual(string.Empty, lv1.Items[8].ImageKey, "#I4");
+#endif
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_AddRange ()
+               {
+                       ListView lv1 = new ListView ();
+                       ListViewItem item1 = new ListViewItem ("Item1");
+                       ListViewItem item2 = new ListViewItem ("Item2");
+                       ListViewItem item3 = new ListViewItem ("Item3");
+                       lv1.Items.AddRange (new ListViewItem[] { item1, item2, item3 });
+
+                       Assert.AreSame (item1, lv1.Items[0], "#A1");
+                       Assert.AreEqual (0, item1.Index, "#A2");
+                       Assert.AreSame (lv1, item1.ListView, "#A3");
+
+                       Assert.AreSame (item2, lv1.Items[1], "#B1");
+                       Assert.AreEqual (1, item2.Index, "#B2");
+                       Assert.AreSame (lv1, item2.ListView, "#B3");
+
+                       Assert.AreSame (item3, lv1.Items[2], "#C1");
+                       Assert.AreEqual (2, item3.Index, "#C2");
+                       Assert.AreSame (lv1, item3.ListView, "#C3");
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_AddRange_Count ()
+               {
+                       ListView lv1 = new ListView ();
+                       ListViewItem item1 = new ListViewItem ("Item1");
+                       ListViewItem item2 = new ListViewItem ("Item2");
+                       ListViewItem item3 = new ListViewItem ("Item3");
+
+                       lv1.Items.Add ("Item4");
+                       Assert.AreEqual (1, lv1.Items.Count, "#A1");
+                       lv1.Items.AddRange (new ListViewItem[] { item1, item2, item3 });
+                       Assert.AreEqual (4, lv1.Items.Count, "#A1");
+               }
+
+               [Test]
+               [ExpectedException(typeof(ArgumentNullException))]
+               public void ListViewItemCollectionTest_AddRange_NullException ()
+               {
+                       ListView lv1 = new ListView ();
+                       ListViewItem[] value = null;
+                       lv1.Items.AddRange (value);
+               }
+
+               [Test]
+               [ExpectedException(typeof(ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
+               public void ListViewItemCollectionTest_AddRange_OwnedItem ()
+               {
+                       //MSDN told us, we can use this method to reuse items from a different ListView control. That is not true.
+                       ListView lv1 = new ListView ();
+                       ListView lv2 = new ListView ();
+                       ListViewItem a = lv1.Items.Add ("Item1");
+                       ListViewItem b = lv1.Items.Add ("Item2");
+
+                       lv2.Items.AddRange (new ListViewItem[] { a, b });
+               }
+
+               [Test]
+               [ExpectedException(typeof(ArgumentException))] // An item cannot be added more than once. To add an item again, you need to clone it
+               public void ListViewItemCollectionTest_AddRange_ExistingItem ()
+               {
+                       ListView lv1 = new ListView ();
+                       ListViewItem item1 = lv1.Items.Add ("Item1");
+                       lv1.Items.Add (item1);
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_Clear ()
+               {
+                       ListView lvw = new ListView ();
+                       ListViewItem itemA = lvw.Items.Add ("A");
+                       ListViewItem itemB = lvw.Items.Add ("B");
+
+                       Assert.AreEqual (2, lvw.Items.Count, "#A1");
+                       Assert.AreSame (lvw, itemA.ListView, "#A2");
+                       Assert.AreSame (lvw, itemB.ListView, "#A3");
+
+                       lvw.Items.Clear ();
+
+                       Assert.AreEqual (0, lvw.Items.Count, "#B1");
+                       Assert.IsNull (itemA.ListView, "#B2");
+                       Assert.IsNull (itemB.ListView, "#B3");
+               }
+
                [Test]
                public void ListViewItemCollectionTest_Insert ()
                {
@@ -501,10 +1045,33 @@ namespace MonoTests.System.Windows.Forms
                        lvw.Items.Insert (0, itemA);
                }
 
+               [Test]
+               [ExpectedException (typeof (ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
+               public void ListViewItemCollectionTest_Insert_OwnedItem ()
+               {
+                       ListView lv1 = new ListView ();
+                       ListView lv2 = new ListView ();
+                       ListViewItem item = lv1.Items.Add ("A");
+                       lv2.Items.Insert (0, item);
+               }
+
+               [Test]
+               [ExpectedException(typeof(ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
+               public void ListViewItemCollectionTest_Indexer_OwnedItem ()
+               {
+                       ListView lv1 = new ListView ();
+                       ListView lv2 = new ListView ();
+                       ListViewItem item = lv1.Items.Add ("A");
+
+                       lv2.Items.Add ("Dummy");
+                       lv2.Items[0] = item;
+               }
+
                [Test]
                public void ListViewItemCollectionTest_Remove ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        lvw.MultiSelect = true;
@@ -554,20 +1121,28 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreEqual (itemD, lvw.SelectedItems [0], "#E3");
                        Assert.AreEqual (1, lvw.CheckedItems.Count, "#E4");
                        Assert.AreEqual (itemD, lvw.CheckedItems [0], "#E5");
+
+                       Assert.IsNull (itemA.ListView, "#F1");
+                       Assert.IsNull (itemB.ListView, "#F2");
+                       Assert.AreSame (lvw, itemD.ListView, "#F3");
+
+                       form.Dispose ();
                }
 
                [Test]
                public void ListViewItemCollectionTest_RemoveAt ()
                {
                        Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lvw = new ListView ();
                        form.Controls.Add (lvw);
                        lvw.MultiSelect = true;
                        lvw.CheckBoxes = true;
-                       lvw.Items.Add ("A");
-                       lvw.Items.Add ("B");
-                       lvw.Items.Add ("C");
-                       lvw.Items.Add ("D");
+
+                       ListViewItem itemA = lvw.Items.Add ("A");
+                       ListViewItem itemB = lvw.Items.Add ("B");
+                       ListViewItem itemC = lvw.Items.Add ("C");
+                       ListViewItem itemD = lvw.Items.Add ("D");
 
                        form.Show ();
 
@@ -608,6 +1183,365 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreEqual ("D", lvw.SelectedItems [0].Text, "#E3");
                        Assert.AreEqual (1, lvw.CheckedItems.Count, "#E4");
                        Assert.AreEqual ("D", lvw.CheckedItems [0].Text, "#E5");
+
+                       Assert.IsNull (itemA.ListView, "#F1");
+                       Assert.IsNull (itemB.ListView, "#F2");
+                       Assert.AreSame (lvw, itemC.ListView, "#F3");
+                       Assert.AreSame (lvw, itemD.ListView, "#F4");
+
+                       form.Dispose ();
                }
+
+#if NET_2_0
+               [Test]
+               public void ListViewItemCollectionTest_RemoveByKey ()
+               {
+                       ListView lvw = new ListView ();
+                       ListViewItem lvi1 = new ListViewItem ("A");
+                       lvi1.Name = "A name";
+                       ListViewItem lvi2 = new ListViewItem ("B");
+                       lvi2.Name = "B name";
+                       ListViewItem lvi3 = new ListViewItem ("C");
+                       lvi3.Name = "Same name";
+                       ListViewItem lvi4 = new ListViewItem ("D");
+                       lvi4.Name = "Same name";
+                       ListViewItem lvi5 = new ListViewItem ("E");
+                       lvi5.Name = String.Empty;
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
+
+                       Assert.AreEqual (5, lvw.Items.Count, "#A1");
+
+                       lvw.Items.RemoveByKey ("B name");
+                       Assert.AreEqual (4, lvw.Items.Count, "#B1");
+                       Assert.AreSame (lvi1, lvw.Items [0], "#B2");
+                       Assert.AreSame (lvi3, lvw.Items [1], "#B3");
+                       Assert.AreSame (lvi4, lvw.Items [2], "#B4");
+                       Assert.AreSame (lvi5, lvw.Items [3], "#B5");
+
+                       lvw.Items.RemoveByKey ("Same name");
+                       Assert.AreEqual (3, lvw.Items.Count, "#C1");
+                       Assert.AreSame (lvi1, lvw.Items [0], "#C2");
+                       Assert.AreSame (lvi4, lvw.Items [1], "#C3");
+                       Assert.AreSame (lvi5, lvw.Items [2], "#C4");
+
+                       lvw.Items.RemoveByKey ("a NAME");
+                       Assert.AreEqual (2, lvw.Items.Count, "#D1");
+                       Assert.AreSame (lvi4, lvw.Items [0], "#D2");
+                       Assert.AreSame (lvi5, lvw.Items [1], "#D3");
+
+                       lvw.Items.RemoveByKey (String.Empty);
+                       Assert.AreEqual (2, lvw.Items.Count, "#E1");
+                       Assert.AreSame (lvi4, lvw.Items [0], "#E2");
+                       Assert.AreSame (lvi5, lvw.Items [1], "#E3");
+
+                       Assert.IsNull (lvi1.ListView, "#F1");
+                       Assert.IsNull (lvi2.ListView, "#F2");
+                       Assert.IsNull (lvi3.ListView, "#F3");
+                       Assert.AreSame (lvw, lvi4.ListView, "#F4");
+                       Assert.AreSame (lvw, lvi5.ListView, "#F5");
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_IndexOfKey ()
+               {
+                       ListView lvw = new ListView ();
+                       ListViewItem lvi1 = new ListViewItem ("A");
+                       lvi1.Name = "A name";
+                       ListViewItem lvi2 = new ListViewItem ("B");
+                       lvi2.Name = "Same name";
+                       ListViewItem lvi3 = new ListViewItem ("C");
+                       lvi3.Name = "Same name";
+                       ListViewItem lvi4 = new ListViewItem ("D");
+                       lvi4.Name = String.Empty;
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4 });
+
+                       Assert.AreEqual (4, lvw.Items.Count, "#A1");
+                       Assert.AreEqual (-1, lvw.Items.IndexOfKey (String.Empty), "#A2");
+                       Assert.AreEqual (-1, lvw.Items.IndexOfKey (null), "#A3");
+                       Assert.AreEqual (0, lvw.Items.IndexOfKey ("A name"), "#A4");
+                       Assert.AreEqual (0, lvw.Items.IndexOfKey ("a NAME"), "#A5");
+                       Assert.AreEqual (1, lvw.Items.IndexOfKey ("Same name"), "#A6");
+
+                       ListViewItem lvi5 = new ListViewItem ("E");
+                       lvw.Items.Add (lvi5);
+                       lvi5.Name = "E name";
+
+                       Assert.AreEqual (4, lvw.Items.IndexOfKey ("E name"), "#B1");
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_Indexer ()
+               {
+                       ListView lvw = new ListView ();
+                       ListViewItem lvi1 = new ListViewItem ("A");
+                       lvi1.Name = "A name";
+                       ListViewItem lvi2 = new ListViewItem ("B");
+                       lvi2.Name = "Same name";
+                       ListViewItem lvi3 = new ListViewItem ("C");
+                       lvi3.Name = "Same name";
+                       ListViewItem lvi4 = new ListViewItem ("D");
+                       lvi4.Name = String.Empty;
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4 });
+
+                       Assert.AreEqual (4, lvw.Items.Count, "#A1");
+                       Assert.AreEqual (null, lvw.Items [String.Empty], "#A2");
+                       Assert.AreEqual (null, lvw.Items [null], "#A3");
+                       Assert.AreSame (lvi1, lvw.Items ["A name"], "#A4");
+                       Assert.AreSame (lvi1, lvw.Items ["a NAME"], "#A5");
+                       Assert.AreSame (lvi2, lvw.Items ["Same name"], "#A6");
+
+                       ListViewItem lvi5 = new ListViewItem ("E");
+                       lvw.Items.Add (lvi5);
+                       lvi5.Name = "E name";
+
+                       Assert.AreSame (lvi5, lvw.Items ["E name"], "#B1");
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_ContainsKey ()
+               {
+                       ListView lvw = new ListView();
+                       ListViewItem lvi1 = new ListViewItem("A");
+                       lvi1.Name = "A name";
+                       ListViewItem lvi2 = new ListViewItem("B");
+                       lvi2.Name = "B name";
+                       ListViewItem lvi3 = new ListViewItem("D");
+                       lvi3.Name = String.Empty;
+                       lvw.Items.AddRange(new ListViewItem[] { lvi1, lvi2, lvi3 });
+
+                       Assert.AreEqual(3, lvw.Items.Count, "#A1");
+                       Assert.AreEqual(false, lvw.Items.ContainsKey (String.Empty), "#A2");
+                       Assert.AreEqual(false, lvw.Items.ContainsKey (null), "#A3");
+                       Assert.AreEqual(true, lvw.Items.ContainsKey ("A name"), "#A4");
+                       Assert.AreEqual(true, lvw.Items.ContainsKey ("a NAME"), "#A5");
+                       Assert.AreEqual(true, lvw.Items.ContainsKey ("B name"), "#A6");
+
+                       ListViewItem lvi5 = new ListViewItem("E");
+                       lvw.Items.Add(lvi5);
+                       lvi5.Name = "E name";
+
+                       Assert.AreEqual(true, lvw.Items.ContainsKey ("E name"), "#B1");
+               }
+
+               [Test]
+               public void ListViewItemCollectionTest_Find ()
+               {
+                       ListView lvw = new ListView ();
+                       ListViewItem lvi1 = new ListViewItem ("A");
+                       lvi1.Name = "A name";
+                       ListViewItem lvi2 = new ListViewItem ("B");
+                       lvi2.Name = "a NAME";
+                       ListViewItem lvi3 = new ListViewItem ("C");
+                       lvi3.Name = "a NAME";
+                       ListViewItem lvi4 = new ListViewItem ("D");
+                       lvi4.Name = String.Empty;
+                       ListViewItem lvi5 = new ListViewItem ("F");
+                       lvi5.Name = String.Empty;
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
+
+                       Assert.AreEqual (5, lvw.Items.Count, "#A1");
+
+                       ListViewItem [] items = lvw.Items.Find ("A name", false);
+                       Assert.AreEqual (3, items.Length, "#B11");
+                       Assert.AreSame (lvi1, items [0], "#B2");
+                       Assert.AreSame (lvi2, items [1], "#B3");
+                       Assert.AreSame (lvi3, items [2], "#B4");
+
+                       items = lvw.Items.Find (String.Empty, false);
+                       Assert.AreEqual (2, items.Length, "#B1");
+                       Assert.AreSame (lvi4, items [0], "#B2");
+                       Assert.AreSame (lvi5, items [1], "#B3");
+
+                       Assert.AreEqual (0, lvw.Items.Find (null, false).Length, "#C1");
+               }
+
+               [Test]
+               public void ListViewSubItemCollectionTest_ContainsKey ()
+               {
+                       ListViewItem lvi = new ListViewItem ("A");
+                       ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
+                       si1.Name = "A name";
+                       ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
+                       si2.Name = "B name";
+                       ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
+                       si3.Name = String.Empty;
+                       lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3 });
+
+                       Assert.AreEqual (4, lvi.SubItems.Count, "#A1");
+                       Assert.AreEqual (false, lvi.SubItems.ContainsKey (String.Empty), "#A2");
+                       Assert.AreEqual (false, lvi.SubItems.ContainsKey (null), "#A3");
+                       Assert.AreEqual (true, lvi.SubItems.ContainsKey ("A name"), "#A4");
+                       Assert.AreEqual (true, lvi.SubItems.ContainsKey ("a NAME"), "#A5");
+                       Assert.AreEqual (true, lvi.SubItems.ContainsKey ("B name"), "#A6");
+
+                       ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
+                       lvi.SubItems.Add (si5);
+                       si5.Name = "E name";
+
+                       Assert.AreEqual (true, lvi.SubItems.ContainsKey ("E name"), "#B1");
+               }
+
+               [Test]
+               public void ListViewSubItemCollectionTest_IndexOfKey ()
+               {
+                       ListViewItem lvi = new ListViewItem ();
+                       ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
+                       si1.Name = "A name";
+                       ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
+                       si2.Name = "Same name";
+                       ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
+                       si3.Name = "Same name";
+                       ListViewItem.ListViewSubItem si4 = new ListViewItem.ListViewSubItem ();
+                       si4.Name = String.Empty;
+                       lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3, si4 });
+
+                       Assert.AreEqual (5, lvi.SubItems.Count, "#A1");
+                       Assert.AreEqual (-1, lvi.SubItems.IndexOfKey (String.Empty), "#A2");
+                       Assert.AreEqual (-1, lvi.SubItems.IndexOfKey (null), "#A3");
+                       Assert.AreEqual (1, lvi.SubItems.IndexOfKey ("A name"), "#A4");
+                       Assert.AreEqual (1, lvi.SubItems.IndexOfKey ("a NAME"), "#A5");
+                       Assert.AreEqual (2, lvi.SubItems.IndexOfKey ("Same name"), "#A6");
+
+                       ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
+                       lvi.SubItems.Add (si5);
+                       si5.Name = "E name";
+
+                       Assert.AreEqual (5, lvi.SubItems.IndexOfKey ("E name"), "#B1");
+               }
+
+               [Test]
+               public void ListViewSubItemCollectionTest_RemoveByKey ()
+               {
+                       ListViewItem lvi = new ListViewItem ();
+                       ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
+                       si1.Name = "A name";
+                       ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
+                       si2.Name = "B name";
+                       ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
+                       si3.Name = "Same name";
+                       ListViewItem.ListViewSubItem si4 = new ListViewItem.ListViewSubItem ();
+                       si4.Name = "Same name";
+                       ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
+                       si5.Name = String.Empty;
+                       lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3, si4, si5 });
+
+                       Assert.AreEqual (6, lvi.SubItems.Count, "#A1");
+
+                       lvi.SubItems.RemoveByKey ("B name");
+                       Assert.AreEqual (5, lvi.SubItems.Count, "#B1");
+                       Assert.AreSame (si1, lvi.SubItems [1], "#B2");
+                       Assert.AreSame (si3, lvi.SubItems [2], "#B3");
+                       Assert.AreSame (si4, lvi.SubItems [3], "#B4");
+                       Assert.AreSame (si5, lvi.SubItems [4], "#B5");
+
+                       lvi.SubItems.RemoveByKey ("Same name");
+                       Assert.AreEqual (4, lvi.SubItems.Count, "#C1");
+                       Assert.AreSame (si1, lvi.SubItems [1], "#C2");
+                       Assert.AreSame (si4, lvi.SubItems [2], "#C3");
+                       Assert.AreSame (si5, lvi.SubItems [3], "#C4");
+
+                       lvi.SubItems.RemoveByKey ("a NAME");
+                       Assert.AreEqual (3, lvi.SubItems.Count, "#D1");
+                       Assert.AreSame (si4, lvi.SubItems [1], "#D2");
+                       Assert.AreSame (si5, lvi.SubItems [2], "#D3");
+
+                       lvi.SubItems.RemoveByKey (String.Empty);
+                       Assert.AreEqual (3, lvi.SubItems.Count, "#E1");
+                       Assert.AreSame (si4, lvi.SubItems [1], "#E2");
+                       Assert.AreSame (si5, lvi.SubItems [2], "#E3");
+               }
+
+               [Test]
+               public void ListViewSubItemCollectionTest_Indexer ()
+               {
+                       ListViewItem lvi = new ListViewItem ();
+                       ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
+                       si1.Name = "A name";
+                       ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
+                       si2.Name = "Same name";
+                       ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
+                       si3.Name = "Same name";
+                       ListViewItem.ListViewSubItem si4 = new ListViewItem.ListViewSubItem ();
+                       si4.Name = String.Empty;
+                       lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3, si4 });
+
+                       Assert.AreEqual (5, lvi.SubItems.Count, "#A1");
+                       Assert.AreEqual (null, lvi.SubItems [String.Empty], "#A2");
+                       Assert.AreEqual (null, lvi.SubItems [null], "#A3");
+                       Assert.AreEqual (si1, lvi.SubItems ["A name"], "#A4");
+                       Assert.AreEqual (si1, lvi.SubItems ["a NAME"], "#A5");
+                       Assert.AreEqual (si2, lvi.SubItems ["Same name"], "#A6");
+
+                       ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
+                       lvi.SubItems.Add (si5);
+                       si5.Name = "E name";
+
+                       Assert.AreEqual (si5, lvi.SubItems ["E name"], "#B1");
+               }
+
+               static ListViewItem [] items;
+
+               [Test]
+               public void ListViewItemCollectionTest_VirtualMode_Exceptions ()
+               {
+                       ListView lvw = new ListView ();
+                       lvw.VirtualMode = true;
+                       lvw.VirtualListSize = 1;
+                       lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
+
+                       ListViewItem item = new ListViewItem ("Item 1");
+                       item.Name = "A";
+                       items = new ListViewItem [1];
+                       items [0] = item;
+
+                       try {
+                               lvw.Items.Add ("Item 2");
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               lvw.Items.AddRange (new ListViewItem [0]);
+                               Assert.Fail ("#A2");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               lvw.Items.Insert (0, new ListViewItem ("Item 1"));
+                               Assert.Fail ("#A3");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               lvw.Items.Remove (new ListViewItem ("Item 99"));
+                               Assert.Fail ("#A4");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               lvw.Items.RemoveAt (0);
+                               Assert.Fail ("#A5");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               lvw.Items.RemoveByKey ("A");
+                               Assert.Fail ("#A6");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               lvw.Items.GetEnumerator ();
+                               Assert.Fail ("#A7");
+                       } catch (InvalidOperationException) {
+                       }
+               }
+
+               void ListViewRetrieveVirtualItemHandler (object o, RetrieveVirtualItemEventArgs args)
+               {
+                       args.Item = items [args.ItemIndex];
+               }
+#endif
+
        }
 }