XmlReaderCommonTests.cs 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325
  1. //
  2. // System.Xml.XmlReaderCommonTests
  3. //
  4. // Authors:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C) 2003 Atsushi Enomoto
  8. // Note: Most of testcases are moved from XmlTextReaderTests.cs and
  9. // XmlNodeReaderTests.cs.
  10. //
  11. using System;
  12. using System.IO;
  13. using System.Text;
  14. using System.Xml;
  15. using System.Xml.Schema;
  16. using System.Xml.XPath;
  17. #if NET_4_5
  18. using System.Threading;
  19. using System.Threading.Tasks;
  20. #endif
  21. using NUnit.Framework;
  22. namespace MonoTests.System.Xml
  23. {
  24. [TestFixture]
  25. public class XmlReaderTests
  26. {
  27. [SetUp]
  28. public void GetReady ()
  29. {
  30. document = new XmlDocument ();
  31. document.LoadXml (xml1);
  32. }
  33. XmlDocument document;
  34. const string xml1 = "<root attr1='value1'><child /></root>";
  35. const string xml2 = "<root><foo/><bar>test.</bar></root>";
  36. const string xml3 = "<root> test of <b>mixed</b> string.<![CDATA[ cdata string.]]></root>";
  37. const string xml4 = "<root>test of <b>mixed</b> string.</root>";
  38. XmlTextReader xtr;
  39. XmlNodeReader xnr;
  40. // copy from XmlTextReaderTests
  41. private void AssertStartDocument (XmlReader xmlReader)
  42. {
  43. Assert.IsTrue (xmlReader.ReadState == ReadState.Initial);
  44. Assert.IsTrue (xmlReader.NodeType == XmlNodeType.None);
  45. Assert.IsTrue (xmlReader.Depth == 0);
  46. Assert.IsTrue (!xmlReader.EOF);
  47. }
  48. private void AssertNode (
  49. XmlReader xmlReader,
  50. XmlNodeType nodeType,
  51. int depth,
  52. bool isEmptyElement,
  53. string name,
  54. string prefix,
  55. string localName,
  56. string namespaceURI,
  57. string value,
  58. int attributeCount)
  59. {
  60. AssertNode ("", xmlReader, nodeType, depth,
  61. isEmptyElement, name, prefix, localName,
  62. namespaceURI, value, attributeCount);
  63. }
  64. private void AssertNode (
  65. string label,
  66. XmlReader xmlReader,
  67. XmlNodeType nodeType,
  68. int depth,
  69. bool isEmptyElement,
  70. string name,
  71. string prefix,
  72. string localName,
  73. string namespaceURI,
  74. string value,
  75. int attributeCount)
  76. {
  77. Assert.IsTrue (xmlReader.Read (), label + " Read() return value");
  78. Assert.IsTrue (xmlReader.ReadState == ReadState.Interactive, label + " ReadState");
  79. Assert.IsTrue (!xmlReader.EOF, label + " !EOF");
  80. AssertNodeValues (label, xmlReader, nodeType, depth,
  81. isEmptyElement, name, prefix, localName,
  82. namespaceURI, value, value != String.Empty,
  83. attributeCount, attributeCount > 0);
  84. }
  85. private void AssertNodeValues (
  86. string label,
  87. XmlReader xmlReader,
  88. XmlNodeType nodeType,
  89. int depth,
  90. bool isEmptyElement,
  91. string name,
  92. string prefix,
  93. string localName,
  94. string namespaceURI,
  95. string value,
  96. int attributeCount)
  97. {
  98. AssertNodeValues (label, xmlReader, nodeType, depth,
  99. isEmptyElement, name, prefix, localName,
  100. namespaceURI, value, value != String.Empty,
  101. attributeCount, attributeCount > 0);
  102. }
  103. private void AssertNodeValues (
  104. string label,
  105. XmlReader xmlReader,
  106. XmlNodeType nodeType,
  107. int depth,
  108. bool isEmptyElement,
  109. string name,
  110. string prefix,
  111. string localName,
  112. string namespaceURI,
  113. string value,
  114. bool hasValue,
  115. int attributeCount,
  116. bool hasAttributes)
  117. {
  118. label = String.Concat (label, "(", xmlReader.GetType ().Name, ")");
  119. Assert.AreEqual (nodeType, xmlReader.NodeType, label + ": NodeType");
  120. Assert.AreEqual (isEmptyElement, xmlReader.IsEmptyElement, label + ": IsEmptyElement");
  121. Assert.AreEqual (name, xmlReader.Name, label + ": name");
  122. Assert.AreEqual (prefix, xmlReader.Prefix, label + ": prefix");
  123. Assert.AreEqual (localName, xmlReader.LocalName, label + ": localName");
  124. Assert.AreEqual (namespaceURI, xmlReader.NamespaceURI, label + ": namespaceURI");
  125. Assert.AreEqual (depth, xmlReader.Depth, label + ": Depth");
  126. Assert.AreEqual (hasValue, xmlReader.HasValue, label + ": hasValue");
  127. Assert.AreEqual (value, xmlReader.Value, label + ": Value");
  128. Assert.AreEqual (hasAttributes, xmlReader.HasAttributes, label + ": hasAttributes");
  129. Assert.AreEqual (attributeCount, xmlReader.AttributeCount, label + ": attributeCount");
  130. }
  131. private void AssertAttribute (
  132. XmlReader xmlReader,
  133. string name,
  134. string prefix,
  135. string localName,
  136. string namespaceURI,
  137. string value)
  138. {
  139. Assert.AreEqual (value, xmlReader [name], "value");
  140. Assert.IsTrue (xmlReader.GetAttribute (name) == value);
  141. if (namespaceURI != String.Empty) {
  142. Assert.IsTrue (xmlReader[localName, namespaceURI] == value);
  143. Assert.IsTrue (xmlReader.GetAttribute (localName, namespaceURI) == value);
  144. }
  145. }
  146. private void AssertEndDocument (XmlReader xmlReader)
  147. {
  148. Assert.IsTrue (!xmlReader.Read (), "could read");
  149. Assert.AreEqual (XmlNodeType.None, xmlReader.NodeType, "NodeType is not XmlNodeType.None");
  150. Assert.AreEqual (0, xmlReader.Depth, "Depth is not 0");
  151. Assert.AreEqual (ReadState.EndOfFile, xmlReader.ReadState, "ReadState is not ReadState.EndOfFile");
  152. Assert.IsTrue (xmlReader.EOF, "not EOF");
  153. xmlReader.Close ();
  154. Assert.AreEqual (ReadState.Closed, xmlReader.ReadState, "ReadState is not ReadState.Cosed");
  155. }
  156. private delegate void TestMethod (XmlReader reader);
  157. private void RunTest (string xml, TestMethod method)
  158. {
  159. xtr = new XmlTextReader (new StringReader (xml));
  160. method (xtr);
  161. // DTD validation
  162. xtr = new XmlTextReader (new StringReader (xml));
  163. XmlValidatingReader xvr = new XmlValidatingReader (xtr);
  164. xvr.ValidationType = ValidationType.DTD;
  165. xvr.EntityHandling = EntityHandling.ExpandCharEntities;
  166. method (xvr);
  167. // XSD validation
  168. xtr = new XmlTextReader (new StringReader (xml));
  169. xvr = new XmlValidatingReader (xtr);
  170. xvr.EntityHandling = EntityHandling.ExpandCharEntities;
  171. method (xvr);
  172. document.XmlResolver = null;
  173. document.LoadXml (xml);
  174. xnr = new XmlNodeReader (document);
  175. method (xnr);
  176. #if NET_2_0
  177. /*
  178. // XPathNavigatorReader tests
  179. System.Xml.XPath.XPathDocument doc = new System.Xml.XPath.XPathDocument (new StringReader (xml));
  180. XmlReader xpr = doc.CreateNavigator ().ReadSubtree ();
  181. method (xpr);
  182. */
  183. #endif
  184. }
  185. [Test]
  186. public void InitialState ()
  187. {
  188. RunTest (xml1, new TestMethod (InitialState));
  189. }
  190. private void InitialState (XmlReader reader)
  191. {
  192. Assert.AreEqual (0, reader.Depth, "Depth");
  193. Assert.AreEqual (false, reader.EOF, "EOF");
  194. Assert.AreEqual (false, reader.HasValue, "HasValue");
  195. Assert.AreEqual (false, reader.IsEmptyElement, "IsEmptyElement");
  196. Assert.AreEqual (String.Empty, reader.LocalName, "LocalName");
  197. Assert.AreEqual (XmlNodeType.None, reader.NodeType, "NodeType");
  198. Assert.AreEqual (ReadState.Initial, reader.ReadState, "ReadState");
  199. }
  200. [Test]
  201. public void Read ()
  202. {
  203. RunTest (xml1, new TestMethod (Read));
  204. }
  205. public void Read (XmlReader reader)
  206. {
  207. reader.Read ();
  208. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "<root>.NodeType");
  209. Assert.AreEqual ("root", reader.Name, "<root>.Name");
  210. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "<root>.ReadState");
  211. Assert.AreEqual (0, reader.Depth, "<root>.Depth");
  212. // move to 'child'
  213. reader.Read ();
  214. Assert.AreEqual (1, reader.Depth, "<child/>.Depth");
  215. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "<child/>.NodeType");
  216. Assert.AreEqual ("child", reader.Name, "<child/>.Name");
  217. reader.Read ();
  218. Assert.AreEqual (0, reader.Depth, "</root>.Depth");
  219. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "</root>.NodeType");
  220. Assert.AreEqual ("root", reader.Name, "</root>.Name");
  221. reader.Read ();
  222. Assert.AreEqual (true, reader.EOF, "end.EOF");
  223. Assert.AreEqual (XmlNodeType.None, reader.NodeType, "end.NodeType");
  224. }
  225. [Test]
  226. [Category ("NotDotNet")]
  227. public void ReadAttributeValue ()
  228. {
  229. RunTest ("<root attr=''/>", new TestMethod (ReadAttributeValue));
  230. }
  231. public void ReadAttributeValue (XmlReader reader)
  232. {
  233. reader.Read (); // root
  234. Assert.IsTrue (reader.MoveToFirstAttribute ());
  235. // It looks like that MS.NET shows AttributeCount and
  236. // HasAttributes as the same as element node!
  237. this.AssertNodeValues ("#1",
  238. reader, XmlNodeType.Attribute,
  239. 1, false, "attr", "", "attr", "", "", true, 1, true);
  240. Assert.IsTrue (reader.ReadAttributeValue ());
  241. // MS.NET XmlTextReader fails. Its Prefix returns
  242. // null instead of "". It is fixed in MS.NET 2.0.
  243. this.AssertNodeValues ("#2",
  244. reader, XmlNodeType.Text,
  245. 2, false, "", "", "", "", "", true, 1, true);
  246. Assert.IsTrue (reader.MoveToElement ());
  247. this.AssertNodeValues ("#3",
  248. reader, XmlNodeType.Element,
  249. 0, true, "root", "", "root", "", "", false, 1, true);
  250. }
  251. [Test]
  252. public void ReadEmptyElement ()
  253. {
  254. RunTest (xml2, new TestMethod (ReadEmptyElement));
  255. }
  256. public void ReadEmptyElement (XmlReader reader)
  257. {
  258. reader.Read (); // root
  259. Assert.AreEqual (false, reader.IsEmptyElement);
  260. reader.Read (); // foo
  261. Assert.AreEqual ("foo", reader.Name);
  262. Assert.AreEqual (true, reader.IsEmptyElement);
  263. reader.Read (); // bar
  264. Assert.AreEqual ("bar", reader.Name);
  265. Assert.AreEqual (false, reader.IsEmptyElement);
  266. }
  267. [Test]
  268. public void ReadStringFromElement ()
  269. {
  270. RunTest (xml3, new TestMethod (ReadStringFromElement));
  271. }
  272. public void ReadStringFromElement (XmlReader reader)
  273. {
  274. // Note: ReadString() test works only when the reader is
  275. // positioned at the container element.
  276. // In case the reader is positioned at the first
  277. // character node, XmlTextReader and XmlNodeReader works
  278. // different!!
  279. reader.Read ();
  280. string s = reader.ReadString ();
  281. Assert.AreEqual (" test of ", s, "readString.1.ret_val");
  282. Assert.AreEqual ("b", reader.Name, "readString.1.Name");
  283. s = reader.ReadString ();
  284. Assert.AreEqual ("mixed", s, "readString.2.ret_val");
  285. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "readString.2.NodeType");
  286. s = reader.ReadString (); // never proceeds.
  287. Assert.AreEqual (String.Empty, s, "readString.3.ret_val");
  288. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "readString.3.NodeType");
  289. reader.Read ();
  290. Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "readString.4.NodeType");
  291. Assert.AreEqual (" string.", reader.Value, "readString.4.Value");
  292. s = reader.ReadString (); // reads the same Text node.
  293. Assert.AreEqual (" string. cdata string.", s, "readString.5.ret_val");
  294. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "readString.5.NodeType");
  295. }
  296. [Test]
  297. public void ReadInnerXml ()
  298. {
  299. const string xml = "<root><foo>test of <b>mixed</b> string.</foo><bar /></root>";
  300. RunTest (xml, new TestMethod (ReadInnerXml));
  301. }
  302. public void ReadInnerXml (XmlReader reader)
  303. {
  304. reader.Read ();
  305. reader.Read ();
  306. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "initial.ReadState");
  307. Assert.AreEqual (false, reader.EOF, "initial.EOF");
  308. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "initial.NodeType");
  309. string s = reader.ReadInnerXml ();
  310. Assert.AreEqual ("test of <b>mixed</b> string.", s, "read_all");
  311. Assert.AreEqual ("bar", reader.Name, "after.Name");
  312. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "after.NodeType");
  313. }
  314. [Test]
  315. public void EmptyElement ()
  316. {
  317. RunTest ("<foo/>", new TestMethod (EmptyElement));
  318. }
  319. public void EmptyElement (XmlReader xmlReader)
  320. {
  321. AssertStartDocument (xmlReader);
  322. AssertNode (
  323. xmlReader, // xmlReader
  324. XmlNodeType.Element, // nodeType
  325. 0, // depth
  326. true, // isEmptyElement
  327. "foo", // name
  328. String.Empty, // prefix
  329. "foo", // localName
  330. String.Empty, // namespaceURI
  331. String.Empty, // value
  332. 0 // attributeCount
  333. );
  334. AssertEndDocument (xmlReader);
  335. }
  336. [Test]
  337. public void NestedEmptyTag ()
  338. {
  339. string xml = "<foo><bar/></foo>";
  340. RunTest (xml, new TestMethod (NestedEmptyTag));
  341. }
  342. public void NestedEmptyTag (XmlReader xmlReader)
  343. {
  344. AssertStartDocument (xmlReader);
  345. AssertNode (
  346. "#1",
  347. xmlReader, // xmlReader
  348. XmlNodeType.Element, // nodeType
  349. 0, //depth
  350. false, // isEmptyElement
  351. "foo", // name
  352. String.Empty, // prefix
  353. "foo", // localName
  354. String.Empty, // namespaceURI
  355. String.Empty, // value
  356. 0 // attributeCount
  357. );
  358. AssertNode (
  359. "#2",
  360. xmlReader, // xmlReader
  361. XmlNodeType.Element, // nodeType
  362. 1, //depth
  363. true, // isEmptyElement
  364. "bar", // name
  365. String.Empty, // prefix
  366. "bar", // localName
  367. String.Empty, // namespaceURI
  368. String.Empty, // value
  369. 0 // attributeCount
  370. );
  371. AssertNode (
  372. "#3",
  373. xmlReader, // xmlReader
  374. XmlNodeType.EndElement, // nodeType
  375. 0, //depth
  376. false, // isEmptyElement
  377. "foo", // name
  378. String.Empty, // prefix
  379. "foo", // localName
  380. String.Empty, // namespaceURI
  381. String.Empty, // value
  382. 0 // attributeCount
  383. );
  384. AssertEndDocument (xmlReader);
  385. }
  386. [Test]
  387. public void NestedText ()
  388. {
  389. string xml = "<foo>bar</foo>";
  390. RunTest (xml, new TestMethod (NestedText));
  391. }
  392. public void NestedText (XmlReader xmlReader)
  393. {
  394. AssertStartDocument (xmlReader);
  395. AssertNode (
  396. xmlReader, // xmlReader
  397. XmlNodeType.Element, // nodeType
  398. 0, //depth
  399. false, // isEmptyElement
  400. "foo", // name
  401. String.Empty, // prefix
  402. "foo", // localName
  403. String.Empty, // namespaceURI
  404. String.Empty, // value
  405. 0 // attributeCount
  406. );
  407. AssertNode (
  408. xmlReader, // xmlReader
  409. XmlNodeType.Text, // nodeType
  410. 1, //depth
  411. false, // isEmptyElement
  412. String.Empty, // name
  413. String.Empty, // prefix
  414. String.Empty, // localName
  415. String.Empty, // namespaceURI
  416. "bar", // value
  417. 0 // attributeCount
  418. );
  419. AssertNode (
  420. xmlReader, // xmlReader
  421. XmlNodeType.EndElement, // nodeType
  422. 0, //depth
  423. false, // isEmptyElement
  424. "foo", // name
  425. String.Empty, // prefix
  426. "foo", // localName
  427. String.Empty, // namespaceURI
  428. String.Empty, // value
  429. 0 // attributeCount
  430. );
  431. AssertEndDocument (xmlReader);
  432. }
  433. [Test]
  434. public void EmptyElementWithAttributes ()
  435. {
  436. string xml = @"<foo bar=""baz"" quux='quuux' x:foo='x-foo' xmlns:x = 'urn:xfoo' />";
  437. RunTest (xml, new TestMethod (EmptyElementWithAttributes ));
  438. }
  439. public void EmptyElementWithAttributes (XmlReader xmlReader)
  440. {
  441. AssertStartDocument (xmlReader);
  442. AssertNode (
  443. xmlReader, // xmlReader
  444. XmlNodeType.Element, // nodeType
  445. 0, //depth
  446. true, // isEmptyElement
  447. "foo", // name
  448. String.Empty, // prefix
  449. "foo", // localName
  450. String.Empty, // namespaceURI
  451. String.Empty, // value
  452. 4 // attributeCount
  453. );
  454. AssertAttribute (
  455. xmlReader, // xmlReader
  456. "bar", // name
  457. String.Empty, // prefix
  458. "bar", // localName
  459. String.Empty, // namespaceURI
  460. "baz" // value
  461. );
  462. AssertAttribute (
  463. xmlReader, // xmlReader
  464. "quux", // name
  465. String.Empty, // prefix
  466. "quux", // localName
  467. String.Empty, // namespaceURI
  468. "quuux" // value
  469. );
  470. AssertAttribute (
  471. xmlReader, // xmlReader
  472. "notexist", // name
  473. String.Empty, // prefix
  474. "notexist", // localName
  475. String.Empty, // namespaceURI
  476. null // value
  477. );
  478. AssertAttribute (
  479. xmlReader, // xmlReader
  480. "x:foo", // name
  481. "x", // prefix
  482. "foo", // localName
  483. "urn:xfoo", // namespaceURI
  484. "x-foo" // value
  485. );
  486. AssertAttribute (
  487. xmlReader, // xmlReader
  488. "x:bar", // name
  489. "x", // prefix
  490. "bar", // localName
  491. "urn:xfoo", // namespaceURI
  492. null // value
  493. );
  494. AssertEndDocument (xmlReader);
  495. }
  496. [Test]
  497. public void ProcessingInstructionBeforeDocumentElement ()
  498. {
  499. string xml = "<?foo bar?><baz/>";
  500. RunTest (xml, new TestMethod (ProcessingInstructionBeforeDocumentElement));
  501. }
  502. public void ProcessingInstructionBeforeDocumentElement (XmlReader xmlReader)
  503. {
  504. AssertStartDocument (xmlReader);
  505. AssertNode (
  506. xmlReader, // xmlReader
  507. XmlNodeType.ProcessingInstruction, // nodeType
  508. 0, //depth
  509. false, // isEmptyElement
  510. "foo", // name
  511. String.Empty, // prefix
  512. "foo", // localName
  513. String.Empty, // namespaceURI
  514. "bar", // value
  515. 0 // attributeCount
  516. );
  517. AssertNode (
  518. xmlReader, // xmlReader
  519. XmlNodeType.Element, // nodeType
  520. 0, //depth
  521. true, // isEmptyElement
  522. "baz", // name
  523. String.Empty, // prefix
  524. "baz", // localName
  525. String.Empty, // namespaceURI
  526. String.Empty, // value
  527. 0 // attributeCount
  528. );
  529. AssertEndDocument (xmlReader);
  530. }
  531. [Test]
  532. public void CommentBeforeDocumentElement ()
  533. {
  534. string xml = "<!--foo--><bar/>";
  535. RunTest (xml, new TestMethod (CommentBeforeDocumentElement));
  536. }
  537. public void CommentBeforeDocumentElement (XmlReader xmlReader)
  538. {
  539. AssertStartDocument (xmlReader);
  540. AssertNode (
  541. xmlReader, // xmlReader
  542. XmlNodeType.Comment, // nodeType
  543. 0, //depth
  544. false, // isEmptyElement
  545. String.Empty, // name
  546. String.Empty, // prefix
  547. String.Empty, // localName
  548. String.Empty, // namespaceURI
  549. "foo", // value
  550. 0 // attributeCount
  551. );
  552. AssertNode (
  553. xmlReader, // xmlReader
  554. XmlNodeType.Element, // nodeType
  555. 0, //depth
  556. true, // isEmptyElement
  557. "bar", // name
  558. String.Empty, // prefix
  559. "bar", // localName
  560. String.Empty, // namespaceURI
  561. String.Empty, // value
  562. 0 // attributeCount
  563. );
  564. AssertEndDocument (xmlReader);
  565. }
  566. [Test]
  567. public void PredefinedEntities ()
  568. {
  569. string xml = "<foo>&lt;&gt;&amp;&apos;&quot;</foo>";
  570. RunTest (xml, new TestMethod (PredefinedEntities));
  571. }
  572. public void PredefinedEntities (XmlReader xmlReader)
  573. {
  574. AssertStartDocument (xmlReader);
  575. AssertNode (
  576. xmlReader, // xmlReader
  577. XmlNodeType.Element, // nodeType
  578. 0, //depth
  579. false, // isEmptyElement
  580. "foo", // name
  581. String.Empty, // prefix
  582. "foo", // localName
  583. String.Empty, // namespaceURI
  584. String.Empty, // value
  585. 0 // attributeCount
  586. );
  587. AssertNode (
  588. xmlReader, // xmlReader
  589. XmlNodeType.Text, // nodeType
  590. 1, //depth
  591. false, // isEmptyElement
  592. String.Empty, // name
  593. String.Empty, // prefix
  594. String.Empty, // localName
  595. String.Empty, // namespaceURI
  596. "<>&'\"", // value
  597. 0 // attributeCount
  598. );
  599. AssertNode (
  600. xmlReader, // xmlReader
  601. XmlNodeType.EndElement, // nodeType
  602. 0, //depth
  603. false, // isEmptyElement
  604. "foo", // name
  605. String.Empty, // prefix
  606. "foo", // localName
  607. String.Empty, // namespaceURI
  608. String.Empty, // value
  609. 0 // attributeCount
  610. );
  611. AssertEndDocument (xmlReader);
  612. }
  613. [Test]
  614. public void CharacterReferences ()
  615. {
  616. string xml = "<foo>&#70;&#x4F;&#x4f;</foo>";
  617. RunTest (xml, new TestMethod (CharacterReferences));
  618. }
  619. public void CharacterReferences (XmlReader xmlReader)
  620. {
  621. AssertStartDocument (xmlReader);
  622. AssertNode (
  623. xmlReader, // xmlReader
  624. XmlNodeType.Element, // nodeType
  625. 0, //depth
  626. false, // isEmptyElement
  627. "foo", // name
  628. String.Empty, // prefix
  629. "foo", // localName
  630. String.Empty, // namespaceURI
  631. String.Empty, // value
  632. 0 // attributeCount
  633. );
  634. AssertNode (
  635. xmlReader, // xmlReader
  636. XmlNodeType.Text, // nodeType
  637. 1, //depth
  638. false, // isEmptyElement
  639. String.Empty, // name
  640. String.Empty, // prefix
  641. String.Empty, // localName
  642. String.Empty, // namespaceURI
  643. "FOO", // value
  644. 0 // attributeCount
  645. );
  646. AssertNode (
  647. xmlReader, // xmlReader
  648. XmlNodeType.EndElement, // nodeType
  649. 0, //depth
  650. false, // isEmptyElement
  651. "foo", // name
  652. String.Empty, // prefix
  653. "foo", // localName
  654. String.Empty, // namespaceURI
  655. String.Empty, // value
  656. 0 // attributeCount
  657. );
  658. AssertEndDocument (xmlReader);
  659. }
  660. [Test]
  661. public void PredefinedEntitiesInAttribute ()
  662. {
  663. string xml = "<foo bar='&lt;&gt;&amp;&apos;&quot;'/>";
  664. RunTest (xml, new TestMethod (PredefinedEntitiesInAttribute ));
  665. }
  666. public void PredefinedEntitiesInAttribute (XmlReader xmlReader)
  667. {
  668. AssertStartDocument (xmlReader);
  669. AssertNode (
  670. xmlReader, // xmlReader
  671. XmlNodeType.Element, // nodeType
  672. 0, //depth
  673. true, // isEmptyElement
  674. "foo", // name
  675. String.Empty, // prefix
  676. "foo", // localName
  677. String.Empty, // namespaceURI
  678. String.Empty, // value
  679. 1 // attributeCount
  680. );
  681. AssertAttribute (
  682. xmlReader, // xmlReader
  683. "bar", // name
  684. String.Empty, // prefix
  685. "bar", // localName
  686. String.Empty, // namespaceURI
  687. "<>&'\"" // value
  688. );
  689. AssertEndDocument (xmlReader);
  690. }
  691. [Test]
  692. public void CharacterReferencesInAttribute ()
  693. {
  694. string xml = "<foo bar='&#70;&#x4F;&#x4f;'/>";
  695. RunTest (xml, new TestMethod (CharacterReferencesInAttribute));
  696. }
  697. public void CharacterReferencesInAttribute (XmlReader xmlReader)
  698. {
  699. AssertStartDocument (xmlReader);
  700. AssertNode (
  701. xmlReader, // xmlReader
  702. XmlNodeType.Element, // nodeType
  703. 0, //depth
  704. true, // isEmptyElement
  705. "foo", // name
  706. String.Empty, // prefix
  707. "foo", // localName
  708. String.Empty, // namespaceURI
  709. String.Empty, // value
  710. 1 // attributeCount
  711. );
  712. AssertAttribute (
  713. xmlReader, // xmlReader
  714. "bar", // name
  715. String.Empty, // prefix
  716. "bar", // localName
  717. String.Empty, // namespaceURI
  718. "FOO" // value
  719. );
  720. AssertEndDocument (xmlReader);
  721. }
  722. [Test]
  723. public void CDATA ()
  724. {
  725. string xml = "<foo><![CDATA[<>&]]></foo>";
  726. RunTest (xml, new TestMethod (CDATA));
  727. }
  728. public void CDATA (XmlReader xmlReader)
  729. {
  730. AssertStartDocument (xmlReader);
  731. AssertNode (
  732. xmlReader, // xmlReader
  733. XmlNodeType.Element, // nodeType
  734. 0, //depth
  735. false, // isEmptyElement
  736. "foo", // name
  737. String.Empty, // prefix
  738. "foo", // localName
  739. String.Empty, // namespaceURI
  740. String.Empty, // value
  741. 0 // attributeCount
  742. );
  743. AssertNode (
  744. xmlReader, // xmlReader
  745. XmlNodeType.CDATA, // nodeType
  746. 1, //depth
  747. false, // isEmptyElement
  748. String.Empty, // name
  749. String.Empty, // prefix
  750. String.Empty, // localName
  751. String.Empty, // namespaceURI
  752. "<>&", // value
  753. 0 // attributeCount
  754. );
  755. AssertNode (
  756. xmlReader, // xmlReader
  757. XmlNodeType.EndElement, // nodeType
  758. 0, //depth
  759. false, // isEmptyElement
  760. "foo", // name
  761. String.Empty, // prefix
  762. "foo", // localName
  763. String.Empty, // namespaceURI
  764. String.Empty, // value
  765. 0 // attributeCount
  766. );
  767. AssertEndDocument (xmlReader);
  768. }
  769. [Test]
  770. public void EmptyElementInDefaultNamespace ()
  771. {
  772. string xml = @"<foo xmlns='http://foo/' />";
  773. RunTest (xml, new TestMethod (EmptyElementInDefaultNamespace));
  774. }
  775. public void EmptyElementInDefaultNamespace (XmlReader xmlReader)
  776. {
  777. AssertStartDocument (xmlReader);
  778. AssertNode (
  779. xmlReader, // xmlReader
  780. XmlNodeType.Element, // nodeType
  781. 0, // depth
  782. true, // isEmptyElement
  783. "foo", // name
  784. String.Empty, // prefix
  785. "foo", // localName
  786. "http://foo/", // namespaceURI
  787. String.Empty, // value
  788. 1 // attributeCount
  789. );
  790. AssertAttribute (
  791. xmlReader, // xmlReader
  792. "xmlns", // name
  793. String.Empty, // prefix
  794. "xmlns", // localName
  795. "http://www.w3.org/2000/xmlns/", // namespaceURI
  796. "http://foo/" // value
  797. );
  798. Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace (String.Empty));
  799. AssertEndDocument (xmlReader);
  800. }
  801. [Test]
  802. public void ChildElementInNamespace ()
  803. {
  804. string xml = @"<foo:bar xmlns:foo='http://foo/'><baz:quux xmlns:baz='http://baz/' /></foo:bar>";
  805. RunTest (xml, new TestMethod (ChildElementInNamespace));
  806. }
  807. public void ChildElementInNamespace (XmlReader xmlReader)
  808. {
  809. AssertStartDocument (xmlReader);
  810. AssertNode (
  811. xmlReader, // xmlReader
  812. XmlNodeType.Element, // nodeType
  813. 0, // depth
  814. false, // isEmptyElement
  815. "foo:bar", // name
  816. "foo", // prefix
  817. "bar", // localName
  818. "http://foo/", // namespaceURI
  819. String.Empty, // value
  820. 1 // attributeCount
  821. );
  822. AssertAttribute (
  823. xmlReader, // xmlReader
  824. "xmlns:foo", // name
  825. "xmlns", // prefix
  826. "foo", // localName
  827. "http://www.w3.org/2000/xmlns/", // namespaceURI
  828. "http://foo/" // value
  829. );
  830. Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo"));
  831. AssertNode (
  832. xmlReader, // xmlReader
  833. XmlNodeType.Element, // nodeType
  834. 1, // depth
  835. true, // isEmptyElement
  836. "baz:quux", // name
  837. "baz", // prefix
  838. "quux", // localName
  839. "http://baz/", // namespaceURI
  840. String.Empty, // value
  841. 1 // attributeCount
  842. );
  843. AssertAttribute (
  844. xmlReader, // xmlReader
  845. "xmlns:baz", // name
  846. "xmlns", // prefix
  847. "baz", // localName
  848. "http://www.w3.org/2000/xmlns/", // namespaceURI
  849. "http://baz/" // value
  850. );
  851. Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo"));
  852. Assert.AreEqual ("http://baz/", xmlReader.LookupNamespace ("baz"));
  853. AssertNode (
  854. xmlReader, // xmlReader
  855. XmlNodeType.EndElement, // nodeType
  856. 0, // depth
  857. false, // isEmptyElement
  858. "foo:bar", // name
  859. "foo", // prefix
  860. "bar", // localName
  861. "http://foo/", // namespaceURI
  862. String.Empty, // value
  863. 0 // attributeCount
  864. );
  865. Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo"));
  866. Assert.IsNull (xmlReader.LookupNamespace ("baz"));
  867. AssertEndDocument (xmlReader);
  868. }
  869. [Test]
  870. public void ChildElementInDefaultNamespace ()
  871. {
  872. string xml = @"<foo:bar xmlns:foo='http://foo/'><baz xmlns='http://baz/' /></foo:bar>";
  873. RunTest (xml, new TestMethod (ChildElementInDefaultNamespace));
  874. }
  875. public void ChildElementInDefaultNamespace (XmlReader xmlReader)
  876. {
  877. AssertStartDocument (xmlReader);
  878. AssertNode (
  879. xmlReader, // xmlReader
  880. XmlNodeType.Element, // nodeType
  881. 0, // depth
  882. false, // isEmptyElement
  883. "foo:bar", // name
  884. "foo", // prefix
  885. "bar", // localName
  886. "http://foo/", // namespaceURI
  887. String.Empty, // value
  888. 1 // attributeCount
  889. );
  890. AssertAttribute (
  891. xmlReader, // xmlReader
  892. "xmlns:foo", // name
  893. "xmlns", // prefix
  894. "foo", // localName
  895. "http://www.w3.org/2000/xmlns/", // namespaceURI
  896. "http://foo/" // value
  897. );
  898. Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo"));
  899. AssertNode (
  900. xmlReader, // xmlReader
  901. XmlNodeType.Element, // nodeType
  902. 1, // depth
  903. true, // isEmptyElement
  904. "baz", // name
  905. String.Empty, // prefix
  906. "baz", // localName
  907. "http://baz/", // namespaceURI
  908. String.Empty, // value
  909. 1 // attributeCount
  910. );
  911. AssertAttribute (
  912. xmlReader, // xmlReader
  913. "xmlns", // name
  914. String.Empty, // prefix
  915. "xmlns", // localName
  916. "http://www.w3.org/2000/xmlns/", // namespaceURI
  917. "http://baz/" // value
  918. );
  919. Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo"));
  920. Assert.AreEqual ("http://baz/", xmlReader.LookupNamespace (String.Empty));
  921. AssertNode (
  922. xmlReader, // xmlReader
  923. XmlNodeType.EndElement, // nodeType
  924. 0, // depth
  925. false, // isEmptyElement
  926. "foo:bar", // name
  927. "foo", // prefix
  928. "bar", // localName
  929. "http://foo/", // namespaceURI
  930. String.Empty, // value
  931. 0 // attributeCount
  932. );
  933. Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo"));
  934. AssertEndDocument (xmlReader);
  935. }
  936. [Test]
  937. public void AttributeInNamespace ()
  938. {
  939. string xml = @"<foo bar:baz='quux' xmlns:bar='http://bar/' />";
  940. RunTest (xml, new TestMethod (AttributeInNamespace));
  941. }
  942. public void AttributeInNamespace (XmlReader xmlReader)
  943. {
  944. AssertStartDocument (xmlReader);
  945. AssertNode (
  946. xmlReader, // xmlReader
  947. XmlNodeType.Element, // nodeType
  948. 0, // depth
  949. true, // isEmptyElement
  950. "foo", // name
  951. String.Empty, // prefix
  952. "foo", // localName
  953. String.Empty, // namespaceURI
  954. String.Empty, // value
  955. 2 // attributeCount
  956. );
  957. AssertAttribute (
  958. xmlReader, // xmlReader
  959. "bar:baz", // name
  960. "bar", // prefix
  961. "baz", // localName
  962. "http://bar/", // namespaceURI
  963. "quux" // value
  964. );
  965. AssertAttribute (
  966. xmlReader, // xmlReader
  967. "xmlns:bar", // name
  968. "xmlns", // prefix
  969. "bar", // localName
  970. "http://www.w3.org/2000/xmlns/", // namespaceURI
  971. "http://bar/" // value
  972. );
  973. Assert.AreEqual ("http://bar/", xmlReader.LookupNamespace ("bar"));
  974. AssertEndDocument (xmlReader);
  975. }
  976. [Test]
  977. public void MoveToElementFromAttribute ()
  978. {
  979. string xml = @"<foo bar=""baz"" />";
  980. RunTest (xml, new TestMethod (MoveToElementFromAttribute));
  981. }
  982. public void MoveToElementFromAttribute (XmlReader xmlReader)
  983. {
  984. Assert.IsTrue (xmlReader.Read ());
  985. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  986. Assert.IsTrue (xmlReader.MoveToFirstAttribute ());
  987. Assert.AreEqual (XmlNodeType.Attribute, xmlReader.NodeType);
  988. Assert.IsTrue (xmlReader.MoveToElement ());
  989. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  990. }
  991. [Test]
  992. public void MoveToElementFromElement ()
  993. {
  994. string xml = @"<foo bar=""baz"" />";
  995. RunTest (xml, new TestMethod (MoveToElementFromElement));
  996. }
  997. public void MoveToElementFromElement (XmlReader xmlReader)
  998. {
  999. Assert.IsTrue (xmlReader.Read ());
  1000. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1001. Assert.IsTrue (!xmlReader.MoveToElement ());
  1002. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1003. }
  1004. [Test]
  1005. public void MoveToFirstAttributeWithNoAttributes ()
  1006. {
  1007. string xml = @"<foo />";
  1008. RunTest (xml, new TestMethod (MoveToFirstAttributeWithNoAttributes));
  1009. }
  1010. public void MoveToFirstAttributeWithNoAttributes (XmlReader xmlReader)
  1011. {
  1012. Assert.IsTrue (xmlReader.Read ());
  1013. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1014. Assert.IsTrue (!xmlReader.MoveToFirstAttribute ());
  1015. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1016. }
  1017. [Test]
  1018. public void MoveToNextAttributeWithNoAttributes ()
  1019. {
  1020. string xml = @"<foo />";
  1021. RunTest (xml, new TestMethod (MoveToNextAttributeWithNoAttributes));
  1022. }
  1023. public void MoveToNextAttributeWithNoAttributes (XmlReader xmlReader)
  1024. {
  1025. Assert.IsTrue (xmlReader.Read ());
  1026. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1027. Assert.IsTrue (!xmlReader.MoveToNextAttribute ());
  1028. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1029. }
  1030. [Test]
  1031. public void MoveToNextAttribute()
  1032. {
  1033. string xml = @"<foo bar=""baz"" quux='quuux'/>";
  1034. RunTest (xml, new TestMethod (MoveToNextAttribute));
  1035. }
  1036. public void MoveToNextAttribute (XmlReader xmlReader)
  1037. {
  1038. AssertStartDocument (xmlReader);
  1039. AssertNode (
  1040. xmlReader, // xmlReader
  1041. XmlNodeType.Element, // nodeType
  1042. 0, //depth
  1043. true, // isEmptyElement
  1044. "foo", // name
  1045. String.Empty, // prefix
  1046. "foo", // localName
  1047. String.Empty, // namespaceURI
  1048. String.Empty, // value
  1049. 2 // attributeCount
  1050. );
  1051. AssertAttribute (
  1052. xmlReader, // xmlReader
  1053. "bar", // name
  1054. String.Empty, // prefix
  1055. "bar", // localName
  1056. String.Empty, // namespaceURI
  1057. "baz" // value
  1058. );
  1059. AssertAttribute (
  1060. xmlReader, // xmlReader
  1061. "quux", // name
  1062. String.Empty, // prefix
  1063. "quux", // localName
  1064. String.Empty, // namespaceURI
  1065. "quuux" // value
  1066. );
  1067. Assert.IsTrue (xmlReader.MoveToNextAttribute ());
  1068. Assert.AreEqual ("bar", xmlReader.Name);
  1069. Assert.AreEqual ("baz", xmlReader.Value);
  1070. Assert.IsTrue (xmlReader.MoveToNextAttribute ());
  1071. Assert.AreEqual ("quux", xmlReader.Name);
  1072. Assert.AreEqual ("quuux", xmlReader.Value);
  1073. Assert.IsTrue (!xmlReader.MoveToNextAttribute ());
  1074. Assert.IsTrue (xmlReader.MoveToElement ());
  1075. AssertNodeValues (
  1076. "#1",
  1077. xmlReader, // xmlReader
  1078. XmlNodeType.Element, // nodeType
  1079. 0, //depth
  1080. true, // isEmptyElement
  1081. "foo", // name
  1082. String.Empty, // prefix
  1083. "foo", // localName
  1084. String.Empty, // namespaceURI
  1085. String.Empty, // value
  1086. 2 // attributeCount
  1087. );
  1088. AssertEndDocument (xmlReader);
  1089. }
  1090. [Test]
  1091. // [Category ("NotDotNet")] // MS XmlNodeReader never moves to xml declaration.
  1092. [Ignore ("Too inconsistent reference implementations to determine which is correct behavior.")]
  1093. public void MoveToXmlDeclAttributes ()
  1094. {
  1095. string xml = "<?xml version=\"1.0\" standalone=\"yes\"?><root/>";
  1096. RunTest (xml, new TestMethod (MoveToXmlDeclAttributes));
  1097. }
  1098. public void MoveToXmlDeclAttributes (XmlReader xmlReader)
  1099. {
  1100. xmlReader.Read ();
  1101. this.AssertNodeValues ("#1", xmlReader,
  1102. XmlNodeType.XmlDeclaration,
  1103. 0,
  1104. false,
  1105. "xml",
  1106. String.Empty,
  1107. "xml",
  1108. String.Empty,
  1109. "version=\"1.0\" standalone=\"yes\"",
  1110. 2);
  1111. Assert.IsTrue (xmlReader.MoveToFirstAttribute (), "MoveToFirstAttribute");
  1112. this.AssertNodeValues ("#2", xmlReader,
  1113. XmlNodeType.Attribute,
  1114. 0, // FIXME: might be 1
  1115. false,
  1116. "version",
  1117. String.Empty,
  1118. "version",
  1119. String.Empty,
  1120. "1.0",
  1121. 2);
  1122. xmlReader.ReadAttributeValue ();
  1123. this.AssertNodeValues ("#3", xmlReader,
  1124. XmlNodeType.Text,
  1125. 1, // FIXME might be 2
  1126. false,
  1127. String.Empty,
  1128. null, // FIXME: should be String.Empty,
  1129. String.Empty,
  1130. null, // FIXME: should be String.Empty,
  1131. "1.0",
  1132. 2);
  1133. xmlReader.MoveToNextAttribute ();
  1134. this.AssertNodeValues ("#4", xmlReader,
  1135. XmlNodeType.Attribute,
  1136. 0, // FIXME: might be 1
  1137. false,
  1138. "standalone",
  1139. String.Empty,
  1140. "standalone",
  1141. String.Empty,
  1142. "yes",
  1143. 2);
  1144. xmlReader.ReadAttributeValue ();
  1145. this.AssertNodeValues ("#5", xmlReader,
  1146. XmlNodeType.Text,
  1147. 1, // FIXME: might be 2
  1148. false,
  1149. String.Empty,
  1150. null, // FIXME: should be String.Empty,
  1151. String.Empty,
  1152. null, // FIXME: should be String.Empty,
  1153. "yes",
  1154. 2);
  1155. }
  1156. [Test]
  1157. public void AttributeOrder ()
  1158. {
  1159. string xml = @"<foo _1='1' _2='2' _3='3' />";
  1160. RunTest (xml, new TestMethod (AttributeOrder));
  1161. }
  1162. public void AttributeOrder (XmlReader xmlReader)
  1163. {
  1164. Assert.IsTrue (xmlReader.Read ());
  1165. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1166. Assert.IsTrue (xmlReader.MoveToFirstAttribute ());
  1167. Assert.AreEqual ("_1", xmlReader.Name);
  1168. Assert.IsTrue (xmlReader.MoveToNextAttribute ());
  1169. Assert.AreEqual ("_2", xmlReader.Name);
  1170. Assert.IsTrue (xmlReader.MoveToNextAttribute ());
  1171. Assert.AreEqual ("_3", xmlReader.Name);
  1172. Assert.IsTrue (!xmlReader.MoveToNextAttribute ());
  1173. }
  1174. [Test]
  1175. [Category ("NotDotNet")]
  1176. public void IndexerAndAttributes ()
  1177. {
  1178. string xml = @"<?xml version='1.0' standalone='no'?><foo _1='1' _2='2' _3='3' />";
  1179. RunTest (xml, new TestMethod (IndexerAndAttributes));
  1180. }
  1181. public void IndexerAndAttributes (XmlReader xmlReader)
  1182. {
  1183. Assert.IsTrue (xmlReader.Read ());
  1184. Assert.AreEqual ("1.0", xmlReader ["version"]);
  1185. Assert.AreEqual ("1.0", xmlReader.GetAttribute ("version"));
  1186. // .NET 1.1 BUG. XmlTextReader returns null, while XmlNodeReader returns "".
  1187. Assert.AreEqual (null, xmlReader ["encoding"]);
  1188. Assert.AreEqual (null, xmlReader.GetAttribute ("encoding"));
  1189. Assert.AreEqual ("no", xmlReader ["standalone"]);
  1190. Assert.AreEqual ("no", xmlReader.GetAttribute ("standalone"));
  1191. Assert.AreEqual ("1.0", xmlReader [0]);
  1192. Assert.AreEqual ("1.0", xmlReader.GetAttribute (0));
  1193. Assert.AreEqual ("no", xmlReader [1]);
  1194. Assert.AreEqual ("no", xmlReader.GetAttribute (1));
  1195. Assert.IsTrue (xmlReader.Read ());
  1196. Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType);
  1197. Assert.AreEqual ("1", xmlReader ["_1"]);
  1198. Assert.IsTrue (xmlReader.MoveToFirstAttribute ());
  1199. Assert.AreEqual ("_1", xmlReader.Name);
  1200. Assert.AreEqual ("1", xmlReader ["_1"]);
  1201. Assert.IsTrue (xmlReader.MoveToNextAttribute ());
  1202. Assert.AreEqual ("_2", xmlReader.Name);
  1203. Assert.AreEqual ("1", xmlReader ["_1"]);
  1204. Assert.IsTrue (xmlReader.MoveToNextAttribute ());
  1205. Assert.AreEqual ("_3", xmlReader.Name);
  1206. Assert.AreEqual ("1", xmlReader ["_1"]);
  1207. Assert.IsTrue (!xmlReader.MoveToNextAttribute ());
  1208. }
  1209. [Test]
  1210. public void ProhibitedMultipleAttributes ()
  1211. {
  1212. string xml = @"<foo _1='1' _1='1' />";
  1213. try {
  1214. RunTest (xml, new TestMethod (ReadAll));
  1215. } catch (XmlException) {
  1216. }
  1217. xml = @"<foo _1='1' _1='2' />";
  1218. try {
  1219. RunTest (xml, new TestMethod (ReadAll));
  1220. } catch (XmlException) {
  1221. }
  1222. }
  1223. public void ReadAll (XmlReader xmlReader)
  1224. {
  1225. while (!xmlReader.EOF)
  1226. xmlReader.Read ();
  1227. }
  1228. [Test]
  1229. public void SurrogatePairContent ()
  1230. {
  1231. string xml = "<root xmlns='&#x10100;'/>";
  1232. RunTest (xml, new TestMethod (SurrogatePairContent));
  1233. }
  1234. public void SurrogatePairContent (XmlReader xmlReader)
  1235. {
  1236. xmlReader.Read ();
  1237. Assert.AreEqual (true, xmlReader.MoveToAttribute ("xmlns"));
  1238. Assert.AreEqual ("xmlns", xmlReader.Name);
  1239. Assert.AreEqual (2, xmlReader.Value.Length);
  1240. Assert.AreEqual (0xD800, (int) xmlReader.Value [0]);
  1241. Assert.AreEqual (0xDD00, (int) xmlReader.Value [1]);
  1242. }
  1243. [Test]
  1244. public void ReadOuterXmlOnEndElement ()
  1245. {
  1246. string xml = "<root><foo></foo></root>";
  1247. RunTest (xml, new TestMethod (ReadOuterXmlOnEndElement));
  1248. }
  1249. public void ReadOuterXmlOnEndElement (XmlReader xmlReader)
  1250. {
  1251. xmlReader.Read ();
  1252. xmlReader.Read ();
  1253. xmlReader.Read ();
  1254. Assert.AreEqual (String.Empty, xmlReader.ReadOuterXml ());
  1255. }
  1256. [Test]
  1257. public void ReadInnerXmlOnEndElement ()
  1258. {
  1259. string xml = "<root><foo></foo></root>";
  1260. RunTest (xml, new TestMethod (ReadInnerXmlOnEndElement));
  1261. }
  1262. private void ReadInnerXmlOnEndElement (XmlReader xmlReader)
  1263. {
  1264. xmlReader.Read ();
  1265. xmlReader.Read ();
  1266. xmlReader.Read ();
  1267. Assert.AreEqual (String.Empty, xmlReader.ReadInnerXml ());
  1268. }
  1269. [Test]
  1270. public void LookupEmptyPrefix ()
  1271. {
  1272. string xml = "<root><foo></foo></root>";
  1273. RunTest (xml, new TestMethod (LookupEmptyPrefix));
  1274. }
  1275. void LookupEmptyPrefix (XmlReader xmlReader)
  1276. {
  1277. xmlReader.Read ();
  1278. Assert.IsNull (xmlReader.LookupNamespace (String.Empty));
  1279. }
  1280. [Test]
  1281. public void ReadStartElement ()
  1282. {
  1283. string xml = "<root>test</root>";
  1284. RunTest (xml, new TestMethod (ReadStartElement));
  1285. }
  1286. void ReadStartElement (XmlReader xr)
  1287. {
  1288. xr.Read ();
  1289. xr.ReadStartElement ();
  1290. // consume Element node.
  1291. Assert.AreEqual (XmlNodeType.Text, xr.NodeType);
  1292. }
  1293. [Test]
  1294. public void LookupNamespaceAtEndElement ()
  1295. {
  1296. string xml = "<root xmlns:x='urn:foo'><foo/></root>";
  1297. RunTest (xml, new TestMethod (LookupNamespaceAtEndElement));
  1298. }
  1299. void LookupNamespaceAtEndElement (XmlReader reader)
  1300. {
  1301. reader.Read ();
  1302. Assert.AreEqual ("urn:foo", reader.LookupNamespace ("x"), "#1");
  1303. reader.Read ();
  1304. Assert.AreEqual ("urn:foo", reader.LookupNamespace ("x"), "#2");
  1305. reader.Read ();
  1306. Assert.AreEqual ("urn:foo", reader.LookupNamespace ("x"), "#3");
  1307. }
  1308. [Test]
  1309. public void ReadClosedReader ()
  1310. {
  1311. string xml = "<fin>aaa</fin>";
  1312. RunTest (xml, new TestMethod (ReadClosedReader));
  1313. }
  1314. void ReadClosedReader (XmlReader reader)
  1315. {
  1316. reader.Read ();
  1317. reader.Close();
  1318. reader.Read (); // silently returns false
  1319. }
  1320. #if NET_2_0
  1321. [Test]
  1322. public void CreateSimple ()
  1323. {
  1324. XmlReaderSettings s = new XmlReaderSettings ();
  1325. s.ProhibitDtd = false;
  1326. XmlReader xr = XmlReader.Create ("Test/XmlFiles/nested-dtd-test.xml", s);
  1327. xr.Read ();
  1328. Assert.AreEqual (XmlNodeType.DocumentType, xr.NodeType, "#1");
  1329. xr.Read ();
  1330. Assert.AreEqual (XmlNodeType.Whitespace, xr.NodeType, "#2");
  1331. xr.Read ();
  1332. Assert.AreEqual (XmlNodeType.Element, xr.NodeType, "#3");
  1333. }
  1334. [Test]
  1335. [ExpectedException (typeof (XmlException))]
  1336. public void CreateSimpleProhibitDtd ()
  1337. {
  1338. XmlReader xr = XmlReader.Create ("Test/XmlFiles/nested-dtd-test.xml");
  1339. xr.Read ();
  1340. }
  1341. [Test]
  1342. // a bit revised version of bug #78706
  1343. public void CreateFromUrlClose ()
  1344. {
  1345. string file = "Test/XmlFiles/78706.xml";
  1346. try {
  1347. if (!File.Exists (file))
  1348. File.Create (file).Close ();
  1349. XmlReaderSettings s = new XmlReaderSettings ();
  1350. s.CloseInput = false; // explicitly
  1351. XmlReader r = XmlReader.Create (file, s);
  1352. r.Close ();
  1353. XmlTextWriter w = new XmlTextWriter (file, null);
  1354. w.Close ();
  1355. } finally {
  1356. if (File.Exists (file))
  1357. File.Delete (file);
  1358. }
  1359. }
  1360. [Test]
  1361. // a bit revised version of bug #385638
  1362. public void CreateFromUrlClose2 ()
  1363. {
  1364. string file = "Test/XmlFiles/385638.xml";
  1365. try {
  1366. if (File.Exists (file))
  1367. File.Delete (file);
  1368. using (TextWriter tw = File.CreateText (file))
  1369. tw.Write ("<xml />");
  1370. XmlReaderSettings s = new XmlReaderSettings ();
  1371. s.IgnoreWhitespace = true; // this results in XmlFilterReader, which is the key for this bug.
  1372. XmlReader r = XmlReader.Create (file, s);
  1373. r.Close ();
  1374. XmlTextWriter w = new XmlTextWriter (file, null);
  1375. w.Close ();
  1376. } finally {
  1377. if (File.Exists (file))
  1378. File.Delete (file);
  1379. }
  1380. }
  1381. [Test]
  1382. [ExpectedException (typeof (ArgumentException))]
  1383. public void Create_String_Empty ()
  1384. {
  1385. XmlReader.Create (String.Empty);
  1386. }
  1387. [Test]
  1388. public void ReadToDescendant ()
  1389. {
  1390. string xml = @"<root><foo/><bar/><foo> test text <bar><bar></bar></bar></foo></root>";
  1391. RunTest (xml, new TestMethod (ReadToDescendant));
  1392. }
  1393. void ReadToDescendant (XmlReader xmlReader)
  1394. {
  1395. // move to first <bar/>
  1396. Assert.IsTrue (xmlReader.ReadToDescendant ("bar"), "#1");
  1397. // no children in <bar/>. It is empty.
  1398. Assert.IsTrue (!xmlReader.ReadToDescendant ("bar"), "#2");
  1399. Assert.AreEqual ("bar", xmlReader.Name, "#2-2");
  1400. // move to the second <foo>
  1401. xmlReader.Read ();
  1402. // move to the second <bar>
  1403. Assert.IsTrue (xmlReader.ReadToDescendant ("bar"), "#3");
  1404. // move to <bar> inside <bar>...</bar>
  1405. Assert.IsTrue (xmlReader.ReadToDescendant ("bar"), "#4");
  1406. // the next is EndElement of </bar>, so no move.
  1407. Assert.IsTrue (!xmlReader.ReadToDescendant ("bar"), "#5");
  1408. Assert.AreEqual (XmlNodeType.EndElement, xmlReader.NodeType, "#5-2");
  1409. }
  1410. [Test]
  1411. public void ReadToDescepdant2 ()
  1412. {
  1413. string xml = "<root/>";
  1414. RunTest (xml, new TestMethod (ReadToDescendant2));
  1415. }
  1416. void ReadToDescendant2 (XmlReader xmlReader)
  1417. {
  1418. // make sure that it works when the reader is at Initial state.
  1419. Assert.IsTrue (xmlReader.ReadToDescendant ("root"));
  1420. }
  1421. [Test]
  1422. public void ReadToFollowing ()
  1423. {
  1424. string xml = @"<root><foo/><bar/><foo><bar><bar></bar></bar></foo></root>";
  1425. RunTest (xml, new TestMethod (ReadToFollowing));
  1426. }
  1427. public void ReadToFollowing (XmlReader xmlReader)
  1428. {
  1429. Assert.IsTrue (xmlReader.ReadToFollowing ("bar"), "#1");
  1430. Assert.IsTrue (xmlReader.ReadToFollowing ("bar"), "#2");
  1431. Assert.AreEqual (2, xmlReader.Depth, "#2-2");
  1432. Assert.IsTrue (xmlReader.ReadToFollowing ("bar"), "#3");
  1433. Assert.AreEqual (3, xmlReader.Depth, "#3-2");
  1434. Assert.IsTrue (!xmlReader.ReadToFollowing ("bar"), "#4");
  1435. }
  1436. [Test]
  1437. [Category ("NotDotNet")]
  1438. public void ReadToNextSiblingAtInitialState ()
  1439. {
  1440. string xml = @"<root></root>";
  1441. RunTest (xml, new TestMethod (ReadToNextSiblingAtInitialState ));
  1442. }
  1443. void ReadToNextSiblingAtInitialState (XmlReader xmlReader)
  1444. {
  1445. Assert.IsTrue (!xmlReader.ReadToNextSibling ("bar"), "#1");
  1446. Assert.IsTrue (!xmlReader.ReadToNextSibling ("root"), "#2");
  1447. }
  1448. [Test]
  1449. public void ReadToNextSibling ()
  1450. {
  1451. string xml = @"<root><foo/><bar attr='value'/><foo><pooh/><bar></bar><foo></foo><bar/></foo></root>";
  1452. RunTest (xml, new TestMethod (ReadToNextSibling));
  1453. }
  1454. void ReadToNextSibling (XmlReader xmlReader)
  1455. {
  1456. // It is funky, but without it MS.NET results in an infinite loop.
  1457. xmlReader.Read (); // root
  1458. xmlReader.Read (); // foo
  1459. Assert.IsTrue (xmlReader.ReadToNextSibling ("bar"), "#3");
  1460. Assert.AreEqual ("value", xmlReader.GetAttribute ("attr"), "#3-2");
  1461. xmlReader.Read (); // foo
  1462. xmlReader.Read (); // pooh
  1463. Assert.IsTrue (xmlReader.ReadToNextSibling ("bar"), "#4");
  1464. Assert.IsTrue (!xmlReader.IsEmptyElement, "#4-2");
  1465. Assert.IsTrue (xmlReader.ReadToNextSibling ("bar"), "#5");
  1466. Assert.IsTrue (xmlReader.IsEmptyElement, "#5-2");
  1467. Assert.IsTrue (xmlReader.Read (), "#6"); // /foo
  1468. AssertNodeValues ("#7", xmlReader,
  1469. XmlNodeType.EndElement,
  1470. 1, // Depth
  1471. false, // IsEmptyElement
  1472. "foo", // Name
  1473. String.Empty, // Prefix
  1474. "foo", // LocalName
  1475. String.Empty, // NamespaceURI
  1476. String.Empty, // Value
  1477. false, // HasValue
  1478. 0, // AttributeCount
  1479. false); // HasAttributes
  1480. }
  1481. // bug #81451
  1482. [Test]
  1483. public void ReadToNextSibling2 ()
  1484. {
  1485. string xml = @"<root><baz><bar><foo attr='value'/></bar><foo attr='value2'><bar><foo /></bar></foo></baz></root>";
  1486. RunTest (xml, new TestMethod (ReadToNextSibling2));
  1487. }
  1488. void ReadToNextSibling2 (XmlReader r)
  1489. {
  1490. r.MoveToContent (); // ->root
  1491. r.Read (); // root->baz
  1492. r.Read (); // baz->bar
  1493. Assert.IsTrue (r.ReadToNextSibling ("foo"), "#1");
  1494. Assert.AreEqual ("value2", r.GetAttribute ("attr"), "#2");
  1495. r.Read (); // foo[@value='value2']->bar
  1496. Assert.IsTrue (!r.ReadToNextSibling ("foo"), "#3");
  1497. Assert.AreEqual (XmlNodeType.EndElement, r.NodeType, "#4");
  1498. Assert.AreEqual ("foo", r.LocalName, "#5");
  1499. }
  1500. // bug #347768
  1501. [Test]
  1502. public void ReadToNextSibling3 ()
  1503. {
  1504. string xml = @" <books> <book> <name>Happy C Sharp</name> </book> </books>";
  1505. XmlReader reader = XmlReader.Create (new StringReader (xml));
  1506. reader.MoveToContent ();
  1507. while (reader.Read ())
  1508. reader.ReadToNextSibling ("book"); // should not result in an infinite loop
  1509. }
  1510. // bug #676020
  1511. [Test]
  1512. public void ReadToNextSibling4 ()
  1513. {
  1514. string xml = @"<SerializableStringDictionary>
  1515. <SerializableStringDictionary>
  1516. <DictionaryEntry Key=""Key1"" Value=""Value1""/>
  1517. <DictionaryEntry Key=""Key2"" Value=""Value2""/>
  1518. <DictionaryEntry Key=""Key3"" Value=""Value3""/>
  1519. </SerializableStringDictionary>
  1520. </SerializableStringDictionary>";
  1521. var reader = XmlReader.Create (new StringReader (xml));
  1522. Assert.IsTrue (reader.ReadToDescendant ("SerializableStringDictionary"), "#1");
  1523. Assert.IsTrue (reader.ReadToDescendant ("DictionaryEntry"), "#2");
  1524. int count = 0;
  1525. do {
  1526. reader.MoveToAttribute ("Key");
  1527. var key = reader.ReadContentAsString ();
  1528. reader.MoveToAttribute ("Value");
  1529. var value = reader.ReadContentAsString ();
  1530. count++;
  1531. }
  1532. while (reader.ReadToNextSibling ("DictionaryEntry"));
  1533. Assert.AreEqual (3, count, "#3");
  1534. }
  1535. [Test]
  1536. public void ReadSubtree ()
  1537. {
  1538. string xml = @"<root><foo/><bar attr='value'></bar></root>";
  1539. RunTest (xml, new TestMethod (ReadSubtree));
  1540. }
  1541. void ReadSubtree (XmlReader reader)
  1542. {
  1543. reader.MoveToContent (); // root
  1544. reader.Read (); // foo
  1545. XmlReader st = reader.ReadSubtree (); // <foo/>
  1546. // MS bug: IsEmptyElement should be false here.
  1547. /*
  1548. AssertNodeValues ("#1", st,
  1549. XmlNodeType.None,
  1550. 0, // Depth
  1551. false, // IsEmptyElement
  1552. String.Empty, // Name
  1553. String.Empty, // Prefix
  1554. String.Empty, // LocalName
  1555. String.Empty, // NamespaceURI
  1556. String.Empty, // Value
  1557. false, // HasValue
  1558. 0, // AttributeCount
  1559. false); // HasAttributes
  1560. */
  1561. Assert.AreEqual (XmlNodeType.None, st.NodeType, "#1");
  1562. st.Read ();
  1563. AssertNodeValues ("#2", st,
  1564. XmlNodeType.Element,
  1565. 0,
  1566. true, // IsEmptyElement
  1567. "foo", // Name
  1568. String.Empty, // Prefix
  1569. "foo", // LocalName
  1570. String.Empty, // NamespaceURI
  1571. String.Empty, // Value
  1572. false, // HasValue
  1573. 0, // AttributeCount
  1574. false); // HasAttributes
  1575. Assert.IsTrue (!st.Read (), "#3");
  1576. // At this state, reader is not positioned on <bar> yet
  1577. AssertNodeValues ("#3-2", reader,
  1578. XmlNodeType.Element,
  1579. 1, // Depth. It is 1 for main tree.
  1580. true, // IsEmptyElement
  1581. "foo", // Name
  1582. String.Empty, // Prefix
  1583. "foo", // LocalName
  1584. String.Empty, // NamespaceURI
  1585. String.Empty, // Value
  1586. false, // HasValue
  1587. 0, // AttributeCount
  1588. false); // HasAttributes
  1589. reader.Read ();
  1590. AssertNodeValues ("#4", reader,
  1591. XmlNodeType.Element,
  1592. 1, // Depth. It is 1 for main tree.
  1593. false, // IsEmptyElement
  1594. "bar", // Name
  1595. String.Empty, // Prefix
  1596. "bar", // LocalName
  1597. String.Empty, // NamespaceURI
  1598. String.Empty, // Value
  1599. false, // HasValue
  1600. 1, // AttributeCount
  1601. true); // HasAttributes
  1602. st = reader.ReadSubtree ();
  1603. st.Read (); // Initial -> Interactive
  1604. AssertNodeValues ("#5", st,
  1605. XmlNodeType.Element,
  1606. 0, // Depth. It is 0 for subtree.
  1607. false, // IsEmptyElement
  1608. "bar", // Name
  1609. String.Empty, // Prefix
  1610. "bar", // LocalName
  1611. String.Empty, // NamespaceURI
  1612. String.Empty, // Value
  1613. false, // HasValue
  1614. 1, // AttributeCount
  1615. true); // HasAttributes
  1616. st.Read ();
  1617. AssertNodeValues ("#6-1", st,
  1618. XmlNodeType.EndElement,
  1619. 0, // Depth. It is 0 for subtree.
  1620. false, // IsEmptyElement
  1621. "bar", // Name
  1622. String.Empty, // Prefix
  1623. "bar", // LocalName
  1624. String.Empty, // NamespaceURI
  1625. String.Empty, // Value
  1626. false, // HasValue
  1627. 0, // AttributeCount
  1628. false); // HasAttributes
  1629. AssertNodeValues ("#6-2", st,
  1630. XmlNodeType.EndElement,
  1631. 0, // Depth. It is 0 for subtree.
  1632. false, // IsEmptyElement
  1633. "bar", // Name
  1634. String.Empty, // Prefix
  1635. "bar", // LocalName
  1636. String.Empty, // NamespaceURI
  1637. String.Empty, // Value
  1638. false, // HasValue
  1639. 0, // AttributeCount
  1640. false); // HasAttributes
  1641. Assert.IsTrue (!st.Read (), "#7");
  1642. }
  1643. [Test]
  1644. public void ReadInteger ()
  1645. {
  1646. string xml1 = "<root>1</root>";
  1647. XmlReader xr;
  1648. xr = XmlReader.Create (new StringReader (xml1));
  1649. xr.Read ();
  1650. Assert.AreEqual ("1", xr.ReadElementContentAsString (), "#1");
  1651. AssertNodeValues ("#1-2", xr,
  1652. XmlNodeType.None,
  1653. 0, // Depth. It is 0 for subtree.
  1654. false, // IsEmptyElement
  1655. String.Empty, // Name
  1656. String.Empty, // Prefix
  1657. String.Empty, // LocalName
  1658. String.Empty, // NamespaceURI
  1659. String.Empty, // Value
  1660. false, // HasValue
  1661. 0, // AttributeCount
  1662. false); // HasAttributes
  1663. xr = XmlReader.Create (new StringReader (xml1));
  1664. xr.Read ();
  1665. // this XmlReader has no schema, thus the value is untyped
  1666. Assert.AreEqual ("1", xr.ReadElementContentAsObject (), "#2");
  1667. xr = XmlReader.Create (new StringReader (xml1));
  1668. xr.Read ();
  1669. xr.Read ();
  1670. Assert.AreEqual ("1", xr.ReadContentAsString (), "#3");
  1671. xr = XmlReader.Create (new StringReader (xml1));
  1672. xr.Read ();
  1673. Assert.AreEqual (1, xr.ReadElementContentAsInt (), "#4");
  1674. xr = XmlReader.Create (new StringReader (xml1));
  1675. xr.Read ();
  1676. Assert.AreEqual (1, xr.ReadElementContentAs (typeof (int), null), "#5");
  1677. }
  1678. [Test]
  1679. [ExpectedException (typeof (XmlException))]
  1680. public void ReadContentAsIntFail ()
  1681. {
  1682. XmlReader xr = XmlReader.Create (
  1683. new StringReader ("<doc>1.0</doc>"));
  1684. xr.Read ();
  1685. xr.ReadElementContentAsInt ();
  1686. }
  1687. [Test]
  1688. public void ReadDateTime ()
  1689. {
  1690. DateTime time = new DateTime (2006, 1, 2, 3, 4, 56);
  1691. string xml1 = "<root>2006-01-02T03:04:56</root>";
  1692. XmlReader xr;
  1693. xr = XmlReader.Create (new StringReader (xml1));
  1694. xr.Read ();
  1695. // this XmlReader has no schema, thus the value is untyped
  1696. Assert.AreEqual ("2006-01-02T03:04:56", xr.ReadElementContentAsString (), "#1");
  1697. xr = XmlReader.Create (new StringReader (xml1));
  1698. xr.Read ();
  1699. xr.Read ();
  1700. Assert.AreEqual (time, xr.ReadContentAsDateTime (), "#2");
  1701. xr = XmlReader.Create (new StringReader (xml1));
  1702. xr.Read ();
  1703. Assert.AreEqual (time, xr.ReadElementContentAsDateTime (), "#3");
  1704. xr = XmlReader.Create (new StringReader (xml1));
  1705. xr.Read ();
  1706. Assert.AreEqual (time, xr.ReadElementContentAs (typeof (DateTime), null), "#4");
  1707. }
  1708. [Test]
  1709. [ExpectedException (typeof (XmlException))]
  1710. public void ReadContentAsDateTimeFail ()
  1711. {
  1712. XmlReader xr = XmlReader.Create (
  1713. new StringReader ("<doc>P1Y2M3D</doc>"));
  1714. xr.Read ();
  1715. xr.ReadElementContentAsDateTime ();
  1716. }
  1717. [Test]
  1718. public void ReadContentAs_QNameEmptyNSResolver ()
  1719. {
  1720. XmlReader xr = XmlReader.Create (
  1721. new StringReader ("<doc xmlns:x='urn:foo'>x:el</doc>"));
  1722. xr.Read ();
  1723. object o = xr.ReadElementContentAs (
  1724. typeof (XmlQualifiedName), null);
  1725. // without IXmlNamespaceResolver, it still resolves
  1726. // x:el as valid QName.
  1727. Assert.IsNotNull (o, "#1");
  1728. XmlQualifiedName q = o as XmlQualifiedName;
  1729. Assert.AreEqual (new XmlQualifiedName ("el", "urn:foo"), q, "#2 : " + o.GetType ());
  1730. }
  1731. [Test]
  1732. [ExpectedException (typeof (InvalidOperationException))]
  1733. public void ReadContentStringOnElementFail ()
  1734. {
  1735. XmlReader xr = XmlReader.Create (new StringReader ("<a>test</a>"));
  1736. xr.Read ();
  1737. xr.ReadContentAsString ();
  1738. }
  1739. [Test]
  1740. public void ReadContentStringOnEndElement ()
  1741. {
  1742. XmlReader xr = XmlReader.Create (new StringReader ("<a>test</a>"));
  1743. xr.Read ();
  1744. xr.Read ();
  1745. xr.Read ();
  1746. Assert.AreEqual (String.Empty, xr.ReadContentAsString ()); // does not fail, unlike at Element!
  1747. }
  1748. [Test]
  1749. public void ReadContentStringOnPI ()
  1750. {
  1751. XmlReader xr = XmlReader.Create (new StringReader ("<?pi ?><a>test</a>"));
  1752. xr.Read ();
  1753. Assert.AreEqual (String.Empty, xr.ReadContentAsString ());
  1754. }
  1755. [Test]
  1756. [ExpectedException (typeof (InvalidOperationException))] // unlike ReadContentAsString()
  1757. public void ReadElementContentStringOnPI ()
  1758. {
  1759. XmlReader xr = XmlReader.Create (new StringReader ("<?pi ?><a>test</a>"));
  1760. xr.Read ();
  1761. Assert.AreEqual (XmlNodeType.ProcessingInstruction, xr.NodeType);
  1762. xr.ReadElementContentAsString ();
  1763. }
  1764. [Test]
  1765. [ExpectedException (typeof (XmlException))]
  1766. public void ReadElementContentStringMixedContent ()
  1767. {
  1768. XmlReader xr = XmlReader.Create (
  1769. new StringReader ("<doc>123<child>456</child>789</doc>"));
  1770. xr.Read ();
  1771. // "child" is regarded as an invalid node.
  1772. string s = xr.ReadElementContentAsString ();
  1773. }
  1774. [Test]
  1775. public void ReadContentStringMixedContent ()
  1776. {
  1777. XmlReader xr = XmlReader.Create (
  1778. new StringReader ("<doc>123<child>456</child>789</doc>"));
  1779. xr.Read ();
  1780. xr.Read (); // from Text "123"
  1781. string s = xr.ReadContentAsString ();
  1782. Assert.AreEqual ("123", s, "#1");
  1783. Assert.AreEqual (XmlNodeType.Element, xr.NodeType, "#2");
  1784. }
  1785. [Test]
  1786. public void ReadElementContentAsString ()
  1787. {
  1788. XmlTextReader r = new XmlTextReader (
  1789. "<root/>", XmlNodeType.Document, null);
  1790. r.Read ();
  1791. Assert.AreEqual (String.Empty, r.ReadElementContentAsString (), "#1");
  1792. Assert.AreEqual (XmlNodeType.None, r.NodeType, "#2");
  1793. }
  1794. [Test]
  1795. public void ReadElementContentAs ()
  1796. {
  1797. // as System.Object
  1798. XmlTextReader r = new XmlTextReader (
  1799. "<root/>", XmlNodeType.Document, null);
  1800. r.Read ();
  1801. Assert.AreEqual (String.Empty, r.ReadElementContentAs (typeof (object), null), "#1");
  1802. Assert.AreEqual (XmlNodeType.None, r.NodeType, "#2");
  1803. // regardless of its value, the return value is string.
  1804. r = new XmlTextReader ("<root>1</root>", XmlNodeType.Document, null);
  1805. r.Read ();
  1806. Assert.AreEqual ("1", r.ReadElementContentAs (typeof (object), null), "#3");
  1807. Assert.AreEqual (XmlNodeType.None, r.NodeType, "#4");
  1808. }
  1809. [Test]
  1810. public void ReadContentStringOnAttribute ()
  1811. {
  1812. string xml = @"<root id='myId'><child /></root>";
  1813. RunTest (xml, new TestMethod (ReadContentStringOnAttribute));
  1814. }
  1815. void ReadContentStringOnAttribute (XmlReader reader)
  1816. {
  1817. reader.Read ();
  1818. Assert.IsTrue (reader.MoveToAttribute ("id"));
  1819. Assert.AreEqual ("myId", reader.ReadContentAsString ());
  1820. }
  1821. [Test]
  1822. public void ReadElementContentAsStringEmpty ()
  1823. {
  1824. string xml = "<root><sample/></root>";
  1825. RunTest (xml, new TestMethod (ReadElementContentAsStringEmpty));
  1826. }
  1827. void ReadElementContentAsStringEmpty (XmlReader reader)
  1828. {
  1829. reader.MoveToContent ();
  1830. reader.Read ();
  1831. Assert.AreEqual (String.Empty, reader.ReadElementContentAsString ("sample", ""));
  1832. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType);
  1833. }
  1834. [Test]
  1835. public void ReadSubtreeClose ()
  1836. {
  1837. // bug #334752
  1838. string xml = @"<root><item-list><item id='a'/><item id='b'/></item-list></root>";
  1839. RunTest (xml, new TestMethod (ReadSubtreeClose));
  1840. }
  1841. void ReadSubtreeClose (XmlReader reader)
  1842. {
  1843. reader.ReadToFollowing ("item-list");
  1844. XmlReader sub = reader.ReadSubtree ();
  1845. sub.ReadToDescendant ("item");
  1846. sub.Close ();
  1847. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#1");
  1848. Assert.AreEqual ("item-list", reader.Name, "#2");
  1849. }
  1850. [Test]
  1851. [ExpectedException (typeof (InvalidOperationException))]
  1852. public void ReadSubtreeOnNonElement ()
  1853. {
  1854. string xml = @"<x> <y/></x>";
  1855. XmlReader r = XmlReader.Create (new StringReader (xml));
  1856. r.Read (); // x
  1857. r.Read (); // ws
  1858. r.ReadSubtree ();
  1859. }
  1860. [Test]
  1861. [ExpectedException (typeof (InvalidOperationException))]
  1862. public void ReadSubtreeOnNonElement2 ()
  1863. {
  1864. string xml = @"<x> <y/></x>";
  1865. XmlReader r = XmlReader.Create (new StringReader (xml));
  1866. r.ReadSubtree ();
  1867. }
  1868. [Test]
  1869. public void ReadSubtreeEmptyElement ()
  1870. {
  1871. string xml = @"<x/>";
  1872. XmlReader r = XmlReader.Create (new StringReader (xml));
  1873. r.Read ();
  1874. XmlReader s = r.ReadSubtree ();
  1875. Assert.IsTrue (s.Read (), "#1");
  1876. Assert.AreEqual (XmlNodeType.Element, s.NodeType, "#2");
  1877. Assert.IsTrue (!s.Read (), "#3");
  1878. Assert.AreEqual (XmlNodeType.None, s.NodeType, "#4");
  1879. }
  1880. [Test]
  1881. public void ReadSubtreeEmptyElementWithAttribute ()
  1882. {
  1883. string xml = @"<root><x a='b'/></root>";
  1884. XmlReader r = XmlReader.Create (new StringReader (xml));
  1885. r.Read ();
  1886. r.Read ();
  1887. XmlReader r2 = r.ReadSubtree ();
  1888. Console.WriteLine ("X");
  1889. r2.Read ();
  1890. XmlReader r3 = r2.ReadSubtree ();
  1891. r2.MoveToFirstAttribute ();
  1892. Assert.IsTrue (!r.IsEmptyElement, "#1");
  1893. Assert.IsTrue (!r2.IsEmptyElement, "#2");
  1894. r3.Close ();
  1895. Assert.IsTrue (r.IsEmptyElement, "#3");
  1896. Assert.IsTrue (r2.IsEmptyElement, "#4");
  1897. r2.Close ();
  1898. Assert.IsTrue (r.IsEmptyElement, "#5");
  1899. Assert.IsTrue (r2.IsEmptyElement, "#6");
  1900. }
  1901. [Test]
  1902. public void ReadContentAsBase64 ()
  1903. {
  1904. byte[] randomData = new byte[24];
  1905. for (int i = 0; i < randomData.Length; i++)
  1906. randomData [i] = (byte) i;
  1907. string xmlString = "<?xml version=\"1.0\"?><data>" +
  1908. Convert.ToBase64String (randomData) + "</data>";
  1909. TextReader textReader = new StringReader (xmlString);
  1910. XmlReader xmlReader = XmlReader.Create (textReader);
  1911. xmlReader.ReadToFollowing ("data");
  1912. int readBytes = 0;
  1913. byte[] buffer = new byte [24];
  1914. xmlReader.ReadStartElement ();
  1915. readBytes = xmlReader.ReadContentAsBase64 (buffer, 0, buffer.Length);
  1916. Assert.AreEqual (24, readBytes, "#1");
  1917. Assert.AreEqual (0, xmlReader.ReadContentAsBase64 (buffer, 0, buffer.Length), "#2");
  1918. StringWriter sw = new StringWriter ();
  1919. foreach (byte b in buffer) sw.Write ("{0:X02}", b);
  1920. Assert.AreEqual ("000102030405060708090A0B0C0D0E0F1011121314151617", sw.ToString (), "#3");
  1921. }
  1922. [Test]
  1923. public void ReadContentAsBase64_2 () // bug #480066
  1924. {
  1925. StringReader readerString = new StringReader ("<root><b64>TWFu</b64><b64>TWFu</b64>\r\n\t<b64>TWFu</b64><b64>TWFu</b64></root>");
  1926. XmlReaderSettings settingsXml = new XmlReaderSettings ();
  1927. settingsXml.XmlResolver = null;
  1928. using (var readerXml = XmlReader.Create (readerString, settingsXml)) {
  1929. readerXml.MoveToContent ();
  1930. readerXml.Read ();
  1931. readerXml.ReadStartElement ("b64");
  1932. const int bufferLength = 1024;
  1933. byte [] buffer = new byte [bufferLength];
  1934. readerXml.ReadContentAsBase64 (buffer, 0, bufferLength);
  1935. Assert.AreEqual (XmlNodeType.EndElement, readerXml.NodeType, "#1");
  1936. readerXml.Read ();
  1937. Assert.AreEqual (XmlNodeType.Element, readerXml.NodeType, "#2");
  1938. }
  1939. }
  1940. [Test]
  1941. public void ReadContentAsBase64_3 () // bug #543332
  1942. {
  1943. byte [] fakeState = new byte[25];
  1944. byte [] fixedSizeBuffer = new byte [25];
  1945. byte [] readDataBuffer = new byte [25];
  1946. var ms = new MemoryStream ();
  1947. var xw = XmlWriter.Create (ms);
  1948. xw.WriteStartElement ("root");
  1949. xw.WriteBase64 (fakeState, 0, fakeState.Length);
  1950. xw.WriteEndElement ();
  1951. xw.Close ();
  1952. var reader = XmlReader.Create (new MemoryStream (ms.ToArray ()));
  1953. reader.MoveToContent ();
  1954. // we cannot completely trust the length read to indicate the end.
  1955. int bytesRead;
  1956. bytesRead = reader.ReadElementContentAsBase64 (fixedSizeBuffer, 0, fixedSizeBuffer.Length);
  1957. Assert.AreEqual (25, bytesRead, "#1");
  1958. Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "#2");
  1959. bytesRead = reader.ReadElementContentAsBase64 (fixedSizeBuffer, 0, fixedSizeBuffer.Length);
  1960. Assert.AreEqual (0, bytesRead, "#3");
  1961. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#4");
  1962. }
  1963. [Test]
  1964. public void ReadElementContentAsQNameDefaultNS ()
  1965. {
  1966. var sw = new StringWriter ();
  1967. var xw = XmlWriter.Create (sw);
  1968. xw.WriteStartElement ("", "foo", "urn:foo");
  1969. xw.WriteValue (new XmlQualifiedName ("x", "urn:foo"));
  1970. xw.WriteEndElement ();
  1971. xw.Close ();
  1972. var xr = XmlReader.Create (new StringReader (sw.ToString ()));
  1973. xr.MoveToContent ();
  1974. var q = (XmlQualifiedName) xr.ReadElementContentAs (typeof (XmlQualifiedName), xr as IXmlNamespaceResolver);
  1975. Assert.AreEqual ("urn:foo", q.Namespace, "#1");
  1976. }
  1977. [Test]
  1978. public void ReadElementContentAsArray ()
  1979. {
  1980. var sw = new StringWriter ();
  1981. var xw = XmlWriter.Create (sw);
  1982. xw.WriteStartElement ("root");
  1983. xw.WriteAttributeString ("xmlns", "b", "http://www.w3.org/2000/xmlns/", "urn:bar");
  1984. var arr = new XmlQualifiedName [] { new XmlQualifiedName ("foo"), new XmlQualifiedName ("bar", "urn:bar") };
  1985. xw.WriteValue (arr);
  1986. xw.Close ();
  1987. var xr = XmlReader.Create (new StringReader (sw.ToString ()));
  1988. xr.MoveToContent ();
  1989. var ret = xr.ReadElementContentAs (typeof (XmlQualifiedName []), null) as XmlQualifiedName [];
  1990. Assert.IsNotNull (ret, "#1");
  1991. Assert.AreEqual (arr [0], ret [0], "#2");
  1992. Assert.AreEqual (arr [1], ret [1], "#3");
  1993. }
  1994. #if NET_4_5
  1995. [Test]
  1996. [ExpectedException(typeof(InvalidOperationException))]
  1997. public void MustSetAsyncFlag ()
  1998. {
  1999. var r = XmlReader.Create (new StringReader ("<root/>"));
  2000. r.ReadAsync ();
  2001. }
  2002. Exception RunAsync (Action action)
  2003. {
  2004. var task = Task<Exception>.Run (async () => {
  2005. try {
  2006. action ();
  2007. return null;
  2008. } catch (Exception ex) {
  2009. return ex;
  2010. }
  2011. });
  2012. task.Wait ();
  2013. Assert.That (task.IsCompleted);
  2014. return task.Result;
  2015. }
  2016. [Test]
  2017. public void SimpleAsync ()
  2018. {
  2019. var xml = "<root test=\"monkey\"/>";
  2020. var task = Task<Exception>.Run (async () => {
  2021. try {
  2022. var s = new XmlReaderSettings ();
  2023. s.Async = true;
  2024. var r = XmlReader.Create (new StringReader (xml), s);
  2025. Assert.That (await r.ReadAsync ());
  2026. Assert.That (r.MoveToFirstAttribute ());
  2027. Assert.AreEqual (await r.GetValueAsync (), "monkey");
  2028. r.Close ();
  2029. return null;
  2030. } catch (Exception ex) {
  2031. return ex;
  2032. }
  2033. });
  2034. task.Wait ();
  2035. Assert.That (task.IsCompleted);
  2036. if (task.Result != null)
  2037. throw task.Result;
  2038. }
  2039. #endif
  2040. #endif
  2041. }
  2042. }