2005-01-19 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.Data / Test / System.Data / DataSetInferXmlSchemaTest.cs
index 41b9c0ca5363fe9cb57bed63e53880a7f6ab4fb5..06cf50c3ff31519ef718c95a68e48b5e9bc52add 100755 (executable)
@@ -4,7 +4,30 @@
 // Author:
 //     Atsushi Enomoto <atsushi@ximian.com>
 //
-// (C)2004 Novell Inc.
+
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 
 using System;
 using System.Collections;
@@ -44,7 +67,9 @@ namespace MonoTests.System.Data
     <el4 attr4='val4' attrD='valD'>4</el4>\r
   </el2>\r
 </el1>";
+               // mixed content
                string xml10 = "<root>Here is a <b>mixed</b> content.</root>";
+               // xml:space support
                string xml11 = @"<root xml:space='preserve'>\r
    <child_after_significant_space />\r
 </root>";
@@ -56,7 +81,10 @@ namespace MonoTests.System.Data
                //   2) <root>simple <!-- comment -->string.</root>
                // The same applies to PI.
 //             string xml13 = "<root><tab><col>test <!-- out --> comment</col></tab></root>";
+
+               // simple namespace/prefix support
                string xml14 = "<p:root xmlns:p='urn:foo'>test string</p:root>";
+               // two tables that have the same content type.
                string xml15 = @"<root>\r
 <table1>\r
         <col1_1>test1</col1_1>\r
@@ -67,6 +95,7 @@ namespace MonoTests.System.Data
         <col2_2>test2</col2_2>\r
 </table2>\r
 </root>";
+               // foo cannot be both table chikd and root child
                string xml16 = @"<root>\r
 <table>\r
         <foo>\r
@@ -78,7 +107,9 @@ namespace MonoTests.System.Data
 <foo></foo>\r
 <bar />\r
 </root>";
+               // simple namespace support
                string xml17 = @"<root xmlns='urn:foo' />";
+               // conflict between simple and complex type element col
                string xml18 = @"<set>\r
 <table>\r
 <col>\r
@@ -87,6 +118,7 @@ namespace MonoTests.System.Data
 <col>simple text here.</col>\r
 </table>\r
 </set>";
+               // variant of xml18: complex column appeared latter
                string xml19 =@"<set>\r
 <table>\r
 <col>simple text</col><!-- ignored -->\r
@@ -95,6 +127,7 @@ namespace MonoTests.System.Data
 </col>\r
 </table>\r
 </set>";
+               // conflict check (actually it is not conflict) on two "col" tables
                string xml20 = @"<set>\r
 <table>\r
 <col>\r
@@ -103,6 +136,7 @@ namespace MonoTests.System.Data
 <col attr='value' />\r
 </table>\r
 </set>";
+               // conflict between the attribute and the child element
                string xml21 = @"<set>\r
 <table>\r
 <col data='value'>\r
@@ -110,6 +144,30 @@ namespace MonoTests.System.Data
 </col>\r
 </table>\r
 </set>";
+               // simple nest
+               string xml22 = "<set><table><col><descendant/></col></table><table2><col2>v2</col2></table2></set>";\r
+               // simple diffgram\r
+               string xml23 = @"<set>\r
+  <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\r
+    <xs:element name='table'>\r
+      <xs:complexType>\r
+      <xs:choice>\r
+        <xs:any />\r
+      </xs:choice>\r
+      </xs:complexType>\r
+    </xs:element>\r
+  </xs:schema>\r
+  <diffgr:diffgram\r
+        xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'\r
+        xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>\r
+    <table>\r
+      <col>1</col>\r
+    </table>\r
+  </diffgr:diffgram>\r
+</set>";\r
+               // just deep table\r
+               string xml24 = "<p1><p2><p3><p4><p5><p6/></p5></p4></p3></p2></p1>";\r
+\r
 
                private DataSet GetDataSet (string xml, string [] nss)
                {
@@ -123,7 +181,7 @@ namespace MonoTests.System.Data
                {
                        DataSet ds = new DataSet ();
                        ds.InferXmlSchema ((XmlReader) null, null);
-                       AssertDataSet ("null", ds, "NewDataSet", 0);
+                       AssertDataSet ("null", ds, "NewDataSet", 0, 0);
                }
 
                [Test]
@@ -152,7 +210,7 @@ namespace MonoTests.System.Data
                        DataSet ds = GetDataSet (xml2, null);
                        AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "root", 1, 0);
