1 // DataRowTest.cs - NUnit Test Cases for System.DataRow
4 // Franklin Wise (gracenote@earthlink.net)
5 // Daniel Morgan <danmorg@sc.rr.com>
6 // Roopa Wilson (rowilson@novell.com)
8 // (C) Copyright 2002 Franklin Wise
9 // (C) Copyright 2003 Daniel Morgan
10 // (C) Copyright 2003 Martin Willemoes Hansen
11 // (C) Copyright 2004 Novell Inc.
14 using NUnit.Framework;
18 namespace MonoTests.System.Data
21 public class DataRowTest : Assertion {
23 private DataTable _tbl;
24 private DataTable table;
28 public void GetReady() {
29 _tbl = new DataTable();
31 row = table.NewRow ();
32 row ["FName"] = "Hello";
33 row ["LName"] = "World";
37 private DataTable MakeTable ()
39 DataTable namesTable = new DataTable ("Names");
40 DataColumn idColumn = new DataColumn ();
43 idColumn.DataType = System.Type.GetType ("System.Int32");
44 idColumn.ColumnName = "Id";
45 idColumn.AutoIncrement = true;
46 namesTable.Columns.Add (idColumn);
49 DataColumn fNameColumn = new DataColumn ();
50 fNameColumn.DataType = System.Type.GetType ("System.String");
51 fNameColumn.ColumnName = "Fname";
52 fNameColumn.DefaultValue = "Fname";
53 namesTable.Columns.Add (fNameColumn);
55 DataColumn lNameColumn = new DataColumn ();
56 lNameColumn.DataType = System.Type.GetType ("System.String");
57 lNameColumn.ColumnName = "LName";
58 lNameColumn.DefaultValue="LName";
59 namesTable.Columns.Add (lNameColumn);
62 // Set the primary key for the table
63 DataColumn [] keys = new DataColumn [1];
65 namesTable.PrimaryKey = keys;
66 // Return the new DataTable.
71 public void SetColumnErrorTest ()
74 errorString = "Some error!";
75 // Set the error for the specified column of the row.
76 row.SetColumnError (1, errorString);
77 GetColumnErrorTest ();
81 private void GetColumnErrorTest ()
83 // Print the error of a specified column.
84 AssertEquals ("#A01", "Some error!", row.GetColumnError (1));
87 private void GetAllErrorsTest ()
92 colArr = row.GetColumnsInError ();
94 for (int i = 0; i < colArr.Length; i++) {
95 AssertEquals ("#A02", table.Columns [1], colArr [i]);
102 public void RowEditTest()
109 private void DeleteRowTest ()
114 for (int i = 1; i <= 2; i++) {
115 newRow = table.NewRow ();
116 newRow ["FName"] = "Name " + i;
117 newRow ["LName"] = " Last Name" + i;
118 table.Rows.Add (newRow);
120 table.AcceptChanges ();
123 for (int i = 1; i < table.Rows.Count; i++) {
124 DataRow r = table.Rows [i];
125 AssertEquals ("#A03", "Name " + cnt, r ["fName"]);
130 // Create a DataView with the table.
131 DataRowCollection rc = table.Rows;
136 AssertEquals ("#A04", "Deleted", rc [0].RowState.ToString ());
137 AssertEquals ("#A05", "Deleted", rc [2].RowState.ToString ());
141 table.AcceptChanges ();
142 AssertEquals ("#A06", "Name 1", (table.Rows [0]) [1]);
144 Console.WriteLine (rc [2]);
147 catch (Exception e) {
148 AssertEquals ("#A08", "There is no row at position 2.", e.Message);
152 private void EditModeTest ()
155 //Clear all existing values from table
156 for (int i = 0; i < table.Rows.Count; i++) {
157 table.Rows[i].Delete ();
159 table.AcceptChanges ();
160 row = table.NewRow ();
161 row["FName"] = "My FName";
162 table.Rows.Add (row);
166 //Initially: After Add (Row) But Before Accept Changes");
167 AssertEquals ("#A09", "My FName", row [1, DataRowVersion.Default]);
168 AssertEquals ("#A10", "LName", row [2, DataRowVersion.Default]);
170 AssertEquals ("#A11", "My FName", row [1, DataRowVersion.Current]);
171 AssertEquals ("#A12", "LName", row [2, DataRowVersion.Current]);
174 Console.WriteLine (row [1, DataRowVersion.Original]);
175 Console.WriteLine (row [1, DataRowVersion.Proposed]);
178 catch (Exception e) {
179 if (e.GetType () != typeof (AssertionException)) {
180 AssertEquals ("#A14", typeof (VersionNotFoundException), e.GetType ());
185 //After Accept Changes
186 table.AcceptChanges ();
187 AssertEquals ("#A15", "My FName", row [1, DataRowVersion.Default]);
188 AssertEquals ("#A16", "LName", row [2, DataRowVersion.Default]);
191 AssertEquals ("#A17", "My FName", row [1, DataRowVersion.Current]);
192 AssertEquals ("#A18", "LName", row [2, DataRowVersion.Current]);
195 Console.WriteLine (row [1, DataRowVersion.Proposed]);
198 catch (Exception e) {
199 if (e.GetType () != typeof (AssertionException)) {
200 AssertEquals ("#A20", typeof (VersionNotFoundException), e.GetType ());
205 // Stage 3 // Edit Mode
206 table.Rows [0].BeginEdit ();
207 table.Rows [0] ["LName"] = "My LName";
209 AssertEquals ("#A21", "My FName", row [1, DataRowVersion.Default]);
210 AssertEquals ("#A22", "My LName", row [2, DataRowVersion.Default]);
212 AssertEquals ("#A23", "My FName", row [1, DataRowVersion.Current]);
213 AssertEquals ("#A24", "LName", row [2, DataRowVersion.Current]);
216 AssertEquals ("#A25", "My FName", row [1, DataRowVersion.Original]); AssertEquals ("#A26", "LName", row [2, DataRowVersion.Original]);
218 AssertEquals ("#A26", "My FName", row [1, DataRowVersion.Proposed]);
219 AssertEquals ("#A27", "My LName", row [2, DataRowVersion.Proposed]);
223 //After Edit sessions
224 for (int i=0; i < table.Rows.Count;i++)
225 table.Rows [i].EndEdit ();
226 AssertEquals ("#A28", "My FName", row [1, DataRowVersion.Default]);
227 AssertEquals ("#A29", "My LName", row [2, DataRowVersion.Default]);
229 AssertEquals ("#A30", "My FName", row [1, DataRowVersion.Original]); AssertEquals ("#A31", "LName", row [2, DataRowVersion.Original]);
232 AssertEquals ("#A32", "My FName", row [1, DataRowVersion.Current]);
233 AssertEquals ("#A33", "My LName", row [2, DataRowVersion.Current]);
236 Console.WriteLine (row [1, DataRowVersion.Proposed]);
239 catch (Exception e) {
240 if (e.GetType ()!=typeof (AssertionException)) {
241 AssertEquals ("#A35", typeof (VersionNotFoundException), e.GetType ());
246 //After Accept Changes
247 AssertEquals ("#A36", "My FName", row [1, DataRowVersion.Default]);
248 AssertEquals ("#A37", "My LName", row [2, DataRowVersion.Default]);
251 AssertEquals ("#A38", "My FName", row [1, DataRowVersion.Original]); AssertEquals ("#A39", "My LName", row [2, DataRowVersion.Original]);
253 AssertEquals ("#A40", "My FName", row [1, DataRowVersion.Current]);
254 AssertEquals ("#A41", "My LName", row [2, DataRowVersion.Current]);
258 Console.WriteLine (row [1, DataRowVersion.Proposed]);
261 catch (Exception e) {
262 if (e.GetType () != typeof (AssertionException)) {
263 AssertEquals ("#A43", typeof (VersionNotFoundException),
271 Console.WriteLine (e + "" + e.StackTrace);
274 private void ParentRowTest (){
276 //Clear all existing values from table
277 for (int i = 0; i < table.Rows.Count; i++) {
278 table.Rows[i].Delete ();
280 table.AcceptChanges ();
281 row = table.NewRow ();
282 row["FName"] = "My FName";
284 table.Rows.Add (row);
286 DataTable tableC = new DataTable ("Child");
290 colC = new DataColumn ();
291 colC.DataType = System.Type.GetType ("System.Int32");
292 colC.ColumnName = "Id";
293 colC.AutoIncrement=true;
294 tableC.Columns.Add (colC);
297 colC = new DataColumn ();
298 colC.DataType = System.Type.GetType ("System.String");
299 colC.ColumnName = "Name";
300 tableC.Columns.Add (colC);
302 rowC = tableC.NewRow ();
303 rowC["Name"] = "My FName";
304 tableC.Rows.Add (rowC);
305 DataSet ds = new DataSet ();
306 ds.Tables.Add (table);
307 ds.Tables.Add (tableC);
308 DataRelation dr = new DataRelation ("PO", table.Columns ["Id"], tableC.Columns ["Id"]);
309 ds.Relations.Add (dr);
311 rowC.SetParentRow (table.Rows [0], dr);
313 AssertEquals ("#A44", table.Rows [0], (tableC.Rows [0]).GetParentRow (dr));
317 // tests item at row, column in table to be DBNull.Value
318 private void DBNullTest (string message, DataTable dt, int row, int column)
320 object val = dt.Rows[row].ItemArray[column];
321 AssertEquals(message, DBNull.Value, val);
324 // tests item at row, column in table to be null
325 private void NullTest (string message, DataTable dt, int row, int column)
327 object val = dt.Rows[row].ItemArray[column];
328 AssertEquals(message, null, val);
331 // tests item at row, column in table to be
332 private void ValueTest (string message, DataTable dt, int row, int column, object value)
334 object val = dt.Rows[row].ItemArray[column];
335 AssertEquals(message, value, val);
338 // test set null, DBNull.Value, and ItemArray short count
340 public void NullInItemArray ()
342 string zero = "zero";
346 DataTable table = new DataTable();
347 table.Columns.Add(new DataColumn(zero, typeof(string)));
348 table.Columns.Add(new DataColumn(one, typeof(string)));
349 table.Columns.Add(new DataColumn(two, typeof(string)));
351 object[] obj = new object[3];
352 // -- normal -----------------
357 // table.Rows[0].ItemArray.ItemArray[0] = "zero"
358 // table.Rows[0].ItemArray.ItemArray[1] = "one"
359 // table.Rows[0].ItemArray.ItemArray[2] = "two"
361 DataRow row = table.NewRow();
366 catch(Exception e1) {
367 Fail("DR1: Exception Caught: " + e1);
372 // -- null ----------
375 // table.Rows[1].ItemArray.ItemArray[0] = "zero"
376 // table.Rows[1].ItemArray.ItemArray[1] = DBNull.Value
377 // table.Rows[1].ItemArray.ItemArray[2] = "two"
379 row = table.NewRow();
384 catch(Exception e2) {
385 Fail("DR2: Exception Caught: " + e2);
390 // -- DBNull.Value -------------
391 obj[1] = DBNull.Value;
393 // table.Rows[2].ItemArray.ItemArray[0] = "zero"
394 // table.Rows[2].ItemArray.ItemArray[1] = DBNull.Value
395 // table.Rows[2].ItemArray.ItemArray[2] = "two"
397 row = table.NewRow();
402 catch(Exception e3) {
403 Fail("DR3: Exception Caught: " + e3);
408 // -- object array smaller than number of columns -----
415 // table.Rows[3].ItemArray.ItemArray[0] = "abc"
416 // table.Rows[3].ItemArray.ItemArray[1] = "def"
417 // table.Rows[3].ItemArray.ItemArray[2] = DBNull.Value;
419 row = table.NewRow();
424 catch(Exception e3) {
425 Fail("DR4: Exception Caught: " + e3);
430 // -- normal -----------------
431 ValueTest("DR5: normal value test", table, 0, 0, zero);
432 ValueTest("DR6: normal value test", table, 0, 1, one);
433 ValueTest("DR7: normal value test", table, 0, 2, two);
435 // -- null ----------
436 ValueTest("DR8: null value test", table, 1, 0, zero);
437 ValueTest("DR9: null value test", table, 1, 1, DBNull.Value);
438 ValueTest("DR10: null value test", table, 1, 2, two);
440 // -- DBNull.Value -------------
441 ValueTest("DR11: DBNull.Value value test", table, 2, 0, zero);
442 ValueTest("DR12: DBNull.Value value test", table, 2, 1, DBNull.Value);
443 ValueTest("DR13: DBNull.Value value test", table, 2, 2, two);
445 // -- object array smaller than number of columns -----
446 ValueTest("DR14: array smaller value test", table, 3, 0, abc);
447 ValueTest("DR15: array smaller value test", table, 3, 1, def);
448 ValueTest("DR16: array smaller value test", table, 3, 2, DBNull.Value);
451 // test DefaultValue when setting ItemArray
453 public void DefaultValueInItemArray () {
454 string zero = "zero";
456 DataTable table = new DataTable();
457 table.Columns.Add(new DataColumn("zero", typeof(string)));
459 DataColumn column = new DataColumn("num", typeof(int));
460 column.DefaultValue = 15;
461 table.Columns.Add(column);
463 object[] obj = new object[2];
464 // -- normal -----------------
468 // table.Rows[0].ItemArray.ItemArray[0] = "zero"
469 // table.Rows[0].ItemArray.ItemArray[1] = 8
471 DataRow row = table.NewRow();
476 catch(Exception e1) {
477 Fail("DR17: Exception Caught: " + e1);
482 // -- null ----------
485 // table.Rows[1].ItemArray.ItemArray[0] = "zero"
486 // table.Rows[1].ItemArray.ItemArray[1] = 15
488 row = table.NewRow();
493 catch(Exception e2) {
494 Fail("DR18: Exception Caught: " + e2);
499 // -- DBNull.Value -------------
500 obj[1] = DBNull.Value;
502 // table.Rows[2].ItemArray.ItemArray[0] = "zero"
503 // table.Rows[2].ItemArray.ItemArray[1] = DBNull.Value
504 // even though internally, the v
506 row = table.NewRow();
511 catch(Exception e3) {
512 Fail("DR19: Exception Caught: " + e3);
517 // -- object array smaller than number of columns -----
523 // table.Rows[3].ItemArray.ItemArray[0] = "abc"
524 // table.Rows[3].ItemArray.ItemArray[1] = DBNull.Value
526 row = table.NewRow();
531 catch(Exception e3) {
532 Fail("DR20: Exception Caught: " + e3);
537 // -- normal -----------------
538 ValueTest("DR20: normal value test", table, 0, 0, zero);
539 ValueTest("DR21: normal value test", table, 0, 1, 8);
541 // -- null ----------
542 ValueTest("DR22: null value test", table, 1, 0, zero);
543 ValueTest("DR23: null value test", table, 1, 1, 15);
545 // -- DBNull.Value -------------
546 ValueTest("DR24: DBNull.Value value test", table, 2, 0, zero);
547 DBNullTest("DR25: DBNull.Value value test", table, 2, 1);
549 // -- object array smaller than number of columns -----
550 ValueTest("DR26: array smaller value test", table, 3, 0, abc);
551 ValueTest("DR27: array smaller value test", table, 3, 1, 15);
554 // test AutoIncrement when setting ItemArray
556 public void AutoIncrementInItemArray () {
557 string zero = "zero";
560 DataTable table = new DataTable();
561 table.Columns.Add(new DataColumn(zero, typeof(string)));
563 DataColumn column = new DataColumn("num", typeof(int));
564 column.AutoIncrement = true;
565 table.Columns.Add(column);
567 object[] obj = new object[2];
568 // -- normal -----------------
572 // table.Rows[0].ItemArray.ItemArray[0] = "zero"
573 // table.Rows[0].ItemArray.ItemArray[1] = 8
575 DataRow row = table.NewRow();
580 catch(Exception e1) {
581 Fail("DR28: Exception Caught: " + e1);
586 // -- null 1----------
589 // table.Rows[1].ItemArray.ItemArray[0] = "zero"
590 // table.Rows[1].ItemArray.ItemArray[1] = 9
592 row = table.NewRow();
597 catch(Exception e2) {
598 Fail("DR29: Exception Caught: " + e2);
603 // -- null 2----------
606 // table.Rows[1].ItemArray.ItemArray[0] = "zero"
607 // table.Rows[1].ItemArray.ItemArray[1] = 10
609 row = table.NewRow();
614 catch(Exception e2) {
615 Fail("DR30: Exception Caught: " + e2);
620 // -- null 3----------
623 // table.Rows[1].ItemArray.ItemArray[0] = "zero"
624 // table.Rows[1].ItemArray.ItemArray[1] = 11
626 row = table.NewRow();
631 catch(Exception e2) {
632 Fail("DR31: Exception Caught: " + e2);
637 // -- DBNull.Value -------------
638 obj[1] = DBNull.Value;
640 // table.Rows[2].ItemArray.ItemArray[0] = "zero"
641 // table.Rows[2].ItemArray.ItemArray[1] = DBNull.Value
642 // even though internally, the AutoIncrement value
645 row = table.NewRow();
650 catch(Exception e3) {
651 Fail("DR32: Exception Caught: " + e3);
656 // -- null 4----------
659 // table.Rows[1].ItemArray.ItemArray[0] = "zero"
660 // table.Rows[1].ItemArray.ItemArray[1] = 13
662 row = table.NewRow();
667 catch(Exception e2) {
668 Fail("DR48: Exception Caught: " + e2);
673 // -- object array smaller than number of columns -----
679 // table.Rows[3].ItemArray.ItemArray[0] = "abc"
680 // table.Rows[3].ItemArray.ItemArray[1] = 14
682 row = table.NewRow();
687 catch(Exception e3) {
688 Fail("DR33: Exception Caught: " + e3);
693 // -- normal -----------------
694 ValueTest("DR34: normal value test", table, 0, 0, zero);
695 ValueTest("DR35: normal value test", table, 0, 1, 8);
697 // -- null 1----------
698 ValueTest("DR36: null value test", table, 1, 0, zero);
699 ValueTest("DR37: null value test", table, 1, 1, 9);
701 // -- null 2----------
702 ValueTest("DR38: null value test", table, 2, 0, zero);
703 ValueTest("DR39: null value test", table, 2, 1, 10);
705 // -- null 3----------
706 ValueTest("DR40: null value test", table, 3, 0, zero);
707 ValueTest("DR41: null value test", table, 3, 1, 11);
709 // -- DBNull.Value -------------
710 ValueTest("DR42: DBNull.Value value test", table, 4, 0, zero);
711 ValueTest("DR43: DBNull.Value value test", table, 4, 1, DBNull.Value);
713 // -- null 4----------
714 ValueTest("DR44: null value test", table, 5, 0, zero);
715 ValueTest("DR45: null value test", table, 5, 1, 13);
717 // -- object array smaller than number of columns -----
718 ValueTest("DR46: array smaller value test", table, 6, 0, abc);
719 ValueTest("DR47: array smaller value test", table, 6, 1, 14);