Merge pull request #82 from Unity-Technologies/master-gc-race
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / CheckedListBoxTest.cs
1 //
2 // Copyright (c) 2005 Novell, Inc.
3 //
4 // Authors:
5 //              Ritvik Mayank (mritvik@novell.com)
6 //              Gert Driesen (drieseng@users.sourceforge.net)
7 //
8
9 using System;
10 using System.Collections;
11 using System.ComponentModel;
12 using System.Drawing;
13 using System.Reflection;
14 using System.Windows.Forms;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.System.Windows.Forms
19 {
20         [TestFixture]
21         public class CheckedListBoxTest : TestHelper
22         {
23                 [Test]
24                 public void CheckedListBoxPropertyTest () 
25                 {
26                         Form myform = new Form ();
27                         myform.ShowInTaskbar = false;
28                         myform.Visible = true;
29                         CheckedListBox mychklistbox = new CheckedListBox ();
30                         ArrayList checked_items = new ArrayList (2);
31                         ArrayList checked_pos = new ArrayList (2);
32                         mychklistbox.Items.Add ("test1", true);
33                         checked_items.Add ("test1"); checked_pos.Add (0);
34                         mychklistbox.Items.Add ("test2");
35                         mychklistbox.Items.Add ("test3", true);
36                         checked_items.Add ("test3"); checked_pos.Add (2);
37                         mychklistbox.Visible = true;
38                         myform.Controls.Add (mychklistbox);
39                         Assert.AreEqual (checked_items.Count, mychklistbox.CheckedIndices.Count, "#1");
40                         Assert.AreEqual (checked_items.Count, mychklistbox.CheckedItems.Count, "#2");
41                         foreach (object o in mychklistbox.CheckedItems) 
42                         {
43                                 Assert.IsTrue (checked_items.Contains (o),"#3");
44                                 checked_items.Remove (o);
45                         }
46
47                         Assert.AreEqual (0, checked_items.Count);
48                         for (int i = 0; i < mychklistbox.Items.Count; ++i) 
49                         {
50                                 if (checked_pos.Contains (i))
51                                         Assert.AreEqual (CheckState.Checked, mychklistbox.GetItemCheckState (i),"#4");
52                                 else
53                                         Assert.IsFalse (CheckState.Checked == mychklistbox.GetItemCheckState (i),"#5");
54                         }
55                         Assert.AreEqual (false, mychklistbox.CheckOnClick, "#6");
56                         Assert.AreEqual (3, mychklistbox.Items.Count, "#7");
57                         Assert.AreEqual (SelectionMode.One, mychklistbox.SelectionMode, "#8");
58                         Assert.AreEqual (false , mychklistbox.ThreeDCheckBoxes, "#9");
59                         myform.Dispose ();
60                 }
61
62                 [Test]
63                 [NUnit.Framework.Category ("NotWorking")]
64                 public void DisplayMember_HandleCreated ()
65                 {
66                         MockItem itemA = new MockItem ("A1", 1);
67                         MockItem itemB = new MockItem ("B2", 2);
68                         MockItem itemC = new MockItem ("C3", 3);
69                         MockItem itemD = new MockItem ("D4", 4);
70                         MockItem itemE = new MockItem ("E5", 5);
71                         MockItem itemF = new MockItem ("F6", 6);
72
73                         CheckedListBox clb = new CheckedListBox ();
74                         clb.Items.Add (itemA, true);
75                         clb.Items.Add (itemC, false);
76                         clb.Items.Add (itemB, true);
77
78                         Form form = new Form ();
79                         form.ShowInTaskbar = false;
80                         form.Controls.Add (clb);
81                         form.Show ();
82
83                         Assert.AreEqual (string.Empty, clb.Text, "#A1");
84                         clb.SelectedIndex = 1;
85                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#A2");
86                         clb.DisplayMember = "Text";
87                         Assert.AreEqual ("C3", clb.Text, "#A3");
88                         clb.SelectedIndex = 2;
89                         Assert.AreEqual ("B2", clb.Text, "#A4");
90
91                         clb.Text = "C3";
92                         Assert.AreEqual (1, clb.SelectedIndex, "#B1");
93                         Assert.AreEqual ("C3", clb.Text, "#B2");
94                         clb.Text = "B";
95                         Assert.AreEqual (1, clb.SelectedIndex, "#B3");
96                         Assert.AreEqual ("C3", clb.Text, "#B4");
97
98                         ArrayList itemList = new ArrayList ();
99                         itemList.Add (itemD);
100                         itemList.Add (itemE);
101                         itemList.Add (itemF);
102
103                         clb.DataSource = itemList;
104                         clb.DisplayMember = string.Empty;
105                         clb.SelectedIndex = 1;
106
107                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#C1");
108                         clb.DisplayMember = "Text";
109                         Assert.AreEqual ("E5", clb.Text, "#C2");
110                         clb.SelectedIndex = 2;
111                         Assert.AreEqual ("F6", clb.Text, "#C3");
112
113                         clb.Text = "E5";
114                         Assert.AreEqual (1, clb.SelectedIndex, "#D1");
115                         Assert.AreEqual ("E5", clb.Text, "#D2");
116                         clb.Text = "D";
117                         Assert.AreEqual (1, clb.SelectedIndex, "#D3");
118                         Assert.AreEqual ("E5", clb.Text, "#D4");
119
120                         form.Dispose ();
121                 }
122
123                 [Test]
124                 [NUnit.Framework.Category ("NotWorking")]
125                 public void DisplayMember_HandleNotCreated ()
126                 {
127                         MockItem itemA = new MockItem ("A1", 1);
128                         MockItem itemB = new MockItem ("B2", 2);
129                         MockItem itemC = new MockItem ("C3", 3);
130                         MockItem itemD = new MockItem ("D4", 4);
131                         MockItem itemE = new MockItem ("E5", 5);
132                         MockItem itemF = new MockItem ("F6", 6);
133
134                         CheckedListBox clb = new CheckedListBox ();
135                         clb.Items.Add (itemA, true);
136                         clb.Items.Add (itemC, false);
137                         clb.Items.Add (itemB, true);
138
139                         Assert.AreEqual (string.Empty, clb.Text, "#A1");
140                         clb.SelectedIndex = 1;
141                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#A2");
142                         clb.DisplayMember = "Text";
143                         Assert.AreEqual ("C3", clb.Text, "#A3");
144                         clb.SelectedIndex = 2;
145                         Assert.AreEqual ("B2", clb.Text, "#A4");
146
147                         clb.Text = "C3";
148                         Assert.AreEqual (1, clb.SelectedIndex, "#B1");
149                         Assert.AreEqual ("C3", clb.Text, "#B2");
150                         clb.Text = "C";
151                         Assert.AreEqual (1, clb.SelectedIndex, "#B3");
152                         Assert.AreEqual ("C3", clb.Text, "#B4");
153
154                         ArrayList itemList = new ArrayList ();
155                         itemList.Add (itemD);
156                         itemList.Add (itemE);
157                         itemList.Add (itemF);
158
159                         clb.DataSource = itemList;
160                         clb.DisplayMember = string.Empty;
161                         clb.SelectedIndex = 1;
162
163                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#C1");
164                         clb.DisplayMember = "Text";
165                         Assert.AreEqual ("C3", clb.Text, "#C2");
166                         clb.SelectedIndex = 2;
167                         Assert.AreEqual ("B2", clb.Text, "#C3");
168                 }
169
170                 [Test]
171                 public void GetItemCheckedTest ()
172                 {
173                         Form f = new Form ();
174                         f.ShowInTaskbar = false;
175                         f.Visible = true;
176                         CheckedListBox mychklistbox = new CheckedListBox ();
177                         mychklistbox.Items.Add ("test1",true);
178                         mychklistbox.Items.Add ("test2",CheckState.Indeterminate);
179                         mychklistbox.Items.Add ("test3");
180                         mychklistbox.Visible = true;
181                         f.Controls.Add (mychklistbox);
182                         Assert.AreEqual (true, mychklistbox.GetItemChecked (0), "#10");
183                         Assert.AreEqual (true, mychklistbox.GetItemChecked (1), "#11");
184                         Assert.AreEqual (false, mychklistbox.GetItemChecked (2), "#12");
185                         f.Dispose ();
186                 }       
187
188                 [Test]
189                 [ExpectedException (typeof (ArgumentOutOfRangeException) )]
190                 public void GetItemCheckedExceptionTest ()
191                 {
192                         CheckedListBox mychklistbox = new CheckedListBox ();
193                         mychklistbox.Items.Add ("test1",true);
194                         Assert.AreEqual (true, mychklistbox.GetItemChecked (1), "#13");
195                 }
196
197                 [Test]
198                 public void GetItemCheckStateTest ()
199                 {
200                         Form f = new Form ();
201                         f.ShowInTaskbar = false;
202                         f.Visible = true;
203                         CheckedListBox mychklistbox = new CheckedListBox ();
204                         mychklistbox.Items.Add ("test1",true);
205                         mychklistbox.Items.Add ("test2",CheckState.Indeterminate);
206                         mychklistbox.Items.Add ("test3");
207                         mychklistbox.Visible = true;
208                         f.Controls.Add (mychklistbox);
209                         Assert.AreEqual (CheckState.Checked, mychklistbox.GetItemCheckState (0), "#14");
210                         Assert.AreEqual (CheckState.Indeterminate, mychklistbox.GetItemCheckState (1), "#15");
211                         Assert.AreEqual (CheckState.Unchecked, mychklistbox.GetItemCheckState (2), "#16");
212                         f.Dispose ();
213                 }
214
215                 [Test]
216                 public void SelectionMode_Invalid ()
217                 {
218                         CheckedListBox clb = new CheckedListBox ();
219
220                         try {
221                                 clb.SelectionMode = SelectionMode.MultiSimple;
222                                 Assert.Fail ("#A1");
223                         } catch (ArgumentException ex) {
224                                 // Multi selection not supported on CheckedListBox
225                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
226                                 Assert.IsNotNull (ex.Message, "#A3");
227                                 Assert.IsNull (ex.ParamName, "#A4");
228                                 Assert.IsNull (ex.InnerException, "#A5");
229                         }
230
231                         try {
232                                 clb.SelectionMode = SelectionMode.MultiExtended;
233                                 Assert.Fail ("#B1");
234                         } catch (ArgumentException ex) {
235                                 // Multi selection not supported on CheckedListBox
236                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
237                                 Assert.IsNotNull (ex.Message, "#B3");
238                                 Assert.IsNull (ex.ParamName, "#B4");
239                                 Assert.IsNull (ex.InnerException, "#B5");
240                         }
241
242                         try {
243                                 clb.SelectionMode = (SelectionMode) 666;
244                                 Assert.Fail ("#C1");
245                         } catch (InvalidEnumArgumentException ex) {
246                                 Assert.AreEqual (typeof (InvalidEnumArgumentException), ex.GetType (), "#C2");
247                                 Assert.IsNotNull (ex.Message, "#C3");
248                                 Assert.IsNotNull (ex.ParamName, "#C4");
249                                 Assert.AreEqual ("value", ex.ParamName, "#C5");
250                                 Assert.IsNull (ex.InnerException, "#C6");
251                         }
252                 }
253
254                 [Test]
255                 public void SetItemCheckedTest ()
256                 {
257                         Form myform = new Form ();
258                         myform.ShowInTaskbar = false;
259                         myform.Visible = true;
260                         CheckedListBox mychklistbox = new CheckedListBox ();
261                         mychklistbox.Items.Add ("test1");
262                         mychklistbox.Items.Add ("test2");
263                         mychklistbox.Visible = true;
264                         myform.Controls.Add (mychklistbox);
265                         mychklistbox.SetItemChecked (0,true);
266                         mychklistbox.SetItemChecked (1,false);
267                         Assert.AreEqual (CheckState.Checked, mychklistbox.GetItemCheckState (0), "#17");
268                         Assert.AreEqual (CheckState.Unchecked, mychklistbox.GetItemCheckState (1), "#18");
269                         myform.Dispose ();
270                 }
271
272                 [Test]
273                 public void SetItemCheckStateTest ()
274                 {
275                         Form myform = new Form ();
276                         myform.ShowInTaskbar = false;
277                         myform.Visible = true;
278                         CheckedListBox mychklistbox = new CheckedListBox ();
279                         mychklistbox.Items.Add ("test1");
280                         mychklistbox.Items.Add ("test2");
281                         mychklistbox.Items.Add ("test3");
282                         mychklistbox.Visible = true;
283                         myform.Controls.Add (mychklistbox);
284                         mychklistbox.SetItemCheckState (0,CheckState.Checked);
285                         mychklistbox.SetItemCheckState (1,CheckState.Indeterminate);
286                         mychklistbox.SetItemCheckState (2,CheckState.Unchecked);
287                         Assert.AreEqual (CheckState.Checked, mychklistbox.GetItemCheckState (0), "#19");
288                         Assert.AreEqual (CheckState.Indeterminate, mychklistbox.GetItemCheckState (1), "#20");
289                         Assert.AreEqual (CheckState.Unchecked, mychklistbox.GetItemCheckState (2), "#21");
290                         myform.Dispose ();
291                 }
292
293 #if NET_2_0
294                 // Fails on 1.1 (both MS and Mono) because SelectedIndex is set
295                 [Test]
296                 public void Text_SelectionMode_None ()
297                 {
298                         MockItem itemA = new MockItem ("A1", 1);
299                         MockItem itemB = new MockItem ("B2", 2);
300                         MockItem itemC = new MockItem ("C3", 3);
301                         MockItem itemD = new MockItem ("C3", 4);
302                         MockItem itemE = new MockItem ("", 5);
303                         MockItem itemF = new MockItem (null, 6);
304
305                         ArrayList itemList = new ArrayList ();
306                         itemList.Add (itemA);
307                         itemList.Add (itemC);
308                         itemList.Add (itemB);
309                         itemList.Add (itemD);
310                         itemList.Add (itemE);
311                         itemList.Add (itemF);
312
313                         CheckedListBox clb = new CheckedListBox ();
314                         clb.DisplayMember = "Text";
315                         clb.DataSource = itemList;
316                         clb.SelectionMode = SelectionMode.None;
317
318                         Form form = new Form ();
319                         form.ShowInTaskbar = false;
320                         form.Controls.Add (clb);
321                         form.Show ();
322
323                         Assert.AreEqual (string.Empty, clb.Text, "#A1");
324                         Assert.AreEqual (-1, clb.SelectedIndex, "#A2");
325
326                         clb.Text = "B2";
327                         Assert.AreEqual ("B2", clb.Text, "#B1");
328                         Assert.AreEqual (-1, clb.SelectedIndex, "#B2");
329
330                         clb.Text = "D";
331                         Assert.AreEqual ("D", clb.Text, "#C1");
332                         Assert.AreEqual (-1, clb.SelectedIndex, "#C2");
333
334                         clb.Text = "Doesnotexist";
335                         Assert.AreEqual ("Doesnotexist", clb.Text, "#D1");
336                         Assert.AreEqual (-1, clb.SelectedIndex, "#D2");
337
338                         clb.Text = string.Empty;
339                         Assert.AreEqual (string.Empty, clb.Text, "#E1");
340                         Assert.AreEqual (-1, clb.SelectedIndex, "#E2");
341
342                         clb.Text = null;
343                         Assert.AreEqual (string.Empty, clb.Text, "#F1");
344                         Assert.AreEqual (-1, clb.SelectedIndex, "#F2");
345
346                         form.Dispose ();
347                 }
348
349                 [Test]
350                 public void AllowSelection ()
351                 {
352                         MockCheckedListBox clb = new MockCheckedListBox ();
353                         clb.SelectionMode = SelectionMode.None;
354                         Assert.IsFalse (clb.allow_selection, "#1");
355                         clb.SelectionMode = SelectionMode.One;
356                         Assert.IsTrue (clb.allow_selection, "#2");
357                 }
358 #endif
359
360                 [Test]
361                 public void Text_SelectionMode_One ()
362                 {
363                         MockItem itemA = new MockItem ("A1", 1);
364                         MockItem itemB = new MockItem ("B2", 2);
365                         MockItem itemC = new MockItem ("C3", 3);
366                         MockItem itemD = new MockItem ("C3", 4);
367                         MockItem itemE = new MockItem ("", 5);
368                         MockItem itemF = new MockItem (null, 6);
369
370                         ArrayList itemList = new ArrayList ();
371                         itemList.Add (itemA);
372                         itemList.Add (itemC);
373                         itemList.Add (itemB);
374                         itemList.Add (itemD);
375                         itemList.Add (itemE);
376                         itemList.Add (itemF);
377
378                         CheckedListBox clb = new CheckedListBox ();
379                         clb.DisplayMember = "Text";
380                         clb.DataSource = itemList;
381                         clb.SelectionMode = SelectionMode.One;
382
383                         Form form = new Form ();
384                         form.ShowInTaskbar = false;
385                         form.Controls.Add (clb);
386                         form.Show ();
387
388                         Assert.AreEqual ("A1", clb.Text, "#A1");
389                         Assert.AreEqual (0, clb.SelectedIndex, "#A2");
390
391                         clb.Text = "B2";
392                         Assert.AreEqual ("B2", clb.Text, "#B1");
393                         Assert.AreEqual (2, clb.SelectedIndex, "#B2");
394                         Assert.AreEqual (1, clb.SelectedItems.Count, "#B3");
395                         Assert.AreSame (itemB, clb.SelectedItems [0], "#B4");
396
397                         clb.Text = "D";
398                         Assert.AreEqual ("B2", clb.Text, "#C1");
399                         Assert.AreEqual (2, clb.SelectedIndex, "#C2");
400                         Assert.AreEqual (1, clb.SelectedItems.Count, "#C3");
401                         Assert.AreSame (itemB, clb.SelectedItems [0], "#C4");
402
403                         clb.Text = "Doesnotexist";
404                         Assert.AreEqual ("B2", clb.Text, "#D1");
405                         Assert.AreEqual (2, clb.SelectedIndex, "#D2");
406                         Assert.AreEqual (1, clb.SelectedItems.Count, "#D3");
407                         Assert.AreSame (itemB, clb.SelectedItems [0], "#D4");
408
409                         clb.Text = "C3";
410                         Assert.AreEqual ("C3", clb.Text, "#E1");
411                         Assert.AreEqual (1, clb.SelectedIndex, "#E2");
412                         Assert.AreEqual (1, clb.SelectedItems.Count, "#E3");
413                         Assert.AreSame (itemC, clb.SelectedItems [0], "#E4");
414
415                         clb.Text = string.Empty;
416                         Assert.AreEqual (string.Empty, clb.Text, "#F1");
417                         Assert.AreEqual (4, clb.SelectedIndex, "#F2");
418                         Assert.AreEqual (1, clb.SelectedItems.Count, "#F3");
419                         Assert.AreSame (itemE, clb.SelectedItems [0], "#F4");
420
421                         clb.Text = null;
422                         Assert.AreEqual (string.Empty, clb.Text, "#G1");
423                         Assert.AreEqual (4, clb.SelectedIndex, "#G2");
424                         Assert.AreEqual (1, clb.SelectedItems.Count, "#G3");
425                         Assert.AreSame (itemE, clb.SelectedItems [0], "#G4");
426
427                         clb.SelectedIndex = -1;
428                         Assert.AreEqual ("A1", clb.Text, "#H1");
429                         Assert.AreEqual (0, clb.SelectedIndex, "#H2");
430                         Assert.AreEqual (1, clb.SelectedItems.Count, "#H3");
431                         Assert.AreSame (itemA, clb.SelectedItems [0], "#H4");
432
433                         form.Dispose ();
434                 }
435
436                 [Test]
437                 [NUnit.Framework.Category ("NotWorking")]
438                 public void ValueMember_HandleCreated ()
439                 {
440                         MockItem itemA = new MockItem ("A", 1);
441                         MockItem itemB = new MockItem ("B", 2);
442                         MockItem itemC = new MockItem ("C", 3);
443                         MockItem itemD = new MockItem ("D", 4);
444                         MockItem itemE = new MockItem ("E", 5);
445
446                         CheckedListBox clb = new CheckedListBox ();
447                         clb.Items.Add (itemA, true);
448                         clb.Items.Add (itemC, false);
449                         clb.Items.Add (itemB, true);
450                         clb.SelectedIndex = 1;
451
452                         Form form = new Form ();
453                         form.ShowInTaskbar = false;
454                         form.Controls.Add (clb);
455                         form.Show ();
456
457                         Assert.AreEqual (string.Empty, clb.ValueMember, "#A1");
458                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#A2");
459                         Assert.IsNull (clb.SelectedValue, "#A3");
460
461                         clb.ValueMember = "Value";
462                         Assert.AreEqual ("Value", clb.ValueMember, "#B1");
463                         Assert.AreEqual ("3", clb.Text, "#B2");
464                         Assert.IsNull (clb.SelectedValue, "#B3");
465
466                         clb.DisplayMember = "Text";
467                         Assert.AreEqual ("Value", clb.ValueMember, "#C1");
468                         Assert.AreEqual ("C", clb.Text, "#C2");
469                         Assert.IsNull (clb.SelectedValue, "#C3");
470
471                         ArrayList itemList = new ArrayList ();
472                         itemList.Add (itemD);
473                         itemList.Add (itemE);
474
475                         clb.DataSource = itemList;
476                         clb.ValueMember = string.Empty;
477                         clb.DisplayMember = string.Empty;
478                         clb.SelectedIndex = 1;
479
480                         Assert.AreEqual (string.Empty, clb.ValueMember, "#D1");
481                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#D2");
482                         Assert.IsNotNull (clb.SelectedValue, "#D3");
483                         Assert.AreSame (itemE, clb.SelectedValue, "#D4");
484
485                         clb.ValueMember = "Value";
486                         Assert.AreEqual ("Value", clb.ValueMember, "#E1");
487                         Assert.AreEqual ("5", clb.Text, "#E2");
488                         Assert.IsNotNull (clb.SelectedValue, "#E3");
489                         Assert.AreEqual (5, clb.SelectedValue, "#E4");
490
491                         clb.DisplayMember = "Text";
492                         Assert.AreEqual ("Value", clb.ValueMember, "#F1");
493                         Assert.AreEqual ("E", clb.Text, "#F2");
494                         Assert.IsNotNull (clb.SelectedValue, "#F3");
495                         Assert.AreEqual (5, clb.SelectedValue, "#F4");
496
497                         form.Dispose ();
498                 }
499
500                 [Test]
501                 [NUnit.Framework.Category ("NotWorking")]
502                 public void ValueMember_HandleNotCreated ()
503                 {
504                         MockItem itemA = new MockItem ("A", 1);
505                         MockItem itemB = new MockItem ("B", 2);
506                         MockItem itemC = new MockItem ("C", 3);
507                         MockItem itemD = new MockItem ("D", 4);
508                         MockItem itemE = new MockItem ("E", 5);
509
510                         CheckedListBox clb = new CheckedListBox ();
511                         clb.Items.Add (itemA, true);
512                         clb.Items.Add (itemC, false);
513                         clb.Items.Add (itemB, true);
514                         clb.SelectedIndex = 1;
515
516                         Assert.AreEqual (string.Empty, clb.ValueMember, "#A1");
517                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#A2");
518                         Assert.IsNull (clb.SelectedValue, "#A3");
519
520                         clb.ValueMember = "Value";
521                         Assert.AreEqual ("Value", clb.ValueMember, "#B1");
522                         Assert.AreEqual ("3", clb.Text, "#B2");
523                         Assert.IsNull (clb.SelectedValue, "#B3");
524
525                         clb.DisplayMember = "Text";
526                         Assert.AreEqual ("Value", clb.ValueMember, "#C1");
527                         Assert.AreEqual ("C", clb.Text, "#C2");
528                         Assert.IsNull (clb.SelectedValue, "#C3");
529
530                         ArrayList itemList = new ArrayList ();
531                         itemList.Add (itemD);
532                         itemList.Add (itemE);
533
534                         clb.DataSource = itemList;
535                         clb.ValueMember = string.Empty;
536                         clb.DisplayMember = string.Empty;
537                         clb.SelectedIndex = 1;
538
539                         Assert.AreEqual (string.Empty, clb.ValueMember, "#D1");
540                         Assert.AreEqual (itemC.GetType ().FullName, clb.Text, "#D2");
541                         Assert.IsNull (clb.SelectedValue, "#D3");
542
543                         clb.ValueMember = "Value";
544                         Assert.AreEqual ("Value", clb.ValueMember, "#E1");
545                         Assert.AreEqual ("3", clb.Text, "#E2");
546                         Assert.IsNull (clb.SelectedValue, "#E3");
547
548                         clb.DisplayMember = "Text";
549                         Assert.AreEqual ("Value", clb.ValueMember, "#F1");
550                         Assert.AreEqual ("C", clb.Text, "#F2");
551                         Assert.IsNull (clb.SelectedValue, "#F3");       
552                 }
553
554                 public class MockCheckedListBox : CheckedListBox
555                 {
556 #if NET_2_0
557                         public bool allow_selection {
558                                 get { return base.AllowSelection; }
559                         }
560 #endif
561                 }
562
563                 //--------------------------------------------------------------
564                 // Add method checking add index and event when sorted and not.
565
566                 public static object[] Items = new string[] { "c", "a", "d", "b", };
567                 //
568                 public static int[] ExpectedAddPositionsSorted = { 0, 0, 2, 1 };
569                 public static int[] ExpectedAddPositionsUnsorted = { 0, 1, 2, 3 };
570                 //
571                 const string ExpectedEventsUnchecked = "";
572                 const string ExpectedEventsCheckedSorted
573                         = "ItemCheck, index 0, is: Unchecked, will be: Checked, item is: 'c'" + ", CheckedIndices: { }" + ";\n"
574                         + "ItemCheck, index 0, is: Unchecked, will be: Checked, item is: 'a'" + ", CheckedIndices: { '1', }" + ";\n"
575                         + "ItemCheck, index 2, is: Unchecked, will be: Checked, item is: 'd'" + ", CheckedIndices: { '0', '1', }" + ";\n"
576                         + "ItemCheck, index 1, is: Unchecked, will be: Checked, item is: 'b'" + ", CheckedIndices: { '0', '2', '3', }" + ";\n";
577                 const string ExpectedEventsCheckedUnsorted
578                         = "ItemCheck, index 0, is: Unchecked, will be: Checked, item is: 'c'" + ", CheckedIndices: { }" + ";\n"
579                         + "ItemCheck, index 1, is: Unchecked, will be: Checked, item is: 'a'" + ", CheckedIndices: { '0', }" + ";\n"
580                         + "ItemCheck, index 2, is: Unchecked, will be: Checked, item is: 'd'" + ", CheckedIndices: { '0', '1', }" + ";\n"
581                         + "ItemCheck, index 3, is: Unchecked, will be: Checked, item is: 'b'" + ", CheckedIndices: { '0', '1', '2', }" + ";\n";
582
583                 class ItemCheckLoggingReceiver
584                 {
585                         public string _allItemCheckEvents;
586
587                         public void HandleItemCheck (object sender, ItemCheckEventArgs e)
588                         {
589                                 CheckedListBox clb = (CheckedListBox)sender;
590                                 string text
591                                         = String.Format ("ItemCheck, index {0}, is: {1}, will be: {2}, item is: '{3}'" + ", CheckedIndices: {{ {4}}}" + ";\n",
592                                                 e.Index, e.CurrentValue, e.NewValue, clb.Items[e.Index], Join (clb.CheckedIndices));
593                                 _allItemCheckEvents += text;
594                         }
595                 }
596
597                 [Test]
598                 public void AddCheckedBoolToSorted ()
599                 {
600                         AddBoolItems (true, Items, true, ExpectedAddPositionsSorted, ExpectedEventsCheckedSorted);
601                 }
602
603                 [Test]
604                 public void AddUncheckedBoolToSorted ()
605                 {
606                         AddBoolItems (true, Items, false, ExpectedAddPositionsSorted, ExpectedEventsUnchecked);
607                 }
608
609                 [Test]
610                 public void AddCheckedBoolToUnsorted ()
611                 {
612                         AddBoolItems (false, Items, true, ExpectedAddPositionsUnsorted, ExpectedEventsCheckedUnsorted);
613                 }
614
615                 [Test]
616                 public void AddUncheckedBoolToUnsorted ()
617                 {
618                         AddBoolItems (false, Items, false, ExpectedAddPositionsUnsorted, ExpectedEventsUnchecked);
619                 }
620
621                 void AddBoolItems (bool sorted, object[] items, bool isChecked, int[] expectedAddPositions, string expectedEvents)
622                 {
623                         CheckedListBox clb = new CheckedListBox ();
624                         clb.Sorted = sorted;
625                         ItemCheckLoggingReceiver target = new ItemCheckLoggingReceiver ();
626                         clb.ItemCheck += new ItemCheckEventHandler (target.HandleItemCheck);
627                         target._allItemCheckEvents = String.Empty;
628                         ArrayList addedAtList = new ArrayList ();
629                         foreach (object cur in items) {
630                                 int idx = clb.Items.Add (cur, isChecked);
631                                 addedAtList.Add (idx);
632                         }
633                         if (isChecked)
634                                 AssertAllItemsChecked (clb);
635                         else
636                                 AssertAllItemsUnchecked (clb);
637                         Assert.AreEqual ((Array)expectedAddPositions, (Array)addedAtList.ToArray (typeof (int)), "addedAtList");
638                         Assert.AreEqual (expectedEvents, target._allItemCheckEvents, "events");
639                 }
640
641                 [Test]
642                 public void AddCheckedCheckStateToSorted ()
643                 {
644                         AddCheckStateItems (true, Items, CheckState.Checked, ExpectedAddPositionsSorted, ExpectedEventsCheckedSorted);
645                 }
646
647                 [Test]
648                 public void AddUncheckedCheckStateToSorted ()
649                 {
650                         AddCheckStateItems (true, Items, CheckState.Unchecked, ExpectedAddPositionsSorted, ExpectedEventsUnchecked);
651                 }
652
653                 [Test]
654                 public void AddCheckedCheckStateToUnsorted ()
655                 {
656                         AddCheckStateItems (false, Items, CheckState.Checked, ExpectedAddPositionsUnsorted, ExpectedEventsCheckedUnsorted);
657                 }
658
659                 [Test]
660                 public void AddUncheckedCheckStateToUnsorted ()
661                 {
662                         AddCheckStateItems (false, Items, CheckState.Unchecked, ExpectedAddPositionsUnsorted, ExpectedEventsUnchecked);
663                 }
664
665                 void AddCheckStateItems (bool sorted, object[] items, CheckState checkState, int[] expectedAddPositions, string expectedEvents)
666                 {
667                         CheckedListBox clb = new CheckedListBox ();
668                         clb.Sorted = sorted;
669                         ItemCheckLoggingReceiver target = new ItemCheckLoggingReceiver ();
670                         clb.ItemCheck += new ItemCheckEventHandler (target.HandleItemCheck);
671                         target._allItemCheckEvents = String.Empty;
672                         ArrayList addedAtList = new ArrayList ();
673                         foreach (object cur in items) {
674                                 int idx = clb.Items.Add (cur, checkState);
675                                 addedAtList.Add (idx);
676                         }
677                         if (checkState != CheckState.Unchecked)
678                                 AssertAllItemsChecked (clb);
679                         else
680                                 AssertAllItemsUnchecked (clb);
681                         Assert.AreEqual ((Array)expectedAddPositions, (Array)addedAtList.ToArray (typeof (int)), "addedAtList");
682                         Assert.AreEqual (expectedEvents, target._allItemCheckEvents, "events");
683                 }
684
685                 static void AssertAllItemsChecked (CheckedListBox clb)
686                 {
687                         //Dump("clb.Items", clb.Items);
688                         //Dump("clb.CheckedIndices", clb.CheckedIndices);
689                         //Dump("clb.CheckedItems", clb.CheckedItems);
690                         Assert.AreEqual (clb.Items.Count, clb.CheckedIndices.Count, "checked count");
691                         for (int i = 0; i < clb.Items.Count; ++i)
692                                 Assert.AreEqual (i, clb.CheckedIndices[i], "CheckedIndices[i] @" + i);
693                         for (int i = 0; i < clb.Items.Count; ++i)
694                                 Assert.AreEqual (clb.Items[i], clb.CheckedItems[i], "CheckedItems[i] @" + i);
695                 }
696
697                 static void AssertAllItemsUnchecked (CheckedListBox clb)
698                 {
699                         Assert.AreEqual (0, clb.CheckedIndices.Count, "checked count");
700                         Assert.AreEqual (clb.CheckedIndices.Count, clb.CheckedItems.Count, "checked consistency");
701                 }
702
703
704                 //----
705                 static string Join (IEnumerable list)
706                 {
707                         global::System.Text.StringBuilder bldr = new global::System.Text.StringBuilder ();
708                         bldr.Append ("'");
709                         foreach (object cur in list) {
710                                 bldr.Append (cur);
711                                 bldr.Append ("', '");
712                         }
713                         bldr.Append ("'");
714                         bldr.Length -= 2;
715                         return bldr.ToString ();
716                 }
717
718                 //static void Dump (string name, IEnumerable list)
719                 //{
720                 //      Console.Write (name);
721                 //      Console.Write (" ");
722                 //      Dump (list);
723                 //}
724                 //
725                 //static void Dump (IEnumerable list)
726                 //{
727                 //      Console.WriteLine ("[" + Join (list) + "]");
728                 //}
729
730                 //--------
731                 // Check that if the ItemCheck event handler changes the NewValue property 
732                 // that the new value is used for the item state.
733
734                 [Test]
735                 public void ItemCheckSetNewValue_Adding()
736                 {
737                         CheckedListBox clb = new CheckedListBox();
738                         ItemCheckNewValueSetReceiver target = new ItemCheckNewValueSetReceiver();
739                         clb.ItemCheck += new ItemCheckEventHandler(target.HandleItemCheck);
740                         int idx;
741                         // Unchecked addition.  Note these are not touched by the event
742                         // as there's no 'check' action.
743                         target._checkState = CheckState.Indeterminate;
744                         idx = clb.Items.Add("aaU_x", false);
745                         Assert.IsFalse(clb.CheckedIndices.Contains(idx), "U_x " + idx);
746                         target._checkState = CheckState.Unchecked;
747                         idx = clb.Items.Add("aaU_U", false);
748                         Assert.IsFalse(clb.CheckedIndices.Contains(idx), "U_U " + idx);
749                         target._checkState = CheckState.Checked;
750                         idx = clb.Items.Add("aaU_C", false);
751                         Assert.IsFalse(clb.CheckedIndices.Contains(idx), "U_C " + idx);
752                         // Checked addition
753                         idx = clb.Items.Add("aaC_x", true);
754                         Assert.IsTrue(clb.CheckedIndices.Contains(idx), "U_x " + idx);
755                         target._checkState = CheckState.Unchecked;
756                         idx = clb.Items.Add("aaC_U", true);
757                         Assert.IsFalse(clb.CheckedIndices.Contains(idx), "C_U " + idx);
758                         target._checkState = CheckState.Checked;
759                         idx = clb.Items.Add("aaC_C", true);
760                         Assert.IsTrue(clb.CheckedIndices.Contains(idx), "C_C " + idx);
761                 }
762
763                 [Test]
764                 public void ItemCheckSetNewValue_Setting()
765                 {
766                         CheckedListBox clb = new CheckedListBox();
767                         ItemCheckNewValueSetReceiver target = new ItemCheckNewValueSetReceiver();
768                         clb.Items.Add("aaaa");
769                         clb.ItemCheck += new ItemCheckEventHandler(target.HandleItemCheck);
770                         const int idx = 0;
771                         // Note here the SetItemChecked(idx, false) actions *do* raise an item 
772                         // check event so the result is touched by the event handler.
773                         // Uncheck!
774                         SetInitialState(clb, idx, true, target);
775                         target._checkState = CheckState.Indeterminate;
776                         clb.SetItemChecked(idx, false);
777                         Assert.IsFalse(clb.CheckedIndices.Contains(idx), "C_U_x ");
778                         SetInitialState(clb, idx, true, target);
779                         target._checkState = CheckState.Unchecked;
780                         clb.SetItemChecked(idx, false);
781                         Assert.IsFalse(clb.CheckedIndices.Contains(idx), "C_U_U ");
782                         SetInitialState(clb, idx, true, target);
783                         target._checkState = CheckState.Checked;
784                         clb.SetItemChecked(idx, false);
785                         Assert.IsTrue(clb.CheckedIndices.Contains(idx), "C_U_C ");
786                         // Check!
787                         SetInitialState(clb, idx, false, target);
788                         target._checkState = CheckState.Indeterminate;
789                         clb.SetItemChecked(idx, true);
790                         Assert.IsTrue(clb.CheckedIndices.Contains(idx), "U_C_x ");
791                         SetInitialState(clb, idx, false, target);
792                         target._checkState = CheckState.Unchecked;
793                         clb.SetItemChecked(idx, true);
794                         Assert.IsFalse(clb.CheckedIndices.Contains(idx), "U_C_U ");
795                         SetInitialState(clb, idx, false, target);
796                         target._checkState = CheckState.Checked;
797                         clb.SetItemChecked(idx, true);
798                         Assert.IsTrue(clb.CheckedIndices.Contains(idx), "U_C_C ");
799                 }
800                 private void SetInitialState(CheckedListBox clb, int index, bool isChecked, ItemCheckNewValueSetReceiver target)
801                 {
802                         CheckState originalCS = target._checkState;
803                         target._checkState = CheckState.Indeterminate;  // No touchee in the event handler.
804                         clb.SetItemChecked(index, isChecked);
805                         target._checkState = originalCS;
806                 }
807
808                 class ItemCheckNewValueSetReceiver
809                 {
810                         public CheckState _checkState = CheckState.Indeterminate;
811
812                         public void HandleItemCheck(object sender, ItemCheckEventArgs e)
813                         {
814                                 CheckState originalNewValue = e.NewValue; //logging
815                                 bool changed = false; //logging
816                                 switch (_checkState) {
817                                         case CheckState.Unchecked:
818                                                 e.NewValue = CheckState.Unchecked;
819                                                 changed = true;
820                                                 break;
821                                         case CheckState.Checked:
822                                                 e.NewValue = CheckState.Checked;
823                                                 changed = true;
824                                                 break;
825                                         default:    // No touchee!
826                                                 global::System.Diagnostics.Debug.Assert(_checkState == CheckState.Indeterminate);
827                                                 break;
828                                 }
829 #if false // logging
830                                 Console.WriteLine("ItemCheck, item#: {0,2}, current: {1,9}, new was: {2,9}{4}",
831                                         e.Index, e.CurrentValue, originalNewValue, e.NewValue,
832                                         (changed ? String.Format(", ! is: {0,9}", e.NewValue) : String.Empty));
833 #endif
834                         }
835                 }
836
837         }
838 }