/mcs/class/System/Test/System.ComponentModel/BindingListTest.cs

https://github.com/t-ashula/mono · C# · 699 lines · 527 code · 159 blank · 13 comment · 9 complexity · d9d9bfae7e0b8273cafde4a9d4d23039 MD5 · raw file

  1. using System;
  2. using System.ComponentModel;
  3. using System.ComponentModel.Design.Serialization;
  4. using System.Collections.Generic;
  5. using NUnit.Framework;
  6. namespace MonoTests.System.ComponentModel
  7. {
  8. [TestFixture]
  9. public class BindingListTest
  10. {
  11. [Test]
  12. public void BindingListDefaults ()
  13. {
  14. BindingList<string> l = new BindingList<string> ();
  15. IBindingList ibl = (IBindingList)l;
  16. Assert.IsTrue (l.AllowEdit, "1");
  17. Assert.IsFalse (l.AllowNew, "2");
  18. Assert.IsTrue (l.AllowRemove, "3");
  19. Assert.IsTrue (l.RaiseListChangedEvents, "4");
  20. Assert.IsFalse (ibl.IsSorted, "5");
  21. Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
  22. Assert.IsTrue (ibl.SupportsChangeNotification, "7");
  23. Assert.IsFalse (ibl.SupportsSearching, "8");
  24. Assert.IsFalse (ibl.SupportsSorting, "9");
  25. Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
  26. }
  27. [Test]
  28. public void BindingListDefaults_FixedSizeList ()
  29. {
  30. string[] arr = new string[10];
  31. BindingList<string> l = new BindingList<string> (arr);
  32. IBindingList ibl = (IBindingList)l;
  33. Assert.IsTrue (l.AllowEdit, "1");
  34. Assert.IsFalse (l.AllowNew, "2");
  35. Assert.IsTrue (l.AllowRemove, "3");
  36. Assert.IsTrue (l.RaiseListChangedEvents, "4");
  37. Assert.IsFalse (ibl.IsSorted, "5");
  38. Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
  39. Assert.IsTrue (ibl.SupportsChangeNotification, "7");
  40. Assert.IsFalse (ibl.SupportsSearching, "8");
  41. Assert.IsFalse (ibl.SupportsSorting, "9");
  42. Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
  43. }
  44. [Test]
  45. public void BindingListDefaults_NonFixedSizeList ()
  46. {
  47. List<string> list = new List<string> ();
  48. BindingList<string> l = new BindingList<string> (list);
  49. IBindingList ibl = (IBindingList)l;
  50. Assert.IsTrue (l.AllowEdit, "1");
  51. Assert.IsFalse (l.AllowNew, "2");
  52. Assert.IsTrue (l.AllowRemove, "3");
  53. Assert.IsTrue (l.RaiseListChangedEvents, "4");
  54. Assert.IsFalse (ibl.IsSorted, "5");
  55. Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
  56. Assert.IsTrue (ibl.SupportsChangeNotification, "7");
  57. Assert.IsFalse (ibl.SupportsSearching, "8");
  58. Assert.IsFalse (ibl.SupportsSorting, "9");
  59. Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
  60. }
  61. [Test]
  62. public void BindingListDefaults_ReadOnlyList ()
  63. {
  64. List<string> list = new List<string> ();
  65. BindingList<string> l = new BindingList<string> (list);
  66. IBindingList ibl = (IBindingList)l;
  67. Assert.IsTrue (l.AllowEdit, "1");
  68. Assert.IsFalse (l.AllowNew, "2");
  69. Assert.IsTrue (l.AllowRemove, "3");
  70. Assert.IsTrue (l.RaiseListChangedEvents, "4");
  71. Assert.IsFalse (ibl.IsSorted, "5");
  72. Assert.AreEqual (ibl.SortDirection, ListSortDirection.Ascending, "6");
  73. Assert.IsTrue (ibl.SupportsChangeNotification, "7");
  74. Assert.IsFalse (ibl.SupportsSearching, "8");
  75. Assert.IsFalse (ibl.SupportsSorting, "9");
  76. Assert.IsFalse (((IRaiseItemChangedEvents)l).RaisesItemChangedEvents, "10");
  77. }
  78. [Test]
  79. public void TestAllowNew ()
  80. {
  81. /* Object has a default ctor */
  82. BindingList<object> l1 = new BindingList<object> ();
  83. Assert.IsTrue (l1.AllowNew, "1");
  84. /* string has no default ctor */
  85. BindingList<string> l2 = new BindingList<string> ();
  86. Assert.IsFalse (l2.AllowNew, "2");
  87. /* adding a delegate to AddingNew fixes that */
  88. l2.AddingNew += delegate (object sender, AddingNewEventArgs e) { };
  89. Assert.IsTrue (l2.AllowNew, "3");
  90. l1 = new BindingList<object> ();
  91. bool list_changed = false;
  92. bool expected = false;
  93. l1.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  94. list_changed = true;
  95. Assert.AreEqual (-1, e.NewIndex, "4");
  96. Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "5");
  97. Assert.AreEqual (expected, l1.AllowNew, "6");
  98. };
  99. expected = false;
  100. l1.AllowNew = false;
  101. Assert.IsTrue (list_changed, "7");
  102. /* the default for T=object is true, so check
  103. if we enter the block for raising the event
  104. if we explicitly set it to the value it
  105. currently has. */
  106. l1 = new BindingList<object> ();
  107. list_changed = false;
  108. l1.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  109. list_changed = true;
  110. Assert.AreEqual (-1, e.NewIndex, "8");
  111. Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "9");
  112. Assert.AreEqual (expected, l1.AllowNew, "10");
  113. };
  114. expected = true;
  115. l1.AllowNew = true;
  116. /* turns out it doesn't raise the event, so the check must only be for "allow_new == value" */
  117. Assert.IsFalse (list_changed, "11");
  118. }
  119. [Test]
  120. public void TestResetBindings ()
  121. {
  122. BindingList<object> l = new BindingList<object> ();
  123. bool list_changed = false;
  124. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  125. list_changed = true;
  126. Assert.AreEqual (-1, e.NewIndex, "1");
  127. Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "2");
  128. };
  129. l.ResetBindings ();
  130. Assert.IsTrue (list_changed, "3");
  131. }
  132. [Test]
  133. public void TestResetItem ()
  134. {
  135. List<object> list = new List<object>();
  136. list.Add (new object());
  137. BindingList<object> l = new BindingList<object> (list);
  138. bool item_changed = false;
  139. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  140. item_changed = true;
  141. Assert.AreEqual (0, e.NewIndex, "1");
  142. Assert.AreEqual (ListChangedType.ItemChanged, e.ListChangedType, "2");
  143. };
  144. l.ResetItem (0);
  145. Assert.IsTrue (item_changed, "3");
  146. }
  147. [Test]
  148. public void TestRemoveItem ()
  149. {
  150. List<object> list = new List<object>();
  151. list.Add (new object());
  152. BindingList<object> l = new BindingList<object> (list);
  153. bool item_deleted = false;
  154. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  155. item_deleted = true;
  156. Assert.AreEqual (0, e.NewIndex, "1");
  157. Assert.AreEqual (ListChangedType.ItemDeleted, e.ListChangedType, "2");
  158. Assert.AreEqual (0, l.Count, "3"); // to show the event is raised after the removal
  159. };
  160. l.RemoveAt (0);
  161. Assert.IsTrue (item_deleted, "4");
  162. }
  163. [Test]
  164. [ExpectedException (typeof (NotSupportedException))]
  165. public void TestRemoveItem_AllowRemoveFalse ()
  166. {
  167. List<object> list = new List<object>();
  168. list.Add (new object());
  169. BindingList<object> l = new BindingList<object> (list);
  170. l.AllowRemove = false;
  171. l.RemoveAt (0);
  172. }
  173. [Test]
  174. public void TestAllowEditEvent ()
  175. {
  176. BindingList<object> l = new BindingList<object>();
  177. bool event_raised = false;
  178. bool expected = false;
  179. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  180. event_raised = true;
  181. Assert.AreEqual (-1, e.NewIndex, "1");
  182. Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "2");
  183. Assert.AreEqual (expected, l.AllowEdit, "3");
  184. };
  185. expected = false;
  186. l.AllowEdit = false;
  187. Assert.IsTrue (event_raised, "4");
  188. // check to see if RaiseListChangedEvents affects AllowEdit's event.
  189. l.RaiseListChangedEvents = false;
  190. event_raised = false;
  191. expected = true;
  192. l.AllowEdit = true;
  193. Assert.IsFalse (event_raised, "5");
  194. }
  195. [Test]
  196. public void TestAllowRemove ()
  197. {
  198. BindingList<object> l = new BindingList<object>();
  199. bool event_raised = false;
  200. bool expected = false;
  201. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  202. event_raised = true;
  203. Assert.AreEqual (-1, e.NewIndex, "1");
  204. Assert.AreEqual (ListChangedType.Reset, e.ListChangedType, "2");
  205. Assert.AreEqual (expected, l.AllowRemove, "3");
  206. };
  207. expected = false;
  208. l.AllowRemove = false;
  209. Assert.IsTrue (event_raised, "4");
  210. // check to see if RaiseListChangedEvents affects AllowRemove's event.
  211. l.RaiseListChangedEvents = false;
  212. event_raised = false;
  213. expected = true;
  214. l.AllowRemove = true;
  215. Assert.IsFalse (event_raised, "5");
  216. }
  217. [Test]
  218. public void TestAddNew_SettingArgsNewObject ()
  219. {
  220. BindingList<object> l = new BindingList<object>();
  221. bool adding_event_raised = false;
  222. object o = new object ();
  223. l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  224. adding_event_raised = true;
  225. Assert.IsNull (e.NewObject, "1");
  226. e.NewObject = o;
  227. };
  228. object rv = l.AddNew ();
  229. Assert.IsTrue (adding_event_raised, "2");
  230. Assert.AreSame (o, rv, "3");
  231. }
  232. [Test]
  233. public void TestAddNew ()
  234. {
  235. BindingList<object> l = new BindingList<object>();
  236. bool adding_event_raised = false;
  237. object o = new object ();
  238. l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  239. adding_event_raised = true;
  240. Assert.IsNull (e.NewObject, "1");
  241. };
  242. object rv = l.AddNew ();
  243. Assert.IsTrue (adding_event_raised, "2");
  244. Assert.IsNotNull (rv, "3");
  245. }
  246. [Test]
  247. public void TestAddNew_Cancel ()
  248. {
  249. BindingList<object> l = new BindingList<object>();
  250. bool adding_event_raised = false;
  251. object o = new object ();
  252. bool list_changed = false;
  253. ListChangedType change_type = ListChangedType.Reset;
  254. int list_changed_index = -1;
  255. l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  256. adding_event_raised = true;
  257. Assert.IsNull (e.NewObject, "1");
  258. };
  259. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  260. list_changed = true;
  261. change_type = e.ListChangedType;
  262. list_changed_index = e.NewIndex;
  263. };
  264. object rv = l.AddNew ();
  265. Assert.IsTrue (adding_event_raised, "2");
  266. Assert.IsNotNull (rv, "3");
  267. Assert.AreEqual (1, l.Count, "4");
  268. Assert.AreEqual (0, l.IndexOf (rv), "5");
  269. Assert.IsTrue (list_changed, "6");
  270. Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
  271. Assert.AreEqual (0, list_changed_index, "8");
  272. list_changed = false;
  273. l.CancelNew (0);
  274. Assert.AreEqual (0, l.Count, "9");
  275. Assert.IsTrue (list_changed, "10");
  276. Assert.AreEqual (ListChangedType.ItemDeleted, change_type, "11");
  277. Assert.AreEqual (0, list_changed_index, "12");
  278. }
  279. [Test]
  280. public void TestAddNew_CancelDifferentIndex ()
  281. {
  282. List<object> list = new List<object>();
  283. list.Add (new object ());
  284. list.Add (new object ());
  285. BindingList<object> l = new BindingList<object>(list);
  286. bool adding_event_raised = false;
  287. object o = new object ();
  288. bool list_changed = false;
  289. ListChangedType change_type = ListChangedType.Reset;
  290. int list_changed_index = -1;
  291. l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  292. adding_event_raised = true;
  293. Assert.IsNull (e.NewObject, "1");
  294. };
  295. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  296. list_changed = true;
  297. change_type = e.ListChangedType;
  298. list_changed_index = e.NewIndex;
  299. };
  300. object rv = l.AddNew ();
  301. Assert.IsTrue (adding_event_raised, "2");
  302. Assert.IsNotNull (rv, "3");
  303. Assert.AreEqual (3, l.Count, "4");
  304. Assert.AreEqual (2, l.IndexOf (rv), "5");
  305. Assert.IsTrue (list_changed, "6");
  306. Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
  307. Assert.AreEqual (2, list_changed_index, "8");
  308. list_changed = false;
  309. l.CancelNew (0);
  310. Assert.IsFalse (list_changed, "9");
  311. Assert.AreEqual (3, l.Count, "10");
  312. l.CancelNew (2);
  313. Assert.IsTrue (list_changed, "11");
  314. Assert.AreEqual (ListChangedType.ItemDeleted, change_type, "12");
  315. Assert.AreEqual (2, list_changed_index, "13");
  316. Assert.AreEqual (2, l.Count, "14");
  317. }
  318. [Test]
  319. public void TestAddNew_End ()
  320. {
  321. BindingList<object> l = new BindingList<object>();
  322. bool adding_event_raised = false;
  323. object o = new object ();
  324. bool list_changed = false;
  325. ListChangedType change_type = ListChangedType.Reset;
  326. int list_changed_index = -1;
  327. l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  328. adding_event_raised = true;
  329. Assert.IsNull (e.NewObject, "1");
  330. };
  331. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  332. list_changed = true;
  333. change_type = e.ListChangedType;
  334. list_changed_index = e.NewIndex;
  335. };
  336. object rv = l.AddNew ();
  337. Assert.IsTrue (adding_event_raised, "2");
  338. Assert.IsNotNull (rv, "3");
  339. Assert.AreEqual (1, l.Count, "4");
  340. Assert.AreEqual (0, l.IndexOf (rv), "5");
  341. Assert.IsTrue (list_changed, "6");
  342. Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
  343. Assert.AreEqual (0, list_changed_index, "8");
  344. list_changed = false;
  345. l.EndNew (0);
  346. Assert.AreEqual (1, l.Count, "9");
  347. Assert.IsFalse (list_changed, "10");
  348. }
  349. [Test]
  350. public void TestAddNew_CancelDifferentIndexThenEnd ()
  351. {
  352. BindingList<object> l = new BindingList<object>();
  353. bool adding_event_raised = false;
  354. object o = new object ();
  355. bool list_changed = false;
  356. ListChangedType change_type = ListChangedType.Reset;
  357. int list_changed_index = -1;
  358. l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  359. adding_event_raised = true;
  360. Assert.IsNull (e.NewObject, "1");
  361. };
  362. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  363. list_changed = true;
  364. change_type = e.ListChangedType;
  365. list_changed_index = e.NewIndex;
  366. };
  367. object rv = l.AddNew ();
  368. Assert.IsTrue (adding_event_raised, "2");
  369. Assert.IsNotNull (rv, "3");
  370. Assert.AreEqual (1, l.Count, "4");
  371. Assert.AreEqual (0, l.IndexOf (rv), "5");
  372. Assert.IsTrue (list_changed, "6");
  373. Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
  374. Assert.AreEqual (0, list_changed_index, "8");
  375. list_changed = false;
  376. l.CancelNew (2);
  377. Assert.AreEqual (1, l.Count, "9");
  378. Assert.IsFalse (list_changed, "10");
  379. l.EndNew (0);
  380. Assert.AreEqual (1, l.Count, "11");
  381. Assert.IsFalse (list_changed, "12");
  382. }
  383. [Test]
  384. public void TestAddNew_EndDifferentIndexThenCancel ()
  385. {
  386. BindingList<object> l = new BindingList<object>();
  387. bool adding_event_raised = false;
  388. object o = new object ();
  389. bool list_changed = false;
  390. ListChangedType change_type = ListChangedType.Reset;
  391. int list_changed_index = -1;
  392. l.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  393. adding_event_raised = true;
  394. Assert.IsNull (e.NewObject, "1");
  395. };
  396. l.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  397. list_changed = true;
  398. change_type = e.ListChangedType;
  399. list_changed_index = e.NewIndex;
  400. };
  401. object rv = l.AddNew ();
  402. Assert.IsTrue (adding_event_raised, "2");
  403. Assert.IsNotNull (rv, "3");
  404. Assert.AreEqual (1, l.Count, "4");
  405. Assert.AreEqual (0, l.IndexOf (rv), "5");
  406. Assert.IsTrue (list_changed, "6");
  407. Assert.AreEqual (ListChangedType.ItemAdded, change_type, "7");
  408. Assert.AreEqual (0, list_changed_index, "8");
  409. list_changed = false;
  410. l.EndNew (2);
  411. Assert.AreEqual (1, l.Count, "9");
  412. Assert.IsFalse (list_changed, "10");
  413. l.CancelNew (0);
  414. Assert.IsTrue (list_changed, "11");
  415. Assert.AreEqual (ListChangedType.ItemDeleted, change_type, "12");
  416. Assert.AreEqual (0, list_changed_index, "13");
  417. }
  418. class BindingListPoker : BindingList<object>
  419. {
  420. public object DoAddNewCore()
  421. {
  422. return base.AddNewCore ();
  423. }
  424. }
  425. // test to make sure that the events are raised in AddNewCore and not in AddNew
  426. [Test]
  427. public void TestAddNewCore_Insert ()
  428. {
  429. BindingListPoker poker = new BindingListPoker ();
  430. bool adding_event_raised = false;
  431. bool list_changed = false;
  432. ListChangedType change_type = ListChangedType.Reset;
  433. int list_changed_index = -1;
  434. poker.AddingNew += delegate (object sender, AddingNewEventArgs e) {
  435. adding_event_raised = true;
  436. };
  437. poker.ListChanged += delegate (object sender, ListChangedEventArgs e) {
  438. list_changed = true;
  439. change_type = e.ListChangedType;
  440. list_changed_index = e.NewIndex;
  441. };
  442. object o = poker.DoAddNewCore ();
  443. Assert.IsTrue (adding_event_raised, "1");
  444. Assert.IsTrue (list_changed, "2");
  445. Assert.AreEqual (ListChangedType.ItemAdded, change_type, "3");
  446. Assert.AreEqual (0, list_changed_index, "4");
  447. Assert.AreEqual (1, poker.Count, "5");
  448. }
  449. private class Item : INotifyPropertyChanged {
  450. public event PropertyChangedEventHandler PropertyChanged;
  451. string _name;
  452. public string Name {
  453. get { return _name; }
  454. set {
  455. if (_name != value) {
  456. _name = value;
  457. OnPropertyChanged ("Name");
  458. }
  459. }
  460. }
  461. void OnPropertyChanged (string name)
  462. {
  463. var fn = PropertyChanged;
  464. if (fn != null)
  465. fn (this, new PropertyChangedEventArgs (name));
  466. }
  467. }
  468. [Test] // https://bugzilla.xamarin.com/show_bug.cgi?id=8366
  469. public void Bug8366 ()
  470. {
  471. bool added = false;
  472. bool changed = false;
  473. var list = new BindingList<Item> ();
  474. list.ListChanged += (object sender, ListChangedEventArgs e) => {
  475. added |= e.ListChangedType == ListChangedType.ItemAdded;
  476. changed |= e.ListChangedType == ListChangedType.ItemChanged;
  477. };
  478. var item = new Item () { Name = "1" };
  479. list.Add (item);
  480. item.Name = "2";
  481. Assert.IsTrue (added, "ItemAdded");
  482. Assert.IsTrue (changed, "ItemChanged");
  483. }
  484. [Test] // https://bugzilla.xamarin.com/show_bug.cgi?id=16902
  485. public void Bug16902 ()
  486. {
  487. var list = new BindingList<Item> ();
  488. list.Insert (0, null);
  489. var count = list.Count;
  490. Assert.AreEqual (1, count, "1");
  491. }
  492. private class Person : INotifyPropertyChanged
  493. {
  494. private string _lastName;
  495. private string _firstName;
  496. public string FirstName {
  497. get { return _firstName; }
  498. set {
  499. _firstName = value;
  500. OnPropertyChanged ("FirstName"); // string matches property name
  501. }
  502. }
  503. public string LastName {
  504. get { return _lastName; }
  505. set {
  506. _lastName = value;
  507. OnPropertyChanged ("Apepe"); // string doesn't match property name
  508. }
  509. }
  510. public event PropertyChangedEventHandler PropertyChanged;
  511. protected virtual void OnPropertyChanged (string propertyName = null)
  512. {
  513. PropertyChangedEventHandler handler = PropertyChanged;
  514. if (handler != null)
  515. handler (this, new PropertyChangedEventArgs (propertyName));
  516. }
  517. }
  518. [Test] // https://bugzilla.xamarin.com/show_bug.cgi?id=20672
  519. public void Bug20672 ()
  520. {
  521. string changedPropertyName = string.Empty;
  522. bool isEventRaised = false;
  523. bool? hasPropertyDescriptor = false;
  524. var persons = new BindingList<Person>();
  525. persons.Add (new Person() { FirstName = "Stefaan", LastName = "de Vogelaere" });
  526. persons.Add (new Person() { FirstName = "Christophe", LastName = "De Langhe" });
  527. persons.ListChanged += (object sender, ListChangedEventArgs e) => {
  528. isEventRaised = true;
  529. hasPropertyDescriptor = e.PropertyDescriptor != null;
  530. };
  531. //if the OnPropertyChanged string matches a valid property name, PropertyDescriptor should be generated
  532. persons[0].FirstName = "Stefan";
  533. Assert.IsTrue (isEventRaised);
  534. Assert.IsTrue ((bool) hasPropertyDescriptor, "#1");
  535. //if the OnPropertyChanged string doesn't match a valid property name, no PropertyDescriptor should be generated
  536. persons[0].LastName = "de le Vulu";
  537. Assert.IsFalse ((bool) hasPropertyDescriptor, "#2");
  538. }
  539. }
  540. }