2 // DataSetReadXmlTest.cs
\r
5 // Atsushi Enomoto <atsushi@ximian.com>
\r
7 // (C)2004 Novell Inc.
\r
15 using NUnit.Framework;
\r
17 namespace MonoTests.System.Data
\r
20 public class DataSetReadXmlTest : DataSetAssertion
\r
23 const string xml1 = "";
\r
24 const string xml2 = "<root/>";
\r
25 const string xml3 = "<root></root>";
\r
26 const string xml4 = "<root> </root>";
\r
27 const string xml5 = "<root>test</root>";
\r
28 const string xml6 = "<root><test>1</test></root>";
\r
29 const string xml7 = "<root><test>1</test><test2>a</test2></root>";
\r
30 const string xml8 = "<dataset><table><col1>foo</col1><col2>bar</col2></table></dataset>";
\r
32 const string diff1 = @"<diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
\r
34 <Table1 diffgr:id='Table11' msdata:rowOrder='0' diffgr:hasChanges='inserted'>
\r
35 <Column1_1>ppp</Column1_1>
\r
36 <Column1_2>www</Column1_2>
\r
37 <Column1_3>xxx</Column1_3>
\r
40 </diffgr:diffgram>";
\r
41 const string diff2 = diff1 + xml8;
\r
43 const string schema1 = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
\r
44 <xs:element name='Root'>
\r
47 <xs:element name='Child' type='xs:string' />
\r
52 const string schema2 = schema1 + xml8;
\r
55 public void ReadSimpleAuto ()
\r
60 ds = new DataSet ();
\r
61 AssertReadXml (ds, "EmptyString", xml1,
\r
62 XmlReadMode.Auto, XmlReadMode.Auto,
\r
66 ds = new DataSet ();
\r
67 AssertReadXml (ds, "EmptyElement", xml2,
\r
68 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
72 ds = new DataSet ();
\r
73 AssertReadXml (ds, "StartEndTag", xml3,
\r
74 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
77 // whitespace in simple element
\r
78 ds = new DataSet ();
\r
79 AssertReadXml (ds, "Whitespace", xml4,
\r
80 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
83 // text in simple element
\r
84 ds = new DataSet ();
\r
85 AssertReadXml (ds, "SingleText", xml5,
\r
86 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
89 // simple table pattern:
\r
90 // root becomes a table and test becomes a column.
\r
91 ds = new DataSet ();
\r
92 AssertReadXml (ds, "SimpleTable", xml6,
\r
93 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
95 AssertDataTable ("xml6", ds.Tables [0], "root", 1, 1, 0, 0);
\r
97 // simple table with 2 columns:
\r
98 ds = new DataSet ();
\r
99 AssertReadXml (ds, "SimpleTable2", xml7,
\r
100 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
102 AssertDataTable ("xml7", ds.Tables [0], "root", 2, 1, 0, 0);
\r
104 // simple dataset with 1 table:
\r
105 ds = new DataSet ();
\r
106 AssertReadXml (ds, "SimpleDataSet", xml8,
\r
107 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
109 AssertDataTable ("xml8", ds.Tables [0], "table", 2, 1, 0, 0);
\r
113 public void ReadSimpleDiffgram ()
\r
118 ds = new DataSet ();
\r
119 AssertReadXml (ds, "EmptyString", xml1,
\r
120 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
124 ds = new DataSet ();
\r
125 AssertReadXml (ds, "EmptyElement", xml2,
\r
126 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
130 ds = new DataSet ();
\r
131 AssertReadXml (ds, "StartEndTag", xml3,
\r
132 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
135 // whitespace in simple element
\r
136 ds = new DataSet ();
\r
137 AssertReadXml (ds, "Whitespace", xml4,
\r
138 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
141 // text in simple element
\r
142 ds = new DataSet ();
\r
143 AssertReadXml (ds, "SingleText", xml5,
\r
144 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
147 // simple table pattern:
\r
148 ds = new DataSet ();
\r
149 AssertReadXml (ds, "SimpleTable", xml6,
\r
150 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
153 // simple table with 2 columns:
\r
154 ds = new DataSet ();
\r
155 AssertReadXml (ds, "SimpleTable2", xml7,
\r
156 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
159 // simple dataset with 1 table:
\r
160 ds = new DataSet ();
\r
161 AssertReadXml (ds, "SimpleDataSet", xml8,
\r
162 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
167 public void ReadSimpleFragment ()
\r
172 ds = new DataSet ();
\r
173 AssertReadXml (ds, "EmptyString", xml1,
\r
174 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
178 ds = new DataSet ();
\r
179 AssertReadXml (ds, "EmptyElement", xml2,
\r
180 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
184 ds = new DataSet ();
\r
185 AssertReadXml (ds, "StartEndTag", xml3,
\r
186 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
189 // whitespace in simple element
\r
190 ds = new DataSet ();
\r
191 AssertReadXml (ds, "Whitespace", xml4,
\r
192 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
195 // text in simple element
\r
196 ds = new DataSet ();
\r
197 AssertReadXml (ds, "SingleText", xml5,
\r
198 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
201 // simple table pattern:
\r
202 ds = new DataSet ();
\r
203 AssertReadXml (ds, "SimpleTable", xml6,
\r
204 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
207 // simple table with 2 columns:
\r
208 ds = new DataSet ();
\r
209 AssertReadXml (ds, "SimpleTable2", xml7,
\r
210 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
213 // simple dataset with 1 table:
\r
214 ds = new DataSet ();
\r
215 AssertReadXml (ds, "SimpleDataSet", xml8,
\r
216 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
221 public void ReadSimpleIgnoreSchema ()
\r
226 ds = new DataSet ();
\r
227 AssertReadXml (ds, "EmptyString", xml1,
\r
228 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
232 ds = new DataSet ();
\r
233 AssertReadXml (ds, "EmptyElement", xml2,
\r
234 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
238 ds = new DataSet ();
\r
239 AssertReadXml (ds, "StartEndTag", xml3,
\r
240 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
243 // whitespace in simple element
\r
244 ds = new DataSet ();
\r
245 AssertReadXml (ds, "Whitespace", xml4,
\r
246 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
249 // text in simple element
\r
250 ds = new DataSet ();
\r
251 AssertReadXml (ds, "SingleText", xml5,
\r
252 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
255 // simple table pattern:
\r
256 ds = new DataSet ();
\r
257 AssertReadXml (ds, "SimpleTable", xml6,
\r
258 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
261 // simple table with 2 columns:
\r
262 ds = new DataSet ();
\r
263 AssertReadXml (ds, "SimpleTable2", xml7,
\r
264 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
267 // simple dataset with 1 table:
\r
268 ds = new DataSet ();
\r
269 AssertReadXml (ds, "SimpleDataSet", xml8,
\r
270 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
275 public void ReadSimpleInferSchema ()
\r
280 ds = new DataSet ();
\r
281 AssertReadXml (ds, "EmptyString", xml1,
\r
282 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
286 ds = new DataSet ();
\r
287 AssertReadXml (ds, "EmptyElement", xml2,
\r
288 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
292 ds = new DataSet ();
\r
293 AssertReadXml (ds, "StartEndTag", xml3,
\r
294 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
297 // whitespace in simple element
\r
298 ds = new DataSet ();
\r
299 AssertReadXml (ds, "Whitespace", xml4,
\r
300 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
303 // text in simple element
\r
304 ds = new DataSet ();
\r
305 AssertReadXml (ds, "SingleText", xml5,
\r
306 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
309 // simple table pattern:
\r
310 // root becomes a table and test becomes a column.
\r
311 ds = new DataSet ();
\r
312 AssertReadXml (ds, "SimpleTable", xml6,
\r
313 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
315 AssertDataTable ("xml6", ds.Tables [0], "root", 1, 1, 0, 0);
\r
317 // simple table with 2 columns:
\r
318 ds = new DataSet ();
\r
319 AssertReadXml (ds, "SimpleTable2", xml7,
\r
320 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
322 AssertDataTable ("xml7", ds.Tables [0], "root", 2, 1, 0, 0);
\r
324 // simple dataset with 1 table:
\r
325 ds = new DataSet ();
\r
326 AssertReadXml (ds, "SimpleDataSet", xml8,
\r
327 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
329 AssertDataTable ("xml8", ds.Tables [0], "table", 2, 1, 0, 0);
\r
333 public void ReadSimpleReadSchema ()
\r
338 ds = new DataSet ();
\r
339 AssertReadXml (ds, "EmptyString", xml1,
\r
340 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
344 ds = new DataSet ();
\r
345 AssertReadXml (ds, "EmptyElement", xml2,
\r
346 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
350 ds = new DataSet ();
\r
351 AssertReadXml (ds, "StartEndTag", xml3,
\r
352 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
355 // whitespace in simple element
\r
356 ds = new DataSet ();
\r
357 AssertReadXml (ds, "Whitespace", xml4,
\r
358 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
361 // text in simple element
\r
362 ds = new DataSet ();
\r
363 AssertReadXml (ds, "SingleText", xml5,
\r
364 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
367 // simple table pattern:
\r
368 ds = new DataSet ();
\r
369 AssertReadXml (ds, "SimpleTable", xml6,
\r
370 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
373 // simple table with 2 columns:
\r
374 ds = new DataSet ();
\r
375 AssertReadXml (ds, "SimpleTable2", xml7,
\r
376 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
379 // simple dataset with 1 table:
\r
380 ds = new DataSet ();
\r
381 AssertReadXml (ds, "SimpleDataSet", xml8,
\r
382 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
387 public void TestSimpleDiffXmlAll ()
\r
392 ds = new DataSet ();
\r
393 AssertReadXml (ds, "Fragment", diff1,
\r
394 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
397 ds = new DataSet ();
\r
398 AssertReadXml (ds, "IgnoreSchema", diff1,
\r
399 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
402 ds = new DataSet ();
\r
403 AssertReadXml (ds, "InferSchema", diff1,
\r
404 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
407 ds = new DataSet ();
\r
408 AssertReadXml (ds, "ReadSchema", diff1,
\r
409 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
412 // Auto, DiffGram ... treated as DiffGram
\r
413 ds = new DataSet ();
\r
414 AssertReadXml (ds, "Auto", diff1,
\r
415 XmlReadMode.Auto, XmlReadMode.DiffGram,
\r
418 ds = new DataSet ();
\r
419 AssertReadXml (ds, "DiffGram", diff1,
\r
420 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
425 public void TestSimpleDiffPlusContentAll ()
\r
429 // Fragment ... skipped
\r
430 ds = new DataSet ();
\r
431 AssertReadXml (ds, "Fragment", diff2,
\r
432 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
435 // others ... kept
\r
436 ds = new DataSet ();
\r
437 AssertReadXml (ds, "IgnoreSchema", diff2,
\r
438 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
439 "NewDataSet", 0, ReadState.Interactive);
\r
441 ds = new DataSet ();
\r
442 AssertReadXml (ds, "InferSchema", diff2,
\r
443 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
444 "NewDataSet", 0, ReadState.Interactive);
\r
446 ds = new DataSet ();
\r
447 AssertReadXml (ds, "ReadSchema", diff2,
\r
448 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
449 "NewDataSet", 0, ReadState.Interactive);
\r
451 // Auto, DiffGram ... treated as DiffGram
\r
452 ds = new DataSet ();
\r
453 AssertReadXml (ds, "Auto", diff2,
\r
454 XmlReadMode.Auto, XmlReadMode.DiffGram,
\r
455 "NewDataSet", 0, ReadState.Interactive);
\r
457 ds = new DataSet ();
\r
458 AssertReadXml (ds, "DiffGram", diff2,
\r
459 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
460 "NewDataSet", 0, ReadState.Interactive);
\r
464 public void TestSimpleSchemaXmlAll ()
\r
469 ds = new DataSet ();
\r
470 AssertReadXml (ds, "IgnoreSchema", schema1,
\r
471 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
474 ds = new DataSet ();
\r
475 AssertReadXml (ds, "InferSchema", schema1,
\r
476 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
479 // misc ... consume schema
\r
480 ds = new DataSet ();
\r
481 AssertReadXml (ds, "Fragment", schema1,
\r
482 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
484 AssertDataTable ("fragment", ds.Tables [0], "Root", 1, 0, 0, 0);
\r
486 ds = new DataSet ();
\r
487 AssertReadXml (ds, "ReadSchema", schema1,
\r
488 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
490 AssertDataTable ("readschema", ds.Tables [0], "Root", 1, 0, 0, 0);
\r
492 ds = new DataSet ();
\r
493 AssertReadXml (ds, "Auto", schema1,
\r
494 XmlReadMode.Auto, XmlReadMode.ReadSchema,
\r
496 AssertDataTable ("auto", ds.Tables [0], "Root", 1, 0, 0, 0);
\r
498 ds = new DataSet ();
\r
499 AssertReadXml (ds, "DiffGram", schema1,
\r
500 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
505 public void TestSimpleSchemaPlusContentAll ()
\r
510 ds = new DataSet ();
\r
511 AssertReadXml (ds, "IgnoreSchema", schema2,
\r
512 XmlReadMode.IgnoreSchema, XmlReadMode.IgnoreSchema,
\r
513 "NewDataSet", 0, ReadState.Interactive);
\r
515 ds = new DataSet ();
\r
516 AssertReadXml (ds, "InferSchema", schema2,
\r
517 XmlReadMode.InferSchema, XmlReadMode.InferSchema,
\r
518 "NewDataSet", 0, ReadState.Interactive);
\r
520 // Fragment ... consumed both
\r
521 ds = new DataSet ();
\r
522 AssertReadXml (ds, "Fragment", schema2,
\r
523 XmlReadMode.Fragment, XmlReadMode.Fragment,
\r
525 AssertDataTable ("fragment", ds.Tables [0], "Root", 1, 0, 0, 0);
\r
527 // rest ... treated as schema
\r
528 ds = new DataSet ();
\r
529 AssertReadXml (ds, "Auto", schema2,
\r
530 XmlReadMode.Auto, XmlReadMode.ReadSchema,
\r
531 "NewDataSet", 1, ReadState.Interactive);
\r
532 AssertDataTable ("auto", ds.Tables [0], "Root", 1, 0, 0, 0);
\r
534 ds = new DataSet ();
\r
535 AssertReadXml (ds, "DiffGram", schema2,
\r
536 XmlReadMode.DiffGram, XmlReadMode.DiffGram,
\r
537 "NewDataSet", 1, ReadState.Interactive);
\r
538 AssertDataTable ("diffgram", ds.Tables [0], "Root", 1, 0, 0, 0);
\r
540 ds = new DataSet ();
\r
541 AssertReadXml (ds, "ReadSchema", schema2,
\r
542 XmlReadMode.ReadSchema, XmlReadMode.ReadSchema,
\r
543 "NewDataSet", 1, ReadState.Interactive);
\r
547 public void SequentialRead1 ()
\r
549 // simple element -> simple table
\r
550 DataSet ds = new DataSet ();
\r
552 AssertReadXml (ds, "SingleText", xml5,
\r
553 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
556 AssertReadXml (ds, "SimpleTable", xml6,
\r
557 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
558 "root", 1); // not NewDataSet unlike standalone load
\r
559 AssertDataTable ("seq1", ds.Tables [0], "root", 1, 1, 0, 0);
\r
563 public void SequentialRead2 ()
\r
565 // simple element -> simple dataset
\r
566 DataSet ds = new DataSet ();
\r
568 AssertReadXml (ds, "SingleText", xml5,
\r
569 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
572 AssertReadXml (ds, "SimpleTable2", xml7,
\r
573 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
574 "root", 1); // dataset name will not be overwritten
\r
575 AssertDataTable ("#1", ds.Tables [0], "root", 2, 1, 0, 0);
\r
577 // simple table -> simple dataset
\r
578 ds = new DataSet ();
\r
580 AssertReadXml (ds, "SimpleTable", xml6,
\r
581 XmlReadMode.Auto, XmlReadMode.InferSchema,
\r
583 AssertDataTable ("#2", ds.Tables [0], "root", 1, 1, 0, 0);
\r
585 // Return value became IgnoreSchema, since there is
\r
586 // already schema information in the dataset.
\r
587 // Columns are kept 1 as old table holds.
\r
588 // Rows are up to 2 because of accumulative read.
\r
589 AssertReadXml (ds, "SimpleTable2", xml7,
\r
590 XmlReadMode.Auto, XmlReadMode.IgnoreSchema,
\r
592 AssertDataTable ("#3", ds.Tables [0], "root", 1, 2, 0, 0);
\r
597 public void IgnoreSchemaShouldFillData ()
\r
600 string xml1 = "<set><tab><col>test</col></tab></set>";
\r
601 // no wrapper element
\r
602 string xml2 = "<tab><col>test</col></tab>";
\r
604 string xml3 = "<tar><col>test</col></tar>";
\r
605 DataSet ds = new DataSet ();
\r
606 DataTable dt = new DataTable ("tab");
\r
607 ds.Tables.Add (dt);
\r
608 dt.Columns.Add ("col");
\r
609 ds.ReadXml (new StringReader (xml1), XmlReadMode.IgnoreSchema);
\r
610 AssertEquals ("NewDataSet", ds.DataSetName); // don't overwrite
\r
611 AssertEquals ("wrapper element", 1, dt.Rows.Count);
\r
614 ds.ReadXml (new StringReader (xml2), XmlReadMode.IgnoreSchema);
\r
615 AssertEquals ("no wrapper element", 1, dt.Rows.Count);
\r
618 ds.ReadXml (new StringReader (xml3), XmlReadMode.IgnoreSchema);
\r
619 AssertEquals ("no such table", 0, dt.Rows.Count);
\r
624 public void SaveDiffLoadAutoSaveSchema ()
\r
626 DataSet ds = new DataSet ();
\r
627 ds.Tables.Add ("Table1");
\r
628 ds.Tables.Add ("Table2");
\r
629 ds.Tables [0].Columns.Add ("Column1_1");
\r
630 ds.Tables [0].Columns.Add ("Column1_2");
\r
631 ds.Tables [0].Columns.Add ("Column1_3");
\r
632 ds.Tables [1].Columns.Add ("Column2_1");
\r
633 ds.Tables [1].Columns.Add ("Column2_2");
\r
634 ds.Tables [1].Columns.Add ("Column2_3");
\r
635 ds.Tables [0].Rows.Add (new object [] {"ppp", "www", "xxx"});
\r
637 // save as diffgram
\r
638 StringWriter sw = new StringWriter ();
\r
639 ds.WriteXml (sw, XmlWriteMode.DiffGram);
\r
640 string xml = sw.ToString ();
\r
641 string result = new StreamReader ("Test/System.Data/DataSetReadXmlTest1.xml", Encoding.ASCII).ReadToEnd ();
\r
642 AssertEquals ("#01", result, xml);
\r
644 // load diffgram above
\r
645 ds.ReadXml (new StringReader (sw.ToString ()));
\r
646 sw = new StringWriter ();
\r
647 ds.WriteXml (sw, XmlWriteMode.WriteSchema);
\r
648 xml = sw.ToString ();
\r
649 result = new StreamReader ("Test/System.Data/DataSetReadXmlTest2.xml", Encoding.ASCII).ReadToEnd ();
\r
650 AssertEquals ("#02", result, xml);
\r