2 // DataSetReadXmlSchemaTest.cs
\r
5 // Atsushi Enomoto <atsushi@ximian.com>
\r
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using System.Globalization;
\r
37 using System.Threading;
\r
39 using NUnit.Framework;
\r
41 namespace MonoTests.System.Data
\r
44 public class DataSetReadXmlSchemaTest : DataSetAssertion
\r
46 private DataSet CreateTestSet ()
\r
48 DataSet ds = new DataSet ();
\r
49 ds.Tables.Add ("Table1");
\r
50 ds.Tables.Add ("Table2");
\r
51 ds.Tables [0].Columns.Add ("Column1_1");
\r
52 ds.Tables [0].Columns.Add ("Column1_2");
\r
53 ds.Tables [0].Columns.Add ("Column1_3");
\r
54 ds.Tables [1].Columns.Add ("Column2_1");
\r
55 ds.Tables [1].Columns.Add ("Column2_2");
\r
56 ds.Tables [1].Columns.Add ("Column2_3");
\r
57 ds.Tables [0].Rows.Add (new object [] {"ppp", "www", "xxx"});
\r
58 ds.Relations.Add ("Rel1", ds.Tables [0].Columns [2], ds.Tables [1].Columns [0]);
\r
62 CultureInfo currentCultureBackup;
\r
65 public void Setup ()
\r
67 currentCultureBackup = Thread.CurrentThread.CurrentCulture;
\r
68 Thread.CurrentThread.CurrentCulture = new CultureInfo ("fi-FI");
\r
72 public void Teardown ()
\r
74 Thread.CurrentThread.CurrentCulture = currentCultureBackup;
\r
78 public void SingleElementTreatmentDifference ()
\r
80 // This is one of the most complicated case. When the content
\r
81 // type particle of 'Root' element is a complex element, it
\r
82 // is DataSet element. Otherwise, it is just a data table.
\r
84 // But also note that there is another test named
\r
85 // LocaleOnRootWithoutIsDataSet(), that tests if locale on
\r
86 // the (mere) data table modifies *DataSet's* locale.
\r
88 // Moreover, when the schema contains another element
\r
89 // (regardless of its schema type), the elements will
\r
90 // never be treated as a DataSet.
\r
91 string xsbase = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' id='hoge'>
\r
92 <xs:element name='Root'> <!-- When simple, it becomes table. When complex, it becomes DataSet -->
\r
101 string xsbase2 = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' id='hoge'>
\r
102 <xs:element name='Root'> <!-- When simple, it becomes table. When complex, it becomes DataSet -->
\r
109 <xs:element name='more' type='xs:string' />
\r
112 string simple = "<xs:element name='Child' type='xs:string' />";
\r
113 string complex = @"<xs:element name='Child'>
\r
115 <xs:attribute name='a1' />
\r
116 <xs:attribute name='a2' type='xs:integer' />
\r
119 string elref = "<xs:element ref='more' />";
\r
121 string xs2 = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' id='hoge'>
\r
122 <xs:element name='Root' type='RootType' />
\r
123 <xs:complexType name='RootType'>
\r
125 <xs:element name='Child'>
\r
127 <xs:attribute name='a1' />
\r
128 <xs:attribute name='a2' type='xs:integer' />
\r
135 DataSet ds = new DataSet ();
\r
137 string xs = String.Format (xsbase, simple);
\r
138 ds.ReadXmlSchema (new StringReader (xs));
\r
139 AssertDataSet ("simple", ds, "hoge", 1, 0);
\r
140 AssertDataTable ("simple", ds.Tables [0], "Root", 1, 0, 0, 0, 0, 0);
\r
142 // reference to global complex type
\r
143 ds = new DataSet ();
\r
144 ds.ReadXmlSchema (new StringReader (xs2));
\r
145 AssertDataSet ("external complexType", ds, "hoge", 2, 1);
\r
146 AssertDataTable ("external Tab1", ds.Tables [0], "Root", 1, 0, 0, 1, 1, 1);
\r
147 AssertDataTable ("external Tab2", ds.Tables [1], "Child", 3, 0, 1, 0, 1, 0);
\r
149 // xsbase2 + complex -> datatable
\r
150 ds = new DataSet ();
\r
151 xs = String.Format (xsbase2, complex);
\r
152 ds.ReadXmlSchema (new StringReader (xs));
\r
153 AssertDataSet ("complex", ds, "hoge", 2, 1);
\r
154 AssertDataTable ("complex", ds.Tables [0], "Root", 1, 0, 0, 1, 1, 1);
\r
155 DataTable dt = ds.Tables [1];
\r
156 AssertDataTable ("complex", dt, "Child", 3, 0, 1, 0, 1, 0);
\r
157 AssertDataColumn ("a1", dt.Columns ["a1"], "a1", true, false, 0, 1, "a1", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, /*0*/-1, String.Empty, false, false);
\r
158 AssertDataColumn ("a2", dt.Columns ["a2"], "a2", true, false, 0, 1, "a2", MappingType.Attribute, typeof (long), DBNull.Value, String.Empty, -1, String.Empty, /*1*/-1, String.Empty, false, false);
\r
159 AssertDataColumn ("Root_Id", dt.Columns [2], "Root_Id", true, false, 0, 1, "Root_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 2, String.Empty, false, false);
\r
161 // xsbase + complex -> dataset
\r
162 ds = new DataSet ();
\r
163 xs = String.Format (xsbase, complex);
\r
164 ds.ReadXmlSchema (new StringReader (xs));
\r
165 AssertDataSet ("complex", ds, "Root", 1, 0);
\r
167 ds = new DataSet ();
\r
168 xs = String.Format (xsbase2, elref);
\r
169 ds.ReadXmlSchema (new StringReader (xs));
\r
170 AssertDataSet ("complex", ds, "hoge", 1, 0);
\r
171 AssertDataTable ("complex", ds.Tables [0], "Root", 1, 0, 0, 0, 0, 0);
\r
175 public void SuspiciousDataSetElement ()
\r
177 string schema = @"<?xml version='1.0'?>
\r
178 <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
\r
179 <xsd:attribute name='foo' type='xsd:string'/>
\r
180 <xsd:attribute name='bar' type='xsd:string'/>
\r
181 <xsd:complexType name='attRef'>
\r
182 <xsd:attribute name='att1' type='xsd:int'/>
\r
183 <xsd:attribute name='att2' type='xsd:string'/>
\r
185 <xsd:element name='doc'>
\r
188 <xsd:element name='elem' type='attRef'/>
\r
193 DataSet ds = new DataSet ();
\r
194 ds.ReadXmlSchema (new StringReader (schema));
\r
195 AssertDataSet ("ds", ds, "doc", 1, 0);
\r
196 AssertDataTable ("table", ds.Tables [0], "elem", 2, 0, 0, 0, 0, 0);
\r
200 public void UnusedComplexTypesIgnored ()
\r
202 string xs = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' id='hoge'>
\r
203 <xs:element name='Root'>
\r
206 <xs:element name='Child' type='xs:string' />
\r
210 <xs:complexType name='unusedType'>
\r
212 <xs:element name='Orphan' type='xs:string' />
\r
217 DataSet ds = new DataSet ();
\r
218 ds.ReadXmlSchema (new StringReader (xs));
\r
219 // Here "unusedType" table is never imported.
\r
220 AssertDataSet ("ds", ds, "hoge", 1, 0);
\r
221 AssertDataTable ("dt", ds.Tables [0], "Root", 1, 0, 0, 0, 0, 0);
\r
225 public void SimpleTypeComponentsIgnored ()
\r
227 string xs = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
\r
228 <xs:element name='Root' type='xs:string'/>
\r
229 <xs:attribute name='Attr' type='xs:string'/>
\r
232 DataSet ds = new DataSet ();
\r
233 ds.ReadXmlSchema (new StringReader (xs));
\r
234 // nothing is imported.
\r
235 AssertDataSet ("ds", ds, "NewDataSet", 0, 0);
\r
239 public void IsDataSetAndTypeIgnored ()
\r
241 string xsbase = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
\r
242 <xs:element name='Root' type='unusedType' msdata:IsDataSet='{0}'>
\r
244 <xs:complexType name='unusedType'>
\r
246 <xs:element name='Child' type='xs:string' />
\r
251 // Even if a global element uses a complexType, it will be
\r
252 // ignored if the element has msdata:IsDataSet='true'
\r
253 string xs = String.Format (xsbase, "true");
\r
255 DataSet ds = new DataSet ();
\r
256 ds.ReadXmlSchema (new StringReader (xs));
\r
257 AssertDataSet ("ds", ds, "Root", 0, 0); // name is "Root"
\r
259 // But when explicit msdata:IsDataSet value is "false", then
\r
261 xs = String.Format (xsbase, "false");
\r
263 ds = new DataSet ();
\r
264 ds.ReadXmlSchema (new StringReader (xs));
\r
265 AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
\r
269 [ExpectedException (typeof (ArgumentException))]
\r
270 public void NestedReferenceNotAllowed ()
\r
272 string xs = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
\r
273 <xs:element name='Root' type='unusedType' msdata:IsDataSet='true'>
\r
275 <xs:complexType name='unusedType'>
\r
277 <xs:element name='Child' type='xs:string' />
\r
280 <xs:element name='Foo'>
\r
283 <xs:element ref='Root' />
\r
289 // DataSet element cannot be converted into a DataTable.
\r
290 // (i.e. cannot be referenced in any other elements)
\r
291 DataSet ds = new DataSet ();
\r
292 ds.ReadXmlSchema (new StringReader (xs));
\r
296 public void IsDataSetOnLocalElementIgnored ()
\r
298 string xsbase = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
\r
299 <xs:element name='Root' type='unusedType'>
\r
301 <xs:complexType name='unusedType'>
\r
303 <xs:element name='Child' type='xs:string' msdata:IsDataSet='True' />
\r
308 // msdata:IsDataSet does not affect even if the value is invalid
\r
309 string xs = String.Format (xsbase, "true");
\r
311 DataSet ds = new DataSet ();
\r
312 ds.ReadXmlSchema (new StringReader (xs));
\r
313 // Child should not be regarded as DataSet element
\r
314 AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
\r
318 public void LocaleOnRootWithoutIsDataSet ()
\r
320 string xs = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
\r
321 <xs:element name='Root' msdata:Locale='ja-JP'>
\r
324 <xs:element name='Child' type='xs:string' />
\r
326 <xs:attribute name='Attr' type='xs:integer' />
\r
331 DataSet ds = new DataSet ();
\r
332 ds.ReadXmlSchema (new StringReader (xs));
\r
333 AssertDataSet ("ds", ds, "NewDataSet", 1, 0);
\r
334 AssertEquals ("fi-FI", ds.Locale.Name); // DataSet's Locale comes from current thread
\r
335 DataTable dt = ds.Tables [0];
\r
336 AssertDataTable ("dt", dt, "Root", 2, 0, 0, 0, 0, 0);
\r
337 AssertEquals ("ja-JP", dt.Locale.Name); // DataTable's Locale comes from msdata:Locale
\r
338 AssertDataColumn ("col1", dt.Columns [0], "Attr", true, false, 0, 1, "Attr", MappingType.Attribute, typeof (Int64), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
339 AssertDataColumn ("col2", dt.Columns [1], "Child", false, false, 0, 1, "Child", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
344 public void ElementHasIdentityConstraint ()
\r
346 string constraints = @"
\r
347 <xs:key name='key'>
\r
348 <xs:selector xpath='./any/string_is_OK/R1'/>
\r
349 <xs:field xpath='Child2'/>
\r
351 <xs:keyref name='kref' refer='key'>
\r
352 <xs:selector xpath='.//R2'/>
\r
353 <xs:field xpath='Child2'/>
\r
355 string xsbase = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
\r
356 <xs:element name='DS' msdata:IsDataSet='true'>
\r
359 <xs:element ref='R1' />
\r
360 <xs:element ref='R2' />
\r
365 <xs:element name='R1' type='RootType'>
\r
368 <xs:element name='R2' type='RootType'>
\r
370 <xs:complexType name='RootType'>
\r
372 <xs:element name='Child1' type='xs:string'>
\r
375 <xs:element name='Child2' type='xs:string' />
\r
377 <xs:attribute name='Attr' type='xs:integer' />
\r
381 // Constraints on DataSet element.
\r
382 // Note that in xs:key xpath is crazy except for the last step
\r
383 string xs = String.Format (xsbase, constraints, String.Empty, String.Empty);
\r
384 DataSet ds = new DataSet ();
\r
385 ds.ReadXmlSchema (new StringReader (xs));
\r
386 AssertEquals (1, ds.Relations.Count);
\r
388 // Constraints on another global element - just ignored
\r
389 xs = String.Format (xsbase, String.Empty, constraints, String.Empty);
\r
390 ds = new DataSet ();
\r
391 ds.ReadXmlSchema (new StringReader (xs));
\r
392 AssertEquals (0, ds.Relations.Count);
\r
394 // Constraints on local element - just ignored
\r
395 xs = String.Format (xsbase, String.Empty, String.Empty, constraints);
\r
396 ds = new DataSet ();
\r
397 ds.ReadXmlSchema (new StringReader (xs));
\r
398 AssertEquals (0, ds.Relations.Count);
\r
402 public void PrefixedTargetNS ()
\r
404 string xs = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:x='urn:foo' targetNamespace='urn:foo' elementFormDefault='qualified'>
\r
405 <xs:element name='DS' msdata:IsDataSet='true'>
\r
408 <xs:element ref='x:R1' />
\r
409 <xs:element ref='x:R2' />
\r
412 <xs:key name='key'>
\r
413 <xs:selector xpath='./any/string_is_OK/x:R1'/>
\r
414 <xs:field xpath='x:Child2'/>
\r
416 <xs:keyref name='kref' refer='x:key'>
\r
417 <xs:selector xpath='.//x:R2'/>
\r
418 <xs:field xpath='x:Child2'/>
\r
421 <xs:element name='R3' type='x:RootType' />
\r
422 <xs:complexType name='extracted'>
\r
424 <xs:element ref='x:R1' />
\r
425 <xs:element ref='x:R2' />
\r
428 <xs:element name='R1' type='x:RootType'>
\r
429 <xs:unique name='Rkey'>
\r
430 <xs:selector xpath='.//x:Child1'/>
\r
431 <xs:field xpath='.'/>
\r
433 <xs:keyref name='Rkref' refer='x:Rkey'>
\r
434 <xs:selector xpath='.//x:Child2'/>
\r
435 <xs:field xpath='.'/>
\r
438 <xs:element name='R2' type='x:RootType'>
\r
440 <xs:complexType name='RootType'>
\r
442 <xs:element name='Child1' type='xs:string'>
\r
444 <xs:element name='Child2' type='xs:string' />
\r
446 <xs:attribute name='Attr' type='xs:integer' />
\r
449 // No prefixes on tables and columns
\r
450 DataSet ds = new DataSet ();
\r
451 ds.ReadXmlSchema (new StringReader (xs));
\r
452 AssertDataSet ("ds", ds, "DS", 3, 1);
\r
453 DataTable dt = ds.Tables [0];
\r
454 AssertDataTable ("R3", dt, "R3", 3, 0, 0, 0, 0, 0);
\r
455 AssertDataColumn ("col1", dt.Columns [0], "Attr", true, false, 0, 1, "Attr", MappingType.Attribute, typeof (Int64), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
459 public void ReadTest1 ()
\r
461 DataSet ds = CreateTestSet ();
\r
463 StringWriter sw = new StringWriter ();
\r
464 ds.WriteXmlSchema (sw);
\r
466 string schema = sw.ToString ();
\r
469 ds = new DataSet ();
\r
470 ds.ReadXmlSchema (new XmlTextReader (schema, XmlNodeType.Document, null));
\r
471 ReadTest1Check (ds);
\r
473 // ReadXml() should also be the same
\r
474 ds = new DataSet ();
\r
475 ds.ReadXml (new XmlTextReader (schema, XmlNodeType.Document, null));
\r
476 ReadTest1Check (ds);
\r
479 private void ReadTest1Check (DataSet ds)
\r
481 AssertDataSet ("dataset", ds, "NewDataSet", 2, 1);
\r
482 AssertDataTable ("tbl1", ds.Tables [0], "Table1", 3, 0, 0, 1, 1, 0);
\r
483 AssertDataTable ("tbl2", ds.Tables [1], "Table2", 3, 0, 1, 0, 1, 0);
\r
485 DataRelation rel = ds.Relations [0];
\r
486 AssertDataRelation ("rel", rel, "Rel1", false,
\r
487 new string [] {"Column1_3"},
\r
488 new string [] {"Column2_1"}, true, true);
\r
489 AssertUniqueConstraint ("uc", rel.ParentKeyConstraint,
\r
490 "Constraint1", false, new string [] {"Column1_3"});
\r
491 AssertForeignKeyConstraint ("fk", rel.ChildKeyConstraint, "Rel1",
\r
492 AcceptRejectRule.None, Rule.Cascade, Rule.Cascade,
\r
493 new string [] {"Column2_1"},
\r
494 new string [] {"Column1_3"});
\r
499 public void TestSampleFileNoTables ()
\r
501 DataSet ds = new DataSet ();
\r
502 ds.ReadXmlSchema ("Test/System.Data/schemas/test001.xsd");
\r
503 AssertDataSet ("001", ds, "NewDataSet", 0, 0);
\r
505 ds = new DataSet ();
\r
506 ds.ReadXmlSchema ("Test/System.Data/schemas/test002.xsd");
\r
507 AssertDataSet ("002", ds, "NewDataSet", 0, 0);
\r
509 ds = new DataSet ();
\r
510 ds.ReadXmlSchema ("Test/System.Data/schemas/test003.xsd");
\r
511 AssertDataSet ("003", ds, "NewDataSet", 0, 0);
\r
513 ds = new DataSet ();
\r
514 ds.ReadXmlSchema ("Test/System.Data/schemas/test004.xsd");
\r
515 AssertDataSet ("004", ds, "NewDataSet", 0, 0);
\r
519 public void TestSampleFileSimpleTables ()
\r
521 DataSet ds = new DataSet ();
\r
522 ds.ReadXmlSchema ("Test/System.Data/schemas/test005.xsd");
\r
523 AssertDataSet ("005", ds, "NewDataSet", 1, 0);
\r
524 DataTable dt = ds.Tables [0];
\r
525 AssertDataTable ("tab", dt, "foo", 2, 0, 0, 0, 0, 0);
\r
526 AssertDataColumn ("attr", 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);
\r
527 AssertDataColumn ("text", dt.Columns [1], "foo_text", false, false, 0, 1, "foo_text", MappingType.SimpleContent, typeof (long), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
529 ds = new DataSet ();
\r
530 ds.ReadXmlSchema ("Test/System.Data/schemas/test006.xsd");
\r
531 AssertDataSet ("006", ds, "NewDataSet", 1, 0);
\r
532 dt = ds.Tables [0];
\r
533 AssertDataTable ("tab", dt, "foo", 2, 0, 0, 0, 0, 0);
\r
534 AssertDataColumn ("att1", dt.Columns ["att1"], "att1", true, false, 0, 1, "att1", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, /*0*/-1, String.Empty, false, false);
\r
535 AssertDataColumn ("att2", dt.Columns ["att2"], "att2", true, false, 0, 1, "att2", MappingType.Attribute, typeof (int), 2, String.Empty, -1, String.Empty, /*1*/-1, String.Empty, false, false);
\r
539 public void TestSampleFileComplexTables ()
\r
541 // Nested simple type element
\r
542 DataSet ds = new DataSet ();
\r
543 ds.ReadXmlSchema ("Test/System.Data/schemas/test007.xsd");
\r
544 AssertDataSet ("007", ds, "NewDataSet", 2, 1);
\r
545 DataTable dt = ds.Tables [0];
\r
546 AssertDataTable ("tab1", dt, "uno", 1, 0, 0, 1, 1, 1);
\r
547 AssertDataColumn ("id", dt.Columns [0], "uno_Id", false, true, 0, 1, "uno_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, "urn:foo", 0, String.Empty, false, true);
\r
549 dt = ds.Tables [1];
\r
550 AssertDataTable ("tab2", dt, "des", 2, 0, 1, 0, 1, 0);
\r
551 AssertDataColumn ("child", dt.Columns [0], "tres", false, false, 0, 1, "tres", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
552 AssertDataColumn ("id", dt.Columns [1], "uno_Id", true, false, 0, 1, "uno_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
554 // External simple type element
\r
555 ds = new DataSet ();
\r
556 ds.ReadXmlSchema ("Test/System.Data/schemas/test008.xsd");
\r
557 AssertDataSet ("008", ds, "NewDataSet", 2, 1);
\r
558 dt = ds.Tables [0];
\r
559 AssertDataTable ("tab1", dt, "uno", 1, 0, 0, 1, 1, 1);
\r
560 AssertDataColumn ("id", dt.Columns [0], "uno_Id", false, true, 0, 1, "uno_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, "urn:foo", 0, String.Empty, false, true);
\r
562 dt = ds.Tables [1];
\r
563 AssertDataTable ("tab2", dt, "des", 2, 0, 1, 0, 1, 0);
\r
564 AssertDataColumn ("child", dt.Columns [0], "tres", false, false, 0, 1, "tres", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, "urn:foo", 0, String.Empty, false, false);
\r
565 AssertDataColumn ("id", dt.Columns [1], "uno_Id", true, false, 0, 1, "uno_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
570 [Category ("NotDotNet")]
\r
571 // MS.NET has a bug on handling default value of referenced
\r
573 public void TestSampleFileValueConstraints ()
\r
575 DataSet ds = new DataSet ();
\r
576 ds.ReadXmlSchema ("Test/System.Data/schemas/test009.xsd");
\r
577 AssertDataSet ("009", ds, "NewDataSet", 2, 1);
\r
579 DataTable dt = ds.Tables [0];
\r
580 AssertDataTable ("tab1", dt, "uno", 2, 0, 0, 1, 1, 1);
\r
581 AssertDataColumn ("global", dt.Columns [0], "global", true, false, 0, 1, "global", MappingType.Attribute, typeof (string), "er", String.Empty, -1, "urn:foo", 0, String.Empty, false, false);
\r
582 AssertDataColumn ("id", dt.Columns [1], "uno_Id", false, true, 0, 1, "uno_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, "urn:foo", 1, String.Empty, false, true);
\r
584 // Here "XmlSchemaComplexType.AttributeUses" does not
\r
585 // always return attribute uses in a certain order, thus
\r
586 // here Columns indexer is accessed by name (actually
\r
587 // MS.NET returns "global" in prior to "local" for
\r
588 // Columns[0], even though "local" is defined in prior.
\r
589 dt = ds.Tables [1];
\r
590 AssertDataTable ("dos", dt, "des", 4, 0, 1, 0, 1, 0);
\r
591 AssertDataColumn ("dos.child", dt.Columns ["local"], "local", true, false, 0, 1, "local", MappingType.Attribute, typeof (string), "san", String.Empty, -1, String.Empty, /*0*/-1, String.Empty, false, false);
\r
592 // LAMESPEC: (MS BUG) default value is overwritten, but MS.NET is ignorant of that.
\r
593 #if BUGGY_MS_COMPATIBLE
\r
594 AssertDataColumn ("dos.global", dt.Columns ["global"], "global", true, false, 0, 1, "global", MappingType.Attribute, typeof (string), "er", String.Empty, -1, "urn:foo", /*1*/-1, String.Empty, false, false);
\r
596 AssertDataColumn ("dos.global", dt.Columns ["global"], "global", true, false, 0, 1, "global", MappingType.Attribute, typeof (string), "si", String.Empty, -1, "urn:foo", /*1*/-1, String.Empty, false, false);
\r
598 AssertDataColumn ("dos.tres", dt.Columns [2], "tres", false, false, 0, 1, "tres", MappingType.Element, typeof (string), "yi", String.Empty, -1, "urn:foo", 2, String.Empty, false, false);
\r
599 AssertDataColumn ("uno.id", dt.Columns [3], "uno_Id", true, false, 0, 1, "uno_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 3, String.Empty, false, false);
\r
601 AssertDataRelation ("rel", ds.Relations [0], "uno_des", true, new string [] {"uno_Id"}, new string [] {"uno_Id"}, true, true);
\r
605 public void TestSampleFileImportSimple ()
\r
607 DataSet ds = new DataSet ();
\r
608 ds.ReadXmlSchema ("Test/System.Data/schemas/test010.xsd");
\r
609 AssertDataSet ("010", ds, "NewDataSet", 1, 0);
\r
611 DataTable dt = ds.Tables [0];
\r
612 AssertDataTable ("root", dt, "foo", 1, 0, 0, 0, 0, 0);
\r
613 AssertDataColumn ("simple", dt.Columns [0], "bar", false, false, 0, 1, "bar", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
617 public void TestSampleFileComplexTables2 ()
\r
619 DataSet ds = new DataSet ();
\r
620 ds.ReadXmlSchema ("Test/System.Data/schemas/test011.xsd");
\r
621 AssertDataSet ("011", ds, "NewDataSet", 2, 1);
\r
623 DataTable dt = ds.Tables [0];
\r
624 AssertDataTable ("root", dt, "e", 3, 0, 1, 0, 1, 0);
\r
625 AssertDataColumn ("attr", dt.Columns [0], "a", true, false, 0, 1, "a", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, "http://xsdtesting", 0, String.Empty, false, false);
\r
626 AssertDataColumn ("simple", dt.Columns [1], "e_text", false, false, 0, 1, "e_text", MappingType.SimpleContent, typeof (decimal), DBNull.Value, String.Empty, -1, "http://xsdtesting", 1, String.Empty, false, false);
\r
627 AssertDataColumn ("hidden", dt.Columns [2], "root_Id", true, false, 0, 1, "root_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, "http://xsdtesting", 2, String.Empty, false, false);
\r
629 dt = ds.Tables [1];
\r
630 AssertDataTable ("root", dt, "root", 1, 0, 0, 1, 1, 1);
\r
631 AssertDataColumn ("elem", dt.Columns [0], "root_Id", false, true, 0, 1, "root_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, "http://xsdtesting", 0, String.Empty, false, true);
\r
633 AssertDataRelation ("rel", ds.Relations [0], "root_e", true, new string [] {"root_Id"}, new string [] {"root_Id"}, true, true);
\r
637 public void TestSampleFileComplexTables3 ()
\r
639 DataSet ds = new DataSet ();
\r
640 ds.ReadXmlSchema ("Test/System.Data/schemas/test013.xsd");
\r
641 AssertDataSet ("013", ds, "root", 1, 0);
\r
643 DataTable dt = ds.Tables [0];
\r
644 AssertDataTable ("root", dt, "e", 2, 0, 0, 0, 0, 0);
\r
645 AssertDataColumn ("attr", dt.Columns [0], "a", true, false, 0, 1, "a", MappingType.Attribute, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
646 AssertDataColumn ("simple", dt.Columns [1], "e_text", false, false, 0, 1, "e_text", MappingType.SimpleContent, typeof (decimal), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
651 public void TestSampleFileXPath ()
\r
653 DataSet ds = new DataSet ();
\r
654 ds.ReadXmlSchema ("Test/System.Data/schemas/test103.xsd");
\r
658 public void TestAnnotatedRelation1 ()
\r
660 DataSet ds = new DataSet ();
\r
661 ds.ReadXmlSchema ("Test/System.Data/schemas/test101.xsd");
\r
662 AssertDataSet ("101", ds, "root", 2, 1);
\r
663 DataTable dt = ds.Tables [0];
\r
664 AssertDataTable ("parent_table", dt, "p", 2, 0, 0, 1, 0, 0);
\r
665 AssertDataColumn ("pk", dt.Columns [0], "pk", false, false, 0, 1, "pk", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
667 dt = ds.Tables [1];
\r
668 AssertDataTable ("child_table", dt, "c", 2, 0, 1, 0, 0, 0);
\r
669 AssertDataColumn ("fk", dt.Columns [0], "fk", false, false, 0, 1, "fk", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
671 AssertDataRelation ("rel", ds.Relations [0], "rel", false, new string [] {"pk"}, new string [] {"fk"}, false, false);
\r
675 public void TestAnnotatedRelation2 ()
\r
677 DataSet ds = new DataSet ();
\r
678 ds.ReadXmlSchema ("Test/System.Data/schemas/test102.xsd");
\r
679 AssertDataSet ("102", ds, "ds", 2, 1);
\r
680 DataTable dt = ds.Tables [0];
\r
681 AssertDataTable ("parent_table", dt, "p", 2, 0, 0, 1, 0, 0);
\r
682 AssertDataColumn ("pk", dt.Columns [0], "pk", false, false, 0, 1, "pk", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
684 dt = ds.Tables [1];
\r
685 AssertDataTable ("child_table", dt, "c", 2, 0, 1, 0, 0, 0);
\r
686 AssertDataColumn ("fk", dt.Columns [0], "fk", false, false, 0, 1, "fk", MappingType.Element, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
688 AssertDataRelation ("rel", ds.Relations [0], "rel", true, new string [] {"pk"}, new string [] {"fk"}, false, false);
\r
692 public void RepeatableSimpleElement ()
\r
694 DataSet ds = new DataSet ();
\r
695 ds.ReadXmlSchema ("Test/System.Data/schemas/test012.xsd");
\r
696 AssertDataSet ("012", ds, "NewDataSet", 2, 1);
\r
697 DataTable dt = ds.Tables [0];
\r
698 AssertDataTable ("parent", dt, "Foo", 1, 0, 0, 1, 1, 1);
\r
699 AssertDataColumn ("key", dt.Columns [0], "Foo_Id", false, true, 0, 1, "Foo_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, true);
\r
701 dt = ds.Tables [1];
\r
702 AssertDataTable ("repeated", dt, "Bar", 2, 0, 1, 0, 1, 0);
\r
703 AssertDataColumn ("data", dt.Columns [0], "Bar_Column", false, false, 0, 1, "Bar_Column", MappingType.SimpleContent, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
704 AssertDataColumn ("refkey", dt.Columns [1], "Foo_Id", true, false, 0, 1, "Foo_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
706 AssertDataRelation ("rel", ds.Relations [0], "Foo_Bar", true, new string [] {"Foo_Id"}, new string [] {"Foo_Id"}, true, true);
\r
710 public void TestMoreThanOneRepeatableColumns ()
\r
712 DataSet ds = new DataSet ();
\r
713 ds.ReadXmlSchema ("Test/System.Data/schemas/test014.xsd");
\r
714 AssertDataSet ("014", ds, "NewDataSet", 3, 2);
\r
716 DataTable dt = ds.Tables [0];
\r
717 AssertDataTable ("parent", dt, "root", 1, 0, 0, 2, 1, 1);
\r
718 AssertDataColumn ("key", dt.Columns [0], "root_Id", false, true, 0, 1, "root_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, true);
\r
720 dt = ds.Tables [1];
\r
721 AssertDataTable ("repeated", dt, "x", 2, 0, 1, 0, 1, 0);
\r
722 AssertDataColumn ("data_1", dt.Columns [0], "x_Column", false, false, 0, 1, "x_Column", MappingType.SimpleContent, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
723 AssertDataColumn ("refkey_1", dt.Columns [1], "root_Id", true, false, 0, 1, "root_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
725 dt = ds.Tables [2];
\r
726 AssertDataTable ("repeated", dt, "y", 2, 0, 1, 0, 1, 0);
\r
727 AssertDataColumn ("data", dt.Columns [0], "y_Column", false, false, 0, 1, "y_Column", MappingType.SimpleContent, typeof (string), DBNull.Value, String.Empty, -1, String.Empty, 0, String.Empty, false, false);
\r
728 AssertDataColumn ("refkey", dt.Columns [1], "root_Id", true, false, 0, 1, "root_Id", MappingType.Hidden, typeof (int), DBNull.Value, String.Empty, -1, String.Empty, 1, String.Empty, false, false);
\r
730 AssertDataRelation ("rel", ds.Relations [0], "root_x", true, new string [] {"root_Id"}, new string [] {"root_Id"}, true, true);
\r
732 AssertDataRelation ("rel", ds.Relations [1], "root_y", true, new string [] {"root_Id"}, new string [] {"root_Id"}, true, true);
\r
736 public void AutoIncrementStep ()
\r
738 DataSet ds = new DataSet("testds");
\r
739 DataTable tbl = ds.Tables.Add("testtbl");
\r
740 DataColumn col = tbl.Columns.Add("id", typeof(int));
\r
741 col.AutoIncrement = true;
\r
742 col.AutoIncrementSeed = -1;
\r
743 col.AutoIncrementStep = -1;
\r
744 tbl.Columns.Add("data", typeof(string));
\r
745 Assert (ds.GetXmlSchema ().IndexOf ("AutoIncrementStep") > 0);
\r