CurrencyManagerTest.cs 29 KB

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