* Test/System.Windows.Forms/TestHelper.cs: Inconsistent eol fixes and
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / ListViewTest.cs
index ed8333dbbcfe85e9b44765b49d10cd99dea2c73b..53571cd0f29c9bb08909bbca3cc0f15bd5d8ea7e 100644 (file)
@@ -18,7 +18,7 @@ using NUnit.Framework;
 namespace MonoTests.System.Windows.Forms
 {
        [TestFixture]
-       public class ListViewTest
+       public class ListViewTest : TestHelper
        {
                [Test]
                public void ListViewPropertyTest ()
@@ -57,6 +57,10 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreEqual (View.LargeIcon, mylistview.View, "#29");
                        mylistview.View = View.List;
                        Assert.AreEqual (false, mylistview.TopItem.Checked, "#30");
+#if NET_2_0
+                       Assert.AreEqual (false, mylistview.ShowItemToolTips, "#31");
+                       Assert.AreEqual (false, mylistview.HotTracking, "#31");
+#endif
                }
 
                [Test]
@@ -73,6 +77,7 @@ namespace MonoTests.System.Windows.Forms
                        myform.Dispose ();
                }
 
+               // Hey
                [Test]
                public void BeginEndUpdateTest ()
                {
@@ -141,19 +146,57 @@ namespace MonoTests.System.Windows.Forms
                        myform.ShowInTaskbar = false;
                        myform.Visible = true;
                        ListView mylistview = new ListView ();
-                       mylistview.Items.Add ("A");
-                       mylistview.Columns.Add ("Item Column", -2, HorizontalAlignment.Left);
+                       ListViewItem itemA = mylistview.Items.Add ("A");
+                       ColumnHeader colA = mylistview.Columns.Add ("Item Column", -2, HorizontalAlignment.Left);
+                       Assert.AreSame (mylistview, itemA.ListView, "#1");
+                       Assert.AreSame (mylistview, colA.ListView, "#2");
                        mylistview.Visible = true;
                        myform.Controls.Add (mylistview);
-                       Assert.AreEqual (1, mylistview.Columns.Count, "#31");
-                       Assert.AreEqual (1, mylistview.Items.Count, "#32");
+                       Assert.AreEqual (1, mylistview.Columns.Count, "#3");
+                       Assert.AreEqual (1, mylistview.Items.Count, "#4");
                        mylistview.Clear ();
-                       Assert.AreEqual (0, mylistview.Columns.Count, "#33");
-                       Assert.AreEqual (0, mylistview.Items.Count, "#34");
+                       Assert.AreEqual (0, mylistview.Columns.Count, "#5");
+                       Assert.AreEqual (0, mylistview.Items.Count, "#6");
+                       Assert.IsNull (itemA.ListView, "#7");
+                       Assert.IsNull (colA.ListView, "#8");
                        myform.Dispose ();
                }
 
+               [Test] // bug #80620
+               public void ClientRectangle_Borders ()
+               {
+                       ListView lv = new ListView ();
+                       lv.CreateControl ();
+                       Assert.AreEqual (lv.ClientRectangle, new ListView ().ClientRectangle);
+               }
+
                [Test]
+               public void DisposeTest ()
+               {
+                       ListView lv = new ListView ();
+                       lv.View = View.Details;
+
+                       lv.LargeImageList = new ImageList ();
+                       lv.SmallImageList = new ImageList ();
+
+                       ListViewItem lvi = new ListViewItem ();
+                       lv.Items.Add (lvi);
+
+                       ColumnHeader col = new ColumnHeader ();
+                       lv.Columns.Add (col);
+
+                       lv.Dispose ();
+
+                       Assert.IsNull (lvi.ListView, "#A1");
+                       Assert.IsNull (col.ListView, "#A2");
+
+                       Assert.IsNull (lv.LargeImageList, "#B1");
+                       Assert.IsNull (lv.SmallImageList, "#B2");
+                       Assert.IsNull(lv.StateImageList, "#B3");
+               }
+
+               // Hey
+               //[Test]
                public void EnsureVisibleTest ()
                {
                        Form myform = new Form ();
@@ -285,6 +328,65 @@ namespace MonoTests.System.Windows.Forms
                        form.Dispose ();
                }
 
