1 // MonoTests.System.Data.DataSetTest.cs
4 // Ville Palo <vi64pa@koti.soon.fi>
5 // Martin Willemoes Hansen <mwh@sysrq.dk>
6 // Atsushi Enomoto <atsushi@ximian.com>
8 // (C) Copyright 2002 Ville Palo
9 // (C) Copyright 2003 Martin Willemoes Hansen
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using NUnit.Framework;
38 using System.Xml.Serialization;
41 using System.Data.SqlTypes;
42 using System.Globalization;
43 using System.Threading;
46 using AssertType = NUnit.Framework.Assert;
48 namespace MonoTests.System.Data
51 public class DataSetTest : DataSetAssertion
53 string EOL = Environment.NewLine;
54 CultureInfo currentCultureBackup;
57 public void GetReady()
59 currentCultureBackup = Thread.CurrentThread.CurrentCulture;
60 Thread.CurrentThread.CurrentCulture = new CultureInfo ("fi-FI");
64 public void Teardown ()
66 Thread.CurrentThread.CurrentCulture = currentCultureBackup;
70 public void Properties ()
72 DataSet ds = new DataSet ();
73 AssertEquals ("default namespace", String.Empty, ds.Namespace);
74 ds.Namespace = null; // setting null == setting ""
75 AssertEquals ("after setting null to namespace", String.Empty, ds.Namespace);
77 AssertEquals ("default prefix", String.Empty, ds.Prefix);
78 ds.Prefix = null; // setting null == setting ""
79 AssertEquals ("after setting null to prefix", String.Empty, ds.Prefix);
83 public void ReadXmlSchema ()
85 DataSet ds = new DataSet ();
86 ds.ReadXmlSchema ("Test/System.Data/own_schema.xsd");
88 AssertEquals ("test#01", 2, ds.Tables.Count);
89 DataTable Table = ds.Tables [0];
90 AssertEquals ("test#02", "test_table", Table.TableName);
91 AssertEquals ("test#03", "", Table.Namespace);
92 AssertEquals ("test#04", 2, Table.Columns.Count);
93 AssertEquals ("test#05", 0, Table.Rows.Count);
94 AssertEquals ("test#06", false, Table.CaseSensitive);
95 AssertEquals ("test#07", 1, Table.Constraints.Count);
96 AssertEquals ("test#08", "", Table.Prefix);
98 Constraint cons = Table.Constraints [0];
99 AssertEquals ("test#09", "Constraint1", cons.ConstraintName.ToString ());
100 AssertEquals ("test#10", "Constraint1", cons.ToString ());
102 DataColumn column = Table.Columns [0];
103 AssertEquals ("test#11", true, column.AllowDBNull);
104 AssertEquals ("test#12", false, column.AutoIncrement);
105 AssertEquals ("test#13", 0L, column.AutoIncrementSeed);
106 AssertEquals ("test#14", 1L, column.AutoIncrementStep);
107 AssertEquals ("test#15", "test", column.Caption);
108 AssertEquals ("test#16", "Element", column.ColumnMapping.ToString ());
109 AssertEquals ("test#17", "first", column.ColumnName);
110 AssertEquals ("test#18", "System.String", column.DataType.ToString ());
111 AssertEquals ("test#19", "test_default_value", column.DefaultValue.ToString ());
112 AssertEquals ("test#20", false, column.DesignMode);
113 AssertEquals ("test#21", "", column.Expression);
114 AssertEquals ("test#22", 100, column.MaxLength);
115 AssertEquals ("test#23", "", column.Namespace);
116 AssertEquals ("test#24", 0, column.Ordinal);
117 AssertEquals ("test#25", "", column.Prefix);
118 AssertEquals ("test#26", false, column.ReadOnly);
119 AssertEquals ("test#27", true, column.Unique);
121 DataColumn column2 = Table.Columns [1];
122 AssertEquals ("test#28", true, column2.AllowDBNull);
123 AssertEquals ("test#29", false, column2.AutoIncrement);
124 AssertEquals ("test#30", 0L, column2.AutoIncrementSeed);
125 AssertEquals ("test#31", 1L, column2.AutoIncrementStep);
126 AssertEquals ("test#32", "second", column2.Caption);
127 AssertEquals ("test#33", "Element", column2.ColumnMapping.ToString ());
128 AssertEquals ("test#34", "second", column2.ColumnName);
129 AssertEquals ("test#35", "System.Data.SqlTypes.SqlGuid", column2.DataType.ToString ());
130 AssertEquals ("test#36", "", column2.DefaultValue.ToString ());
131 AssertEquals ("test#37", false, column2.DesignMode);
132 AssertEquals ("test#38", "", column2.Expression);
133 AssertEquals ("test#39", -1, column2.MaxLength);
134 AssertEquals ("test#40", "", column2.Namespace);
135 AssertEquals ("test#41", 1, column2.Ordinal);
136 AssertEquals ("test#42", "", column2.Prefix);
137 AssertEquals ("test#43", false, column2.ReadOnly);
138 AssertEquals ("test#44", false, column2.Unique);
140 DataTable Table2 = ds.Tables [1];
141 AssertEquals ("test#45", "second_test_table", Table2.TableName);
142 AssertEquals ("test#46", "", Table2.Namespace);
143 AssertEquals ("test#47", 1, Table2.Columns.Count);
144 AssertEquals ("test#48", 0, Table2.Rows.Count);
145 AssertEquals ("test#49", false, Table2.CaseSensitive);
146 AssertEquals ("test#50", 1, Table2.Constraints.Count);
147 AssertEquals ("test#51", "", Table2.Prefix);
149 DataColumn column3 = Table2.Columns [0];
150 AssertEquals ("test#52", true, column3.AllowDBNull);
151 AssertEquals ("test#53", false, column3.AutoIncrement);
152 AssertEquals ("test#54", 0L, column3.AutoIncrementSeed);
153 AssertEquals ("test#55", 1L, column3.AutoIncrementStep);
154 AssertEquals ("test#56", "second_first", column3.Caption);
155 AssertEquals ("test#57", "Element", column3.ColumnMapping.ToString ());
156 AssertEquals ("test#58", "second_first", column3.ColumnName);
157 AssertEquals ("test#59", "System.String", column3.DataType.ToString ());
158 AssertEquals ("test#60", "default_value", column3.DefaultValue.ToString ());
159 AssertEquals ("test#61", false, column3.DesignMode);
160 AssertEquals ("test#62", "", column3.Expression);
161 AssertEquals ("test#63", 100, column3.MaxLength);
162 AssertEquals ("test#64", "", column3.Namespace);
163 AssertEquals ("test#65", 0, column3.Ordinal);
164 AssertEquals ("test#66", "", column3.Prefix);
165 AssertEquals ("test#67", false, column3.ReadOnly);
166 AssertEquals ("test#68", true, column3.Unique);
170 public void OwnWriteXmlSchema ()
172 DataSet ds = new DataSet ("test_dataset");
173 DataTable table = new DataTable ("test_table");
174 DataColumn column = new DataColumn ("first", typeof (string));
175 column.AllowDBNull = true;
176 column.DefaultValue = "test_default_value";
177 column.MaxLength = 100;
178 column.Caption = "test";
179 column.Unique = true;
180 table.Columns.Add (column);
182 DataColumn column2 = new DataColumn ("second", typeof (SqlGuid));
183 column2.ColumnMapping = MappingType.Element;
184 table.Columns.Add (column2);
185 ds.Tables.Add (table);
187 DataTable table2 = new DataTable ("second_test_table");
188 DataColumn column3 = new DataColumn ("second_first", typeof (string));
189 column3.AllowDBNull = true;
190 column3.DefaultValue = "default_value";
191 column3.MaxLength = 100;
192 column3.Unique = true;
193 table2.Columns.Add (column3);
194 ds.Tables.Add (table2);
196 TextWriter writer = new StringWriter ();
197 ds.WriteXmlSchema (writer);
199 string TextString = GetNormalizedSchema (writer.ToString ());
200 // string TextString = writer.ToString ();
202 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
203 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
204 AssertEquals ("test#01", "<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring);
206 substring = TextString.Substring (0, TextString.IndexOf(EOL));
207 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
208 // This is original DataSet.WriteXmlSchema() output
209 // AssertEquals ("test#02", "<xs:schema id=\"test_dataset\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">", substring);
210 AssertEquals ("test#02", "<xs:schema id=\"test_dataset\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring);
212 substring = TextString.Substring (0, TextString.IndexOf(EOL));
213 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
214 // This is original DataSet.WriteXmlSchema() output
215 // AssertEquals ("test#03", " <xs:element name=\"test_dataset\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
216 AssertEquals ("test#03", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"test_dataset\">", substring);
218 substring = TextString.Substring (0, TextString.IndexOf(EOL));
219 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
220 AssertEquals ("test#04", " <xs:complexType>", substring);
222 substring = TextString.Substring (0, TextString.IndexOf(EOL));
223 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
224 AssertEquals ("test#05", " <xs:choice maxOccurs=\"unbounded\">", substring);
226 substring = TextString.Substring (0, TextString.IndexOf(EOL));
227 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
228 AssertEquals ("test#06", " <xs:element name=\"test_table\">", substring);
230 substring = TextString.Substring (0, TextString.IndexOf(EOL));
231 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
232 AssertEquals ("test#07", " <xs:complexType>", substring);
234 substring = TextString.Substring (0, TextString.IndexOf(EOL));
235 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
236 AssertEquals ("test#08", " <xs:sequence>", substring);
238 substring = TextString.Substring (0, TextString.IndexOf(EOL));
239 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
240 // This is original DataSet.WriteXmlSchema() output
241 // AssertEquals ("test#09", " <xs:element name=\"first\" msdata:Caption=\"test\" default=\"test_default_value\" minOccurs=\"0\">", substring);
242 AssertEquals ("test#09", " <xs:element default=\"test_default_value\" minOccurs=\"0\" msdata:Caption=\"test\" name=\"first\">", substring);
244 substring = TextString.Substring (0, TextString.IndexOf(EOL));
245 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
246 AssertEquals ("test#10", " <xs:simpleType>", substring);
248 substring = TextString.Substring (0, TextString.IndexOf(EOL));
249 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
250 AssertEquals ("test#11", " <xs:restriction base=\"xs:string\">", substring);
252 substring = TextString.Substring (0, TextString.IndexOf(EOL));
253 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
254 AssertEquals ("test#12", " <xs:maxLength value=\"100\" />", substring);
256 substring = TextString.Substring (0, TextString.IndexOf(EOL));
257 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
258 AssertEquals ("test#13", " </xs:restriction>", substring);
260 substring = TextString.Substring (0, TextString.IndexOf(EOL));
261 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
262 AssertEquals ("test#14", " </xs:simpleType>", substring);
264 substring = TextString.Substring (0, TextString.IndexOf(EOL));
265 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
266 AssertEquals ("test#15", " </xs:element>", substring);
268 substring = TextString.Substring (0, TextString.IndexOf(EOL));
269 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
270 // This is original DataSet.WriteXmlSchema() output
271 // AssertEquals ("test#16", " <xs:element name=\"second\" msdata:DataType=\"System.Data.SqlTypes.SqlGuid, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" type=\"xs:string\" minOccurs=\"0\" />", substring);
273 AssertEquals ("test#16", " <xs:element minOccurs=\"0\" msdata:DataType=\"System.Data.SqlTypes.SqlGuid, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"second\" type=\"xs:string\" />", substring);
275 AssertEquals ("test#16", " <xs:element minOccurs=\"0\" msdata:DataType=\"System.Data.SqlTypes.SqlGuid, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"second\" type=\"xs:string\" />", substring);
277 if (substring.IndexOf ("<xs:element") < 0)
278 Fail ("test#16: " + substring);
279 if (substring.IndexOf ("name=\"second\"") < 0)
280 Fail ("test#16: " + substring);
281 if (substring.IndexOf ("msdata:DataType=\"System.Data.SqlTypes.SqlGuid, System.Data, Version=") < 0)
282 Fail ("test#16: " + substring);
283 if (substring.IndexOf ("type=\"xs:string\"") < 0)
284 Fail ("test#16: " + substring);
285 if (substring.IndexOf ("minOccurs=\"0\"") < 0)
286 Fail ("test#16: " + substring);
288 substring = TextString.Substring (0, TextString.IndexOf(EOL));
289 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
290 AssertEquals ("test#17", " </xs:sequence>", substring);
292 substring = TextString.Substring (0, TextString.IndexOf(EOL));
293 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
294 AssertEquals ("test#18", " </xs:complexType>", substring);
296 substring = TextString.Substring (0, TextString.IndexOf(EOL));
297 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
298 AssertEquals ("test#19", " </xs:element>", substring);
300 substring = TextString.Substring (0, TextString.IndexOf(EOL));
301 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
302 AssertEquals ("test#20", " <xs:element name=\"second_test_table\">", substring);
304 substring = TextString.Substring (0, TextString.IndexOf(EOL));
305 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
306 AssertEquals ("test#21", " <xs:complexType>", substring);
308 substring = TextString.Substring (0, TextString.IndexOf(EOL));
309 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
310 AssertEquals ("test#22", " <xs:sequence>", substring);
312 substring = TextString.Substring (0, TextString.IndexOf(EOL));
313 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
314 // This is original DataSet.WriteXmlSchema() output
315 // AssertEquals ("test#23", " <xs:element name=\"second_first\" default=\"default_value\" minOccurs=\"0\">", substring);
316 AssertEquals ("test#23", " <xs:element default=\"default_value\" minOccurs=\"0\" name=\"second_first\">", substring);
318 substring = TextString.Substring (0, TextString.IndexOf(EOL));
319 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
320 AssertEquals ("test#24", " <xs:simpleType>", substring);
322 substring = TextString.Substring (0, TextString.IndexOf(EOL));
323 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
324 AssertEquals ("test#25", " <xs:restriction base=\"xs:string\">", substring);
326 substring = TextString.Substring (0, TextString.IndexOf(EOL));
327 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
328 AssertEquals ("test#26", " <xs:maxLength value=\"100\" />", substring);
330 substring = TextString.Substring (0, TextString.IndexOf(EOL));
331 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
332 AssertEquals ("test#27", " </xs:restriction>", substring);
334 substring = TextString.Substring (0, TextString.IndexOf(EOL));
335 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
336 AssertEquals ("test#28", " </xs:simpleType>", substring);
338 substring = TextString.Substring (0, TextString.IndexOf(EOL));
339 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
340 AssertEquals ("test#29", " </xs:element>", substring);
342 substring = TextString.Substring (0, TextString.IndexOf(EOL));
343 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
344 AssertEquals ("test#30", " </xs:sequence>", substring);
346 substring = TextString.Substring (0, TextString.IndexOf(EOL));
347 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
348 AssertEquals ("test#31", " </xs:complexType>", substring);
350 substring = TextString.Substring (0, TextString.IndexOf(EOL));
351 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
352 AssertEquals ("test#32", " </xs:element>", substring);
354 substring = TextString.Substring (0, TextString.IndexOf(EOL));
355 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
356 AssertEquals ("test#33", " </xs:choice>", substring);
358 substring = TextString.Substring (0, TextString.IndexOf(EOL));
359 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
360 AssertEquals ("test#34", " </xs:complexType>", substring);
362 substring = TextString.Substring (0, TextString.IndexOf(EOL));
363 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
364 AssertEquals ("test#36", " <xs:unique name=\"Constraint1\">", substring);
366 substring = TextString.Substring (0, TextString.IndexOf(EOL));
367 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
368 AssertEquals ("test#37", " <xs:selector xpath=\".//test_table\" />", substring);
370 substring = TextString.Substring (0, TextString.IndexOf(EOL));
371 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
372 AssertEquals ("test#38", " <xs:field xpath=\"first\" />", substring);
374 substring = TextString.Substring (0, TextString.IndexOf(EOL));
375 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
376 AssertEquals ("test#39", " </xs:unique>", substring);
378 substring = TextString.Substring (0, TextString.IndexOf(EOL));
379 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
380 // This is original DataSet.WriteXmlSchema() output
381 // AssertEquals ("test#40", " <xs:unique name=\"second_test_table_Constraint1\" msdata:ConstraintName=\"Constraint1\">", substring);
382 AssertEquals ("test#40", " <xs:unique msdata:ConstraintName=\"Constraint1\" name=\"second_test_table_Constraint1\">", substring);
384 substring = TextString.Substring (0, TextString.IndexOf(EOL));
385 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
386 AssertEquals ("test#41", " <xs:selector xpath=\".//second_test_table\" />", substring);
388 substring = TextString.Substring (0, TextString.IndexOf(EOL));
389 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
390 AssertEquals ("test#42", " <xs:field xpath=\"second_first\" />", substring);
392 substring = TextString.Substring (0, TextString.IndexOf(EOL));
393 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
394 AssertEquals ("test#43", " </xs:unique>", substring);
396 substring = TextString.Substring (0, TextString.IndexOf(EOL));
397 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
398 AssertEquals ("test#44", " </xs:element>", substring);
399 AssertEquals ("test#45", "</xs:schema>", TextString);
403 public void ReadWriteXml ()
405 DataSet ds = new DataSet ();
406 ds.ReadXml ("Test/System.Data/region.xml");
407 TextWriter writer = new StringWriter ();
408 ds.WriteXml (writer);
410 string TextString = writer.ToString ();
411 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
412 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
413 AssertEquals ("test#01", "<Root>", substring);
415 substring = TextString.Substring (0, TextString.IndexOf(EOL));
416 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
417 AssertEquals ("test#02", " <Region>", substring);
419 substring = TextString.Substring (0, TextString.IndexOf(EOL));
420 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
421 AssertEquals ("test#03", " <RegionID>1</RegionID>", substring);
422 // Here the end of line is text markup "\n"
423 substring = TextString.Substring (0, TextString.IndexOf('\n'));
424 TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
425 AssertEquals ("test#04", " <RegionDescription>Eastern", substring);
427 substring = TextString.Substring (0, TextString.IndexOf(EOL));
428 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
429 AssertEquals ("test#05", " </RegionDescription>", substring);
431 substring = TextString.Substring (0, TextString.IndexOf(EOL));
432 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
433 AssertEquals ("test#06", " </Region>", substring);
435 substring = TextString.Substring (0, TextString.IndexOf(EOL));
436 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
437 AssertEquals ("test#07", " <Region>", substring);
439 substring = TextString.Substring (0, TextString.IndexOf(EOL));
440 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
441 AssertEquals ("test#08", " <RegionID>2</RegionID>", substring);
443 // Here the end of line is text markup "\n"
444 substring = TextString.Substring (0, TextString.IndexOf('\n'));
445 TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
446 AssertEquals ("test#09", " <RegionDescription>Western", substring);
448 substring = TextString.Substring (0, TextString.IndexOf(EOL));
449 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
450 AssertEquals ("test#10", " </RegionDescription>", substring);
452 substring = TextString.Substring (0, TextString.IndexOf(EOL));
453 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
454 AssertEquals ("test#11", " </Region>", substring);
456 AssertEquals ("test#11", "</Root>", TextString);
460 public void ReadWriteXmlDiffGram ()
462 DataSet ds = new DataSet ();
463 // It is not a diffgram, so no data loading should be done.
464 ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.DiffGram);
465 TextWriter writer = new StringWriter ();
466 ds.WriteXml (writer);
468 string TextString = writer.ToString ();
469 AssertEquals ("test#01", "<NewDataSet />", TextString);
471 ds.WriteXml (writer, XmlWriteMode.DiffGram);
472 TextString = writer.ToString ();
474 AssertEquals ("test#02", "<NewDataSet /><diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\" />", TextString);
478 ds.ReadXml ("Test/System.Data/region.xml");
479 DataTable table = ds.Tables ["Region"];
480 table.Rows [0] [0] = "64";
481 ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.DiffGram);
482 ds.WriteXml (writer, XmlWriteMode.DiffGram);
484 TextString = writer.ToString ();
485 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
486 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
487 AssertEquals ("test#03", "<NewDataSet /><diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\" /><diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\">",substring);
489 substring = TextString.Substring (0, TextString.IndexOf(EOL));
490 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
491 AssertEquals ("test#04", " <Root>", substring);
493 substring = TextString.Substring (0, TextString.IndexOf(EOL));
494 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
495 AssertEquals ("test#05", " <Region diffgr:id=\"Region1\" msdata:rowOrder=\"0\" diffgr:hasChanges=\"inserted\">", substring);
497 substring = TextString.Substring (0, TextString.IndexOf(EOL));
498 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
499 AssertEquals ("test#06", " <RegionID>64</RegionID>", substring);
501 // not EOL but literal '\n'
502 substring = TextString.Substring (0, TextString.IndexOf('\n'));
503 TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
504 AssertEquals ("test#07", " <RegionDescription>Eastern", substring);
506 substring = TextString.Substring (0, TextString.IndexOf(EOL));
507 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
508 AssertEquals ("test#07", " </RegionDescription>", substring);
510 substring = TextString.Substring (0, TextString.IndexOf(EOL));
511 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
512 AssertEquals ("test#08", " </Region>", substring);
514 substring = TextString.Substring (0, TextString.IndexOf(EOL));
515 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
516 AssertEquals ("test#09", " <Region diffgr:id=\"Region2\" msdata:rowOrder=\"1\" diffgr:hasChanges=\"inserted\">", substring);
518 substring = TextString.Substring (0, TextString.IndexOf(EOL));
519 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
520 AssertEquals ("test#10", " <RegionID>2</RegionID>", substring);
522 // not EOL but literal '\n'
523 substring = TextString.Substring (0, TextString.IndexOf('\n'));
524 TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
525 AssertEquals ("test#11", " <RegionDescription>Western", substring);
527 substring = TextString.Substring (0, TextString.IndexOf(EOL));
528 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
529 AssertEquals ("test#12", " </RegionDescription>", substring);
531 substring = TextString.Substring (0, TextString.IndexOf(EOL));
532 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
533 AssertEquals ("test#13", " </Region>", substring);
535 substring = TextString.Substring (0, TextString.IndexOf(EOL));
536 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
537 AssertEquals ("test#14", " </Root>", substring);
539 AssertEquals ("test#15", "</diffgr:diffgram>", TextString);
543 public void WriteXmlSchema ()
545 DataSet ds = new DataSet ();
546 ds.ReadXml ("Test/System.Data/region.xml");
547 TextWriter writer = new StringWriter ();
548 ds.WriteXmlSchema (writer);
551 string TextString = GetNormalizedSchema (writer.ToString ());
552 // string TextString = writer.ToString ();
554 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
555 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
556 AssertEquals ("test#01", "<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring);
558 substring = TextString.Substring (0, TextString.IndexOf(EOL));
559 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
560 // This is original DataSet.WriteXmlSchema() output
561 // AssertEquals ("test#02", "<xs:schema id=\"Root\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">", substring);
562 AssertEquals ("test#02", "<xs:schema id=\"Root\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring);
564 substring = TextString.Substring (0, TextString.IndexOf(EOL));
565 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
566 // This is original DataSet.WriteXmlSchema() output
567 // AssertEquals ("test#03", " <xs:element name=\"Root\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
568 AssertEquals ("test#03", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"Root\">", substring);
570 substring = TextString.Substring (0, TextString.IndexOf(EOL));
571 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
572 AssertEquals ("test#04", " <xs:complexType>", substring);
574 substring = TextString.Substring (0, TextString.IndexOf(EOL));
575 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
576 AssertEquals ("test#05", " <xs:choice maxOccurs=\"unbounded\">", substring);
578 substring = TextString.Substring (0, TextString.IndexOf(EOL));
579 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
580 AssertEquals ("test#06", " <xs:element name=\"Region\">", substring);
582 substring = TextString.Substring (0, TextString.IndexOf(EOL));
583 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
584 AssertEquals ("test#07", " <xs:complexType>", substring);
586 substring = TextString.Substring (0, TextString.IndexOf(EOL));
587 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
588 AssertEquals ("test#08", " <xs:sequence>", substring);
590 substring = TextString.Substring (0, TextString.IndexOf(EOL));
591 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
592 // This is original DataSet.WriteXmlSchema() output
593 // AssertEquals ("test#09", " <xs:element name=\"RegionID\" type=\"xs:string\" minOccurs=\"0\" />", substring);
594 AssertEquals ("test#09", " <xs:element minOccurs=\"0\" name=\"RegionID\" type=\"xs:string\" />", substring);
596 substring = TextString.Substring (0, TextString.IndexOf(EOL));
597 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
598 // This is original DataSet.WriteXmlSchema() output
599 // AssertEquals ("test#10", " <xs:element name=\"RegionDescription\" type=\"xs:string\" minOccurs=\"0\" />", substring);
600 AssertEquals ("test#10", " <xs:element minOccurs=\"0\" name=\"RegionDescription\" type=\"xs:string\" />", substring);
602 substring = TextString.Substring (0, TextString.IndexOf(EOL));
603 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
604 AssertEquals ("test#11", " </xs:sequence>", substring);
606 substring = TextString.Substring (0, TextString.IndexOf(EOL));
607 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
608 AssertEquals ("test#12", " </xs:complexType>", substring);
610 substring = TextString.Substring (0, TextString.IndexOf(EOL));
611 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
612 AssertEquals ("test#13", " </xs:element>", substring);
614 substring = TextString.Substring (0, TextString.IndexOf(EOL));
615 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
616 AssertEquals ("test#14", " </xs:choice>", substring);
618 substring = TextString.Substring (0, TextString.IndexOf(EOL));
619 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
620 AssertEquals ("test#15", " </xs:complexType>", substring);
622 substring = TextString.Substring (0, TextString.IndexOf(EOL));
623 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
624 AssertEquals ("test#16", " </xs:element>", substring);
626 AssertEquals ("test#17", "</xs:schema>", TextString);
630 [Ignore ("MS behavior is far from consistent to be regarded as a reference implementation.")]
631 // MS ReadXmlSchema() is too inconsistent to regard as a
632 // reference implementation. To find the reason why, try to
633 // read store2.xsd and store4.xsd, write and compare for each
635 public void ReadWriteXmlSchemaIgnoreSchema ()
637 DataSet ds = new DataSet ();
638 ds.ReadXmlSchema ("Test/System.Data/store.xsd");
639 AssertDataSet ("read DataSet", ds, "NewDataSet", 3, 2);
640 AssertDataTable ("read bookstore table", ds.Tables [0], "bookstore", 1, 0, 0, 1, 1, 1);
641 AssertDataTable ("read book table", ds.Tables [1], "book", 5, 0, 1, 1, 2, 1);
642 ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.IgnoreSchema);
643 TextWriter writer = new StringWriter ();
645 ds.WriteXmlSchema (writer);
646 string TextString = GetNormalizedSchema (writer.ToString ());
647 // string TextString = writer.ToString ();
650 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
651 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
652 AssertEquals ("test#01", "<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring);
654 substring = TextString.Substring (0, TextString.IndexOf(EOL));
655 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
656 // This is original DataSet.WriteXmlSchema() output
657 // AssertEquals ("test#02", "<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">", substring);
658 AssertEquals ("test#02", "<xs:schema id=\"NewDataSet\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring);
660 substring = TextString.Substring (0, TextString.IndexOf(EOL));
661 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
662 AssertEquals ("test#03", " <xs:complexType name=\"bookstoreType\">", substring);
664 substring = TextString.Substring (0, TextString.IndexOf(EOL));
665 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
666 AssertEquals ("test#04", " <xs:sequence>", substring);
668 substring = TextString.Substring (0, TextString.IndexOf(EOL));
669 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
670 // This is original DataSet.WriteXmlSchema() output
671 // AssertEquals ("test#05", " <xs:element name=\"book\" type=\"bookType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
672 AssertEquals ("test#05", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"book\" type=\"bookType\" />", substring);
674 substring = TextString.Substring (0, TextString.IndexOf(EOL));
675 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
676 AssertEquals ("test#06", " </xs:sequence>", substring);
678 substring = TextString.Substring (0, TextString.IndexOf(EOL));
679 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
680 AssertEquals ("test#07", " </xs:complexType>", substring);
682 substring = TextString.Substring (0, TextString.IndexOf(EOL));
683 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
684 AssertEquals ("test#08", " <xs:complexType name=\"bookType\">", substring);
686 substring = TextString.Substring (0, TextString.IndexOf(EOL));
687 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
688 AssertEquals ("test#09", " <xs:sequence>", substring);
690 substring = TextString.Substring (0, TextString.IndexOf(EOL));
691 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
692 // This is original DataSet.WriteXmlSchema() output
693 // AssertEquals ("test#10", " <xs:element name=\"title\" type=\"xs:string\" msdata:Ordinal=\"1\" />", substring);
695 AssertEquals ("test#10", " <xs:element msdata:Ordinal=\"1\" name=\"title\" type=\"xs:string\" />", substring);
697 substring = TextString.Substring (0, TextString.IndexOf(EOL));
698 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
699 // This is original DataSet.WriteXmlSchema() output
700 // AssertEquals ("test#11", " <xs:element name=\"price\" type=\"xs:decimal\" msdata:Ordinal=\"2\" />", substring);
701 AssertEquals ("test#11", " <xs:element msdata:Ordinal=\"2\" name=\"price\" type=\"xs:decimal\" />", substring);
703 substring = TextString.Substring (0, TextString.IndexOf(EOL));
704 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
705 // This is original DataSet.WriteXmlSchema() output
706 // AssertEquals ("test#12", " <xs:element name=\"author\" type=\"authorName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
707 AssertEquals ("test#12", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"author\" type=\"authorName\" />", substring);
709 substring = TextString.Substring (0, TextString.IndexOf(EOL));
710 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
711 AssertEquals ("test#13", " </xs:sequence>", substring);
713 substring = TextString.Substring (0, TextString.IndexOf(EOL));
714 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
715 AssertEquals ("test#14", " <xs:attribute name=\"genre\" type=\"xs:string\" />", substring);
717 substring = TextString.Substring (0, TextString.IndexOf(EOL));
718 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
719 AssertEquals ("test#15", " </xs:complexType>", substring);
721 substring = TextString.Substring (0, TextString.IndexOf(EOL));
722 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
723 AssertEquals ("test#16", " <xs:complexType name=\"authorName\">", substring);
725 substring = TextString.Substring (0, TextString.IndexOf(EOL));
726 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
727 AssertEquals ("test#17", " <xs:sequence>", substring);
729 substring = TextString.Substring (0, TextString.IndexOf(EOL));
730 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
731 AssertEquals ("test#18", " <xs:element name=\"first-name\" type=\"xs:string\" />", substring);
733 substring = TextString.Substring (0, TextString.IndexOf(EOL));
734 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
735 AssertEquals ("test#19", " <xs:element name=\"last-name\" type=\"xs:string\" />", substring);
737 substring = TextString.Substring (0, TextString.IndexOf(EOL));
738 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
739 AssertEquals ("test#20", " </xs:sequence>", substring);
741 substring = TextString.Substring (0, TextString.IndexOf(EOL));
742 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
743 AssertEquals ("test#21", " </xs:complexType>", substring);
745 substring = TextString.Substring (0, TextString.IndexOf(EOL));
746 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
747 AssertEquals ("test#22", " <xs:element name=\"bookstore\" type=\"bookstoreType\" />", substring);
749 substring = TextString.Substring (0, TextString.IndexOf(EOL));
750 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
751 // This is original DataSet.WriteXmlSchema() output
752 // AssertEquals ("test#23", " <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
753 AssertEquals ("test#23", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"NewDataSet\">", substring);
755 substring = TextString.Substring (0, TextString.IndexOf(EOL));
756 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
757 AssertEquals ("test#24", " <xs:complexType>", substring);
759 substring = TextString.Substring (0, TextString.IndexOf(EOL));
760 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
761 AssertEquals ("test#25", " <xs:choice maxOccurs=\"unbounded\">", substring);
763 substring = TextString.Substring (0, TextString.IndexOf(EOL));
764 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
765 AssertEquals ("test#26", " <xs:element ref=\"bookstore\" />", substring);
767 substring = TextString.Substring (0, TextString.IndexOf(EOL));
768 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
769 AssertEquals ("test#27", " </xs:choice>", substring);
771 substring = TextString.Substring (0, TextString.IndexOf(EOL));
772 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
773 AssertEquals ("test#28", " </xs:complexType>", substring);
775 substring = TextString.Substring (0, TextString.IndexOf(EOL));
776 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
777 AssertEquals ("test#29", " </xs:element>", substring);
779 AssertEquals ("test#30", "</xs:schema>", TextString);
783 [Ignore ("MS behavior is far from consistent to be regarded as a reference implementation.")]
784 // See comments on ReadWriteXmlSchemaIgnoreSchema().
785 public void ReadWriteXmlSchema ()
787 DataSet ds = new DataSet ();
788 ds.ReadXmlSchema ("Test/System.Data/store.xsd");
789 // check dataset properties before testing write
790 AssertDataSet ("ds", ds, "NewDataSet", 3, 2);
791 AssertDataTable ("tab1", ds.Tables [0], "bookstore", 1, 0, 0, 1, 1, 1);
792 AssertDataTable ("tab2", ds.Tables [1], "book", 5, 0, 1, 1, 2, 1);
793 AssertDataTable ("tab3", ds.Tables [2], "author", 3, 0, 1, 0, 1, 0);
794 // FIXME: currently order is not compatible. Use name as index
795 AssertDataRelation ("rel1", ds.Relations ["book_author"], "book_author", true, new string [] {"book_Id"}, new string [] {"book_Id"}, true, true);
796 AssertDataRelation ("rel2", ds.Relations ["bookstore_book"], "bookstore_book", true, new string [] {"bookstore_Id"}, new string [] {"bookstore_Id"}, true, true);
798 ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.InferSchema);
800 TextWriter writer = new StringWriter ();
801 ds.WriteXmlSchema (writer);
803 string TextString = GetNormalizedSchema (writer.ToString ());
804 // string TextString = writer.ToString ();
806 string substring = TextString.Substring (0, TextString.IndexOf(EOL));
807 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
808 AssertEquals ("test#01", "<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring);
810 substring = TextString.Substring (0, TextString.IndexOf(EOL));
811 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
812 // This is original DataSet.WriteXmlSchema() output
813 // AssertEquals ("test#02", "<xs:schema id=\"Root\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">", substring);
814 AssertEquals ("test#02", "<xs:schema id=\"Root\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring);
816 substring = TextString.Substring (0, TextString.IndexOf(EOL));
817 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
818 AssertEquals ("test#03", " <xs:complexType name=\"bookstoreType\">", substring);
820 substring = TextString.Substring (0, TextString.IndexOf(EOL));
821 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
822 AssertEquals ("test#04", " <xs:sequence>", substring);
824 substring = TextString.Substring (0, TextString.IndexOf(EOL));
825 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
826 // This is original DataSet.WriteXmlSchema() output
827 // AssertEquals ("test#05", " <xs:element name=\"book\" type=\"bookType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
828 AssertEquals ("test#05", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"book\" type=\"bookType\" />", substring);
830 substring = TextString.Substring (0, TextString.IndexOf(EOL));
831 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
832 AssertEquals ("test#06", " </xs:sequence>", substring);
834 substring = TextString.Substring (0, TextString.IndexOf(EOL));
835 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
836 AssertEquals ("test#07", " </xs:complexType>", substring);
838 substring = TextString.Substring (0, TextString.IndexOf(EOL));
839 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
840 AssertEquals ("test#08", " <xs:complexType name=\"bookType\">", substring);
842 substring = TextString.Substring (0, TextString.IndexOf(EOL));
843 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
844 AssertEquals ("test#09", " <xs:sequence>", substring);
846 substring = TextString.Substring (0, TextString.IndexOf(EOL));
847 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
848 // This is original DataSet.WriteXmlSchema() output
849 // AssertEquals ("test#10", " <xs:element name=\"title\" type=\"xs:string\" msdata:Ordinal=\"1\" />", substring);
850 AssertEquals ("test#10", " <xs:element msdata:Ordinal=\"1\" name=\"title\" type=\"xs:string\" />", substring);
852 substring = TextString.Substring (0, TextString.IndexOf(EOL));
853 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
854 // This is original DataSet.WriteXmlSchema() output
855 // AssertEquals ("test#11", " <xs:element name=\"price\" type=\"xs:decimal\" msdata:Ordinal=\"2\" />", substring);
856 AssertEquals ("test#11", " <xs:element msdata:Ordinal=\"2\" name=\"price\" type=\"xs:decimal\" />", substring);
858 substring = TextString.Substring (0, TextString.IndexOf(EOL));
859 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
860 // This is original DataSet.WriteXmlSchema() output
861 // AssertEquals ("test#12", " <xs:element name=\"author\" type=\"authorName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
862 AssertEquals ("test#12", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"author\" type=\"authorName\" />", substring);
864 substring = TextString.Substring (0, TextString.IndexOf(EOL));
865 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
866 AssertEquals ("test#13", " </xs:sequence>", substring);
868 substring = TextString.Substring (0, TextString.IndexOf(EOL));
869 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
870 AssertEquals ("test#14", " <xs:attribute name=\"genre\" type=\"xs:string\" />", substring);
872 substring = TextString.Substring (0, TextString.IndexOf(EOL));
873 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
874 AssertEquals ("test#15", " </xs:complexType>", substring);
876 substring = TextString.Substring (0, TextString.IndexOf(EOL));
877 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
878 AssertEquals ("test#16", " <xs:complexType name=\"authorName\">", substring);
880 substring = TextString.Substring (0, TextString.IndexOf(EOL));
881 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
882 AssertEquals ("test#17", " <xs:sequence>", substring);
884 substring = TextString.Substring (0, TextString.IndexOf(EOL));
885 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
886 AssertEquals ("test#18", " <xs:element name=\"first-name\" type=\"xs:string\" />", substring);
888 substring = TextString.Substring (0, TextString.IndexOf(EOL));
889 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
890 AssertEquals ("test#19", " <xs:element name=\"last-name\" type=\"xs:string\" />", substring);
892 substring = TextString.Substring (0, TextString.IndexOf(EOL));
893 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
894 AssertEquals ("test#20", " </xs:sequence>", substring);
896 substring = TextString.Substring (0, TextString.IndexOf(EOL));
897 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
898 AssertEquals ("test#21", " </xs:complexType>", substring);
900 substring = TextString.Substring (0, TextString.IndexOf(EOL));
901 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
902 AssertEquals ("test#22", " <xs:element name=\"bookstore\" type=\"bookstoreType\" />", substring);
904 substring = TextString.Substring (0, TextString.IndexOf(EOL));
905 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
906 // This is original DataSet.WriteXmlSchema() output
907 // AssertEquals ("test#23", " <xs:element name=\"Root\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
908 AssertEquals ("test#23", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"Root\">", substring);
910 substring = TextString.Substring (0, TextString.IndexOf(EOL));
911 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
912 AssertEquals ("test#24", " <xs:complexType>", substring);
914 substring = TextString.Substring (0, TextString.IndexOf(EOL));
915 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
916 AssertEquals ("test#25", " <xs:choice maxOccurs=\"unbounded\">", substring);
918 substring = TextString.Substring (0, TextString.IndexOf(EOL));
919 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
920 AssertEquals ("test#26", " <xs:element ref=\"bookstore\" />", substring);
922 substring = TextString.Substring (0, TextString.IndexOf(EOL));
923 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
924 AssertEquals ("test#27", " <xs:element name=\"Region\">", substring);
926 substring = TextString.Substring (0, TextString.IndexOf(EOL));
927 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
928 AssertEquals ("test#28", " <xs:complexType>", substring);
930 substring = TextString.Substring (0, TextString.IndexOf(EOL));
931 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
932 AssertEquals ("test#29", " <xs:sequence>", substring);
934 substring = TextString.Substring (0, TextString.IndexOf(EOL));
935 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
936 // This is original DataSet.WriteXmlSchema() output
937 // AssertEquals ("test#30", " <xs:element name=\"RegionID\" type=\"xs:string\" minOccurs=\"0\" />", substring);
938 AssertEquals ("test#30", " <xs:element minOccurs=\"0\" name=\"RegionID\" type=\"xs:string\" />", substring);
940 substring = TextString.Substring (0, TextString.IndexOf(EOL));
941 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
942 // This is original DataSet.WriteXmlSchema() output
943 // AssertEquals ("test#31", " <xs:element name=\"RegionDescription\" type=\"xs:string\" minOccurs=\"0\" />", substring);
944 AssertEquals ("test#31", " <xs:element minOccurs=\"0\" name=\"RegionDescription\" type=\"xs:string\" />", substring);
946 substring = TextString.Substring (0, TextString.IndexOf(EOL));
947 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
948 AssertEquals ("test#32", " </xs:sequence>", substring);
950 substring = TextString.Substring (0, TextString.IndexOf(EOL));
951 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
952 AssertEquals ("test#33", " </xs:complexType>", substring);
954 substring = TextString.Substring (0, TextString.IndexOf(EOL));
955 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
956 AssertEquals ("test#34", " </xs:element>", substring);
958 substring = TextString.Substring (0, TextString.IndexOf(EOL));
959 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
960 AssertEquals ("test#35", " </xs:choice>", substring);
962 substring = TextString.Substring (0, TextString.IndexOf(EOL));
963 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
964 AssertEquals ("test#36", " </xs:complexType>", substring);
966 substring = TextString.Substring (0, TextString.IndexOf(EOL));
967 TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
968 AssertEquals ("test#37", " </xs:element>", substring);
970 AssertEquals ("test#38", "</xs:schema>", TextString);
974 [Category ("NotWorking")]
975 public void WriteDifferentNamespaceSchema ()
977 string schema = @"<?xml version='1.0' encoding='utf-16'?>
978 <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'>
979 <!--ATTENTION: This schema contains references to other imported schemas-->
980 <xs:import namespace='urn:baz' schemaLocation='_app1.xsd' />
981 <xs:import namespace='urn:foo' schemaLocation='_app2.xsd' />
982 <xs:element name='NewDataSet' msdata:IsDataSet='true' msdata:Locale='fi-FI'>
984 <xs:choice maxOccurs='unbounded'>
985 <xs:element ref='app2:NS1Table' />
986 <xs:element name='NS2Table'>
994 DataSet ds = new DataSet();
995 DataTable dt = new DataTable ();
996 dt.TableName = "NS1Table";
997 dt.Namespace = "urn:foo";
998 dt.Columns.Add ("column1");
999 dt.Columns.Add ("column2");
1000 dt.Columns [1].Namespace = "urn:baz";
1002 DataTable dt2 = new DataTable ();
1003 dt2.TableName = "NS2Table";
1004 dt2.Namespace = "urn:bar";
1005 ds.Tables.Add (dt2);
1006 ds.Namespace = "urn:bar";
1007 StringWriter sw = new StringWriter ();
1008 XmlTextWriter xw = new XmlTextWriter (sw);
1009 xw.Formatting = Formatting.Indented;
1010 xw.QuoteChar = '\'';
1011 ds.WriteXmlSchema (xw);
1013 string result = sw.ToString ();
1014 AssertEquals (schema, result.Replace ("\r\n", "\n"));
1018 public void IgnoreColumnEmptyNamespace ()
1020 DataColumn col = new DataColumn ("TEST");
1021 col.Namespace = "urn:foo";
1022 DataSet ds = new DataSet ("DS");
1023 ds.Namespace = "urn:foo";
1024 DataTable dt = new DataTable ("tab");
1026 dt.Columns.Add (col);
1027 dt.Rows.Add (new object [] {"test"});
1028 StringWriter sw = new StringWriter ();
1029 ds.WriteXml (new XmlTextWriter (sw));
1030 string xml = @"<DS xmlns=""urn:foo""><tab><TEST>test</TEST></tab></DS>";
1031 AssertEquals (xml, sw.ToString ());
1035 public void SerializeDataSet ()
1037 // see GetReady() for current culture
1039 string xml = "<?xml version='1.0' encoding='utf-16'?><DataSet><xs:schema id='DS' xmlns='' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'><xs:element name='DS' msdata:IsDataSet='true' msdata:Locale='fi-FI'><xs:complexType><xs:choice maxOccurs='unbounded' /></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1' /></DataSet>";
1040 DataSet ds = new DataSet ();
1041 ds.DataSetName = "DS";
1042 XmlSerializer ser = new XmlSerializer (typeof (DataSet));
1043 StringWriter sw = new StringWriter ();
1044 XmlTextWriter xw = new XmlTextWriter (sw);
1045 xw.QuoteChar = '\'';
1046 ser.Serialize (xw, ds);
1048 string result = sw.ToString ();
1049 AssertEquals (xml, result.Replace ("\r\n", "\n"));
1054 public void SerializeDataSet2 ()
1056 DataSet quota = new DataSet ("Quota");
1059 DataTable dt = new DataTable ("Dimension");
1060 quota.Tables.Add (dt);
1062 dt.Columns.Add ("Number", typeof(int));
1063 dt.Columns ["Number"].AllowDBNull = false;
1064 dt.Columns ["Number"].ColumnMapping = MappingType.Attribute;
1066 dt.Columns.Add ("Title", typeof(string));
1067 dt.Columns ["Title"].AllowDBNull = false;
1068 dt.Columns ["Title"].ColumnMapping =
1069 MappingType.Attribute;
1071 dt.Rows.Add (new object [] {0, "Hospitals"});
1072 dt.Rows.Add (new object [] {1, "Doctors"});
1074 dt.Constraints.Add ("PK_Dimension", dt.Columns ["Number"], true);
1076 quota.AcceptChanges ();
1078 XmlSerializer ser = new XmlSerializer (quota.GetType ());
1080 StringWriter sw = new StringWriter ();
1081 ser.Serialize (sw, quota);
1083 DataSet ds = (DataSet) ser.Deserialize (new StringReader (sw.ToString ()));
1087 public void SerializeDataSet3 ()
1089 string xml = @"<?xml version=""1.0"" encoding=""utf-8""?><DataSet><xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata""><xs:element name=""Example"" msdata:IsDataSet=""true""><xs:complexType><xs:choice maxOccurs=""unbounded""><xs:element name=""Packages""><xs:complexType><xs:attribute name=""ID"" type=""xs:int"" use=""required"" /><xs:attribute name=""ShipDate"" type=""xs:dateTime"" /><xs:attribute name=""Message"" type=""xs:string"" /><xs:attribute name=""Handlers"" type=""xs:int"" /></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"" xmlns:diffgr=""urn:schemas-microsoft-com:xml-diffgram-v1""><Example><Packages diffgr:id=""Packages1"" msdata:rowOrder=""0"" ID=""0"" ShipDate=""2004-10-11T17:46:18.6962302-05:00"" Message=""Received with no breakage!"" Handlers=""3"" /><Packages diffgr:id=""Packages2"" msdata:rowOrder=""1"" ID=""1"" /></Example></diffgr:diffgram></DataSet>";
1091 DataSet ds = new DataSet ("Example");
1094 DataTable dt = new DataTable ("Packages");
1097 // Add an ID DataColumn w/ ColumnMapping = MappingType.Attribute
1098 dt.Columns.Add (new DataColumn ("ID", typeof(int), "",
1099 MappingType.Attribute));
1100 dt.Columns ["ID"].AllowDBNull = false;
1102 // Add a nullable DataColumn w/ ColumnMapping = MappingType.Attribute
1103 dt.Columns.Add (new DataColumn ("ShipDate",
1104 typeof (DateTime), "", MappingType.Attribute));
1105 dt.Columns ["ShipDate"].AllowDBNull = true;
1107 // Add a nullable DataColumn w/ ColumnMapping = MappingType.Attribute
1108 dt.Columns.Add (new DataColumn ("Message",
1109 typeof (string), "", MappingType.Attribute));
1110 dt.Columns ["Message"].AllowDBNull = true;
1112 // Add a nullable DataColumn w/ ColumnMapping = MappingType.Attribute
1113 dt.Columns.Add (new DataColumn ("Handlers",
1114 typeof (int), "", MappingType.Attribute));
1115 dt.Columns ["Handlers"].AllowDBNull = true;
1117 // Add a non-null value row
1118 DataRow newRow = dt.NewRow();
1120 newRow ["ShipDate"] = DateTime.Now;
1121 newRow ["Message"] = "Received with no breakage!";
1122 newRow ["Handlers"] = 3;
1123 dt.Rows.Add (newRow);
1125 // Add a null value row
1126 newRow = dt.NewRow ();
1128 newRow ["ShipDate"] = DBNull.Value;
1129 newRow ["Message"] = DBNull.Value;
1130 newRow ["Handlers"] = DBNull.Value;
1131 dt.Rows.Add (newRow);
1133 ds.AcceptChanges ();
1135 XmlSerializer ser = new XmlSerializer (ds.GetType());
1136 StringWriter sw = new StringWriter ();
1137 ser.Serialize (sw, ds);
1139 string result = sw.ToString ();
1141 AssertEquals (xml, result);
1145 public void DeserializeDataSet ()
1147 string xml = @"<DataSet>
1148 <diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
1150 <Dimension diffgr:id='Dimension1' msdata:rowOrder='0' Number='0' Title='Hospitals' />
1151 <Dimension diffgr:id='Dimension2' msdata:rowOrder='1' Number='1' Title='Doctors' />
1155 XmlSerializer ser = new XmlSerializer (typeof (DataSet));
1156 ser.Deserialize (new XmlTextReader (
1157 xml, XmlNodeType.Document, null));
1162 public void WriteDiffReadAutoWriteSchema ()
1164 DataSet ds = new DataSet ();
1165 ds.Tables.Add ("Table1");
1166 ds.Tables.Add ("Table2");
1167 ds.Tables [0].Columns.Add ("Column1_1");
1168 ds.Tables [0].Columns.Add ("Column1_2");
1169 ds.Tables [0].Columns.Add ("Column1_3");
1170 ds.Tables [1].Columns.Add ("Column2_1");
1171 ds.Tables [1].Columns.Add ("Column2_2");
1172 ds.Tables [1].Columns.Add ("Column2_3");
1173 ds.Tables [0].Rows.Add (new object [] {"ppp", "www", "xxx"});
1176 StringWriter sw = new StringWriter ();
1177 ds.WriteXml (sw, XmlWriteMode.DiffGram);
1178 string xml = sw.ToString ();
1179 string result = new StreamReader ("Test/System.Data/DataSetReadXmlTest1.xml", Encoding.ASCII).ReadToEnd ();
1180 AssertEquals ("#01", result, xml);
1182 // load diffgram above
1183 ds.ReadXml (new StringReader (sw.ToString ()));
1184 sw = new StringWriter ();
1185 ds.WriteXml (sw, XmlWriteMode.WriteSchema);
1186 xml = sw.ToString ();
1187 result = new StreamReader ("Test/System.Data/DataSetReadXmlTest2.xml", Encoding.ASCII).ReadToEnd ();
1188 AssertEquals ("#02", result, xml);
1193 public void CloneCopy ()
1195 DataTable table = new DataTable ("pTable"); DataTable table1 = new DataTable ("cTable"); DataSet set = new DataSet ();
1197 set.Tables.Add (table);
1198 set.Tables.Add (table1); DataColumn col = new DataColumn ();
1199 col.ColumnName = "Id";
1200 col.DataType = Type.GetType ("System.Int32");
1201 table.Columns.Add (col);
1202 UniqueConstraint uc = new UniqueConstraint ("UK1", table.Columns[0] );
1203 table.Constraints.Add (uc);
1205 col = new DataColumn ();
1206 col.ColumnName = "Name";
1207 col.DataType = Type.GetType ("System.String");
1208 table.Columns.Add (col);
1210 col = new DataColumn ();
1211 col.ColumnName = "Id";
1212 col.DataType = Type.GetType ("System.Int32");
1213 table1.Columns.Add (col);
1215 col = new DataColumn ();
1216 col.ColumnName = "Name";
1217 col.DataType = Type.GetType ("System.String");
1218 table1.Columns.Add (col);
1219 ForeignKeyConstraint fc = new ForeignKeyConstraint ("FK1", table.Columns[0], table1.Columns[0] );
1220 table1.Constraints.Add (fc);
1223 DataRow row = table.NewRow ();
1226 row ["name"] = "Row1";
1227 row.RowError = "Error#1";
1228 table.Rows.Add (row);
1230 row = table1.NewRow ();
1232 row ["Name"] = "Row1";
1233 table1.Rows.Add (row);
1235 //Setting properties of DataSet
1236 set.CaseSensitive = true;
1237 set.DataSetName = "My DataSet";
1238 set.EnforceConstraints = false;
1239 set.Namespace = "Namespace#1";
1240 set.Prefix = "Prefix:1";
1241 DataRelation dr = new DataRelation ("DR", table.Columns [0],table1.Columns [0]);
1242 set.Relations.Add (dr);
1243 set.ExtendedProperties.Add ("TimeStamp", DateTime.Now);
1244 CultureInfo cultureInfo = new CultureInfo( "ar-SA" );
1245 set.Locale = cultureInfo;
1248 DataSet copySet = set.Copy ();
1249 AssertEquals ("#A01", set.CaseSensitive, copySet.CaseSensitive);
1250 AssertEquals ("#A02", set.DataSetName, copySet.DataSetName);
1251 AssertEquals ("#A03", set.EnforceConstraints, copySet.EnforceConstraints);
1252 AssertEquals ("#A04", set.HasErrors, copySet.HasErrors);
1253 AssertEquals ("#A05", set.Namespace, copySet.Namespace);
1254 AssertEquals ("#A06", set.Prefix, copySet.Prefix);
1255 AssertEquals ("#A07", set.Relations.Count, copySet.Relations.Count);
1256 AssertEquals ("#A08", set.Tables.Count, copySet.Tables.Count);
1257 AssertEquals ("#A09", set.ExtendedProperties ["TimeStamp"], copySet.ExtendedProperties ["TimeStamp"]);
1258 for (int i = 0;i < copySet.Tables.Count; i++) {
1259 AssertEquals ("#A10", set.Tables [i].Rows.Count, copySet.Tables [i].Rows.Count);
1260 AssertEquals ("#A11", set.Tables [i].Columns.Count, copySet.Tables [i].Columns.Count);
1263 copySet = set.Clone ();
1264 AssertEquals ("#A12", set.CaseSensitive, copySet.CaseSensitive);
1265 AssertEquals ("#A13", set.DataSetName, copySet.DataSetName);
1266 AssertEquals ("#A14", set.EnforceConstraints, copySet.EnforceConstraints);
1267 AssertEquals ("#A15", false, copySet.HasErrors);
1268 AssertEquals ("#A16", set.Namespace, copySet.Namespace);
1269 AssertEquals ("#A17", set.Prefix, copySet.Prefix);
1270 AssertEquals ("#A18", set.Relations.Count, copySet.Relations.Count);
1271 AssertEquals ("#A19", set.Tables.Count, copySet.Tables.Count);
1272 AssertEquals ("#A20", set.ExtendedProperties ["TimeStamp"], copySet.ExtendedProperties ["TimeStamp"]);
1273 for (int i = 0;i < copySet.Tables.Count; i++) {
1274 AssertEquals ("#A21", 0, copySet.Tables [i].Rows.Count);
1275 AssertEquals ("#A22", set.Tables [i].Columns.Count, copySet.Tables [i].Columns.Count);
1280 public void CloneCopy2 ()
1282 DataSet ds = new DataSet ();
1283 ds.ReadXmlSchema ("Test/System.Data/store.xsd");
1288 public void CloneCopy_TestForeignKeyConstraints ()
1290 DataTable dirTable = new DataTable("Directories");
1292 DataColumn dir_UID = new DataColumn("UID", typeof(int));
1293 dir_UID.Unique = true;
1294 dir_UID.AllowDBNull = false;
1296 dirTable.Columns.Add(dir_UID);
1298 // Build a simple Files table
1299 DataTable fileTable = new DataTable("Files");
1301 DataColumn file_DirID = new DataColumn("DirectoryID", typeof(int));
1302 file_DirID.Unique = false;
1303 file_DirID.AllowDBNull = false;
1305 fileTable.Columns.Add(file_DirID);
1307 // Build the DataSet
1308 DataSet ds = new DataSet("TestDataset");
1309 ds.Tables.Add(dirTable);
1310 ds.Tables.Add(fileTable);
1312 // Add a foreign key constraint
1313 DataColumn[] parentColumns = new DataColumn[1];
1314 parentColumns[0] = ds.Tables["Directories"].Columns["UID"];
1316 DataColumn[] childColumns = new DataColumn[1];
1317 childColumns[0] = ds.Tables["Files"].Columns["DirectoryID"];
1319 ForeignKeyConstraint fk = new ForeignKeyConstraint("FK_Test", parentColumns, childColumns);
1320 ds.Tables["Files"].Constraints.Add(fk);
1321 ds.EnforceConstraints = true;
1323 AssertEquals ("#1", 1, ds.Tables["Directories"].Constraints.Count);
1324 AssertEquals ("#2", 1, ds.Tables["Files"].Constraints.Count);
1326 // check clone works fine
1327 DataSet cloned_ds = ds.Clone ();
1328 AssertEquals ("#3", 1, cloned_ds.Tables["Directories"].Constraints.Count);
1329 AssertEquals ("#4", 1, cloned_ds.Tables["Files"].Constraints.Count);
1331 ForeignKeyConstraint clonedFk = (ForeignKeyConstraint)cloned_ds.Tables["Files"].Constraints[0];
1332 AssertEquals ("#5", "FK_Test", clonedFk.ConstraintName);
1333 AssertEquals ("#6", 1, clonedFk.Columns.Length);
1334 AssertEquals ("#7", "DirectoryID", clonedFk.Columns[0].ColumnName);
1336 UniqueConstraint clonedUc = (UniqueConstraint)cloned_ds.Tables ["Directories"].Constraints[0];
1337 UniqueConstraint origUc = (UniqueConstraint)ds.Tables ["Directories"].Constraints[0];
1338 AssertEquals ("#8", origUc.ConstraintName, clonedUc.ConstraintName);
1339 AssertEquals ("#9", 1, clonedUc.Columns.Length);
1340 AssertEquals ("#10", "UID", clonedUc.Columns[0].ColumnName);
1342 // check copy works fine
1343 DataSet copy_ds = ds.Copy ();
1344 AssertEquals ("#11", 1, copy_ds.Tables["Directories"].Constraints.Count);
1345 AssertEquals ("#12", 1, copy_ds.Tables["Files"].Constraints.Count);
1347 ForeignKeyConstraint copyFk = (ForeignKeyConstraint)copy_ds.Tables["Files"].Constraints[0];
1348 AssertEquals ("#13", "FK_Test", copyFk.ConstraintName);
1349 AssertEquals ("#14", 1, copyFk.Columns.Length);
1350 AssertEquals ("#15", "DirectoryID", copyFk.Columns[0].ColumnName);
1352 UniqueConstraint copyUc = (UniqueConstraint)copy_ds.Tables ["Directories"].Constraints[0];
1353 origUc = (UniqueConstraint)ds.Tables ["Directories"].Constraints[0];
1354 AssertEquals ("#16", origUc.ConstraintName, copyUc.ConstraintName);
1355 AssertEquals ("#17", 1, copyUc.Columns.Length);
1356 AssertEquals ("#18", "UID", copyUc.Columns[0].ColumnName);
1360 public void WriteNestedTableXml ()
1362 string xml = @"<NewDataSet>
1367 <timestamp>2004-05-05</timestamp>
1374 <timestamp>2004-05-06</timestamp>
1378 DataSet ds = new DataSet ();
1379 DataTable dt = new DataTable ("tab1");
1380 dt.Columns.Add ("ident");
1381 dt.Columns.Add ("name");
1382 dt.Rows.Add (new object [] {"1", "hoge"});
1383 dt.Rows.Add (new object [] {"2", "fuga"});
1384 DataTable dt2 = new DataTable ("tab2");
1385 dt2.Columns.Add ("idref");
1386 dt2.Columns [0].ColumnMapping = MappingType.Hidden;
1387 dt2.Columns.Add ("timestamp");
1388 dt2.Rows.Add (new object [] {"1", "2004-05-05"});
1389 dt2.Rows.Add (new object [] {"2", "2004-05-06"});
1391 ds.Tables.Add (dt2);
1392 DataRelation rel = new DataRelation ("rel", dt.Columns [0], dt2.Columns [0]);
1394 ds.Relations.Add (rel);
1395 StringWriter sw = new StringWriter ();
1397 AssertEquals (xml, sw.ToString ().Replace ("\r\n", "\n"));
1401 public void WriteXmlToStream ()
1403 string xml = "<set><table1><col1>sample text</col1><col2/></table1><table2 attr='value'><col3>sample text 2</col3></table2></set>";
1404 DataSet ds = new DataSet ();
1405 ds.ReadXml (new StringReader (xml));
1406 MemoryStream ms = new MemoryStream ();
1408 MemoryStream ms2 = new MemoryStream (ms.ToArray ());
1409 StreamReader sr = new StreamReader (ms2, Encoding.UTF8);
1410 string result = @"<set>
1412 <col1>sample text</col1>
1415 <table2 attr=""value"">
1416 <col3>sample text 2</col3>
1419 AssertEquals (result, sr.ReadToEnd ().Replace ("\r\n", "\n"));
1423 public void WtiteXmlEncodedXml ()
1425 string xml = @"<an_x0020_example_x0020_dataset.>
1426 <WOW_x0021__x0020_that_x0027_s_x0020_nasty...>
1427 <URL_x0020_is_x0020_http_x003A__x002F__x002F_www.go-mono.com>content string.</URL_x0020_is_x0020_http_x003A__x002F__x002F_www.go-mono.com>
1428 </WOW_x0021__x0020_that_x0027_s_x0020_nasty...>
1429 </an_x0020_example_x0020_dataset.>";
1430 DataSet ds = new DataSet ("an example dataset.");
1431 ds.Tables.Add (new DataTable ("WOW! that's nasty..."));
1432 ds.Tables [0].Columns.Add ("URL is http://www.go-mono.com");
1433 ds.Tables [0].Rows.Add (new object [] {"content string."});
1434 StringWriter sw = new StringWriter ();
1436 AssertEquals (xml, sw.ToString ().Replace ("\r\n", "\n"));
1440 public void ReadWriteXml2 ()
1442 string xml = "<FullTextResponse><Domains><AvailResponse info='y' name='novell-ximian-group' /><AvailResponse info='n' name='ximian' /></Domains></FullTextResponse>";
1443 DataSet ds = new DataSet ();
1444 ds.ReadXml (new StringReader (xml));
1445 AssertDataSet ("ds", ds, "FullTextResponse", 2, 1);
1446 DataTable dt = ds.Tables [0];
1447 AssertDataTable ("dt1", dt, "Domains", 1, 1, 0, 1, 1, 1);
1449 AssertDataTable ("dt2", dt, "AvailResponse", 3, 2, 1, 0, 1, 0);
1450 StringWriter sw = new StringWriter ();
1451 XmlTextWriter xtw = new XmlTextWriter (sw);
1452 xtw.QuoteChar = '\'';
1454 AssertEquals (xml, sw.ToString ());
1459 public void ReadWriteXml3 ()
1461 string input = @"<FullTextResponse>
1463 <AvailResponse info='y' name='novell-ximian-group' />
1464 <AvailResponse info='n' name='ximian' />
1466 </FullTextResponse>";
1467 DataSet ds = new DataSet ();
1468 ds.ReadXml (new StringReader (input));
1470 StringWriter sw = new StringWriter ();
1471 XmlTextWriter xtw = new XmlTextWriter (sw);
1472 xtw.Formatting = Formatting.Indented;
1473 xtw.QuoteChar = '\'';
1476 AssertEquals (input, sw.ToString ().Replace ("\r\n", "\n"));
1479 [Test] // bug #60469
1480 public void WriteXmlSchema2 ()
1482 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>";
1483 string schema = @"<?xml version='1.0' encoding='utf-16'?>
1484 <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'>
1485 <xs:element name='myDataSet' msdata:IsDataSet='true' msdata:Locale='fi-FI'>
1487 <xs:choice maxOccurs='unbounded'>
1488 <xs:element name='myTable'>
1491 <xs:element name='id' msdata:AutoIncrement='true' type='xs:int' minOccurs='0' />
1492 <xs:element name='item' type='xs:string' minOccurs='0' />
1500 DataSet OriginalDataSet = new DataSet ("myDataSet");
1501 OriginalDataSet.Namespace= "NetFrameWork";
1502 DataTable myTable = new DataTable ("myTable");
1503 DataColumn c1 = new DataColumn ("id", typeof (int));
1504 c1.AutoIncrement = true;
1505 DataColumn c2 = new DataColumn ("item");
1506 myTable.Columns.Add (c1);
1507 myTable.Columns.Add (c2);
1508 OriginalDataSet.Tables.Add (myTable);
1511 for(int i = 0; i < 10; i++) {
1512 newRow = myTable.NewRow ();
1513 newRow ["item"] = "item " + i;
1514 myTable.Rows.Add (newRow);
1516 OriginalDataSet.AcceptChanges ();
1518 StringWriter sw = new StringWriter ();
1519 XmlTextWriter xtw = new XmlTextWriter (sw);
1520 xtw.QuoteChar = '\'';
1521 OriginalDataSet.WriteXml (xtw);
1522 string result = sw.ToString ();
1524 AssertEquals (xml, result);
1526 sw = new StringWriter ();
1527 xtw = new XmlTextWriter (sw);
1528 xtw.Formatting = Formatting.Indented;
1529 OriginalDataSet.WriteXmlSchema (xtw);
1530 result = sw.ToString ();
1532 result = result.Replace ("\r\n", "\n").Replace ('"', '\'');
1533 AssertEquals (schema, result);
1538 public void WriteXmlSchema3 ()
1540 string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
1541 <xs:schema id=""ExampleDataSet"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
1542 <xs:element name=""ExampleDataSet"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
1544 <xs:choice maxOccurs=""unbounded"">
1545 <xs:element name=""ExampleDataTable"">
1547 <xs:attribute name=""PrimaryKeyColumn"" type=""xs:int"" use=""required"" />
1552 <xs:unique name=""PK_ExampleDataTable"" msdata:PrimaryKey=""true"">
1553 <xs:selector xpath="".//ExampleDataTable"" />
1554 <xs:field xpath=""@PrimaryKeyColumn"" />
1558 DataSet ds = new DataSet ("ExampleDataSet");
1560 ds.Tables.Add (new DataTable ("ExampleDataTable"));
1561 ds.Tables ["ExampleDataTable"].Columns.Add (
1562 new DataColumn ("PrimaryKeyColumn", typeof(int), "", MappingType.Attribute));
1563 ds.Tables ["ExampleDataTable"].Columns ["PrimaryKeyColumn"].AllowDBNull = false;
1565 ds.Tables ["ExampleDataTable"].Constraints.Add (
1566 "PK_ExampleDataTable",
1567 ds.Tables ["ExampleDataTable"].Columns ["PrimaryKeyColumn"],
1570 ds.AcceptChanges ();
1571 StringWriter sw = new StringWriter ();
1572 ds.WriteXmlSchema (sw);
1574 string result = sw.ToString ();
1576 AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
1581 public void WriteXmlSchema4 ()
1583 string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
1584 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
1585 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
1587 <xs:choice maxOccurs=""unbounded"">
1588 <xs:element name=""MyType"">
1590 <xs:attribute name=""ID"" type=""xs:int"" use=""required"" />
1591 <xs:attribute name=""Desc"" type=""xs:string"" />
1598 DataSet ds = new DataSet ("Example");
1600 // Add MyType DataTable
1601 DataTable dt = new DataTable ("MyType");
1604 dt.Columns.Add (new DataColumn ("ID", typeof(int), "",
1605 MappingType.Attribute));
1606 dt.Columns ["ID"].AllowDBNull = false;
1608 dt.Columns.Add (new DataColumn ("Desc", typeof
1609 (string), "", MappingType.Attribute));
1611 ds.AcceptChanges ();
1613 StringWriter sw = new StringWriter ();
1614 ds.WriteXmlSchema (sw);
1616 string result = sw.ToString ();
1618 AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
1623 public void WriteXmlSchema5 ()
1625 string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
1626 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
1627 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
1629 <xs:choice maxOccurs=""unbounded"">
1630 <xs:element name=""StandAlone"">
1632 <xs:attribute name=""ID"" type=""xs:int"" use=""required"" />
1633 <xs:attribute name=""Desc"" type=""xs:string"" use=""required"" />
1636 <xs:element name=""Dimension"">
1638 <xs:attribute name=""Number"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
1639 <xs:attribute name=""Title"" type=""xs:string"" use=""required"" />
1642 <xs:element name=""Element"">
1644 <xs:attribute name=""Dimension"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
1645 <xs:attribute name=""Number"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
1646 <xs:attribute name=""Title"" type=""xs:string"" use=""required"" />
1651 <xs:unique name=""PK_Dimension"" msdata:PrimaryKey=""true"">
1652 <xs:selector xpath="".//Dimension"" />
1653 <xs:field xpath=""@Number"" />
1655 <xs:unique name=""PK_Element"" msdata:PrimaryKey=""true"">
1656 <xs:selector xpath="".//Element"" />
1657 <xs:field xpath=""@Dimension"" />
1658 <xs:field xpath=""@Number"" />
1660 <xs:keyref name=""FK_Element_To_Dimension"" refer=""PK_Dimension"">
1661 <xs:selector xpath="".//Element"" />
1662 <xs:field xpath=""@Dimension"" />
1666 DataSet ds = new DataSet("Example");
1668 // Add a DataTable with no ReadOnly columns
1669 DataTable dt1 = new DataTable ("StandAlone");
1670 ds.Tables.Add (dt1);
1672 // Add a ReadOnly column
1673 dt1.Columns.Add (new DataColumn ("ID", typeof(int), "",
1674 MappingType.Attribute));
1675 dt1.Columns ["ID"].AllowDBNull = false;
1677 dt1.Columns.Add (new DataColumn ("Desc", typeof
1678 (string), "", MappingType.Attribute));
1679 dt1.Columns ["Desc"].AllowDBNull = false;
1681 // Add related DataTables with ReadOnly columns
1682 DataTable dt2 = new DataTable ("Dimension");
1683 ds.Tables.Add (dt2);
1684 dt2.Columns.Add (new DataColumn ("Number", typeof
1685 (int), "", MappingType.Attribute));
1686 dt2.Columns ["Number"].AllowDBNull = false;
1687 dt2.Columns ["Number"].ReadOnly = true;
1689 dt2.Columns.Add (new DataColumn ("Title", typeof
1690 (string), "", MappingType.Attribute));
1691 dt2.Columns ["Title"].AllowDBNull = false;
1693 dt2.Constraints.Add ("PK_Dimension", dt2.Columns ["Number"], true);
1695 DataTable dt3 = new DataTable ("Element");
1698 dt3.Columns.Add (new DataColumn ("Dimension", typeof
1699 (int), "", MappingType.Attribute));
1700 dt3.Columns ["Dimension"].AllowDBNull = false;
1701 dt3.Columns ["Dimension"].ReadOnly = true;
1703 dt3.Columns.Add (new DataColumn ("Number", typeof
1704 (int), "", MappingType.Attribute));
1705 dt3.Columns ["Number"].AllowDBNull = false;
1706 dt3.Columns ["Number"].ReadOnly = true;
1708 dt3.Columns.Add (new DataColumn ("Title", typeof
1709 (string), "", MappingType.Attribute));
1710 dt3.Columns ["Title"].AllowDBNull = false;
1712 dt3.Constraints.Add ("PK_Element", new DataColumn[] {
1713 dt3.Columns ["Dimension"],
1714 dt3.Columns ["Number"] }, true);
1716 ds.Relations.Add ("FK_Element_To_Dimension",
1717 dt2.Columns ["Number"], dt3.Columns["Dimension"]);
1719 ds.AcceptChanges ();
1721 StringWriter sw = new StringWriter ();
1722 ds.WriteXmlSchema (sw);
1724 string result = sw.ToString ();
1726 AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
1731 public void WriteXmlSchema6 ()
1733 string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
1734 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
1735 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
1737 <xs:choice maxOccurs=""unbounded"">
1738 <xs:element name=""MyType"">
1740 <xs:attribute name=""Desc"">
1742 <xs:restriction base=""xs:string"">
1743 <xs:maxLength value=""32"" />
1753 DataSet ds = new DataSet("Example");
1755 // Add MyType DataTable
1756 ds.Tables.Add ("MyType");
1758 ds.Tables ["MyType"].Columns.Add (new DataColumn(
1759 "Desc", typeof (string), "", MappingType.Attribute));
1760 ds.Tables ["MyType"].Columns ["Desc"].MaxLength = 32;
1762 ds.AcceptChanges ();
1764 StringWriter sw = new StringWriter ();
1765 ds.WriteXmlSchema (sw);
1767 string result = sw.ToString ();
1769 AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
1774 public void WriteXmlSchema7 ()
1776 DataSet ds = new DataSet ();
1777 DataTable dt = new DataTable ("table");
1778 dt.Columns.Add ("col1");
1779 dt.Columns.Add ("col2");
1781 dt.Rows.Add (new object [] {"foo", "bar"});
1782 StringWriter sw = new StringWriter ();
1783 ds.WriteXmlSchema (sw);
1784 Assert (sw.ToString ().IndexOf ("xmlns=\"\"") > 0);
1789 public void WriteXmlExtendedProperties ()
1791 string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
1792 <xs:schema id=""NewDataSet"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"" xmlns:msprop=""urn:schemas-microsoft-com:xml-msprop"">
1793 <xs:element name=""NewDataSet"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"" msprop:version=""version 2.1"">
1795 <xs:choice maxOccurs=""unbounded"">
1796 <xs:element name=""Foo"">
1799 <xs:element name=""col1"" type=""xs:string"" minOccurs=""0"" />
1807 DataSet ds = new DataSet ();
1808 ds.ExtendedProperties ["version"] = "version 2.1";
1809 DataTable dt = new DataTable ("Foo");
1810 dt.Columns.Add ("col1");
1811 dt.Rows.Add (new object [] {"foo"});
1814 StringWriter sw = new StringWriter ();
1815 ds.WriteXmlSchema (sw);
1817 string result = sw.ToString ();
1819 AssertEquals (xml, result.Replace ("\r\n", "\n"));
1823 public void WriteXmlModeSchema ()
1825 // This is the MS output of WriteXmlSchema().
1827 string xml = @"<Example>
1828 <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
1829 <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
1831 <xs:choice maxOccurs=""unbounded"">
1832 <xs:element name=""Dimension"">
1835 <xs:element name=""Number"" type=""xs:int"" />
1839 <xs:element name=""Element"">
1842 <xs:element name=""Dimension"" type=""xs:int"" />
1843 <xs:element name=""Number"" type=""xs:int"" />
1849 <xs:unique name=""PK_Dimension"" msdata:PrimaryKey=""true"">
1850 <xs:selector xpath="".//Dimension"" />
1851 <xs:field xpath=""Number"" />
1853 <xs:unique name=""PK_Element"" msdata:PrimaryKey=""true"">
1854 <xs:selector xpath="".//Element"" />
1855 <xs:field xpath=""Dimension"" />
1856 <xs:field xpath=""Number"" />
1858 <xs:keyref name=""FK_Element_To_Dimension"" refer=""PK_Dimension"">
1859 <xs:selector xpath="".//Element"" />
1860 <xs:field xpath=""Dimension"" />
1871 <Dimension>0</Dimension>
1875 <Dimension>0</Dimension>
1879 <Dimension>0</Dimension>
1883 <Dimension>0</Dimension>
1887 <Dimension>1</Dimension>
1891 <Dimension>1</Dimension>
1895 DataSet ds = new DataSet("Example");
1897 // Dimension DataTable
1898 DataTable dt1 = new DataTable ("Dimension");
1899 ds.Tables.Add (dt1);
1901 dt1.Columns.Add (new DataColumn ("Number", typeof (int)));
1902 dt1.Columns ["Number"].AllowDBNull = false;
1904 dt1.Constraints.Add ("PK_Dimension", dt1.Columns ["Number"], true);
1906 // Element DataTable
1907 DataTable dt2 = new DataTable ("Element");
1908 ds.Tables.Add (dt2);
1910 dt2.Columns.Add (new DataColumn ("Dimension", typeof (int)));
1911 dt2.Columns ["Dimension"].AllowDBNull = false;
1913 dt2.Columns.Add (new DataColumn ("Number", typeof (int)));
1914 dt2.Columns ["Number"].AllowDBNull = false;
1916 dt2.Constraints.Add ("PK_Element", new DataColumn[] {
1917 dt2.Columns ["Dimension"],
1918 dt2.Columns ["Number"] },
1921 // Add DataRelations
1922 ds.Relations.Add ("FK_Element_To_Dimension",
1923 dt1.Columns ["Number"],
1924 dt2.Columns ["Dimension"], true);
1927 for (int i = 0; i < 2; i++) {
1928 DataRow newRow = dt1.NewRow ();
1929 newRow ["Number"] = i;
1930 dt1.Rows.Add (newRow);
1933 // Dimension 0 => 4 Elements
1934 for (int i = 0; i < 4; i++) {
1935 DataRow newRow = dt2.NewRow();
1936 newRow ["Dimension"] = 0;
1937 newRow ["Number"] = i;
1938 dt2.Rows.Add (newRow);
1941 // Dimension 1 => 2 Elements
1942 for (int i = 0; i < 2; i++) {
1943 DataRow newRow = dt2.NewRow();
1944 newRow ["Dimension"] = 1;
1945 newRow ["Number"] = i;
1946 dt2.Rows.Add (newRow);
1949 ds.AcceptChanges ();
1951 StringWriter sw = new StringWriter ();
1952 ds.WriteXml(sw, XmlWriteMode.WriteSchema);
1954 string result = sw.ToString ();
1956 AssertEquals (xml, result.Replace ("\r\n", "\n"));
1960 public void DeserializeModifiedDataSet ()
1962 // Serialization begins
1963 DataSet prevDs = new DataSet ();
1964 DataTable dt = prevDs.Tables.Add ();
1965 dt.Columns.Add(new DataColumn("Id", typeof(string)));
1967 DataRow dr = dt.NewRow();
1970 prevDs.AcceptChanges ();
1971 dr = prevDs.Tables[0].Rows[0];
1974 XmlSerializer serializer = new XmlSerializer (typeof (DataSet));
1975 StringWriter sw = new StringWriter ();
1976 XmlTextWriter xw = new XmlTextWriter (sw);
1977 xw.QuoteChar = '\'';
1978 serializer.Serialize (xw, prevDs);
1980 // Deserialization begins
1981 StringReader sr = new StringReader (sw.ToString ());
1982 XmlTextReader reader = new XmlTextReader (sr);
1983 XmlSerializer serializer1 = new XmlSerializer (typeof (DataSet));
1984 DataSet ds = serializer1.Deserialize (reader) as DataSet;
1985 AssertEquals ("deserialization after modification does not give original values",
1986 prevDs.Tables[0].Rows [0][0,DataRowVersion.Original].ToString (),
1987 ds.Tables[0].Rows [0][0,DataRowVersion.Original].ToString ());
1988 AssertEquals ("deserialization after modification oes not give current values",
1989 prevDs.Tables[0].Rows [0][0,DataRowVersion.Current].ToString (),
1990 ds.Tables[0].Rows [0][0,DataRowVersion.Current].ToString ());
1994 /// Test for testing DataSet.Clear method with foriegn key relations
1995 /// This is expected to clear all the related datatable rows also
1998 public void DataSetClearTest ()
2000 DataSet ds = new DataSet ();
2001 DataTable parent = ds.Tables.Add ("Parent");
2002 DataTable child = ds.Tables.Add ("Child");
2004 parent.Columns.Add ("id", typeof (int));
2005 child.Columns.Add ("ref_id", typeof(int));
2007 child.Constraints.Add (new ForeignKeyConstraint ("fk_constraint", parent.Columns [0], child.Columns [0]));
2009 DataRow dr = parent.NewRow ();
2011 parent.Rows.Add (dr);
2012 dr.AcceptChanges ();
2014 dr = child.NewRow ();
2016 child.Rows.Add (dr);
2017 dr.AcceptChanges ();
2020 ds.Clear (); // this should clear all the rows in parent & child tables
2021 } catch (Exception e) {
2022 throw (new Exception ("Exception should not have been thrown at Clear method" + e.ToString ()));
2024 Assertion.AssertEquals ("parent table rows should not exist!", 0, parent.Rows.Count);
2025 Assertion.AssertEquals ("child table rows should not exist!", 0, child.Rows.Count);
2029 public void CloneSubClassTest()
2031 MyDataSet ds1 = new MyDataSet();
2032 MyDataSet ds = (MyDataSet)(ds1.Clone());
2033 AssertEquals("A#01",2,MyDataSet.count);
2036 #region DataSet.GetChanges Tests
2037 public void GetChanges_Relations_DifferentRowStatesTest ()
2039 DataSet ds = new DataSet ("ds");
2040 DataTable parent = ds.Tables.Add ("parent");
2041 DataTable child = ds.Tables.Add ("child");
2043 parent.Columns.Add ("id", typeof (int));
2044 parent.Columns.Add ("name", typeof (string));
2047 child.Columns.Add ("id", typeof (int));
2048 child.Columns.Add ("parent", typeof (int));
2049 child.Columns.Add ("name", typeof (string));
2051 parent.Rows.Add (new object [] { 1, "mono parent 1" } );
2052 parent.Rows.Add (new object [] { 2, "mono parent 2" } );
2053 parent.Rows.Add (new object [] { 3, "mono parent 3" } );
2054 parent.Rows.Add (new object [] { 4, "mono parent 4" } );
2055 parent.AcceptChanges ();
2057 child.Rows.Add (new object [] { 1, 1, "mono child 1" } );
2058 child.Rows.Add (new object [] { 2, 2, "mono child 2" } );
2059 child.Rows.Add (new object [] { 3, 3, "mono child 3" } );
2060 child.AcceptChanges ();
2062 DataRelation relation = ds.Relations.Add ("parent_child",
2063 parent.Columns ["id"],
2064 child.Columns ["parent"]);
2066 // modify the parent and get changes
2067 child.Rows [1]["parent"] = 4;
2068 DataSet changes = ds.GetChanges ();
2069 DataRow row = changes.Tables ["parent"].Rows[0];
2070 AssertType.AreEqual ((int) parent.Rows [3][0], (int) row [0], "#RT1");
2071 AssertType.AreEqual (1, changes.Tables ["parent"].Rows.Count, "#RT2 only get parent row with current version");
2072 ds.RejectChanges ();
2074 // delete a child row and get changes.
2075 child.Rows [0].Delete ();
2076 changes = ds.GetChanges ();
2078 AssertType.AreEqual (changes.Tables.Count, 2, "#RT3 Should import parent table as well");
2079 AssertType.AreEqual (1, changes.Tables ["parent"].Rows.Count, "#RT4 only get parent row with original version");
2080 AssertType.AreEqual (1, (int) changes.Tables ["parent"].Rows [0][0], "#RT5 parent row based on original version");
2082 #endregion // DataSet.GetChanges Tests
2085 public void RuleTest ()
2087 DataSet ds = new DataSet ("testds");
2088 DataTable parent = ds.Tables.Add ("parent");
2089 DataTable child = ds.Tables.Add ("child");
2091 parent.Columns.Add ("id", typeof (int));
2092 parent.Columns.Add ("name", typeof (string));
2093 parent.PrimaryKey = new DataColumn [] {parent.Columns ["id"]} ;
2095 child.Columns.Add ("id", typeof (int));
2096 child.Columns.Add ("parent", typeof (int));
2097 child.Columns.Add ("name", typeof (string));
2098 child.PrimaryKey = new DataColumn [] {child.Columns ["id"]} ;
2100 DataRelation relation = ds.Relations.Add ("parent_child",
2101 parent.Columns ["id"],
2102 child.Columns ["parent"]);
2104 parent.Rows.Add (new object [] {1, "mono test 1"});
2105 parent.Rows.Add (new object [] {2, "mono test 2"});
2106 parent.Rows.Add (new object [] {3, "mono test 3"});
2108 child.Rows.Add (new object [] {1, 1, "mono child test 1"});
2109 child.Rows.Add (new object [] {2, 2, "mono child test 2"});
2110 child.Rows.Add (new object [] {3, 3, "mono child test 3"});
2112 ds.AcceptChanges ();
2114 parent.Rows [0] ["name"] = "mono changed test 1";
2116 Assertion.AssertEquals ("#RT1 child should not be modified",
2117 DataRowState.Unchanged,
2118 parent.Rows [0].GetChildRows (relation) [0].RowState);
2120 ds.RejectChanges ();
2121 parent.Rows [0] ["id"] = "4";
2123 DataRow childRow = parent.Rows [0].GetChildRows (relation) [0];
2124 Assertion.AssertEquals ("#RT2 child should be modified",
2125 DataRowState.Modified,
2127 Assertion.AssertEquals ("#RT3 child should point to modified row",
2129 (int) childRow ["parent"]);
2132 [Test] // from bug #76480
2133 public void WriteXmlEscapeName ()
2136 DataSet data = new DataSet();
2138 DataTable mainTable = data.Tables.Add ("main");
2139 DataColumn mainkey = mainTable.Columns.Add ("mainkey", typeof(Guid));
2140 mainTable.Columns.Add ("col.2<hi/>", typeof (string));
2141 mainTable.Columns.Add ("#col3", typeof (string));
2144 mainTable.Rows.Add (new object [] { Guid.NewGuid (), "hi there", "my friend" } );
2145 mainTable.Rows.Add (new object [] { Guid.NewGuid (), "what is", "your name" } );
2146 mainTable.Rows.Add (new object [] { Guid.NewGuid (), "I have", "a bean" } );
2149 StringWriter writer = new StringWriter ();
2150 data.WriteXml (writer, XmlWriteMode.WriteSchema);
2151 string xml = writer.ToString ();
2152 Assert ("#1", xml.IndexOf ("name=\"col.2_x003C_hi_x002F__x003E_\"") > 0);
2153 Assert ("#2", xml.IndexOf ("name=\"_x0023_col3\"") > 0);
2154 Assert ("#3", xml.IndexOf ("<col.2_x003C_hi_x002F__x003E_>hi there</col.2_x003C_hi_x002F__x003E_>") > 0);
2157 DataSet data2 = new DataSet();
2158 data2.ReadXml (new StringReader (
2159 writer.GetStringBuilder ().ToString ()));
2165 public class MyDataSet:DataSet {
2167 public static int count = 0;
2169 public MyDataSet() {