XmlReaderCommonTests.cs 65 KB

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