+                       AssertDataTable ("dt", dt, "root", 1, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col", dt.Columns [0], "attr", true, false, 0, 1, "attr", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                }
 
@@ -162,7 +220,7 @@ namespace MonoTests.System.Data
                        DataSet ds = GetDataSet (xml3, null);
                        AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "root", 2, 0);
+                       AssertDataTable ("dt", dt, "root", 2, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col", dt.Columns [0], "attr", true, false, 0, 1, "attr", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("col", dt.Columns [1], "attr2", true, false, 0, 1, "attr2", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
                }
@@ -173,13 +231,13 @@ namespace MonoTests.System.Data
                        DataSet ds = GetDataSet (xml5, null);
                        AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "root", 1, 0);
+                       AssertDataTable ("dt", dt, "root", 1, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col", dt.Columns [0], "child", true, false, 0, 1, "child", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
 
                        ds = GetDataSet (xml6, null);
                        AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
                        dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "root", 1, 0);
+                       AssertDataTable ("dt", dt, "root", 1, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col", dt.Columns [0], "col1", true, false, 0, 1, "col1", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                }
 
@@ -189,7 +247,7 @@ namespace MonoTests.System.Data
                        DataSet ds = GetDataSet (xml7, null);
                        AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "root", 3, 0);
+                       AssertDataTable ("dt", dt, "root", 3, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col", dt.Columns [0], "col1", true, false, 0, 1, "col1", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("col2", dt.Columns [1], "col2", true, false, 0, 1, "col2", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
                        AssertDataColumn ("col3", dt.Columns [2], "col3", true, false, 0, 1, "col3", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
@@ -201,7 +259,7 @@ namespace MonoTests.System.Data
                        DataSet ds = GetDataSet (xml8, null);
                        AssertDataSet ("ds", ds, "set", 1, 0);
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "tab", 3, 0);
+                       AssertDataTable ("dt", dt, "tab", 3, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col", dt.Columns [0], "col1", true, false, 0, 1, "col1", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("col2", dt.Columns [1], "col2", true, false, 0, 1, "col2", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
                        AssertDataColumn ("col3", dt.Columns [2], "col3", true, false, 0, 1, "col3", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
@@ -213,16 +271,16 @@ namespace MonoTests.System.Data
                        // FIXME: Also test ReadXml (, XmlReadMode.InferSchema) and
                        // make sure that ReadXml() stores DataRow to el1 (and maybe to others)
                        DataSet ds = GetDataSet (xml9, null);
-                       AssertDataSet ("ds", ds, "NewDataSet", 4, 0);
+                       AssertDataSet ("ds", ds, "NewDataSet", 4, 3);
                        DataTable dt = ds.Tables [0];
 
-                       AssertDataTable ("dt", dt, "el1", 3, 0);
+                       AssertDataTable ("dt1", dt, "el1", 3, 0, 0, 1, 1, 1);
                        AssertDataColumn ("el1_Id", dt.Columns [0], "el1_Id", false, true, 0, 1, "el1_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, true);
                        AssertDataColumn ("el1_attr1", dt.Columns [1], "attr1", true, false, 0, 1, "attr1", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
                        AssertDataColumn ("el1_attrA", dt.Columns [2], "attrA", true, false, 0, 1, "attrA", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
 
                        dt = ds.Tables [1];
-                       AssertDataTable ("dt", dt, "el2", 6, 0);
+                       AssertDataTable ("dt2", dt, "el2", 6, 0, 1, 2, 2, 1);
                        AssertDataColumn ("el2_Id", dt.Columns [0], "el2_Id", false, true, 0, 1, "el2_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, true);
                        AssertDataColumn ("el2_col2", dt.Columns [1], "column2", true, false, 0, 1, "column2", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
                        AssertDataColumn ("el2_col3", dt.Columns [2], "column3", true, false, 0, 1, "column3", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
@@ -231,18 +289,18 @@ namespace MonoTests.System.Data
                        AssertDataColumn ("el2_el1Id", dt.Columns [5], "el1_Id", true, false, 0, 1, "el1_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 5, String.Empty, false, false);
 
                        dt = ds.Tables [2];
-                       AssertDataTable ("dt", dt, "el3", 4, 0);
+                       AssertDataTable ("dt3", dt, "el3", 4, 0, 1, 0, 1, 0);
                        AssertDataColumn ("el3_attr3", dt.Columns [0], "attr3", true, false, 0, 1, "attr3", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("el3_attrC", dt.Columns [1], "attrC", true, false, 0, 1, "attrC", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
-                       AssertDataColumn ("el3_Text", dt.Columns [2], "el3_Text", true, false, 0, 1, "el3_Text", MappingType.SimpleContent, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
+                       AssertDataColumn ("el3_Text", dt.Columns [2], "el3_Text", true, false, 0, 1, "el3_Text", MappingType.SimpleContent, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
                        AssertDataColumn ("el3_el2Id", dt.Columns [3], "el2_Id", true, false, 0, 1, "el2_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 3, String.Empty, false, false);
 
                        dt = ds.Tables [3];
-                       AssertDataTable ("dt", dt, "el4", 4, 0);
+                       AssertDataTable ("dt4", dt, "el4", 4, 0, 1, 0, 1, 0);
                        AssertDataColumn ("el3_attr4", dt.Columns [0], "attr4", true, false, 0, 1, "attr4", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("el4_attrD", dt.Columns [1], "attrD", true, false, 0, 1, "attrD", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
-                       AssertDataColumn ("el4_Text", dt.Columns [2], "el4_Text", true, false, 0, 1, "el4_Text", MappingType.SimpleContent, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
-                       AssertDataColumn ("el4_el2Id", dt.Columns [4], "el2_Id", true, false, 0, 1, "el2_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 3, String.Empty, false, false);
+                       AssertDataColumn ("el4_Text", dt.Columns [2], "el4_Text", true, false, 0, 1, "el4_Text", MappingType.SimpleContent, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
+                       AssertDataColumn ("el4_el2Id", dt.Columns [3], "el2_Id", true, false, 0, 1, "el2_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 3, String.Empty, false, false);
                }
 
                [Test]
@@ -253,7 +311,7 @@ namespace MonoTests.System.Data
                        DataSet ds = GetDataSet (xml10, null);
                        AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "root", 1, 0);
+                       AssertDataTable ("dt", dt, "root", 1, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col", dt.Columns [0], "b", true, false, 0, 1, "b", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                }
 
@@ -265,7 +323,7 @@ namespace MonoTests.System.Data
                        DataSet ds = GetDataSet (xml11, null);
                        AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "root", 2, 0);
+                       AssertDataTable ("dt", dt, "root", 2, 0, 0, 0, 0, 0);
                        AssertDataColumn ("element", dt.Columns [0], "child_after_significant_space", true, false, 0, 1, "child_after_significant_space", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("xml:space", dt.Columns [1], "space", true, false, 0, 1, "space", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, "http://www.w3.org/XML/1998/namespace", 1, "xml", false, false);
                }
@@ -283,7 +341,7 @@ namespace MonoTests.System.Data
                        ("      \n\n"));\r
                        XmlReader xr = new XmlNodeReader (doc);\r
                        ds.InferXmlSchema (xr, null);\r
-                       AssertDataSet ("pure_whitespace", ds, "root", 0);\r
+                       AssertDataSet ("pure_whitespace", ds, "root", 0, 0);\r
                }
 
                [Test]
@@ -295,12 +353,12 @@ namespace MonoTests.System.Data
                        AssertDataSet ("ds", ds, "root", 2, 0);
 
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "table1", 2, 0);
+                       AssertDataTable ("dt", dt, "table1", 2, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col1_1", dt.Columns [0], "col1_1", true, false, 0, 1, "col1_1", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("col1_2", dt.Columns [1], "col1_2", true, false, 0, 1, "col1_2", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
 
                        dt = ds.Tables [1];
-                       AssertDataTable ("dt", dt, "table2", 2, 0);
+                       AssertDataTable ("dt", dt, "table2", 2, 0, 0, 0, 0, 0);
                        AssertDataColumn ("col2_1", dt.Columns [0], "col2_1", true, false, 0, 1, "col2_1", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("col2_2", dt.Columns [1], "col2_2", true, false, 0, 1, "col2_2", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
                }
@@ -336,22 +394,22 @@ namespace MonoTests.System.Data
                }
 
                [Test]
-               public void TwoElementTable3 ()
+               public void ConflictSimpleComplexColumns ()
                {
                        DataSet ds = GetDataSet (xml18, null);
                        AssertDataSet ("ds", ds, "set", 2, 1);
 
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "table", 1, 0);
+                       AssertDataTable ("dt", dt, "table", 1, 0, 0, 1, 1, 1);
                        AssertDataColumn ("table_Id", dt.Columns [0], "table_Id", false, true, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, true);
 
                        dt = ds.Tables [1];
-                       AssertDataTable ("dt", dt, "col", 2, 0);
+                       AssertDataTable ("dt", dt, "col", 2, 0, 1, 0, 1, 0);
                        AssertDataColumn ("another_col", dt.Columns [0], "another_col", true, false, 0, 1, "another_col", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
                        AssertDataColumn ("table_refId", dt.Columns [1], "table_Id", true, false, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
 
                        DataRelation dr = ds.Relations [0];
-                       AssertDataRelation ("rel", dr, "table_col", new string [] {"table_Id"}, new string [] {"table_Id"}, true, true);
+                       AssertDataRelation ("rel", dr, "table_col", true, new string [] {"table_Id"}, new string [] {"table_Id"}, true, true);
                        AssertUniqueConstraint ("uniq", dr.ParentKeyConstraint, "Constraint1", true, new string [] {"table_Id"});
                        AssertForeignKeyConstraint ("fkey", dr.ChildKeyConstraint, "table_col", AcceptRejectRule.None, Rule.Cascade, Rule.Cascade, new string [] {"table_Id"}, new string [] {"table_Id"});
                }
@@ -363,16 +421,16 @@ namespace MonoTests.System.Data
                        AssertDataSet ("ds", ds, "set", 2, 1);
 
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "table", 1, 0);
+                       AssertDataTable ("dt", dt, "table", 1, 0, 0, 1, 1, 1);
                        AssertDataColumn ("table_Id", dt.Columns [0], "table_Id", false, true, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, true);
 
                        dt = ds.Tables [1];
-                       AssertDataTable ("dt", dt, "col", 2, 0);
-                       AssertDataColumn ("table_refId", dt.Columns [1], "table_Id", true, false, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
-                       AssertDataColumn ("another_col", dt.Columns [0], "another_col", true, false, 0, 1, "another_col", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
+                       AssertDataTable ("dt", dt, "col", 2, 0, 1, 0, 1, 0);
+                       AssertDataColumn ("table_refId", dt.Columns ["table_Id"], "table_Id", true, false, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, /*0*/-1, String.Empty, false, false);
+                       AssertDataColumn ("another_col", dt.Columns ["another_col"], "another_col", true, false, 0, 1, "another_col", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, /*1*/-1, String.Empty, false, false);
 
                        DataRelation dr = ds.Relations [0];
-                       AssertDataRelation ("rel", dr, "table_col", new string [] {"table_Id"}, new string [] {"table_Id"}, true, true);
+                       AssertDataRelation ("rel", dr, "table_col", true, new string [] {"table_Id"}, new string [] {"table_Id"}, true, true);
                        AssertUniqueConstraint ("uniq", dr.ParentKeyConstraint, "Constraint1", true, new string [] {"table_Id"});
                        AssertForeignKeyConstraint ("fkey", dr.ChildKeyConstraint, "table_col", AcceptRejectRule.None, Rule.Cascade, Rule.Cascade, new string [] {"table_Id"}, new string [] {"table_Id"});
                }
@@ -385,17 +443,17 @@ namespace MonoTests.System.Data
                        AssertDataSet ("ds", ds, "set", 2, 1);
 
                        DataTable dt = ds.Tables [0];
-                       AssertDataTable ("dt", dt, "table", 1, 0);
+                       AssertDataTable ("dt", dt, "table", 1, 0, 0, 1, 1, 1);
                        AssertDataColumn ("table_Id", dt.Columns [0], "table_Id", false, true, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, true);
 
                        dt = ds.Tables [1];
-                       AssertDataTable ("dt", dt, "col", 3, 0);
+                       AssertDataTable ("dt", dt, "col", 3, 0, 1, 0, 1, 0);
                        AssertDataColumn ("another_col", dt.Columns [0], "another_col", true, false, 0, 1, "another_col", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
-                       AssertDataColumn ("table_refId", dt.Columns [1], "table_Id", true, false, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
-                       AssertDataColumn ("attr", dt.Columns [2], "attr", true, false, 0, 1, "attr", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
+                       AssertDataColumn ("table_refId", dt.Columns ["table_Id"], "table_Id", true, false, 0, 1, "table_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, /*1*/-1, String.Empty, false, false);
+                       AssertDataColumn ("attr", dt.Columns ["attr"], "attr", true, false, 0, 1, "attr", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, /*2*/-1, String.Empty, false, false);
 
                        DataRelation dr = ds.Relations [0];
-                       AssertDataRelation ("rel", dr, "table_col", new string [] {"table_Id"}, new string [] {"table_Id"}, true, true);
+                       AssertDataRelation ("rel", dr, "table_col", true, new string [] {"table_Id"}, new string [] {"table_Id"}, true, true);
                        AssertUniqueConstraint ("uniq", dr.ParentKeyConstraint, "Constraint1", true, new string [] {"table_Id"});
                        AssertForeignKeyConstraint ("fkey", dr.ChildKeyConstraint, "table_col", AcceptRejectRule.None, Rule.Cascade, Rule.Cascade, new string [] {"table_Id"}, new string [] {"table_Id"});
                }
@@ -409,5 +467,66 @@ namespace MonoTests.System.Data
                        // already allocated for DataTable.
                        DataSet ds = GetDataSet (xml21, null);
                }
+
+               [Test]
+               [ExpectedException (typeof (ConstraintException))]
+               public void ConflictExistingPrimaryKey ()
+               {
+                       // The 'col' DataTable tries to create another primary key (and fails)\r
+                       DataSet ds = new DataSet ();\r
+                       ds.Tables.Add (new DataTable ("table"));\r
+                       DataColumn c = new DataColumn ("pk");\r
+                       ds.Tables [0].Columns.Add (c);\r
+                       ds.Tables [0].PrimaryKey = new DataColumn [] {c};\r
+                       XmlTextReader xtr = new XmlTextReader (xml22, XmlNodeType.Document, null);\r
+                       xtr.Read ();\r
+                       ds.ReadXml (xtr, XmlReadMode.InferSchema);
+               }
+
+               [Test]
+               public void IgnoredNamespaces ()
+               {
+                       string xml = "<root attr='val' xmlns:a='urn:foo' a:foo='hogehoge' />";
+                       DataSet ds = new DataSet ();
+                       ds.InferXmlSchema (new StringReader (xml), null);
+                       AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
+                       AssertDataTable ("dt", ds.Tables [0], "root", 2, 0, 0, 0, 0, 0);
+
+                       ds = new DataSet ();
+                       ds.InferXmlSchema (new StringReader (xml), new string [] {"urn:foo"});
+                       AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
+                       // a:foo is ignored
+                       AssertDataTable ("dt", ds.Tables [0], "root", 1, 0, 0, 0, 0, 0);
+               }
+
+               [Test]
+               public void ContainsSchema ()
+               {
+                       DataSet ds = new DataSet();
+                       DataTable dt1 = new DataTable();
+                       ds.Tables.Add(dt1);
+                       DataColumn dc1 = new DataColumn("Col1");
+                       dt1.Columns.Add(dc1);
+                       dt1.Rows.Add(new string[] { "aaa" } );
+                       DataTable dt2 = new DataTable();
+                       ds.Tables.Add(dt2);
+                       DataColumn dc2 = new DataColumn("Col2");
+                       dt2.Columns.Add(dc2);
+                       dt2.Rows.Add(new string[] { "bbb" } );
+
+                       DataRelation rel = new DataRelation("Rel1",dc1,dc2,false);
+                       ds.Relations.Add(rel);
+
+                       StringWriter sw = new StringWriter ();
+                       ds.WriteXml(sw, XmlWriteMode.WriteSchema);
+
+                       ds = new DataSet();
+                       ds.ReadXml(new StringReader (sw.ToString ()));
+                       sw = new StringWriter ();
+                       ds.WriteXml(sw);
+                       XmlDocument doc = new XmlDocument ();
+                       doc.LoadXml (sw.ToString ());
+                       AssertEquals (2, doc.DocumentElement.ChildNodes.Count);
+               }
        }
 }