4 using System.ComponentModel;
5 using System.ComponentModel.Design.Serialization;
6 using System.Collections.Generic;
10 namespace MonoTests.System.ComponentModel
13 public class BindingListTest
16 public void BindingListDefaults ()
18 BindingList<string> l = new BindingList<string> ();
19 IBindingList ibl = (IBindingList)l;
21 Assert.IsTrue (l.AllowEdit, "1");
22 Assert.IsFalse (l.AllowNew, "2");
23 Assert.IsTrue (l.AllowRemove, "3");
24 Assert.IsTrue (l.RaiseListChangedEvents, "4");
26 Assert.IsFalse (ibl.IsSorted, "5");
27 Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
28 Assert.IsTrue (ibl.SupportsChangeNotification, "7");
29 Assert.IsFalse (ibl.SupportsSearching, "8");
30 Assert.IsFalse (ibl.SupportsSorting, "9");
31 Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
35 public void BindingListDefaults_FixedSizeList ()
37 string[] arr = new string[10];
38 BindingList<string> l = new BindingList<string> (arr);
39 IBindingList ibl = (IBindingList)l;
41 Assert.IsTrue (l.AllowEdit, "1");
42 Assert.IsFalse (l.AllowNew, "2");
43 Assert.IsTrue (l.AllowRemove, "3");
44 Assert.IsTrue (l.RaiseListChangedEvents, "4");
46 Assert.IsFalse (ibl.IsSorted, "5");
47 Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
48 Assert.IsTrue (ibl.SupportsChangeNotification, "7");
49 Assert.IsFalse (ibl.SupportsSearching, "8");
50 Assert.IsFalse (ibl.SupportsSorting, "9");
51 Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
55 public void BindingListDefaults_NonFixedSizeList ()
57 List<string> list = new List<string> ();
58 BindingList<string> l = new BindingList<string> (list);
59 IBindingList ibl = (IBindingList)l;
61 Assert.IsTrue (l.AllowEdit, "1");
62 Assert.IsFalse (l.AllowNew, "2");
63 Assert.IsTrue (l.AllowRemove, "3");
64 Assert.IsTrue (l.RaiseListChangedEvents, "4");
66 Assert.IsFalse (ibl.IsSorted, "5");
67 Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
68 Assert.IsTrue (ibl.SupportsChangeNotification, "7");
69 Assert.IsFalse (ibl.SupportsSearching, "8");
70 Assert.IsFalse (ibl.SupportsSorting, "9");
71 Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
75 public void BindingListDefaults_ReadOnlyList ()
77 List<string> list = new List<string> ();
78 BindingList<string> l = new BindingList<string> (list);
79 IBindingList ibl = (IBindingList)l;
81 Assert.IsTrue (l.AllowEdit, "1");
82 Assert.IsFalse (l.AllowNew, "2");
83 Assert.IsTrue (l.AllowRemove, "3");
84 Assert.IsTrue (l.RaiseListChangedEvents, "4");
86 Assert.IsFalse (ibl.IsSorted, "5");
87 Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
88 Assert.IsTrue (ibl.SupportsChangeNotification, "7");
89 Assert.IsFalse (ibl.SupportsSearching, "8");
90 Assert.IsFalse (ibl.SupportsSorting, "9");
91 Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
95 public void TestAllowNew ()
97 /* Object has a default ctor */
98 BindingList<object> l1 = new BindingList<object> ();
99 Assert.IsTrue (l1.AllowNew, "1");
101 /* string has no default ctor */
102 BindingList<string> l2 = new BindingList<string> ();
103 Assert.IsFalse (l2.AllowNew, "2");
105 /* adding a delegate to AddingNew fixes that */
106 l2.AddingNew += delegate (object sender, AddingNewEventArgs e) { };
107 Assert.IsTrue (l2.AllowNew, "3");
109 l1 = new BindingList<object> ();
111 bool list_changed = false;
112 bool expected = false;
114 l1.ListChanged += delegate (object sender, ListChangedEventArgs e) {
116 Assert.AreEqual (-1, e.NewIndex, "4");
117 Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "5");
118 Assert.AreEqual (expected, l1.AllowNew, "6");
124 Assert.IsTrue (list_changed, "7");
126 /* the default for T=object is true, so check
127 if we enter the block for raising the event
128 if we explicitly set it to the value it
130 l1 = new BindingList<object> ();
132 list_changed = false;
134 l1.ListChanged += delegate (object sender, ListChangedEventArgs e) {
136 Assert.AreEqual (-1, e.NewIndex, "8");
137 Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "9");
138 Assert.AreEqual (expected, l1.AllowNew, "10");
144 /* turns out it doesn't raise the event, so the check must only be for "allow_new == value" */
145 Assert.IsFalse (list_changed, "11");
149 public void TestResetBindings ()
151 BindingList<object> l = new BindingList<object> ();
153 bool list_changed = false;
155 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
157 Assert.AreEqual (-1, e.NewIndex, "1");
158 Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "2");
163 Assert.IsTrue (list_changed, "3");
167 public void TestResetItem ()
169 List<object> list = new List<object>();
170 list.Add (new object());
172 BindingList<object> l = new BindingList<object> (list);
174 bool item_changed = false;
176 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
178 Assert.AreEqual (0, e.NewIndex, "1");
179 Assert.AreEqual (ListChangedType.ItemChanged, e.ListChangedType, "2");
184 Assert.IsTrue (item_changed, "3");
188 public void TestRemoveItem ()
190 List<object> list = new List<object>();
191 list.Add (new object());
193 BindingList<object> l = new BindingList<object> (list);
195 bool item_deleted = false;
197 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
199 Assert.AreEqual (0, e.NewIndex, "1");
200 Assert.AreEqual (ListChangedType.ItemDeleted, e.ListChangedType, "2");
201 Assert.AreEqual (0, l.Count, "3"); // to show the event is raised after the removal
206 Assert.IsTrue (item_deleted, "4");
210 [ExpectedException (typeof (NotSupportedException))]
211 public void TestRemoveItem_AllowRemoveFalse ()
213 List<object> list = new List<object>();
214 list.Add (new object());
216 BindingList<object> l = new BindingList<object> (list);
218 l.AllowRemove = false;
224 public void TestAllowEditEvent ()
226 BindingList<object> l = new BindingList<object>();
228 bool event_raised = false;
229 bool expected = false;
231 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
233 Assert.AreEqual (-1, e.NewIndex, "1");
234 Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "2");
235 Assert.AreEqual (expected, l.AllowEdit, "3");
241 Assert.IsTrue (event_raised, "4");
243 // check to see if RaiseListChangedEvents affects AllowEdit's event.
244 l.RaiseListChangedEvents = false;
246 event_raised = false;
250 Assert.IsFalse (event_raised, "5");
254 public void TestAllowRemove ()
256 BindingList<object> l = new BindingList<object>();
258 bool event_raised = false;
259 bool expected = false;
261 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
263 Assert.AreEqual (-1, e.NewIndex, "1");
264 Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "2");
265 Assert.AreEqual (expected, l.AllowRemove, "3");
269 l.AllowRemove = false;
271 Assert.IsTrue (event_raised, "4");
273 // check to see if RaiseListChangedEvents affects AllowRemove's event.
274 l.RaiseListChangedEvents = false;
276 event_raised = false;
278 l.AllowRemove = true;
280 Assert.IsFalse (event_raised, "5");
284 public void TestAddNew_SettingArgsNewObject ()
286 BindingList<object> l = new BindingList<object>();
288 bool adding_event_raised = false;
289 object o = new object ();
291 l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
292 adding_event_raised = true;
293 Assert.IsNull (e.NewObject, "1");
297 object rv = l.AddNew ();
298 Assert.IsTrue (adding_event_raised, "2");
299 Assert.AreSame (o, rv, "3");
303 public void TestAddNew ()
305 BindingList<object> l = new BindingList<object>();
307 bool adding_event_raised = false;
308 object o = new object ();
310 l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
311 adding_event_raised = true;
312 Assert.IsNull (e.NewObject, "1");
315 object rv = l.AddNew ();
316 Assert.IsTrue (adding_event_raised, "2");
317 Assert.IsNotNull (rv, "3");
321 public void TestAddNew_Cancel ()
323 BindingList<object> l = new BindingList<object>();
325 bool adding_event_raised = false;
326 object o = new object ();
328 bool list_changed = false;
329 ListChangedType change_type = ListChangedType.Reset;
330 int list_changed_index = -1;
332 l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
333 adding_event_raised = true;
334 Assert.IsNull (e.NewObject, "1");
337 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
339 change_type = e.ListChangedType;
340 list_changed_index = e.NewIndex;
343 object rv = l.AddNew ();
344 Assert.IsTrue (adding_event_raised, "2");
345 Assert.IsNotNull (rv, "3");
347 Assert.AreEqual (1, l.Count, "4");
348 Assert.AreEqual (0, l.IndexOf (rv), "5");
349 Assert.IsTrue (list_changed, "6");
350 Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
351 Assert.AreEqual (0, list_changed_index, "8");
353 list_changed = false;
357 Assert.AreEqual (0, l.Count, "9");
358 Assert.IsTrue (list_changed, "10");
359 Assert.AreEqual (ListChangedType.ItemDeleted, change_type, "11");
360 Assert.AreEqual (0, list_changed_index, "12");
364 public void TestAddNew_CancelDifferentIndex ()
366 List<object> list = new List<object>();
368 list.Add (new object ());
369 list.Add (new object ());
371 BindingList<object> l = new BindingList<object>(list);
373 bool adding_event_raised = false;
374 object o = new object ();
376 bool list_changed = false;
377 ListChangedType change_type = ListChangedType.Reset;
378 int list_changed_index = -1;
380 l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
381 adding_event_raised = true;
382 Assert.IsNull (e.NewObject, "1");
385 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
387 change_type = e.ListChangedType;
388 list_changed_index = e.NewIndex;
391 object rv = l.AddNew ();
392 Assert.IsTrue (adding_event_raised, "2");
393 Assert.IsNotNull (rv, "3");
395 Assert.AreEqual (3, l.Count, "4");
396 Assert.AreEqual (2, l.IndexOf (rv), "5");
397 Assert.IsTrue (list_changed, "6");
398 Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
399 Assert.AreEqual (2, list_changed_index, "8");
401 list_changed = false;
405 Assert.IsFalse (list_changed, "9");
406 Assert.AreEqual (3, l.Count, "10");
410 Assert.IsTrue (list_changed, "11");
411 Assert.AreEqual (ListChangedType.ItemDeleted, change_type, "12");
412 Assert.AreEqual (2, list_changed_index, "13");
413 Assert.AreEqual (2, l.Count, "14");
417 public void TestAddNew_End ()
419 BindingList<object> l = new BindingList<object>();
421 bool adding_event_raised = false;
422 object o = new object ();
424 bool list_changed = false;
425 ListChangedType change_type = ListChangedType.Reset;
426 int list_changed_index = -1;
428 l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
429 adding_event_raised = true;
430 Assert.IsNull (e.NewObject, "1");
433 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
435 change_type = e.ListChangedType;
436 list_changed_index = e.NewIndex;
439 object rv = l.AddNew ();
440 Assert.IsTrue (adding_event_raised, "2");
441 Assert.IsNotNull (rv, "3");
443 Assert.AreEqual (1, l.Count, "4");
444 Assert.AreEqual (0, l.IndexOf (rv), "5");
445 Assert.IsTrue (list_changed, "6");
446 Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
447 Assert.AreEqual (0, list_changed_index, "8");
449 list_changed = false;
453 Assert.AreEqual (1, l.Count, "9");
454 Assert.IsFalse (list_changed, "10");
458 public void TestAddNew_CancelDifferentIndexThenEnd ()
460 BindingList<object> l = new BindingList<object>();
462 bool adding_event_raised = false;
463 object o = new object ();
465 bool list_changed = false;
466 ListChangedType change_type = ListChangedType.Reset;
467 int list_changed_index = -1;
469 l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
470 adding_event_raised = true;
471 Assert.IsNull (e.NewObject, "1");
474 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
476 change_type = e.ListChangedType;
477 list_changed_index = e.NewIndex;
480 object rv = l.AddNew ();
481 Assert.IsTrue (adding_event_raised, "2");
482 Assert.IsNotNull (rv, "3");
484 Assert.AreEqual (1, l.Count, "4");
485 Assert.AreEqual (0, l.IndexOf (rv), "5");
486 Assert.IsTrue (list_changed, "6");
487 Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
488 Assert.AreEqual (0, list_changed_index, "8");
490 list_changed = false;
494 Assert.AreEqual (1, l.Count, "9");
495 Assert.IsFalse (list_changed, "10");
499 Assert.AreEqual (1, l.Count, "11");
500 Assert.IsFalse (list_changed, "12");
504 public void TestAddNew_EndDifferentIndexThenCancel ()
506 BindingList<object> l = new BindingList<object>();
508 bool adding_event_raised = false;
509 object o = new object ();
511 bool list_changed = false;
512 ListChangedType change_type = ListChangedType.Reset;
513 int list_changed_index = -1;
515 l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
516 adding_event_raised = true;
517 Assert.IsNull (e.NewObject, "1");
520 l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
522 change_type = e.ListChangedType;
523 list_changed_index = e.NewIndex;
526 object rv = l.AddNew ();
527 Assert.IsTrue (adding_event_raised, "2");
528 Assert.IsNotNull (rv, "3");
530 Assert.AreEqual (1, l.Count, "4");
531 Assert.AreEqual (0, l.IndexOf (rv), "5");
532 Assert.IsTrue (list_changed, "6");
533 Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
534 Assert.AreEqual (0, list_changed_index, "8");
536 list_changed = false;
540 Assert.AreEqual (1, l.Count, "9");
541 Assert.IsFalse (list_changed, "10");
545 Assert.IsTrue (list_changed, "11");
546 Assert.AreEqual (ListChangedType.ItemDeleted, change_type, "12");
547 Assert.AreEqual (0, list_changed_index, "13");
550 class BindingListPoker : BindingList<object>
552 public object DoAddNewCore()
554 return base.AddNewCore ();
558 // test to make sure that the events are raised in AddNewCore and not in AddNew
560 public void TestAddNewCore_Insert ()
562 BindingListPoker poker = new BindingListPoker ();
564 bool adding_event_raised = false;
566 bool list_changed = false;
567 ListChangedType change_type = ListChangedType.Reset;
568 int list_changed_index = -1;
570 poker.AddingNew += delegate (object sender, AddingNewEventArgs e) {
571 adding_event_raised = true;
574 poker.ListChanged += delegate (object sender, ListChangedEventArgs e) {
576 change_type = e.ListChangedType;
577 list_changed_index = e.NewIndex;
580 object o = poker.DoAddNewCore ();
582 Assert.IsTrue (adding_event_raised, "1");
583 Assert.IsTrue (list_changed, "2");
584 Assert.AreEqual (ListChangedType.ItemAdded, change_type, "3");
585 Assert.AreEqual (0, list_changed_index, "4");
586 Assert.AreEqual (1, poker.Count, "5");
589 private class Item : INotifyPropertyChanged {
591 public event PropertyChangedEventHandler PropertyChanged;
596 get { return _name; }
598 if (_name != value) {
600 OnPropertyChanged ("Name");
605 void OnPropertyChanged (string name)
607 var fn = PropertyChanged;
609 fn (this, new PropertyChangedEventArgs (name));
613 [Test] // https://bugzilla.xamarin.com/show_bug.cgi?id=8366
614 public void Bug8366 ()
617 bool changed = false;
618 var list = new BindingList<Item> ();
619 list.ListChanged += (object sender, ListChangedEventArgs e) => {
620 added |= e.ListChangedType == ListChangedType.ItemAdded;
621 changed |= e.ListChangedType == ListChangedType.ItemChanged;
624 var item = new Item () { Name = "1" };
629 Assert.IsTrue (added, "ItemAdded");
630 Assert.IsTrue (changed, "ItemChanged");