+#if NET_2_0
+               [Test]
+               public void TopItem ()
+               {
+                       ListView lvw = CreateListView (View.List);
+
+                       lvw.TopItem = null;
+                       Assert.AreEqual (lvw.Items [0], lvw.TopItem, "#A1");
+
+                       lvw.TopItem = new ListViewItem ();
+                       Assert.AreEqual (lvw.Items [0], lvw.TopItem, "#A2");
+               }
+
+               [Test]
+               public void TopItem_Exceptions ()
+               {
+                       ListView lvw = CreateListView (View.LargeIcon);
+                       ListViewItem item = null;
+
+                       try {
+                               lvw.TopItem = lvw.Items [2];
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               item = lvw.TopItem;
+                               Assert.Fail ("#A2");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       lvw.View = View.SmallIcon;
+                       try {
+                               lvw.TopItem = lvw.Items [2];
+                               Assert.Fail ("#A3");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               item = lvw.TopItem;
+                               Assert.Fail ("#A4");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       lvw.View = View.Tile;
+                       try {
+                               lvw.TopItem = lvw.Items [2];
+                               Assert.Fail ("#A5");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       try {
+                               item = lvw.TopItem;
+                               Assert.Fail ("#A6");
+                       } catch (InvalidOperationException) {
+                       }
+               }
+#endif
+
                [Test]
                public void Selected ()
                {
@@ -310,6 +412,345 @@ namespace MonoTests.System.Windows.Forms
                        form.Dispose ();
                }
 
+#if NET_2_0
+               [Test]
+               public void FindItemWithText ()
+               {
+                       ListView lvw = new ListView();
+                       ListViewItem lvi1 = new ListViewItem (String.Empty);
+                       ListViewItem lvi2 = new ListViewItem ("angle bracket");
+                       ListViewItem lvi3 = new ListViewItem ("bracket holder");
+                       ListViewItem lvi4 = new ListViewItem ("bracket");
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4 });
+
+                       Assert.AreEqual (lvi1, lvw.FindItemWithText (String.Empty), "#A1");
+                       Assert.AreEqual (lvi3, lvw.FindItemWithText ("bracket"), "#A2");
+                       Assert.AreEqual (lvi3, lvw.FindItemWithText ("BrackeT"), "#A3");
+                       Assert.IsNull (lvw.FindItemWithText ("holder"), "#A5");
+
+                       Assert.AreEqual (lvw.Items [3], lvw.FindItemWithText ("bracket", true, 3), "#B1");
+
+                       Assert.AreEqual (lvw.Items [2], lvw.FindItemWithText ("bracket", true, 0, true), "#C1");
+                       Assert.AreEqual (lvw.Items [3], lvw.FindItemWithText ("bracket", true, 0, false), "#C2");
+                       Assert.AreEqual(lvw.Items [3], lvw.FindItemWithText("BrackeT", true, 0, false), "#C3");
+                       Assert.IsNull (lvw.FindItemWithText ("brack", true, 0, false), "#C4");
+
+                       // Sub item search tests
+                       lvw.Items.Clear ();
+
+                       lvi1.Text = "A";
+                       lvi1.SubItems.Add ("car bracket");
+                       lvi1.SubItems.Add ("C");
+
+                       lvi2.Text = "B";
+                       lvi2.SubItems.Add ("car");
+
+                       lvi3.Text = "C";
+
+                       lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3 });
+
+                       Assert.AreEqual (lvi1, lvw.FindItemWithText ("car", true, 0), "#D1");
+                       Assert.AreEqual (lvi3, lvw.FindItemWithText ("C", true, 0), "#D2");
+                       Assert.AreEqual (lvi2, lvw.FindItemWithText ("car", true, 1), "#D3");
+                       Assert.IsNull (lvw.FindItemWithText ("car", false, 0), "#D4");
+
+                       Assert.AreEqual (lvi1, lvw.FindItemWithText ("car", true, 0, true), "#E1");
+                       Assert.AreEqual (lvi2, lvw.FindItemWithText ("car", true, 0, false), "#E2");
+                       Assert.AreEqual (lvi2, lvw.FindItemWithText ("CaR", true, 0, false), "#E3");
+               }
+
+               [Test]
+               public void FindItemWithText_Exceptions ()
+               {
+                       ListView lvw = new ListView ();
+
+                       // Shouldn't throw any exception
+                       lvw.FindItemWithText (null);
+
+                       try {
+                               lvw.FindItemWithText (null, false, 0);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               lvw.FindItemWithText (null, false, lvw.Items.Count);
+                               Assert.Fail ("#A2");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       // Add a single item
+                       lvw.Items.Add ("bracket");
+
+                       try {
+                               lvw.FindItemWithText (null);
+                               Assert.Fail ("#A3");
+                       } catch (ArgumentNullException) {
+                       }
+
+                       try {
+                               lvw.FindItemWithText ("bracket", false, -1);
+                               Assert.Fail ("#A4");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               lvw.FindItemWithText ("bracket", false, lvw.Items.Count);
+                               Assert.Fail ("#A5");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+               }
+
+               [Test]
+               public void FindNearestItem_Exceptions ()
+               {
+                       ListView lvw = new ListView ();
+                       lvw.Items.Add ("A");
+                       lvw.Items.Add ("B");
+
+                       lvw.View = View.Details;
+                       try {
+                               lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       lvw.View = View.List;
+                       try {
+                               lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
+                               Assert.Fail ("#A2");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       lvw.View = View.Tile;
+                       try {
+                               lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
+                               Assert.Fail ("#A3");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       lvw.View = View.LargeIcon;
+                       try {
+                               lvw.FindNearestItem ((SearchDirectionHint)666, 0, 0);
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+               }
+
+               [Test]
+               public void FocusedItem ()
+               {
+                       ListView lvw = CreateListView (View.LargeIcon);
+                       Form form = new Form ();
+                       lvw.Parent = form;
+
+                       // FocusedItem setter ignores the value until form is shown
+                       lvw.FocusedItem = lvw.Items [2];
+                       Assert.AreEqual (null, lvw.FocusedItem, "#A1");
+
+                       // It's not enough to create the ListView control
+                       form.Show ();
+
+                       lvw.FocusedItem = lvw.Items [2];
+                       Assert.AreEqual (lvw.Items [2], lvw.FocusedItem, "#A2");
+
+                       lvw.FocusedItem = new ListViewItem ();
+                       Assert.AreEqual (lvw.Items [2], lvw.FocusedItem, "#A3");
+
+                       lvw.FocusedItem = null;
+                       Assert.AreEqual (lvw.Items [2], lvw.FocusedItem, "#A4");
+
+                       form.Dispose ();
+               }
+
+               [Test]
+               public void HotTracking ()
+               {
+                       ListView lvw = new ListView ();
+
+                       lvw.HotTracking = true;
+                       Assert.AreEqual (true, lvw.HotTracking, "#A1");
+                       Assert.AreEqual (true, lvw.HoverSelection, "#A2");
+                       Assert.AreEqual (ItemActivation.OneClick, lvw.Activation, "#A3");
+
+                       // HoverSelection and Activation keep the previous value
+                       lvw.HotTracking = false;
+                       Assert.AreEqual (false, lvw.HotTracking, "#B1");
+                       Assert.AreEqual (true, lvw.HoverSelection, "#B2");
+                       Assert.AreEqual (ItemActivation.OneClick, lvw.Activation, "#B3");
+
+                       lvw.HotTracking = true;
+                       try {
+                               lvw.HoverSelection = false;
+                               Assert.Fail ("#C1");
+                       } catch (ArgumentException) {
+                       }
+
+                       try {
+                               lvw.Activation = ItemActivation.Standard;
+                               Assert.Fail ("#C2");
+                       } catch (ArgumentException) {
+                       }
+               }
+
+               [Test]
+               public void RedrawItems_Exceptions ()
+               {
+                       ListView lvw = new ListView ();
+                       lvw.Items.Add ("A");
+                       lvw.Items.Add ("B");
+
+                       try {
+                               lvw.RedrawItems (-1, 1, true);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               lvw.RedrawItems (0, -1, true);
+                               Assert.Fail ("#A2");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               lvw.RedrawItems (lvw.Items.Count, 1, true);
+                               Assert.Fail ("#A3");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               lvw.RedrawItems (0, lvw.Items.Count, true);
+                               Assert.Fail ("#A4");
+                       } catch (ArgumentOutOfRangeException) {
+                       }
+
+                       try {
+                               lvw.RedrawItems (1, 0, true);
+                               Assert.Fail ("#A5");
+                       } catch (ArgumentException) {
+                       }
+               }
+
+               const int item_count = 3;
+               ListViewItem [] items = new ListViewItem [item_count];
+
+               [Test]
+               public void VirtualMode ()
+               {
+                       ListView lvw = new ListView ();
+                       lvw.VirtualListSize = item_count;
+                       lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
+                       lvw.VirtualMode = true;
+
+                       CreateListViewItems (item_count);
+
+                       Assert.AreEqual (item_count, lvw.Items.Count, "#A1");
+                       Assert.AreEqual (true, lvw.VirtualMode, "#A2");
+
+                       Assert.AreEqual (items [0], lvw.Items [0], "#B1");
+                       Assert.AreEqual (items [1], lvw.Items [1], "#B2");
+                       Assert.AreEqual (items [2], lvw.Items [2], "#B3");
+                       Assert.AreEqual (0, lvw.Items [0].Index, "#B4");
+                       Assert.AreEqual (1, lvw.Items [1].Index, "#B5");
+                       Assert.AreEqual (2, lvw.Items [2].Index, "#B6");
+                       Assert.AreEqual (lvw, lvw.Items [0].ListView, "#B7");
+                       Assert.AreEqual (lvw, lvw.Items [1].ListView, "#B8");
+                       Assert.AreEqual (lvw, lvw.Items [2].ListView, "#B9");
+
+                       // force to re-create the items, because we need a blank state
+                       // for our items
+                       CreateListViewItems (item_count);
+                       items [0].Name = "A";
+                       items [1].Name = "B";
+                       items [2].Name = "C";
+
+                       Assert.AreEqual (items [0], lvw.Items ["A"], "#C1");
+                       Assert.AreEqual (items [1], lvw.Items ["B"], "#C2");
+                       Assert.AreEqual (items [2], lvw.Items ["C"], "#C3");
+                       Assert.AreEqual (0, lvw.Items ["A"].Index, "#C4");
+                       Assert.AreEqual (1, lvw.Items ["B"].Index, "#C5");
+                       Assert.AreEqual (2, lvw.Items ["C"].Index, "#C6");
+                       Assert.AreEqual (lvw, lvw.Items ["A"].ListView, "#C7");
+                       Assert.AreEqual (lvw, lvw.Items ["B"].ListView, "#C8");
+                       Assert.AreEqual (lvw, lvw.Items ["C"].ListView, "#C9");
+                       Assert.IsNull (lvw.Items ["Invalid key"], "#C10");
+                       Assert.IsNull (lvw.Items [String.Empty], "#C11");
+
+                       Assert.AreEqual (false, lvw.Items.ContainsKey (String.Empty), "#D1");
+                       Assert.AreEqual (false, lvw.Items.ContainsKey (null), "#D2");
+                       Assert.AreEqual (true, lvw.Items.ContainsKey ("A"), "#D3");
+                       Assert.AreEqual (true, lvw.Items.ContainsKey ("a"), "#D4");
+                       Assert.AreEqual (true, lvw.Items.ContainsKey ("B"), "#D5");
+               }
+
+               void ListViewRetrieveVirtualItemHandler (object o, RetrieveVirtualItemEventArgs args)
+               {
+                       args.Item = items [args.ItemIndex];
+               }
+
+               void CreateListViewItems(int count)
+               {
+                       items = new ListViewItem [count];
+
+                       for (int i = 0; i < count; i++)
+                               items [i] = new ListViewItem (String.Empty);
+               }
+
+               [Test]
+               public void VirtualMode_Exceptions()
+               {
+                       ListView lvw = new ListView ();
+
+                       lvw.Items.Add ("Simple item");
+                       try {
+                               lvw.VirtualMode = true;
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException) {
+                       }
+
+                       lvw.Items.Clear();
+                       lvw.VirtualMode = true;
+                       lvw.VirtualListSize = 1;
+
+                       lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
+                       CreateListViewItems (1);
+
+                       try {
+                               lvw.Sort ();
+                               Assert.Fail ("#A3");
+                       } catch (InvalidOperationException) {
+                       }
+               }
+
+               [Test]
+               public void VirtualListSize ()
+               {
+                       ListView lvw = new ListView ();
+
+                       lvw.VirtualListSize = item_count;
+                       Assert.AreEqual (item_count, lvw.VirtualListSize, "#A1");
+                       Assert.AreEqual (0, lvw.Items.Count, "#A2");
+
+                       lvw.VirtualMode = true;
+                       Assert.AreEqual (item_count, lvw.VirtualListSize, "#B1");
+                       Assert.AreEqual (item_count, lvw.Items.Count, "#B2");
+
+                       lvw.VirtualMode = false;
+                       Assert.AreEqual (item_count, lvw.VirtualListSize, "#C1");
+                       Assert.AreEqual (0, lvw.Items.Count, "#C2");
+               }
+
+               [Test]
+               public void VirtualListSize_Exceptions ()
+               {
+                       ListView lvw = new ListView ();
+                       try {
+                               lvw.VirtualListSize = -1;
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentException) {
+                       }
+               }
+#endif
+
                [Test]
                public void Sort_Details_Checked ()
                {
@@ -1618,5 +2059,26 @@ namespace MonoTests.System.Windows.Forms
                                        return String.Compare (item_x.Text, item_y.Text);
                        }
                }
+
+               [Test]
+               public void MethodIsInputChar ()
+               {
+                       // Basically, show that this method always returns true
+                       InputCharControl m = new InputCharControl ();
+                       bool result = true;
+
+                       for (int i = 0; i < 256; i++)
+                               result &= m.PublicIsInputChar ((char)i);
+
+                       Assert.AreEqual (true, result, "I1");
+               }
+
+               private class InputCharControl : ListView
+               {
+                       public bool PublicIsInputChar (char charCode)
+                       {
+                               return base.IsInputChar (charCode);
+                       }
+               }
        }
 }