DataViewTest.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. // DataViewTest.cs - Nunit Test Cases for for testing the DataView
  2. // class
  3. // Authors:
  4. // Punit Kumar Todi ( [email protected] )
  5. // Patrick Kalkman [email protected]
  6. // Umadevi S ([email protected])
  7. // Atsushi Enomoto ([email protected])
  8. // Sureshkumar T <[email protected]>
  9. //
  10. // (C) 2003 Patrick Kalkman
  11. //
  12. // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
  13. //
  14. // Permission is hereby granted, free of charge, to any person obtaining
  15. // a copy of this software and associated documentation files (the
  16. // "Software"), to deal in the Software without restriction, including
  17. // without limitation the rights to use, copy, modify, merge, publish,
  18. // distribute, sublicense, and/or sell copies of the Software, and to
  19. // permit persons to whom the Software is furnished to do so, subject to
  20. // the following conditions:
  21. //
  22. // The above copyright notice and this permission notice shall be
  23. // included in all copies or substantial portions of the Software.
  24. //
  25. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  26. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  27. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  28. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  29. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  30. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  31. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  32. //
  33. using NUnit.Framework;
  34. using System;
  35. using System.Data;
  36. using System.ComponentModel;
  37. using System.IO;
  38. namespace MonoTests.System.Data
  39. {
  40. [TestFixture]
  41. public class DataViewTest : Assertion
  42. {
  43. DataTable dataTable;
  44. DataView dataView;
  45. Random rndm;
  46. int seed, rowCount;
  47. ListChangedEventArgs listChangedArgs;
  48. TextWriter eventWriter;
  49. [SetUp]
  50. public void GetReady ()
  51. {
  52. dataTable = new DataTable ("itemTable");
  53. DataColumn dc1 = new DataColumn ("itemId");
  54. DataColumn dc2 = new DataColumn ("itemName");
  55. DataColumn dc3 = new DataColumn ("itemPrice");
  56. DataColumn dc4 = new DataColumn ("itemCategory");
  57. dataTable.Columns.Add (dc1);
  58. dataTable.Columns.Add (dc2);
  59. dataTable.Columns.Add (dc3);
  60. dataTable.Columns.Add (dc4);
  61. DataRow dr;
  62. seed = 123;
  63. rowCount = 5;
  64. rndm = new Random (seed);
  65. for (int i = 1; i <= rowCount; i++) {
  66. dr = dataTable.NewRow ();
  67. dr["itemId"] = "item " + i;
  68. dr["itemName"] = "name " + rndm.Next ();
  69. dr["itemPrice"] = "Rs. " + (rndm.Next () % 1000);
  70. dr["itemCategory"] = "Cat " + ((rndm.Next () % 10) + 1);
  71. dataTable.Rows.Add (dr);
  72. }
  73. dataTable.AcceptChanges ();
  74. dataView = new DataView (dataTable);
  75. dataView.ListChanged += new ListChangedEventHandler (OnListChanged);
  76. listChangedArgs = null;
  77. }
  78. protected void OnListChanged (object sender, ListChangedEventArgs args)
  79. {
  80. listChangedArgs = args;
  81. // for debugging
  82. /*Console.WriteLine("EventType :: " + listChangedArgs.ListChangedType +
  83. " oldIndex :: " + listChangedArgs.OldIndex +
  84. " NewIndex :: " + listChangedArgs.NewIndex);*/
  85. }
  86. private void PrintTableOrView (DataTable t, string label)
  87. {
  88. Console.WriteLine ("\n" + label);
  89. for (int i = 0; i<t.Rows.Count; i++){
  90. foreach (DataColumn dc in t.Columns)
  91. Console.Write (t.Rows [i][dc] + "\t");
  92. Console.WriteLine ("");
  93. }
  94. Console.WriteLine ();
  95. }
  96. private void PrintTableOrView (DataView dv, string label)
  97. {
  98. Console.WriteLine ("\n" + label);
  99. Console.WriteLine ("Sort Key :: " + dv.Sort);
  100. for (int i = 0; i < dv.Count; i++) {
  101. foreach (DataColumn dc in dv.Table.Columns)
  102. Console.Write (dv [i].Row [dc] + "\t");
  103. Console.WriteLine ("");
  104. }
  105. Console.WriteLine ();
  106. }
  107. [TearDown]
  108. public void Clean ()
  109. {
  110. dataTable = null;
  111. dataView = null;
  112. }
  113. [Test]
  114. public void DataView ()
  115. {
  116. DataView dv1,dv2,dv3;
  117. dv1 = new DataView ();
  118. // AssertEquals ("test#01",null,dv1.Table);
  119. AssertEquals ("test#02",true,dv1.AllowNew);
  120. AssertEquals ("test#03",true,dv1.AllowEdit);
  121. AssertEquals ("test#04",true,dv1.AllowDelete);
  122. AssertEquals ("test#05",false,dv1.ApplyDefaultSort);
  123. AssertEquals ("test#06",string.Empty,dv1.RowFilter);
  124. AssertEquals ("test#07",DataViewRowState.CurrentRows,dv1.RowStateFilter);
  125. AssertEquals ("test#08",string.Empty,dv1.Sort);
  126. dv2 = new DataView (dataTable);
  127. AssertEquals ("test#09","itemTable",dv2.Table.TableName);
  128. AssertEquals ("test#10",string.Empty,dv2.Sort);
  129. AssertEquals ("test#11",false,dv2.ApplyDefaultSort);
  130. AssertEquals ("test#12",dataTable.Rows[0],dv2[0].Row);
  131. dv3 = new DataView (dataTable,"","itemId DESC",DataViewRowState.CurrentRows);
  132. AssertEquals ("test#13","",dv3.RowFilter);
  133. AssertEquals ("test#14","itemId DESC",dv3.Sort);
  134. AssertEquals ("test#15",DataViewRowState.CurrentRows,dv3.RowStateFilter);
  135. //AssertEquals ("test#16",dataTable.Rows.[(dataTable.Rows.Count-1)],dv3[0]);
  136. }
  137. [Test]
  138. public void TestValue ()
  139. {
  140. DataView TestView = new DataView (dataTable);
  141. Assertion.AssertEquals ("Dv #1", "item 1", TestView [0]["itemId"]);
  142. }
  143. [Test]
  144. public void TestCount ()
  145. {
  146. DataView TestView = new DataView (dataTable);
  147. Assertion.AssertEquals ("Dv #3", 5, TestView.Count);
  148. }
  149. [Test]
  150. public void AllowNew ()
  151. {
  152. AssertEquals ("test#01",true,dataView.AllowNew);
  153. }
  154. [Test]
  155. public void ApplyDefaultSort ()
  156. {
  157. UniqueConstraint uc = new UniqueConstraint (dataTable.Columns["itemId"]);
  158. dataTable.Constraints.Add (uc);
  159. dataView.ApplyDefaultSort = true;
  160. // dataView.Sort = "itemName";
  161. // AssertEquals ("test#01","item 1",dataView[0]["itemId"]);
  162. AssertEquals ("test#02",ListChangedType.Reset,listChangedArgs.ListChangedType);
  163. // UnComment the line below to see if dataView is sorted
  164. // PrintTableOrView (dataView,"* OnApplyDefaultSort");
  165. }
  166. [Test]
  167. public void RowStateFilter ()
  168. {
  169. dataView.RowStateFilter = DataViewRowState.Deleted;
  170. AssertEquals ("test#01",ListChangedType.Reset,listChangedArgs.ListChangedType);
  171. }
  172. [Test]
  173. public void RowStateFilter_2 ()
  174. {
  175. DataSet dataset = new DataSet ("new");
  176. DataTable dt = new DataTable ("table1");
  177. dataset.Tables.Add (dt);
  178. dt.Columns.Add ("col1");
  179. dt.Columns.Add ("col2");
  180. dt.Rows.Add (new object [] {1,1});
  181. dt.Rows.Add (new object [] {1,2});
  182. dt.Rows.Add (new object [] {1,3});
  183. dataset.AcceptChanges ();
  184. DataView dataView = new DataView (dataset.Tables [0]);
  185. // 'new' table in this sample contains 6 records
  186. dataView.AllowEdit = true;
  187. dataView.AllowDelete = true;
  188. string v;
  189. // Editing the row
  190. dataView [0] ["col1"] = -1;
  191. dataView.RowStateFilter = DataViewRowState.ModifiedOriginal;
  192. v = dataView [0] [0].ToString ();
  193. AssertEquals ("ModifiedOriginal.Count", 1, dataView.Count);
  194. AssertEquals ("ModifiedOriginal.Value", "1", v);
  195. // Deleting the row
  196. dataView.Delete (0);
  197. dataView.RowStateFilter = DataViewRowState.Deleted;
  198. v = dataView [0] [0].ToString ();
  199. AssertEquals ("Deleted.Count", 1, dataView.Count);
  200. AssertEquals ("Deleted.Value", "1", v);
  201. }
  202. #region Sort Tests
  203. [Test]
  204. public void SortListChangedTest ()
  205. {
  206. dataView.Sort = "itemName DESC";
  207. AssertEquals ("test#01",ListChangedType.Reset,listChangedArgs.ListChangedType);
  208. // UnComment the line below to see if dataView is sorted
  209. // PrintTableOrView (dataView);
  210. }
  211. [Test]
  212. public void SortTestWeirdColumnName ()
  213. {
  214. DataTable dt = new DataTable ();
  215. dt.Columns.Add ("id]", typeof (int));
  216. dt.Columns.Add ("[id", typeof (int));
  217. DataView dv = dt.DefaultView;
  218. dv.Sort = "id]";
  219. //dv.Sort = "[id"; // this is not allowed
  220. dv.Sort = "[id]]";
  221. dv.Sort = "[[id]";
  222. dv.Sort = "id] ASC";
  223. dv.Sort = "[id]] DESC";
  224. dv.Sort = "[[id] ASC";
  225. }
  226. [Test]
  227. public void SortTests ()
  228. {
  229. DataTable dataTable = new DataTable ("itemTable");
  230. DataColumn dc1 = new DataColumn ("itemId", typeof(int));
  231. DataColumn dc2 = new DataColumn ("itemName", typeof(string));
  232. dataTable.Columns.Add (dc1);
  233. dataTable.Columns.Add (dc2);
  234. dataTable.Rows.Add (new object[2] { 1, "First entry" });
  235. dataTable.Rows.Add (new object[2] { 0, "Second entry" });
  236. dataTable.Rows.Add (new object[2] { 3, "Third entry" });
  237. dataTable.Rows.Add (new object[2] { 2, "Fourth entry" });
  238. DataView dataView = dataTable.DefaultView;
  239. string s = "Default sorting: ";
  240. AssertEquals (s + "First entry has wrong item", 1, dataView[0][0]);
  241. AssertEquals (s + "Second entry has wrong item", 0, dataView[1][0]);
  242. AssertEquals (s + "Third entry has wrong item", 3, dataView[2][0]);
  243. AssertEquals (s + "Fourth entry has wrong item", 2, dataView[3][0]);
  244. s = "Ascending sorting 1: ";
  245. dataView.Sort = "itemId ASC";
  246. AssertEquals (s + "First entry has wrong item", 0, dataView[0][0]);
  247. AssertEquals (s + "Second entry has wrong item", 1, dataView[1][0]);
  248. AssertEquals (s + "Third entry has wrong item", 2, dataView[2][0]);
  249. AssertEquals (s + "Fourth entry has wrong item", 3, dataView[3][0]);
  250. // bug #77104 (2-5)
  251. s = "Ascending sorting 2: ";
  252. dataView.Sort = "itemId ASC";
  253. AssertEquals (s + "First entry has wrong item", 0, dataView[0][0]);
  254. AssertEquals (s + "Second entry has wrong item", 1, dataView[1][0]);
  255. AssertEquals (s + "Third entry has wrong item", 2, dataView[2][0]);
  256. AssertEquals (s + "Fourth entry has wrong item", 3, dataView[3][0]);
  257. s = "Ascending sorting 3: ";
  258. dataView.Sort = "[itemId] ASC";
  259. AssertEquals (s + "First entry has wrong item", 0, dataView[0][0]);
  260. AssertEquals (s + "Second entry has wrong item", 1, dataView[1][0]);
  261. AssertEquals (s + "Third entry has wrong item", 2, dataView[2][0]);
  262. AssertEquals (s + "Fourth entry has wrong item", 3, dataView[3][0]);
  263. s = "Ascending sorting 4: ";
  264. dataView.Sort = "[itemId] ASC";
  265. AssertEquals (s + "First entry has wrong item", 0, dataView[0][0]);
  266. AssertEquals (s + "Second entry has wrong item", 1, dataView[1][0]);
  267. AssertEquals (s + "Third entry has wrong item", 2, dataView[2][0]);
  268. AssertEquals (s + "Fourth entry has wrong item", 3, dataView[3][0]);
  269. s = "Ascending sorting 5: ";
  270. try {
  271. dataView.Sort = "itemId \tASC";
  272. AssertEquals (s + "Tab cannot be a separator" , true, false);
  273. }catch (IndexOutOfRangeException e) {
  274. }
  275. s = "Descending sorting : ";
  276. dataView.Sort = "itemId DESC";
  277. AssertEquals (s + "First entry has wrong item", 3, dataView[0][0]);
  278. AssertEquals (s + "Second entry has wrong item", 2, dataView[1][0]);
  279. AssertEquals (s + "Third entry has wrong item", 1, dataView[2][0]);
  280. AssertEquals (s + "Fourth entry has wrong item", 0, dataView[3][0]);
  281. s = "Reverted to default sorting: ";
  282. dataView.Sort = null;
  283. AssertEquals (s + "First entry has wrong item", 1, dataView[0][0]);
  284. AssertEquals (s + "Second entry has wrong item", 0, dataView[1][0]);
  285. AssertEquals (s + "Third entry has wrong item", 3, dataView[2][0]);
  286. AssertEquals (s + "Fourth entry has wrong item", 2, dataView[3][0]);
  287. }
  288. #endregion // Sort Tests
  289. [Test]
  290. [ExpectedException(typeof(DataException))]
  291. public void AddNew_1 ()
  292. {
  293. dataView.AllowNew = false;
  294. DataRowView drv = dataView.AddNew ();
  295. }
  296. [Test]
  297. public void AddNew_2 ()
  298. {
  299. dataView.AllowNew = true;
  300. DataRowView drv = dataView.AddNew ();
  301. AssertEquals ("test#01",ListChangedType.ItemAdded,listChangedArgs.ListChangedType);
  302. AssertEquals ("test#02",drv["itemName"],dataView [dataView.Count - 1]["itemName"]);
  303. listChangedArgs = null;
  304. drv["itemId"] = "item " + 1001;
  305. drv["itemName"] = "name " + rndm.Next();
  306. drv["itemPrice"] = "Rs. " + (rndm.Next() % 1000);
  307. drv["itemCategory"] = "Cat " + ((rndm.Next() % 10) + 1);
  308. // Actually no events are arisen when items are set.
  309. AssertNull ("test#03", listChangedArgs);
  310. }
  311. [Test]
  312. public void BeginInit ()
  313. {
  314. DataTable table = new DataTable ("table");
  315. DataView dv = new DataView ();
  316. DataColumn col1 = new DataColumn ("col1");
  317. DataColumn col2 = new DataColumn ("col2");
  318. dv.BeginInit ();
  319. table.BeginInit ();
  320. table.Columns.AddRange (new DataColumn[] {col1,col2});
  321. dv.Table = table;
  322. AssertNull ("#1", dv.Table);
  323. dv.EndInit ();
  324. AssertEquals ("#2", table, dv.Table);
  325. AssertEquals ("#3", 0, table.Columns.Count);
  326. table.EndInit ();
  327. AssertEquals ("#4", 2, table.Columns.Count);
  328. }
  329. [Test]
  330. [ExpectedException(typeof(ArgumentException))]
  331. public void Find_1 ()
  332. {
  333. /* since the sort key is not specified. Must raise a ArgumentException */
  334. int sIndex = dataView.Find ("abc");
  335. }
  336. [Test]
  337. public void Find_2 ()
  338. {
  339. int randInt;
  340. DataRowView drv;
  341. randInt = rndm.Next () % rowCount;
  342. dataView.Sort = "itemId";
  343. drv = dataView [randInt];
  344. AssertEquals ("test#01",randInt,dataView.Find (drv ["itemId"]));
  345. dataView.Sort = "itemId DESC";
  346. drv = dataView [randInt];
  347. AssertEquals ("test#02",randInt,dataView.Find (drv ["itemId"]));
  348. dataView.Sort = "itemId, itemName";
  349. drv = dataView [randInt];
  350. object [] keys = new object [2];
  351. keys [0] = drv ["itemId"];
  352. keys [1] = drv ["itemName"];
  353. AssertEquals ("test#03",randInt,dataView.Find (keys));
  354. dataView.Sort = "itemId";
  355. AssertEquals ("test#04",-1,dataView.Find("no item"));
  356. }
  357. [Test]
  358. [ExpectedException (typeof (ArgumentException))]
  359. public void Find_3 ()
  360. {
  361. dataView.Sort = "itemID, itemName";
  362. /* expecting order key count mismatch */
  363. dataView.Find ("itemValue");
  364. }
  365. [Test]
  366. [Ignore("Test code not implemented")]
  367. public void GetEnumerator ()
  368. {
  369. //TODO
  370. }
  371. [Test]
  372. public void ToStringTest ()
  373. {
  374. AssertEquals ("test#01","System.Data.DataView",dataView.ToString());
  375. }
  376. [Test]
  377. public void TestingEventHandling ()
  378. {
  379. dataView.Sort = "itemId";
  380. DataRow dr;
  381. dr = dataTable.NewRow ();
  382. dr ["itemId"] = "item 0";
  383. dr ["itemName"] = "name " + rndm.Next ();
  384. dr ["itemPrice"] = "Rs. " + (rndm.Next () % 1000);
  385. dr ["itemCategory"] = "Cat " + ((rndm.Next () % 10) + 1);
  386. dataTable.Rows.Add(dr);
  387. //PrintTableOrView(dataView, "ItemAdded");
  388. AssertEquals ("test#01",ListChangedType.ItemAdded,listChangedArgs.ListChangedType);
  389. listChangedArgs = null;
  390. dr ["itemId"] = "aitem 0";
  391. // PrintTableOrView(dataView, "ItemChanged");
  392. AssertEquals ("test#02",ListChangedType.ItemChanged,listChangedArgs.ListChangedType);
  393. listChangedArgs = null;
  394. dr ["itemId"] = "zitem 0";
  395. // PrintTableOrView(dataView, "ItemMoved");
  396. AssertEquals ("test#03",ListChangedType.ItemMoved,listChangedArgs.ListChangedType);
  397. listChangedArgs = null;
  398. dataTable.Rows.Remove (dr);
  399. // PrintTableOrView(dataView, "ItemDeleted");
  400. AssertEquals ("test#04",ListChangedType.ItemDeleted,listChangedArgs.ListChangedType);
  401. listChangedArgs = null;
  402. DataColumn dc5 = new DataColumn ("itemDesc");
  403. dataTable.Columns.Add (dc5);
  404. // PrintTableOrView(dataView, "PropertyDescriptorAdded");
  405. AssertEquals ("test#05",ListChangedType.PropertyDescriptorAdded,listChangedArgs.ListChangedType);
  406. listChangedArgs = null;
  407. dc5.ColumnName = "itemDescription";
  408. // PrintTableOrView(dataView, "PropertyDescriptorChanged");
  409. // AssertEquals ("test#06",ListChangedType.PropertyDescriptorChanged,listChangedArgs.ListChangedType);
  410. listChangedArgs = null;
  411. dataTable.Columns.Remove (dc5);
  412. // PrintTableOrView(dataView, "PropertyDescriptorDeleted");
  413. AssertEquals ("test#07",ListChangedType.PropertyDescriptorDeleted,listChangedArgs.ListChangedType);
  414. }
  415. [Test]
  416. public void TestFindRows ()
  417. {
  418. DataView TestView = new DataView (dataTable);
  419. TestView.Sort = "itemId";
  420. DataRowView[] Result = TestView.FindRows ("item 3");
  421. Assertion.AssertEquals ("Dv #1", 1, Result.Length);
  422. Assertion.AssertEquals ("Dv #2", "item 3", Result [0]["itemId"]);
  423. }
  424. [Test]
  425. [ExpectedException (typeof (ArgumentException))]
  426. public void FindRowsWithoutSort ()
  427. {
  428. DataTable dt = new DataTable ("table");
  429. dt.Columns.Add ("col1");
  430. dt.Columns.Add ("col2");
  431. dt.Columns.Add ("col3");
  432. dt.Rows.Add (new object [] {1,2,3});
  433. dt.Rows.Add (new object [] {4,5,6});
  434. dt.Rows.Add (new object [] {4,7,8});
  435. dt.Rows.Add (new object [] {5,7,8});
  436. dt.Rows.Add (new object [] {4,8,9});
  437. DataView dv = new DataView (dt);
  438. dv.Find (1);
  439. }
  440. [Test]
  441. [ExpectedException (typeof (ArgumentException))]
  442. public void FindRowsInconsistentKeyLength ()
  443. {
  444. DataTable dt = new DataTable ("table");
  445. dt.Columns.Add ("col1");
  446. dt.Columns.Add ("col2");
  447. dt.Columns.Add ("col3");
  448. dt.Rows.Add (new object [] {1,2,3});
  449. dt.Rows.Add (new object [] {4,5,6});
  450. dt.Rows.Add (new object [] {4,7,8});
  451. dt.Rows.Add (new object [] {5,7,8});
  452. dt.Rows.Add (new object [] {4,8,9});
  453. DataView dv = new DataView (dt, null, "col1",
  454. DataViewRowState.CurrentRows);
  455. dv.FindRows (new object [] {1, 2, 3});
  456. }
  457. [Test]
  458. [ExpectedException (typeof (DeletedRowInaccessibleException))]
  459. public void TestDelete ()
  460. {
  461. DataView TestView = new DataView (dataTable);
  462. TestView.Delete (0);
  463. DataRow r = TestView.Table.Rows [0];
  464. Assertion.Assert ("Dv #1", !(r ["itemId"] == "item 1"));
  465. }
  466. [Test]
  467. [ExpectedException (typeof (IndexOutOfRangeException))]
  468. public void TestDeleteOutOfBounds ()
  469. {
  470. DataView TestView = new DataView (dataTable);
  471. TestView.Delete (100);
  472. }
  473. [Test]
  474. [ExpectedException (typeof (DataException))]
  475. public void TestDeleteNotAllowed ()
  476. {
  477. DataView TestView = new DataView (dataTable);
  478. TestView.AllowDelete = false;
  479. TestView.Delete (0);
  480. }
  481. [Test]
  482. [ExpectedException (typeof (DataException))]
  483. public void TestDeleteClosed ()
  484. {
  485. DataView TestView = new DataView (dataTable);
  486. TestView.Dispose (); // Close the table
  487. TestView.Delete (0);
  488. }
  489. [Test] // based on bug #74631
  490. public void TestDeleteAndCount ()
  491. {
  492. DataSet dataset = new DataSet ("new");
  493. DataTable dt = new DataTable ("table1");
  494. dataset.Tables.Add (dt);
  495. dt.Columns.Add ("col1");
  496. dt.Columns.Add ("col2");
  497. dt.Rows.Add (new object []{1,1});
  498. dt.Rows.Add (new object []{1,2});
  499. dt.Rows.Add (new object []{1,3});
  500. DataView dataView = new DataView (dataset.Tables[0]);
  501. AssertEquals ("before delete", 3, dataView.Count);
  502. dataView.AllowDelete = true;
  503. // Deleting the first row
  504. dataView.Delete (0);
  505. AssertEquals ("before delete", 2, dataView.Count);
  506. }
  507. [Test]
  508. public void ListChangeOnSetItem ()
  509. {
  510. DataTable dt = new DataTable ("table");
  511. dt.Columns.Add ("col1");
  512. dt.Columns.Add ("col2");
  513. dt.Columns.Add ("col3");
  514. dt.Rows.Add (new object [] {1, 2, 3});
  515. dt.AcceptChanges ();
  516. DataView dv = new DataView (dt);
  517. dv.ListChanged += new ListChangedEventHandler (OnChange);
  518. dv [0] ["col1"] = 4;
  519. }
  520. ListChangedEventArgs ListChangeArgOnSetItem;
  521. void OnChange (object o, ListChangedEventArgs e)
  522. {
  523. if (ListChangeArgOnSetItem != null)
  524. throw new Exception ("The event is already fired.");
  525. ListChangeArgOnSetItem = e;
  526. }
  527. [Test]
  528. public void CancelEditAndEvents ()
  529. {
  530. string reference = " =====ItemAdded:3 ------4 =====ItemAdded:3 =====ItemAdded:4 ------5 =====ItemAdded:4 =====ItemAdded:5 ------6 =====ItemDeleted:5 ------5 =====ItemAdded:5";
  531. eventWriter = new StringWriter ();
  532. DataTable dt = new DataTable ();
  533. dt.Columns.Add ("col1");
  534. dt.Columns.Add ("col2");
  535. dt.Columns.Add ("col3");
  536. dt.Rows.Add (new object [] {1,2,3});
  537. dt.Rows.Add (new object [] {1,2,3});
  538. dt.Rows.Add (new object [] {1,2,3});
  539. DataView dv = new DataView (dt);
  540. dv.ListChanged += new ListChangedEventHandler (ListChanged);
  541. DataRowView a1 = dv.AddNew ();
  542. eventWriter.Write (" ------" + dv.Count);
  543. // I wonder why but MS fires another event here.
  544. a1 = dv.AddNew ();
  545. eventWriter.Write (" ------" + dv.Count);
  546. // I wonder why but MS fires another event here.
  547. DataRowView a2 = dv.AddNew ();
  548. eventWriter.Write (" ------" + dv.Count);
  549. a2.CancelEdit ();
  550. eventWriter.Write (" ------" + dv.Count);
  551. DataRowView a3 = dv.AddNew ();
  552. AssertEquals (reference, eventWriter.ToString ());
  553. }
  554. private void ListChanged (object o, ListChangedEventArgs e)
  555. {
  556. eventWriter.Write (" =====" + e.ListChangedType + ":" + e.NewIndex);
  557. }
  558. [Test]
  559. [NUnit.Framework.Category ("NotWorking")]
  560. public void ComplexEventSequence1 ()
  561. {
  562. string result = @"setting table...
  563. ---- OnListChanged PropertyDescriptorChanged,0,0
  564. ----- UpdateIndex : True
  565. ---- OnListChanged Reset,-1,-1
  566. table was set.
  567. ---- OnListChanged PropertyDescriptorAdded,0,0
  568. col1 added.
  569. ---- OnListChanged PropertyDescriptorAdded,0,0
  570. col2 added.
  571. ---- OnListChanged PropertyDescriptorAdded,0,0
  572. col3 added.
  573. uniq added.
  574. ----- UpdateIndex : True
  575. ---- OnListChanged Reset,-1,-1
  576. sort changed.
  577. ---- OnListChanged PropertyDescriptorDeleted,0,0
  578. col3 removed.
  579. ----- UpdateIndex : True
  580. ---- OnListChanged Reset,-1,-1
  581. rowfilter changed.
  582. ----- UpdateIndex : True
  583. ---- OnListChanged Reset,-1,-1
  584. rowstatefilter changed.
  585. ----- UpdateIndex : True
  586. ---- OnListChanged Reset,-1,-1
  587. rowstatefilter changed.
  588. ---- OnListChanged ItemAdded,0,-1
  589. added row to Rows.
  590. ---- OnListChanged ItemAdded,0,-1
  591. added row to Rows.
  592. ---- OnListChanged ItemAdded,0,-1
  593. added row to Rows.
  594. ---- OnListChanged ItemAdded,3,-1
  595. AddNew() invoked.
  596. 4
  597. ---- OnListChanged ItemDeleted,3,-1
  598. ---- OnListChanged ItemMoved,-2147483648,3
  599. EndEdit() invoked.
  600. 3
  601. ---- OnListChanged ItemMoved,0,-2147483648
  602. value changed to appear.
  603. 4
  604. ---- OnListChanged ItemMoved,3,0
  605. value moved.
  606. 4
  607. ---- OnListChanged ItemMoved,1,3
  608. value moved again.
  609. 4
  610. ---- OnListChanged PropertyDescriptorChanged,0,0
  611. ----- UpdateIndex : True
  612. ---- OnListChanged Reset,-1,-1
  613. table changed.
  614. ";
  615. eventWriter = new StringWriter ();
  616. DataTable dt = new DataTable ("table");
  617. ComplexEventSequence1View dv =
  618. new ComplexEventSequence1View (dt, eventWriter);
  619. dt.Columns.Add ("col1");
  620. eventWriter.WriteLine (" col1 added.");
  621. dt.Columns.Add ("col2");
  622. eventWriter.WriteLine (" col2 added.");
  623. dt.Columns.Add ("col3");
  624. eventWriter.WriteLine (" col3 added.");
  625. dt.Constraints.Add (new UniqueConstraint (dt.Columns [0]));
  626. eventWriter.WriteLine (" uniq added.");
  627. dv.Sort = "col2";
  628. eventWriter.WriteLine (" sort changed.");
  629. dt.Columns.Remove ("col3");
  630. eventWriter.WriteLine (" col3 removed.");
  631. dv.RowFilter = "col1 <> 0";
  632. eventWriter.WriteLine (" rowfilter changed.");
  633. dv.RowStateFilter = DataViewRowState.Deleted;
  634. eventWriter.WriteLine (" rowstatefilter changed.");
  635. // FIXME: should be also tested.
  636. // dv.ApplyDefaultSort = true;
  637. // eventWriter.WriteLine (" apply default sort changed.");
  638. dv.RowStateFilter = DataViewRowState.CurrentRows;
  639. eventWriter.WriteLine (" rowstatefilter changed.");
  640. dt.Rows.Add (new object [] {1, 3});
  641. eventWriter.WriteLine (" added row to Rows.");
  642. dt.Rows.Add (new object [] {2, 2});
  643. eventWriter.WriteLine (" added row to Rows.");
  644. dt.Rows.Add (new object [] {3, 1});
  645. eventWriter.WriteLine (" added row to Rows.");
  646. DataRowView drv = dv.AddNew ();
  647. eventWriter.WriteLine (" AddNew() invoked.");
  648. eventWriter.WriteLine (dv.Count);
  649. drv [0] = 0;
  650. drv.EndEdit ();
  651. eventWriter.WriteLine (" EndEdit() invoked.");
  652. eventWriter.WriteLine (dv.Count);
  653. dt.Rows [dt.Rows.Count - 1] [0] = 4;
  654. eventWriter.WriteLine (" value changed to appear.");
  655. eventWriter.WriteLine (dv.Count);
  656. dt.Rows [dt.Rows.Count - 1] [1] = 4;
  657. eventWriter.WriteLine (" value moved.");
  658. eventWriter.WriteLine (dv.Count);
  659. dt.Rows [dt.Rows.Count - 1] [1] = 1.5;
  660. eventWriter.WriteLine (" value moved again.");
  661. eventWriter.WriteLine (dv.Count);
  662. dv.Table = new DataTable ("table2");
  663. eventWriter.WriteLine ("table changed.");
  664. AssertEquals (result, eventWriter.ToString ().Replace ("\r\n", "\n"));
  665. }
  666. public class ComplexEventSequence1View : DataView
  667. {
  668. TextWriter w;
  669. public ComplexEventSequence1View (DataTable dt,
  670. TextWriter w) : base ()
  671. {
  672. this.w = w;
  673. w.WriteLine ("setting table...");
  674. Table = dt;
  675. w.WriteLine ("table was set.");
  676. }
  677. protected override void OnListChanged (ListChangedEventArgs e)
  678. {
  679. if (w != null)
  680. w.WriteLine ("---- OnListChanged " + e.ListChangedType + "," + e.NewIndex + "," + e.OldIndex);
  681. base.OnListChanged (e);
  682. }
  683. protected override void UpdateIndex (bool force)
  684. {
  685. if (w != null)
  686. w.WriteLine ("----- UpdateIndex : " + force);
  687. base.UpdateIndex (force);
  688. }
  689. }
  690. }
  691. }