1 // DataViewTest.cs - Nunit Test Cases for for testing the DataView
4 // Punit Kumar Todi ( punit_todi@da-iict.org )
5 // Patrick Kalkman kalkman@cistron.nl
6 // Umadevi S (sumadevi@novell.com)
7 // Atsushi Enomoto (atsushi@ximian.com)
9 // (C) 2003 Patrick Kalkman
11 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using NUnit.Framework;
38 using System.ComponentModel;
41 namespace MonoTests.System.Data
44 public class DataViewTest : Assertion
50 ListChangedEventArgs listChangedArgs;
51 TextWriter eventWriter;
54 public void GetReady ()
56 dataTable = new DataTable ("itemTable");
57 DataColumn dc1 = new DataColumn ("itemId");
58 DataColumn dc2 = new DataColumn ("itemName");
59 DataColumn dc3 = new DataColumn ("itemPrice");
60 DataColumn dc4 = new DataColumn ("itemCategory");
62 dataTable.Columns.Add (dc1);
63 dataTable.Columns.Add (dc2);
64 dataTable.Columns.Add (dc3);
65 dataTable.Columns.Add (dc4);
69 rndm = new Random (seed);
70 for (int i = 1; i <= rowCount; i++) {
71 dr = dataTable.NewRow ();
72 dr["itemId"] = "item " + i;
73 dr["itemName"] = "name " + rndm.Next ();
74 dr["itemPrice"] = "Rs. " + (rndm.Next () % 1000);
75 dr["itemCategory"] = "Cat " + ((rndm.Next () % 10) + 1);
76 dataTable.Rows.Add (dr);
78 dataTable.AcceptChanges ();
79 dataView = new DataView (dataTable);
80 dataView.ListChanged += new ListChangedEventHandler (OnListChanged);
81 listChangedArgs = null;
84 protected void OnListChanged (object sender, ListChangedEventArgs args)
86 listChangedArgs = args;
88 /*Console.WriteLine("EventType :: " + listChangedArgs.ListChangedType +
89 " oldIndex :: " + listChangedArgs.OldIndex +
90 " NewIndex :: " + listChangedArgs.NewIndex);*/
94 private void PrintTableOrView (DataTable t, string label)
96 Console.WriteLine ("\n" + label);
97 for (int i = 0; i<t.Rows.Count; i++){
98 foreach (DataColumn dc in t.Columns)
99 Console.Write (t.Rows [i][dc] + "\t");
100 Console.WriteLine ("");
102 Console.WriteLine ();
105 private void PrintTableOrView (DataView dv, string label)
107 Console.WriteLine ("\n" + label);
108 Console.WriteLine ("Sort Key :: " + dv.Sort);
109 for (int i = 0; i < dv.Count; i++) {
110 foreach (DataColumn dc in dv.Table.Columns)
111 Console.Write (dv [i].Row [dc] + "\t");
112 Console.WriteLine ("");
114 Console.WriteLine ();
125 public void DataView ()
127 DataView dv1,dv2,dv3;
128 dv1 = new DataView ();
129 // AssertEquals ("test#01",null,dv1.Table);
130 AssertEquals ("test#02",true,dv1.AllowNew);
131 AssertEquals ("test#03",true,dv1.AllowEdit);
132 AssertEquals ("test#04",true,dv1.AllowDelete);
133 AssertEquals ("test#05",false,dv1.ApplyDefaultSort);
134 AssertEquals ("test#06",string.Empty,dv1.RowFilter);
135 AssertEquals ("test#07",DataViewRowState.CurrentRows,dv1.RowStateFilter);
136 AssertEquals ("test#08",string.Empty,dv1.Sort);
138 dv2 = new DataView (dataTable);
139 AssertEquals ("test#09","itemTable",dv2.Table.TableName);
140 AssertEquals ("test#10",string.Empty,dv2.Sort);
141 AssertEquals ("test#11",false,dv2.ApplyDefaultSort);
142 AssertEquals ("test#12",dataTable.Rows[0],dv2[0].Row);
144 dv3 = new DataView (dataTable,"","itemId DESC",DataViewRowState.CurrentRows);
145 AssertEquals ("test#13","",dv3.RowFilter);
146 AssertEquals ("test#14","itemId DESC",dv3.Sort);
147 AssertEquals ("test#15",DataViewRowState.CurrentRows,dv3.RowStateFilter);
148 //AssertEquals ("test#16",dataTable.Rows.[(dataTable.Rows.Count-1)],dv3[0]);
152 public void TestValue ()
154 DataView TestView = new DataView (dataTable);
155 Assertion.AssertEquals ("Dv #1", "item 1", TestView [0]["itemId"]);
159 public void TestCount ()
161 DataView TestView = new DataView (dataTable);
162 Assertion.AssertEquals ("Dv #3", 5, TestView.Count);
166 public void AllowNew ()
168 AssertEquals ("test#01",true,dataView.AllowNew);
172 public void ApplyDefaultSort ()
174 UniqueConstraint uc = new UniqueConstraint (dataTable.Columns["itemId"]);
175 dataTable.Constraints.Add (uc);
176 dataView.ApplyDefaultSort = true;
177 // dataView.Sort = "itemName";
178 // AssertEquals ("test#01","item 1",dataView[0]["itemId"]);
179 AssertEquals ("test#02",ListChangedType.Reset,listChangedArgs.ListChangedType);
180 // UnComment the line below to see if dataView is sorted
181 // PrintTableOrView (dataView,"* OnApplyDefaultSort");
185 public void RowStateFilter ()
187 dataView.RowStateFilter = DataViewRowState.Deleted;
188 AssertEquals ("test#01",ListChangedType.Reset,listChangedArgs.ListChangedType);
192 public void RowStateFilter_2 ()
194 DataSet dataset = new DataSet ("new");
195 DataTable dt = new DataTable ("table1");
196 dataset.Tables.Add (dt);
197 dt.Columns.Add ("col1");
198 dt.Columns.Add ("col2");
199 dt.Rows.Add (new object [] {1,1});
200 dt.Rows.Add (new object [] {1,2});
201 dt.Rows.Add (new object [] {1,3});
202 dataset.AcceptChanges ();
204 DataView dataView = new DataView (dataset.Tables [0]);
206 // 'new' table in this sample contains 6 records
207 dataView.AllowEdit = true;
208 dataView.AllowDelete = true;
212 dataView [0] ["col1"] = -1;
213 dataView.RowStateFilter = DataViewRowState.ModifiedOriginal;
214 v = dataView [0] [0].ToString ();
215 AssertEquals ("ModifiedOriginal.Count", 1, dataView.Count);
216 AssertEquals ("ModifiedOriginal.Value", "1", v);
220 dataView.RowStateFilter = DataViewRowState.Deleted;
222 v = dataView [0] [0].ToString ();
223 AssertEquals ("Deleted.Count", 1, dataView.Count);
224 AssertEquals ("Deleted.Value", "1", v);
230 dataView.Sort = "itemName DESC";
231 AssertEquals ("test#01",ListChangedType.Reset,listChangedArgs.ListChangedType);
232 // UnComment the line below to see if dataView is sorted
233 // PrintTableOrView (dataView);
237 [ExpectedException(typeof(DataException))]
238 public void AddNew_1 ()
240 dataView.AllowNew = false;
241 DataRowView drv = dataView.AddNew ();
245 public void AddNew_2 ()
247 dataView.AllowNew = true;
248 DataRowView drv = dataView.AddNew ();
249 AssertEquals ("test#01",ListChangedType.ItemAdded,listChangedArgs.ListChangedType);
250 AssertEquals ("test#02",drv["itemName"],dataView [dataView.Count - 1]["itemName"]);
251 listChangedArgs = null;
252 drv["itemId"] = "item " + 1001;
253 drv["itemName"] = "name " + rndm.Next();
254 drv["itemPrice"] = "Rs. " + (rndm.Next() % 1000);
255 drv["itemCategory"] = "Cat " + ((rndm.Next() % 10) + 1);
256 // Actually no events are arisen when items are set.
257 AssertNull ("test#03", listChangedArgs);
261 [Ignore("Test code not implemented")]
262 public void BeginInit ()
268 [ExpectedException(typeof(ArgumentException))]
269 public void Find_1 ()
271 /* since the sort key is not specified. Must raise a ArgumentException */
272 int sIndex = dataView.Find ("abc");
276 public void Find_2 ()
280 randInt = rndm.Next () % rowCount;
281 dataView.Sort = "itemId";
282 drv = dataView [randInt];
283 AssertEquals ("test#01",randInt,dataView.Find (drv ["itemId"]));
285 dataView.Sort = "itemId DESC";
286 drv = dataView [randInt];
287 AssertEquals ("test#02",randInt,dataView.Find (drv ["itemId"]));
289 dataView.Sort = "itemId, itemName";
290 drv = dataView [randInt];
291 object [] keys = new object [2];
292 keys [0] = drv ["itemId"];
293 keys [1] = drv ["itemName"];
294 AssertEquals ("test#03",randInt,dataView.Find (keys));
296 dataView.Sort = "itemId";
297 AssertEquals ("test#04",-1,dataView.Find("no item"));
302 [ExpectedException (typeof (ArgumentException))]
303 public void Find_3 ()
305 dataView.Sort = "itemID, itemName";
306 /* expecting order key count mismatch */
307 dataView.Find ("itemValue");
311 [Ignore("Test code not implemented")]
312 public void GetEnumerator ()
318 public void ToStringTest ()
320 AssertEquals ("test#01","System.Data.DataView",dataView.ToString());
324 public void TestingEventHandling ()
326 dataView.Sort = "itemId";
328 dr = dataTable.NewRow ();
329 dr ["itemId"] = "item 0";
330 dr ["itemName"] = "name " + rndm.Next ();
331 dr ["itemPrice"] = "Rs. " + (rndm.Next () % 1000);
332 dr ["itemCategory"] = "Cat " + ((rndm.Next () % 10) + 1);
333 dataTable.Rows.Add(dr);
335 //PrintTableOrView(dataView, "ItemAdded");
336 AssertEquals ("test#01",ListChangedType.ItemAdded,listChangedArgs.ListChangedType);
337 listChangedArgs = null;
339 dr ["itemId"] = "aitem 0";
340 // PrintTableOrView(dataView, "ItemChanged");
341 AssertEquals ("test#02",ListChangedType.ItemChanged,listChangedArgs.ListChangedType);
342 listChangedArgs = null;
344 dr ["itemId"] = "zitem 0";
345 // PrintTableOrView(dataView, "ItemMoved");
346 AssertEquals ("test#03",ListChangedType.ItemMoved,listChangedArgs.ListChangedType);
347 listChangedArgs = null;
349 dataTable.Rows.Remove (dr);
350 // PrintTableOrView(dataView, "ItemDeleted");
351 AssertEquals ("test#04",ListChangedType.ItemDeleted,listChangedArgs.ListChangedType);
353 listChangedArgs = null;
354 DataColumn dc5 = new DataColumn ("itemDesc");
355 dataTable.Columns.Add (dc5);
356 // PrintTableOrView(dataView, "PropertyDescriptorAdded");
357 AssertEquals ("test#05",ListChangedType.PropertyDescriptorAdded,listChangedArgs.ListChangedType);
359 listChangedArgs = null;
360 dc5.ColumnName = "itemDescription";
361 // PrintTableOrView(dataView, "PropertyDescriptorChanged");
362 // AssertEquals ("test#06",ListChangedType.PropertyDescriptorChanged,listChangedArgs.ListChangedType);
364 listChangedArgs = null;
365 dataTable.Columns.Remove (dc5);
366 // PrintTableOrView(dataView, "PropertyDescriptorDeleted");
367 AssertEquals ("test#07",ListChangedType.PropertyDescriptorDeleted,listChangedArgs.ListChangedType);
371 public void TestFindRows ()
373 DataView TestView = new DataView (dataTable);
374 TestView.Sort = "itemId";
375 DataRowView[] Result = TestView.FindRows ("item 3");
376 Assertion.AssertEquals ("Dv #1", 1, Result.Length);
377 Assertion.AssertEquals ("Dv #2", "item 3", Result [0]["itemId"]);
381 [ExpectedException (typeof (ArgumentException))]
382 public void FindRowsWithoutSort ()
384 DataTable dt = new DataTable ("table");
385 dt.Columns.Add ("col1");
386 dt.Columns.Add ("col2");
387 dt.Columns.Add ("col3");
388 dt.Rows.Add (new object [] {1,2,3});
389 dt.Rows.Add (new object [] {4,5,6});
390 dt.Rows.Add (new object [] {4,7,8});
391 dt.Rows.Add (new object [] {5,7,8});
392 dt.Rows.Add (new object [] {4,8,9});
393 DataView dv = new DataView (dt);
398 [ExpectedException (typeof (ArgumentException))]
399 public void FindRowsInconsistentKeyLength ()
401 DataTable dt = new DataTable ("table");
402 dt.Columns.Add ("col1");
403 dt.Columns.Add ("col2");
404 dt.Columns.Add ("col3");
405 dt.Rows.Add (new object [] {1,2,3});
406 dt.Rows.Add (new object [] {4,5,6});
407 dt.Rows.Add (new object [] {4,7,8});
408 dt.Rows.Add (new object [] {5,7,8});
409 dt.Rows.Add (new object [] {4,8,9});
410 DataView dv = new DataView (dt, null, "col1",
411 DataViewRowState.CurrentRows);
412 dv.FindRows (new object [] {1, 2, 3});
416 [ExpectedException (typeof (DeletedRowInaccessibleException))]
417 public void TestDelete ()
419 DataView TestView = new DataView (dataTable);
421 DataRow r = TestView.Table.Rows [0];
422 Assertion.Assert ("Dv #1", !(r ["itemId"] == "item 1"));
426 [ExpectedException (typeof (IndexOutOfRangeException))]
427 public void TestDeleteOutOfBounds ()
429 DataView TestView = new DataView (dataTable);
430 TestView.Delete (100);
434 [ExpectedException (typeof (DataException))]
435 public void TestDeleteNotAllowed ()
437 DataView TestView = new DataView (dataTable);
438 TestView.AllowDelete = false;
443 [ExpectedException (typeof (DataException))]
444 public void TestDeleteClosed ()
446 DataView TestView = new DataView (dataTable);
447 TestView.Dispose (); // Close the table
451 [Test] // based on bug #74631
452 public void TestDeleteAndCount ()
454 DataSet dataset = new DataSet ("new");
455 DataTable dt = new DataTable ("table1");
456 dataset.Tables.Add (dt);
457 dt.Columns.Add ("col1");
458 dt.Columns.Add ("col2");
459 dt.Rows.Add (new object []{1,1});
460 dt.Rows.Add (new object []{1,2});
461 dt.Rows.Add (new object []{1,3});
463 DataView dataView = new DataView (dataset.Tables[0]);
465 AssertEquals ("before delete", 3, dataView.Count);
466 dataView.AllowDelete = true;
468 // Deleting the first row
471 AssertEquals ("before delete", 2, dataView.Count);
475 public void ListChangeOnSetItem ()
477 DataTable dt = new DataTable ("table");
478 dt.Columns.Add ("col1");
479 dt.Columns.Add ("col2");
480 dt.Columns.Add ("col3");
481 dt.Rows.Add (new object [] {1, 2, 3});
483 DataView dv = new DataView (dt);
484 dv.ListChanged += new ListChangedEventHandler (OnChange);
488 ListChangedEventArgs ListChangeArgOnSetItem;
490 void OnChange (object o, ListChangedEventArgs e)
492 if (ListChangeArgOnSetItem != null)
493 throw new Exception ("The event is already fired.");
494 ListChangeArgOnSetItem = e;
498 [NUnit.Framework.Category ("NotWorking")]
499 public void CancelEditAndEvents ()
501 string reference = " =====ItemAdded:3 ------4 =====ItemAdded:3 =====ItemAdded:4 ------5 =====ItemAdded:4 =====ItemAdded:5 ------6 =====ItemDeleted:5 ------5 =====ItemAdded:5";
503 eventWriter = new StringWriter ();
505 DataTable dt = new DataTable ();
506 dt.Columns.Add ("col1");
507 dt.Columns.Add ("col2");
508 dt.Columns.Add ("col3");
509 dt.Rows.Add (new object [] {1,2,3});
510 dt.Rows.Add (new object [] {1,2,3});
511 dt.Rows.Add (new object [] {1,2,3});
513 DataView dv = new DataView (dt);
514 dv.ListChanged += new ListChangedEventHandler (ListChanged);
515 DataRowView a1 = dv.AddNew ();
516 eventWriter.Write (" ------" + dv.Count);
517 // I wonder why but MS fires another event here.
519 eventWriter.Write (" ------" + dv.Count);
520 // I wonder why but MS fires another event here.
521 DataRowView a2 = dv.AddNew ();
522 eventWriter.Write (" ------" + dv.Count);
524 eventWriter.Write (" ------" + dv.Count);
525 DataRowView a3 = dv.AddNew ();
527 AssertEquals (reference, eventWriter.ToString ());
530 private void ListChanged (object o, ListChangedEventArgs e)
532 eventWriter.Write (" =====" + e.ListChangedType + ":" + e.NewIndex);
536 [NUnit.Framework.Category ("NotWorking")]
537 public void ComplexEventSequence1 ()
539 string result = @"setting table...
540 ---- OnListChanged PropertyDescriptorChanged,0,0
541 ----- UpdateIndex : True
542 ---- OnListChanged Reset,-1,-1
544 ---- OnListChanged PropertyDescriptorAdded,0,0
546 ---- OnListChanged PropertyDescriptorAdded,0,0
548 ---- OnListChanged PropertyDescriptorAdded,0,0
551 ----- UpdateIndex : True
552 ---- OnListChanged Reset,-1,-1
554 ---- OnListChanged PropertyDescriptorDeleted,0,0
556 ----- UpdateIndex : True
557 ---- OnListChanged Reset,-1,-1
559 ----- UpdateIndex : True
560 ---- OnListChanged Reset,-1,-1
561 rowstatefilter changed.
562 ----- UpdateIndex : True
563 ---- OnListChanged Reset,-1,-1
564 rowstatefilter changed.
565 ---- OnListChanged ItemAdded,0,-1
567 ---- OnListChanged ItemAdded,0,-1
569 ---- OnListChanged ItemAdded,0,-1
571 ---- OnListChanged ItemAdded,3,-1
574 ---- OnListChanged ItemDeleted,3,-1
575 ---- OnListChanged ItemMoved,-2147483648,3
578 ---- OnListChanged ItemMoved,0,-2147483648
579 value changed to appear.
581 ---- OnListChanged ItemMoved,3,0
584 ---- OnListChanged ItemMoved,1,3
587 ---- OnListChanged PropertyDescriptorChanged,0,0
588 ----- UpdateIndex : True
589 ---- OnListChanged Reset,-1,-1
593 eventWriter = new StringWriter ();
595 DataTable dt = new DataTable ("table");
596 ComplexEventSequence1View dv =
597 new ComplexEventSequence1View (dt, eventWriter);
598 dt.Columns.Add ("col1");
599 eventWriter.WriteLine (" col1 added.");
600 dt.Columns.Add ("col2");
601 eventWriter.WriteLine (" col2 added.");
602 dt.Columns.Add ("col3");
603 eventWriter.WriteLine (" col3 added.");
604 dt.Constraints.Add (new UniqueConstraint (dt.Columns [0]));
605 eventWriter.WriteLine (" uniq added.");
607 eventWriter.WriteLine (" sort changed.");
608 dt.Columns.Remove ("col3");
609 eventWriter.WriteLine (" col3 removed.");
610 dv.RowFilter = "col1 <> 0";
611 eventWriter.WriteLine (" rowfilter changed.");
612 dv.RowStateFilter = DataViewRowState.Deleted;
613 eventWriter.WriteLine (" rowstatefilter changed.");
614 // FIXME: should be also tested.
615 // dv.ApplyDefaultSort = true;
616 // eventWriter.WriteLine (" apply default sort changed.");
617 dv.RowStateFilter = DataViewRowState.CurrentRows;
618 eventWriter.WriteLine (" rowstatefilter changed.");
619 dt.Rows.Add (new object [] {1, 3});
620 eventWriter.WriteLine (" added row to Rows.");
621 dt.Rows.Add (new object [] {2, 2});
622 eventWriter.WriteLine (" added row to Rows.");
623 dt.Rows.Add (new object [] {3, 1});
624 eventWriter.WriteLine (" added row to Rows.");
625 DataRowView drv = dv.AddNew ();
626 eventWriter.WriteLine (" AddNew() invoked.");
627 eventWriter.WriteLine (dv.Count);
630 eventWriter.WriteLine (" EndEdit() invoked.");
631 eventWriter.WriteLine (dv.Count);
632 dt.Rows [dt.Rows.Count - 1] [0] = 4;
633 eventWriter.WriteLine (" value changed to appear.");
634 eventWriter.WriteLine (dv.Count);
635 dt.Rows [dt.Rows.Count - 1] [1] = 4;
636 eventWriter.WriteLine (" value moved.");
637 eventWriter.WriteLine (dv.Count);
638 dt.Rows [dt.Rows.Count - 1] [1] = 1.5;
639 eventWriter.WriteLine (" value moved again.");
640 eventWriter.WriteLine (dv.Count);
641 dv.Table = new DataTable ("table2");
642 eventWriter.WriteLine ("table changed.");
644 AssertEquals (result, eventWriter.ToString ().Replace ("\r\n", "\n"));
647 public class ComplexEventSequence1View : DataView
651 public ComplexEventSequence1View (DataTable dt,
652 TextWriter w) : base ()
655 w.WriteLine ("setting table...");
657 w.WriteLine ("table was set.");
660 protected override void OnListChanged (ListChangedEventArgs e)
663 w.WriteLine ("---- OnListChanged " + e.ListChangedType + "," + e.NewIndex + "," + e.OldIndex);
664 base.OnListChanged (e);
667 protected override void UpdateIndex (bool force)
670 w.WriteLine ("----- UpdateIndex : " + force);
671 base.UpdateIndex (force);