CurrencyManagerTest.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. // Permission is hereby granted, free of charge, to any person obtaining
  2. // a copy of this software and associated documentation files (the
  3. // "Software"), to deal in the Software without restriction, including
  4. // without limitation the rights to use, copy, modify, merge, publish,
  5. // distribute, sublicense, and/or sell copies of the Software, and to
  6. // permit persons to whom the Software is furnished to do so, subject to
  7. // the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be
  10. // included in all copies or substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  13. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  15. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  16. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  17. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  18. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  19. //
  20. // Copyright (c) 2006 Novell, Inc.
  21. //
  22. // Authors:
  23. // Jackson Harper [email protected]
  24. using System;
  25. using System.Collections;
  26. using System.ComponentModel;
  27. using System.Data;
  28. using System.Reflection;
  29. using System.Windows.Forms;
  30. using NUnit.Framework;
  31. using CategoryAttribute = NUnit.Framework.CategoryAttribute;
  32. namespace MonoTests.System.Windows.Forms.DataBinding
  33. {
  34. [TestFixture]
  35. public class CurrencyManagerTest
  36. {
  37. [Test]
  38. public void Defaults ()
  39. {
  40. BindingContext bc = new BindingContext ();
  41. ArrayList data_source = new ArrayList ();
  42. CurrencyManager cm = bc [data_source] as CurrencyManager;
  43. Assert.AreSame (data_source, cm.List, "DEFAULTS1");
  44. Assert.AreEqual (0, cm.Count, "DEFAULTS2");
  45. Assert.AreEqual (-1, cm.Position, "DEFAULTS3");
  46. }
  47. [Test]
  48. [ExpectedException (typeof (IndexOutOfRangeException))]
  49. public void UninitializedCurrent ()
  50. {
  51. BindingContext bc = new BindingContext ();
  52. ArrayList data_source = new ArrayList ();
  53. CurrencyManager cm = bc [data_source] as CurrencyManager;
  54. // This line should throw
  55. Assert.AreSame (null, cm.Current, "CurrentOfEmpty");
  56. }
  57. [Test]
  58. public void DataSetList ()
  59. {
  60. DataSet dataset = new DataSet ("DataSet");
  61. DataTable table = new DataTable ("Table");
  62. BindingContext bc = new BindingContext ();
  63. CurrencyManager cm;
  64. dataset.Tables.Add (table);
  65. cm = bc [dataset] as CurrencyManager;
  66. Assert.AreEqual (typeof (DataViewManager), cm.List.GetType (), "DATASETLIST1");
  67. Assert.AreEqual (1, cm.Count, "DATASETLIST2");
  68. Assert.AreEqual (0, cm.Position, "DATASETLIST3");
  69. // Assert.AreEqual (typeof (DataViewManagerListItemTypeDescriptor), cm.Current.GetType (),
  70. // "DATASETLIST4");
  71. }
  72. [Test]
  73. public void DataSetListTable ()
  74. {
  75. DataSet dataset = new DataSet ("DataSet");
  76. DataTable table = new DataTable ("Table");
  77. BindingContext bc = new BindingContext ();
  78. CurrencyManager cm;
  79. dataset.Tables.Add (table);
  80. cm = bc [dataset, "Table"] as CurrencyManager;
  81. Assert.AreEqual (typeof (DataView), cm.List.GetType (), "DATASETLIST1");
  82. Assert.AreEqual (0, cm.Count, "DATASETLIST2");
  83. Assert.AreEqual (-1, cm.Position, "DATASETLIST3");
  84. }
  85. [Test]
  86. [ExpectedException (typeof (ArgumentException))]
  87. public void DataSetListTableBogusField ()
  88. {
  89. DataSet dataset = new DataSet ("DataSet");
  90. DataTable table = new DataTable ("Table.Column");
  91. BindingContext bc = new BindingContext ();
  92. CurrencyManager cm;
  93. dataset.Tables.Add (table);
  94. // child list can't be created
  95. cm = bc [dataset, "Table"] as CurrencyManager;
  96. TestHelper.RemoveWarning (cm);
  97. }
  98. [Test] // bug #80107
  99. public void DataView ()
  100. {
  101. DataView dv = new DataView ();
  102. BindingContext bc = new BindingContext ();
  103. CurrencyManager cm = bc [dv, string.Empty] as CurrencyManager;
  104. Assert.IsNotNull (cm, "#A1");
  105. Assert.AreEqual (0, cm.Count, "#A2");
  106. Assert.AreEqual (-1, cm.Position, "#A3");
  107. DataTable dt = new DataTable ("Testdata");
  108. dt.Columns.Add ("A");
  109. dt.Columns.Add ("B");
  110. dt.Rows.Add (new object [] { "A1", "B1" });
  111. dt.Rows.Add (new object [] { "A2", "B2" });
  112. dv.Table = dt;
  113. Assert.AreEqual (2, cm.Count, "#B1");
  114. Assert.AreEqual (0, cm.Position, "#B2");
  115. }
  116. [Test]
  117. public void MoveArrayListForward ()
  118. {
  119. ArrayList data_source = new ArrayList ();
  120. BindingContext bc = new BindingContext ();
  121. for (int i = 0; i < 10; i++)
  122. data_source.Add (new object ());
  123. CurrencyManager cm = bc [data_source] as CurrencyManager;
  124. for (int i = 0; i < 10; i++) {
  125. Assert.AreSame (data_source [i], cm.Current, "MOVEALF" + i);
  126. cm.Position++;
  127. }
  128. cm.Position++;
  129. cm.Position++;
  130. Assert.AreSame (data_source [9], cm.Current, "MOVEALFEND");
  131. }
  132. [Test]
  133. public void MoveArrayListBackward ()
  134. {
  135. ArrayList data_source = new ArrayList ();
  136. BindingContext bc = new BindingContext ();
  137. for (int i = 0; i < 10; i++)
  138. data_source.Add (new object ());
  139. CurrencyManager cm = bc [data_source] as CurrencyManager;
  140. cm.Position = 9;
  141. for (int i = 9; i >= 0; i--) {
  142. Assert.AreSame (data_source [i], cm.Current, "MOVEALB" + i);
  143. cm.Position--;
  144. }
  145. cm.Position--;
  146. cm.Position--;
  147. Assert.AreSame (data_source [0], cm.Current, "MOVEALBSTART");
  148. }
  149. [Test]
  150. public void SetPositionArrayList ()
  151. {
  152. ArrayList data_source = new ArrayList ();
  153. BindingContext bc = new BindingContext ();
  154. for (int i = 0; i < 10; i++)
  155. data_source.Add (new object ());
  156. CurrencyManager cm = bc [data_source] as CurrencyManager;
  157. for (int i = 3; i >= 0; i--) {
  158. cm.Position = i;
  159. Assert.AreSame (data_source [i], cm.Current, "MOVEAL1-" + i);
  160. }
  161. cm.Position--;
  162. for (int i = 0; i < 10; i++) {
  163. cm.Position = i;
  164. Assert.AreSame (data_source [i], cm.Current, "MOVEAL2-" + i);
  165. }
  166. for (int i = 5; i < 10; i++) {
  167. cm.Position = i;
  168. Assert.AreSame (data_source [i], cm.Current, "MOVEAL3-" + i);
  169. }
  170. }
  171. [Test]
  172. public void LateBuildDataTable ()
  173. {
  174. DataTable data_source = new DataTable ("Table");
  175. BindingContext bc = new BindingContext ();
  176. CurrencyManager cm = bc [data_source] as CurrencyManager;
  177. Assert.AreEqual (-1, cm.Position, "LATEBUILDTABLE1");
  178. Assert.AreEqual (0, cm.Count, "LATEBUILDTABLE2");
  179. DataColumn column = new DataColumn ("Column");
  180. column.DataType = typeof (int);
  181. data_source.Columns.Add (column);
  182. for (int i = 0; i < 10; i++) {
  183. DataRow row = data_source.NewRow ();
  184. row ["Column"] = i;
  185. data_source.Rows.Add (row);
  186. }
  187. Assert.AreEqual (0, cm.Position, "LATEBUILDTABLE3");
  188. Assert.AreEqual (10, cm.Count, "LATEBUILDTABLE4");
  189. }
  190. [Test]
  191. public void LateBuildArrayList ()
  192. {
  193. ArrayList data_source = new ArrayList ();
  194. BindingContext bc = new BindingContext ();
  195. CurrencyManager cm = bc [data_source] as CurrencyManager;
  196. Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST1");
  197. Assert.AreEqual (0, cm.Count, "LATEBUILDLIST2");
  198. data_source.AddRange (new object [] { 1, 2, 3, 4, 5, 6, 7 });
  199. Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST3");
  200. Assert.AreEqual (7, cm.Count, "LATEBUILDLIST4");
  201. }
  202. [Test]
  203. public void MoveDataTableForward ()
  204. {
  205. DataTable data_source = new DataTable ("Table");
  206. BindingContext bc = new BindingContext ();
  207. CurrencyManager cm = bc [data_source] as CurrencyManager;
  208. DataColumn column = new DataColumn ("Column");
  209. column.DataType = typeof (int);
  210. data_source.Columns.Add (column);
  211. for (int i = 0; i < 10; i++) {
  212. DataRow row = data_source.NewRow ();
  213. row ["Column"] = i;
  214. data_source.Rows.Add (row);
  215. }
  216. for (int i = 0; i < 10; i++) {
  217. DataRowView row = cm.Current as DataRowView;
  218. Assert.IsFalse (row == null, "MOVETABLEF-NULL-" + i);
  219. Assert.AreEqual (row ["Column"], i, "MOVETABLEF-" + i);
  220. cm.Position++;
  221. }
  222. cm.Position++;
  223. cm.Position++;
  224. Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "MOVETABLEF-END");
  225. }
  226. [Test]
  227. public void MoveDataTableBackward ()
  228. {
  229. DataTable data_source = new DataTable ("Table");
  230. BindingContext bc = new BindingContext ();
  231. CurrencyManager cm = bc [data_source] as CurrencyManager;
  232. DataColumn column = new DataColumn ("Column");
  233. column.DataType = typeof (int);
  234. data_source.Columns.Add (column);
  235. for (int i = 0; i < 10; i++) {
  236. DataRow row = data_source.NewRow ();
  237. row ["Column"] = i;
  238. data_source.Rows.Add (row);
  239. }
  240. cm.Position = 9;
  241. for (int i = 9; i >= 0; i--) {
  242. DataRowView row = cm.Current as DataRowView;
  243. Assert.IsFalse (row == null, "MOVETABLEB-NULL-" + i);
  244. Assert.AreEqual (row ["Column"], i, "MOVETABLEB-" + i);
  245. cm.Position--;
  246. }
  247. cm.Position--;
  248. cm.Position--;
  249. Assert.AreEqual (0, ((DataRowView) cm.Current) ["Column"], "MOVETABLEB-START");
  250. }
  251. [Test]
  252. public void SetPositionDataTable ()
  253. {
  254. DataTable data_source = new DataTable ("Table");
  255. BindingContext bc = new BindingContext ();
  256. CurrencyManager cm = bc [data_source] as CurrencyManager;
  257. DataColumn column = new DataColumn ("Column");
  258. column.DataType = typeof (int);
  259. data_source.Columns.Add (column);
  260. for (int i = 0; i < 10; i++) {
  261. DataRow row = data_source.NewRow ();
  262. row ["Column"] = i;
  263. data_source.Rows.Add (row);
  264. }
  265. for (int i = 5; i < 10; i++) {
  266. cm.Position = i;
  267. DataRowView row = cm.Current as DataRowView;
  268. Assert.IsFalse (row == null, "SETTABLE1-NULL-" + i);
  269. Assert.AreEqual (row ["Column"], i, "SETTABLE1-" + i);
  270. }
  271. for (int i = 5; i >= 0; i--) {
  272. cm.Position = i;
  273. DataRowView row = cm.Current as DataRowView;
  274. Assert.IsFalse (row == null, "SETTABLE2-NULL-" + i);
  275. Assert.AreEqual (row ["Column"], i, "SETTABLE2-" + i);
  276. }
  277. }
  278. [Test]
  279. public void NavigateDataSetToTable ()
  280. {
  281. DataSet data_source = new DataSet ("DataSet");
  282. DataTable table = new DataTable ("Table");
  283. DataColumn column = new DataColumn ("Column");
  284. BindingContext bc = new BindingContext ();
  285. data_source.Tables.Add (table);
  286. column.DataType = typeof (int);
  287. table.Columns.Add (column);
  288. for (int i = 0; i < 10; i++) {
  289. DataRow row = table.NewRow ();
  290. row ["Column"] = i;
  291. table.Rows.Add (row);
  292. }
  293. CurrencyManager cm = bc [data_source, "Table"] as CurrencyManager;
  294. Assert.AreEqual (0, cm.Position, "NAVSETTOTABLE1");
  295. Assert.AreEqual (10, cm.Count, "NAVSETTOTABLE2");
  296. Assert.AreEqual (typeof (DataView), cm.List.GetType (), "NAVSETTOTABLE3");
  297. for (int i = 0; i < 10; i++) {
  298. DataRowView row = cm.Current as DataRowView;
  299. Assert.IsFalse (row == null, "NAVSETTOTABLE-NULL-" + i);
  300. Assert.AreEqual (i, row ["Column"], "NAVSETTOTABLE-" + i);
  301. cm.Position++;
  302. }
  303. cm.Position++;
  304. cm.Position++;
  305. Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "NAVSETTOTABLE-END");
  306. }
  307. [Test]
  308. public void NavigateDataSetToColumn ()
  309. {
  310. DataSet data_source = new DataSet ("DataSet");
  311. DataTable table = new DataTable ("Table");
  312. DataColumn column = new DataColumn ("Column");
  313. BindingContext bc = new BindingContext ();
  314. data_source.Tables.Add (table);
  315. column.DataType = typeof (int);
  316. table.Columns.Add (column);
  317. for (int i = 0; i < 10; i++) {
  318. DataRow row = table.NewRow ();
  319. row ["Column"] = i;
  320. table.Rows.Add (row);
  321. }
  322. CurrencyManager cm = bc [data_source, "Table.Column"] as CurrencyManager;
  323. Assert.AreEqual (null, cm, "NAVSETTOCOLUMN1");
  324. }
  325. [Test]
  326. public void NavigateDataSetToParentRelation ()
  327. {
  328. DataSet data_source = CreateRelatedDataSet ();
  329. BindingContext bc = new BindingContext ();
  330. CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
  331. Assert.AreEqual (0, cm.Position, "NAVSETTORELATION1");
  332. Assert.AreEqual (1, cm.Count, "NAVSETTORELATION2");
  333. Assert.IsTrue (cm.List is DataView, "NAVSETTORELATION3");
  334. DataRowView row = cm.Current as DataRowView;
  335. Assert.IsFalse (row == null, "NAVSETTORELATION-NULL-VALUE");
  336. Assert.AreEqual (0, row ["Two"], "NAVSETTORELATION-VALUE");
  337. cm.Position++;
  338. cm.Position++;
  339. Assert.AreEqual (0, ((DataRowView) cm.Current) ["Two"], "NAVSETTORELATION-END");
  340. }
  341. [Test]
  342. [ExpectedException (typeof (ArgumentException))]
  343. public void DataSetToChildRelation ()
  344. {
  345. DataSet data_source = CreateRelatedDataSet ();
  346. BindingContext bc = new BindingContext ();
  347. // Can't create a list on a child relation
  348. CurrencyManager cm = bc [data_source, "Table2.Relation"] as CurrencyManager;
  349. TestHelper.RemoveWarning (cm);
  350. }
  351. [Test]
  352. public void DataSetToParentRelationField ()
  353. {
  354. DataSet data_source = CreateRelatedDataSet ();
  355. BindingContext bc = new BindingContext ();
  356. CurrencyManager cm = bc [data_source, "Table1.Relation.Two"] as CurrencyManager;
  357. Assert.AreEqual (null, cm, "SETTOPARENTRELATIONFIELD");
  358. }
  359. [Test]
  360. public void MultiColumnedRelation ()
  361. {
  362. DataSet dataset = new DataSet ();
  363. DataTable sports = new DataTable ("Sports");
  364. DataTable athletes = new DataTable ("Athletes");
  365. DataColumn column;
  366. DataRow row;
  367. column = new DataColumn ();
  368. column.DataType = typeof (int);
  369. column.ColumnName = "SportID";
  370. column.Unique = true;
  371. sports.Columns.Add (column);
  372. column = new DataColumn ();
  373. column.DataType = typeof (string);
  374. column.ColumnName = "SportName";
  375. sports.Columns.Add (column);
  376. string [] sports_names = new string [] { "Hockey", "Baseball", "Basketball", "Football", "Boxing", "Surfing" };
  377. for (int i = 0; i < sports_names.Length; i++) {
  378. row = sports.NewRow ();
  379. row ["SportID"] = i;
  380. row ["SportName"] = sports_names [i];
  381. sports.Rows.Add (row);
  382. }
  383. // Athletes table
  384. column = new DataColumn ();
  385. column.DataType = typeof (int);
  386. column.ColumnName = "AthleteID";
  387. column.Unique = true;
  388. athletes.Columns.Add (column);
  389. column = new DataColumn ();
  390. column.DataType = typeof (int);
  391. column.ColumnName = "Sport";
  392. athletes.Columns.Add (column);
  393. column = new DataColumn ();
  394. column.DataType = typeof (string);
  395. column.ColumnName = "AthleteName";
  396. athletes.Columns.Add (column);
  397. string [] athlete_names = new string [] { "@alp", "@lupus", "@tjfontaine", "duncan", "marv", "WindowsUninstall",
  398. "@jackson", "@migHome", "_Synced[work]", "GodZhila", "Raboo",
  399. "@jchambers", "@mkestner", "barbosa", "IzeBurn", "squinky86",
  400. "@kangaroo", "@paco", "Demian", "logiclrd", "tenshiKur0" };
  401. for (int i = 0; i < athlete_names.Length; i++) {
  402. row = athletes.NewRow ();
  403. row ["AthleteID"] = i;
  404. row ["Sport"] = i % sports_names.Length;
  405. row ["AthleteName"] = athlete_names [i];
  406. athletes.Rows.Add (row);
  407. }
  408. dataset.Tables.Add (sports);
  409. dataset.Tables.Add (athletes);
  410. dataset.Relations.Add ("AthletesSports", sports.Columns ["SportID"], athletes.Columns ["Sport"]);
  411. BindingContext bc = new BindingContext ();
  412. CurrencyManager cm = bc [dataset, "Sports.AthletesSports"] as CurrencyManager;
  413. Assert.AreEqual (0, cm.Position, "MC1");
  414. Assert.AreEqual (4, cm.Count, "MC2");
  415. DataRowView rowview = cm.Current as DataRowView;
  416. Assert.IsFalse (rowview == null, "MC3");
  417. Assert.AreEqual (0, rowview ["AthleteID"], "MC4");
  418. Assert.AreEqual ("@alp", rowview ["AthleteName"], "MC5");
  419. Assert.AreEqual (0, rowview ["Sport"], "MC6");
  420. cm.Position++;
  421. rowview = cm.Current as DataRowView;
  422. Assert.IsFalse (rowview == null, "MC7");
  423. Assert.AreEqual (6, rowview ["AthleteID"], "MC8");
  424. Assert.AreEqual ("@jackson", rowview ["AthleteName"], "MC9");
  425. Assert.AreEqual (0, rowview ["Sport"], "MC10");
  426. cm.Position++;
  427. rowview = cm.Current as DataRowView;
  428. Assert.IsFalse (rowview == null, "MC11");
  429. Assert.AreEqual (12, rowview ["AthleteID"], "MC12");
  430. Assert.AreEqual ("@mkestner", rowview ["AthleteName"], "MC13");
  431. Assert.AreEqual (0, rowview ["Sport"], "MC14");
  432. cm.Position++;
  433. rowview = cm.Current as DataRowView;
  434. Assert.IsFalse (rowview == null, "MC15");
  435. Assert.AreEqual (18, rowview ["AthleteID"], "MC16");
  436. Assert.AreEqual ("Demian", rowview ["AthleteName"], "MC17");
  437. Assert.AreEqual (0, rowview ["Sport"], "MC18");
  438. cm.Position++;
  439. rowview = cm.Current as DataRowView;
  440. Assert.IsFalse (rowview == null, "MC19");
  441. Assert.AreEqual (18, rowview ["AthleteID"], "MC20");
  442. Assert.AreEqual ("Demian", rowview ["AthleteName"], "MC21");
  443. Assert.AreEqual (0, rowview ["Sport"], "MC22");
  444. }
  445. private DataSet CreateRelatedDataSet ()
  446. {
  447. DataSet dataset = new DataSet ("DataSet");
  448. DataTable dt1 = new DataTable ("Table1");
  449. DataTable dt2 = new DataTable ("Table2");
  450. DataColumn column;
  451. column = new DataColumn ("One");
  452. column.DataType = typeof (int);
  453. column.Unique = true;
  454. dt1.Columns.Add (column);
  455. for (int i = 0; i < 10; i++) {
  456. DataRow row = dt1.NewRow ();
  457. row ["One"] = i;
  458. dt1.Rows.Add (row);
  459. }
  460. column = new DataColumn ("Two");
  461. column.DataType = typeof (int);
  462. column.Unique = true;
  463. dt2.Columns.Add (column);
  464. for (int i = 0; i < 10; i++) {
  465. DataRow row = dt2.NewRow ();
  466. row ["Two"] = i;
  467. dt2.Rows.Add (row);
  468. }
  469. dataset.Tables.Add (dt1);
  470. dataset.Tables.Add (dt2);
  471. dataset.Relations.Add ("Relation", dt1.Columns ["One"], dt2.Columns ["Two"]);
  472. return dataset;
  473. }
  474. [Test]
  475. public void EndUninitializedEdit ()
  476. {
  477. ArrayList list = new ArrayList ();
  478. BindingContext bc = new BindingContext ();
  479. CurrencyManager cm = bc [list] as CurrencyManager;
  480. cm.EndCurrentEdit ();
  481. }
  482. [Test]
  483. public void CancelUninitializedEdit ()
  484. {
  485. ArrayList list = new ArrayList ();
  486. BindingContext bc = new BindingContext ();
  487. CurrencyManager cm = bc [list] as CurrencyManager;
  488. cm.CancelCurrentEdit ();
  489. }
  490. [Test]
  491. public void CheckPositionOfRelatedSibling1 ()
  492. {
  493. DataSet data_source = CreateRelatedDataSet ();
  494. BindingContext bc = new BindingContext ();
  495. CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
  496. CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
  497. cm.Position++;
  498. cm.Position++;
  499. // position is not updated
  500. Assert.AreEqual (0, scm.Position, "#8");
  501. }
  502. [Test]
  503. public void CheckPositionOfRelatedSibling2 ()
  504. {
  505. DataSet data_source = CreateRelatedDataSet ();
  506. BindingContext bc = new BindingContext ();
  507. CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
  508. CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
  509. Assert.AreEqual (0, cm.Position, "#1");
  510. scm.Position++;
  511. Assert.AreEqual (0, cm.Position, "#2");
  512. }
  513. int event_num;
  514. int current_changed;
  515. int position_changed;
  516. int item_changed;
  517. int metadata_changed;
  518. string event_log = "";
  519. ItemChangedEventArgs item_changed_args;
  520. void CurrentChanged (object sender, EventArgs args)
  521. {
  522. current_changed = ++event_num;
  523. Console.WriteLine ("current_changed = {0}", current_changed);
  524. Console.WriteLine (Environment.StackTrace);
  525. event_log += String.Format ("{0}: CurrentChanged\n", current_changed);
  526. }
  527. void PositionChanged (object sender, EventArgs args)
  528. {
  529. position_changed = ++event_num;
  530. Console.WriteLine ("position_changed = {0}", position_changed);
  531. Console.WriteLine (Environment.StackTrace);
  532. event_log += String.Format ("{0}: PositionChanged (to {1})\n", position_changed, ((CurrencyManager)sender).Position);
  533. }
  534. void ItemChanged (object sender, ItemChangedEventArgs args)
  535. {
  536. item_changed = ++event_num;
  537. item_changed_args = args;
  538. Console.WriteLine ("item_changed = {0}, index = {1}", item_changed, args.Index);
  539. Console.WriteLine (Environment.StackTrace);
  540. event_log += String.Format ("{0}: ItemChanged (index = {1})\n", item_changed, args.Index);
  541. }
  542. void ListChanged (object sender, ListChangedEventArgs args)
  543. {
  544. Console.WriteLine ("ListChanged ({0},{1},{2})", args.ListChangedType, args.OldIndex, args.NewIndex);
  545. Console.WriteLine (Environment.StackTrace);
  546. event_log += String.Format (" : ListChanged ({0}, {1}, {2})\n", args.ListChangedType, args.OldIndex, args.NewIndex);
  547. }
  548. void MetaDataChanged (object sender, EventArgs args)
  549. {
  550. metadata_changed = ++event_num;
  551. Console.WriteLine ("metadata_changed = {0}", metadata_changed);
  552. Console.WriteLine (Environment.StackTrace);
  553. event_log += String.Format ("{0}: MetaDataChanged\n", metadata_changed);
  554. }
  555. [Test]
  556. public void AddNew ()
  557. {
  558. DataSet data_source = CreateRelatedDataSet ();
  559. BindingContext bc = new BindingContext ();
  560. CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
  561. event_num = current_changed = position_changed = -1;
  562. cm.CurrentChanged += new EventHandler (CurrentChanged);
  563. cm.PositionChanged += new EventHandler (PositionChanged);
  564. cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
  565. Assert.AreEqual (0, cm.Position, "AddNew1");
  566. Assert.AreEqual (10, cm.Count, "AddNew2");
  567. Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
  568. cm.AddNew ();
  569. Assert.AreEqual (10, cm.Position, "AddNew3");
  570. Assert.AreEqual (11, cm.Count, "AddNew4");
  571. Assert.AreEqual (cm.Count, cm.List.Count, "AddNew4.5");
  572. Assert.AreEqual (0, item_changed, "AddNew5");
  573. Assert.AreEqual (-1, item_changed_args.Index, "AddNew6");
  574. Assert.AreEqual (1, current_changed, "AddNew7");
  575. Assert.AreEqual (2, position_changed, "AddNew8");
  576. cm.CurrentChanged -= new EventHandler (CurrentChanged);
  577. cm.PositionChanged -= new EventHandler (PositionChanged);
  578. }
  579. [Test]
  580. public void CancelAddNew ()
  581. {
  582. DataSet data_source = CreateRelatedDataSet ();
  583. BindingContext bc = new BindingContext ();
  584. CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
  585. DataView dv = cm.List as DataView;
  586. event_num = current_changed = position_changed = -1;
  587. cm.CurrentChanged += new EventHandler (CurrentChanged);
  588. cm.PositionChanged += new EventHandler (PositionChanged);
  589. cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
  590. dv.ListChanged += new ListChangedEventHandler (ListChanged);
  591. Assert.AreEqual (0, cm.Position, "CancelAddNew1");
  592. Assert.AreEqual (10, cm.Count, "CancelAddNew2");
  593. Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
  594. cm.AddNew ();
  595. Assert.AreEqual (0, item_changed, "CancelAddNew3");
  596. Assert.AreEqual (-1, item_changed_args.Index, "CancelAddNew4");
  597. Assert.AreEqual (1, current_changed, "CancelAddNew5");
  598. Assert.AreEqual (2, position_changed, "CancelAddNew6");
  599. cm.CancelCurrentEdit ();
  600. Assert.AreEqual (6, item_changed, "CancelAddNew7");
  601. Assert.AreEqual (9, item_changed_args.Index, "CancelAddNew8");
  602. Assert.AreEqual (3, current_changed, "CancelAddNew9");
  603. Assert.AreEqual (4, position_changed, "CancelAddNew10");
  604. Assert.AreEqual (9, cm.Position, "CancelAddNew11");
  605. Assert.AreEqual (10, cm.Count, "CancelAddNew12");
  606. Assert.AreEqual (cm.Count, cm.List.Count, "AddNew12.5");
  607. cm.CurrentChanged -= new EventHandler (CurrentChanged);
  608. cm.PositionChanged -= new EventHandler (PositionChanged);
  609. }
  610. [Test]
  611. public void EndAddNew ()
  612. {
  613. DataSet data_source = CreateRelatedDataSet ();
  614. BindingContext bc = new BindingContext ();
  615. CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
  616. event_num = current_changed = position_changed = -1;
  617. cm.CurrentChanged += new EventHandler (CurrentChanged);
  618. cm.PositionChanged += new EventHandler (PositionChanged);
  619. cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
  620. Assert.AreEqual (0, cm.Position, "EndAddNew1");
  621. Assert.AreEqual (10, cm.Count, "EndAddNew2");
  622. cm.AddNew ();
  623. Assert.AreEqual (0, item_changed, "EndAddNew3");
  624. Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew4");
  625. Assert.AreEqual (1, current_changed, "EndAddNew5");
  626. Assert.AreEqual (2, position_changed, "EndAddNew6");
  627. cm.EndCurrentEdit ();
  628. Assert.AreEqual (3, item_changed, "EndAddNew7");
  629. Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew8");
  630. Assert.AreEqual (1, current_changed, "EndAddNew9");
  631. Assert.AreEqual (2, position_changed, "EndAddNew10");
  632. Assert.AreEqual (10, cm.Position, "EndAddNew11");
  633. Assert.AreEqual (11, cm.Count, "EndAddNew12");
  634. cm.CurrentChanged -= new EventHandler (CurrentChanged);
  635. cm.PositionChanged -= new EventHandler (PositionChanged);
  636. }
  637. [Test]
  638. public void AddNew2 ()
  639. {
  640. DataSet data_source = CreateRelatedDataSet ();
  641. BindingContext bc = new BindingContext ();
  642. CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
  643. DataView dv = cm.List as DataView;
  644. event_num = current_changed = position_changed = -1;
  645. cm.CurrentChanged += new EventHandler (CurrentChanged);
  646. cm.PositionChanged += new EventHandler (PositionChanged);
  647. cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
  648. dv.ListChanged += new ListChangedEventHandler (ListChanged);
  649. Assert.AreEqual (0, cm.Position, "AddNew1");
  650. Assert.AreEqual (10, cm.Count, "AddNew2");
  651. cm.AddNew ();
  652. Assert.AreEqual (10, cm.Position, "AddNew3");
  653. Assert.AreEqual (11, cm.Count, "AddNew4");
  654. // this does an implicit EndCurrentEdit
  655. cm.AddNew ();
  656. Assert.AreEqual (11, cm.Position, "AddNew5");
  657. Assert.AreEqual (12, cm.Count, "AddNew6");
  658. }
  659. DataSet CreateRelatedDataSetLarge ()
  660. {
  661. DataSet dataset = new DataSet ("CustomerSet");
  662. DataTable dt1 = new DataTable ("Customers");
  663. DataTable dt2 = new DataTable ("Orders");
  664. DataTable dt3 = new DataTable ("Addresses");
  665. DataColumn column;
  666. // customer table
  667. column = new DataColumn ("CustomerID");
  668. column.DataType = typeof (int);
  669. column.Unique = true;
  670. dt1.Columns.Add (column);
  671. column = new DataColumn ("CustomerName");
  672. column.DataType = typeof (string);
  673. column.Unique = false;
  674. dt1.Columns.Add (column);
  675. // order table
  676. column = new DataColumn ("OrderID");
  677. column.DataType = typeof (int);
  678. column.Unique = true;
  679. dt2.Columns.Add (column);
  680. column = new DataColumn ("ItemName");
  681. column.DataType = typeof (string);
  682. column.Unique = false;
  683. dt2.Columns.Add (column);
  684. column = new DataColumn ("CustomerID");
  685. column.DataType = typeof (int);
  686. column.Unique = false;
  687. dt2.Columns.Add (column);
  688. column = new DataColumn ("AddressID");
  689. column.DataType = typeof (int);
  690. column.Unique = false;
  691. dt2.Columns.Add (column);
  692. // address table
  693. column = new DataColumn ("AddressID");
  694. column.DataType = typeof (int);
  695. column.Unique = true;
  696. dt3.Columns.Add (column);
  697. column = new DataColumn ("AddressString");
  698. column.DataType = typeof (string);
  699. column.Unique = false;
  700. dt3.Columns.Add (column);
  701. column = new DataColumn ("CustomerID");
  702. column.DataType = typeof (int);
  703. column.Unique = false;
  704. dt3.Columns.Add (column);
  705. for (int i = 0; i < 10; i ++) {
  706. DataRow row = dt1.NewRow ();
  707. row["CustomerID"] = i;
  708. row["CustomerName"] = String.Format ("Customer Name #{0}", i);
  709. dt1.Rows.Add (row);
  710. }
  711. int ordernum = 0;
  712. for (int i = 0; i < 10; i ++) {
  713. for (int j = 0; j < (i < 5 ? 3 : 5); j ++) {
  714. DataRow row = dt2.NewRow ();
  715. row["OrderID"] = ordernum++;
  716. row["ItemName"] = String.Format ("Item order #{0}", j);
  717. row["CustomerID"] = i;
  718. row["AddressID"] = j;
  719. dt2.Rows.Add (row);
  720. }
  721. }
  722. int addressid = 0;
  723. for (int i = 0; i < 4; i ++) {
  724. for (int j = 0; j < 4; j ++) {
  725. DataRow row = dt3.NewRow ();
  726. row["AddressID"] = addressid++;
  727. row["AddressString"] = String.Format ("Customer Address {0}", j);
  728. row["CustomerID"] = i;
  729. dt3.Rows.Add (row);
  730. }
  731. }
  732. dataset.Tables.Add (dt1);
  733. dataset.Tables.Add (dt2);
  734. dataset.Tables.Add (dt3);
  735. dataset.Relations.Add ("Customer_Orders", dt1.Columns["CustomerID"], dt2.Columns["CustomerID"]);
  736. dataset.Relations.Add ("Customer_Addresses", dt1.Columns["CustomerID"], dt3.Columns["CustomerID"]);
  737. dataset.Relations.Add ("Address_Orders", dt3.Columns["AddressID"], dt2.Columns["AddressID"]);
  738. return dataset;
  739. }
  740. [Test]
  741. public void RelatedCurrencyManagerTest ()
  742. {
  743. DataSet data_source = CreateRelatedDataSetLarge ();
  744. BindingContext bc = new BindingContext ();
  745. CurrencyManager cm = bc [data_source, "Customers"] as CurrencyManager;
  746. CurrencyManager rcm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
  747. IList list = rcm.List;
  748. Assert.AreEqual (3, rcm.Count, "count1");
  749. Assert.AreEqual (3, list.Count, "listcount1");
  750. cm.Position = 1;
  751. Assert.AreEqual (3, rcm.Count, "count2");
  752. Assert.AreEqual (3, list.Count, "listcount2");
  753. cm.Position = 5;
  754. Assert.AreEqual (5, rcm.Count, "count3");
  755. Assert.AreEqual (3, list.Count, "listcount3");
  756. }
  757. [Test]
  758. public void TestCurrencyManagerBindings ()
  759. {
  760. DataSet data_source = CreateRelatedDataSetLarge ();
  761. BindingContext bc = new BindingContext ();
  762. CurrencyManager cm = bc [data_source] as CurrencyManager;
  763. Console.WriteLine ("cm properties:");
  764. foreach (PropertyDescriptor pd in cm.GetItemProperties ())
  765. Console.WriteLine (" + {0}", pd.Name);
  766. Console.WriteLine ();
  767. Console.WriteLine ("dataset:");
  768. Console.WriteLine ("cm = {0}", cm.GetType());
  769. Console.WriteLine ("cm.Count = {0}", cm.Count);
  770. cm.Position = 0;
  771. Console.WriteLine ("cm.Current = {0}", cm.Current);
  772. Console.WriteLine ("cm.Current properties");
  773. foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
  774. Console.WriteLine (" + {0}", pd.Name);
  775. Console.WriteLine ();
  776. cm = bc [data_source.Tables["Customers"]] as CurrencyManager;
  777. Console.WriteLine ("datatable:");
  778. Console.WriteLine ("cm = {0}", cm.GetType());
  779. Console.WriteLine ("cm.Count = {0}", cm.Count);
  780. cm.Position = 0;
  781. Console.WriteLine ("cm.Current = {0}", cm.Current);
  782. Console.WriteLine ("cm.Current properties");
  783. foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
  784. Console.WriteLine (" + {0}", pd.Name);
  785. Console.WriteLine ();
  786. DataViewManager vm = new DataViewManager (data_source);
  787. Console.WriteLine ("vm properties:");
  788. foreach (PropertyDescriptor pd in ((ITypedList)vm).GetItemProperties (null))
  789. Console.WriteLine (" + {0}", pd.Name);
  790. Console.WriteLine ();
  791. }
  792. Type GetFinalType (CurrencyManager cm)
  793. {
  794. FieldInfo fi = cm.GetType().GetField ("finalType", BindingFlags.NonPublic | BindingFlags.Instance);
  795. return (Type)fi.GetValue (cm);
  796. }
  797. [Test]
  798. public void FinalTypeTest ()
  799. {
  800. BindingContext bc = new BindingContext ();
  801. CurrencyManager cm;
  802. ArrayList al;
  803. DataSet data_source = CreateRelatedDataSetLarge ();
  804. /* empty arraylist */
  805. al = new ArrayList ();
  806. cm = bc[al] as CurrencyManager;
  807. Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A1");
  808. /* arraylist with a string element*/
  809. al = new ArrayList ();
  810. al.Add ("hi");
  811. cm = bc[al] as CurrencyManager;
  812. Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A2");
  813. /* string array */
  814. string[] s = new string[1];
  815. s[0] = "hi";
  816. cm = bc[s] as CurrencyManager;
  817. Assert.AreEqual (typeof (string[]), GetFinalType (cm), "A3");
  818. /* dataview */
  819. cm = bc [data_source, "Customers"] as CurrencyManager;
  820. Assert.AreEqual (typeof (DataView), GetFinalType (cm), "A4");
  821. /* relatedview */
  822. cm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
  823. /* on MS this is a RelatedView, on Mono a RelatedDataView. both subclass from DataView, so let's check that. */
  824. Assert.IsFalse (typeof (DataView) == GetFinalType (cm), "A5");
  825. Assert.IsTrue (typeof (DataView).IsAssignableFrom (GetFinalType (cm)), "A6");
  826. }
  827. // dataview binding
  828. [Test]
  829. public void Bug81022 ()
  830. {
  831. BindingContext bc = new BindingContext ();
  832. CurrencyManager cm;
  833. DataView dv = new DataView();
  834. DataTable dt = new DataTable("Testdata");
  835. cm = (CurrencyManager)bc [dt];
  836. event_num = current_changed = position_changed = item_changed = metadata_changed = -1;
  837. cm.CurrentChanged += new EventHandler (CurrentChanged);
  838. cm.PositionChanged += new EventHandler (PositionChanged);
  839. cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
  840. cm.MetaDataChanged += new EventHandler (MetaDataChanged);
  841. dv.ListChanged += new ListChangedEventHandler (ListChanged);
  842. dv.Table = dt;
  843. Assert.AreEqual (-1, current_changed, "1");
  844. Assert.AreEqual (-1, position_changed, "2");
  845. Assert.AreEqual (-1, item_changed, "3");
  846. Assert.AreEqual (-1, metadata_changed, "4");
  847. event_num = current_changed = position_changed = item_changed = metadata_changed = -1;
  848. dt.Columns.Add("A");
  849. Assert.AreEqual (-1, current_changed, "5");
  850. Assert.AreEqual (-1, position_changed, "6");
  851. Assert.AreEqual (-1, item_changed, "7");
  852. Assert.AreEqual (0, metadata_changed, "8");
  853. event_num = current_changed = position_changed = item_changed = metadata_changed = -1;
  854. dt.Columns.Add("B");
  855. Assert.AreEqual (-1, current_changed, "9");
  856. Assert.AreEqual (-1, position_changed, "10");
  857. Assert.AreEqual (-1, item_changed, "11");
  858. Assert.AreEqual (0, metadata_changed, "12");
  859. event_num = current_changed = position_changed = item_changed = metadata_changed = -1;
  860. dt.Rows.Add(new object[]{"A1", "B1"});
  861. Assert.AreEqual (1, current_changed, "13");
  862. Assert.AreEqual (0, position_changed, "14");
  863. Assert.AreEqual (3, item_changed, "15");
  864. Assert.AreEqual (-1, metadata_changed, "16");
  865. event_num = current_changed = position_changed = item_changed = metadata_changed = -1;
  866. dt.Rows.Add(new object[]{"A2", "B2"});
  867. Assert.AreEqual (-1, current_changed, "17");
  868. Assert.AreEqual (-1, position_changed, "18");
  869. Assert.AreEqual (0, item_changed, "19");
  870. Assert.AreEqual (-1, metadata_changed, "20");
  871. Assert.AreEqual (2, cm.Count, "21");
  872. }
  873. #if NET_2_0
  874. [Test]
  875. [Category ("NotWorking")]
  876. public void TestDeleteInEdit ()
  877. {
  878. BindingContext bc = new BindingContext ();
  879. CurrencyManager cm;
  880. DataSet dataSet1 = new DataSet();
  881. dataSet1.Tables.Add();
  882. dataSet1.Tables[0].Columns.Add();
  883. dataSet1.Tables[0].Rows.Add();
  884. cm = (CurrencyManager) bc[dataSet1, dataSet1.Tables[0].TableName];
  885. cm.Position = 0;
  886. Assert.AreEqual (1, cm.Count, "1");
  887. DataRowView row = (DataRowView)cm.Current;
  888. event_num = current_changed = position_changed = item_changed = metadata_changed = -1;
  889. event_log = "";
  890. cm.CurrentChanged += new EventHandler (CurrentChanged);
  891. cm.PositionChanged += new EventHandler (PositionChanged);
  892. cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
  893. cm.MetaDataChanged += new EventHandler (MetaDataChanged);
  894. Console.WriteLine (">>>>");
  895. row.Delete ();
  896. Console.WriteLine ("<<<<");
  897. Assert.AreEqual ("0: PositionChanged (to -1)\n1: ItemChanged (index = -1)\n2: PositionChanged (to -1)\n3: CurrentChanged\n4: ItemChanged (index = -1)\n", event_log, "1");
  898. Assert.AreEqual (0, cm.Count, "2");
  899. }
  900. #endif
  901. }
  902. }