Mark tests as not working under TARGET_JVM
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / ListViewCollectionsTest.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
21 //
22 // Author:
23 //      Jordi Mas i Hernandez <jordi@ximian.com>
24 //
25 //
26
27 using System;
28 using System.Windows.Forms;
29 using System.Drawing;
30 using System.Reflection;
31 using System.Collections;
32 using NUnit.Framework;
33
34 namespace MonoTests.System.Windows.Forms
35 {
36         [TestFixture]
37         public class ListViewCollectionsTest
38         {
39                 /*
40                         ColumnHeaderCollection
41                 */
42                 [Test]
43                 public void ColumnHeaderCollectionTest_PropertiesTest ()
44                 {
45                         ListView listview = new ListView ();
46
47                         // Properties
48                         Assert.AreEqual (false, listview.Columns.IsReadOnly, "ColumnHeaderCollectionTest_PropertiesTest#1");
49                         Assert.AreEqual (true, ((ICollection)listview.Columns).IsSynchronized, "ColumnHeaderCollectionTest_PropertiesTest#2");
50                         Assert.AreEqual (listview.Columns, ((ICollection)listview.Columns).SyncRoot, "ColumnHeaderCollectionTest_PropertiesTest#3");
51                         Assert.AreEqual (false, ((IList)listview.Columns).IsFixedSize, "ColumnHeaderCollectionTest_PropertiesTest#4");
52                         Assert.AreEqual (0, listview.Columns.Count, "ColumnHeaderCollectionTest_PropertiesTest#5");
53                 }
54
55                 [Test]
56                 public void ColumnHeaderCollectionTest_AddTest ()
57                 {
58                         ListView listview = new ListView ();
59                         ColumnHeader colA = new ColumnHeader ();
60                         ColumnHeader colB = new ColumnHeader ();
61
62                         // Duplicated elements with same text added
63                         listview.Columns.Add (colA);
64                         listview.Columns.Add (colB);
65                         Assert.AreEqual (2, listview.Columns.Count, "#1");
66                         Assert.AreEqual ("ColumnHeader", listview.Columns[0].Text, "#2");
67                         Assert.AreSame (listview, colA.ListView, "#3");
68                         Assert.AreSame (listview, colB.ListView, "#4");
69                 }
70
71                 [Test]
72                 public void ColumnHeaderCollectionTest_ClearTest ()
73                 {
74                         ListView listview = new ListView ();
75                         ColumnHeader colA = new ColumnHeader ();
76                         ColumnHeader colB = new ColumnHeader ();
77                         listview.Columns.Add (colA);
78                         listview.Columns.Add (colB);
79                         listview.Columns.Clear ();
80                         Assert.AreEqual (0, listview.Columns.Count, "#1");
81                         Assert.IsNull (colA.ListView, "#2");
82                         Assert.IsNull (colB.ListView, "#3");
83                 }
84
85                 [Test]
86                 public void ColumnHeaderCollectionTest_Remove ()
87                 {
88                         ListView listview = new ListView ();
89                         ColumnHeader colA = new ColumnHeader ();
90                         ColumnHeader colB = new ColumnHeader ();
91                         ColumnHeader colC = new ColumnHeader ();
92                         listview.Columns.Add (colA);
93                         listview.Columns.Add (colB);
94                         listview.Columns.Add (colC);
95
96                         listview.Columns.Remove (colB);
97                         Assert.AreEqual (2, listview.Columns.Count, "#A1");
98                         Assert.AreSame (colA, listview.Columns [0], "#A2");
99                         Assert.AreSame (colC, listview.Columns [1], "#A3");
100                         Assert.AreSame (listview, colA.ListView, "#A4");
101                         Assert.IsNull (colB.ListView, "#A5");
102                         Assert.AreSame (listview, colC.ListView, "#A6");
103                         Assert.AreEqual (0, colA.Index, "#A7");
104                         Assert.AreEqual (-1, colB.Index, "#A8");
105                         Assert.AreEqual (1, colC.Index, "#A9");
106
107                         listview.Columns.Remove (colC);
108                         Assert.AreEqual (1, listview.Columns.Count, "#B1");
109                         Assert.AreSame (colA, listview.Columns [0], "#B2");
110                         Assert.AreSame (listview, colA.ListView, "#B3");
111                         Assert.IsNull (colB.ListView, "#B4");
112                         Assert.IsNull (colC.ListView, "#B5");
113                         Assert.AreEqual (0, colA.Index, "#B6");
114                         Assert.AreEqual (-1, colB.Index, "#B7");
115                         Assert.AreEqual (-1, colC.Index, "#B8");
116
117                         listview.Columns.Remove (colA);
118                         Assert.AreEqual (0, listview.Columns.Count, "#C1");
119                         Assert.IsNull (colA.ListView, "#C2");
120                         Assert.IsNull (colB.ListView, "#C3");
121                         Assert.IsNull (colC.ListView, "#C4");
122                         Assert.AreEqual (-1, colA.Index, "#C5");
123                         Assert.AreEqual (-1, colB.Index, "#C6");
124                         Assert.AreEqual (-1, colC.Index, "#C7");
125                 }
126
127                 [Test]
128                 public void ColumnHeaderCollectionTest_RemoveAt ()
129                 {
130                         ListView listview = new ListView ();
131                         ColumnHeader colA = new ColumnHeader ();
132                         ColumnHeader colB = new ColumnHeader ();
133                         ColumnHeader colC = new ColumnHeader ();
134                         listview.Columns.Add (colA);
135                         listview.Columns.Add (colB);
136                         listview.Columns.Add (colC);
137
138                         listview.Columns.RemoveAt (1);
139                         Assert.AreEqual (2, listview.Columns.Count, "#A1");
140                         Assert.AreSame (colA, listview.Columns [0], "#A2");
141                         Assert.AreSame (colC, listview.Columns [1], "#A3");
142                         Assert.AreSame (listview, colA.ListView, "#A4");
143                         Assert.IsNull (colB.ListView, "#A5");
144                         Assert.AreSame (listview, colC.ListView, "#A6");
145
146                         listview.Columns.RemoveAt (0);
147                         Assert.AreEqual (1, listview.Columns.Count, "#B1");
148                         Assert.AreSame (colC, listview.Columns [0], "#B2");
149                         Assert.IsNull (colA.ListView, "#B3");
150                         Assert.IsNull (colB.ListView, "#B4");
151                         Assert.AreSame (listview, colC.ListView, "#B5");
152
153                         listview.Columns.RemoveAt (0);
154                         Assert.AreEqual (0, listview.Columns.Count, "#C1");
155                         Assert.IsNull (colA.ListView, "#C2");
156                         Assert.IsNull (colB.ListView, "#C3");
157                         Assert.IsNull (colC.ListView, "#C4");
158                 }
159
160                 /*
161                         CheckedIndexCollection
162                 */
163                 [Test]
164                 public void CheckedIndexCollectionTest_PropertiesTest ()
165                 {
166                         ListView listview = new ListView ();
167
168                         // Properties
169                         Assert.AreEqual (true, listview.CheckedIndices.IsReadOnly, "CheckedIndexCollectionTest_PropertiesTest#1");
170                         Assert.AreEqual (false, ((ICollection)listview.CheckedIndices).IsSynchronized, "CheckedIndexCollectionTest_PropertiesTest#2");
171                         Assert.AreEqual (listview.CheckedIndices, ((ICollection)listview.CheckedIndices).SyncRoot, "CheckedIndexCollectionTest_PropertiesTest#3");
172                         Assert.AreEqual (true, ((IList)listview.CheckedIndices).IsFixedSize, "CheckedIndexCollectionTest_PropertiesTest#4");
173                         Assert.AreEqual (0, listview.CheckedIndices.Count, "CheckedIndexCollectionTest_PropertiesTest#5");
174                 }
175
176
177                 // Exceptions
178                 [Test, ExpectedException (typeof (NotSupportedException))]
179                 public void CheckedIndexCollectionTest_Add_ExceptionTest ()
180                 {
181                         ListView listview = new ListView ();
182                         ((IList)listview.CheckedIndices).Add (5);
183                 }
184
185                 [Test, ExpectedException (typeof (NotSupportedException))]
186                 public void CheckedIndexCollectionTest_Remove_ExceptionTest ()
187                 {
188                         ListView listview = new ListView ();
189                         ((IList)listview.CheckedIndices).Remove (5);
190                 }
191
192                 [Test, ExpectedException (typeof (NotSupportedException))]
193                 public void CheckedIndexCollectionTest_RemoveAt_ExceptionTest ()
194                 {
195                         ListView listview = new ListView ();
196                         ((IList)listview.CheckedIndices).RemoveAt (5);
197                 }
198
199                 /*
200                         CheckedItemCollection
201                 */
202                 [Test]
203                 public void CheckedItemCollectionTest_PropertiesTest ()
204                 {
205                         ListView listview = new ListView ();
206
207                         // Properties
208                         Assert.AreEqual (true, listview.CheckedItems.IsReadOnly, "CheckedItemCollectionTest_PropertiesTest#1");
209                         Assert.AreEqual (false, ((ICollection)listview.CheckedItems).IsSynchronized, "CheckedItemCollectionTest_PropertiesTest#2");
210                         Assert.AreEqual (listview.CheckedItems, ((ICollection)listview.CheckedItems).SyncRoot, "CheckedItemCollectionTest_PropertiesTest#3");
211                         Assert.AreEqual (true, ((IList)listview.CheckedItems).IsFixedSize, "CheckedItemCollectionTest_PropertiesTest#4");
212                         Assert.AreEqual (0, listview.CheckedItems.Count, "CheckedItemCollectionTest_PropertiesTest#5");
213                 }
214
215
216                 // Exceptions
217                 [Test, ExpectedException (typeof (NotSupportedException))]
218                 public void CheckedItemCollectionTest_PropertiesTest_Add_ExceptionTest ()
219                 {
220                         ListView listview = new ListView ();
221                         ((IList)listview.CheckedItems).Add (5);
222                 }
223
224                 [Test]
225                 public void CheckedItemCollectionTest_Order ()
226                 {
227                         Form form = new Form ();
228                         form.ShowInTaskbar = false;
229                         ListView lvw = new ListView ();
230                         lvw.CheckBoxes = true;
231                         form.Controls.Add (lvw);
232                         ListViewItem itemA = lvw.Items.Add ("A");
233                         itemA.Checked = true;
234                         ListViewItem itemB = lvw.Items.Add ("B");
235                         itemB.Checked = true;
236                         ListViewItem itemC = lvw.Items.Add ("C");
237                         itemC.Checked = true;
238
239                         Assert.AreEqual (3, lvw.CheckedItems.Count, "#A1");
240                         Assert.AreSame (itemA, lvw.CheckedItems [0], "#A2");
241                         Assert.AreSame (itemB, lvw.CheckedItems [1], "#A3");
242                         Assert.AreSame (itemC, lvw.CheckedItems [2], "#A3");
243
244                         itemB.Checked = false;
245
246                         Assert.AreEqual (2, lvw.CheckedItems.Count, "#B1");
247                         Assert.AreSame (itemA, lvw.CheckedItems [0], "#B2");
248                         Assert.AreSame (itemC, lvw.CheckedItems [1], "#B3");
249
250                         itemB.Checked = true;
251
252                         Assert.AreEqual (3, lvw.CheckedItems.Count, "#C1");
253                         Assert.AreSame (itemA, lvw.CheckedItems [0], "#C2");
254                         Assert.AreSame (itemB, lvw.CheckedItems [1], "#C3");
255                         Assert.AreSame (itemC, lvw.CheckedItems [2], "#C4");
256
257                         lvw.Sorting = SortOrder.Descending;
258
259                         Assert.AreEqual (3, lvw.CheckedItems.Count, "#D1");
260                         Assert.AreSame (itemA, lvw.CheckedItems [0], "#D2");
261                         Assert.AreSame (itemB, lvw.CheckedItems [1], "#D3");
262                         Assert.AreSame (itemC, lvw.CheckedItems [2], "#D4");
263
264                         // sorting only takes effect when listview is created
265                         form.Show ();
266
267                         Assert.AreEqual (3, lvw.CheckedItems.Count, "#E1");
268                         Assert.AreSame (itemC, lvw.CheckedItems [0], "#E2");
269                         Assert.AreSame (itemB, lvw.CheckedItems [1], "#E3");
270                         Assert.AreSame (itemA, lvw.CheckedItems [2], "#E4");
271                         form.Dispose ();
272                 }
273
274                 [Test, ExpectedException (typeof (NotSupportedException))]
275                 public void CheckedItemCollectionTest_PropertiesTest_Remove_ExceptionTest ()
276                 {
277                         ListView listview = new ListView ();
278                         ((IList)listview.CheckedItems).Remove (5);
279                 }
280
281                 [Test, ExpectedException (typeof (NotSupportedException))]
282                 public void CheckedItemCollectionTest_PropertiesTest_RemoveAt_ExceptionTest ()
283                 {
284                         ListView listview = new ListView ();
285                         ((IList)listview.CheckedItems).RemoveAt (5);
286                 }
287
288                 /*
289                         SelectedIndexCollection
290                 */
291                 [Test]
292                 public void SelectedIndexCollectionTest_PropertiesTest ()
293                 {
294                         ListView listview = new ListView ();
295
296                         // Properties
297 #if !NET_2_0
298                         Assert.AreEqual (true, listview.SelectedIndices.IsReadOnly, "SelectedIndexCollectionTest_PropertiesTest#1");
299                         Assert.AreEqual (true, ((IList)listview.SelectedIndices).IsFixedSize, "SelectedIndexCollectionTest_PropertiesTest#4");
300 #else
301                         Assert.AreEqual (false, listview.SelectedIndices.IsReadOnly, "SelectedIndexCollectionTest_PropertiesTest#1");
302                         Assert.AreEqual (false, ((IList)listview.SelectedIndices).IsFixedSize, "SelectedIndexCollectionTest_PropertiesTest#4");
303 #endif
304                         Assert.AreEqual (false, ((ICollection)listview.SelectedIndices).IsSynchronized, "SelectedIndexCollectionTest_PropertiesTest#2");
305                         Assert.AreEqual (listview.SelectedIndices, ((ICollection)listview.SelectedIndices).SyncRoot, "SelectedIndexCollectionTest_PropertiesTest#3");
306                         Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_PropertiesTest#5");
307                 }
308
309 #if NET_2_0
310                 [Test]
311                 public void SelectedIndexCollectionTest_AddTest ()
312                 {
313                         ListView listview = new ListView ();
314                         listview.Items.Add ("A");
315
316                         int n = listview.SelectedIndices.Add (0);
317                         Assert.AreEqual (0, n, "SelectedIndexCollectionTest_AddTest#1");
318                         Assert.AreEqual (true, listview.Items [0].Selected, "SelectedIndexCollectionTest_AddTest#2");
319
320                         // Force to create the handle
321                         listview.CreateControl ();
322                         Assert.AreEqual (1, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_AddTest#4");
323
324                         n = listview.SelectedIndices.Add (0);
325                         Assert.AreEqual (1, n, "SelectedIndexCollectionTest_AddTest#5");
326                         Assert.AreEqual (1, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_AddTest#6");
327                         Assert.AreEqual (true, listview.Items [0].Selected, "SelectedIndexCollectionTest_AddTest#7");
328                 }
329
330                 [Test]
331                 public void SelectedIndexCollectionTest_ClearTest ()
332                 {
333                         ListView listview = new ListView ();
334                         listview.Items.Add ("A");
335                         listview.Items.Add ("B");
336                         listview.Items.Add ("C");
337
338                         listview.SelectedIndices.Add (0);
339                         listview.SelectedIndices.Add (2);
340
341                         // Nothing if handle hasn't been created
342                         listview.SelectedIndices.Clear (); 
343                         Assert.AreEqual (true, listview.Items [0].Selected, "SelectedIndexCollectionTest_ClearTest#2");
344                         Assert.AreEqual (false, listview.Items [1].Selected, "SelectedIndexCollectionTest_ClearTest#3");
345                         Assert.AreEqual (true, listview.Items [2].Selected, "SelectedIndexCollectionTest_ClearTest#4");
346
347                         // Force to create the handle
348                         listview.CreateControl ();
349
350                         listview.SelectedIndices.Add (0);
351                         listview.SelectedIndices.Add (2);
352
353                         listview.SelectedIndices.Clear ();
354                         Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_ClearTest#5");
355                         Assert.AreEqual (false, listview.Items [0].Selected, "SelectedIndexCollectionTest_ClearTest#6");
356                         Assert.AreEqual (false, listview.Items [1].Selected, "SelectedIndexCollectionTest_ClearTest#7");
357                         Assert.AreEqual (false, listview.Items [2].Selected, "SelectedIndexCollectionTest_ClearTest#8");
358                 }
359
360                 [Test]
361                 public void SelectedIndexCollectionTest_RemoveTest ()
362                 {
363                         ListView listview = new ListView ();
364                         listview.Items.Add ("A");
365
366                         listview.SelectedIndices.Add (0);
367                         listview.SelectedIndices.Remove (0);
368                         Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_RemoveTest#1");
369                         Assert.AreEqual (false, listview.Items [0].Selected, "SelectedIndexCollectionTest_RemoveTest#2");
370
371                         // Force to create the handle
372                         listview.CreateControl ();
373
374                         listview.SelectedIndices.Add (0);
375                         listview.SelectedIndices.Remove (0);
376                         Assert.AreEqual (0, listview.SelectedIndices.Count, "SelectedIndexCollectionTest_RemoveTest#3");
377                         Assert.AreEqual (false, listview.Items [0].Selected, "SelectedIndexCollectionTest_RemoveTest#4");
378                 }
379 #endif
380
381                 // Exceptions
382 #if !NET_2_0
383                 [Test, ExpectedException (typeof (NotSupportedException))]
384                 public void SelectedIndexCollectionTest_Add_ExceptionTest ()
385                 {
386                         ListView listview = new ListView ();
387                         ((IList)listview.SelectedIndices).Add (5);
388                 }
389
390                 [Test, ExpectedException (typeof (NotSupportedException))]
391                 public void SelectedIndexCollectionTest_Remove_ExceptionTest ()
392                 {
393                         ListView listview = new ListView ();
394                         ((IList)listview.SelectedIndices).Remove (5);
395                 }
396 #endif
397
398                 [Test, ExpectedException (typeof (NotSupportedException))]
399                 public void SelectedIndexCollectionTest_RemoveAt_ExceptionTest ()
400                 {
401                         ListView listview = new ListView ();
402                         ((IList)listview.SelectedIndices).RemoveAt (5);
403                 }
404
405 #if NET_2_0
406                 [Test]
407                 public void SelectedIndexCollectionTest_Remove_ExceptionTest ()
408                 {
409                         ListView listview = new ListView ();
410                         try {
411                                 listview.SelectedIndices.Remove (-1);
412                                 Assert.Fail ("SelectedIndexCollectionTest_Remove_ExceptionTest#1");
413                         } catch (ArgumentOutOfRangeException) {
414                         }
415
416                         try {
417                                 listview.SelectedIndices.Remove (listview.Items.Count);
418                                 Assert.Fail ("SelectedIndexCollectionTest_Remove_ExceptionTest#2");
419                         } catch (ArgumentOutOfRangeException) {
420                         }
421                 }
422
423                 [Test]
424                 public void SelectedIndexCollectionTest_Add_ExceptionTest ()
425                 {
426                         ListView listview = new ListView ();
427                         try {
428                                 listview.SelectedIndices.Add (-1);
429                                 Assert.Fail ("SelectedIndexCollectionTest_Add_ExceptionTest#1");
430                         } catch (ArgumentOutOfRangeException) {
431                         }
432
433                         try {
434                                 listview.SelectedIndices.Add (listview.Items.Count);
435                                 Assert.Fail ("SelectedIndexCollectionTest_Add_ExceptionTest#2");
436                         } catch (ArgumentOutOfRangeException) {
437                         }
438                 }
439 #endif
440
441                 /*
442                         SelectedItemCollection
443                 */
444                 [Test]
445                 public void SelectedItemCollectionTest_PropertiesTest ()
446                 {
447                         ListView listview = new ListView ();
448
449                         // Properties
450                         Assert.AreEqual (true, listview.SelectedItems.IsReadOnly, "SelectedItemCollectionTest_PropertiesTest#1");
451                         Assert.AreEqual (false, ((ICollection)listview.SelectedItems).IsSynchronized, "SelectedItemCollectionTest_PropertiesTest#2");
452                         Assert.AreEqual (listview.SelectedItems, ((ICollection)listview.SelectedItems).SyncRoot, "SelectedItemCollectionTest_PropertiesTest#3");
453                         Assert.AreEqual (true, ((IList)listview.SelectedItems).IsFixedSize, "SelectedItemCollectionTest_PropertiesTest#4");
454                         Assert.AreEqual (0, listview.SelectedItems.Count, "SelectedItemCollectionTest_PropertiesTest#5");
455                 }
456
457
458                 // Exceptions
459                 [Test, ExpectedException (typeof (NotSupportedException))]
460                 public void SelectedItemCollectionTest_PropertiesTest_Add_ExceptionTest ()
461                 {
462                         ListView listview = new ListView ();
463                         ((IList)listview.SelectedItems).Add (5);
464                 }
465
466                 [Test, ExpectedException (typeof (NotSupportedException))]
467                 public void SelectedItemCollectionTest_PropertiesTest_Remove_ExceptionTest ()
468                 {
469                         ListView listview = new ListView ();
470                         ((IList)listview.SelectedItems).Remove (5);
471                 }
472
473                 [Test, ExpectedException (typeof (NotSupportedException))]
474                 public void SelectedItemCollectionTest_PropertiesTest_RemoveAt_ExceptionTest ()
475                 {
476                         ListView listview = new ListView ();
477                         ((IList)listview.SelectedItems).RemoveAt (5);
478                 }
479
480                 [Test]
481                 public void SelectedItemCollectionTest_Clear ()
482                 {
483                         Form form = new Form ();
484                         form.ShowInTaskbar = false;
485                         ListView lvw = new ListView ();
486                         form.Controls.Add (lvw);
487                         ListViewItem item = lvw.Items.Add ("Title");
488                         item.Selected = true;
489
490                         lvw.SelectedItems.Clear ();
491
492                         Assert.IsTrue (item.Selected, "#A1");
493                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#A2");
494                         Assert.IsFalse (lvw.SelectedItems.Contains (item), "#A3");
495
496                         form.Show ();
497
498                         Assert.IsTrue (item.Selected, "#B1");
499                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#B2");
500                         Assert.IsTrue (lvw.SelectedItems.Contains (item), "#B3");
501
502                         // once listview is created, clear DOES have effect
503                         lvw.SelectedItems.Clear ();
504
505                         Assert.IsFalse (item.Selected, "#C1");
506                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#C2");
507                         Assert.IsFalse (lvw.SelectedItems.Contains (item), "#C3");
508                         form.Dispose ();
509                 }
510
511                 [Test]
512                 public void SelectedItemCollectionTest_Contains ()
513                 {
514                         Form form = new Form ();
515                         form.ShowInTaskbar = false;
516                         ListView lvw = new ListView ();
517                         form.Controls.Add (lvw);
518                         ListViewItem item = lvw.Items.Add ("Title");
519                         item.Selected = true;
520                         IList list = (IList) lvw.SelectedItems;
521
522                         Assert.IsFalse (lvw.SelectedItems.Contains (item), "#A1");
523                         Assert.IsFalse (lvw.SelectedItems.Contains (new ListViewItem ()), "#A2");
524                         Assert.IsFalse (list.Contains (item), "#A3");
525                         Assert.IsFalse (list.Contains (new ListViewItem ()), "#A4");
526
527                         form.Show ();
528
529                         Assert.IsTrue (lvw.SelectedItems.Contains (item), "#B1");
530                         Assert.IsFalse (lvw.SelectedItems.Contains (new ListViewItem ()), "#B2");
531                         Assert.IsTrue (list.Contains (item), "#B3");
532                         Assert.IsFalse (list.Contains (new ListViewItem ()), "#B4");
533                         form.Dispose ();
534                 }
535
536                 [Test]
537                 public void SelectedItemCollectionTest_CopyTo ()
538                 {
539                         Form form = new Form ();
540                         form.ShowInTaskbar = false;
541                         ListView lvw = new ListView ();
542                         form.Controls.Add (lvw);
543                         ListViewItem item = lvw.Items.Add ("Title");
544                         item.Selected = true;
545                         IList list = (IList) lvw.SelectedItems;
546                         Assert.IsNotNull (list, "#A1");
547                         ListViewItem [] items = new ListViewItem [1];
548
549                         lvw.SelectedItems.CopyTo (items, 0);
550                         Assert.IsNull (items [0], "#A2");
551                         lvw.SelectedItems.CopyTo (items, 455);
552
553                         form.Show ();
554
555                         lvw.SelectedItems.CopyTo (items, 0);
556                         Assert.AreSame (item, items [0], "#B1");
557                         try {
558                                 lvw.SelectedItems.CopyTo (items, 455);
559                                 Assert.Fail ("#B2");
560                         } catch (ArgumentException) {
561                         }
562                         form.Dispose ();
563                 }
564
565                 [Test]
566                 public void SelectedItemCollectionTest_Count ()
567                 {
568                         Form form = new Form ();
569                         form.ShowInTaskbar = false;
570                         ListView lvw = new ListView ();
571                         form.Controls.Add (lvw);
572                         ListViewItem item = lvw.Items.Add ("Title");
573                         item.Selected = true;
574
575                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#1");
576                         form.Show ();
577                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#2");
578                         form.Dispose ();
579                 }
580
581                 [Test]
582                 public void SelectedItemCollectionTest_GetEnumerator ()
583                 {
584                         Form form = new Form ();
585                         form.ShowInTaskbar = false;
586                         ListView lvw = new ListView ();
587                         form.Controls.Add (lvw);
588                         ListViewItem item = lvw.Items.Add ("Title");
589                         item.Selected = true;
590
591                         Assert.IsFalse (lvw.SelectedItems.GetEnumerator ().MoveNext (), "#A1");
592
593                         form.Show ();
594
595                         Assert.IsTrue (lvw.SelectedItems.GetEnumerator ().MoveNext (), "#B1");
596
597                         form.Dispose ();
598                 }
599
600                 [Test]
601                 public void SelectedItemCollectionTest_Indexer ()
602                 {
603                         Form form = new Form ();
604                         form.ShowInTaskbar = false;
605                         ListView lvw = new ListView ();
606                         form.Controls.Add (lvw);
607                         ListViewItem item = lvw.Items.Add ("Title");
608                         item.Selected = true;
609                         IList list = (IList) lvw.SelectedItems;
610
611                         try  {
612                                 ListViewItem x = lvw.SelectedItems [0];
613                                 Assert.Fail ("#A1: " + x.ToString ());
614                         } catch (ArgumentOutOfRangeException) {
615                         }
616
617                         try {
618                                 ListViewItem x = list [0] as ListViewItem;
619                                 Assert.Fail ("#A2: " + x.ToString ());
620                         } catch (ArgumentOutOfRangeException) {
621                         }
622
623                         form.Show ();
624
625                         Assert.AreSame (item, lvw.SelectedItems [0], "#B1");
626                         Assert.AreSame (item, list [0], "#B2");
627
628                         form.Dispose ();
629                 }
630
631                 [Test]
632                 public void SelectedItemCollectionTest_IndexOf ()
633                 {
634                         Form form = new Form ();
635                         form.ShowInTaskbar = false;
636                         ListView lvw = new ListView ();
637                         form.Controls.Add (lvw);
638                         ListViewItem item = lvw.Items.Add ("Title");
639                         item.Selected = true;
640                         IList list = (IList) lvw.SelectedItems;
641
642                         Assert.AreEqual (-1, lvw.SelectedItems.IndexOf (item), "#A1");
643                         Assert.AreEqual (-1, lvw.SelectedItems.IndexOf (new ListViewItem ()), "#A2");
644                         Assert.AreEqual (-1, list.IndexOf (item), "#A3");
645                         Assert.AreEqual (-1, list.IndexOf (new ListViewItem ()), "#A4");
646
647                         form.Show ();
648
649                         Assert.AreEqual (0, lvw.SelectedItems.IndexOf (item), "#B1");
650                         Assert.AreEqual (-1, lvw.SelectedItems.IndexOf (new ListViewItem ()), "#B2");
651                         Assert.AreEqual (0, list.IndexOf (item), "#B3");
652                         Assert.AreEqual (-1, list.IndexOf (new ListViewItem ()), "#B4");
653
654                         form.Dispose ();
655                 }
656
657 #if NET_2_0
658                 [Test]
659                 public void SelectedItemCollectionTest_IndexOfKey ()
660                 {
661                         ListView lvw = new ListView ();
662                         ListViewItem lvi1 = new ListViewItem ("A");
663                         lvi1.Name = "A name";
664                         lvi1.Selected = true;
665                         ListViewItem lvi2 = new ListViewItem ("B");
666                         lvi2.Name = "Same name";
667                         lvi2.Selected = false;
668                         ListViewItem lvi3 = new ListViewItem ("C");
669                         lvi3.Name = "Same name";
670                         lvi3.Selected = true;
671                         ListViewItem lvi4 = new ListViewItem ("D");
672                         lvi4.Name = String.Empty;
673                         lvi4.Selected = true;
674                         ListViewItem lvi5 = new ListViewItem ("E");
675                         lvi5.Name = "E name";
676                         lvi5.Selected = false;
677                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
678
679                         // Force to create the control
680                         lvw.CreateControl ();
681
682                         Assert.AreEqual (3, lvw.SelectedItems.Count, "#A1");
683                         Assert.AreEqual (-1, lvw.SelectedItems.IndexOfKey (String.Empty), "#A2");
684                         Assert.AreEqual (-1, lvw.SelectedItems.IndexOfKey (null), "#A3");
685                         Assert.AreEqual (0, lvw.SelectedItems.IndexOfKey ("A name"), "#A4");
686                         Assert.AreEqual (0, lvw.SelectedItems.IndexOfKey ("a NAME"), "#A5");
687                         Assert.AreEqual (1, lvw.SelectedItems.IndexOfKey ("Same name"), "#A6");
688                         Assert.AreEqual (-1, lvw.SelectedItems.IndexOfKey ("E name"), "#A7");
689
690                         ListViewItem lvi6 = new ListViewItem ("F");
691                         lvw.Items.Add (lvi6);
692                         lvi6.Selected = true;
693                         lvi6.Name = "F name";
694
695                         Assert.AreEqual (4, lvw.SelectedItems.Count, "#B1");
696                         Assert.AreEqual (3, lvw.SelectedItems.IndexOfKey ("F name"), "#B2");
697                 }
698
699                 [Test]
700                 public void SelectedItemCollectionTest_Indexer2 ()
701                 {
702                         ListView lvw = new ListView ();
703                         ListViewItem lvi1 = new ListViewItem ("A");
704                         lvi1.Name = "A name";
705                         lvi1.Selected = true;
706                         ListViewItem lvi2 = new ListViewItem ("B");
707                         lvi2.Name = "Same name";
708                         lvi2.Selected = false;
709                         ListViewItem lvi3 = new ListViewItem ("C");
710                         lvi3.Name = "Same name";
711                         lvi3.Selected = true;
712                         ListViewItem lvi4 = new ListViewItem ("D");
713                         lvi4.Name = String.Empty;
714                         lvi4.Selected = true;
715                         ListViewItem lvi5 = new ListViewItem ("E");
716                         lvi5.Name = "E name";
717                         lvi5.Selected = false;
718                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
719
720                         // Force to create the control
721                         lvw.CreateControl ();
722
723                         Assert.AreEqual (3, lvw.SelectedItems.Count, "#A1");
724                         Assert.AreEqual (null, lvw.SelectedItems [String.Empty], "#A2");
725                         Assert.AreEqual (null, lvw.SelectedItems [null], "#A3");
726                         Assert.AreEqual (lvi1, lvw.SelectedItems ["A name"], "#A4");
727                         Assert.AreEqual (lvi1, lvw.SelectedItems ["a NAME"], "#A5");
728                         Assert.AreEqual (lvi3, lvw.SelectedItems ["Same name"], "#A6");
729                         Assert.AreEqual (null, lvw.SelectedItems ["E name"], "#A7");
730
731                         ListViewItem lvi6 = new ListViewItem ("F");
732                         lvw.Items.Add (lvi6);
733                         lvi6.Selected = true;
734                         lvi6.Name = "F name";
735
736                         Assert.AreEqual (4, lvw.SelectedItems.Count, "#B1");
737                         Assert.AreEqual (lvi6, lvw.SelectedItems ["F name"], "#B2");
738                 }
739 #endif
740
741                 [Test]
742                 public void SelectedItemCollectionTest_Order ()
743                 {
744                         Form form = new Form ();
745                         form.ShowInTaskbar = false;
746                         ListView lvw = new ListView ();
747                         lvw.MultiSelect = true;
748                         form.Controls.Add (lvw);
749                         ListViewItem itemA = lvw.Items.Add ("A");
750                         itemA.Selected = true;
751                         ListViewItem itemB = lvw.Items.Add ("B");
752                         itemB.Selected = true;
753                         ListViewItem itemC = lvw.Items.Add ("C");
754                         itemC.Selected = true;
755
756                         form.Show ();
757
758                         Assert.AreEqual (3, lvw.SelectedItems.Count, "#A1");
759                         Assert.AreSame (itemA, lvw.SelectedItems [0], "#A2");
760                         Assert.AreSame (itemB, lvw.SelectedItems [1], "#A3");
761                         Assert.AreSame (itemC, lvw.SelectedItems [2], "#A3");
762
763                         itemB.Selected = false;
764
765                         Assert.AreEqual (2, lvw.SelectedItems.Count, "#B1");
766                         Assert.AreSame (itemA, lvw.SelectedItems [0], "#B2");
767                         Assert.AreSame (itemC, lvw.SelectedItems [1], "#B3");
768
769                         itemB.Selected = true;
770
771                         Assert.AreEqual (3, lvw.SelectedItems.Count, "#C1");
772                         Assert.AreSame (itemA, lvw.SelectedItems [0], "#C2");
773                         Assert.AreSame (itemB, lvw.SelectedItems [1], "#C3");
774                         Assert.AreSame (itemC, lvw.SelectedItems [2], "#C4");
775
776                         lvw.Sorting = SortOrder.Descending;
777
778                         Assert.AreEqual (3, lvw.SelectedItems.Count, "#D1");
779                         Assert.AreSame (itemC, lvw.SelectedItems [0], "#D2");
780                         Assert.AreSame (itemB, lvw.SelectedItems [1], "#D3");
781                         Assert.AreSame (itemA, lvw.SelectedItems [2], "#D4");
782
783                         form.Dispose ();
784                 }
785
786                 /*
787                         ListViewItemCollection
788                 */
789
790                 [Test]
791                 public void ListViewItemCollectionTest_Add ()
792                 {
793                         ListView lvw = new ListView ();
794                         ListViewItem item = new ListViewItem ("Title");
795                         ListViewItem newItem = lvw.Items.Add (item);
796                         Assert.AreSame (newItem, item, "#A1");
797                         Assert.AreEqual (0, item.Index, "#A2");
798                         Assert.AreSame (item, lvw.Items [0], "#A3");
799                         Assert.AreSame (lvw, item.ListView, "#A4");
800
801                         newItem = lvw.Items.Add ("A title");
802                         Assert.AreEqual ("A title", newItem.Text, "#B1");
803                         Assert.AreEqual (-1, newItem.ImageIndex, "#B2");
804                         Assert.AreEqual (1, newItem.Index, "#B3");
805                         Assert.AreSame (newItem, lvw.Items [1], "#B4");
806                         Assert.AreSame (lvw, newItem.ListView, "#B5");
807                         Assert.AreEqual (0, item.Index, "#B6");
808                         Assert.AreSame (item, lvw.Items [0], "#B7");
809
810                         newItem = lvw.Items.Add ("A title", 4);
811                         Assert.AreEqual ("A title", newItem.Text, "#C1");
812                         Assert.AreEqual (4, newItem.ImageIndex, "#C2");
813                         Assert.AreEqual (2, newItem.Index, "#C3");
814                         Assert.AreSame (newItem, lvw.Items [2], "#C4");
815                         Assert.AreSame (lvw, newItem.ListView, "#C5");
816                         Assert.AreEqual (0, item.Index, "#C6");
817                         Assert.AreSame (item, lvw.Items [0], "#C7");
818                 }
819
820                 [Test]
821                 [ExpectedException (typeof (ArgumentException))] // An item cannot be added more than once. To add an item again, you need to clone it
822                 public void ListViewItemCollectionTest_Add_ExistingItem ()
823                 {
824                         ListView lvw = new ListView ();
825                         ListViewItem itemA = lvw.Items.Add ("A");
826                         lvw.Items.Add (itemA);
827                 }
828
829                 [Test]
830                 [ExpectedException (typeof (ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
831                 public void ListViewItemCollectionTest_Add_OwnedItem ()
832                 {
833                         ListView lv1 = new ListView ();
834                         ListView lv2 = new ListView ();
835                         ListViewItem item = lv1.Items.Add ("A");
836                         lv2.Items.Add (item);
837                 }
838
839                 [Test]
840                 public void ListViewItemCollectionTest_Add_Junk ()
841                 {
842                         ListView lv1 = new ListView ();
843
844                         ListViewItem item4 = lv1.Items.Add("Item4", 4);
845                         Assert.AreEqual(item4, lv1.Items[0], "#D1");
846 #if NET_2_0
847                         Assert.AreEqual(string.Empty, lv1.Items[0].Name, "#D2");
848 #endif
849                         Assert.AreEqual("Item4", lv1.Items[0].Text, "#D3");
850                         Assert.AreEqual(4, lv1.Items[0].ImageIndex, "#D4");
851
852                         string text = null;
853                         ListViewItem item5 = lv1.Items.Add(text);
854                         Assert.AreEqual(item5, lv1.Items[1], "#E1");
855 #if NET_2_0
856                         Assert.AreEqual(string.Empty, lv1.Items[1].Name, "#E2");
857 #endif
858                         Assert.AreEqual(string.Empty, lv1.Items[1].Text, "#E3");
859
860                         ListViewItem item6 = lv1.Items.Add(null, 5);
861                         Assert.AreEqual(item6, lv1.Items[2], "#F1");
862 #if NET_2_0
863                         Assert.AreEqual(string.Empty, lv1.Items[2].Name, "#F2");
864 #endif
865                         Assert.AreEqual(string.Empty, lv1.Items[2].Text, "#F3");
866                         Assert.AreEqual(5, lv1.Items[2].ImageIndex, "#F4");
867 #if NET_2_0
868                         ListViewItem item1 = lv1.Items.Add("ItemKey1", "Item1", 1);
869                         Assert.AreEqual(item1, lv1.Items[3], "#A1");
870                         Assert.AreEqual("ItemKey1", lv1.Items[3].Name, "#A2");
871                         Assert.AreEqual("Item1", lv1.Items[3].Text, "#A3");
872                         Assert.AreEqual(1, lv1.Items[3].ImageIndex, "#A4");
873
874                         ListViewItem item2 = lv1.Items.Add("ItemKey2", "Item2", "Image2");
875                         Assert.AreEqual(item2, lv1.Items[4], "#B1");
876                         Assert.AreEqual("ItemKey2", lv1.Items[4].Name, "#B2");
877                         Assert.AreEqual("Item2", lv1.Items[4].Text, "#B3");
878                         Assert.AreEqual("Image2", lv1.Items[4].ImageKey, "#B4");
879
880                         ListViewItem item3 = lv1.Items.Add("Item3", "Image3");
881                         Assert.AreEqual(item3, lv1.Items[5], "#C1");
882                         Assert.AreEqual(string.Empty, lv1.Items[5].Name, "#C2");
883                         Assert.AreEqual("Item3", lv1.Items[5].Text, "#C3");
884                         Assert.AreEqual("Image3", lv1.Items[5].ImageKey, "#C4");
885
886                         ListViewItem item7 = lv1.Items.Add(null, "Item6", 6);
887                         Assert.AreEqual(item7, lv1.Items[6], "#G1");
888                         Assert.AreEqual(string.Empty, lv1.Items[6].Name, "#G2");
889                         Assert.AreEqual("Item6", lv1.Items[6].Text, "#G3");
890                         Assert.AreEqual(6, lv1.Items[6].ImageIndex, "#G4");
891
892                         ListViewItem item8 = lv1.Items.Add("ItemKey7", null, 7);
893                         Assert.AreEqual(item8, lv1.Items[7], "#H1");
894                         Assert.AreEqual("ItemKey7", lv1.Items[7].Name, "#H2");
895                         Assert.AreEqual(string.Empty, lv1.Items[7].Text, "#H3");
896                         Assert.AreEqual(7, lv1.Items[7].ImageIndex, "#H4");
897
898                         ListViewItem item9 = lv1.Items.Add("ItemKey8", "Item8", null);
899                         Assert.AreEqual(item9, lv1.Items[8], "#I1");
900                         Assert.AreEqual("ItemKey8", lv1.Items[8].Name, "#I2");
901                         Assert.AreEqual("Item8", lv1.Items[8].Text, "#I3");
902                         Assert.AreEqual(string.Empty, lv1.Items[8].ImageKey, "#I4");
903 #endif
904                 }
905
906                 [Test]
907                 public void ListViewItemCollectionTest_AddRange ()
908                 {
909                         ListView lv1 = new ListView ();
910                         ListViewItem item1 = new ListViewItem ("Item1");
911                         ListViewItem item2 = new ListViewItem ("Item2");
912                         ListViewItem item3 = new ListViewItem ("Item3");
913                         lv1.Items.AddRange (new ListViewItem[] { item1, item2, item3 });
914
915                         Assert.AreSame (item1, lv1.Items[0], "#A1");
916                         Assert.AreEqual (0, item1.Index, "#A2");
917                         Assert.AreSame (lv1, item1.ListView, "#A3");
918
919                         Assert.AreSame (item2, lv1.Items[1], "#B1");
920                         Assert.AreEqual (1, item2.Index, "#B2");
921                         Assert.AreSame (lv1, item2.ListView, "#B3");
922
923                         Assert.AreSame (item3, lv1.Items[2], "#C1");
924                         Assert.AreEqual (2, item3.Index, "#C2");
925                         Assert.AreSame (lv1, item3.ListView, "#C3");
926                 }
927
928                 [Test]
929                 public void ListViewItemCollectionTest_AddRange_Count ()
930                 {
931                         ListView lv1 = new ListView ();
932                         ListViewItem item1 = new ListViewItem ("Item1");
933                         ListViewItem item2 = new ListViewItem ("Item2");
934                         ListViewItem item3 = new ListViewItem ("Item3");
935
936                         lv1.Items.Add ("Item4");
937                         Assert.AreEqual (1, lv1.Items.Count, "#A1");
938                         lv1.Items.AddRange (new ListViewItem[] { item1, item2, item3 });
939                         Assert.AreEqual (4, lv1.Items.Count, "#A1");
940                 }
941
942                 [Test]
943                 [ExpectedException(typeof(ArgumentNullException))]
944                 public void ListViewItemCollectionTest_AddRange_NullException ()
945                 {
946                         ListView lv1 = new ListView ();
947                         ListViewItem[] value = null;
948                         lv1.Items.AddRange (value);
949                 }
950
951                 [Test]
952                 [ExpectedException(typeof(ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
953                 public void ListViewItemCollectionTest_AddRange_OwnedItem ()
954                 {
955                         //MSDN told us, we can use this method to reuse items from a different ListView control. That is not true.
956                         ListView lv1 = new ListView ();
957                         ListView lv2 = new ListView ();
958                         ListViewItem a = lv1.Items.Add ("Item1");
959                         ListViewItem b = lv1.Items.Add ("Item2");
960
961                         lv2.Items.AddRange (new ListViewItem[] { a, b });
962                 }
963
964                 [Test]
965                 [ExpectedException(typeof(ArgumentException))] // An item cannot be added more than once. To add an item again, you need to clone it
966                 public void ListViewItemCollectionTest_AddRange_ExistingItem ()
967                 {
968                         ListView lv1 = new ListView ();
969                         ListViewItem item1 = lv1.Items.Add ("Item1");
970                         lv1.Items.Add (item1);
971                 }
972
973                 [Test]
974                 public void ListViewItemCollectionTest_Clear ()
975                 {
976                         ListView lvw = new ListView ();
977                         ListViewItem itemA = lvw.Items.Add ("A");
978                         ListViewItem itemB = lvw.Items.Add ("B");
979
980                         Assert.AreEqual (2, lvw.Items.Count, "#A1");
981                         Assert.AreSame (lvw, itemA.ListView, "#A2");
982                         Assert.AreSame (lvw, itemB.ListView, "#A3");
983
984                         lvw.Items.Clear ();
985
986                         Assert.AreEqual (0, lvw.Items.Count, "#B1");
987                         Assert.IsNull (itemA.ListView, "#B2");
988                         Assert.IsNull (itemB.ListView, "#B3");
989                 }
990
991                 [Test]
992                 public void ListViewItemCollectionTest_Insert ()
993                 {
994                         ListView lvw = new ListView ();
995                         ListViewItem item = new ListViewItem ("Title");
996                         ListViewItem newItem = lvw.Items.Insert (0, item);
997                         Assert.AreSame (newItem, item, "#A1");
998                         Assert.AreEqual (-1, newItem.ImageIndex, "#A2");
999                         Assert.AreSame (newItem, lvw.Items [0], "#A3");
1000                         Assert.AreSame (lvw, newItem.ListView, "#A4");
1001
1002                         newItem = lvw.Items.Insert (1, "A title");
1003                         Assert.AreEqual ("A title", newItem.Text, "#B1");
1004                         Assert.AreEqual (-1, newItem.ImageIndex, "#B2");
1005                         Assert.AreEqual (1, newItem.Index, "#B3");
1006                         Assert.AreSame (newItem, lvw.Items [1], "#B4");
1007                         Assert.AreSame (lvw, newItem.ListView, "#B5");
1008                         Assert.AreEqual (0, item.Index, "#B6");
1009                         Assert.AreSame (item, lvw.Items [0], "#B7");
1010
1011                         newItem = lvw.Items.Insert (0, "Other title");
1012                         Assert.AreEqual ("Other title", newItem.Text, "#C1");
1013                         Assert.AreEqual (-1, newItem.ImageIndex, "#C2");
1014                         Assert.AreEqual (0, newItem.Index, "#C3");
1015                         Assert.AreSame (newItem, lvw.Items [0], "#C4");
1016                         Assert.AreSame (lvw, newItem.ListView, "#C5");
1017                         Assert.AreEqual (1, item.Index, "#C6");
1018                         Assert.AreSame (item, lvw.Items [1], "#C7");
1019
1020                         newItem = lvw.Items.Insert (3, "Some title", 4);
1021                         Assert.AreEqual ("Some title", newItem.Text, "#D1");
1022                         Assert.AreEqual (4, newItem.ImageIndex, "#D2");
1023                         Assert.AreEqual (3, newItem.Index, "#D3");
1024                         Assert.AreSame (newItem, lvw.Items [3], "#D4");
1025                         Assert.AreSame (lvw, newItem.ListView, "#D5");
1026                         Assert.AreEqual (1, item.Index, "#D6");
1027                         Assert.AreSame (item, lvw.Items [1], "#D7");
1028
1029                         newItem = lvw.Items.Insert (0, "No title", 4);
1030                         Assert.AreEqual ("No title", newItem.Text, "#E1");
1031                         Assert.AreEqual (4, newItem.ImageIndex, "#E2");
1032                         Assert.AreEqual (0, newItem.Index, "#E3");
1033                         Assert.AreSame (newItem, lvw.Items [0], "#E4");
1034                         Assert.AreSame (lvw, newItem.ListView, "#E5");
1035                         Assert.AreEqual (2, item.Index, "#E6");
1036                         Assert.AreSame (item, lvw.Items [2], "#E7");
1037                 }
1038
1039                 [Test]
1040                 [ExpectedException (typeof (ArgumentException))] // An item cannot be added more than once. To add an item again, you need to clone it
1041                 public void ListViewItemCollectionTest_Insert_ExistingItem ()
1042                 {
1043                         ListView lvw = new ListView ();
1044                         ListViewItem itemA = lvw.Items.Add ("A");
1045                         lvw.Items.Insert (0, itemA);
1046                 }
1047
1048                 [Test]
1049                 [ExpectedException (typeof (ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
1050                 public void ListViewItemCollectionTest_Insert_OwnedItem ()
1051                 {
1052                         ListView lv1 = new ListView ();
1053                         ListView lv2 = new ListView ();
1054                         ListViewItem item = lv1.Items.Add ("A");
1055                         lv2.Items.Insert (0, item);
1056                 }
1057
1058                 [Test]
1059                 [ExpectedException(typeof(ArgumentException))] // An item cannot be added to more than one ListView. To add an item again, you need to clone it
1060                 public void ListViewItemCollectionTest_Indexer_OwnedItem ()
1061                 {
1062                         ListView lv1 = new ListView ();
1063                         ListView lv2 = new ListView ();
1064                         ListViewItem item = lv1.Items.Add ("A");
1065
1066                         lv2.Items.Add ("Dummy");
1067                         lv2.Items[0] = item;
1068                 }
1069
1070                 [Test]
1071                 public void ListViewItemCollectionTest_Remove ()
1072                 {
1073                         Form form = new Form ();
1074                         form.ShowInTaskbar = false;
1075                         ListView lvw = new ListView ();
1076                         form.Controls.Add (lvw);
1077                         lvw.MultiSelect = true;
1078                         lvw.CheckBoxes = true;
1079
1080                         form.Show ();
1081
1082                         ListViewItem itemA = lvw.Items.Add ("A");
1083                         ListViewItem itemB = lvw.Items.Add ("B");
1084                         lvw.Items.Add ("C");
1085                         ListViewItem itemD = lvw.Items.Add ("D");
1086
1087                         Assert.AreEqual (4, lvw.Items.Count, "#A1");
1088                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#A2");
1089                         Assert.AreEqual (0, lvw.CheckedItems.Count, "#A3");
1090
1091                         itemB.Checked = true;
1092                         itemD.Checked = true;
1093
1094                         Assert.AreEqual (4, lvw.Items.Count, "#B1");
1095                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#B2");
1096                         Assert.AreEqual (2, lvw.CheckedItems.Count, "#B3");
1097                         Assert.AreSame (itemB, lvw.CheckedItems [0], "#B4");
1098                         Assert.AreSame (itemD, lvw.CheckedItems [1], "#B5");
1099
1100                         itemD.Selected = true;
1101
1102                         Assert.AreEqual (4, lvw.Items.Count, "#C1");
1103                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#C2");
1104                         Assert.AreSame (itemD, lvw.SelectedItems [0], "#C3");
1105                         Assert.AreEqual (2, lvw.CheckedItems.Count, "#C4");
1106                         Assert.AreSame (itemB, lvw.CheckedItems [0], "#C5");
1107                         Assert.AreSame (itemD, lvw.CheckedItems [1], "#C6");
1108
1109                         lvw.Items.Remove (itemB);
1110
1111                         Assert.AreEqual (3, lvw.Items.Count, "#D1");
1112                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#D2");
1113                         Assert.AreSame (itemD, lvw.SelectedItems [0], "#D3");
1114                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#D4");
1115                         Assert.AreSame (itemD, lvw.CheckedItems [0], "#D5");
1116
1117                         lvw.Items.Remove (itemA);
1118
1119                         Assert.AreEqual (2, lvw.Items.Count, "#E1");
1120                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#E2");
1121                         Assert.AreEqual (itemD, lvw.SelectedItems [0], "#E3");
1122                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#E4");
1123                         Assert.AreEqual (itemD, lvw.CheckedItems [0], "#E5");
1124
1125                         Assert.IsNull (itemA.ListView, "#F1");
1126                         Assert.IsNull (itemB.ListView, "#F2");
1127                         Assert.AreSame (lvw, itemD.ListView, "#F3");
1128
1129                         form.Dispose ();
1130                 }
1131
1132                 [Test]
1133                 public void ListViewItemCollectionTest_RemoveAt ()
1134                 {
1135                         Form form = new Form ();
1136                         form.ShowInTaskbar = false;
1137                         ListView lvw = new ListView ();
1138                         form.Controls.Add (lvw);
1139                         lvw.MultiSelect = true;
1140                         lvw.CheckBoxes = true;
1141
1142                         ListViewItem itemA = lvw.Items.Add ("A");
1143                         ListViewItem itemB = lvw.Items.Add ("B");
1144                         ListViewItem itemC = lvw.Items.Add ("C");
1145                         ListViewItem itemD = lvw.Items.Add ("D");
1146
1147                         form.Show ();
1148
1149                         Assert.AreEqual (4, lvw.Items.Count, "#A1");
1150                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#A2");
1151                         Assert.AreEqual (0, lvw.CheckedItems.Count, "#A3");
1152
1153                         lvw.Items [1].Checked = true;
1154                         lvw.Items [3].Checked = true;
1155
1156                         Assert.AreEqual (4, lvw.Items.Count, "#B1");
1157                         Assert.AreEqual (0, lvw.SelectedItems.Count, "#B2");
1158                         Assert.AreEqual (2, lvw.CheckedItems.Count, "#B3");
1159                         Assert.AreEqual ("B", lvw.CheckedItems [0].Text, "#B4");
1160                         Assert.AreEqual ("D", lvw.CheckedItems [1].Text, "#B5");
1161
1162                         lvw.Items [3].Selected = true;
1163
1164                         Assert.AreEqual (4, lvw.Items.Count, "#C1");
1165                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#C2");
1166                         Assert.AreEqual ("D", lvw.SelectedItems [0].Text, "#C3");
1167                         Assert.AreEqual (2, lvw.CheckedItems.Count, "#C4");
1168                         Assert.AreEqual ("B", lvw.CheckedItems [0].Text, "#C5");
1169                         Assert.AreEqual ("D", lvw.CheckedItems [1].Text, "#C6");
1170
1171                         lvw.Items.RemoveAt (1);
1172
1173                         Assert.AreEqual (3, lvw.Items.Count, "#D1");
1174                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#D2");
1175                         Assert.AreEqual ("D", lvw.SelectedItems [0].Text, "#D3");
1176                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#D4");
1177                         Assert.AreEqual ("D", lvw.CheckedItems [0].Text, "#D5");
1178
1179                         lvw.Items.RemoveAt (0);
1180
1181                         Assert.AreEqual (2, lvw.Items.Count, "#E1");
1182                         Assert.AreEqual (1, lvw.SelectedItems.Count, "#E2");
1183                         Assert.AreEqual ("D", lvw.SelectedItems [0].Text, "#E3");
1184                         Assert.AreEqual (1, lvw.CheckedItems.Count, "#E4");
1185                         Assert.AreEqual ("D", lvw.CheckedItems [0].Text, "#E5");
1186
1187                         Assert.IsNull (itemA.ListView, "#F1");
1188                         Assert.IsNull (itemB.ListView, "#F2");
1189                         Assert.AreSame (lvw, itemC.ListView, "#F3");
1190                         Assert.AreSame (lvw, itemD.ListView, "#F4");
1191
1192                         form.Dispose ();
1193                 }
1194
1195 #if NET_2_0
1196                 [Test]
1197                 public void ListViewItemCollectionTest_RemoveByKey ()
1198                 {
1199                         ListView lvw = new ListView ();
1200                         ListViewItem lvi1 = new ListViewItem ("A");
1201                         lvi1.Name = "A name";
1202                         ListViewItem lvi2 = new ListViewItem ("B");
1203                         lvi2.Name = "B name";
1204                         ListViewItem lvi3 = new ListViewItem ("C");
1205                         lvi3.Name = "Same name";
1206                         ListViewItem lvi4 = new ListViewItem ("D");
1207                         lvi4.Name = "Same name";
1208                         ListViewItem lvi5 = new ListViewItem ("E");
1209                         lvi5.Name = String.Empty;
1210                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
1211
1212                         Assert.AreEqual (5, lvw.Items.Count, "#A1");
1213
1214                         lvw.Items.RemoveByKey ("B name");
1215                         Assert.AreEqual (4, lvw.Items.Count, "#B1");
1216                         Assert.AreSame (lvi1, lvw.Items [0], "#B2");
1217                         Assert.AreSame (lvi3, lvw.Items [1], "#B3");
1218                         Assert.AreSame (lvi4, lvw.Items [2], "#B4");
1219                         Assert.AreSame (lvi5, lvw.Items [3], "#B5");
1220
1221                         lvw.Items.RemoveByKey ("Same name");
1222                         Assert.AreEqual (3, lvw.Items.Count, "#C1");
1223                         Assert.AreSame (lvi1, lvw.Items [0], "#C2");
1224                         Assert.AreSame (lvi4, lvw.Items [1], "#C3");
1225                         Assert.AreSame (lvi5, lvw.Items [2], "#C4");
1226
1227                         lvw.Items.RemoveByKey ("a NAME");
1228                         Assert.AreEqual (2, lvw.Items.Count, "#D1");
1229                         Assert.AreSame (lvi4, lvw.Items [0], "#D2");
1230                         Assert.AreSame (lvi5, lvw.Items [1], "#D3");
1231
1232                         lvw.Items.RemoveByKey (String.Empty);
1233                         Assert.AreEqual (2, lvw.Items.Count, "#E1");
1234                         Assert.AreSame (lvi4, lvw.Items [0], "#E2");
1235                         Assert.AreSame (lvi5, lvw.Items [1], "#E3");
1236
1237                         Assert.IsNull (lvi1.ListView, "#F1");
1238                         Assert.IsNull (lvi2.ListView, "#F2");
1239                         Assert.IsNull (lvi3.ListView, "#F3");
1240                         Assert.AreSame (lvw, lvi4.ListView, "#F4");
1241                         Assert.AreSame (lvw, lvi5.ListView, "#F5");
1242                 }
1243
1244                 [Test]
1245                 public void ListViewItemCollectionTest_IndexOfKey ()
1246                 {
1247                         ListView lvw = new ListView ();
1248                         ListViewItem lvi1 = new ListViewItem ("A");
1249                         lvi1.Name = "A name";
1250                         ListViewItem lvi2 = new ListViewItem ("B");
1251                         lvi2.Name = "Same name";
1252                         ListViewItem lvi3 = new ListViewItem ("C");
1253                         lvi3.Name = "Same name";
1254                         ListViewItem lvi4 = new ListViewItem ("D");
1255                         lvi4.Name = String.Empty;
1256                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4 });
1257
1258                         Assert.AreEqual (4, lvw.Items.Count, "#A1");
1259                         Assert.AreEqual (-1, lvw.Items.IndexOfKey (String.Empty), "#A2");
1260                         Assert.AreEqual (-1, lvw.Items.IndexOfKey (null), "#A3");
1261                         Assert.AreEqual (0, lvw.Items.IndexOfKey ("A name"), "#A4");
1262                         Assert.AreEqual (0, lvw.Items.IndexOfKey ("a NAME"), "#A5");
1263                         Assert.AreEqual (1, lvw.Items.IndexOfKey ("Same name"), "#A6");
1264
1265                         ListViewItem lvi5 = new ListViewItem ("E");
1266                         lvw.Items.Add (lvi5);
1267                         lvi5.Name = "E name";
1268
1269                         Assert.AreEqual (4, lvw.Items.IndexOfKey ("E name"), "#B1");
1270                 }
1271
1272                 [Test]
1273                 public void ListViewItemCollectionTest_Indexer ()
1274                 {
1275                         ListView lvw = new ListView ();
1276                         ListViewItem lvi1 = new ListViewItem ("A");
1277                         lvi1.Name = "A name";
1278                         ListViewItem lvi2 = new ListViewItem ("B");
1279                         lvi2.Name = "Same name";
1280                         ListViewItem lvi3 = new ListViewItem ("C");
1281                         lvi3.Name = "Same name";
1282                         ListViewItem lvi4 = new ListViewItem ("D");
1283                         lvi4.Name = String.Empty;
1284                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4 });
1285
1286                         Assert.AreEqual (4, lvw.Items.Count, "#A1");
1287                         Assert.AreEqual (null, lvw.Items [String.Empty], "#A2");
1288                         Assert.AreEqual (null, lvw.Items [null], "#A3");
1289                         Assert.AreSame (lvi1, lvw.Items ["A name"], "#A4");
1290                         Assert.AreSame (lvi1, lvw.Items ["a NAME"], "#A5");
1291                         Assert.AreSame (lvi2, lvw.Items ["Same name"], "#A6");
1292
1293                         ListViewItem lvi5 = new ListViewItem ("E");
1294                         lvw.Items.Add (lvi5);
1295                         lvi5.Name = "E name";
1296
1297                         Assert.AreSame (lvi5, lvw.Items ["E name"], "#B1");
1298                 }
1299
1300                 [Test]
1301                 public void ListViewItemCollectionTest_ContainsKey ()
1302                 {
1303                         ListView lvw = new ListView();
1304                         ListViewItem lvi1 = new ListViewItem("A");
1305                         lvi1.Name = "A name";
1306                         ListViewItem lvi2 = new ListViewItem("B");
1307                         lvi2.Name = "B name";
1308                         ListViewItem lvi3 = new ListViewItem("D");
1309                         lvi3.Name = String.Empty;
1310                         lvw.Items.AddRange(new ListViewItem[] { lvi1, lvi2, lvi3 });
1311
1312                         Assert.AreEqual(3, lvw.Items.Count, "#A1");
1313                         Assert.AreEqual(false, lvw.Items.ContainsKey (String.Empty), "#A2");
1314                         Assert.AreEqual(false, lvw.Items.ContainsKey (null), "#A3");
1315                         Assert.AreEqual(true, lvw.Items.ContainsKey ("A name"), "#A4");
1316                         Assert.AreEqual(true, lvw.Items.ContainsKey ("a NAME"), "#A5");
1317                         Assert.AreEqual(true, lvw.Items.ContainsKey ("B name"), "#A6");
1318
1319                         ListViewItem lvi5 = new ListViewItem("E");
1320                         lvw.Items.Add(lvi5);
1321                         lvi5.Name = "E name";
1322
1323                         Assert.AreEqual(true, lvw.Items.ContainsKey ("E name"), "#B1");
1324                 }
1325
1326                 [Test]
1327                 public void ListViewItemCollectionTest_Find ()
1328                 {
1329                         ListView lvw = new ListView ();
1330                         ListViewItem lvi1 = new ListViewItem ("A");
1331                         lvi1.Name = "A name";
1332                         ListViewItem lvi2 = new ListViewItem ("B");
1333                         lvi2.Name = "a NAME";
1334                         ListViewItem lvi3 = new ListViewItem ("C");
1335                         lvi3.Name = "a NAME";
1336                         ListViewItem lvi4 = new ListViewItem ("D");
1337                         lvi4.Name = String.Empty;
1338                         ListViewItem lvi5 = new ListViewItem ("F");
1339                         lvi5.Name = String.Empty;
1340                         lvw.Items.AddRange (new ListViewItem [] { lvi1, lvi2, lvi3, lvi4, lvi5 });
1341
1342                         Assert.AreEqual (5, lvw.Items.Count, "#A1");
1343
1344                         ListViewItem [] items = lvw.Items.Find ("A name", false);
1345                         Assert.AreEqual (3, items.Length, "#B11");
1346                         Assert.AreSame (lvi1, items [0], "#B2");
1347                         Assert.AreSame (lvi2, items [1], "#B3");
1348                         Assert.AreSame (lvi3, items [2], "#B4");
1349
1350                         items = lvw.Items.Find (String.Empty, false);
1351                         Assert.AreEqual (2, items.Length, "#B1");
1352                         Assert.AreSame (lvi4, items [0], "#B2");
1353                         Assert.AreSame (lvi5, items [1], "#B3");
1354
1355                         Assert.AreEqual (0, lvw.Items.Find (null, false).Length, "#C1");
1356                 }
1357
1358                 [Test]
1359                 public void ListViewSubItemCollectionTest_ContainsKey ()
1360                 {
1361                         ListViewItem lvi = new ListViewItem ("A");
1362                         ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
1363                         si1.Name = "A name";
1364                         ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
1365                         si2.Name = "B name";
1366                         ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
1367                         si3.Name = String.Empty;
1368                         lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3 });
1369
1370                         Assert.AreEqual (4, lvi.SubItems.Count, "#A1");
1371                         Assert.AreEqual (false, lvi.SubItems.ContainsKey (String.Empty), "#A2");
1372                         Assert.AreEqual (false, lvi.SubItems.ContainsKey (null), "#A3");
1373                         Assert.AreEqual (true, lvi.SubItems.ContainsKey ("A name"), "#A4");
1374                         Assert.AreEqual (true, lvi.SubItems.ContainsKey ("a NAME"), "#A5");
1375                         Assert.AreEqual (true, lvi.SubItems.ContainsKey ("B name"), "#A6");
1376
1377                         ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
1378                         lvi.SubItems.Add (si5);
1379                         si5.Name = "E name";
1380
1381                         Assert.AreEqual (true, lvi.SubItems.ContainsKey ("E name"), "#B1");
1382                 }
1383
1384                 [Test]
1385                 public void ListViewSubItemCollectionTest_IndexOfKey ()
1386                 {
1387                         ListViewItem lvi = new ListViewItem ();
1388                         ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
1389                         si1.Name = "A name";
1390                         ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
1391                         si2.Name = "Same name";
1392                         ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
1393                         si3.Name = "Same name";
1394                         ListViewItem.ListViewSubItem si4 = new ListViewItem.ListViewSubItem ();
1395                         si4.Name = String.Empty;
1396                         lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3, si4 });
1397
1398                         Assert.AreEqual (5, lvi.SubItems.Count, "#A1");
1399                         Assert.AreEqual (-1, lvi.SubItems.IndexOfKey (String.Empty), "#A2");
1400                         Assert.AreEqual (-1, lvi.SubItems.IndexOfKey (null), "#A3");
1401                         Assert.AreEqual (1, lvi.SubItems.IndexOfKey ("A name"), "#A4");
1402                         Assert.AreEqual (1, lvi.SubItems.IndexOfKey ("a NAME"), "#A5");
1403                         Assert.AreEqual (2, lvi.SubItems.IndexOfKey ("Same name"), "#A6");
1404
1405                         ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
1406                         lvi.SubItems.Add (si5);
1407                         si5.Name = "E name";
1408
1409                         Assert.AreEqual (5, lvi.SubItems.IndexOfKey ("E name"), "#B1");
1410                 }
1411
1412                 [Test]
1413                 public void ListViewSubItemCollectionTest_RemoveByKey ()
1414                 {
1415                         ListViewItem lvi = new ListViewItem ();
1416                         ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
1417                         si1.Name = "A name";
1418                         ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
1419                         si2.Name = "B name";
1420                         ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
1421                         si3.Name = "Same name";
1422                         ListViewItem.ListViewSubItem si4 = new ListViewItem.ListViewSubItem ();
1423                         si4.Name = "Same name";
1424                         ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
1425                         si5.Name = String.Empty;
1426                         lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3, si4, si5 });
1427
1428                         Assert.AreEqual (6, lvi.SubItems.Count, "#A1");
1429
1430                         lvi.SubItems.RemoveByKey ("B name");
1431                         Assert.AreEqual (5, lvi.SubItems.Count, "#B1");
1432                         Assert.AreSame (si1, lvi.SubItems [1], "#B2");
1433                         Assert.AreSame (si3, lvi.SubItems [2], "#B3");
1434                         Assert.AreSame (si4, lvi.SubItems [3], "#B4");
1435                         Assert.AreSame (si5, lvi.SubItems [4], "#B5");
1436
1437                         lvi.SubItems.RemoveByKey ("Same name");
1438                         Assert.AreEqual (4, lvi.SubItems.Count, "#C1");
1439                         Assert.AreSame (si1, lvi.SubItems [1], "#C2");
1440                         Assert.AreSame (si4, lvi.SubItems [2], "#C3");
1441                         Assert.AreSame (si5, lvi.SubItems [3], "#C4");
1442
1443                         lvi.SubItems.RemoveByKey ("a NAME");
1444                         Assert.AreEqual (3, lvi.SubItems.Count, "#D1");
1445                         Assert.AreSame (si4, lvi.SubItems [1], "#D2");
1446                         Assert.AreSame (si5, lvi.SubItems [2], "#D3");
1447
1448                         lvi.SubItems.RemoveByKey (String.Empty);
1449                         Assert.AreEqual (3, lvi.SubItems.Count, "#E1");
1450                         Assert.AreSame (si4, lvi.SubItems [1], "#E2");
1451                         Assert.AreSame (si5, lvi.SubItems [2], "#E3");
1452                 }
1453
1454                 [Test]
1455                 public void ListViewSubItemCollectionTest_Indexer ()
1456                 {
1457                         ListViewItem lvi = new ListViewItem ();
1458                         ListViewItem.ListViewSubItem si1 = new ListViewItem.ListViewSubItem ();
1459                         si1.Name = "A name";
1460                         ListViewItem.ListViewSubItem si2 = new ListViewItem.ListViewSubItem ();
1461                         si2.Name = "Same name";
1462                         ListViewItem.ListViewSubItem si3 = new ListViewItem.ListViewSubItem ();
1463                         si3.Name = "Same name";
1464                         ListViewItem.ListViewSubItem si4 = new ListViewItem.ListViewSubItem ();
1465                         si4.Name = String.Empty;
1466                         lvi.SubItems.AddRange (new ListViewItem.ListViewSubItem [] { si1, si2, si3, si4 });
1467
1468                         Assert.AreEqual (5, lvi.SubItems.Count, "#A1");
1469                         Assert.AreEqual (null, lvi.SubItems [String.Empty], "#A2");
1470                         Assert.AreEqual (null, lvi.SubItems [null], "#A3");
1471                         Assert.AreEqual (si1, lvi.SubItems ["A name"], "#A4");
1472                         Assert.AreEqual (si1, lvi.SubItems ["a NAME"], "#A5");
1473                         Assert.AreEqual (si2, lvi.SubItems ["Same name"], "#A6");
1474
1475                         ListViewItem.ListViewSubItem si5 = new ListViewItem.ListViewSubItem ();
1476                         lvi.SubItems.Add (si5);
1477                         si5.Name = "E name";
1478
1479                         Assert.AreEqual (si5, lvi.SubItems ["E name"], "#B1");
1480                 }
1481
1482                 static ListViewItem [] items;
1483
1484                 [Test]
1485                 public void ListViewItemCollectionTest_VirtualMode_Exceptions ()
1486                 {
1487                         ListView lvw = new ListView ();
1488                         lvw.VirtualMode = true;
1489                         lvw.VirtualListSize = 1;
1490                         lvw.RetrieveVirtualItem += ListViewRetrieveVirtualItemHandler;
1491
1492                         ListViewItem item = new ListViewItem ("Item 1");
1493                         item.Name = "A";
1494                         items = new ListViewItem [1];
1495                         items [0] = item;
1496
1497                         try {
1498                                 lvw.Items.Add ("Item 2");
1499                                 Assert.Fail ("#A1");
1500                         } catch (InvalidOperationException) {
1501                         }
1502
1503                         try {
1504                                 lvw.Items.AddRange (new ListViewItem [0]);
1505                                 Assert.Fail ("#A2");
1506                         } catch (InvalidOperationException) {
1507                         }
1508
1509                         try {
1510                                 lvw.Items.Insert (0, new ListViewItem ("Item 1"));
1511                                 Assert.Fail ("#A3");
1512                         } catch (InvalidOperationException) {
1513                         }
1514
1515                         try {
1516                                 lvw.Items.Remove (new ListViewItem ("Item 99"));
1517                                 Assert.Fail ("#A4");
1518                         } catch (InvalidOperationException) {
1519                         }
1520
1521                         try {
1522                                 lvw.Items.RemoveAt (0);
1523                                 Assert.Fail ("#A5");
1524                         } catch (InvalidOperationException) {
1525                         }
1526
1527                         try {
1528                                 lvw.Items.RemoveByKey ("A");
1529                                 Assert.Fail ("#A6");
1530                         } catch (InvalidOperationException) {
1531                         }
1532
1533                         try {
1534                                 lvw.Items.GetEnumerator ();
1535                                 Assert.Fail ("#A7");
1536                         } catch (InvalidOperationException) {
1537                         }
1538                 }
1539
1540                 void ListViewRetrieveVirtualItemHandler (object o, RetrieveVirtualItemEventArgs args)
1541                 {
1542                         args.Item = items [args.ItemIndex];
1543                 }
1544 #endif
1545
1546         }
1547 }