1 // DataTableTest.cs - NUnit Test Cases for testing the DataTable
4 // Franklin Wise (gracenote@earthlink.net)
5 // Martin Willemoes Hansen (mwh@sysrq.dk)
6 // Hagit Yidov (hagity@mainsoft.com)
9 // (C) 2003 Martin Willemoes Hansen
10 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
14 // Copyright (C) 2011 Xamarin Inc. (http://www.xamarin.com)
16 // Permission is hereby granted, free of charge, to any person obtaining
17 // a copy of this software and associated documentation files (the
18 // "Software"), to deal in the Software without restriction, including
19 // without limitation the rights to use, copy, modify, merge, publish,
20 // distribute, sublicense, and/or sell copies of the Software, and to
21 // permit persons to whom the Software is furnished to do so, subject to
22 // the following conditions:
24 // The above copyright notice and this permission notice shall be
25 // included in all copies or substantial portions of the Software.
27 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
31 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
32 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
33 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 using System.Collections;
38 using System.Collections.Generic;
40 using System.Data.SqlTypes;
41 using System.Globalization;
43 using System.Runtime.Serialization.Formatters.Binary;
44 using System.Threading;
48 using MonoTests.System.Data.Utils;
50 using NUnit.Framework;
52 namespace MonoTests.System.Data
55 public class DataTableTest : DataSetAssertion
60 MyDataTable.count = 0;
63 string EOL = Environment.NewLine;
68 DataTable dt = new DataTable();
70 Assert.IsFalse (dt.CaseSensitive, "CaseSensitive must be false.");
71 Assert.IsNotNull (dt.Columns, "Col");
72 //Assert.IsTrue (dt.ChildRelations != null);
73 Assert.IsNotNull (dt.Constraints, "Const");
74 Assert.IsNull (dt.DataSet, "ds");
75 Assert.IsNotNull (dt.DefaultView, "dv");
76 Assert.AreEqual (string.Empty, dt.DisplayExpression, "de");
77 Assert.IsNotNull (dt.ExtendedProperties, "ep");
78 Assert.IsFalse (dt.HasErrors, "he");
79 Assert.IsNotNull (dt.Locale, "lc");
80 Assert.AreEqual (50, dt.MinimumCapacity, "mc"); //LAMESPEC:
81 Assert.AreEqual (string.Empty, dt.Namespace, "ns");
82 //Assert.IsTrue (dt.ParentRelations != null);
83 Assert.AreEqual (string.Empty, dt.Prefix, "pf");
84 Assert.IsNotNull (dt.PrimaryKey, "pk");
85 Assert.IsNotNull (dt.Rows, "rows");
86 Assert.IsNull (dt.Site, "Site");
87 Assert.AreEqual (string.Empty, dt.TableName, "tname");
93 DataSet Set = new DataSet ();
94 DataTable Mom = new DataTable ("Mom");
95 DataTable Child = new DataTable ("Child");
97 Set.Tables.Add (Child);
99 DataColumn Col = new DataColumn ("Name");
100 DataColumn Col2 = new DataColumn ("ChildName");
101 Mom.Columns.Add (Col);
102 Mom.Columns.Add (Col2);
104 DataColumn Col3 = new DataColumn ("Name");
105 DataColumn Col4 = new DataColumn ("Age");
106 Col4.DataType = typeof (short);
107 Child.Columns.Add (Col3);
108 Child.Columns.Add (Col4);
110 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0]);
111 Set.Relations.Add (Relation);
113 DataRow Row = Mom.NewRow ();
139 Row [0] = "'Jhon O'' Collenal'";
143 Row = Child.NewRow ();
146 Child.Rows.Add (Row);
148 Row = Child.NewRow ();
151 Child.Rows.Add (Row);
153 Row = Child.NewRow ();
156 Child.Rows.Add (Row);
158 Row = Child.NewRow ();
161 Child.Rows.Add (Row);
163 Row = Child.NewRow ();
166 Child.Rows.Add (Row);
168 Row = Child.NewRow ();
171 Child.Rows.Add (Row);
173 Row = Child.NewRow ();
176 Child.Rows.Add (Row);
178 DataRow [] Rows = Mom.Select ("Name = 'Teresa'");
179 Assert.AreEqual (2, Rows.Length, "test#01");
181 // test with apos escaped
182 Rows = Mom.Select ("Name = '''Jhon O'''' Collenal'''");
183 Assert.AreEqual (1, Rows.Length, "test#01.1");
185 Rows = Mom.Select ("Name = 'Teresa' and ChildName = 'Nick'");
186 Assert.AreEqual (0, Rows.Length, "test#02");
188 Rows = Mom.Select ("Name = 'Teresa' and ChildName = 'Jack'");
189 Assert.AreEqual (1, Rows.Length, "test#03");
191 Rows = Mom.Select ("Name = 'Teresa' and ChildName <> 'Jack'");
192 Assert.AreEqual ("Mack", Rows [0] [1], "test#04");
194 Rows = Mom.Select ("Name = 'Teresa' or ChildName <> 'Jack'");
195 Assert.AreEqual (6, Rows.Length, "test#05");
197 Rows = Child.Select ("age = 20 - 1");
198 Assert.AreEqual (1, Rows.Length, "test#06");
200 Rows = Child.Select ("age <= 20");
201 Assert.AreEqual (3, Rows.Length, "test#07");
203 Rows = Child.Select ("age >= 20");
204 Assert.AreEqual (4, Rows.Length, "test#08");
206 Rows = Child.Select ("age >= 20 and name = 'Mack' or name = 'Nick'");
207 Assert.AreEqual (2, Rows.Length, "test#09");
209 Rows = Child.Select ("age >= 20 and (name = 'Mack' or name = 'Nick')");
210 Assert.AreEqual (1, Rows.Length, "test#10");
211 Assert.AreEqual ("Mack", Rows [0] [0], "test#11");
213 Rows = Child.Select ("not (Name = 'Jack')");
214 Assert.AreEqual (6, Rows.Length, "test#12");
218 public void Select2 ()
220 DataSet Set = new DataSet ();
221 DataTable Child = new DataTable ("Child");
223 Set.Tables.Add (Child);
225 DataColumn Col3 = new DataColumn ("Name");
226 DataColumn Col4 = new DataColumn ("Age");
227 Col4.DataType = typeof (short);
228 Child.Columns.Add (Col3);
229 Child.Columns.Add (Col4);
231 DataRow Row = Child.NewRow ();
234 Child.Rows.Add (Row);
236 Row = Child.NewRow ();
239 Child.Rows.Add (Row);
241 Row = Child.NewRow ();
244 Child.Rows.Add (Row);
246 Row = Child.NewRow ();
249 Child.Rows.Add (Row);
251 Row = Child.NewRow ();
254 Child.Rows.Add (Row);
256 Row = Child.NewRow ();
259 Child.Rows.Add (Row);
261 DataRow [] Rows = Child.Select ("age >= 20", "age DESC");
262 Assert.AreEqual (3, Rows.Length, "test#01");
263 Assert.AreEqual ("Mack", Rows [0] [0], "test#02");
264 Assert.AreEqual ("Mick", Rows [1] [0], "test#03");
265 Assert.AreEqual ("Dick", Rows [2] [0], "test#04");
267 Rows = Child.Select ("age >= 20", "age asc");
268 Assert.AreEqual (3, Rows.Length, "test#05");
269 Assert.AreEqual ("Dick", Rows [0] [0], "test#06");
270 Assert.AreEqual ("Mick", Rows [1] [0], "test#07");
271 Assert.AreEqual ("Mack", Rows [2] [0], "test#08");
273 Rows = Child.Select ("age >= 20", "name asc");
274 Assert.AreEqual (3, Rows.Length, "test#09");
275 Assert.AreEqual ("Dick", Rows [0] [0], "test#10");
276 Assert.AreEqual ("Mack", Rows [1] [0], "test#11");
277 Assert.AreEqual ("Mick", Rows [2] [0], "test#12");
279 Rows = Child.Select ("age >= 20", "name desc");
280 Assert.AreEqual (3, Rows.Length, "test#09");
281 Assert.AreEqual ("Mick", Rows [0] [0], "test#10");
282 Assert.AreEqual ("Mack", Rows [1] [0], "test#11");
283 Assert.AreEqual ("Dick", Rows [2] [0], "test#12");
287 public void SelectParsing ()
289 DataTable T = new DataTable ("test");
290 DataColumn C = new DataColumn ("name");
292 C = new DataColumn ("age");
293 C.DataType = typeof (int);
295 C = new DataColumn ("id");
298 DataSet Set = new DataSet ("TestSet");
302 for (int i = 0; i < 100; i++) {
304 Row [0] = "human" + i;
316 Assert.AreEqual (12, T.Select ("age<=10").Length, "test#01");
318 Assert.AreEqual (12, T.Select ("age\n\t<\n\t=\t\n10").Length, "test#02");
321 T.Select ("name = 1human ");
322 Assert.Fail ("test#03");
323 } catch (SyntaxErrorException e) {
324 // missing operand after 'human' operand
325 Assert.AreEqual (typeof (SyntaxErrorException), e.GetType (), "test#04");
329 T.Select ("name = 1");
330 Assert.Fail ("test#05");
331 } catch (EvaluateException e) {
332 // Cannot perform '=' operation between string and Int32
333 Assert.AreEqual (typeof (EvaluateException), e.GetType (), "test#06");
336 Assert.AreEqual (1, T.Select ("age = '13'").Length, "test#07");
340 public void SelectEscaping ()
342 DataTable dt = new DataTable ();
343 dt.Columns.Add ("SomeCol");
344 dt.Rows.Add (new object [] {"\t"});
345 dt.Rows.Add (new object [] {"\\"});
347 Assert.AreEqual (0, dt.Select (@"SomeCol='\t'").Length, "test#01");
348 Assert.AreEqual (0, dt.Select (@"SomeCol='\\'").Length, "test#02");
350 Assert.AreEqual (0, dt.Select (@"SomeCol='\x'").Length, "test#03");
354 public void SelectOperators ()
356 DataTable T = new DataTable ("test");
357 DataColumn C = new DataColumn ("name");
359 C = new DataColumn ("age");
360 C.DataType = typeof (int);
362 C = new DataColumn ("id");
365 DataSet Set = new DataSet ("TestSet");
369 for (int i = 0; i < 100; i++) {
371 Row [0] = "human" + i;
383 Assert.AreEqual (11, T.Select ("age < 10").Length, "test#01");
384 Assert.AreEqual (12, T.Select ("age <= 10").Length, "test#02");
385 Assert.AreEqual (12, T.Select ("age< =10").Length, "test#03");
386 Assert.AreEqual (89, T.Select ("age > 10").Length, "test#04");
387 Assert.AreEqual (90, T.Select ("age >= 10").Length, "test#05");
388 Assert.AreEqual (100, T.Select ("age <> 10").Length, "test#06");
389 Assert.AreEqual (3, T.Select ("name < 'human10'").Length, "test#07");
390 Assert.AreEqual (3, T.Select ("id < '10'").Length, "test#08");
391 // FIXME: Somebody explain how this can be possible.
392 // it seems that it is no matter between 10 - 30. The
393 // result is allways 25 :-P
394 //Assert.AreEqual (25, T.Select ("id < 10").Length, "test#09");
399 public void SelectExceptions ()
401 DataTable T = new DataTable ("test");
402 DataColumn C = new DataColumn ("name");
404 C = new DataColumn ("age");
405 C.DataType = typeof (int);
407 C = new DataColumn ("id");
410 for (int i = 0; i < 100; i++) {
411 DataRow Row = T.NewRow ();
412 Row [0] = "human" + i;
419 T.Select ("name = human1");
420 Assert.Fail ("test#01");
421 } catch (EvaluateException e) {
422 // column name human not found
423 Assert.AreEqual (typeof (EvaluateException), e.GetType (), "test#02");
426 Assert.AreEqual (1, T.Select ("id = '12'").Length, "test#04");
427 Assert.AreEqual (1, T.Select ("id = 12").Length, "test#05");
430 T.Select ("id = 1k3");
431 Assert.Fail ("test#06");
432 } catch (SyntaxErrorException e) {
433 // no operands after k3 operator
434 Assert.AreEqual (typeof (SyntaxErrorException), e.GetType (), "test#07");
439 public void SelectStringOperators ()
441 DataTable T = new DataTable ("test");
442 DataColumn C = new DataColumn ("name");
444 C = new DataColumn ("age");
445 C.DataType = typeof (int);
447 C = new DataColumn ("id");
450 DataSet Set = new DataSet ("TestSet");
454 for (int i = 0; i < 100; i++) {
456 Row [0] = "human" + i;
467 Assert.AreEqual (1, T.Select ("name = 'human' + 1").Length, "test#01");
469 Assert.AreEqual ("human1", T.Select ("name = 'human' + 1") [0] ["name"], "test#02");
470 Assert.AreEqual (1, T.Select ("name = 'human' + '1'").Length, "test#03");
471 Assert.AreEqual ("human1", T.Select ("name = 'human' + '1'") [0] ["name"], "test#04");
472 Assert.AreEqual (1, T.Select ("name = 'human' + 1 + 2").Length, "test#05");
473 Assert.AreEqual ("human12", T.Select ("name = 'human' + '1' + '2'") [0] ["name"], "test#06");
475 Assert.AreEqual (1, T.Select ("name = 'huMAn' + 1").Length, "test#07");
477 Set.CaseSensitive = true;
478 Assert.AreEqual (0, T.Select ("name = 'huMAn' + 1").Length, "test#08");
480 T.CaseSensitive = false;
481 Assert.AreEqual (1, T.Select ("name = 'huMAn' + 1").Length, "test#09");
483 T.CaseSensitive = true;
484 Assert.AreEqual (0, T.Select ("name = 'huMAn' + 1").Length, "test#10");
486 Set.CaseSensitive = false;
487 Assert.AreEqual (0, T.Select ("name = 'huMAn' + 1").Length, "test#11");
489 T.CaseSensitive = false;
490 Assert.AreEqual (1, T.Select ("name = 'huMAn' + 1").Length, "test#12");
492 Assert.AreEqual (0, T.Select ("name = 'human1*'").Length, "test#13");
493 Assert.AreEqual (11, T.Select ("name like 'human1*'").Length, "test#14");
494 Assert.AreEqual (11, T.Select ("name like 'human1%'").Length, "test#15");
497 Assert.AreEqual (11, T.Select ("name like 'h*an1'").Length, "test#16");
498 Assert.Fail ("test#16");
499 } catch (EvaluateException e) {
500 // 'h*an1' is invalid
501 Assert.AreEqual (typeof (EvaluateException), e.GetType (), "test#17");
505 Assert.AreEqual (11, T.Select ("name like 'h%an1'").Length, "test#18");
506 Assert.Fail ("test#19");
507 } catch (EvaluateException e) {
508 // 'h%an1' is invalid
509 Assert.AreEqual (typeof (EvaluateException), e.GetType (), "test#20");
512 Assert.AreEqual (0, T.Select ("name like 'h[%]an'").Length, "test#21");
513 Assert.AreEqual (1, T.Select ("name like 'h[*]an'").Length, "test#22");
517 public void SelectAggregates ()
519 DataTable T = new DataTable ("test");
520 DataColumn C = new DataColumn ("name");
522 C = new DataColumn ("age");
523 C.DataType = typeof (int);
525 C = new DataColumn ("id");
529 for (int i = 0; i < 1000; i++) {
531 Row [0] = "human" + i;
537 Assert.AreEqual (1000, T.Select ("Sum(age) > 10").Length, "test#01");
538 Assert.AreEqual (1000, T.Select ("avg(age) = 499").Length, "test#02");
539 Assert.AreEqual (1000, T.Select ("min(age) = 0").Length, "test#03");
540 Assert.AreEqual (1000, T.Select ("max(age) = 999").Length, "test#04");
541 Assert.AreEqual (1000, T.Select ("count(age) = 1000").Length, "test#05");
542 Assert.AreEqual (1000, T.Select ("stdev(age) > 287 and stdev(age) < 289").Length, "test#06");
543 Assert.AreEqual (1000, T.Select ("var(age) < 83417 and var(age) > 83416").Length, "test#07");
547 public void SelectFunctions ()
549 DataTable T = new DataTable ("test");
550 DataColumn C = new DataColumn ("name");
552 C = new DataColumn ("age");
553 C.DataType = typeof (int);
555 C = new DataColumn ("id");
559 for (int i = 0; i < 1000; i++) {
561 Row [0] = "human" + i;
568 Row [0] = "human" + "test";
569 Row [1] = DBNull.Value;
570 Row [2] = DBNull.Value;
573 //TODO: How to test Convert-function
574 Assert.AreEqual (25, T.Select ("age = 5*5") [0]["age"], "test#01");
575 Assert.AreEqual (901, T.Select ("len(name) > 7").Length, "test#02");
576 Assert.AreEqual (125, T.Select ("age = 5*5*5 AND len(name)>7") [0]["age"], "test#03");
577 Assert.AreEqual (1, T.Select ("isnull(id, 'test') = 'test'").Length, "test#04");
578 Assert.AreEqual (1000, T.Select ("iif(id = '56', 'test', 'false') = 'false'").Length, "test#05");
579 Assert.AreEqual (1, T.Select ("iif(id = '56', 'test', 'false') = 'test'").Length, "test#06");
580 Assert.AreEqual (9, T.Select ("substring(id, 2, 3) = '23'").Length, "test#07");
581 Assert.AreEqual ("123", T.Select ("substring(id, 2, 3) = '23'") [0] ["id"], "test#08");
582 Assert.AreEqual ("423", T.Select ("substring(id, 2, 3) = '23'") [3] ["id"], "test#09");
583 Assert.AreEqual ("923", T.Select ("substring(id, 2, 3) = '23'") [8] ["id"], "test#10");
587 public void SelectRelations ()
589 DataSet Set = new DataSet ();
590 DataTable Mom = new DataTable ("Mom");
591 DataTable Child = new DataTable ("Child");
593 Set.Tables.Add (Mom);
594 Set.Tables.Add (Child);
596 DataColumn Col = new DataColumn ("Name");
597 DataColumn Col2 = new DataColumn ("ChildName");
598 Mom.Columns.Add (Col);
599 Mom.Columns.Add (Col2);
601 DataColumn Col3 = new DataColumn ("Name");
602 DataColumn Col4 = new DataColumn ("Age");
603 Col4.DataType = typeof (short);
604 Child.Columns.Add (Col3);
605 Child.Columns.Add (Col4);
607 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0]);
608 Set.Relations.Add (Relation);
610 DataRow Row = Mom.NewRow ();
635 Row = Child.NewRow ();
638 Child.Rows.Add (Row);
640 Row = Child.NewRow ();
643 Child.Rows.Add (Row);
645 Row = Child.NewRow ();
648 Child.Rows.Add (Row);
650 Row = Child.NewRow ();
653 Child.Rows.Add (Row);
655 Row = Child.NewRow ();
658 Child.Rows.Add (Row);
660 Row = Child.NewRow ();
663 Child.Rows.Add (Row);
665 DataRow [] Rows = Child.Select ("name = Parent.Childname");
666 Assert.AreEqual (6, Rows.Length, "test#01");
667 Rows = Child.Select ("Parent.childname = 'Jack'");
668 Assert.AreEqual (1, Rows.Length, "test#02");
672 // FIXME: LAMESPEC: Why the exception is thrown why... why...
673 Mom.Select ("Child.Name = 'Jack'");
674 Assert.Fail ("test#03");
675 } catch (Exception e) {
676 Assert.AreEqual (typeof (SyntaxErrorException), e.GetType (), "test#04");
677 Assert.AreEqual ("Cannot interpret token 'Child' at position 1.", e.Message, "test#05");
681 Rows = Child.Select ("Parent.name = 'Laura'");
682 Assert.AreEqual (3, Rows.Length, "test#06");
684 DataTable Parent2 = new DataTable ("Parent2");
685 Col = new DataColumn ("Name");
686 Col2 = new DataColumn ("ChildName");
688 Parent2.Columns.Add (Col);
689 Parent2.Columns.Add (Col2);
690 Set.Tables.Add (Parent2);
692 Row = Parent2.NewRow ();
695 Parent2.Rows.Add (Row);
697 Row = Parent2.NewRow ();
700 Parent2.Rows.Add (Row);
702 Row = Parent2.NewRow ();
705 Parent2.Rows.Add (Row);
707 Row = Parent2.NewRow ();
710 Parent2.Rows.Add (Row);
712 Row = Parent2.NewRow ();
715 Parent2.Rows.Add (Row);
717 Relation = new DataRelation ("Rel2", Parent2.Columns [1], Child.Columns [0]);
718 Set.Relations.Add (Relation);
721 Rows = Child.Select ("Parent.ChildName = 'Jack'");
722 Assert.Fail ("test#07");
723 } catch (EvaluateException e) {
724 Assert.AreEqual (typeof (EvaluateException), e.GetType (), "test#08");
725 // Do not compare exception messages!
726 //Assert.AreEqual ("The table [Child] involved in more than one relation. You must explicitly mention a relation name in the expression 'parent.[ChildName]'.", e.Message, "test#09");
729 Rows = Child.Select ("Parent(rel).ChildName = 'Jack'");
730 Assert.AreEqual (1, Rows.Length, "test#10");
732 Rows = Child.Select ("Parent(Rel2).ChildName = 'Jack'");
733 Assert.AreEqual (1, Rows.Length, "test#10");
736 Mom.Select ("Parent.name = 'John'");
737 } catch (IndexOutOfRangeException e) {
738 Assert.AreEqual (typeof (IndexOutOfRangeException), e.GetType (), "test#11");
739 // Do not compare exception messages!
740 //Assert.AreEqual ("Cannot find relation 0.", e.Message, "test#12");
745 public void SelectRowState()
747 DataTable d = new DataTable();
748 d.Columns.Add (new DataColumn ("aaa"));
749 DataRow [] rows = d.Select (null, null, DataViewRowState.Deleted);
750 Assert.AreEqual (0, rows.Length);
751 d.Rows.Add (new object [] {"bbb"});
752 d.Rows.Add (new object [] {"bbb"});
753 rows = d.Select (null, null, DataViewRowState.Deleted);
754 Assert.AreEqual (0, rows.Length);
758 public void ToStringTest()
760 DataTable dt = new DataTable();
761 dt.Columns.Add("Col1", typeof(int));
763 dt.TableName = "Mytable";
764 dt.DisplayExpression = "Col1";
766 string cmpr = dt.TableName + " + " + dt.DisplayExpression;
767 Assert.AreEqual (cmpr, dt.ToString());
771 public void PrimaryKey ()
773 DataTable dt = new DataTable ();
774 DataColumn Col = new DataColumn ();
775 Col.AllowDBNull = false;
776 Col.DataType = typeof (int);
777 dt.Columns.Add (Col);
782 Assert.AreEqual (0, dt.PrimaryKey.Length, "test#01");
784 dt.PrimaryKey = new DataColumn [] {dt.Columns [0]};
785 Assert.AreEqual (1, dt.PrimaryKey.Length, "test#02");
786 Assert.AreEqual ("Column1", dt.PrimaryKey [0].ColumnName, "test#03");
788 dt.PrimaryKey = null;
789 Assert.AreEqual (0, dt.PrimaryKey.Length, "test#04");
791 Col = new DataColumn ("failed");
794 dt.PrimaryKey = new DataColumn [] {Col};
795 Assert.Fail ("test#05");
796 } catch (ArgumentException e) {
797 Assert.AreEqual (typeof (ArgumentException), e.GetType (), "test#06");
798 // Never expect English message
799 // Assert.AreEqual ("Column must belong to a table.", e.Message, "test#07");
802 DataTable dt2 = new DataTable ();
806 dt.PrimaryKey = new DataColumn [] {dt2.Columns [0]};
807 Assert.Fail ("test#08");
808 } catch (ArgumentException e) {
809 Assert.AreEqual (typeof (ArgumentException), e.GetType (), "test#09");
810 // Never expect English message
811 // Assert.AreEqual ("PrimaryKey columns do not belong to this table.", e.Message, "test#10");
814 Assert.AreEqual (0, dt.Constraints.Count, "test#11");
816 dt.PrimaryKey = new DataColumn [] {dt.Columns [0], dt.Columns [1]};
817 Assert.AreEqual (2, dt.PrimaryKey.Length, "test#12");
818 Assert.AreEqual (1, dt.Constraints.Count, "test#13");
819 Assert.IsTrue (dt.Constraints [0] is UniqueConstraint, "test#14");
820 Assert.AreEqual ("Column1", dt.PrimaryKey [0].ColumnName, "test#15");
821 Assert.AreEqual ("Column2", dt.PrimaryKey [1].ColumnName, "test#16");
825 [SetCulture("en-US")]
826 public void PropertyExceptions ()
828 DataSet set = new DataSet ();
829 DataTable table = new DataTable ();
830 DataTable table1 = new DataTable ();
831 set.Tables.Add (table);
832 set.Tables.Add (table1);
834 DataColumn col = new DataColumn ();
835 col.ColumnName = "Id";
836 col.DataType = typeof (int);
837 table.Columns.Add (col);
838 UniqueConstraint uc = new UniqueConstraint ("UK1", table.Columns[0] );
839 table.Constraints.Add (uc);
840 table.CaseSensitive = false;
842 col = new DataColumn ();
843 col.ColumnName = "Name";
844 col.DataType = typeof (string);
845 table.Columns.Add (col);
847 col = new DataColumn ();
848 col.ColumnName = "Id";
849 col.DataType = typeof (int);
850 table1.Columns.Add (col);
851 col = new DataColumn ();
852 col.ColumnName = "Name";
853 col.DataType = typeof (string);
854 table1.Columns.Add (col);
856 DataRelation dr = new DataRelation ("DR", table.Columns[0], table1.Columns[0]);
857 set.Relations.Add (dr);
860 table.CaseSensitive = true;
861 table1.CaseSensitive = true;
862 Assert.Fail ("#A01");
863 } catch (ArgumentException) {
867 CultureInfo cultureInfo = new CultureInfo ("en-gb");
868 table.Locale = cultureInfo;
869 table1.Locale = cultureInfo;
870 Assert.Fail ("#A03");
871 } catch (ArgumentException) {
875 table.Prefix = "Prefix#1";
876 Assert.Fail ("#A05");
877 } catch (DataException) {
882 public void GetErrors ()
884 DataTable table = new DataTable ();
886 DataColumn col = new DataColumn ();
887 col.ColumnName = "Id";
888 col.DataType = typeof (int);
889 table.Columns.Add (col);
891 col = new DataColumn ();
892 col.ColumnName = "Name";
893 col.DataType = typeof (string);
894 table.Columns.Add (col);
896 DataRow row = table.NewRow ();
898 row ["name"] = "Abc";
899 row.RowError = "Error#1";
900 table.Rows.Add (row);
902 Assert.AreEqual (1, table.GetErrors ().Length, "#A01");
903 Assert.AreEqual ("Error#1", (table.GetErrors ())[0].RowError, "#A02");
907 public void NewRowAddedTest ()
909 DataTable table = new DataTable ();
911 DataColumn col = new DataColumn ();
912 col.ColumnName = "Id";
913 col.DataType = typeof (int);
914 table.Columns.Add (col);
916 col = new DataColumn ();
917 col.ColumnName = "Name";
918 col.DataType = typeof (string);
919 table.Columns.Add (col);
921 _tableNewRowAddedEventFired = false;
922 table.TableNewRow += new DataTableNewRowEventHandler (OnTableNewRowAdded);
923 DataRow row = table.NewRow ();
925 row ["name"] = "Abc";
926 table.Rows.Add (row);
928 Assert.IsTrue (_tableNewRowAddedEventFired, "#NewRowAdded Event #01");
932 public void CloneCopyTest ()
934 DataTable table = new DataTable ();
935 table.TableName = "Table#1";
936 DataTable table1 = new DataTable ();
937 table1.TableName = "Table#2";
939 table.AcceptChanges ();
941 DataSet set = new DataSet ("Data Set#1");
942 set.DataSetName = "Dataset#1";
943 set.Tables.Add (table);
944 set.Tables.Add (table1);
946 DataColumn col = new DataColumn ();
947 col.ColumnName = "Id";
948 col.DataType = typeof (int);
949 table.Columns.Add (col);
950 UniqueConstraint uc = new UniqueConstraint ("UK1", table.Columns[0] );
951 table.Constraints.Add (uc);
953 col = new DataColumn ();
954 col.ColumnName = "Id";
955 col.DataType = typeof (int);
956 table1.Columns.Add (col);
958 col = new DataColumn ();
959 col.ColumnName = "Name";
960 col.DataType = typeof (string);
961 table.Columns.Add (col);
963 col = new DataColumn ();
964 col.ColumnName = "Name";
965 col.DataType = typeof (string);
966 table1.Columns.Add (col);
967 DataRow row = table.NewRow ();
969 row ["name"] = "Abc";
970 row.RowError = "Error#1";
971 table.Rows.Add (row);
973 row = table.NewRow ();
975 row ["name"] = "Efg";
976 table.Rows.Add (row);
977 table.AcceptChanges ();
979 table.CaseSensitive = true;
980 table1.CaseSensitive = true;
981 table.MinimumCapacity = 100;
982 table.Prefix = "PrefixNo:1";
983 table.Namespace = "Namespace#1";
984 table.DisplayExpression = "Id / Name + (Id * Id)";
985 DataColumn[] colArray = {table.Columns[0]};
986 table.PrimaryKey = colArray;
987 table.ExtendedProperties.Add ("TimeStamp", DateTime.Now);
989 row = table1.NewRow ();
990 row ["Name"] = "Abc";
992 table1.Rows.Add (row);
994 row = table1.NewRow ();
996 row ["Name"] = "Efg";
997 table1.Rows.Add (row);
999 DataRelation dr = new DataRelation ("DR", table.Columns[0], table1.Columns[0]);
1000 set.Relations.Add (dr);
1002 //Testing properties of clone
1003 DataTable cloneTable = table.Clone ();
1004 Assert.IsTrue (cloneTable.CaseSensitive, "#A01");
1005 Assert.AreEqual (0 , cloneTable.ChildRelations.Count, "#A02");
1006 Assert.AreEqual (0 , cloneTable.ParentRelations.Count, "#A03");
1007 Assert.AreEqual (2, cloneTable.Columns.Count, "#A04");
1008 Assert.AreEqual (1, cloneTable.Constraints.Count, "#A05");
1009 Assert.AreEqual ("Id / Name + (Id * Id)", cloneTable.DisplayExpression, "#A06");
1010 Assert.AreEqual (1, cloneTable.ExtendedProperties.Count, "#A07");
1011 Assert.IsFalse (cloneTable.HasErrors, "#A08");
1012 Assert.AreEqual (100, cloneTable.MinimumCapacity, "#A10");
1013 Assert.AreEqual ("Namespace#1", cloneTable.Namespace, "#A11");
1014 Assert.AreEqual ("PrefixNo:1", cloneTable.Prefix, "#A12");
1015 Assert.AreEqual ("Id", cloneTable.PrimaryKey[0].ColumnName, "#A13");
1016 Assert.AreEqual (0, cloneTable.Rows.Count , "#A14");
1017 Assert.AreEqual ("Table#1", cloneTable.TableName, "#A15");
1019 //Testing properties of copy
1020 DataTable copyTable = table.Copy ();
1021 Assert.IsTrue (copyTable.CaseSensitive, "#A16");
1022 Assert.AreEqual (0 , copyTable.ChildRelations.Count, "#A17");
1023 Assert.AreEqual (0 , copyTable.ParentRelations.Count, "#A18");
1024 Assert.AreEqual (2, copyTable.Columns.Count, "#A19");
1025 Assert.AreEqual (1, copyTable.Constraints.Count, "#A20");
1026 Assert.AreEqual ("Id / Name + (Id * Id)", copyTable.DisplayExpression, "#A21");
1027 Assert.AreEqual (1, copyTable.ExtendedProperties.Count, "#A22");
1028 Assert.IsTrue (copyTable.HasErrors, "#A23");
1029 Assert.AreEqual (100, copyTable.MinimumCapacity, "#A25");
1030 Assert.AreEqual ("Namespace#1", copyTable.Namespace, "#A26");
1031 Assert.AreEqual ("PrefixNo:1", copyTable.Prefix, "#A27");
1032 Assert.AreEqual ("Id", copyTable.PrimaryKey[0].ColumnName, "#A28");
1033 Assert.AreEqual (2, copyTable.Rows.Count, "#A29");
1034 Assert.AreEqual ("Table#1", copyTable.TableName, "#A30");
1038 public void CloneExtendedProperties ()
1041 DataTable t1 = new DataTable ("t1");
1042 DataColumn c1 = t1.Columns.Add ("c1");
1043 c1.ExtendedProperties.Add ("Company", "Xamarin");
1045 DataTable t2 = t1.Clone ();
1046 Assert.AreEqual ("Xamarin", t1.Columns["c1"].ExtendedProperties["Company"], "CEP1");
1047 Assert.AreEqual ("Xamarin", t2.Columns["c1"].ExtendedProperties["Company"], "CEP2");
1051 [ExpectedException (typeof (EvaluateException))]
1052 public void CloneExtendedProperties1 ()
1055 DataTable table1 = new DataTable("Table1") ;
1057 DataColumn c1 = table1.Columns.Add("c1", typeof(string), "'hello ' + c2") ; /* Should cause an exception */
1061 public void CloneExtendedProperties2 ()
1064 DataTable table1 = new DataTable("Table1") ;
1066 DataColumn c1 = table1.Columns.Add("c1") ;
1067 DataColumn c2 = table1.Columns.Add("c2") ;
1069 c1.Expression = "'hello ' + c2";
1071 DataTable t2 = table1.Clone(); // this should not cause an exception
1075 public void LoadDataException ()
1077 DataTable table = new DataTable ();
1078 DataColumn col = new DataColumn ();
1079 col.ColumnName = "Id";
1080 col.DataType = typeof (int);
1081 col.DefaultValue = 47;
1082 table.Columns.Add (col);
1083 UniqueConstraint uc = new UniqueConstraint ("UK1", table.Columns[0] );
1084 table.Constraints.Add (uc);
1086 col = new DataColumn ();
1087 col.ColumnName = "Name";
1088 col.DataType = typeof (string);
1089 col.DefaultValue = "Hello";
1090 table.Columns.Add (col);
1092 table.BeginLoadData();
1093 object[] row = {147, "Abc"};
1094 DataRow newRow = table.LoadDataRow (row, true);
1096 object[] row1 = {147, "Efg"};
1097 DataRow newRow1 = table.LoadDataRow (row1, true);
1099 object[] row2 = {143, "Hij"};
1100 DataRow newRow2 = table.LoadDataRow (row2, true);
1103 table.EndLoadData ();
1104 Assert.Fail ("#A01");
1105 } catch (ConstraintException) {
1110 public void Changes () //To test GetChanges and RejectChanges
1112 DataTable table = new DataTable ();
1114 DataColumn col = new DataColumn ();
1115 col.ColumnName = "Id";
1116 col.DataType = typeof (int);
1117 table.Columns.Add (col);
1118 UniqueConstraint uc = new UniqueConstraint ("UK1", table.Columns[0] );
1119 table.Constraints.Add (uc);
1121 col = new DataColumn ();
1122 col.ColumnName = "Name";
1123 col.DataType = typeof (string);
1124 table.Columns.Add (col);
1126 DataRow row = table.NewRow ();
1128 row ["name"] = "Abc";
1129 table.Rows.Add (row);
1130 table.AcceptChanges ();
1132 row = table.NewRow ();
1134 row ["name"] = "Efg";
1135 table.Rows.Add (row);
1137 //Testing GetChanges
1138 DataTable changesTable = table.GetChanges ();
1139 Assert.AreEqual (1, changesTable.Rows.Count, "#A01");
1140 Assert.AreEqual ("Efg", changesTable.Rows[0]["Name"], "#A02");
1141 table.AcceptChanges ();
1142 changesTable = table.GetChanges ();
1145 int cnt = changesTable.Rows.Count;
1147 } catch (NullReferenceException) {
1150 //Testing RejectChanges
1151 row = table.NewRow ();
1153 row ["name"] = "Hij";
1154 table.Rows.Add (row);
1156 (table.Rows [0])["Name"] = "AaBbCc";
1157 table.RejectChanges ();
1158 Assert.AreEqual ("Abc" , (table.Rows [0]) ["Name"], "#A03");
1159 Assert.AreEqual (2, table.Rows.Count, "#A04");
1163 public void ImportRowTest ()
1165 // build source table
1166 DataTable src = new DataTable ();
1167 src.Columns.Add ("id", typeof (int));
1168 src.Columns.Add ("name", typeof (string));
1170 src.PrimaryKey = new DataColumn [] {src.Columns [0]} ;
1172 src.Rows.Add (new object [] { 1, "mono 1" });
1173 src.Rows.Add (new object [] { 2, "mono 2" });
1174 src.Rows.Add (new object [] { 3, "mono 3" });
1175 src.AcceptChanges ();
1177 src.Rows [0] [1] = "mono changed 1"; // modify 1st row
1178 src.Rows [1].Delete (); // delete 2nd row
1179 // 3rd row is unchanged
1180 src.Rows.Add (new object [] { 4, "mono 4" }); // add 4th row
1182 // build target table
1183 DataTable target = new DataTable ();
1184 target.Columns.Add ("id", typeof (int));
1185 target.Columns.Add ("name", typeof (string));
1187 target.PrimaryKey = new DataColumn [] {target.Columns [0]} ;
1190 target.ImportRow (src.Rows [0]); // import 1st row
1191 target.ImportRow (src.Rows [1]); // import 2nd row
1192 target.ImportRow (src.Rows [2]); // import 3rd row
1193 target.ImportRow (src.Rows [3]); // import 4th row
1196 target.ImportRow (src.Rows [2]); // import 3rd row again
1197 Assert.Fail ("#C1");
1198 } catch (ConstraintException ex) {
1199 // Column 'id' is constrained to be unique.
1200 // Value '3' is already present
1201 Assert.AreEqual (typeof (ConstraintException), ex.GetType (), "#C2");
1202 Assert.IsNull (ex.InnerException, "#C3");
1203 Assert.IsNotNull (ex.Message, "#C4");
1204 Assert.IsTrue (ex.Message.IndexOf ("'id'") != -1, "#C5");
1205 Assert.IsTrue (ex.Message.IndexOf ("'3'") != -1, "#C6");
1209 Assert.AreEqual (src.Rows [0].RowState, target.Rows [0].RowState, "#A1");
1210 Assert.AreEqual (src.Rows [1].RowState, target.Rows [1].RowState, "#A2");
1211 Assert.AreEqual (src.Rows [2].RowState, target.Rows [2].RowState, "#A3");
1212 Assert.AreEqual (src.Rows [3].RowState, target.Rows [3].RowState, "#A4");
1214 // check for modified row (1st row)
1215 Assert.AreEqual ((string) src.Rows [0] [1], (string) target.Rows [0] [1], "#B1");
1216 Assert.AreEqual ((string) src.Rows [0] [1, DataRowVersion.Default], (string) target.Rows [0] [1, DataRowVersion.Default], "#B2");
1217 Assert.AreEqual ((string) src.Rows [0] [1, DataRowVersion.Original], (string) target.Rows [0] [1, DataRowVersion.Original], "#B3");
1218 Assert.AreEqual ((string) src.Rows [0] [1, DataRowVersion.Current], (string) target.Rows [0] [1, DataRowVersion.Current], "#B4");
1219 Assert.IsFalse (target.Rows [0].HasVersion(DataRowVersion.Proposed), "#B5");
1221 // check for deleted row (2nd row)
1222 Assert.AreEqual ((string) src.Rows [1] [1, DataRowVersion.Original], (string) target.Rows [1] [1, DataRowVersion.Original], "#C1");
1224 // check for unchanged row (3rd row)
1225 Assert.AreEqual ((string) src.Rows [2] [1], (string) target.Rows [2] [1], "#D1");
1226 Assert.AreEqual ((string) src.Rows [2] [1, DataRowVersion.Default], (string) target.Rows [2] [1, DataRowVersion.Default], "#D2");
1227 Assert.AreEqual ((string) src.Rows [2] [1, DataRowVersion.Original], (string) target.Rows [2] [1, DataRowVersion.Original], "#D3");
1228 Assert.AreEqual ((string) src.Rows [2] [1, DataRowVersion.Current], (string) target.Rows [2] [1, DataRowVersion.Current], "#D4");
1230 // check for newly added row (4th row)
1231 Assert.AreEqual ((string) src.Rows [3] [1], (string) target.Rows [3] [1], "#E1");
1232 Assert.AreEqual ((string) src.Rows [3] [1, DataRowVersion.Default], (string) target.Rows [3] [1, DataRowVersion.Default], "#E2");
1233 Assert.AreEqual ((string) src.Rows [3] [1, DataRowVersion.Current], (string) target.Rows [3] [1, DataRowVersion.Current], "#E3");
1237 public void ImportRowDetachedTest ()
1239 DataTable table = new DataTable ();
1240 DataColumn col = new DataColumn ();
1241 col.ColumnName = "Id";
1242 col.DataType = typeof (int);
1243 table.Columns.Add (col);
1245 table.PrimaryKey = new DataColumn [] {col};
1247 col = new DataColumn ();
1248 col.ColumnName = "Name";
1249 col.DataType = typeof (string);
1250 table.Columns.Add (col);
1252 DataRow row = table.NewRow ();
1254 row ["name"] = "Abc";
1256 // keep silent as ms.net ;-), though this is not useful.
1257 table.ImportRow (row);
1259 //if RowState is detached, then dont import the row.
1260 Assert.AreEqual (0, table.Rows.Count, "#1");
1264 public void ImportRowDeletedTest ()
1266 DataTable table = new DataTable ();
1267 table.Columns.Add ("col", typeof (int));
1268 table.Columns.Add ("col1", typeof (int));
1270 DataRow row = table.Rows.Add (new object[] {1,2});
1271 table.PrimaryKey = new DataColumn[] {table.Columns[0]};
1272 table.AcceptChanges ();
1274 // If row is in Deleted state, then ImportRow loads the
1277 table.ImportRow (row);
1278 Assert.AreEqual (2, table.Rows.Count, "#A1");
1280 // Both the deleted rows shud be now gone
1281 table.AcceptChanges ();
1282 Assert.AreEqual (0, table.Rows.Count, "#A2");
1284 //just add another row
1285 row = table.Rows.Add (new object[] {1,2});
1286 // no exception shud be thrown
1287 table.AcceptChanges ();
1289 // If row is in Deleted state, then ImportRow loads the
1290 // row and validate only on RejectChanges
1292 table.ImportRow (row);
1293 Assert.AreEqual (2, table.Rows.Count, "#A3");
1294 Assert.AreEqual (DataRowState.Deleted, table.Rows[1].RowState, "#A4");
1297 table.RejectChanges ();
1298 Assert.Fail ("#B1");
1299 } catch (ConstraintException ex) {
1300 // Column 'col' is constrained to be unique.
1301 // Value '1' is already present
1302 Assert.AreEqual (typeof (ConstraintException), ex.GetType (), "#B2");
1303 Assert.IsNull (ex.InnerException, "#B3");
1304 Assert.IsNotNull (ex.Message, "#B4");
1305 Assert.IsTrue (ex.Message.IndexOf ("'col'") != -1, "#B5");
1306 Assert.IsTrue (ex.Message.IndexOf ("'1'") != -1, "#B6");
1312 public void ImportRowTypeChangeTest ()
1314 // this is from http://bugzilla.xamarin.com/show_bug.cgi?id=2926
1316 Type [] types = new Type [] { typeof (string), typeof (sbyte), typeof (byte), typeof (short), typeof (ushort), typeof (int), typeof (uint), typeof (long), typeof (ulong), typeof (float), typeof (double), typeof (char), typeof (decimal), typeof (DateTime) };
1317 object [] values = new object [] { "1", (sbyte) 1, (byte) 2, (short) 3, (ushort) 4, (int) 5, (uint) 6, (long) 7, (ulong) 8, (float) 9, (double) 10, 'z', (decimal) 13, new DateTime (24) };
1318 int length = types.Length;
1320 HashSet<Tuple<Type, Type>> invalid = new HashSet<Tuple<Type, Type>> () {
1321 Tuple.Create (typeof (string), typeof (DateTime)),
1322 Tuple.Create (typeof (sbyte), typeof (DateTime)),
1323 Tuple.Create (typeof (byte), typeof (DateTime)),
1324 Tuple.Create (typeof (short), typeof (DateTime)),
1325 Tuple.Create (typeof (ushort), typeof (DateTime)),
1326 Tuple.Create (typeof (int), typeof (DateTime)),
1327 Tuple.Create (typeof (uint), typeof (DateTime)),
1328 Tuple.Create (typeof (long), typeof (DateTime)),
1329 Tuple.Create (typeof (ulong), typeof (DateTime)),
1330 Tuple.Create (typeof (float), typeof (char)),
1331 Tuple.Create (typeof (float), typeof (DateTime)),
1332 Tuple.Create (typeof (double), typeof (char)),
1333 Tuple.Create (typeof (double), typeof (DateTime)),
1334 Tuple.Create (typeof (char), typeof (float)),
1335 Tuple.Create (typeof (char), typeof (double)),
1336 Tuple.Create (typeof (char), typeof (decimal)),
1337 Tuple.Create (typeof (char), typeof (DateTime)),
1338 Tuple.Create (typeof (Decimal), typeof (char)),
1339 Tuple.Create (typeof (Decimal), typeof (DateTime)),
1340 Tuple.Create (typeof (DateTime), typeof (sbyte)),
1341 Tuple.Create (typeof (DateTime), typeof (byte)),
1342 Tuple.Create (typeof (DateTime), typeof (short)),
1343 Tuple.Create (typeof (DateTime), typeof (ushort)),
1344 Tuple.Create (typeof (DateTime), typeof (int)),
1345 Tuple.Create (typeof (DateTime), typeof (uint)),
1346 Tuple.Create (typeof (DateTime), typeof (long)),
1347 Tuple.Create (typeof (DateTime), typeof (ulong)),
1348 Tuple.Create (typeof (DateTime), typeof (float)),
1349 Tuple.Create (typeof (DateTime), typeof (double)),
1350 Tuple.Create (typeof (DateTime), typeof (char)),
1351 Tuple.Create (typeof (DateTime), typeof (decimal)),
1354 for (int a = 0; a < length; a++) {
1355 for (int b = 0; b < length; b++) {
1356 DataSet ds = new DataSet ();
1357 DataTable dt1 = ds.Tables.Add ("T1");
1358 DataTable dt2 = ds.Tables.Add ("T2");
1360 string name = "C-" + types [a].Name + "-to-" + types [b].Name;
1361 dt1.Columns.Add (name, types [a]);
1362 dt2.Columns.Add (name, types [b]);
1364 DataRow r1 = dt1.NewRow ();
1367 r1 [0] = values [a];
1369 if (invalid.Contains (Tuple.Create (types [a], types [b]))) {
1372 Assert.Fail ("#B: " + name + " expected ArgumentException");
1373 } catch /*(ArgumentException)*/ {
1378 DataRow r2 = dt2.Rows [0];
1379 Assert.AreEqual (types [b], r2 [0].GetType (), "#A: " + name);
1387 public void ClearReset () //To test Clear and Reset methods
1389 DataTable table = new DataTable ("table");
1390 DataTable table1 = new DataTable ("table1");
1392 DataSet set = new DataSet ();
1393 set.Tables.Add (table);
1394 set.Tables.Add (table1);
1396 table.Columns.Add ("Id", typeof (int));
1397 table.Columns.Add ("Name", typeof (string));
1398 table.Constraints.Add (new UniqueConstraint ("UK1", table.Columns [0]));
1399 table.CaseSensitive = false;
1401 table1.Columns.Add ("Id", typeof (int));
1402 table1.Columns.Add ("Name", typeof (string));
1404 DataRelation dr = new DataRelation ("DR", table.Columns[0], table1.Columns[0]);
1405 set.Relations.Add (dr);
1407 DataRow row = table.NewRow ();
1409 row ["name"] = "Roopa";
1410 table.Rows.Add (row);
1412 row = table.NewRow ();
1414 row ["Name"] = "roopa";
1415 table.Rows.Add (row);
1417 Assert.AreEqual (2, table.Rows.Count);
1418 Assert.AreEqual (1, table.ChildRelations.Count);
1421 Assert.Fail ("#A01, should have thrown ArgumentException");
1422 } catch (ArgumentException) {
1425 Assert.AreEqual (0, table.Rows.Count, "#CT01");
1426 Assert.AreEqual (0, table.ChildRelations.Count, "#CT02");
1427 Assert.AreEqual (0, table.ParentRelations.Count, "#CT03");
1428 Assert.AreEqual (0, table.Constraints.Count, "#CT04");
1431 Assert.AreEqual (0, table1.Rows.Count, "#A05");
1432 Assert.AreEqual (0, table1.Constraints.Count, "#A06");
1433 Assert.AreEqual (0, table1.ParentRelations.Count, "#A07");
1437 Assert.AreEqual (0, table.Rows.Count, "#A08");
1438 Assert.AreEqual (0, table.Constraints.Count, "#A09");
1439 Assert.AreEqual (0, table.ChildRelations.Count, "#A10");
1443 public void ClearTest ()
1445 DataTable table = new DataTable ("test");
1446 table.Columns.Add ("id", typeof (int));
1447 table.Columns.Add ("name", typeof (string));
1449 table.PrimaryKey = new DataColumn [] { table.Columns [0] } ;
1451 table.Rows.Add (new object [] { 1, "mono 1" });
1452 table.Rows.Add (new object [] { 2, "mono 2" });
1453 table.Rows.Add (new object [] { 3, "mono 3" });
1454 table.Rows.Add (new object [] { 4, "mono 4" });
1456 table.AcceptChanges ();
1457 _tableClearedEventFired = false;
1458 table.TableCleared += new DataTableClearEventHandler (OnTableCleared);
1459 _tableClearingEventFired = false;
1460 table.TableClearing += new DataTableClearEventHandler (OnTableClearing);
1463 Assert.IsTrue (_tableClearingEventFired, "#3 should have fired cleared event");
1464 Assert.IsTrue (_tableClearedEventFired, "#0 should have fired cleared event");
1466 DataRow r = table.Rows.Find (1);
1467 Assert.IsTrue (r == null, "#1 should have cleared");
1469 // try adding new row. indexes should have cleared
1470 table.Rows.Add (new object [] { 2, "mono 2" });
1471 Assert.AreEqual (1, table.Rows.Count, "#2 should add row");
1474 private bool _tableClearedEventFired;
1475 private void OnTableCleared (object src, DataTableClearEventArgs args)
1477 _tableClearedEventFired = true;
1480 private bool _tableClearingEventFired;
1481 private void OnTableClearing (object src, DataTableClearEventArgs args)
1483 _tableClearingEventFired = true;
1486 private bool _tableNewRowAddedEventFired;
1487 private void OnTableNewRowAdded (object src, DataTableNewRowEventArgs args)
1489 _tableNewRowAddedEventFired = true;
1493 public void TestWriteXmlSchema1 ()
1495 DataTable dt = new DataTable("TestWriteXmlSchema");
1496 dt.Columns.Add("Col1", typeof(int));
1497 dt.Columns.Add("Col2", typeof(int));
1498 DataRow dr = dt.NewRow();
1502 DataTable dt1 = new DataTable("HelloWorld");
1503 dt1.Columns.Add("T1", typeof(int));
1504 dt1.Columns.Add("T2", typeof(int));
1505 DataRow dr1 = dt1.NewRow();
1509 TextWriter writer = new StringWriter ();
1510 dt.WriteXmlSchema (writer);
1511 string TextString = writer.ToString ();
1512 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
1513 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1514 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring, "test#01");
1516 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1517 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1518 Assert.AreEqual ("<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">", substring, "test#02");
1519 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1520 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1521 Assert.AreEqual (" <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"TestWriteXmlSchema\" msdata:UseCurrentLocale=\"true\">", substring, "test#03");
1522 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1523 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1524 Assert.AreEqual (" <xs:complexType>", substring, "test#04");
1526 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1527 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1528 Assert.AreEqual (" <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">", substring, "test#05");
1530 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1531 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1532 Assert.AreEqual (" <xs:element name=\"TestWriteXmlSchema\">", substring, "test#06");
1534 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1535 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1536 Assert.AreEqual (" <xs:complexType>", substring, "test#07");
1538 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1539 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1540 Assert.AreEqual (" <xs:sequence>", substring, "test#08");
1542 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1543 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1544 Assert.AreEqual (" <xs:element name=\"Col1\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#09");
1546 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1547 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1548 Assert.AreEqual (" <xs:element name=\"Col2\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#10");
1550 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1551 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1552 Assert.AreEqual (" </xs:sequence>", substring, "test#11");
1554 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1555 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1556 Assert.AreEqual (" </xs:complexType>", substring, "test#12");
1558 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1559 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1560 Assert.AreEqual (" </xs:element>", substring, "test#13");
1562 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1563 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1564 Assert.AreEqual (" </xs:choice>", substring, "test#14");
1566 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1567 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1568 Assert.AreEqual (" </xs:complexType>", substring, "test#15");
1570 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1571 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1572 Assert.AreEqual (" </xs:element>", substring, "test#16");
1573 Assert.AreEqual ("</xs:schema>", TextString, "test#17");
1577 public void TestWriteXmlSchema2()
1579 DataTable dt = new DataTable("TestWriteXmlSchema");
1580 dt.Columns.Add("Col1", typeof(int));
1581 dt.Columns.Add("Col2", typeof(int));
1582 DataRow dr = dt.NewRow();
1586 DataTable dt1 = new DataTable("HelloWorld");
1587 dt1.Columns.Add("T1", typeof(int));
1588 dt1.Columns.Add("T2", typeof(int));
1589 DataRow dr1 = dt1.NewRow();
1593 DataSet ds = new DataSet();
1596 DataRelation rel = new DataRelation("Relation1", dt.Columns["Col1"], dt1.Columns["T1"]);
1597 ds.Relations.Add(rel);
1598 TextWriter writer = new StringWriter ();
1599 dt.WriteXmlSchema (writer);
1600 string TextString = writer.ToString ();
1601 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
1602 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1603 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring, "test#01");
1605 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1606 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1607 Assert.AreEqual ("<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">", substring, "test#02");
1608 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1609 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1610 Assert.AreEqual (" <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"TestWriteXmlSchema\" msdata:UseCurrentLocale=\"true\">", substring, "test#03");
1611 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1612 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1613 Assert.AreEqual (" <xs:complexType>", substring, "test#04");
1615 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1616 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1617 Assert.AreEqual (" <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">", substring, "test#05");
1619 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1620 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1621 Assert.AreEqual (" <xs:element name=\"TestWriteXmlSchema\">", substring, "test#06");
1623 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1624 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1625 Assert.AreEqual (" <xs:complexType>", substring, "test#07");
1627 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1628 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1629 Assert.AreEqual (" <xs:sequence>", substring, "test#08");
1631 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1632 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1633 Assert.AreEqual (" <xs:element name=\"Col1\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#09");
1635 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1636 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1637 Assert.AreEqual (" <xs:element name=\"Col2\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#10");
1639 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1640 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1641 Assert.AreEqual (" </xs:sequence>", substring, "test#11");
1643 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1644 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1645 Assert.AreEqual (" </xs:complexType>", substring, "test#12");
1647 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1648 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1649 Assert.AreEqual (" </xs:element>", substring, "test#13");
1651 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1652 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1653 Assert.AreEqual (" </xs:choice>", substring, "test#14");
1655 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1656 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1657 Assert.AreEqual (" </xs:complexType>", substring, "test#15");
1659 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1660 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1661 Assert.AreEqual (" <xs:unique name=\"Constraint1\">", substring, "test#16");
1663 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1664 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1665 Assert.AreEqual (" <xs:selector xpath=\".//TestWriteXmlSchema\" />", substring, "test#17");
1667 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1668 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1669 Assert.AreEqual (" <xs:field xpath=\"Col1\" />", substring, "test#18");
1671 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1672 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1673 Assert.AreEqual (" </xs:unique>", substring, "test#19");
1675 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1676 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1677 Assert.AreEqual (" </xs:element>", substring, "test#20");
1678 Assert.AreEqual ("</xs:schema>", TextString, "test#21");
1682 public void TestWriteXmlSchema3()
1684 DataTable dt = new DataTable("TestWriteXmlSchema");
1685 dt.Columns.Add("Col1", typeof(int));
1686 dt.Columns.Add("Col2", typeof(int));
1687 DataRow dr = dt.NewRow();
1691 DataTable dt1 = new DataTable("HelloWorld");
1692 dt1.Columns.Add("T1", typeof(int));
1693 dt1.Columns.Add("T2", typeof(int));
1694 DataRow dr1 = dt1.NewRow();
1698 DataSet ds = new DataSet();
1701 DataRelation rel = new DataRelation("Relation1", dt.Columns["Col1"], dt1.Columns["T1"]);
1702 ds.Relations.Add(rel);
1703 TextWriter writer = new StringWriter ();
1704 dt.WriteXmlSchema (writer, true);
1705 string TextString = writer.ToString ();
1706 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
1707 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1708 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring, "test#01");
1710 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1711 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1712 Assert.AreEqual ("<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">", substring, "test#02");
1713 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1714 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1715 Assert.AreEqual (" <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"TestWriteXmlSchema\" msdata:UseCurrentLocale=\"true\">", substring, "test#03");
1716 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1717 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1718 Assert.AreEqual (" <xs:complexType>", substring, "test#04");
1720 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1721 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1722 Assert.AreEqual (" <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">", substring, "test#05");
1724 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1725 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1726 Assert.AreEqual (" <xs:element name=\"TestWriteXmlSchema\">", substring, "test#06");
1728 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1729 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1730 Assert.AreEqual (" <xs:complexType>", substring, "test#07");
1732 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1733 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1734 Assert.AreEqual (" <xs:sequence>", substring, "test#08");
1736 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1737 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1738 Assert.AreEqual (" <xs:element name=\"Col1\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#09");
1740 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1741 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1742 Assert.AreEqual (" <xs:element name=\"Col2\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#10");
1744 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1745 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1746 Assert.AreEqual (" </xs:sequence>", substring, "test#11");
1748 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1749 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1750 Assert.AreEqual (" </xs:complexType>", substring, "test#12");
1752 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1753 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1754 Assert.AreEqual (" </xs:element>", substring, "test#13");
1756 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1757 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1758 Assert.AreEqual (" <xs:element name=\"HelloWorld\">", substring, "test#14");
1760 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1761 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1762 Assert.AreEqual (" <xs:complexType>", substring, "test#15");
1764 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1765 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1766 Assert.AreEqual (" <xs:sequence>", substring, "test#16");
1768 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1769 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1770 Assert.AreEqual (" <xs:element name=\"T1\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#17");
1772 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1773 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1774 Assert.AreEqual (" <xs:element name=\"T2\" type=\"xs:int\" minOccurs=\"0\" />", substring, "test#18");
1776 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1777 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1778 Assert.AreEqual (" </xs:sequence>", substring, "test#19");
1780 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1781 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1782 Assert.AreEqual (" </xs:complexType>", substring, "test#20");
1784 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1785 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1786 Assert.AreEqual (" </xs:element>", substring, "test#21");
1788 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1789 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1790 Assert.AreEqual (" </xs:choice>", substring, "test#22");
1792 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1793 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1794 Assert.AreEqual (" </xs:complexType>", substring, "test#23");
1796 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1797 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1798 Assert.AreEqual (" <xs:unique name=\"Constraint1\">", substring, "test#24");
1800 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1801 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1802 Assert.AreEqual (" <xs:selector xpath=\".//TestWriteXmlSchema\" />", substring, "test#25");
1804 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1805 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1806 Assert.AreEqual (" <xs:field xpath=\"Col1\" />", substring, "test#26");
1808 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1809 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1810 Assert.AreEqual (" </xs:unique>", substring, "test#27");
1812 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1813 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1814 Assert.AreEqual (" <xs:keyref name=\"Relation1\" refer=\"Constraint1\">", substring, "test#28");
1816 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1817 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1818 Assert.AreEqual (" <xs:selector xpath=\".//HelloWorld\" />", substring, "test#29");
1820 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1821 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1822 Assert.AreEqual (" <xs:field xpath=\"T1\" />", substring, "test#30");
1824 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1825 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1826 Assert.AreEqual (" </xs:keyref>", substring, "test#31");
1828 substring = TextString.Substring (0, TextString.IndexOf(EOL));
1829 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
1830 Assert.AreEqual (" </xs:element>", substring, "test#32");
1831 Assert.AreEqual ("</xs:schema>", TextString, "test#33");
1835 public void Serialize ()
1837 MemoryStream fs = new MemoryStream ();
1839 // Construct a BinaryFormatter and use it
1840 // to serialize the data to the stream.
1841 BinaryFormatter formatter = new BinaryFormatter();
1843 // Create an array with multiple elements refering to
1844 // the one Singleton object.
1845 DataTable dt = new DataTable();
1847 dt.Columns.Add(new DataColumn("Id", typeof(string)));
1848 dt.Columns.Add(new DataColumn("ContactName", typeof(string)));
1849 dt.Columns.Add(new DataColumn("ContactTitle", typeof(string)));
1850 dt.Columns.Add(new DataColumn("ContactAreaCode", typeof(string)));
1851 dt.Columns.Add(new DataColumn("ContactPhone", typeof(string)));
1854 loRowToAdd = dt.NewRow();
1855 loRowToAdd[0] = "a";
1856 loRowToAdd[1] = "b";
1857 loRowToAdd[2] = "c";
1858 loRowToAdd[3] = "d";
1859 loRowToAdd[4] = "e";
1860 dt.Rows.Add(loRowToAdd);
1862 DataTable[] dtarr = new DataTable[] {dt};
1864 // Serialize the array elements.
1865 formatter.Serialize(fs, dtarr);
1867 // Deserialize the array elements.
1869 DataTable[] a2 = (DataTable[]) formatter.Deserialize(fs);
1871 DataSet ds = new DataSet();
1872 ds.Tables.Add(a2[0]);
1874 StringWriter sw = new StringWriter ();
1876 XmlDocument doc = new XmlDocument ();
1877 doc.LoadXml (sw.ToString ());
1878 Assert.AreEqual (5, doc.DocumentElement.FirstChild.ChildNodes.Count);
1882 public void SetPrimaryKeyAssertsNonNull ()
1884 DataTable dt = new DataTable ("table");
1885 dt.Columns.Add ("col1");
1886 dt.Columns.Add ("col2");
1887 dt.Constraints.Add (new UniqueConstraint (dt.Columns [0]));
1888 dt.Rows.Add (new object [] {1, 3});
1889 dt.Rows.Add (new object [] {DBNull.Value, 3});
1892 dt.PrimaryKey = new DataColumn [] { dt.Columns [0] };
1894 } catch (DataException) {
1899 public void PrimaryKeyColumnChecksNonNull ()
1901 DataTable dt = new DataTable ("table");
1902 dt.Columns.Add ("col1");
1903 dt.Columns.Add ("col2");
1904 dt.Constraints.Add (new UniqueConstraint (dt.Columns [0]));
1905 dt.PrimaryKey = new DataColumn [] {dt.Columns [0]};
1906 dt.Rows.Add (new object [] {1, 3});
1909 dt.Rows.Add (new object [] { DBNull.Value, 3 });
1911 } catch (NoNullAllowedException) {
1916 public void PrimaryKey_CheckSetsAllowDBNull ()
1918 DataTable table = new DataTable ();
1919 DataColumn col1 = table.Columns.Add ("col1", typeof (int));
1920 DataColumn col2 = table.Columns.Add ("col2", typeof (int));
1922 Assert.IsTrue (col1.AllowDBNull, "#1" );
1923 Assert.IsTrue (col2.AllowDBNull, "#2" );
1924 Assert.IsFalse (col2.Unique, "#3" );
1925 Assert.IsFalse (col2.Unique, "#4" );
1927 table.PrimaryKey = new DataColumn[] {col1,col2};
1928 Assert.IsFalse (col1.AllowDBNull, "#5" );
1929 Assert.IsFalse (col2.AllowDBNull, "#6" );
1930 // LAMESPEC or bug ??
1931 Assert.IsFalse (col1.Unique, "#7" );
1932 Assert.IsFalse (col2.Unique, "#8" );
1935 void RowChanging (object o, DataRowChangeEventArgs e)
1937 Assert.AreEqual (rowChangingExpectedAction, e.Action, "changing.Action");
1938 rowChangingRowChanging = true;
1941 void RowChanged (object o, DataRowChangeEventArgs e)
1943 Assert.AreEqual (rowChangingExpectedAction, e.Action, "changed.Action");
1944 rowChangingRowChanged = true;
1947 bool rowChangingRowChanging, rowChangingRowChanged;
1948 DataRowAction rowChangingExpectedAction;
1951 public void RowChanging ()
1953 DataTable dt = new DataTable ("table");
1954 dt.Columns.Add ("col1");
1955 dt.Columns.Add ("col2");
1956 dt.RowChanging += new DataRowChangeEventHandler (RowChanging);
1957 dt.RowChanged += new DataRowChangeEventHandler (RowChanged);
1958 rowChangingExpectedAction = DataRowAction.Add;
1959 dt.Rows.Add (new object [] {1, 2});
1960 Assert.IsTrue (rowChangingRowChanging, "changing,Added");
1961 Assert.IsTrue (rowChangingRowChanged, "changed,Added");
1962 rowChangingExpectedAction = DataRowAction.Change;
1963 dt.Rows [0] [0] = 2;
1964 Assert.IsTrue (rowChangingRowChanging, "changing,Changed");
1965 Assert.IsTrue (rowChangingRowChanged, "changed,Changed");
1969 public void CloneSubClassTest()
1971 MyDataTable dt1 = new MyDataTable();
1972 MyDataTable dt = (MyDataTable)(dt1.Clone());
1973 Assert.AreEqual (2, MyDataTable.count, "A#01");
1976 DataRowAction rowActionChanging = DataRowAction.Nothing;
1977 DataRowAction rowActionChanged = DataRowAction.Nothing;
1979 public void AcceptChangesTest ()
1981 DataTable dt = new DataTable ("test");
1982 dt.Columns.Add ("id", typeof (int));
1983 dt.Columns.Add ("name", typeof (string));
1985 dt.Rows.Add (new object [] { 1, "mono 1" });
1987 dt.RowChanged += new DataRowChangeEventHandler (OnRowChanged);
1988 dt.RowChanging += new DataRowChangeEventHandler (OnRowChanging);
1991 rowActionChanged = rowActionChanging = DataRowAction.Nothing;
1992 dt.AcceptChanges ();
1994 Assert.AreEqual (DataRowAction.Commit, rowActionChanging,
1995 "#1 should have fired event and set action to commit");
1996 Assert.AreEqual (DataRowAction.Commit, rowActionChanged,
1997 "#2 should have fired event and set action to commit");
1999 dt.RowChanged -= new DataRowChangeEventHandler (OnRowChanged);
2000 dt.RowChanging -= new DataRowChangeEventHandler (OnRowChanging);
2005 [ExpectedException (typeof (ArgumentException))]
2006 public void ColumnObjectTypeTest() {
2007 DataTable dt = new DataTable();
2008 dt.Columns.Add("Series Label", typeof(SqlInt32));
2009 dt.Rows.Add(new object[] {"sss"});
2012 private bool tableInitialized;
2014 public void TableInitializedEventTest1 ()
2016 DataTable dt = new DataTable();
2017 tableInitialized = false;
2018 dt.Initialized += new EventHandler (OnTableInitialized);
2019 dt.Columns.Add("Series Label", typeof(SqlInt32));
2020 dt.Rows.Add(new object[] {123});
2021 Assert.IsFalse (tableInitialized, "TableInitialized #01");
2022 dt.Initialized -= new EventHandler (OnTableInitialized);
2026 public void TableInitializedEventTest2 ()
2028 DataTable dt = new DataTable();
2030 tableInitialized = false;
2031 dt.Initialized += new EventHandler (OnTableInitialized);
2032 dt.Columns.Add("Series Label", typeof(SqlInt32));
2033 dt.Rows.Add(new object[] {123});
2035 dt.Initialized -= new EventHandler (OnTableInitialized);
2036 Assert.IsTrue (tableInitialized, "TableInitialized #02");
2040 public void TableInitializedEventTest3 ()
2042 DataTable dt = new DataTable();
2043 tableInitialized = true;
2044 dt.Initialized += new EventHandler (OnTableInitialized);
2045 dt.Columns.Add("Series Label", typeof(SqlInt32));
2046 dt.Rows.Add(new object[] {123});
2047 Assert.AreEqual (tableInitialized, dt.IsInitialized, "TableInitialized #03");
2048 dt.Initialized -= new EventHandler (OnTableInitialized);
2052 public void TableInitializedEventTest4 ()
2054 DataTable dt = new DataTable();
2055 Assert.IsTrue (dt.IsInitialized, "TableInitialized #04");
2057 tableInitialized = false;
2058 dt.Initialized += new EventHandler (OnTableInitialized);
2059 dt.Columns.Add("Series Label", typeof(SqlInt32));
2060 dt.Rows.Add(new object[] {123});
2061 Assert.IsFalse (dt.IsInitialized, "TableInitialized #05");
2063 Assert.IsTrue (dt.IsInitialized, "TableInitialized #06");
2064 Assert.IsTrue (tableInitialized, "TableInitialized #07");
2065 dt.Initialized -= new EventHandler (OnTableInitialized);
2068 private void OnTableInitialized (object src, EventArgs args)
2070 tableInitialized = true;
2073 public void OnRowChanging (object src, DataRowChangeEventArgs args)
2075 rowActionChanging = args.Action;
2078 public void OnRowChanged (object src, DataRowChangeEventArgs args)
2080 rowActionChanged = args.Action;
2083 private DataTable dt;
2084 private void localSetup () {
2085 dt = new DataTable ("test");
2086 dt.Columns.Add ("id", typeof (int));
2087 dt.Columns.Add ("name", typeof (string));
2088 dt.PrimaryKey = new DataColumn[] { dt.Columns["id"] };
2090 dt.Rows.Add (new object[] { 1, "mono 1" });
2091 dt.Rows.Add (new object[] { 2, "mono 2" });
2092 dt.Rows.Add (new object[] { 3, "mono 3" });
2094 dt.AcceptChanges ();
2097 #region DataTable.CreateDataReader Tests
2100 public void CreateDataReader1 ()
2103 DataTableReader dtr = dt.CreateDataReader ();
2104 Assert.IsTrue (dtr.HasRows, "HasRows");
2105 Assert.AreEqual (dt.Columns.Count, dtr.FieldCount, "CountCols");
2107 while (dtr.Read ()) {
2108 for (int i = 0; i < dtr.FieldCount; i++) {
2109 Assert.AreEqual (dt.Rows[ri][i], dtr[i], "RowData-" + ri + "-" + i);
2116 public void CreateDataReader2 ()
2119 DataTableReader dtr = dt.CreateDataReader ();
2120 Assert.IsTrue (dtr.HasRows, "HasRows");
2121 Assert.AreEqual (dt.Columns.Count, dtr.FieldCount, "CountCols");
2123 Assert.AreEqual (1, dtr[0], "RowData0-0");
2124 Assert.AreEqual ("mono 1", dtr[1], "RowData0-1");
2126 Assert.AreEqual (2, dtr[0], "RowData1-0");
2127 Assert.AreEqual ("mono 2", dtr[1], "RowData1-1");
2129 Assert.AreEqual (3, dtr[0], "RowData2-0");
2130 Assert.AreEqual ("mono 3", dtr[1], "RowData2-1");
2133 #endregion // DataTable.CreateDataReader Tests
2135 #region DataTable.Load Tests
2138 public void Load_Basic ()
2141 DataTable dtLoad = new DataTable ("LoadBasic");
2142 dtLoad.Columns.Add ("id", typeof (int));
2143 dtLoad.Columns.Add ("name", typeof (string));
2144 dtLoad.Columns["id"].ReadOnly = true;
2145 dtLoad.Columns["name"].ReadOnly = true;
2146 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2147 dtLoad.Rows.Add (new object[] { 1, "load 1" });
2148 dtLoad.Rows.Add (new object[] { 2, "load 2" });
2149 dtLoad.Rows.Add (new object[] { 3, "load 3" });
2150 dtLoad.AcceptChanges ();
2151 DataTableReader dtr = dt.CreateDataReader ();
2153 Assert.AreEqual (2, dtLoad.Columns.Count, "NColumns");
2154 Assert.AreEqual (3, dtLoad.Rows.Count, "NRows");
2155 Assert.AreEqual (1, dtLoad.Rows[0][0], "RowData0-0");
2156 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1], "RowData0-1");
2157 Assert.AreEqual (2, dtLoad.Rows[1][0], "RowData1-0");
2158 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1], "RowData1-1");
2159 Assert.AreEqual (3, dtLoad.Rows[2][0], "RowData2-0");
2160 Assert.AreEqual ("mono 3", dtLoad.Rows[2][1], "RowData2-1");
2164 public void Load_NoSchema ()
2167 DataTable dtLoad = new DataTable ("LoadNoSchema");
2168 DataTableReader dtr = dt.CreateDataReader ();
2170 Assert.AreEqual (2, dtLoad.Columns.Count, "NColumns");
2171 Assert.AreEqual (3, dtLoad.Rows.Count, "NRows");
2172 Assert.AreEqual (1, dtLoad.Rows[0][0], "RowData0-0");
2173 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1], "RowData0-1");
2174 Assert.AreEqual (2, dtLoad.Rows[1][0], "RowData1-0");
2175 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1], "RowData1-1");
2176 Assert.AreEqual (3, dtLoad.Rows[2][0], "RowData2-0");
2177 Assert.AreEqual ("mono 3", dtLoad.Rows[2][1], "RowData2-1");
2180 internal struct fillErrorStruct
2182 internal string error;
2183 internal string tableName;
2184 internal int rowKey;
2185 internal bool contFlag;
2187 internal void init (string tbl, int row, bool cont, string err)
2195 private fillErrorStruct[] fillErr = new fillErrorStruct[3];
2196 private int fillErrCounter;
2197 private void fillErrorHandler (object sender, FillErrorEventArgs e)
2199 e.Continue = fillErr[fillErrCounter].contFlag;
2200 Assert.AreEqual (fillErr[fillErrCounter].tableName, e.DataTable.TableName, "fillErr-T");
2201 //Assert.AreEqual (fillErr[fillErrCounter].rowKey, e.Values[0], "fillErr-R");
2202 Assert.AreEqual (fillErr[fillErrCounter].contFlag, e.Continue, "fillErr-C");
2203 //Assert.AreEqual (fillErr[fillErrCounter].error, e.Errors.Message, "fillErr-E");
2208 public void Load_Incompatible ()
2211 DataTable dtLoad = new DataTable ("LoadIncompatible");
2212 dtLoad.Columns.Add ("name", typeof (double));
2213 DataTableReader dtr = dt.CreateDataReader ();
2217 } catch (ArgumentException) {
2221 // Load doesn't have a third overload in System.Data
2222 // and is commented-out below
2223 public void Load_IncompatibleEHandlerT ()
2226 fillErr[0].init ("LoadIncompatible", 1, true,
2227 "Input string was not in a correct format.Couldn't store <mono 1> in name Column. Expected type is Double.");
2228 fillErr[1].init ("LoadIncompatible", 2, true,
2229 "Input string was not in a correct format.Couldn't store <mono 2> in name Column. Expected type is Double.");
2230 fillErr[2].init ("LoadIncompatible", 3, true,
2231 "Input string was not in a correct format.Couldn't store <mono 3> in name Column. Expected type is Double.");
2233 DataTable dtLoad = new DataTable ("LoadIncompatible");
2234 dtLoad.Columns.Add ("name", typeof (double));
2235 DataTableReader dtr = dt.CreateDataReader ();
2236 dtLoad.Load (dtr,LoadOption.PreserveChanges,fillErrorHandler);
2240 // Load doesn't have a third overload in System.Data
2241 // and is commented-out below
2242 public void Load_IncompatibleEHandlerF ()
2245 fillErr[0].init ("LoadIncompatible", 1, false,
2246 "Input string was not in a correct format.Couldn't store <mono 1> in name Column. Expected type is Double.");
2248 DataTable dtLoad = new DataTable ("LoadIncompatible");
2249 dtLoad.Columns.Add ("name", typeof (double));
2250 DataTableReader dtr = dt.CreateDataReader ();
2252 dtLoad.Load (dtr, LoadOption.PreserveChanges, fillErrorHandler);
2254 } catch (ArgumentException) {
2259 public void Load_ExtraColsEqualVal ()
2262 DataTable dtLoad = new DataTable ("LoadExtraCols");
2263 dtLoad.Columns.Add ("id", typeof (int));
2264 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2265 dtLoad.Rows.Add (new object[] { 1 });
2266 dtLoad.Rows.Add (new object[] { 2 });
2267 dtLoad.Rows.Add (new object[] { 3 });
2268 dtLoad.AcceptChanges ();
2269 DataTableReader dtr = dt.CreateDataReader ();
2271 Assert.AreEqual (2, dtLoad.Columns.Count, "NColumns");
2272 Assert.AreEqual (3, dtLoad.Rows.Count, "NRows");
2273 Assert.AreEqual (1, dtLoad.Rows[0][0], "RowData0-0");
2274 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1], "RowData0-1");
2275 Assert.AreEqual (2, dtLoad.Rows[1][0], "RowData1-0");
2276 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1], "RowData1-1");
2277 Assert.AreEqual (3, dtLoad.Rows[2][0], "RowData2-0");
2278 Assert.AreEqual ("mono 3", dtLoad.Rows[2][1], "RowData2-1");
2282 public void Load_ExtraColsNonEqualVal ()
2285 DataTable dtLoad = new DataTable ("LoadExtraCols");
2286 dtLoad.Columns.Add ("id", typeof (int));
2287 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2288 dtLoad.Rows.Add (new object[] { 4 });
2289 dtLoad.Rows.Add (new object[] { 5 });
2290 dtLoad.Rows.Add (new object[] { 6 });
2291 dtLoad.AcceptChanges ();
2292 DataTableReader dtr = dt.CreateDataReader ();
2294 Assert.AreEqual (2, dtLoad.Columns.Count, "NColumns");
2295 Assert.AreEqual (6, dtLoad.Rows.Count, "NRows");
2296 Assert.AreEqual (4, dtLoad.Rows[0][0], "RowData0-0");
2297 Assert.AreEqual (5, dtLoad.Rows[1][0], "RowData1-0");
2298 Assert.AreEqual (6, dtLoad.Rows[2][0], "RowData2-0");
2299 Assert.AreEqual (1, dtLoad.Rows[3][0], "RowData3-0");
2300 Assert.AreEqual ("mono 1", dtLoad.Rows[3][1], "RowData3-1");
2301 Assert.AreEqual (2, dtLoad.Rows[4][0], "RowData4-0");
2302 Assert.AreEqual ("mono 2", dtLoad.Rows[4][1], "RowData4-1");
2303 Assert.AreEqual (3, dtLoad.Rows[5][0], "RowData5-0");
2304 Assert.AreEqual ("mono 3", dtLoad.Rows[5][1], "RowData5-1");
2308 public void Load_MissingColsNonNullable ()
2311 DataTable dtLoad = new DataTable ("LoadMissingCols");
2312 dtLoad.Columns.Add ("id", typeof (int));
2313 dtLoad.Columns.Add ("name", typeof (string));
2314 dtLoad.Columns.Add ("missing", typeof (string));
2315 dtLoad.Columns["missing"].AllowDBNull = false;
2316 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2317 dtLoad.Rows.Add (new object[] { 4, "mono 4", "miss4" });
2318 dtLoad.Rows.Add (new object[] { 5, "mono 5", "miss5" });
2319 dtLoad.Rows.Add (new object[] { 6, "mono 6", "miss6" });
2320 dtLoad.AcceptChanges ();
2321 DataTableReader dtr = dt.CreateDataReader ();
2325 } catch (ConstraintException) {
2330 public void Load_MissingColsDefault ()
2333 DataTable dtLoad = new DataTable ("LoadMissingCols");
2334 dtLoad.Columns.Add ("id", typeof (int));
2335 dtLoad.Columns.Add ("name", typeof (string));
2336 dtLoad.Columns.Add ("missing", typeof (string));
2337 dtLoad.Columns["missing"].AllowDBNull = false;
2338 dtLoad.Columns["missing"].DefaultValue = "DefaultValue";
2339 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2340 dtLoad.Rows.Add (new object[] { 4, "mono 4", "miss4" });
2341 dtLoad.Rows.Add (new object[] { 5, "mono 5", "miss5" });
2342 dtLoad.Rows.Add (new object[] { 6, "mono 6", "miss6" });
2343 dtLoad.AcceptChanges ();
2344 DataTableReader dtr = dt.CreateDataReader ();
2346 Assert.AreEqual (3, dtLoad.Columns.Count, "NColumns");
2347 Assert.AreEqual (6, dtLoad.Rows.Count, "NRows");
2348 Assert.AreEqual (4, dtLoad.Rows[0][0], "RowData0-0");
2349 Assert.AreEqual ("mono 4", dtLoad.Rows[0][1], "RowData0-1");
2350 Assert.AreEqual ("miss4", dtLoad.Rows[0][2], "RowData0-2");
2351 Assert.AreEqual (5, dtLoad.Rows[1][0], "RowData1-0");
2352 Assert.AreEqual ("mono 5", dtLoad.Rows[1][1], "RowData1-1");
2353 Assert.AreEqual ("miss5", dtLoad.Rows[1][2], "RowData1-2");
2354 Assert.AreEqual (6, dtLoad.Rows[2][0], "RowData2-0");
2355 Assert.AreEqual ("mono 6", dtLoad.Rows[2][1], "RowData2-1");
2356 Assert.AreEqual ("miss6", dtLoad.Rows[2][2], "RowData2-2");
2357 Assert.AreEqual (1, dtLoad.Rows[3][0], "RowData3-0");
2358 Assert.AreEqual ("mono 1", dtLoad.Rows[3][1], "RowData3-1");
2359 Assert.AreEqual ("DefaultValue", dtLoad.Rows[3][2], "RowData3-2");
2360 Assert.AreEqual (2, dtLoad.Rows[4][0], "RowData4-0");
2361 Assert.AreEqual ("mono 2", dtLoad.Rows[4][1], "RowData4-1");
2362 Assert.AreEqual ("DefaultValue", dtLoad.Rows[4][2], "RowData4-2");
2363 Assert.AreEqual (3, dtLoad.Rows[5][0], "RowData5-0");
2364 Assert.AreEqual ("mono 3", dtLoad.Rows[5][1], "RowData5-1");
2365 Assert.AreEqual ("DefaultValue", dtLoad.Rows[5][2], "RowData5-2");
2369 public void Load_MissingColsNullable ()
2372 DataTable dtLoad = new DataTable ("LoadMissingCols");
2373 dtLoad.Columns.Add ("id", typeof (int));
2374 dtLoad.Columns.Add ("name", typeof (string));
2375 dtLoad.Columns.Add ("missing", typeof (string));
2376 dtLoad.Columns["missing"].AllowDBNull = true;
2377 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2378 dtLoad.Rows.Add (new object[] { 4, "mono 4", "miss4" });
2379 dtLoad.Rows.Add (new object[] { 5, "mono 5", "miss5" });
2380 dtLoad.Rows.Add (new object[] { 6, "mono 6", "miss6" });
2381 dtLoad.AcceptChanges ();
2382 DataTableReader dtr = dt.CreateDataReader ();
2384 Assert.AreEqual (3, dtLoad.Columns.Count, "NColumns");
2385 Assert.AreEqual (6, dtLoad.Rows.Count, "NRows");
2386 Assert.AreEqual (4, dtLoad.Rows[0][0], "RowData0-0");
2387 Assert.AreEqual ("mono 4", dtLoad.Rows[0][1], "RowData0-1");
2388 Assert.AreEqual ("miss4", dtLoad.Rows[0][2], "RowData0-2");
2389 Assert.AreEqual (5, dtLoad.Rows[1][0], "RowData1-0");
2390 Assert.AreEqual ("mono 5", dtLoad.Rows[1][1], "RowData1-1");
2391 Assert.AreEqual ("miss5", dtLoad.Rows[1][2], "RowData1-2");
2392 Assert.AreEqual (6, dtLoad.Rows[2][0], "RowData2-0");
2393 Assert.AreEqual ("mono 6", dtLoad.Rows[2][1], "RowData2-1");
2394 Assert.AreEqual ("miss6", dtLoad.Rows[2][2], "RowData2-2");
2395 Assert.AreEqual (1, dtLoad.Rows[3][0], "RowData3-0");
2396 Assert.AreEqual ("mono 1", dtLoad.Rows[3][1], "RowData3-1");
2397 //Assert.IsNull (dtLoad.Rows[3][2], "RowData3-2");
2398 Assert.AreEqual (2, dtLoad.Rows[4][0], "RowData4-0");
2399 Assert.AreEqual ("mono 2", dtLoad.Rows[4][1], "RowData4-1");
2400 //Assert.IsNull (dtLoad.Rows[4][2], "RowData4-2");
2401 Assert.AreEqual (3, dtLoad.Rows[5][0], "RowData5-0");
2402 Assert.AreEqual ("mono 3", dtLoad.Rows[5][1], "RowData5-1");
2403 //Assert.IsNull (dtLoad.Rows[5][2], "RowData5-2");
2406 private DataTable setupRowState ()
2408 DataTable tbl = new DataTable ("LoadRowStateChanges");
2409 tbl.RowChanged += new DataRowChangeEventHandler (dtLoad_RowChanged);
2410 tbl.RowChanging += new DataRowChangeEventHandler (dtLoad_RowChanging);
2411 tbl.Columns.Add ("id", typeof (int));
2412 tbl.Columns.Add ("name", typeof (string));
2413 tbl.PrimaryKey = new DataColumn[] { tbl.Columns["id"] };
2414 tbl.Rows.Add (new object[] { 1, "RowState 1" });
2415 tbl.Rows.Add (new object[] { 2, "RowState 2" });
2416 tbl.Rows.Add (new object[] { 3, "RowState 3" });
2417 tbl.AcceptChanges ();
2418 // Update Table with following changes: Row0 unmodified,
2419 // Row1 modified, Row2 deleted, Row3 added, Row4 not-present.
2420 tbl.Rows[1]["name"] = "Modify 2";
2421 tbl.Rows[2].Delete ();
2422 DataRow row = tbl.NewRow ();
2424 row["name"] = "Add 4";
2429 private DataRowAction[] rowChangeAction = new DataRowAction[5];
2430 private bool checkAction;
2431 private int rowChagedCounter, rowChangingCounter;
2432 private void rowActionInit (DataRowAction[] act)
2435 rowChagedCounter = 0;
2436 rowChangingCounter = 0;
2437 for (int i = 0; i < 5; i++)
2438 rowChangeAction[i] = act[i];
2441 private void rowActionEnd ()
2443 checkAction = false;
2446 private void dtLoad_RowChanged (object sender, DataRowChangeEventArgs e)
2449 Assert.AreEqual (rowChangeAction[rowChagedCounter], e.Action, "RowChanged" + rowChagedCounter);
2454 private void dtLoad_RowChanging (object sender, DataRowChangeEventArgs e)
2457 Assert.AreEqual (rowChangeAction[rowChangingCounter], e.Action, "RowChanging" + rowChangingCounter);
2458 rowChangingCounter++;
2463 public void Load_RowStateChangesDefault ()
2466 dt.Rows.Add (new object[] { 4, "mono 4" });
2467 dt.Rows.Add (new object[] { 5, "mono 5" });
2468 dt.AcceptChanges ();
2469 DataTableReader dtr = dt.CreateDataReader ();
2470 DataTable dtLoad = setupRowState ();
2471 DataRowAction[] dra = new DataRowAction[] {
2472 DataRowAction.ChangeCurrentAndOriginal,
2473 DataRowAction.ChangeOriginal,
2474 DataRowAction.ChangeOriginal,
2475 DataRowAction.ChangeOriginal,
2476 DataRowAction.ChangeCurrentAndOriginal};
2477 rowActionInit (dra);
2480 // asserting Unchanged Row0
2481 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1,DataRowVersion.Current], "RowData0-C");
2482 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1,DataRowVersion.Original], "RowData0-O");
2483 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[0].RowState, "RowState0");
2484 // asserting Modified Row1
2485 Assert.AreEqual ("Modify 2", dtLoad.Rows[1][1, DataRowVersion.Current], "RowData1-C");
2486 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1, DataRowVersion.Original], "RowData1-O");
2487 Assert.AreEqual (DataRowState.Modified, dtLoad.Rows[1].RowState, "RowState1");
2488 // asserting Deleted Row2
2489 Assert.AreEqual ("mono 3", dtLoad.Rows[2][1, DataRowVersion.Original], "RowData1-O");
2490 Assert.AreEqual (DataRowState.Deleted, dtLoad.Rows[2].RowState, "RowState2");
2491 // asserting Added Row3
2492 Assert.AreEqual ("Add 4", dtLoad.Rows[3][1, DataRowVersion.Current], "RowData3-C");
2493 Assert.AreEqual ("mono 4", dtLoad.Rows[3][1, DataRowVersion.Original], "RowData3-O");
2494 Assert.AreEqual (DataRowState.Modified, dtLoad.Rows[3].RowState, "RowState3");
2495 // asserting Unpresent Row4
2496 Assert.AreEqual ("mono 5", dtLoad.Rows[4][1, DataRowVersion.Current], "RowData4-C");
2497 Assert.AreEqual ("mono 5", dtLoad.Rows[4][1, DataRowVersion.Original], "RowData4-O");
2498 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[4].RowState, "RowState4");
2502 public void Load_RowStateChangesDefaultDelete ()
2505 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2506 dtLoad.Columns.Add ("id", typeof (int));
2507 dtLoad.Columns.Add ("name", typeof (string));
2508 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2509 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2510 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2511 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2512 dtLoad.AcceptChanges ();
2513 dtLoad.Rows[2].Delete ();
2514 DataTableReader dtr = dt.CreateDataReader ();
2518 Assert.AreEqual (" ", dtLoad.Rows[2][1, DataRowVersion.Current], "RowData2-C");
2520 } catch (VersionNotFoundException) {
2525 public void Load_RowStatePreserveChanges ()
2528 dt.Rows.Add (new object[] { 4, "mono 4" });
2529 dt.Rows.Add (new object[] { 5, "mono 5" });
2530 dt.AcceptChanges ();
2531 DataTableReader dtr = dt.CreateDataReader ();
2532 DataTable dtLoad = setupRowState ();
2533 DataRowAction[] dra = new DataRowAction[] {
2534 DataRowAction.ChangeCurrentAndOriginal,
2535 DataRowAction.ChangeOriginal,
2536 DataRowAction.ChangeOriginal,
2537 DataRowAction.ChangeOriginal,
2538 DataRowAction.ChangeCurrentAndOriginal};
2539 rowActionInit (dra);
2540 dtLoad.Load (dtr, LoadOption.PreserveChanges);
2542 // asserting Unchanged Row0
2543 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1, DataRowVersion.Current], "RowData0-C");
2544 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1, DataRowVersion.Original], "RowData0-O");
2545 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[0].RowState, "RowState0");
2546 // asserting Modified Row1
2547 Assert.AreEqual ("Modify 2", dtLoad.Rows[1][1, DataRowVersion.Current], "RowData1-C");
2548 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1, DataRowVersion.Original], "RowData1-O");
2549 Assert.AreEqual (DataRowState.Modified, dtLoad.Rows[1].RowState, "RowState1");
2550 // asserting Deleted Row2
2551 Assert.AreEqual ("mono 3", dtLoad.Rows[2][1, DataRowVersion.Original], "RowData1-O");
2552 Assert.AreEqual (DataRowState.Deleted, dtLoad.Rows[2].RowState, "RowState2");
2553 // asserting Added Row3
2554 Assert.AreEqual ("Add 4", dtLoad.Rows[3][1, DataRowVersion.Current], "RowData3-C");
2555 Assert.AreEqual ("mono 4", dtLoad.Rows[3][1, DataRowVersion.Original], "RowData3-O");
2556 Assert.AreEqual (DataRowState.Modified, dtLoad.Rows[3].RowState, "RowState3");
2557 // asserting Unpresent Row4
2558 Assert.AreEqual ("mono 5", dtLoad.Rows[4][1, DataRowVersion.Current], "RowData4-C");
2559 Assert.AreEqual ("mono 5", dtLoad.Rows[4][1, DataRowVersion.Original], "RowData4-O");
2560 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[4].RowState, "RowState4");
2564 public void Load_RowStatePreserveChangesDelete () {
2566 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2567 dtLoad.Columns.Add ("id", typeof (int));
2568 dtLoad.Columns.Add ("name", typeof (string));
2569 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2570 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2571 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2572 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2573 dtLoad.AcceptChanges ();
2574 dtLoad.Rows[2].Delete ();
2575 DataTableReader dtr = dt.CreateDataReader ();
2576 dtLoad.Load (dtr,LoadOption.PreserveChanges);
2579 Assert.AreEqual (" ", dtLoad.Rows[2][1, DataRowVersion.Current], "RowData2-C");
2581 } catch (VersionNotFoundException) {
2586 public void Load_RowStateOverwriteChanges ()
2589 dt.Rows.Add (new object[] { 4, "mono 4" });
2590 dt.Rows.Add (new object[] { 5, "mono 5" });
2591 dt.AcceptChanges ();
2592 DataTableReader dtr = dt.CreateDataReader ();
2593 DataTable dtLoad = setupRowState ();
2594 DataRowAction[] dra = new DataRowAction[] {
2595 DataRowAction.ChangeCurrentAndOriginal,
2596 DataRowAction.ChangeCurrentAndOriginal,
2597 DataRowAction.ChangeCurrentAndOriginal,
2598 DataRowAction.ChangeCurrentAndOriginal,
2599 DataRowAction.ChangeCurrentAndOriginal};
2600 rowActionInit (dra);
2601 dtLoad.Load (dtr, LoadOption.OverwriteChanges);
2603 // asserting Unchanged Row0
2604 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1, DataRowVersion.Current], "RowData0-C");
2605 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1, DataRowVersion.Original], "RowData0-O");
2606 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[0].RowState, "RowState0");
2607 // asserting Modified Row1
2608 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1, DataRowVersion.Current], "RowData1-C");
2609 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1, DataRowVersion.Original], "RowData1-O");
2610 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[1].RowState, "RowState1");
2611 // asserting Deleted Row2
2612 Assert.AreEqual ("mono 3", dtLoad.Rows[2][1, DataRowVersion.Current], "RowData1-C");
2613 Assert.AreEqual ("mono 3", dtLoad.Rows[2][1, DataRowVersion.Original], "RowData1-O");
2614 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[2].RowState, "RowState2");
2615 // asserting Added Row3
2616 Assert.AreEqual ("mono 4", dtLoad.Rows[3][1, DataRowVersion.Current], "RowData3-C");
2617 Assert.AreEqual ("mono 4", dtLoad.Rows[3][1, DataRowVersion.Original], "RowData3-O");
2618 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[3].RowState, "RowState3");
2619 // asserting Unpresent Row4
2620 Assert.AreEqual ("mono 5", dtLoad.Rows[4][1, DataRowVersion.Current], "RowData4-C");
2621 Assert.AreEqual ("mono 5", dtLoad.Rows[4][1, DataRowVersion.Original], "RowData4-O");
2622 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[4].RowState, "RowState4");
2626 public void Load_RowStateUpsert ()
2629 dt.Rows.Add (new object[] { 4, "mono 4" });
2630 dt.Rows.Add (new object[] { 5, "mono 5" });
2631 dt.AcceptChanges ();
2632 DataTableReader dtr = dt.CreateDataReader ();
2633 DataTable dtLoad = setupRowState ();
2634 // Notice rowChange-Actions only occur 5 times, as number
2635 // of actual rows, ignoring row duplication of the deleted row.
2636 DataRowAction[] dra = new DataRowAction[] {
2637 DataRowAction.Change,
2638 DataRowAction.Change,
2640 DataRowAction.Change,
2642 rowActionInit (dra);
2643 dtLoad.Load (dtr, LoadOption.Upsert);
2645 // asserting Unchanged Row0
2646 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1, DataRowVersion.Current], "RowData0-C");
2647 Assert.AreEqual ("RowState 1", dtLoad.Rows[0][1, DataRowVersion.Original], "RowData0-O");
2648 Assert.AreEqual (DataRowState.Modified, dtLoad.Rows[0].RowState, "RowState0");
2649 // asserting Modified Row1
2650 Assert.AreEqual ("mono 2", dtLoad.Rows[1][1, DataRowVersion.Current], "RowData1-C");
2651 Assert.AreEqual ("RowState 2", dtLoad.Rows[1][1, DataRowVersion.Original], "RowData1-O");
2652 Assert.AreEqual (DataRowState.Modified, dtLoad.Rows[1].RowState, "RowState1");
2653 // asserting Deleted Row2 and "Deleted-Added" Row4
2654 Assert.AreEqual ("RowState 3", dtLoad.Rows[2][1, DataRowVersion.Original], "RowData2-O");
2655 Assert.AreEqual (DataRowState.Deleted, dtLoad.Rows[2].RowState, "RowState2");
2656 Assert.AreEqual ("mono 3", dtLoad.Rows[4][1, DataRowVersion.Current], "RowData4-C");
2657 Assert.AreEqual (DataRowState.Added, dtLoad.Rows[4].RowState, "RowState4");
2658 // asserting Added Row3
2659 Assert.AreEqual ("mono 4", dtLoad.Rows[3][1, DataRowVersion.Current], "RowData3-C");
2660 Assert.AreEqual (DataRowState.Added, dtLoad.Rows[3].RowState, "RowState3");
2661 // asserting Unpresent Row5
2662 // Notice row4 is used for added row of deleted row2 and so
2663 // unpresent row4 moves to row5
2664 Assert.AreEqual ("mono 5", dtLoad.Rows[5][1, DataRowVersion.Current], "RowData5-C");
2665 Assert.AreEqual (DataRowState.Added, dtLoad.Rows[5].RowState, "RowState5");
2669 public void Load_RowStateUpsertDuplicateKey1 ()
2672 dt.Rows.Add (new object[] { 4, "mono 4" });
2673 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2674 dtLoad.Columns.Add ("id", typeof (int));
2675 dtLoad.Columns.Add ("name", typeof (string));
2676 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2677 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2678 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2679 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2680 dtLoad.AcceptChanges ();
2681 dtLoad.Rows[2].Delete ();
2682 DataTableReader dtr = dt.CreateDataReader ();
2683 dtLoad.Load (dtr, LoadOption.Upsert);
2684 dtLoad.Rows[3][1] = "NEWVAL";
2685 Assert.AreEqual (DataRowState.Deleted, dtLoad.Rows[2].RowState, "A-RowState2");
2686 Assert.AreEqual (3, dtLoad.Rows[2][0, DataRowVersion.Original], "A-RowData2-id");
2687 Assert.AreEqual ("RowState 3", dtLoad.Rows[2][1, DataRowVersion.Original], "A-RowData2-name");
2688 Assert.AreEqual (DataRowState.Added, dtLoad.Rows[3].RowState, "A-RowState3");
2689 Assert.AreEqual (3, dtLoad.Rows[3][0, DataRowVersion.Current], "A-RowData3-id");
2690 Assert.AreEqual ("NEWVAL", dtLoad.Rows[3][1, DataRowVersion.Current], "A-RowData3-name");
2691 Assert.AreEqual (DataRowState.Added, dtLoad.Rows[4].RowState, "A-RowState4");
2692 Assert.AreEqual (4, dtLoad.Rows[4][0, DataRowVersion.Current], "A-RowData4-id");
2693 Assert.AreEqual ("mono 4", dtLoad.Rows[4][1, DataRowVersion.Current], "A-RowData4-name");
2695 dtLoad.AcceptChanges ();
2697 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[2].RowState, "B-RowState2");
2698 Assert.AreEqual (3, dtLoad.Rows[2][0, DataRowVersion.Current], "B-RowData2-id");
2699 Assert.AreEqual ("NEWVAL", dtLoad.Rows[2][1, DataRowVersion.Current], "B-RowData2-name");
2700 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[3].RowState, "B-RowState3");
2701 Assert.AreEqual (4, dtLoad.Rows[3][0, DataRowVersion.Current], "B-RowData3-id");
2702 Assert.AreEqual ("mono 4", dtLoad.Rows[3][1, DataRowVersion.Current], "B-RowData3-name");
2706 public void Load_RowStateUpsertDuplicateKey2 ()
2709 dt.Rows.Add (new object[] { 4, "mono 4" });
2710 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2711 dtLoad.Columns.Add ("id", typeof (int));
2712 dtLoad.Columns.Add ("name", typeof (string));
2713 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2714 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2715 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2716 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2717 dtLoad.AcceptChanges ();
2718 dtLoad.Rows[2].Delete ();
2719 DataTableReader dtr = dt.CreateDataReader ();
2720 dtLoad.Load (dtr, LoadOption.Upsert);
2721 dtLoad.AcceptChanges ();
2724 Assert.AreEqual (" ", dtLoad.Rows[4][1], "RowData4");
2726 } catch (IndexOutOfRangeException) {
2731 public void Load_RowStateUpsertDelete1 ()
2734 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2735 dtLoad.Columns.Add ("id", typeof (int));
2736 dtLoad.Columns.Add ("name", typeof (string));
2737 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2738 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2739 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2740 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2741 dtLoad.AcceptChanges ();
2742 dtLoad.Rows[2].Delete ();
2743 DataTableReader dtr = dt.CreateDataReader ();
2744 dtLoad.Load (dtr, LoadOption.Upsert);
2747 Assert.AreEqual (" ", dtLoad.Rows[2][1, DataRowVersion.Current], "RowData2-C");
2749 } catch (VersionNotFoundException) {
2754 public void Load_RowStateUpsertDelete2 ()
2757 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2758 dtLoad.Columns.Add ("id", typeof (int));
2759 dtLoad.Columns.Add ("name", typeof (string));
2760 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2761 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2762 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2763 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2764 dtLoad.AcceptChanges ();
2765 dtLoad.Rows[2].Delete ();
2766 DataTableReader dtr = dt.CreateDataReader ();
2767 dtLoad.Load (dtr, LoadOption.Upsert);
2770 Assert.AreEqual (" ", dtLoad.Rows[3][1, DataRowVersion.Original], "RowData3-O");
2772 } catch (VersionNotFoundException) {
2777 public void Load_RowStateUpsertAdd ()
2780 dt.Rows.Add (new object[] { 4, "mono 4" });
2781 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2782 dtLoad.Columns.Add ("id", typeof (int));
2783 dtLoad.Columns.Add ("name", typeof (string));
2784 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2785 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2786 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2787 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2788 dtLoad.AcceptChanges ();
2789 DataRow row = dtLoad.NewRow ();
2791 row["name"] = "Add 4";
2792 dtLoad.Rows.Add (row);
2793 DataTableReader dtr = dt.CreateDataReader ();
2794 dtLoad.Load (dtr, LoadOption.Upsert);
2797 Assert.AreEqual (" ", dtLoad.Rows[3][1, DataRowVersion.Original], "RowData3-O");
2799 } catch (VersionNotFoundException) {
2804 public void Load_RowStateUpsertUnpresent () {
2806 dt.Rows.Add (new object[] { 4, "mono 4" });
2807 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2808 dtLoad.Columns.Add ("id", typeof (int));
2809 dtLoad.Columns.Add ("name", typeof (string));
2810 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2811 dtLoad.Rows.Add (new object[] { 1, "RowState 1" });
2812 dtLoad.Rows.Add (new object[] { 2, "RowState 2" });
2813 dtLoad.Rows.Add (new object[] { 3, "RowState 3" });
2814 dtLoad.AcceptChanges ();
2815 DataTableReader dtr = dt.CreateDataReader ();
2816 dtLoad.Load (dtr, LoadOption.Upsert);
2819 Assert.AreEqual (" ", dtLoad.Rows[3][1, DataRowVersion.Original], "RowData3-O");
2821 } catch (VersionNotFoundException) {
2826 public void Load_RowStateUpsertUnchangedEqualVal ()
2829 DataTable dtLoad = new DataTable ("LoadRowStateChanges");
2830 dtLoad.Columns.Add ("id", typeof (int));
2831 dtLoad.Columns.Add ("name", typeof (string));
2832 dtLoad.PrimaryKey = new DataColumn[] { dtLoad.Columns["id"] };
2833 dtLoad.Rows.Add (new object[] { 1, "mono 1" });
2834 dtLoad.AcceptChanges ();
2835 DataTableReader dtr = dt.CreateDataReader ();
2836 DataRowAction[] dra = new DataRowAction[] {
2837 DataRowAction.Nothing,// REAL action
2838 DataRowAction.Nothing,// dummy
2839 DataRowAction.Nothing,// dummy
2840 DataRowAction.Nothing,// dummy
2841 DataRowAction.Nothing};// dummy
2842 rowActionInit (dra);
2843 dtLoad.Load (dtr, LoadOption.Upsert);
2845 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1, DataRowVersion.Current], "RowData0-C");
2846 Assert.AreEqual ("mono 1", dtLoad.Rows[0][1, DataRowVersion.Original], "RowData0-O");
2847 Assert.AreEqual (DataRowState.Unchanged, dtLoad.Rows[0].RowState, "RowState0");
2851 public void LoadDataRow_LoadOptions ()
2853 // LoadDataRow is covered in detail (without LoadOptions) in DataTableTest2
2854 // LoadOption tests are covered in detail in DataTable.Load().
2855 // Therefore only minimal tests of LoadDataRow with LoadOptions are covered here.
2858 dt = CreateDataTableExample ();
2859 dt.PrimaryKey = new DataColumn[] { dt.Columns[0] }; //add ParentId as Primary Key
2860 dt.Columns["String1"].DefaultValue = "Default";
2862 dr = dt.Select ("ParentId=1")[0];
2864 //Update existing row with LoadOptions = OverwriteChanges
2865 dt.BeginLoadData ();
2866 dt.LoadDataRow (new object[] { 1, null, "Changed" },
2867 LoadOption.OverwriteChanges);
2870 // LoadDataRow(update1) - check column String2
2871 Assert.AreEqual ("Changed", dr["String2", DataRowVersion.Current], "DT72-C");
2872 Assert.AreEqual ("Changed", dr["String2", DataRowVersion.Original], "DT72-O");
2874 // LoadDataRow(update1) - check row state
2875 Assert.AreEqual (DataRowState.Unchanged, dr.RowState, "DT73-LO");
2877 //Add New row with LoadOptions = Upsert
2878 dt.BeginLoadData ();
2879 dt.LoadDataRow (new object[] { 99, null, "Changed" },
2883 // LoadDataRow(insert1) - check column String2
2884 dr = dt.Select ("ParentId=99")[0];
2885 Assert.AreEqual ("Changed", dr["String2", DataRowVersion.Current], "DT75-C");
2887 // LoadDataRow(insert1) - check row state
2888 Assert.AreEqual (DataRowState.Added, dr.RowState, "DT76-LO");
2891 public static DataTable CreateDataTableExample ()
2893 DataTable dtParent = new DataTable ("Parent");
2895 dtParent.Columns.Add ("ParentId", typeof (int));
2896 dtParent.Columns.Add ("String1", typeof (string));
2897 dtParent.Columns.Add ("String2", typeof (string));
2899 dtParent.Columns.Add ("ParentDateTime", typeof (DateTime));
2900 dtParent.Columns.Add ("ParentDouble", typeof (double));
2901 dtParent.Columns.Add ("ParentBool", typeof (bool));
2903 dtParent.Rows.Add (new object[] { 1, "1-String1", "1-String2", new DateTime (2005, 1, 1, 0, 0, 0, 0), 1.534, true });
2904 dtParent.Rows.Add (new object[] { 2, "2-String1", "2-String2", new DateTime (2004, 1, 1, 0, 0, 0, 1), -1.534, true });
2905 dtParent.Rows.Add (new object[] { 3, "3-String1", "3-String2", new DateTime (2003, 1, 1, 0, 0, 1, 0), double.MinValue * 10000, false });
2906 dtParent.Rows.Add (new object[] { 4, "4-String1", "4-String2", new DateTime (2002, 1, 1, 0, 1, 0, 0), double.MaxValue / 10000, true });
2907 dtParent.Rows.Add (new object[] { 5, "5-String1", "5-String2", new DateTime (2001, 1, 1, 1, 0, 0, 0), 0.755, true });
2908 dtParent.Rows.Add (new object[] { 6, "6-String1", "6-String2", new DateTime (2000, 1, 1, 0, 0, 0, 0), 0.001, false });
2909 dtParent.AcceptChanges ();
2913 #endregion // DataTable.Load Tests
2915 #region Read/Write XML Tests
2918 public void ReadXmlSchema ()
2920 DataTable Table = new DataTable ();
2921 Table.ReadXmlSchema ("Test/System.Data/own_schema1.xsd");
2923 Assert.AreEqual ("test_table", Table.TableName, "test#02");
2924 Assert.AreEqual ("", Table.Namespace, "test#03");
2925 Assert.AreEqual (2, Table.Columns.Count, "test#04");
2926 Assert.AreEqual (0, Table.Rows.Count, "test#05");
2927 Assert.IsFalse (Table.CaseSensitive, "test#06");
2928 Assert.AreEqual (1, Table.Constraints.Count, "test#07");
2929 Assert.AreEqual ("", Table.Prefix, "test#08");
2931 Constraint cons = Table.Constraints[0];
2932 Assert.AreEqual ("Constraint1", cons.ConstraintName.ToString (), "test#09");
2933 Assert.AreEqual ("Constraint1", cons.ToString (), "test#10");
2935 DataColumn column = Table.Columns[0];
2936 Assert.IsTrue (column.AllowDBNull, "test#11");
2937 Assert.IsFalse (column.AutoIncrement, "test#12");
2938 Assert.AreEqual (0L, column.AutoIncrementSeed, "test#13");
2939 Assert.AreEqual (1L, column.AutoIncrementStep, "test#14");
2940 Assert.AreEqual ("test", column.Caption, "test#15");
2941 Assert.AreEqual ("Element", column.ColumnMapping.ToString (), "test#16");
2942 Assert.AreEqual ("first", column.ColumnName, "test#17");
2943 Assert.AreEqual (typeof (string), column.DataType, "test#18");
2944 Assert.AreEqual ("test_default_value", column.DefaultValue.ToString (), "test#19");
2945 Assert.IsFalse (column.DesignMode, "test#20");
2946 Assert.AreEqual ("", column.Expression, "test#21");
2947 Assert.AreEqual (100, column.MaxLength, "test#22");
2948 Assert.AreEqual ("", column.Namespace, "test#23");
2949 Assert.AreEqual (0, column.Ordinal, "test#24");
2950 Assert.AreEqual ("", column.Prefix, "test#25");
2951 Assert.IsFalse (column.ReadOnly, "test#26");
2952 Assert.IsTrue (column.Unique, "test#27");
2954 DataColumn column2 = Table.Columns[1];
2955 Assert.IsTrue (column2.AllowDBNull, "test#28");
2956 Assert.IsFalse (column2.AutoIncrement, "test#29");
2957 Assert.AreEqual (0L, column2.AutoIncrementSeed, "test#30");
2958 Assert.AreEqual (1L, column2.AutoIncrementStep, "test#31");
2959 Assert.AreEqual ("second", column2.Caption, "test#32");
2960 Assert.AreEqual ("Element", column2.ColumnMapping.ToString (), "test#33");
2961 Assert.AreEqual ("second", column2.ColumnName, "test#34");
2962 Assert.AreEqual (typeof (SqlGuid), column2.DataType, "test#35");
2963 Assert.AreEqual (SqlGuid.Null, column2.DefaultValue, "test#36");
2964 Assert.AreEqual (typeof (SqlGuid), column2.DefaultValue.GetType (), "test#36-2");
2965 Assert.IsFalse (column2.DesignMode, "test#37");
2966 Assert.AreEqual ("", column2.Expression, "test#38");
2967 Assert.AreEqual (-1, column2.MaxLength, "test#39");
2968 Assert.AreEqual ("", column2.Namespace, "test#40");
2969 Assert.AreEqual (1, column2.Ordinal, "test#41");
2970 Assert.AreEqual ("", column2.Prefix, "test#42");
2971 Assert.IsFalse (column2.ReadOnly, "test#43");
2972 Assert.IsFalse (column2.Unique, "test#44");
2974 DataTable Table2 = new DataTable ();
2975 Table2.ReadXmlSchema ("Test/System.Data/own_schema2.xsd");
2977 Assert.AreEqual ("second_test_table", Table2.TableName, "test#45");
2978 Assert.AreEqual ("", Table2.Namespace, "test#46");
2979 Assert.AreEqual (1, Table2.Columns.Count, "test#47");
2980 Assert.AreEqual (0, Table2.Rows.Count, "test#48");
2981 Assert.IsFalse (Table2.CaseSensitive, "test#49");
2982 Assert.AreEqual (1, Table2.Constraints.Count, "test#50");
2983 Assert.AreEqual ("", Table2.Prefix, "test#51");
2985 DataColumn column3 = Table2.Columns[0];
2986 Assert.IsTrue (column3.AllowDBNull, "test#52");
2987 Assert.IsFalse (column3.AutoIncrement, "test#53");
2988 Assert.AreEqual (0L, column3.AutoIncrementSeed, "test#54");
2989 Assert.AreEqual (1L, column3.AutoIncrementStep, "test#55");
2990 Assert.AreEqual ("second_first", column3.Caption, "test#56");
2991 Assert.AreEqual ("Element", column3.ColumnMapping.ToString (), "test#57");
2992 Assert.AreEqual ("second_first", column3.ColumnName, "test#58");
2993 Assert.AreEqual (typeof (string), column3.DataType, "test#59");
2994 Assert.AreEqual ("default_value", column3.DefaultValue.ToString (), "test#60");
2995 Assert.IsFalse (column3.DesignMode, "test#61");
2996 Assert.AreEqual ("", column3.Expression, "test#62");
2997 Assert.AreEqual (100, column3.MaxLength, "test#63");
2998 Assert.AreEqual ("", column3.Namespace, "test#64");
2999 Assert.AreEqual (0, column3.Ordinal, "test#65");
3000 Assert.AreEqual ("", column3.Prefix, "test#66");
3001 Assert.IsFalse (column3.ReadOnly, "test#67");
3002 Assert.IsTrue (column3.Unique, "test#68");
3006 public void ReadXmlSchema_2 ()
3008 DataTable dt = new DataTable ();
3009 string xmlData = string.Empty;
3010 xmlData += "<?xml version=\"1.0\"?>";
3011 xmlData += "<xs:schema id=\"SiteConfiguration\" targetNamespace=\"http://tempuri.org/PortalCfg.xsd\" xmlns:mstns=\"http://tempuri.org/PortalCfg.xsd\" xmlns=\"http://tempuri.org/PortalCfg.xsd\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" attributeFormDefault=\"qualified\" elementFormDefault=\"qualified\">";
3012 xmlData += "<xs:element name=\"SiteConfiguration\" msdata:IsDataSet=\"true\" msdata:EnforceConstraints=\"False\">";
3013 xmlData += "<xs:complexType>";
3014 xmlData += "<xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">";
3015 xmlData += "<xs:element name=\"Tab\">";
3016 xmlData += "<xs:complexType>";
3017 xmlData += "<xs:sequence>";
3018 xmlData += "<xs:element name=\"Module\" minOccurs=\"0\" maxOccurs=\"unbounded\">";
3019 xmlData += "<xs:complexType>";
3020 xmlData += "<xs:attribute name=\"ModuleId\" form=\"unqualified\" type=\"xs:int\" />";
3021 xmlData += "</xs:complexType>";
3022 xmlData += "</xs:element>";
3023 xmlData += "</xs:sequence>";
3024 xmlData += "<xs:attribute name=\"TabId\" form=\"unqualified\" type=\"xs:int\" />";
3025 xmlData += "</xs:complexType>";
3026 xmlData += "</xs:element>";
3027 xmlData += "</xs:choice>";
3028 xmlData += "</xs:complexType>";
3029 xmlData += "<xs:key name=\"TabKey\" msdata:PrimaryKey=\"true\">";
3030 xmlData += "<xs:selector xpath=\".//mstns:Tab\" />";
3031 xmlData += "<xs:field xpath=\"@TabId\" />";
3032 xmlData += "</xs:key>";
3033 xmlData += "<xs:key name=\"ModuleKey\" msdata:PrimaryKey=\"true\">";
3034 xmlData += "<xs:selector xpath=\".//mstns:Module\" />";
3035 xmlData += "<xs:field xpath=\"@ModuleID\" />";
3036 xmlData += "</xs:key>";
3037 xmlData += "</xs:element>";
3038 xmlData += "</xs:schema>";
3039 dt.ReadXmlSchema (new StringReader (xmlData));
3043 public void ReadXmlSchema_ByStream ()
3045 DataSet ds1 = new DataSet ();
3046 ds1.Tables.Add (DataProvider.CreateParentDataTable ());
3047 ds1.Tables.Add (DataProvider.CreateChildDataTable ());
3049 MemoryStream ms1 = new MemoryStream ();
3050 MemoryStream ms2 = new MemoryStream ();
3051 //write xml schema only
3052 //ds1.WriteXmlSchema (ms);
3053 ds1.Tables[0].WriteXmlSchema (ms1);
3054 ds1.Tables[1].WriteXmlSchema (ms2);
3056 MemoryStream ms11 = new MemoryStream (ms1.GetBuffer ());
3057 MemoryStream ms22 = new MemoryStream (ms2.GetBuffer ());
3059 //DataSet ds2 = new DataSet ();
3060 DataTable dt1 = new DataTable ();
3061 DataTable dt2 = new DataTable ();
3063 //ds2.ReadXmlSchema (ms1);
3064 dt1.ReadXmlSchema (ms11);
3065 dt2.ReadXmlSchema (ms22);
3068 // ReadXmlSchema - Tables count
3069 //Assert.AreEqual (ds2.Tables.Count, ds1.Tables.Count, "DS269");
3071 // ReadXmlSchema - Tables 0 Col count
3072 Assert.AreEqual (ds1.Tables[0].Columns.Count, dt1.Columns.Count, "DS270");
3074 // ReadXmlSchema - Tables 1 Col count
3075 Assert.AreEqual (ds1.Tables[1].Columns.Count, dt2.Columns.Count, "DS271");
3077 //check some colummns types
3078 // ReadXmlSchema - Tables 0 Col type
3079 Assert.AreEqual (ds1.Tables[0].Columns[0].GetType (), dt1.Columns[0].GetType (), "DS272");
3081 // ReadXmlSchema - Tables 1 Col type
3082 Assert.AreEqual (ds1.Tables[1].Columns[3].GetType (), dt2.Columns[3].GetType (), "DS273");
3084 //check that no data exists
3085 // ReadXmlSchema - Table 1 row count
3086 Assert.AreEqual (0, dt1.Rows.Count, "DS274");
3088 // ReadXmlSchema - Table 2 row count
3089 Assert.AreEqual (0, dt2.Rows.Count, "DS275");
3093 public void ReadWriteXmlSchema_ByFileName ()
3095 string sTempFileName1 = Path.Combine (Path.GetTempPath (), "tmpDataSet_ReadWriteXml_43899-1.xml");
3096 string sTempFileName2 = Path.Combine (Path.GetTempPath (), "tmpDataSet_ReadWriteXml_43899-2.xml");
3098 DataSet ds1 = new DataSet ();
3099 ds1.Tables.Add (DataProvider.CreateParentDataTable ());
3100 ds1.Tables.Add (DataProvider.CreateChildDataTable ());
3102 ds1.Tables[0].WriteXmlSchema (sTempFileName1);
3103 ds1.Tables[1].WriteXmlSchema (sTempFileName2);
3105 DataTable dt1 = new DataTable ();
3106 DataTable dt2 = new DataTable ();
3108 dt1.ReadXmlSchema (sTempFileName1);
3109 dt2.ReadXmlSchema (sTempFileName2);
3111 Assert.AreEqual (ds1.Tables[0].Columns.Count, dt1.Columns.Count, "DS277");
3112 Assert.AreEqual (ds1.Tables[1].Columns.Count, dt2.Columns.Count, "DS278");
3113 Assert.AreEqual (ds1.Tables[0].Columns[0].GetType (), dt1.Columns[0].GetType (), "DS279");
3114 Assert.AreEqual (ds1.Tables[1].Columns[3].GetType (), dt2.Columns[3].GetType (), "DS280");
3115 Assert.AreEqual (0, dt1.Rows.Count, "DS281");
3116 Assert.AreEqual (0, dt2.Rows.Count, "DS282");
3118 File.Delete (sTempFileName1);
3119 File.Delete (sTempFileName2);
3123 public void ReadXmlSchema_ByTextReader ()
3125 DataSet ds1 = new DataSet ();
3126 ds1.Tables.Add (DataProvider.CreateParentDataTable ());
3127 ds1.Tables.Add (DataProvider.CreateChildDataTable ());
3129 StringWriter sw1 = new StringWriter ();
3130 StringWriter sw2 = new StringWriter ();
3131 //write xml file, schema only
3132 //ds1.WriteXmlSchema (sw);
3133 ds1.Tables[0].WriteXmlSchema (sw1);
3134 ds1.Tables[1].WriteXmlSchema (sw2);
3136 StringReader sr1 = new StringReader (sw1.GetStringBuilder ().ToString ());
3137 StringReader sr2 = new StringReader (sw2.GetStringBuilder ().ToString ());
3138 //copy both data and schema
3139 //DataSet ds2 = new DataSet ();
3140 DataTable dt1 = new DataTable ();
3141 DataTable dt2 = new DataTable ();
3143 //ds2.ReadXmlSchema (sr);
3144 dt1.ReadXmlSchema (sr1);
3145 dt2.ReadXmlSchema (sr2);
3148 // ReadXmlSchema - Tables count
3149 //Assert.AreEqual (ds2.Tables.Count, ds1.Tables.Count, "DS283");
3151 // ReadXmlSchema - Tables 0 Col count
3152 Assert.AreEqual (ds1.Tables[0].Columns.Count, dt1.Columns.Count, "DS284");
3154 // ReadXmlSchema - Tables 1 Col count
3155 Assert.AreEqual (ds1.Tables[1].Columns.Count, dt2.Columns.Count, "DS285");
3157 //check some colummns types
3158 // ReadXmlSchema - Tables 0 Col type
3159 Assert.AreEqual (ds1.Tables[0].Columns[0].GetType (), dt1.Columns[0].GetType (), "DS286");
3161 // ReadXmlSchema - Tables 1 Col type
3162 Assert.AreEqual (ds1.Tables[1].Columns[3].GetType (), dt2.Columns[3].GetType (), "DS287");
3164 //check that no data exists
3165 // ReadXmlSchema - Table 1 row count
3166 Assert.AreEqual (0, dt1.Rows.Count, "DS288");
3168 // ReadXmlSchema - Table 2 row count
3169 Assert.AreEqual (0, dt2.Rows.Count, "DS289");
3173 public void ReadXmlSchema_ByXmlReader ()
3175 DataSet ds1 = new DataSet ();
3176 ds1.Tables.Add (DataProvider.CreateParentDataTable ());
3177 ds1.Tables.Add (DataProvider.CreateChildDataTable ());
3179 StringWriter sw1 = new StringWriter ();
3180 XmlTextWriter xmlTW1 = new XmlTextWriter (sw1);
3181 StringWriter sw2 = new StringWriter ();
3182 XmlTextWriter xmlTW2 = new XmlTextWriter (sw2);
3184 //write xml file, schema only
3185 ds1.Tables[0].WriteXmlSchema (xmlTW1);
3187 ds1.Tables[1].WriteXmlSchema (xmlTW2);
3190 StringReader sr1 = new StringReader (sw1.ToString ());
3191 XmlTextReader xmlTR1 = new XmlTextReader (sr1);
3192 StringReader sr2 = new StringReader (sw2.ToString ());
3193 XmlTextReader xmlTR2 = new XmlTextReader (sr2);
3195 //copy both data and schema
3196 //DataSet ds2 = new DataSet ();
3197 DataTable dt1 = new DataTable ();
3198 DataTable dt2 = new DataTable ();
3200 //ds2.ReadXmlSchema (xmlTR);
3201 dt1.ReadXmlSchema (xmlTR1);
3202 dt2.ReadXmlSchema (xmlTR2);
3205 // ReadXmlSchema - Tables count
3206 //Assert.AreEqual (ds2.Tables.Count, ds1.Tables.Count, "DS290");
3208 // ReadXmlSchema - Tables 0 Col count
3209 Assert.AreEqual (ds1.Tables[0].Columns.Count, dt1.Columns.Count, "DS291");
3211 // ReadXmlSchema - Tables 1 Col count
3212 Assert.AreEqual (ds1.Tables[1].Columns.Count, dt2.Columns.Count, "DS292");
3214 //check some colummns types
3215 // ReadXmlSchema - Tables 0 Col type
3216 Assert.AreEqual (ds1.Tables[0].Columns[0].GetType (), dt1.Columns[0].GetType (), "DS293");
3218 // ReadXmlSchema - Tables 1 Col type
3219 Assert.AreEqual (ds1.Tables[1].Columns[3].GetType (), dt2.Columns[3].GetType (), "DS294");
3221 //check that no data exists
3222 // ReadXmlSchema - Table 1 row count
3223 Assert.AreEqual (0, dt1.Rows.Count, "DS295");
3225 // ReadXmlSchema - Table 2 row count
3226 Assert.AreEqual (0, dt2.Rows.Count, "DS296");
3230 public void WriteXmlSchema ()
3232 DataSet ds = new DataSet ();
3233 ds.ReadXml ("Test/System.Data/region.xml");
3234 TextWriter writer = new StringWriter ();
3235 ds.Tables[0].WriteXmlSchema (writer);
3237 string TextString = GetNormalizedSchema (writer.ToString ());
3238 //string TextString = writer.ToString ();
3241 string substring = TextString.Substring (0, TextString.IndexOf (EOL));
3242 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3243 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring, "test#01");
3245 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3246 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3247 Assert.AreEqual ("<xs:schema id=\"Root\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring, "test#02");
3249 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3250 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3251 // Looks like whoever added this test depended on English culture, which is wrong.
3252 Assert.AreEqual (" <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"en-US\" msdata:MainDataTable=\"Region\" name=\"Root\">", substring, "test#03");
3254 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3255 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3256 Assert.AreEqual (" <xs:complexType>", substring, "test#04");
3258 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3259 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3260 Assert.AreEqual (" <xs:choice maxOccurs=\"unbounded\" minOccurs=\"0\">", substring, "test#05");
3262 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3263 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3264 Assert.AreEqual (" <xs:element name=\"Region\">", substring, "test#06");
3266 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3267 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3268 Assert.AreEqual (" <xs:complexType>", substring, "test#07");
3270 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3271 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3272 Assert.AreEqual (" <xs:sequence>", substring, "test#08");
3274 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3275 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3276 Assert.AreEqual (" <xs:element minOccurs=\"0\" name=\"RegionID\" type=\"xs:string\" />", substring, "test#09");
3278 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3279 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3280 Assert.AreEqual (" <xs:element minOccurs=\"0\" name=\"RegionDescription\" type=\"xs:string\" />", substring, "test#10");
3282 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3283 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3284 Assert.AreEqual (" </xs:sequence>", substring, "test#11");
3286 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3287 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3288 Assert.AreEqual (" </xs:complexType>", substring, "test#12");
3290 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3291 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3292 Assert.AreEqual (" </xs:element>", substring, "test#13");
3294 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3295 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3296 Assert.AreEqual (" </xs:choice>", substring, "test#14");
3298 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3299 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3300 Assert.AreEqual (" </xs:complexType>", substring, "test#15");
3302 substring = TextString.Substring (0, TextString.IndexOf (EOL));
3303 TextString = TextString.Substring (TextString.IndexOf (EOL) + EOL.Length);
3304 Assert.AreEqual (" </xs:element>", substring, "test#16");
3306 Assert.AreEqual ("</xs:schema>", TextString, "test#17");
3310 public void WriteXmlSchema2 ()
3312 string xml = @"<myDataSet xmlns='NetFrameWork'><myTable><id>0</id><item>item 0</item></myTable><myTable><id>1</id><item>item 1</item></myTable><myTable><id>2</id><item>item 2</item></myTable><myTable><id>3</id><item>item 3</item></myTable><myTable><id>4</id><item>item 4</item></myTable><myTable><id>5</id><item>item 5</item></myTable><myTable><id>6</id><item>item 6</item></myTable><myTable><id>7</id><item>item 7</item></myTable><myTable><id>8</id><item>item 8</item></myTable><myTable><id>9</id><item>item 9</item></myTable></myDataSet>";
3313 string schema = @"<?xml version='1.0' encoding='utf-16'?>
3314 <xs:schema id='myDataSet' targetNamespace='NetFrameWork' xmlns:mstns='NetFrameWork' xmlns='NetFrameWork' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' attributeFormDefault='qualified' elementFormDefault='qualified'>
3315 <xs:element name='myDataSet' msdata:IsDataSet='true' msdata:MainDataTable='NetFrameWork_x003A_myTable' msdata:UseCurrentLocale='true'>
3317 <xs:choice minOccurs='0' maxOccurs='unbounded'>
3318 <xs:element name='myTable'>
3321 <xs:element name='id' msdata:AutoIncrement='true' type='xs:int' minOccurs='0' />
3322 <xs:element name='item' type='xs:string' minOccurs='0' />
3330 DataSet OriginalDataSet = new DataSet ("myDataSet");
3331 OriginalDataSet.Namespace = "NetFrameWork";
3332 DataTable myTable = new DataTable ("myTable");
3333 DataColumn c1 = new DataColumn ("id", typeof (int));
3334 c1.AutoIncrement = true;
3335 DataColumn c2 = new DataColumn ("item");
3336 myTable.Columns.Add (c1);
3337 myTable.Columns.Add (c2);
3338 OriginalDataSet.Tables.Add (myTable);
3341 for (int i = 0; i < 10; i++) {
3342 newRow = myTable.NewRow ();
3343 newRow["item"] = "item " + i;
3344 myTable.Rows.Add (newRow);
3346 OriginalDataSet.AcceptChanges ();
3348 StringWriter sw = new StringWriter ();
3349 XmlTextWriter xtw = new XmlTextWriter (sw);
3350 xtw.QuoteChar = '\'';
3351 OriginalDataSet.WriteXml (xtw);
3352 string result = sw.ToString ();
3354 Assert.AreEqual (xml, result);
3356 sw = new StringWriter ();
3357 xtw = new XmlTextWriter (sw);
3358 xtw.Formatting = Formatting.Indented;
3359 OriginalDataSet.Tables[0].WriteXmlSchema (xtw);
3360 result = sw.ToString ();
3362 result = result.Replace ("\r\n", "\n").Replace ('"', '\'');
3363 Assert.AreEqual (schema.Replace ("\r\n", "\n"), result);
3367 public void WriteXmlSchema3 ()
3369 string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
3370 <xs:schema id=""ExampleDataSet"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
3371 <xs:element name=""ExampleDataSet"" msdata:IsDataSet=""true"" msdata:MainDataTable=""ExampleDataTable"" msdata:UseCurrentLocale=""true"">
3373 <xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
3374 <xs:element name=""ExampleDataTable"">
3376 <xs:attribute name=""PrimaryKeyColumn"" type=""xs:int"" use=""required"" />
3381 <xs:unique name=""PK_ExampleDataTable"" msdata:PrimaryKey=""true"">
3382 <xs:selector xpath="".//ExampleDataTable"" />
3383 <xs:field xpath=""@PrimaryKeyColumn"" />
3387 DataSet ds = new DataSet ("ExampleDataSet");
3389 ds.Tables.Add (new DataTable ("ExampleDataTable"));
3390 ds.Tables["ExampleDataTable"].Columns.Add (
3391 new DataColumn ("PrimaryKeyColumn", typeof (int), "", MappingType.Attribute));
3392 ds.Tables["ExampleDataTable"].Columns["PrimaryKeyColumn"].AllowDBNull = false;
3394 ds.Tables["ExampleDataTable"].Constraints.Add (
3395 "PK_ExampleDataTable",
3396 ds.Tables["ExampleDataTable"].Columns["PrimaryKeyColumn"],
3399 ds.AcceptChanges ();
3400 StringWriter sw = new StringWriter ();
3401 ds.Tables[0].WriteXmlSchema (sw);
3403 string result = sw.ToString ();
3405 Assert.AreEqual (xmlschema.Replace ("\r\n", "\n"), result.Replace ("\r\n", "\n"));
3406 //Assert.AreEqual (xmlschema, result.Replace ("\r\n", "\n"));
3410 public void WriteXmlSchema4 ()
3412 string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
3413 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
3414 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:MainDataTable=""MyType"" msdata:UseCurrentLocale=""true"">
3416 <xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
3417 <xs:element name=""MyType"">
3419 <xs:attribute name=""ID"" type=""xs:int"" use=""required"" />
3420 <xs:attribute name=""Desc"" type=""xs:string"" />
3427 DataSet ds = new DataSet ("Example");
3429 // Add MyType DataTable
3430 DataTable dt = new DataTable ("MyType");
3433 dt.Columns.Add (new DataColumn ("ID", typeof (int), "",
3434 MappingType.Attribute));
3435 dt.Columns["ID"].AllowDBNull = false;
3437 dt.Columns.Add (new DataColumn ("Desc", typeof
3438 (string), "", MappingType.Attribute));
3440 ds.AcceptChanges ();
3442 StringWriter sw = new StringWriter ();
3443 ds.Tables[0].WriteXmlSchema (sw);
3445 string result = sw.ToString ();
3447 Assert.AreEqual (xmlschema.Replace ("\r\n", "\n"), result.Replace ("\r\n", "\n"));
3451 public void WriteXmlSchema5 ()
3453 string xmlschema1 = @"<?xml version=""1.0"" encoding=""utf-16""?>
3454 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
3455 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:MainDataTable=""StandAlone"" msdata:UseCurrentLocale=""true"">
3457 <xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
3458 <xs:element name=""StandAlone"">
3460 <xs:attribute name=""ID"" type=""xs:int"" use=""required"" />
3461 <xs:attribute name=""Desc"" type=""xs:string"" use=""required"" />
3468 string xmlschema2 = @"<?xml version=""1.0"" encoding=""utf-16""?>
3469 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
3470 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:MainDataTable=""Dimension"" msdata:UseCurrentLocale=""true"">
3472 <xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
3473 <xs:element name=""Dimension"">
3475 <xs:attribute name=""Number"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
3476 <xs:attribute name=""Title"" type=""xs:string"" use=""required"" />
3481 <xs:unique name=""PK_Dimension"" msdata:PrimaryKey=""true"">
3482 <xs:selector xpath="".//Dimension"" />
3483 <xs:field xpath=""@Number"" />
3487 string xmlschema3 = @"<?xml version=""1.0"" encoding=""utf-16""?>
3488 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
3489 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:MainDataTable=""Element"" msdata:UseCurrentLocale=""true"">
3491 <xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
3492 <xs:element name=""Element"">
3494 <xs:attribute name=""Dimension"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
3495 <xs:attribute name=""Number"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
3496 <xs:attribute name=""Title"" type=""xs:string"" use=""required"" />
3501 <xs:unique name=""PK_Element"" msdata:PrimaryKey=""true"">
3502 <xs:selector xpath="".//Element"" />
3503 <xs:field xpath=""@Dimension"" />
3504 <xs:field xpath=""@Number"" />
3508 DataSet ds = new DataSet ("Example");
3510 // Add a DataTable with no ReadOnly columns
3511 DataTable dt1 = new DataTable ("StandAlone");
3512 ds.Tables.Add (dt1);
3514 // Add a ReadOnly column
3515 dt1.Columns.Add (new DataColumn ("ID", typeof (int), "",
3516 MappingType.Attribute));
3517 dt1.Columns["ID"].AllowDBNull = false;
3519 dt1.Columns.Add (new DataColumn ("Desc", typeof
3520 (string), "", MappingType.Attribute));
3521 dt1.Columns["Desc"].AllowDBNull = false;
3523 // Add related DataTables with ReadOnly columns
3524 DataTable dt2 = new DataTable ("Dimension");
3525 ds.Tables.Add (dt2);
3526 dt2.Columns.Add (new DataColumn ("Number", typeof
3527 (int), "", MappingType.Attribute));
3528 dt2.Columns["Number"].AllowDBNull = false;
3529 dt2.Columns["Number"].ReadOnly = true;
3531 dt2.Columns.Add (new DataColumn ("Title", typeof
3532 (string), "", MappingType.Attribute));
3533 dt2.Columns["Title"].AllowDBNull = false;
3535 dt2.Constraints.Add ("PK_Dimension", dt2.Columns["Number"], true);
3537 DataTable dt3 = new DataTable ("Element");
3538 ds.Tables.Add (dt3);
3540 dt3.Columns.Add (new DataColumn ("Dimension", typeof
3541 (int), "", MappingType.Attribute));
3542 dt3.Columns["Dimension"].AllowDBNull = false;
3543 dt3.Columns["Dimension"].ReadOnly = true;
3545 dt3.Columns.Add (new DataColumn ("Number", typeof
3546 (int), "", MappingType.Attribute));
3547 dt3.Columns["Number"].AllowDBNull = false;
3548 dt3.Columns["Number"].ReadOnly = true;
3550 dt3.Columns.Add (new DataColumn ("Title", typeof
3551 (string), "", MappingType.Attribute));
3552 dt3.Columns["Title"].AllowDBNull = false;
3554 dt3.Constraints.Add ("PK_Element", new DataColumn[] {
3555 dt3.Columns ["Dimension"],
3556 dt3.Columns ["Number"] }, true);
3558 ds.AcceptChanges ();
3560 StringWriter sw1 = new StringWriter ();
3561 ds.Tables[0].WriteXmlSchema (sw1);
3562 string result1 = sw1.ToString ();
3563 Assert.AreEqual (xmlschema1.Replace ("\r\n", "\n"), result1.Replace ("\r\n", "\n"));
3565 StringWriter sw2 = new StringWriter ();
3566 ds.Tables[1].WriteXmlSchema (sw2);
3567 string result2 = sw2.ToString ();
3568 Assert.AreEqual (xmlschema2.Replace ("\r\n", "\n"), result2.Replace ("\r\n", "\n"));
3570 StringWriter sw3 = new StringWriter ();
3571 ds.Tables[2].WriteXmlSchema (sw3);
3572 string result3 = sw3.ToString ();
3573 Assert.AreEqual (xmlschema3.Replace ("\r\n", "\n"), result3.Replace ("\r\n", "\n"));
3577 public void WriteXmlSchema6 ()
3579 string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
3580 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
3581 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:MainDataTable=""MyType"" msdata:UseCurrentLocale=""true"">
3583 <xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
3584 <xs:element name=""MyType"">
3586 <xs:attribute name=""Desc"">
3588 <xs:restriction base=""xs:string"">
3589 <xs:maxLength value=""32"" />
3599 DataSet ds = new DataSet ("Example");
3601 // Add MyType DataTable
3602 ds.Tables.Add ("MyType");
3604 ds.Tables["MyType"].Columns.Add (new DataColumn (
3605 "Desc", typeof (string), "", MappingType.Attribute));
3606 ds.Tables["MyType"].Columns["Desc"].MaxLength = 32;
3608 ds.AcceptChanges ();
3610 StringWriter sw = new StringWriter ();
3611 ds.Tables[0].WriteXmlSchema (sw);
3613 string result = sw.ToString ();
3615 Assert.AreEqual (xmlschema.Replace ("\r\n", "\n"), result.Replace ("\r\n", "\n"));
3619 public void WriteXmlSchema7 ()
3621 DataSet ds = new DataSet ();
3622 DataTable dt = new DataTable ("table");
3623 dt.Columns.Add ("col1");
3624 dt.Columns.Add ("col2");
3626 dt.Rows.Add (new object[] { "foo", "bar" });
3627 StringWriter sw = new StringWriter ();
3628 ds.Tables[0].WriteXmlSchema (sw);
3629 Assert.IsTrue (sw.ToString ().IndexOf ("xmlns=\"\"") > 0);
3633 public void WriteXmlSchema_ConstraintNameWithSpaces ()
3635 DataSet ds = new DataSet ();
3636 DataTable table1 = ds.Tables.Add ("table1");
3637 DataTable table2 = ds.Tables.Add ("table2");
3639 table1.Columns.Add ("col1", typeof (int));
3640 table2.Columns.Add ("col1", typeof (int));
3642 table1.Constraints.Add ("uc 1", table1.Columns[0], false);
3643 table2.Constraints.Add ("fc 1", table1.Columns[0], table2.Columns[0]);
3645 StringWriter sw1 = new StringWriter ();
3646 StringWriter sw2 = new StringWriter ();
3648 //should not throw an exception
3649 ds.Tables[0].WriteXmlSchema (sw1);
3650 ds.Tables[1].WriteXmlSchema (sw2);
3654 public void WriteXmlSchema_ForignKeyConstraint ()
3656 DataSet ds1 = new DataSet ();
3658 DataTable table1 = ds1.Tables.Add ();
3659 DataTable table2 = ds1.Tables.Add ();
3661 DataColumn col1_1 = table1.Columns.Add ("col1", typeof (int));
3662 DataColumn col2_1 = table2.Columns.Add ("col1", typeof (int));
3664 table2.Constraints.Add ("fk", col1_1, col2_1);
3666 StringWriter sw1 = new StringWriter ();
3667 ds1.Tables[0].WriteXmlSchema (sw1);
3668 String xml1 = sw1.ToString ();
3669 Assert.IsTrue (xml1.IndexOf (@"<xs:unique name=""Constraint1"">") != -1, "#1");
3671 StringWriter sw2 = new StringWriter ();
3672 ds1.Tables[1].WriteXmlSchema (sw2);
3673 String xml2 = sw2.ToString ();
3674 Assert.IsTrue (xml2.IndexOf (@"<xs:unique name=""Constraint1"">") == -1, "#2");
3678 public void WriteXmlSchema_Relations_ForeignKeys ()
3680 MemoryStream ms1 = null;
3681 MemoryStream ms2 = null;
3682 MemoryStream msA = null;
3683 MemoryStream msB = null;
3685 DataSet ds1 = new DataSet ();
3687 DataTable table1 = ds1.Tables.Add ("Table 1");
3688 DataTable table2 = ds1.Tables.Add ("Table 2");
3690 DataColumn col1_1 = table1.Columns.Add ("col 1", typeof (int));
3691 DataColumn col1_2 = table1.Columns.Add ("col 2", typeof (int));
3692 DataColumn col1_3 = table1.Columns.Add ("col 3", typeof (int));
3693 DataColumn col1_4 = table1.Columns.Add ("col 4", typeof (int));
3694 DataColumn col1_5 = table1.Columns.Add ("col 5", typeof (int));
3695 DataColumn col1_6 = table1.Columns.Add ("col 6", typeof (int));
3696 DataColumn col1_7 = table1.Columns.Add ("col 7", typeof (int));
3698 DataColumn col2_1 = table2.Columns.Add ("col 1", typeof (int));
3699 DataColumn col2_2 = table2.Columns.Add ("col 2", typeof (int));
3700 DataColumn col2_3 = table2.Columns.Add ("col 3", typeof (int));
3701 DataColumn col2_4 = table2.Columns.Add ("col 4", typeof (int));
3702 DataColumn col2_5 = table2.Columns.Add ("col 5", typeof (int));
3703 DataColumn col2_6 = table2.Columns.Add ("col 6", typeof (int));
3704 DataColumn col2_7 = table2.Columns.Add ("col 7", typeof (int));
3706 ds1.Relations.Add ("rel 1",
3707 new DataColumn[] { col1_1, col1_2 },
3708 new DataColumn[] { col2_1, col2_2 },
3710 ds1.Relations.Add ("rel 2",
3711 new DataColumn[] { col1_3, col1_4 },
3712 new DataColumn[] { col2_3, col2_4 },
3714 table2.Constraints.Add ("fk 1",
3715 new DataColumn[] { col1_5, col1_6 },
3716 new DataColumn[] { col2_5, col2_6 });
3717 table1.Constraints.Add ("fk 2",
3718 new DataColumn[] { col2_5, col2_6 },
3719 new DataColumn[] { col1_5, col1_6 });
3721 table1.Constraints.Add ("pk 1", col1_7, true);
3722 table2.Constraints.Add ("pk 2", col2_7, true);
3724 ms1 = new MemoryStream ();
3725 ds1.Tables[0].WriteXmlSchema (ms1);
3726 ms2 = new MemoryStream ();
3727 ds1.Tables[1].WriteXmlSchema (ms2);
3729 msA = new MemoryStream (ms1.GetBuffer ());
3730 DataTable dtA = new DataTable ();
3731 dtA.ReadXmlSchema (msA);
3733 msB = new MemoryStream (ms2.GetBuffer ());
3734 DataTable dtB = new DataTable ();
3735 dtB.ReadXmlSchema (msB);
3737 Assert.AreEqual (3, dtA.Constraints.Count, "#2");
3738 Assert.AreEqual (2, dtB.Constraints.Count, "#3");
3740 Assert.IsTrue (dtA.Constraints.Contains ("pk 1"), "#5");
3741 Assert.IsTrue (dtA.Constraints.Contains ("Constraint1"), "#6");
3742 Assert.IsTrue (dtA.Constraints.Contains ("Constraint2"), "#7");
3743 Assert.IsTrue (dtB.Constraints.Contains ("pk 2"), "#9");
3744 Assert.IsTrue (dtB.Constraints.Contains ("Constraint1"), "#10");
3748 [Category ("NotWorking")]
3749 public void WriteXmlSchema_DifferentNamespace ()
3751 string schema = @"<xs:schema id='NewDataSet' targetNamespace='urn:bar' xmlns:mstns='urn:bar' xmlns='urn:bar' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' attributeFormDefault='qualified' elementFormDefault='qualified' xmlns:app1='urn:baz' xmlns:app2='urn:foo' msdata:schemafragmentcount='3'>
3752 <xs:import namespace='urn:foo' />
3753 <xs:import namespace='urn:baz' />
3754 <xs:element name='NewDataSet' msdata:IsDataSet='true' msdata:MainDataTable='urn_x003A_foo_x003A_NS1Table' msdata:UseCurrentLocale='true'>
3756 <xs:choice minOccurs='0' maxOccurs='unbounded'>
3757 <xs:element ref='app2:NS1Table' />
3762 <xs:schema targetNamespace='urn:baz' xmlns:mstns='urn:bar' xmlns='urn:baz' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' attributeFormDefault='qualified' elementFormDefault='qualified' xmlns:app1='urn:baz' xmlns:app2='urn:foo'>
3763 <xs:import namespace='urn:foo' />
3764 <xs:import namespace='urn:bar' />
3765 <xs:element name='column2' type='xs:string' />
3767 <xs:schema targetNamespace='urn:foo' xmlns:mstns='urn:bar' xmlns='urn:foo' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' attributeFormDefault='qualified' elementFormDefault='qualified' xmlns:app2='urn:foo' xmlns:app1='urn:baz'>
3768 <xs:import namespace='urn:bar' />
3769 <xs:import namespace='urn:baz' />
3770 <xs:element name='NS1Table'>
3773 <xs:element name='column1' type='xs:string' minOccurs='0' />
3774 <xs:element ref='app1:column2' minOccurs='0' />
3779 DataSet ds = new DataSet ();
3780 DataTable dt = new DataTable ();
3781 dt.TableName = "NS1Table";
3782 dt.Namespace = "urn:foo";
3783 dt.Columns.Add ("column1");
3784 dt.Columns.Add ("column2");
3785 dt.Columns[1].Namespace = "urn:baz";
3787 DataTable dt2 = new DataTable ();
3788 dt2.TableName = "NS2Table";
3789 dt2.Namespace = "urn:bar";
3790 ds.Tables.Add (dt2);
3791 ds.Namespace = "urn:bar";
3793 StringWriter sw1 = new StringWriter ();
3794 XmlTextWriter xw1 = new XmlTextWriter (sw1);
3795 xw1.Formatting = Formatting.Indented;
3796 xw1.QuoteChar = '\'';
3797 ds.Tables[0].WriteXmlSchema (xw1);
3798 string result1 = sw1.ToString ();
3799 Assert.AreEqual (schema, result1.Replace ("\r\n", "\n"), "#1");
3801 StringWriter sw2 = new StringWriter ();
3802 XmlTextWriter xw2 = new XmlTextWriter (sw2);
3803 xw2.Formatting = Formatting.Indented;
3804 xw2.QuoteChar = '\'';
3805 ds.Tables[0].WriteXmlSchema (xw2);
3806 string result2 = sw2.ToString ();
3807 Assert.AreEqual (schema, result2.Replace ("\r\n", "\n"), "#2");
3811 public void WriteXmlSchema_Hierarchy ()
3813 DataSet ds = new DataSet ();
3814 DataTable table1 = new DataTable ();
3815 DataColumn idColumn = table1.Columns.Add ("ID", typeof (Int32));
3816 table1.Columns.Add ("Name", typeof (String));
3817 table1.PrimaryKey = new DataColumn[] { idColumn };
3818 DataTable table2 = new DataTable ();
3819 table2.Columns.Add (new DataColumn ("OrderID", typeof (Int32)));
3820 table2.Columns.Add (new DataColumn ("CustomerID", typeof (Int32)));
3821 table2.Columns.Add (new DataColumn ("OrderDate", typeof (DateTime)));
3822 table2.PrimaryKey = new DataColumn[] { table2.Columns[0] };
3823 ds.Tables.Add (table1);
3824 ds.Tables.Add (table2);
3825 ds.Relations.Add ("CustomerOrder",
3826 new DataColumn[] { table1.Columns[0] },
3827 new DataColumn[] { table2.Columns[1] }, true);
3829 StringWriter writer1 = new StringWriter ();
3830 table1.WriteXmlSchema (writer1, false);
3831 string expected1 = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"Table1\" msdata:UseCurrentLocale=\"true\">\n <xs:complexType>\n <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xs:element name=\"Table1\">\n <xs:complexType>\n <xs:sequence>\n <xs:element name=\"ID\" type=\"xs:int\" />\n <xs:element name=\"Name\" type=\"xs:string\" minOccurs=\"0\" />\n </xs:sequence>\n </xs:complexType>\n </xs:element>\n </xs:choice>\n </xs:complexType>\n <xs:unique name=\"Constraint1\" msdata:PrimaryKey=\"true\">\n <xs:selector xpath=\".//Table1\" />\n <xs:field xpath=\"ID\" />\n </xs:unique>\n </xs:element>\n</xs:schema>";
3832 Assert.AreEqual (expected1, writer1.ToString().Replace("\r\n", "\n"), "#1");
3834 StringWriter writer2 = new StringWriter ();
3835 table1.WriteXmlSchema (writer2, true);
3836 string expected2 = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"Table1\" msdata:UseCurrentLocale=\"true\">\n <xs:complexType>\n <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xs:element name=\"Table1\">\n <xs:complexType>\n <xs:sequence>\n <xs:element name=\"ID\" type=\"xs:int\" />\n <xs:element name=\"Name\" type=\"xs:string\" minOccurs=\"0\" />\n </xs:sequence>\n </xs:complexType>\n </xs:element>\n <xs:element name=\"Table2\">\n <xs:complexType>\n <xs:sequence>\n <xs:element name=\"OrderID\" type=\"xs:int\" />\n <xs:element name=\"CustomerID\" type=\"xs:int\" minOccurs=\"0\" />\n <xs:element name=\"OrderDate\" type=\"xs:dateTime\" minOccurs=\"0\" />\n </xs:sequence>\n </xs:complexType>\n </xs:element>\n </xs:choice>\n </xs:complexType>\n <xs:unique name=\"Constraint1\" msdata:PrimaryKey=\"true\">\n <xs:selector xpath=\".//Table1\" />\n <xs:field xpath=\"ID\" />\n </xs:unique>\n <xs:unique name=\"Table2_Constraint1\" msdata:ConstraintName=\"Constraint1\" msdata:PrimaryKey=\"true\">\n <xs:selector xpath=\".//Table2\" />\n <xs:field xpath=\"OrderID\" />\n </xs:unique>\n <xs:keyref name=\"CustomerOrder\" refer=\"Constraint1\">\n <xs:selector xpath=\".//Table2\" />\n <xs:field xpath=\"CustomerID\" />\n </xs:keyref>\n </xs:element>\n</xs:schema>";
3837 Assert.AreEqual (expected2, writer2.ToString ().Replace("\r\n", "\n"), "#2");
3841 [Ignore ("MS behavior is far from consistent to be regarded as a reference implementation.")]
3842 // See the same-named tests in DataSetTest.cs
3843 // WriteXmlSchema doesn't have overload wityh 2 parameters in System.Data
3844 // and is commented-out TWICE below
3845 public void ReadWriteXmlSchema()
3847 DataSet ds = new DataSet();
3848 ds.ReadXmlSchema("Test/System.Data/store.xsd");
3849 // check dataset properties before testing write
3850 AssertDataSet("ds", ds, "NewDataSet", 3, 2);
3851 AssertDataTable("tab1", ds.Tables[0], "bookstore", 1, 0, 0, 1, 1, 1);
3852 AssertDataTable("tab2", ds.Tables[1], "book", 5, 0, 1, 1, 2, 1);
3853 AssertDataTable("tab3", ds.Tables[2], "author", 3, 0, 1, 0, 1, 0);
3854 // FIXME: currently order is not compatible. Use name as index
3855 AssertDataRelation("rel1", ds.Relations["book_author"], "book_author", true, new string[] { "book_Id" }, new string[] { "book_Id" }, true, true);
3856 AssertDataRelation("rel2", ds.Relations["bookstore_book"], "bookstore_book", true, new string[] { "bookstore_Id" }, new string[] { "bookstore_Id" }, true, true);
3858 ds.ReadXml("Test/System.Data/region.xml", XmlReadMode.InferSchema);
3859 ds.Relations.Clear(); // because can not call WriteXmlSchema with nested relations.
3861 TextWriter writer1 = new StringWriter();
3862 ds.Tables[0].WriteXmlSchema(writer1);
3863 //string TextString1 = GetNormalizedSchema(writer1.ToString());
3864 string TextString1 = writer1.ToString();
3865 string expected1 = @"<?xml version=""1.0"" encoding=""utf-16""?>" +
3866 @"<xs:schema id=""Root"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">" +
3867 @"<xs:complexType name=""bookstoreType"">" +
3868 @"</xs:complexType>" +
3869 @"<xs:element name=""bookstore"" type=""bookstoreType"" />" +
3870 @"<xs:element name=""Root"" msdata:IsDataSet=""true"" msdata:MainDataTable=""bookstore"" msdata:Locale=""en-US"">" +
3871 @"<xs:complexType>" +
3872 @"<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">" +
3873 @"<xs:element ref=""bookstore"" />" +
3875 @"</xs:complexType>" +
3878 Assert.AreEqual(expected1.Replace("\n", ""), TextString1.Replace("\r\n", "").Replace(" ", "").Replace("\n", ""), "#1");
3880 TextWriter writer2 = new StringWriter();
3881 ds.Tables[1].WriteXmlSchema(writer2, false);
3882 //string TextString2 = GetNormalizedSchema(writer2.ToString());
3883 string TextString2 = writer2.ToString();
3884 string expected2 = @"<?xml version=""1.0"" encoding=""utf-16""?>" +
3885 @"<xs:schema id=""Root"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">" +
3886 @"<xs:complexType name=""bookType"">" +
3888 @"<xs:element name=""title"" type=""xs:string"" msdata:Ordinal=""1"" />" +
3889 @"<xs:element name=""price"" type=""xs:decimal"" msdata:Ordinal=""2"" />" +
3891 @"<xs:attribute name=""genre"" type=""xs:string"" />" +
3892 @"<xs:attribute name=""bookstore_Id"" type=""xs:int"" use=""prohibited"" />" +
3893 @"</xs:complexType>" +
3894 @"<xs:element name=""book"" type=""bookType"" />" +
3895 @"<xs:element name=""Root"" msdata:IsDataSet=""true"" msdata:MainDataTable=""book"" msdata:Locale=""en-US"">" +
3896 @"<xs:complexType>" +
3897 @"<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">" +
3898 @"<xs:element ref=""book"" />" +
3900 @"</xs:complexType>" +
3903 Assert.AreEqual(expected2, TextString2.Replace("\r\n", "").Replace(" ", ""), "#2");
3905 TextWriter writer3 = new StringWriter();
3906 ds.Tables[2].WriteXmlSchema(writer3);
3907 //string TextString3 = GetNormalizedSchema(writer3.ToString());
3908 string TextString3 = writer3.ToString();
3909 string expected3 = @"<?xml version=""1.0"" encoding=""utf-16""?>" +
3910 @"<xs:schema id=""Root"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">" +
3911 @"<xs:complexType name=""authorName"">" +
3913 @"<xs:element name=""first-name"" type=""xs:string"" msdata:Ordinal=""0"" />" +
3914 @"<xs:element name=""last-name"" type=""xs:string"" msdata:Ordinal=""1"" />" +
3916 @"<xs:attribute name=""book_Id"" type=""xs:int"" use=""prohibited"" />" +
3917 @"</xs:complexType>" +
3918 @"<xs:element name=""author"" type=""authorName"" />" +
3919 @"<xs:element name=""Root"" msdata:IsDataSet=""true"" msdata:MainDataTable=""author"" msdata:Locale=""en-US"">" +
3920 @"<xs:complexType>" +
3921 @"<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">" +
3922 @"<xs:element ref=""author"" />" +
3924 @"</xs:complexType>" +
3927 Assert.AreEqual(expected3, TextString3.Replace("\r\n", "").Replace(" ", ""), "#3");
3929 TextWriter writer4 = new StringWriter();
3930 ds.Tables[3].WriteXmlSchema(writer4);
3931 //string TextString4 = GetNormalizedSchema(writer4.ToString());
3932 string TextString4 = writer4.ToString();
3933 string expected4 = @"<?xml version=""1.0"" encoding=""utf-16""?>" +
3934 @"<xs:schema id=""Root"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">" +
3935 @"<xs:element name=""Root"" msdata:IsDataSet=""true"" msdata:MainDataTable=""Region"" msdata:Locale=""en-US"">" +
3936 @"<xs:complexType>" +
3937 @"<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">" +
3938 @"<xs:element name=""Region"">" +
3939 @"<xs:complexType>" +
3941 @"<xs:element name=""RegionID"" type=""xs:string"" minOccurs=""0"" />" +
3942 @"<xs:element name=""RegionDescription"" type=""xs:string"" minOccurs=""0"" />" +
3944 @"</xs:complexType>" +
3947 @"</xs:complexType>" +
3950 Assert.AreEqual(expected4, TextString4.Replace("\r\n", "").Replace(" ", ""), "#4");
3954 [Ignore ("MS behavior is far from consistent to be regarded as a reference implementation.")]
3955 // See the same-named tests in DataSetTest.cs
3956 public void ReadWriteXmlSchema_IgnoreSchema ()
3958 DataSet ds = new DataSet ();
3959 ds.ReadXmlSchema ("Test/System.Data/store.xsd");
3960 // check dataset properties before testing write
3961 AssertDataSet ("ds", ds, "NewDataSet", 3, 2);
3962 AssertDataTable ("tab1", ds.Tables[0], "bookstore", 1, 0, 0, 1, 1, 1);
3963 AssertDataTable ("tab2", ds.Tables[1], "book", 5, 0, 1, 1, 2, 1);
3964 AssertDataTable ("tab3", ds.Tables[2], "author", 3, 0, 1, 0, 1, 0);
3965 // FIXME: currently order is not compatible. Use name as index
3966 AssertDataRelation ("rel1", ds.Relations["book_author"], "book_author", true, new string[] { "book_Id" }, new string[] { "book_Id" }, true, true);
3967 AssertDataRelation ("rel2", ds.Relations["bookstore_book"], "bookstore_book", true, new string[] { "bookstore_Id" }, new string[] { "bookstore_Id" }, true, true);
3969 ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.IgnoreSchema);
3970 ds.Relations.Clear (); // because can not call WriteXmlSchema with nested relations.
3972 TextWriter writer1 = new StringWriter ();
3973 ds.Tables[0].WriteXmlSchema (writer1);
3974 //string TextString1 = GetNormalizedSchema (writer1.ToString ());
3975 string TextString1 = writer1.ToString ();
3976 string expected1 = @"<?xml version=""1.0"" encoding=""utf-16""?>" +
3977 @"<xs:schema id=""NewDataSet"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">" +
3978 @"<xs:complexType name=""bookstoreType"">" +
3979 @"</xs:complexType>" +
3980 @"<xs:element name=""bookstore"" type=""bookstoreType"" />" +
3981 @"<xs:element name=""NewDataSet"" msdata:IsDataSet=""true"" msdata:MainDataTable=""bookstore"" msdata:UseCurrentLocale=""true"">" +
3982 @"<xs:complexType>" +
3983 @"<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">" +
3984 @"<xs:element ref=""bookstore"" />" +
3986 @"</xs:complexType>" +
3989 Console.WriteLine ("{0} - {1}", TextString1, expected1);
3990 Assert.AreEqual (expected1, TextString1.Replace ("\r\n", "").Replace (" ", "").Replace ("\n", ""), "#1");
3992 TextWriter writer2 = new StringWriter ();
3993 ds.Tables[1].WriteXmlSchema (writer2, false);
3994 string TextString2 = GetNormalizedSchema (writer2.ToString ());
3995 string expected2 = @"<?xml version=""1.0"" encoding=""utf-16""?>" +
3996 @"<xs:schema id=""NewDataSet"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"">" +
3997 @"<xs:complexType name=""bookType"">" +
3999 @"<xs:element msdata:Ordinal=""1"" name=""title"" type=""xs:string"" />" +
4000 @"<xs:element msdata:Ordinal=""2"" name=""price"" type=""xs:decimal"" />" +
4002 @"<xs:attribute name=""genre"" type=""xs:string"" />" +
4003 @"<xs:attribute name=""bookstore_Id"" type=""xs:int"" use=""prohibited"" />" +
4004 @"</xs:complexType>" +
4005 @"<xs:element name=""book"" type=""bookType"" />" +
4006 @"<xs:element msdata:IsDataSet=""true"" msdata:MainDataTable=""book"" msdata:UseCurrentLocale=""true"" name=""NewDataSet"">" +
4007 @"<xs:complexType>" +
4008 @"<xs:choice maxOccurs=""unbounded"" minOccurs=""0"">" +
4009 @"<xs:element ref=""book"" />" +
4011 @"</xs:complexType>" +
4014 Assert.AreEqual (expected2, TextString2.Replace ("\r\n", "").Replace (" ", ""), "#2");
4016 TextWriter writer3 = new StringWriter ();
4017 ds.Tables[2].WriteXmlSchema (writer3);
4018 string TextString3 = GetNormalizedSchema (writer3.ToString ());
4019 string expected3 = @"<?xml version=""1.0"" encoding=""utf-16""?>" +
4020 @"<xs:schema id=""NewDataSet"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"">" +
4021 @"<xs:complexType name=""authorName"">" +
4023 @"<xs:element msdata:Ordinal=""0"" name=""first-name"" type=""xs:string"" />" +
4024 @"<xs:element msdata:Ordinal=""1"" name=""last-name"" type=""xs:string"" />" +
4026 @"<xs:attribute name=""book_Id"" type=""xs:int"" use=""prohibited"" />" +
4027 @"</xs:complexType>" +
4028 @"<xs:element name=""author"" type=""authorName"" />" +
4029 @"<xs:element msdata:IsDataSet=""true"" msdata:MainDataTable=""author"" msdata:UseCurrentLocale=""true"" name=""NewDataSet"">" +
4030 @"<xs:complexType>" +
4031 @"<xs:choice maxOccurs=""unbounded"" minOccurs=""0"">" +
4032 @"<xs:element ref=""author"" />" +
4034 @"</xs:complexType>" +
4037 Assert.AreEqual (expected3, TextString3.Replace ("\r\n", "").Replace (" ", ""), "#3");
4039 TextWriter writer4 = new StringWriter ();
4042 ds.Tables [3].WriteXmlSchema (writer4);
4043 Assert.Fail ("expected exception");
4044 } catch (InvalidOperationException ex) {
4050 public void ReadWriteXmlSchema_2 ()
4052 DataSet ds = new DataSet ("dataset");
4053 ds.Tables.Add ("table1");
4054 ds.Tables.Add ("table2");
4055 ds.Tables[0].Columns.Add ("col");
4056 ds.Tables[1].Columns.Add ("col");
4057 ds.Relations.Add ("rel", ds.Tables[0].Columns[0], ds.Tables[1].Columns[0], true);
4059 MemoryStream ms1 = new MemoryStream ();
4060 ds.Tables[0].WriteXmlSchema (ms1);
4061 MemoryStream ms2 = new MemoryStream ();
4062 ds.Tables[1].WriteXmlSchema (ms2);
4064 DataSet ds1 = new DataSet ();
4067 ds1.Tables[0].ReadXmlSchema (new MemoryStream (ms1.GetBuffer ()));
4068 ds1.Tables[1].ReadXmlSchema (new MemoryStream (ms2.GetBuffer ()));
4070 Assert.AreEqual (0, ds1.Relations.Count, "#1");
4071 Assert.AreEqual (1, ds1.Tables[0].Columns.Count, "#2");
4072 Assert.AreEqual (1, ds1.Tables[1].Columns.Count, "#3");
4076 public void ReadWriteXmlSchemaExp_NoRootElmnt ()
4078 MemoryStream ms = new MemoryStream ();
4079 DataTable dtr = new DataTable ();
4081 dtr.ReadXmlSchema (ms);
4083 } catch (XmlException) {
4088 public void ReadWriteXmlSchemaExp_NoTableName ()
4090 DataTable dtw = new DataTable ();
4091 MemoryStream ms = new MemoryStream ();
4093 dtw.WriteXmlSchema (ms);
4095 } catch (InvalidOperationException) {
4100 public void ReadWriteXmlSchemaExp_NoFileName ()
4102 DataTable dtw = new DataTable ();
4104 dtw.WriteXmlSchema (string.Empty);
4106 } catch (ArgumentException) {
4111 public void ReadWriteXmlSchemaExp_TableNameConflict ()
4113 DataTable dtw = new DataTable ("Table1");
4114 StringWriter writer1 = new StringWriter ();
4115 dtw.WriteXmlSchema (writer1);
4116 DataTable dtr = new DataTable ("Table2");
4117 StringReader reader1 = new StringReader (writer1.ToString());
4119 dtr.ReadXmlSchema (reader1);
4121 } catch (ArgumentException) {
4126 public void ReadXmlSchemeWithoutScheme ()
4128 const string xml = @"<CustomElement />";
4129 using (var s = new StringReader (xml)) {
4130 DataTable dt = new DataTable ();
4131 dt.ReadXmlSchema (s);
4132 Assert.AreEqual ("", dt.TableName);
4137 public void ReadXmlSchemeWithScheme ()
4139 const string xml = @"<CustomElement>
4140 <xs:schema id='NewDataSet' xmlns='' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
4141 <xs:element name='NewDataSet' msdata:IsDataSet='true' msdata:MainDataTable='row' msdata:Locale=''>
4143 <xs:choice minOccurs='0' maxOccurs='unbounded'>
4144 <xs:element name='row' msdata:Locale=''>
4147 <xs:element name='Text' type='xs:string' minOccurs='0' />
4156 using (var s = new StringReader (xml)) {
4157 DataTable dt = new DataTable ();
4158 dt.ReadXmlSchema (s);
4159 Assert.AreEqual ("row", dt.TableName);
4164 [ExpectedException (typeof (ArgumentException))]
4165 public void ReadXmlSchemeWithBadScheme ()
4167 const string xml = @"<CustomElement>
4168 <xs:schema id='NewDataSet' xmlns='' xmlns:xs='http://www.w3.org/2001/BAD' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
4171 using (var s = new StringReader (xml)) {
4172 DataTable dt = new DataTable ();
4173 dt.ReadXmlSchema (s);
4177 #endregion // Read/Write XML Tests
4181 public class MyDataTable : DataTable
4183 public static int count;
4185 public MyDataTable()
4193 public class AppDomainsAndFormatInfo
4195 public void Remote ()
4197 int n = (int) Convert.ChangeType ("5", typeof (int));
4198 Assert.AreEqual (5, n, "n");
4203 public void NFIFromBug55978 ()
4205 AppDomain domain = AppDomain.CreateDomain ("testdomain", null,
4206 AppDomain.CurrentDomain.SetupInformation);
4207 AppDomainsAndFormatInfo test = new AppDomainsAndFormatInfo ();
4209 domain.DoCallBack (new CrossAppDomainDelegate (test.Remote));
4210 AppDomain.Unload (domain);
4215 [SetCulture ("en-US")]
4216 public void Bug55978 ()
4218 DataTable dt = new DataTable ();
4219 dt.Columns.Add ("StartDate", typeof (DateTime));
4222 DateTime date = DateTime.Now;
4224 for (int i = 0; i < 10; i++) {
4226 dr ["StartDate"] = date.AddDays (i);
4230 DataView dv = dt.DefaultView;
4231 dv.RowFilter = String.Format (CultureInfo.InvariantCulture,
4232 "StartDate >= '{0}' and StartDate <= '{1}'",
4233 DateTime.Now.AddDays (2),
4234 DateTime.Now.AddDays (4));
4235 Assert.AreEqual (10, dt.Rows.Count, "Table");
4236 Assert.AreEqual (2, dv.Count, "View");
4240 public void Bug82109 ()
4242 DataTable tbl = new DataTable ();
4243 tbl.Columns.Add ("data", typeof (DateTime));
4244 DataRow row = tbl.NewRow ();
4245 row ["Data"] = new DateTime (2007, 7, 1);
4248 CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
4249 Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
4252 Thread.CurrentThread.CurrentCulture = new CultureInfo ("it-IT");
4255 Thread.CurrentThread.CurrentCulture = new CultureInfo ("fr-FR");
4257 Thread.CurrentThread.CurrentCulture = currentCulture;
4260 private static void Select (DataTable tbl)
4262 tbl.Locale = CultureInfo.InvariantCulture;
4263 string filter = string.Format ("Data = '{0}'", new DateTime (2007, 7, 1).ToString (CultureInfo.InvariantCulture));
4264 DataRow [] rows = tbl.Select (filter);
4265 Assert.AreEqual (1, rows.Length, "Incorrect number of rows found");