CurrencyManagerTest.cs 30 KB

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