PageRenderTime 42ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

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

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