DataSetTest.cs 96 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078
  1. // MonoTests.System.Data.DataSetTest.cs
  2. //
  3. // Authors:
  4. // Ville Palo <[email protected]>
  5. // Martin Willemoes Hansen <[email protected]>
  6. // Atsushi Enomoto <[email protected]>
  7. //
  8. // (C) Copyright 2002 Ville Palo
  9. // (C) Copyright 2003 Martin Willemoes Hansen
  10. //
  11. // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
  12. //
  13. // Permission is hereby granted, free of charge, to any person obtaining
  14. // a copy of this software and associated documentation files (the
  15. // "Software"), to deal in the Software without restriction, including
  16. // without limitation the rights to use, copy, modify, merge, publish,
  17. // distribute, sublicense, and/or sell copies of the Software, and to
  18. // permit persons to whom the Software is furnished to do so, subject to
  19. // the following conditions:
  20. //
  21. // The above copyright notice and this permission notice shall be
  22. // included in all copies or substantial portions of the Software.
  23. //
  24. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  25. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  26. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  27. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  28. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  29. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  30. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  31. //
  32. using NUnit.Framework;
  33. using System;
  34. using System.Xml;
  35. using System.Xml.Serialization;
  36. using System.IO;
  37. using System.Data;
  38. using System.Data.SqlTypes;
  39. using System.Globalization;
  40. using System.Threading;
  41. using System.Text;
  42. using AssertType = NUnit.Framework.Assert;
  43. namespace MonoTests.System.Data
  44. {
  45. [TestFixture]
  46. public class DataSetTest : DataSetAssertion
  47. {
  48. string EOL = Environment.NewLine;
  49. CultureInfo currentCultureBackup;
  50. [SetUp]
  51. public void GetReady()
  52. {
  53. currentCultureBackup = Thread.CurrentThread.CurrentCulture;
  54. Thread.CurrentThread.CurrentCulture = new CultureInfo ("fi-FI");
  55. }
  56. [TearDown]
  57. public void Teardown ()
  58. {
  59. Thread.CurrentThread.CurrentCulture = currentCultureBackup;
  60. }
  61. [Test]
  62. public void Properties ()
  63. {
  64. DataSet ds = new DataSet ();
  65. AssertEquals ("default namespace", String.Empty, ds.Namespace);
  66. ds.Namespace = null; // setting null == setting ""
  67. AssertEquals ("after setting null to namespace", String.Empty, ds.Namespace);
  68. AssertEquals ("default prefix", String.Empty, ds.Prefix);
  69. ds.Prefix = null; // setting null == setting ""
  70. AssertEquals ("after setting null to prefix", String.Empty, ds.Prefix);
  71. }
  72. [Test]
  73. public void ReadXmlSchema ()
  74. {
  75. DataSet ds = new DataSet ();
  76. ds.ReadXmlSchema ("Test/System.Data/own_schema.xsd");
  77. AssertEquals ("test#01", 2, ds.Tables.Count);
  78. DataTable Table = ds.Tables [0];
  79. AssertEquals ("test#02", "test_table", Table.TableName);
  80. AssertEquals ("test#03", "", Table.Namespace);
  81. AssertEquals ("test#04", 2, Table.Columns.Count);
  82. AssertEquals ("test#05", 0, Table.Rows.Count);
  83. AssertEquals ("test#06", false, Table.CaseSensitive);
  84. AssertEquals ("test#07", 1, Table.Constraints.Count);
  85. AssertEquals ("test#08", "", Table.Prefix);
  86. Constraint cons = Table.Constraints [0];
  87. AssertEquals ("test#09", "Constraint1", cons.ConstraintName.ToString ());
  88. AssertEquals ("test#10", "Constraint1", cons.ToString ());
  89. DataColumn column = Table.Columns [0];
  90. AssertEquals ("test#11", true, column.AllowDBNull);
  91. AssertEquals ("test#12", false, column.AutoIncrement);
  92. AssertEquals ("test#13", 0L, column.AutoIncrementSeed);
  93. AssertEquals ("test#14", 1L, column.AutoIncrementStep);
  94. AssertEquals ("test#15", "test", column.Caption);
  95. AssertEquals ("test#16", "Element", column.ColumnMapping.ToString ());
  96. AssertEquals ("test#17", "first", column.ColumnName);
  97. AssertEquals ("test#18", "System.String", column.DataType.ToString ());
  98. AssertEquals ("test#19", "test_default_value", column.DefaultValue.ToString ());
  99. AssertEquals ("test#20", false, column.DesignMode);
  100. AssertEquals ("test#21", "", column.Expression);
  101. AssertEquals ("test#22", 100, column.MaxLength);
  102. AssertEquals ("test#23", "", column.Namespace);
  103. AssertEquals ("test#24", 0, column.Ordinal);
  104. AssertEquals ("test#25", "", column.Prefix);
  105. AssertEquals ("test#26", false, column.ReadOnly);
  106. AssertEquals ("test#27", true, column.Unique);
  107. DataColumn column2 = Table.Columns [1];
  108. AssertEquals ("test#28", true, column2.AllowDBNull);
  109. AssertEquals ("test#29", false, column2.AutoIncrement);
  110. AssertEquals ("test#30", 0L, column2.AutoIncrementSeed);
  111. AssertEquals ("test#31", 1L, column2.AutoIncrementStep);
  112. AssertEquals ("test#32", "second", column2.Caption);
  113. AssertEquals ("test#33", "Element", column2.ColumnMapping.ToString ());
  114. AssertEquals ("test#34", "second", column2.ColumnName);
  115. AssertEquals ("test#35", "System.Data.SqlTypes.SqlGuid", column2.DataType.ToString ());
  116. AssertEquals ("test#36", "", column2.DefaultValue.ToString ());
  117. AssertEquals ("test#37", false, column2.DesignMode);
  118. AssertEquals ("test#38", "", column2.Expression);
  119. AssertEquals ("test#39", -1, column2.MaxLength);
  120. AssertEquals ("test#40", "", column2.Namespace);
  121. AssertEquals ("test#41", 1, column2.Ordinal);
  122. AssertEquals ("test#42", "", column2.Prefix);
  123. AssertEquals ("test#43", false, column2.ReadOnly);
  124. AssertEquals ("test#44", false, column2.Unique);
  125. DataTable Table2 = ds.Tables [1];
  126. AssertEquals ("test#45", "second_test_table", Table2.TableName);
  127. AssertEquals ("test#46", "", Table2.Namespace);
  128. AssertEquals ("test#47", 1, Table2.Columns.Count);
  129. AssertEquals ("test#48", 0, Table2.Rows.Count);
  130. AssertEquals ("test#49", false, Table2.CaseSensitive);
  131. AssertEquals ("test#50", 1, Table2.Constraints.Count);
  132. AssertEquals ("test#51", "", Table2.Prefix);
  133. DataColumn column3 = Table2.Columns [0];
  134. AssertEquals ("test#52", true, column3.AllowDBNull);
  135. AssertEquals ("test#53", false, column3.AutoIncrement);
  136. AssertEquals ("test#54", 0L, column3.AutoIncrementSeed);
  137. AssertEquals ("test#55", 1L, column3.AutoIncrementStep);
  138. AssertEquals ("test#56", "second_first", column3.Caption);
  139. AssertEquals ("test#57", "Element", column3.ColumnMapping.ToString ());
  140. AssertEquals ("test#58", "second_first", column3.ColumnName);
  141. AssertEquals ("test#59", "System.String", column3.DataType.ToString ());
  142. AssertEquals ("test#60", "default_value", column3.DefaultValue.ToString ());
  143. AssertEquals ("test#61", false, column3.DesignMode);
  144. AssertEquals ("test#62", "", column3.Expression);
  145. AssertEquals ("test#63", 100, column3.MaxLength);
  146. AssertEquals ("test#64", "", column3.Namespace);
  147. AssertEquals ("test#65", 0, column3.Ordinal);
  148. AssertEquals ("test#66", "", column3.Prefix);
  149. AssertEquals ("test#67", false, column3.ReadOnly);
  150. AssertEquals ("test#68", true, column3.Unique);
  151. }
  152. [Test]
  153. public void OwnWriteXmlSchema ()
  154. {
  155. DataSet ds = new DataSet ("test_dataset");
  156. DataTable table = new DataTable ("test_table");
  157. DataColumn column = new DataColumn ("first", typeof (string));
  158. column.AllowDBNull = true;
  159. column.DefaultValue = "test_default_value";
  160. column.MaxLength = 100;
  161. column.Caption = "test";
  162. column.Unique = true;
  163. table.Columns.Add (column);
  164. DataColumn column2 = new DataColumn ("second", typeof (SqlGuid));
  165. column2.ColumnMapping = MappingType.Element;
  166. table.Columns.Add (column2);
  167. ds.Tables.Add (table);
  168. DataTable table2 = new DataTable ("second_test_table");
  169. DataColumn column3 = new DataColumn ("second_first", typeof (string));
  170. column3.AllowDBNull = true;
  171. column3.DefaultValue = "default_value";
  172. column3.MaxLength = 100;
  173. column3.Unique = true;
  174. table2.Columns.Add (column3);
  175. ds.Tables.Add (table2);
  176. TextWriter writer = new StringWriter ();
  177. ds.WriteXmlSchema (writer);
  178. string TextString = GetNormalizedSchema (writer.ToString ());
  179. // string TextString = writer.ToString ();
  180. string substring = TextString.Substring (0, TextString.IndexOf(EOL));
  181. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  182. AssertEquals ("test#01", "<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring);
  183. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  184. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  185. // This is original DataSet.WriteXmlSchema() output
  186. // 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);
  187. 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);
  188. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  189. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  190. // This is original DataSet.WriteXmlSchema() output
  191. // AssertEquals ("test#03", " <xs:element name=\"test_dataset\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
  192. AssertEquals ("test#03", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"test_dataset\">", substring);
  193. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  194. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  195. AssertEquals ("test#04", " <xs:complexType>", substring);
  196. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  197. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  198. AssertEquals ("test#05", " <xs:choice maxOccurs=\"unbounded\">", substring);
  199. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  200. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  201. AssertEquals ("test#06", " <xs:element name=\"test_table\">", substring);
  202. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  203. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  204. AssertEquals ("test#07", " <xs:complexType>", substring);
  205. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  206. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  207. AssertEquals ("test#08", " <xs:sequence>", substring);
  208. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  209. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  210. // This is original DataSet.WriteXmlSchema() output
  211. // AssertEquals ("test#09", " <xs:element name=\"first\" msdata:Caption=\"test\" default=\"test_default_value\" minOccurs=\"0\">", substring);
  212. AssertEquals ("test#09", " <xs:element default=\"test_default_value\" minOccurs=\"0\" msdata:Caption=\"test\" name=\"first\">", substring);
  213. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  214. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  215. AssertEquals ("test#10", " <xs:simpleType>", substring);
  216. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  217. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  218. AssertEquals ("test#11", " <xs:restriction base=\"xs:string\">", substring);
  219. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  220. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  221. AssertEquals ("test#12", " <xs:maxLength value=\"100\" />", substring);
  222. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  223. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  224. AssertEquals ("test#13", " </xs:restriction>", substring);
  225. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  226. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  227. AssertEquals ("test#14", " </xs:simpleType>", substring);
  228. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  229. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  230. AssertEquals ("test#15", " </xs:element>", substring);
  231. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  232. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  233. // This is original DataSet.WriteXmlSchema() output
  234. // 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);
  235. #if NET_2_0
  236. AssertEquals ("test#16", " <xs:element minOccurs=\"0\" msdata:DataType=\"System.Data.SqlTypes.SqlGuid, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"second\" type=\"xs:string\" />", substring);
  237. #else
  238. 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);
  239. #endif
  240. if (substring.IndexOf ("<xs:element") < 0)
  241. Fail ("test#16: " + substring);
  242. if (substring.IndexOf ("name=\"second\"") < 0)
  243. Fail ("test#16: " + substring);
  244. if (substring.IndexOf ("msdata:DataType=\"System.Data.SqlTypes.SqlGuid, System.Data, Version=") < 0)
  245. Fail ("test#16: " + substring);
  246. if (substring.IndexOf ("type=\"xs:string\"") < 0)
  247. Fail ("test#16: " + substring);
  248. if (substring.IndexOf ("minOccurs=\"0\"") < 0)
  249. Fail ("test#16: " + substring);
  250. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  251. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  252. AssertEquals ("test#17", " </xs:sequence>", substring);
  253. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  254. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  255. AssertEquals ("test#18", " </xs:complexType>", substring);
  256. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  257. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  258. AssertEquals ("test#19", " </xs:element>", substring);
  259. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  260. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  261. AssertEquals ("test#20", " <xs:element name=\"second_test_table\">", substring);
  262. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  263. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  264. AssertEquals ("test#21", " <xs:complexType>", substring);
  265. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  266. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  267. AssertEquals ("test#22", " <xs:sequence>", 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#23", " <xs:element name=\"second_first\" default=\"default_value\" minOccurs=\"0\">", substring);
  272. AssertEquals ("test#23", " <xs:element default=\"default_value\" minOccurs=\"0\" name=\"second_first\">", substring);
  273. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  274. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  275. AssertEquals ("test#24", " <xs:simpleType>", substring);
  276. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  277. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  278. AssertEquals ("test#25", " <xs:restriction base=\"xs:string\">", substring);
  279. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  280. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  281. AssertEquals ("test#26", " <xs:maxLength value=\"100\" />", substring);
  282. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  283. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  284. AssertEquals ("test#27", " </xs:restriction>", substring);
  285. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  286. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  287. AssertEquals ("test#28", " </xs:simpleType>", substring);
  288. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  289. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  290. AssertEquals ("test#29", " </xs:element>", substring);
  291. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  292. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  293. AssertEquals ("test#30", " </xs:sequence>", substring);
  294. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  295. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  296. AssertEquals ("test#31", " </xs:complexType>", substring);
  297. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  298. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  299. AssertEquals ("test#32", " </xs:element>", substring);
  300. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  301. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  302. AssertEquals ("test#33", " </xs:choice>", substring);
  303. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  304. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  305. AssertEquals ("test#34", " </xs:complexType>", substring);
  306. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  307. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  308. AssertEquals ("test#36", " <xs:unique name=\"Constraint1\">", substring);
  309. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  310. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  311. AssertEquals ("test#37", " <xs:selector xpath=\".//test_table\" />", substring);
  312. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  313. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  314. AssertEquals ("test#38", " <xs:field xpath=\"first\" />", substring);
  315. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  316. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  317. AssertEquals ("test#39", " </xs:unique>", substring);
  318. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  319. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  320. // This is original DataSet.WriteXmlSchema() output
  321. // AssertEquals ("test#40", " <xs:unique name=\"second_test_table_Constraint1\" msdata:ConstraintName=\"Constraint1\">", substring);
  322. AssertEquals ("test#40", " <xs:unique msdata:ConstraintName=\"Constraint1\" name=\"second_test_table_Constraint1\">", substring);
  323. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  324. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  325. AssertEquals ("test#41", " <xs:selector xpath=\".//second_test_table\" />", substring);
  326. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  327. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  328. AssertEquals ("test#42", " <xs:field xpath=\"second_first\" />", substring);
  329. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  330. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  331. AssertEquals ("test#43", " </xs:unique>", substring);
  332. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  333. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  334. AssertEquals ("test#44", " </xs:element>", substring);
  335. AssertEquals ("test#45", "</xs:schema>", TextString);
  336. }
  337. [Test]
  338. public void ReadWriteXml ()
  339. {
  340. DataSet ds = new DataSet ();
  341. ds.ReadXml ("Test/System.Data/region.xml");
  342. TextWriter writer = new StringWriter ();
  343. ds.WriteXml (writer);
  344. string TextString = writer.ToString ();
  345. string substring = TextString.Substring (0, TextString.IndexOf(EOL));
  346. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  347. AssertEquals ("test#01", "<Root>", substring);
  348. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  349. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  350. AssertEquals ("test#02", " <Region>", substring);
  351. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  352. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  353. AssertEquals ("test#03", " <RegionID>1</RegionID>", substring);
  354. // Here the end of line is text markup "\n"
  355. substring = TextString.Substring (0, TextString.IndexOf('\n'));
  356. TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
  357. AssertEquals ("test#04", " <RegionDescription>Eastern", substring);
  358. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  359. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  360. AssertEquals ("test#05", " </RegionDescription>", substring);
  361. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  362. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  363. AssertEquals ("test#06", " </Region>", substring);
  364. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  365. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  366. AssertEquals ("test#07", " <Region>", substring);
  367. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  368. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  369. AssertEquals ("test#08", " <RegionID>2</RegionID>", substring);
  370. // Here the end of line is text markup "\n"
  371. substring = TextString.Substring (0, TextString.IndexOf('\n'));
  372. TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
  373. AssertEquals ("test#09", " <RegionDescription>Western", substring);
  374. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  375. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  376. AssertEquals ("test#10", " </RegionDescription>", substring);
  377. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  378. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  379. AssertEquals ("test#11", " </Region>", substring);
  380. AssertEquals ("test#11", "</Root>", TextString);
  381. }
  382. [Test]
  383. public void ReadWriteXmlDiffGram ()
  384. {
  385. DataSet ds = new DataSet ();
  386. // It is not a diffgram, so no data loading should be done.
  387. ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.DiffGram);
  388. TextWriter writer = new StringWriter ();
  389. ds.WriteXml (writer);
  390. string TextString = writer.ToString ();
  391. AssertEquals ("test#01", "<NewDataSet />", TextString);
  392. ds.WriteXml (writer, XmlWriteMode.DiffGram);
  393. TextString = writer.ToString ();
  394. AssertEquals ("test#02", "<NewDataSet /><diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\" />", TextString);
  395. ds = new DataSet ();
  396. ds.ReadXml ("Test/System.Data/region.xml");
  397. DataTable table = ds.Tables ["Region"];
  398. table.Rows [0] [0] = "64";
  399. ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.DiffGram);
  400. ds.WriteXml (writer, XmlWriteMode.DiffGram);
  401. TextString = writer.ToString ();
  402. string substring = TextString.Substring (0, TextString.IndexOf(EOL));
  403. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  404. 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);
  405. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  406. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  407. AssertEquals ("test#04", " <Root>", substring);
  408. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  409. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  410. AssertEquals ("test#05", " <Region diffgr:id=\"Region1\" msdata:rowOrder=\"0\" diffgr:hasChanges=\"inserted\">", substring);
  411. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  412. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  413. AssertEquals ("test#06", " <RegionID>64</RegionID>", substring);
  414. // not EOL but literal '\n'
  415. substring = TextString.Substring (0, TextString.IndexOf('\n'));
  416. TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
  417. AssertEquals ("test#07", " <RegionDescription>Eastern", substring);
  418. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  419. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  420. AssertEquals ("test#07", " </RegionDescription>", substring);
  421. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  422. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  423. AssertEquals ("test#08", " </Region>", substring);
  424. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  425. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  426. AssertEquals ("test#09", " <Region diffgr:id=\"Region2\" msdata:rowOrder=\"1\" diffgr:hasChanges=\"inserted\">", substring);
  427. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  428. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  429. AssertEquals ("test#10", " <RegionID>2</RegionID>", substring);
  430. // not EOL but literal '\n'
  431. substring = TextString.Substring (0, TextString.IndexOf('\n'));
  432. TextString = TextString.Substring (TextString.IndexOf('\n') + 1);
  433. AssertEquals ("test#11", " <RegionDescription>Western", substring);
  434. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  435. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  436. AssertEquals ("test#12", " </RegionDescription>", substring);
  437. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  438. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  439. AssertEquals ("test#13", " </Region>", substring);
  440. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  441. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  442. AssertEquals ("test#14", " </Root>", substring);
  443. AssertEquals ("test#15", "</diffgr:diffgram>", TextString);
  444. }
  445. [Test]
  446. public void WriteXmlSchema ()
  447. {
  448. DataSet ds = new DataSet ();
  449. ds.ReadXml ("Test/System.Data/region.xml");
  450. TextWriter writer = new StringWriter ();
  451. ds.WriteXmlSchema (writer);
  452. string TextString = GetNormalizedSchema (writer.ToString ());
  453. // string TextString = writer.ToString ();
  454. string substring = TextString.Substring (0, TextString.IndexOf(EOL));
  455. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  456. AssertEquals ("test#01", "<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring);
  457. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  458. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  459. // This is original DataSet.WriteXmlSchema() output
  460. // 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);
  461. AssertEquals ("test#02", "<xs:schema id=\"Root\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring);
  462. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  463. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  464. // This is original DataSet.WriteXmlSchema() output
  465. // AssertEquals ("test#03", " <xs:element name=\"Root\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
  466. AssertEquals ("test#03", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"Root\">", substring);
  467. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  468. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  469. AssertEquals ("test#04", " <xs:complexType>", substring);
  470. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  471. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  472. AssertEquals ("test#05", " <xs:choice maxOccurs=\"unbounded\">", substring);
  473. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  474. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  475. AssertEquals ("test#06", " <xs:element name=\"Region\">", substring);
  476. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  477. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  478. AssertEquals ("test#07", " <xs:complexType>", substring);
  479. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  480. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  481. AssertEquals ("test#08", " <xs:sequence>", substring);
  482. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  483. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  484. // This is original DataSet.WriteXmlSchema() output
  485. // AssertEquals ("test#09", " <xs:element name=\"RegionID\" type=\"xs:string\" minOccurs=\"0\" />", substring);
  486. AssertEquals ("test#09", " <xs:element minOccurs=\"0\" name=\"RegionID\" type=\"xs:string\" />", substring);
  487. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  488. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  489. // This is original DataSet.WriteXmlSchema() output
  490. // AssertEquals ("test#10", " <xs:element name=\"RegionDescription\" type=\"xs:string\" minOccurs=\"0\" />", substring);
  491. AssertEquals ("test#10", " <xs:element minOccurs=\"0\" name=\"RegionDescription\" type=\"xs:string\" />", substring);
  492. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  493. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  494. AssertEquals ("test#11", " </xs:sequence>", substring);
  495. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  496. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  497. AssertEquals ("test#12", " </xs:complexType>", substring);
  498. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  499. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  500. AssertEquals ("test#13", " </xs:element>", substring);
  501. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  502. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  503. AssertEquals ("test#14", " </xs:choice>", substring);
  504. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  505. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  506. AssertEquals ("test#15", " </xs:complexType>", substring);
  507. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  508. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  509. AssertEquals ("test#16", " </xs:element>", substring);
  510. AssertEquals ("test#17", "</xs:schema>", TextString);
  511. }
  512. [Test]
  513. [Ignore ("MS behavior is far from consistent to be regarded as a reference implementation.")]
  514. // MS ReadXmlSchema() is too inconsistent to regard as a
  515. // reference implementation. To find the reason why, try to
  516. // read store2.xsd and store4.xsd, write and compare for each
  517. // DataSet property.
  518. public void ReadWriteXmlSchemaIgnoreSchema ()
  519. {
  520. DataSet ds = new DataSet ();
  521. ds.ReadXmlSchema ("Test/System.Data/store.xsd");
  522. AssertDataSet ("read DataSet", ds, "NewDataSet", 3, 2);
  523. AssertDataTable ("read bookstore table", ds.Tables [0], "bookstore", 1, 0, 0, 1, 1, 1);
  524. AssertDataTable ("read book table", ds.Tables [1], "book", 5, 0, 1, 1, 2, 1);
  525. ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.IgnoreSchema);
  526. TextWriter writer = new StringWriter ();
  527. ds.WriteXmlSchema (writer);
  528. string TextString = GetNormalizedSchema (writer.ToString ());
  529. // string TextString = writer.ToString ();
  530. string substring = TextString.Substring (0, TextString.IndexOf(EOL));
  531. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  532. AssertEquals ("test#01", "<?xml version=\"1.0\" encoding=\"utf-16\"?>", substring);
  533. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  534. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  535. // This is original DataSet.WriteXmlSchema() output
  536. // 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);
  537. AssertEquals ("test#02", "<xs:schema id=\"NewDataSet\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring);
  538. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  539. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  540. AssertEquals ("test#03", " <xs:complexType name=\"bookstoreType\">", substring);
  541. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  542. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  543. AssertEquals ("test#04", " <xs:sequence>", substring);
  544. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  545. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  546. // This is original DataSet.WriteXmlSchema() output
  547. // AssertEquals ("test#05", " <xs:element name=\"book\" type=\"bookType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
  548. AssertEquals ("test#05", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"book\" type=\"bookType\" />", substring);
  549. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  550. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  551. AssertEquals ("test#06", " </xs:sequence>", substring);
  552. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  553. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  554. AssertEquals ("test#07", " </xs:complexType>", substring);
  555. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  556. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  557. AssertEquals ("test#08", " <xs:complexType name=\"bookType\">", substring);
  558. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  559. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  560. AssertEquals ("test#09", " <xs:sequence>", substring);
  561. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  562. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  563. // This is original DataSet.WriteXmlSchema() output
  564. // AssertEquals ("test#10", " <xs:element name=\"title\" type=\"xs:string\" msdata:Ordinal=\"1\" />", substring);
  565. AssertEquals ("test#10", " <xs:element msdata:Ordinal=\"1\" name=\"title\" type=\"xs:string\" />", substring);
  566. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  567. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  568. // This is original DataSet.WriteXmlSchema() output
  569. // AssertEquals ("test#11", " <xs:element name=\"price\" type=\"xs:decimal\" msdata:Ordinal=\"2\" />", substring);
  570. AssertEquals ("test#11", " <xs:element msdata:Ordinal=\"2\" name=\"price\" type=\"xs:decimal\" />", substring);
  571. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  572. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  573. // This is original DataSet.WriteXmlSchema() output
  574. // AssertEquals ("test#12", " <xs:element name=\"author\" type=\"authorName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
  575. AssertEquals ("test#12", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"author\" type=\"authorName\" />", substring);
  576. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  577. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  578. AssertEquals ("test#13", " </xs:sequence>", substring);
  579. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  580. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  581. AssertEquals ("test#14", " <xs:attribute name=\"genre\" type=\"xs:string\" />", substring);
  582. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  583. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  584. AssertEquals ("test#15", " </xs:complexType>", substring);
  585. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  586. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  587. AssertEquals ("test#16", " <xs:complexType name=\"authorName\">", substring);
  588. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  589. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  590. AssertEquals ("test#17", " <xs:sequence>", substring);
  591. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  592. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  593. AssertEquals ("test#18", " <xs:element name=\"first-name\" type=\"xs:string\" />", substring);
  594. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  595. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  596. AssertEquals ("test#19", " <xs:element name=\"last-name\" type=\"xs:string\" />", substring);
  597. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  598. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  599. AssertEquals ("test#20", " </xs:sequence>", substring);
  600. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  601. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  602. AssertEquals ("test#21", " </xs:complexType>", substring);
  603. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  604. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  605. AssertEquals ("test#22", " <xs:element name=\"bookstore\" type=\"bookstoreType\" />", substring);
  606. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  607. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  608. // This is original DataSet.WriteXmlSchema() output
  609. // AssertEquals ("test#23", " <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
  610. AssertEquals ("test#23", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"NewDataSet\">", substring);
  611. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  612. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  613. AssertEquals ("test#24", " <xs:complexType>", substring);
  614. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  615. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  616. AssertEquals ("test#25", " <xs:choice maxOccurs=\"unbounded\">", substring);
  617. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  618. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  619. AssertEquals ("test#26", " <xs:element ref=\"bookstore\" />", substring);
  620. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  621. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  622. AssertEquals ("test#27", " </xs:choice>", substring);
  623. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  624. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  625. AssertEquals ("test#28", " </xs:complexType>", substring);
  626. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  627. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  628. AssertEquals ("test#29", " </xs:element>", substring);
  629. AssertEquals ("test#30", "</xs:schema>", TextString);
  630. }
  631. [Test]
  632. [Ignore ("MS behavior is far from consistent to be regarded as a reference implementation.")]
  633. // See comments on ReadWriteXmlSchemaIgnoreSchema().
  634. public void ReadWriteXmlSchema ()
  635. {
  636. DataSet ds = new DataSet ();
  637. ds.ReadXmlSchema ("Test/System.Data/store.xsd");
  638. // check dataset properties before testing write
  639. AssertDataSet ("ds", ds, "NewDataSet", 3, 2);
  640. AssertDataTable ("tab1", ds.Tables [0], "bookstore", 1, 0, 0, 1, 1, 1);
  641. AssertDataTable ("tab2", ds.Tables [1], "book", 5, 0, 1, 1, 2, 1);
  642. AssertDataTable ("tab3", ds.Tables [2], "author", 3, 0, 1, 0, 1, 0);
  643. // FIXME: currently order is not compatible. Use name as index
  644. AssertDataRelation ("rel1", ds.Relations ["book_author"], "book_author", true, new string [] {"book_Id"}, new string [] {"book_Id"}, true, true);
  645. AssertDataRelation ("rel2", ds.Relations ["bookstore_book"], "bookstore_book", true, new string [] {"bookstore_Id"}, new string [] {"bookstore_Id"}, true, true);
  646. ds.ReadXml ("Test/System.Data/region.xml", XmlReadMode.InferSchema);
  647. TextWriter writer = new StringWriter ();
  648. ds.WriteXmlSchema (writer);
  649. string TextString = GetNormalizedSchema (writer.ToString ());
  650. // string TextString = writer.ToString ();
  651. string substring = TextString.Substring (0, TextString.IndexOf(EOL));
  652. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  653. 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=\"Root\" 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=\"Root\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">", substring);
  659. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  660. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  661. AssertEquals ("test#03", " <xs:complexType name=\"bookstoreType\">", substring);
  662. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  663. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  664. AssertEquals ("test#04", " <xs:sequence>", substring);
  665. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  666. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  667. // This is original DataSet.WriteXmlSchema() output
  668. // AssertEquals ("test#05", " <xs:element name=\"book\" type=\"bookType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
  669. AssertEquals ("test#05", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"book\" type=\"bookType\" />", substring);
  670. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  671. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  672. AssertEquals ("test#06", " </xs:sequence>", substring);
  673. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  674. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  675. AssertEquals ("test#07", " </xs:complexType>", substring);
  676. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  677. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  678. AssertEquals ("test#08", " <xs:complexType name=\"bookType\">", substring);
  679. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  680. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  681. AssertEquals ("test#09", " <xs:sequence>", substring);
  682. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  683. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  684. // This is original DataSet.WriteXmlSchema() output
  685. // AssertEquals ("test#10", " <xs:element name=\"title\" type=\"xs:string\" msdata:Ordinal=\"1\" />", substring);
  686. AssertEquals ("test#10", " <xs:element msdata:Ordinal=\"1\" name=\"title\" type=\"xs:string\" />", substring);
  687. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  688. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  689. // This is original DataSet.WriteXmlSchema() output
  690. // AssertEquals ("test#11", " <xs:element name=\"price\" type=\"xs:decimal\" msdata:Ordinal=\"2\" />", substring);
  691. AssertEquals ("test#11", " <xs:element msdata:Ordinal=\"2\" name=\"price\" type=\"xs:decimal\" />", substring);
  692. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  693. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  694. // This is original DataSet.WriteXmlSchema() output
  695. // AssertEquals ("test#12", " <xs:element name=\"author\" type=\"authorName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />", substring);
  696. AssertEquals ("test#12", " <xs:element maxOccurs=\"unbounded\" minOccurs=\"0\" name=\"author\" type=\"authorName\" />", substring);
  697. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  698. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  699. AssertEquals ("test#13", " </xs:sequence>", substring);
  700. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  701. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  702. AssertEquals ("test#14", " <xs:attribute name=\"genre\" type=\"xs:string\" />", substring);
  703. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  704. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  705. AssertEquals ("test#15", " </xs:complexType>", substring);
  706. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  707. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  708. AssertEquals ("test#16", " <xs:complexType name=\"authorName\">", substring);
  709. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  710. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  711. AssertEquals ("test#17", " <xs:sequence>", substring);
  712. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  713. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  714. AssertEquals ("test#18", " <xs:element name=\"first-name\" type=\"xs:string\" />", substring);
  715. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  716. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  717. AssertEquals ("test#19", " <xs:element name=\"last-name\" type=\"xs:string\" />", substring);
  718. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  719. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  720. AssertEquals ("test#20", " </xs:sequence>", substring);
  721. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  722. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  723. AssertEquals ("test#21", " </xs:complexType>", substring);
  724. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  725. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  726. AssertEquals ("test#22", " <xs:element name=\"bookstore\" type=\"bookstoreType\" />", substring);
  727. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  728. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  729. // This is original DataSet.WriteXmlSchema() output
  730. // AssertEquals ("test#23", " <xs:element name=\"Root\" msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\">", substring);
  731. AssertEquals ("test#23", " <xs:element msdata:IsDataSet=\"true\" msdata:Locale=\"fi-FI\" name=\"Root\">", substring);
  732. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  733. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  734. AssertEquals ("test#24", " <xs:complexType>", substring);
  735. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  736. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  737. AssertEquals ("test#25", " <xs:choice maxOccurs=\"unbounded\">", substring);
  738. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  739. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  740. AssertEquals ("test#26", " <xs:element ref=\"bookstore\" />", substring);
  741. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  742. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  743. AssertEquals ("test#27", " <xs:element name=\"Region\">", substring);
  744. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  745. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  746. AssertEquals ("test#28", " <xs:complexType>", substring);
  747. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  748. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  749. AssertEquals ("test#29", " <xs:sequence>", substring);
  750. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  751. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  752. // This is original DataSet.WriteXmlSchema() output
  753. // AssertEquals ("test#30", " <xs:element name=\"RegionID\" type=\"xs:string\" minOccurs=\"0\" />", substring);
  754. AssertEquals ("test#30", " <xs:element minOccurs=\"0\" name=\"RegionID\" type=\"xs:string\" />", substring);
  755. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  756. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  757. // This is original DataSet.WriteXmlSchema() output
  758. // AssertEquals ("test#31", " <xs:element name=\"RegionDescription\" type=\"xs:string\" minOccurs=\"0\" />", substring);
  759. AssertEquals ("test#31", " <xs:element minOccurs=\"0\" name=\"RegionDescription\" type=\"xs:string\" />", substring);
  760. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  761. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  762. AssertEquals ("test#32", " </xs:sequence>", substring);
  763. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  764. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  765. AssertEquals ("test#33", " </xs:complexType>", substring);
  766. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  767. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  768. AssertEquals ("test#34", " </xs:element>", substring);
  769. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  770. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  771. AssertEquals ("test#35", " </xs:choice>", substring);
  772. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  773. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  774. AssertEquals ("test#36", " </xs:complexType>", substring);
  775. substring = TextString.Substring (0, TextString.IndexOf(EOL));
  776. TextString = TextString.Substring (TextString.IndexOf(EOL) + EOL.Length);
  777. AssertEquals ("test#37", " </xs:element>", substring);
  778. AssertEquals ("test#38", "</xs:schema>", TextString);
  779. }
  780. [Test]
  781. [Category ("NotWorking")]
  782. public void WriteDifferentNamespaceSchema ()
  783. {
  784. string schema = @"<?xml version='1.0' encoding='utf-16'?>
  785. <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'>
  786. <!--ATTENTION: This schema contains references to other imported schemas-->
  787. <xs:import namespace='urn:baz' schemaLocation='_app1.xsd' />
  788. <xs:import namespace='urn:foo' schemaLocation='_app2.xsd' />
  789. <xs:element name='NewDataSet' msdata:IsDataSet='true' msdata:Locale='fi-FI'>
  790. <xs:complexType>
  791. <xs:choice maxOccurs='unbounded'>
  792. <xs:element ref='app2:NS1Table' />
  793. <xs:element name='NS2Table'>
  794. <xs:complexType>
  795. </xs:complexType>
  796. </xs:element>
  797. </xs:choice>
  798. </xs:complexType>
  799. </xs:element>
  800. </xs:schema>";
  801. DataSet ds = new DataSet();
  802. DataTable dt = new DataTable ();
  803. dt.TableName = "NS1Table";
  804. dt.Namespace = "urn:foo";
  805. dt.Columns.Add ("column1");
  806. dt.Columns.Add ("column2");
  807. dt.Columns [1].Namespace = "urn:baz";
  808. ds.Tables.Add (dt);
  809. DataTable dt2 = new DataTable ();
  810. dt2.TableName = "NS2Table";
  811. dt2.Namespace = "urn:bar";
  812. ds.Tables.Add (dt2);
  813. ds.Namespace = "urn:bar";
  814. StringWriter sw = new StringWriter ();
  815. XmlTextWriter xw = new XmlTextWriter (sw);
  816. xw.Formatting = Formatting.Indented;
  817. xw.QuoteChar = '\'';
  818. ds.WriteXmlSchema (xw);
  819. string result = sw.ToString ();
  820. AssertEquals (schema, result.Replace ("\r\n", "\n"));
  821. }
  822. [Test]
  823. public void IgnoreColumnEmptyNamespace ()
  824. {
  825. DataColumn col = new DataColumn ("TEST");
  826. col.Namespace = "urn:foo";
  827. DataSet ds = new DataSet ("DS");
  828. ds.Namespace = "urn:foo";
  829. DataTable dt = new DataTable ("tab");
  830. ds.Tables.Add (dt);
  831. dt.Columns.Add (col);
  832. dt.Rows.Add (new object [] {"test"});
  833. StringWriter sw = new StringWriter ();
  834. ds.WriteXml (new XmlTextWriter (sw));
  835. string xml = @"<DS xmlns=""urn:foo""><tab><TEST>test</TEST></tab></DS>";
  836. AssertEquals (xml, sw.ToString ());
  837. }
  838. [Test]
  839. public void SerializeDataSet ()
  840. {
  841. // see GetReady() for current culture
  842. 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>";
  843. DataSet ds = new DataSet ();
  844. ds.DataSetName = "DS";
  845. XmlSerializer ser = new XmlSerializer (typeof (DataSet));
  846. StringWriter sw = new StringWriter ();
  847. XmlTextWriter xw = new XmlTextWriter (sw);
  848. xw.QuoteChar = '\'';
  849. ser.Serialize (xw, ds);
  850. string result = sw.ToString ();
  851. AssertEquals (xml, result.Replace ("\r\n", "\n"));
  852. }
  853. // bug #70961
  854. [Test]
  855. public void SerializeDataSet2 ()
  856. {
  857. DataSet quota = new DataSet ("Quota");
  858. // Dimension
  859. DataTable dt = new DataTable ("Dimension");
  860. quota.Tables.Add (dt);
  861. dt.Columns.Add ("Number", typeof(int));
  862. dt.Columns ["Number"].AllowDBNull = false;
  863. dt.Columns ["Number"].ColumnMapping = MappingType.Attribute;
  864. dt.Columns.Add ("Title", typeof(string));
  865. dt.Columns ["Title"].AllowDBNull = false;
  866. dt.Columns ["Title"].ColumnMapping =
  867. MappingType.Attribute;
  868. dt.Rows.Add (new object [] {0, "Hospitals"});
  869. dt.Rows.Add (new object [] {1, "Doctors"});
  870. dt.Constraints.Add ("PK_Dimension", dt.Columns ["Number"], true);
  871. quota.AcceptChanges ();
  872. XmlSerializer ser = new XmlSerializer (quota.GetType ());
  873. StringWriter sw = new StringWriter ();
  874. ser.Serialize (sw, quota);
  875. DataSet ds = (DataSet) ser.Deserialize (new StringReader (sw.ToString ()));
  876. }
  877. // bug #68007
  878. public void SerializeDataSet3 ()
  879. {
  880. 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>";
  881. DataSet ds = new DataSet ("Example");
  882. // Add a DataTable
  883. DataTable dt = new DataTable ("Packages");
  884. ds.Tables.Add (dt);
  885. // Add an ID DataColumn w/ ColumnMapping = MappingType.Attribute
  886. dt.Columns.Add (new DataColumn ("ID", typeof(int), "",
  887. MappingType.Attribute));
  888. dt.Columns ["ID"].AllowDBNull = false;
  889. // Add a nullable DataColumn w/ ColumnMapping = MappingType.Attribute
  890. dt.Columns.Add (new DataColumn ("ShipDate",
  891. typeof (DateTime), "", MappingType.Attribute));
  892. dt.Columns ["ShipDate"].AllowDBNull = true;
  893. // Add a nullable DataColumn w/ ColumnMapping = MappingType.Attribute
  894. dt.Columns.Add (new DataColumn ("Message",
  895. typeof (string), "", MappingType.Attribute));
  896. dt.Columns ["Message"].AllowDBNull = true;
  897. // Add a nullable DataColumn w/ ColumnMapping = MappingType.Attribute
  898. dt.Columns.Add (new DataColumn ("Handlers",
  899. typeof (int), "", MappingType.Attribute));
  900. dt.Columns ["Handlers"].AllowDBNull = true;
  901. // Add a non-null value row
  902. DataRow newRow = dt.NewRow();
  903. newRow ["ID"] = 0;
  904. newRow ["ShipDate"] = DateTime.Now;
  905. newRow ["Message"] = "Received with no breakage!";
  906. newRow ["Handlers"] = 3;
  907. dt.Rows.Add (newRow);
  908. // Add a null value row
  909. newRow = dt.NewRow ();
  910. newRow ["ID"] = 1;
  911. newRow ["ShipDate"] = DBNull.Value;
  912. newRow ["Message"] = DBNull.Value;
  913. newRow ["Handlers"] = DBNull.Value;
  914. dt.Rows.Add (newRow);
  915. ds.AcceptChanges ();
  916. XmlSerializer ser = new XmlSerializer (ds.GetType());
  917. StringWriter sw = new StringWriter ();
  918. ser.Serialize (sw, ds);
  919. string result = sw.ToString ();
  920. AssertEquals (xml, result);
  921. }
  922. [Test]
  923. public void DeserializeDataSet ()
  924. {
  925. string xml = @"<DataSet>
  926. <diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
  927. <Quota>
  928. <Dimension diffgr:id='Dimension1' msdata:rowOrder='0' Number='0' Title='Hospitals' />
  929. <Dimension diffgr:id='Dimension2' msdata:rowOrder='1' Number='1' Title='Doctors' />
  930. </Quota>
  931. </diffgr:diffgram>
  932. </DataSet>";
  933. XmlSerializer ser = new XmlSerializer (typeof (DataSet));
  934. ser.Deserialize (new XmlTextReader (
  935. xml, XmlNodeType.Document, null));
  936. }
  937. /* To be added
  938. [Test]
  939. public void WriteDiffReadAutoWriteSchema ()
  940. {
  941. DataSet ds = new DataSet ();
  942. ds.Tables.Add ("Table1");
  943. ds.Tables.Add ("Table2");
  944. ds.Tables [0].Columns.Add ("Column1_1");
  945. ds.Tables [0].Columns.Add ("Column1_2");
  946. ds.Tables [0].Columns.Add ("Column1_3");
  947. ds.Tables [1].Columns.Add ("Column2_1");
  948. ds.Tables [1].Columns.Add ("Column2_2");
  949. ds.Tables [1].Columns.Add ("Column2_3");
  950. ds.Tables [0].Rows.Add (new object [] {"ppp", "www", "xxx"});
  951. // save as diffgram
  952. StringWriter sw = new StringWriter ();
  953. ds.WriteXml (sw, XmlWriteMode.DiffGram);
  954. string xml = sw.ToString ();
  955. string result = new StreamReader ("Test/System.Data/DataSetReadXmlTest1.xml", Encoding.ASCII).ReadToEnd ();
  956. AssertEquals ("#01", result, xml);
  957. // load diffgram above
  958. ds.ReadXml (new StringReader (sw.ToString ()));
  959. sw = new StringWriter ();
  960. ds.WriteXml (sw, XmlWriteMode.WriteSchema);
  961. xml = sw.ToString ();
  962. result = new StreamReader ("Test/System.Data/DataSetReadXmlTest2.xml", Encoding.ASCII).ReadToEnd ();
  963. AssertEquals ("#02", result, xml);
  964. }
  965. */
  966. [Test]
  967. public void CloneCopy ()
  968. {
  969. DataTable table = new DataTable ("pTable"); DataTable table1 = new DataTable ("cTable"); DataSet set = new DataSet ();
  970. set.Tables.Add (table);
  971. set.Tables.Add (table1); DataColumn col = new DataColumn ();
  972. col.ColumnName = "Id";
  973. col.DataType = Type.GetType ("System.Int32");
  974. table.Columns.Add (col);
  975. UniqueConstraint uc = new UniqueConstraint ("UK1", table.Columns[0] );
  976. table.Constraints.Add (uc);
  977. col = new DataColumn ();
  978. col.ColumnName = "Name";
  979. col.DataType = Type.GetType ("System.String");
  980. table.Columns.Add (col);
  981. col = new DataColumn ();
  982. col.ColumnName = "Id";
  983. col.DataType = Type.GetType ("System.Int32");
  984. table1.Columns.Add (col);
  985. col = new DataColumn ();
  986. col.ColumnName = "Name";
  987. col.DataType = Type.GetType ("System.String");
  988. table1.Columns.Add (col);
  989. ForeignKeyConstraint fc = new ForeignKeyConstraint ("FK1", table.Columns[0], table1.Columns[0] );
  990. table1.Constraints.Add (fc);
  991. DataRow row = table.NewRow ();
  992. row ["Id"] = 147;
  993. row ["name"] = "Row1";
  994. row.RowError = "Error#1";
  995. table.Rows.Add (row);
  996. row = table1.NewRow ();
  997. row ["Id"] = 147;
  998. row ["Name"] = "Row1";
  999. table1.Rows.Add (row);
  1000. //Setting properties of DataSet
  1001. set.CaseSensitive = true;
  1002. set.DataSetName = "My DataSet";
  1003. set.EnforceConstraints = false;
  1004. set.Namespace = "Namespace#1";
  1005. set.Prefix = "Prefix:1";
  1006. DataRelation dr = new DataRelation ("DR", table.Columns [0],table1.Columns [0]);
  1007. set.Relations.Add (dr);
  1008. set.ExtendedProperties.Add ("TimeStamp", DateTime.Now);
  1009. CultureInfo cultureInfo = new CultureInfo( "ar-SA" );
  1010. set.Locale = cultureInfo;
  1011. //Testing Copy ()
  1012. DataSet copySet = set.Copy ();
  1013. AssertEquals ("#A01", set.CaseSensitive, copySet.CaseSensitive);
  1014. AssertEquals ("#A02", set.DataSetName, copySet.DataSetName);
  1015. AssertEquals ("#A03", set.EnforceConstraints, copySet.EnforceConstraints);
  1016. AssertEquals ("#A04", set.HasErrors, copySet.HasErrors);
  1017. AssertEquals ("#A05", set.Namespace, copySet.Namespace);
  1018. AssertEquals ("#A06", set.Prefix, copySet.Prefix);
  1019. AssertEquals ("#A07", set.Relations.Count, copySet.Relations.Count);
  1020. AssertEquals ("#A08", set.Tables.Count, copySet.Tables.Count);
  1021. AssertEquals ("#A09", set.ExtendedProperties ["TimeStamp"], copySet.ExtendedProperties ["TimeStamp"]);
  1022. for (int i = 0;i < copySet.Tables.Count; i++) {
  1023. AssertEquals ("#A10", set.Tables [i].Rows.Count, copySet.Tables [i].Rows.Count);
  1024. AssertEquals ("#A11", set.Tables [i].Columns.Count, copySet.Tables [i].Columns.Count);
  1025. }
  1026. //Testing Clone ()
  1027. copySet = set.Clone ();
  1028. AssertEquals ("#A12", set.CaseSensitive, copySet.CaseSensitive);
  1029. AssertEquals ("#A13", set.DataSetName, copySet.DataSetName);
  1030. AssertEquals ("#A14", set.EnforceConstraints, copySet.EnforceConstraints);
  1031. AssertEquals ("#A15", false, copySet.HasErrors);
  1032. AssertEquals ("#A16", set.Namespace, copySet.Namespace);
  1033. AssertEquals ("#A17", set.Prefix, copySet.Prefix);
  1034. AssertEquals ("#A18", set.Relations.Count, copySet.Relations.Count);
  1035. AssertEquals ("#A19", set.Tables.Count, copySet.Tables.Count);
  1036. AssertEquals ("#A20", set.ExtendedProperties ["TimeStamp"], copySet.ExtendedProperties ["TimeStamp"]);
  1037. for (int i = 0;i < copySet.Tables.Count; i++) {
  1038. AssertEquals ("#A21", 0, copySet.Tables [i].Rows.Count);
  1039. AssertEquals ("#A22", set.Tables [i].Columns.Count, copySet.Tables [i].Columns.Count);
  1040. }
  1041. }
  1042. [Test]
  1043. public void CloneCopy2 ()
  1044. {
  1045. DataSet ds = new DataSet ();
  1046. ds.ReadXmlSchema ("Test/System.Data/store.xsd");
  1047. ds.Clone ();
  1048. }
  1049. [Test]
  1050. public void WriteNestedTableXml ()
  1051. {
  1052. string xml = @"<NewDataSet>
  1053. <tab1>
  1054. <ident>1</ident>
  1055. <name>hoge</name>
  1056. <tab2>
  1057. <timestamp>2004-05-05</timestamp>
  1058. </tab2>
  1059. </tab1>
  1060. <tab1>
  1061. <ident>2</ident>
  1062. <name>fuga</name>
  1063. <tab2>
  1064. <timestamp>2004-05-06</timestamp>
  1065. </tab2>
  1066. </tab1>
  1067. </NewDataSet>";
  1068. DataSet ds = new DataSet ();
  1069. DataTable dt = new DataTable ("tab1");
  1070. dt.Columns.Add ("ident");
  1071. dt.Columns.Add ("name");
  1072. dt.Rows.Add (new object [] {"1", "hoge"});
  1073. dt.Rows.Add (new object [] {"2", "fuga"});
  1074. DataTable dt2 = new DataTable ("tab2");
  1075. dt2.Columns.Add ("idref");
  1076. dt2.Columns [0].ColumnMapping = MappingType.Hidden;
  1077. dt2.Columns.Add ("timestamp");
  1078. dt2.Rows.Add (new object [] {"1", "2004-05-05"});
  1079. dt2.Rows.Add (new object [] {"2", "2004-05-06"});
  1080. ds.Tables.Add (dt);
  1081. ds.Tables.Add (dt2);
  1082. DataRelation rel = new DataRelation ("rel", dt.Columns [0], dt2.Columns [0]);
  1083. rel.Nested = true;
  1084. ds.Relations.Add (rel);
  1085. StringWriter sw = new StringWriter ();
  1086. ds.WriteXml (sw);
  1087. AssertEquals (xml, sw.ToString ().Replace ("\r\n", "\n"));
  1088. }
  1089. [Test]
  1090. public void WriteXmlToStream ()
  1091. {
  1092. string xml = "<set><table1><col1>sample text</col1><col2/></table1><table2 attr='value'><col3>sample text 2</col3></table2></set>";
  1093. DataSet ds = new DataSet ();
  1094. ds.ReadXml (new StringReader (xml));
  1095. MemoryStream ms = new MemoryStream ();
  1096. ds.WriteXml (ms);
  1097. MemoryStream ms2 = new MemoryStream (ms.ToArray ());
  1098. StreamReader sr = new StreamReader (ms2, Encoding.UTF8);
  1099. string result = @"<set>
  1100. <table1>
  1101. <col1>sample text</col1>
  1102. <col2 />
  1103. </table1>
  1104. <table2 attr=""value"">
  1105. <col3>sample text 2</col3>
  1106. </table2>
  1107. </set>";
  1108. AssertEquals (result, sr.ReadToEnd ().Replace ("\r\n", "\n"));
  1109. }
  1110. [Test]
  1111. public void WtiteXmlEncodedXml ()
  1112. {
  1113. string xml = @"<an_x0020_example_x0020_dataset.>
  1114. <WOW_x0021__x0020_that_x0027_s_x0020_nasty...>
  1115. <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>
  1116. </WOW_x0021__x0020_that_x0027_s_x0020_nasty...>
  1117. </an_x0020_example_x0020_dataset.>";
  1118. DataSet ds = new DataSet ("an example dataset.");
  1119. ds.Tables.Add (new DataTable ("WOW! that's nasty..."));
  1120. ds.Tables [0].Columns.Add ("URL is http://www.go-mono.com");
  1121. ds.Tables [0].Rows.Add (new object [] {"content string."});
  1122. StringWriter sw = new StringWriter ();
  1123. ds.WriteXml (sw);
  1124. AssertEquals (xml, sw.ToString ().Replace ("\r\n", "\n"));
  1125. }
  1126. [Test]
  1127. public void ReadWriteXml2 ()
  1128. {
  1129. string xml = "<FullTextResponse><Domains><AvailResponse info='y' name='novell-ximian-group' /><AvailResponse info='n' name='ximian' /></Domains></FullTextResponse>";
  1130. DataSet ds = new DataSet ();
  1131. ds.ReadXml (new StringReader (xml));
  1132. AssertDataSet ("ds", ds, "FullTextResponse", 2, 1);
  1133. DataTable dt = ds.Tables [0];
  1134. AssertDataTable ("dt1", dt, "Domains", 1, 1, 0, 1, 1, 1);
  1135. dt = ds.Tables [1];
  1136. AssertDataTable ("dt2", dt, "AvailResponse", 3, 2, 1, 0, 1, 0);
  1137. StringWriter sw = new StringWriter ();
  1138. XmlTextWriter xtw = new XmlTextWriter (sw);
  1139. xtw.QuoteChar = '\'';
  1140. ds.WriteXml (xtw);
  1141. AssertEquals (xml, sw.ToString ());
  1142. }
  1143. // bug #53959.
  1144. [Test]
  1145. public void ReadWriteXml3 ()
  1146. {
  1147. string input = @"<FullTextResponse>
  1148. <Domains>
  1149. <AvailResponse info='y' name='novell-ximian-group' />
  1150. <AvailResponse info='n' name='ximian' />
  1151. </Domains>
  1152. </FullTextResponse>";
  1153. DataSet ds = new DataSet ();
  1154. ds.ReadXml (new StringReader (input));
  1155. StringWriter sw = new StringWriter ();
  1156. XmlTextWriter xtw = new XmlTextWriter (sw);
  1157. xtw.Formatting = Formatting.Indented;
  1158. xtw.QuoteChar = '\'';
  1159. ds.WriteXml (xtw);
  1160. xtw.Flush ();
  1161. AssertEquals (input, sw.ToString ().Replace ("\r\n", "\n"));
  1162. }
  1163. [Test] // bug #60469
  1164. public void WriteXmlSchema2 ()
  1165. {
  1166. 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>";
  1167. string schema = @"<?xml version='1.0' encoding='utf-16'?>
  1168. <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'>
  1169. <xs:element name='myDataSet' msdata:IsDataSet='true' msdata:Locale='fi-FI'>
  1170. <xs:complexType>
  1171. <xs:choice maxOccurs='unbounded'>
  1172. <xs:element name='myTable'>
  1173. <xs:complexType>
  1174. <xs:sequence>
  1175. <xs:element name='id' msdata:AutoIncrement='true' type='xs:int' minOccurs='0' />
  1176. <xs:element name='item' type='xs:string' minOccurs='0' />
  1177. </xs:sequence>
  1178. </xs:complexType>
  1179. </xs:element>
  1180. </xs:choice>
  1181. </xs:complexType>
  1182. </xs:element>
  1183. </xs:schema>";
  1184. DataSet OriginalDataSet = new DataSet ("myDataSet");
  1185. OriginalDataSet.Namespace= "NetFrameWork";
  1186. DataTable myTable = new DataTable ("myTable");
  1187. DataColumn c1 = new DataColumn ("id", typeof (int));
  1188. c1.AutoIncrement = true;
  1189. DataColumn c2 = new DataColumn ("item");
  1190. myTable.Columns.Add (c1);
  1191. myTable.Columns.Add (c2);
  1192. OriginalDataSet.Tables.Add (myTable);
  1193. // Add ten rows.
  1194. DataRow newRow;
  1195. for(int i = 0; i < 10; i++) {
  1196. newRow = myTable.NewRow ();
  1197. newRow ["item"] = "item " + i;
  1198. myTable.Rows.Add (newRow);
  1199. }
  1200. OriginalDataSet.AcceptChanges ();
  1201. StringWriter sw = new StringWriter ();
  1202. XmlTextWriter xtw = new XmlTextWriter (sw);
  1203. xtw.QuoteChar = '\'';
  1204. OriginalDataSet.WriteXml (xtw);
  1205. string result = sw.ToString ();
  1206. AssertEquals (xml, result);
  1207. sw = new StringWriter ();
  1208. xtw = new XmlTextWriter (sw);
  1209. xtw.Formatting = Formatting.Indented;
  1210. OriginalDataSet.WriteXmlSchema (xtw);
  1211. result = sw.ToString ();
  1212. result = result.Replace ("\r\n", "\n").Replace ('"', '\'');
  1213. AssertEquals (schema, result);
  1214. }
  1215. // bug #66366
  1216. [Test]
  1217. public void WriteXmlSchema3 ()
  1218. {
  1219. string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
  1220. <xs:schema id=""ExampleDataSet"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
  1221. <xs:element name=""ExampleDataSet"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
  1222. <xs:complexType>
  1223. <xs:choice maxOccurs=""unbounded"">
  1224. <xs:element name=""ExampleDataTable"">
  1225. <xs:complexType>
  1226. <xs:attribute name=""PrimaryKeyColumn"" type=""xs:int"" use=""required"" />
  1227. </xs:complexType>
  1228. </xs:element>
  1229. </xs:choice>
  1230. </xs:complexType>
  1231. <xs:unique name=""PK_ExampleDataTable"" msdata:PrimaryKey=""true"">
  1232. <xs:selector xpath="".//ExampleDataTable"" />
  1233. <xs:field xpath=""@PrimaryKeyColumn"" />
  1234. </xs:unique>
  1235. </xs:element>
  1236. </xs:schema>";
  1237. DataSet ds = new DataSet ("ExampleDataSet");
  1238. ds.Tables.Add (new DataTable ("ExampleDataTable"));
  1239. ds.Tables ["ExampleDataTable"].Columns.Add (
  1240. new DataColumn ("PrimaryKeyColumn", typeof(int), "", MappingType.Attribute));
  1241. ds.Tables ["ExampleDataTable"].Columns ["PrimaryKeyColumn"].AllowDBNull = false;
  1242. ds.Tables ["ExampleDataTable"].Constraints.Add (
  1243. "PK_ExampleDataTable",
  1244. ds.Tables ["ExampleDataTable"].Columns ["PrimaryKeyColumn"],
  1245. true);
  1246. ds.AcceptChanges ();
  1247. StringWriter sw = new StringWriter ();
  1248. ds.WriteXmlSchema (sw);
  1249. string result = sw.ToString ();
  1250. AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
  1251. }
  1252. // bug #67792.
  1253. [Test]
  1254. public void WriteXmlSchema4 ()
  1255. {
  1256. string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
  1257. <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
  1258. <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
  1259. <xs:complexType>
  1260. <xs:choice maxOccurs=""unbounded"">
  1261. <xs:element name=""MyType"">
  1262. <xs:complexType>
  1263. <xs:attribute name=""ID"" type=""xs:int"" use=""required"" />
  1264. <xs:attribute name=""Desc"" type=""xs:string"" />
  1265. </xs:complexType>
  1266. </xs:element>
  1267. </xs:choice>
  1268. </xs:complexType>
  1269. </xs:element>
  1270. </xs:schema>";
  1271. DataSet ds = new DataSet ("Example");
  1272. // Add MyType DataTable
  1273. DataTable dt = new DataTable ("MyType");
  1274. ds.Tables.Add (dt);
  1275. dt.Columns.Add (new DataColumn ("ID", typeof(int), "",
  1276. MappingType.Attribute));
  1277. dt.Columns ["ID"].AllowDBNull = false;
  1278. dt.Columns.Add (new DataColumn ("Desc", typeof
  1279. (string), "", MappingType.Attribute));
  1280. ds.AcceptChanges ();
  1281. StringWriter sw = new StringWriter ();
  1282. ds.WriteXmlSchema (sw);
  1283. string result = sw.ToString ();
  1284. AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
  1285. }
  1286. // bug # 68432
  1287. [Test]
  1288. [Category ("NotWorking")]
  1289. public void WriteXmlSchema5 ()
  1290. {
  1291. string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
  1292. <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
  1293. <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
  1294. <xs:complexType>
  1295. <xs:choice maxOccurs=""unbounded"">
  1296. <xs:element name=""StandAlone"">
  1297. <xs:complexType>
  1298. <xs:attribute name=""ID"" type=""xs:int"" use=""required"" />
  1299. <xs:attribute name=""Desc"" type=""xs:string"" use=""required"" />
  1300. </xs:complexType>
  1301. </xs:element>
  1302. <xs:element name=""Dimension"">
  1303. <xs:complexType>
  1304. <xs:attribute name=""Number"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
  1305. <xs:attribute name=""Title"" type=""xs:string"" use=""required"" />
  1306. </xs:complexType>
  1307. </xs:element>
  1308. <xs:element name=""Element"">
  1309. <xs:complexType>
  1310. <xs:attribute name=""Dimension"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
  1311. <xs:attribute name=""Number"" msdata:ReadOnly=""true"" type=""xs:int"" use=""required"" />
  1312. <xs:attribute name=""Title"" type=""xs:string"" use=""required"" />
  1313. </xs:complexType>
  1314. </xs:element>
  1315. </xs:choice>
  1316. </xs:complexType>
  1317. <xs:unique name=""PK_Dimension"" msdata:PrimaryKey=""true"">
  1318. <xs:selector xpath="".//Dimension"" />
  1319. <xs:field xpath=""@Number"" />
  1320. </xs:unique>
  1321. <xs:unique name=""PK_Element"" msdata:PrimaryKey=""true"">
  1322. <xs:selector xpath="".//Element"" />
  1323. <xs:field xpath=""@Dimension"" />
  1324. <xs:field xpath=""@Number"" />
  1325. </xs:unique>
  1326. <xs:keyref name=""FK_Element_To_Dimension"" refer=""PK_Dimension"">
  1327. <xs:selector xpath="".//Element"" />
  1328. <xs:field xpath=""@Dimension"" />
  1329. </xs:keyref>
  1330. </xs:element>
  1331. </xs:schema>";
  1332. DataSet ds = new DataSet("Example");
  1333. // Add a DataTable with no ReadOnly columns
  1334. DataTable dt1 = new DataTable ("StandAlone");
  1335. ds.Tables.Add (dt1);
  1336. // Add a ReadOnly column
  1337. dt1.Columns.Add (new DataColumn ("ID", typeof(int), "",
  1338. MappingType.Attribute));
  1339. dt1.Columns ["ID"].AllowDBNull = false;
  1340. dt1.Columns.Add (new DataColumn ("Desc", typeof
  1341. (string), "", MappingType.Attribute));
  1342. dt1.Columns ["Desc"].AllowDBNull = false;
  1343. // Add related DataTables with ReadOnly columns
  1344. DataTable dt2 = new DataTable ("Dimension");
  1345. ds.Tables.Add (dt2);
  1346. dt2.Columns.Add (new DataColumn ("Number", typeof
  1347. (int), "", MappingType.Attribute));
  1348. dt2.Columns ["Number"].AllowDBNull = false;
  1349. dt2.Columns ["Number"].ReadOnly = true;
  1350. dt2.Columns.Add (new DataColumn ("Title", typeof
  1351. (string), "", MappingType.Attribute));
  1352. dt2.Columns ["Title"].AllowDBNull = false;
  1353. dt2.Constraints.Add ("PK_Dimension", dt2.Columns ["Number"], true);
  1354. DataTable dt3 = new DataTable ("Element");
  1355. ds.Tables.Add(dt3);
  1356. dt3.Columns.Add (new DataColumn ("Dimension", typeof
  1357. (int), "", MappingType.Attribute));
  1358. dt3.Columns ["Dimension"].AllowDBNull = false;
  1359. dt3.Columns ["Dimension"].ReadOnly = true;
  1360. dt3.Columns.Add (new DataColumn ("Number", typeof
  1361. (int), "", MappingType.Attribute));
  1362. dt3.Columns ["Number"].AllowDBNull = false;
  1363. dt3.Columns ["Number"].ReadOnly = true;
  1364. dt3.Columns.Add (new DataColumn ("Title", typeof
  1365. (string), "", MappingType.Attribute));
  1366. dt3.Columns ["Title"].AllowDBNull = false;
  1367. dt3.Constraints.Add ("PK_Element", new DataColumn[] {
  1368. dt3.Columns ["Dimension"],
  1369. dt3.Columns ["Number"] }, true);
  1370. ds.Relations.Add ("FK_Element_To_Dimension",
  1371. dt2.Columns ["Number"], dt3.Columns["Dimension"]);
  1372. ds.AcceptChanges ();
  1373. StringWriter sw = new StringWriter ();
  1374. ds.WriteXmlSchema (sw);
  1375. string result = sw.ToString ();
  1376. AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
  1377. }
  1378. // bug #67793
  1379. [Test]
  1380. public void WriteXmlSchema6 ()
  1381. {
  1382. string xmlschema = @"<?xml version=""1.0"" encoding=""utf-16""?>
  1383. <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
  1384. <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
  1385. <xs:complexType>
  1386. <xs:choice maxOccurs=""unbounded"">
  1387. <xs:element name=""MyType"">
  1388. <xs:complexType>
  1389. <xs:attribute name=""Desc"">
  1390. <xs:simpleType>
  1391. <xs:restriction base=""xs:string"">
  1392. <xs:maxLength value=""32"" />
  1393. </xs:restriction>
  1394. </xs:simpleType>
  1395. </xs:attribute>
  1396. </xs:complexType>
  1397. </xs:element>
  1398. </xs:choice>
  1399. </xs:complexType>
  1400. </xs:element>
  1401. </xs:schema>";
  1402. DataSet ds = new DataSet("Example");
  1403. // Add MyType DataTable
  1404. ds.Tables.Add ("MyType");
  1405. ds.Tables ["MyType"].Columns.Add (new DataColumn(
  1406. "Desc", typeof (string), "", MappingType.Attribute));
  1407. ds.Tables ["MyType"].Columns ["Desc"].MaxLength = 32;
  1408. ds.AcceptChanges ();
  1409. StringWriter sw = new StringWriter ();
  1410. ds.WriteXmlSchema (sw);
  1411. string result = sw.ToString ();
  1412. AssertEquals (xmlschema, result.Replace ("\r\n", "\n"));
  1413. }
  1414. // bug #68008
  1415. [Test]
  1416. public void WriteXmlSchema7 ()
  1417. {
  1418. DataSet ds = new DataSet ();
  1419. DataTable dt = new DataTable ("table");
  1420. dt.Columns.Add ("col1");
  1421. dt.Columns.Add ("col2");
  1422. ds.Tables.Add (dt);
  1423. dt.Rows.Add (new object [] {"foo", "bar"});
  1424. StringWriter sw = new StringWriter ();
  1425. ds.WriteXmlSchema (sw);
  1426. Assert (sw.ToString ().IndexOf ("xmlns=\"\"") > 0);
  1427. }
  1428. // bug #61233
  1429. [Test]
  1430. public void WriteXmlExtendedProperties ()
  1431. {
  1432. string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
  1433. <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"">
  1434. <xs:element name=""NewDataSet"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"" msprop:version=""version 2.1"">
  1435. <xs:complexType>
  1436. <xs:choice maxOccurs=""unbounded"">
  1437. <xs:element name=""Foo"">
  1438. <xs:complexType>
  1439. <xs:sequence>
  1440. <xs:element name=""col1"" type=""xs:string"" minOccurs=""0"" />
  1441. </xs:sequence>
  1442. </xs:complexType>
  1443. </xs:element>
  1444. </xs:choice>
  1445. </xs:complexType>
  1446. </xs:element>
  1447. </xs:schema>";
  1448. DataSet ds = new DataSet ();
  1449. ds.ExtendedProperties ["version"] = "version 2.1";
  1450. DataTable dt = new DataTable ("Foo");
  1451. dt.Columns.Add ("col1");
  1452. dt.Rows.Add (new object [] {"foo"});
  1453. ds.Tables.Add (dt);
  1454. StringWriter sw = new StringWriter ();
  1455. ds.WriteXmlSchema (sw);
  1456. string result = sw.ToString ();
  1457. AssertEquals (xml, result.Replace ("\r\n", "\n"));
  1458. }
  1459. [Test]
  1460. [Category ("NotWorking")]
  1461. public void WriteXmlModeSchema ()
  1462. {
  1463. // This is the MS output of WriteXmlSchema().
  1464. string xml = @"<Example>
  1465. <xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
  1466. <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:Locale=""fi-FI"">
  1467. <xs:complexType>
  1468. <xs:choice maxOccurs=""unbounded"">
  1469. <xs:element name=""Dimension"">
  1470. <xs:complexType>
  1471. <xs:sequence>
  1472. <xs:element name=""Number"" type=""xs:int"" />
  1473. </xs:sequence>
  1474. </xs:complexType>
  1475. </xs:element>
  1476. <xs:element name=""Element"">
  1477. <xs:complexType>
  1478. <xs:sequence>
  1479. <xs:element name=""Dimension"" type=""xs:int"" />
  1480. <xs:element name=""Number"" type=""xs:int"" />
  1481. </xs:sequence>
  1482. </xs:complexType>
  1483. </xs:element>
  1484. </xs:choice>
  1485. </xs:complexType>
  1486. <xs:unique name=""PK_Dimension"" msdata:PrimaryKey=""true"">
  1487. <xs:selector xpath="".//Dimension"" />
  1488. <xs:field xpath=""Number"" />
  1489. </xs:unique>
  1490. <xs:unique name=""PK_Element"" msdata:PrimaryKey=""true"">
  1491. <xs:selector xpath="".//Element"" />
  1492. <xs:field xpath=""Dimension"" />
  1493. <xs:field xpath=""Number"" />
  1494. </xs:unique>
  1495. <xs:keyref name=""FK_Element_To_Dimension"" refer=""PK_Dimension"">
  1496. <xs:selector xpath="".//Element"" />
  1497. <xs:field xpath=""Dimension"" />
  1498. </xs:keyref>
  1499. </xs:element>
  1500. </xs:schema>
  1501. <Dimension>
  1502. <Number>0</Number>
  1503. </Dimension>
  1504. <Dimension>
  1505. <Number>1</Number>
  1506. </Dimension>
  1507. <Element>
  1508. <Dimension>0</Dimension>
  1509. <Number>0</Number>
  1510. </Element>
  1511. <Element>
  1512. <Dimension>0</Dimension>
  1513. <Number>1</Number>
  1514. </Element>
  1515. <Element>
  1516. <Dimension>0</Dimension>
  1517. <Number>2</Number>
  1518. </Element>
  1519. <Element>
  1520. <Dimension>0</Dimension>
  1521. <Number>3</Number>
  1522. </Element>
  1523. <Element>
  1524. <Dimension>1</Dimension>
  1525. <Number>0</Number>
  1526. </Element>
  1527. <Element>
  1528. <Dimension>1</Dimension>
  1529. <Number>1</Number>
  1530. </Element>
  1531. </Example>";
  1532. DataSet ds = new DataSet("Example");
  1533. // Dimension DataTable
  1534. DataTable dt1 = new DataTable ("Dimension");
  1535. ds.Tables.Add (dt1);
  1536. dt1.Columns.Add (new DataColumn ("Number", typeof (int)));
  1537. dt1.Columns ["Number"].AllowDBNull = false;
  1538. dt1.Constraints.Add ("PK_Dimension", dt1.Columns ["Number"], true);
  1539. // Element DataTable
  1540. DataTable dt2 = new DataTable ("Element");
  1541. ds.Tables.Add (dt2);
  1542. dt2.Columns.Add (new DataColumn ("Dimension", typeof (int)));
  1543. dt2.Columns ["Dimension"].AllowDBNull = false;
  1544. dt2.Columns.Add (new DataColumn ("Number", typeof (int)));
  1545. dt2.Columns ["Number"].AllowDBNull = false;
  1546. dt2.Constraints.Add ("PK_Element", new DataColumn[] {
  1547. dt2.Columns ["Dimension"],
  1548. dt2.Columns ["Number"] },
  1549. true);
  1550. // Add DataRelations
  1551. ds.Relations.Add ("FK_Element_To_Dimension",
  1552. dt1.Columns ["Number"],
  1553. dt2.Columns ["Dimension"], true);
  1554. // Add 2 Dimensions
  1555. for (int i = 0; i < 2; i++) {
  1556. DataRow newRow = dt1.NewRow ();
  1557. newRow ["Number"] = i;
  1558. dt1.Rows.Add (newRow);
  1559. }
  1560. // Dimension 0 => 4 Elements
  1561. for (int i = 0; i < 4; i++) {
  1562. DataRow newRow = dt2.NewRow();
  1563. newRow ["Dimension"] = 0;
  1564. newRow ["Number"] = i;
  1565. dt2.Rows.Add (newRow);
  1566. }
  1567. // Dimension 1 => 2 Elements
  1568. for (int i = 0; i < 2; i++) {
  1569. DataRow newRow = dt2.NewRow();
  1570. newRow ["Dimension"] = 1;
  1571. newRow ["Number"] = i;
  1572. dt2.Rows.Add (newRow);
  1573. }
  1574. ds.AcceptChanges ();
  1575. StringWriter sw = new StringWriter ();
  1576. ds.WriteXml(sw, XmlWriteMode.WriteSchema);
  1577. string result = sw.ToString ();
  1578. AssertEquals (xml, result.Replace ("\r\n", "\n"));
  1579. }
  1580. [Test]
  1581. public void DeserializeModifiedDataSet ()
  1582. {
  1583. // Serialization begins
  1584. DataSet prevDs = new DataSet ();
  1585. DataTable dt = prevDs.Tables.Add ();
  1586. dt.Columns.Add(new DataColumn("Id", typeof(string)));
  1587. DataRow dr = dt.NewRow();
  1588. dr [0] = "a";
  1589. dt.Rows.Add (dr);
  1590. prevDs.AcceptChanges ();
  1591. dr = prevDs.Tables[0].Rows[0];
  1592. dr [0] = "b";
  1593. XmlSerializer serializer = new XmlSerializer (typeof (DataSet));
  1594. StringWriter sw = new StringWriter ();
  1595. XmlTextWriter xw = new XmlTextWriter (sw);
  1596. xw.QuoteChar = '\'';
  1597. serializer.Serialize (xw, prevDs);
  1598. // Deserialization begins
  1599. StringReader sr = new StringReader (sw.ToString ());
  1600. XmlTextReader reader = new XmlTextReader (sr);
  1601. XmlSerializer serializer1 = new XmlSerializer (typeof (DataSet));
  1602. DataSet ds = serializer1.Deserialize (reader) as DataSet;
  1603. AssertEquals ("deserialization after modification does not give original values",
  1604. prevDs.Tables[0].Rows [0][0,DataRowVersion.Original].ToString (),
  1605. ds.Tables[0].Rows [0][0,DataRowVersion.Original].ToString ());
  1606. AssertEquals ("deserialization after modification oes not give current values",
  1607. prevDs.Tables[0].Rows [0][0,DataRowVersion.Current].ToString (),
  1608. ds.Tables[0].Rows [0][0,DataRowVersion.Current].ToString ());
  1609. }
  1610. /// <summary>
  1611. /// Test for testing DataSet.Clear method with foriegn key relations
  1612. /// This is expected to clear all the related datatable rows also
  1613. /// </summary>
  1614. [Test]
  1615. public void DataSetClearTest ()
  1616. {
  1617. DataSet ds = new DataSet ();
  1618. DataTable parent = ds.Tables.Add ("Parent");
  1619. DataTable child = ds.Tables.Add ("Child");
  1620. parent.Columns.Add ("id", typeof (int));
  1621. child.Columns.Add ("ref_id", typeof(int));
  1622. child.Constraints.Add (new ForeignKeyConstraint ("fk_constraint", parent.Columns [0], child.Columns [0]));
  1623. DataRow dr = parent.NewRow ();
  1624. dr [0] = 1;
  1625. parent.Rows.Add (dr);
  1626. dr.AcceptChanges ();
  1627. dr = child.NewRow ();
  1628. dr [0] = 1;
  1629. child.Rows.Add (dr);
  1630. dr.AcceptChanges ();
  1631. try {
  1632. ds.Clear (); // this should clear all the rows in parent & child tables
  1633. } catch (Exception e) {
  1634. throw (new Exception ("Exception should not have been thrown at Clear method" + e.ToString ()));
  1635. }
  1636. Assertion.AssertEquals ("parent table rows should not exist!", 0, parent.Rows.Count);
  1637. Assertion.AssertEquals ("child table rows should not exist!", 0, child.Rows.Count);
  1638. }
  1639. [Test]
  1640. public void CloneSubClassTest()
  1641. {
  1642. MyDataSet ds1 = new MyDataSet();
  1643. MyDataSet ds = (MyDataSet)(ds1.Clone());
  1644. AssertEquals("A#01",2,MyDataSet.count);
  1645. }
  1646. #region DataSet.GetChanges Tests
  1647. public void GetChanges_Relations_DifferentRowStatesTest ()
  1648. {
  1649. DataSet ds = new DataSet ("ds");
  1650. DataTable parent = ds.Tables.Add ("parent");
  1651. DataTable child = ds.Tables.Add ("child");
  1652. parent.Columns.Add ("id", typeof (int));
  1653. parent.Columns.Add ("name", typeof (string));
  1654. child.Columns.Add ("id", typeof (int));
  1655. child.Columns.Add ("parent", typeof (int));
  1656. child.Columns.Add ("name", typeof (string));
  1657. parent.Rows.Add (new object [] { 1, "mono parent 1" } );
  1658. parent.Rows.Add (new object [] { 2, "mono parent 2" } );
  1659. parent.Rows.Add (new object [] { 3, "mono parent 3" } );
  1660. parent.Rows.Add (new object [] { 4, "mono parent 4" } );
  1661. parent.AcceptChanges ();
  1662. child.Rows.Add (new object [] { 1, 1, "mono child 1" } );
  1663. child.Rows.Add (new object [] { 2, 2, "mono child 2" } );
  1664. child.Rows.Add (new object [] { 3, 3, "mono child 3" } );
  1665. child.AcceptChanges ();
  1666. DataRelation relation = ds.Relations.Add ("parent_child",
  1667. parent.Columns ["id"],
  1668. child.Columns ["parent"]);
  1669. // modify the parent and get changes
  1670. child.Rows [1]["parent"] = 4;
  1671. DataSet changes = ds.GetChanges ();
  1672. DataRow row = changes.Tables ["parent"].Rows[0];
  1673. AssertType.AreEqual ((int) parent.Rows [3][0], (int) row [0], "#RT1");
  1674. AssertType.AreEqual (1, changes.Tables ["parent"].Rows.Count, "#RT2 only get parent row with current version");
  1675. ds.RejectChanges ();
  1676. // delete a child row and get changes.
  1677. child.Rows [0].Delete ();
  1678. changes = ds.GetChanges ();
  1679. AssertType.AreEqual (changes.Tables.Count, 2, "#RT3 Should import parent table as well");
  1680. AssertType.AreEqual (1, changes.Tables ["parent"].Rows.Count, "#RT4 only get parent row with original version");
  1681. AssertType.AreEqual (1, (int) changes.Tables ["parent"].Rows [0][0], "#RT5 parent row based on original version");
  1682. }
  1683. #endregion // DataSet.GetChanges Tests
  1684. [Test]
  1685. public void RuleTest ()
  1686. {
  1687. DataSet ds = new DataSet ("testds");
  1688. DataTable parent = ds.Tables.Add ("parent");
  1689. DataTable child = ds.Tables.Add ("child");
  1690. parent.Columns.Add ("id", typeof (int));
  1691. parent.Columns.Add ("name", typeof (string));
  1692. parent.PrimaryKey = new DataColumn [] {parent.Columns ["id"]} ;
  1693. child.Columns.Add ("id", typeof (int));
  1694. child.Columns.Add ("parent", typeof (int));
  1695. child.Columns.Add ("name", typeof (string));
  1696. child.PrimaryKey = new DataColumn [] {child.Columns ["id"]} ;
  1697. DataRelation relation = ds.Relations.Add ("parent_child",
  1698. parent.Columns ["id"],
  1699. child.Columns ["parent"]);
  1700. parent.Rows.Add (new object [] {1, "mono test 1"});
  1701. parent.Rows.Add (new object [] {2, "mono test 2"});
  1702. parent.Rows.Add (new object [] {3, "mono test 3"});
  1703. child.Rows.Add (new object [] {1, 1, "mono child test 1"});
  1704. child.Rows.Add (new object [] {2, 2, "mono child test 2"});
  1705. child.Rows.Add (new object [] {3, 3, "mono child test 3"});
  1706. ds.AcceptChanges ();
  1707. parent.Rows [0] ["name"] = "mono changed test 1";
  1708. Assertion.AssertEquals ("#RT1 child should not be modified",
  1709. DataRowState.Unchanged,
  1710. parent.Rows [0].GetChildRows (relation) [0].RowState);
  1711. ds.RejectChanges ();
  1712. parent.Rows [0] ["id"] = "4";
  1713. DataRow childRow = parent.Rows [0].GetChildRows (relation) [0];
  1714. Assertion.AssertEquals ("#RT2 child should be modified",
  1715. DataRowState.Modified,
  1716. childRow.RowState);
  1717. Assertion.AssertEquals ("#RT3 child should point to modified row",
  1718. 4,
  1719. (int) childRow ["parent"]);
  1720. }
  1721. }
  1722. public class MyDataSet:DataSet {
  1723. public static int count = 0;
  1724. public MyDataSet() {
  1725. count++;
  1726. }
  1727. }
  1728. }