XmlValidatingReaderTests.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. //
  2. // MonoTests.System.Xml.XmlValidatingReaderTests.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C)2003 Atsushi Enomoto
  8. //
  9. using System;
  10. using System.IO;
  11. using System.Xml;
  12. using System.Xml.Schema;
  13. using NUnit.Framework;
  14. namespace MonoTests.System.Xml
  15. {
  16. [TestFixture]
  17. public class XmlValidatingReaderTests : Assertion
  18. {
  19. public XmlValidatingReaderTests ()
  20. {
  21. }
  22. XmlValidatingReader dvr;
  23. private XmlValidatingReader PrepareXmlReader (string xml)
  24. {
  25. XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);
  26. // XmlDocument doc = new XmlDocument ();
  27. // doc.LoadXml (xml);
  28. // XmlReader reader = new XmlNodeReader (doc);
  29. return new XmlValidatingReader (reader);
  30. }
  31. [Test]
  32. public void TestSingleElement ()
  33. {
  34. string intSubset = "<!ELEMENT root EMPTY>";
  35. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  36. string xml = dtd + "<root />";
  37. dvr = PrepareXmlReader (xml);
  38. dvr.Read (); // DTD
  39. dvr.Read ();
  40. xml = dtd + "<invalid />";
  41. dvr = PrepareXmlReader (xml);
  42. dvr.Read (); // DTD
  43. try {
  44. dvr.Read (); // invalid element.
  45. Fail ("should be failed.");
  46. } catch (XmlSchemaException) {
  47. }
  48. xml = dtd + "<root>invalid PCDATA.</root>";
  49. dvr = PrepareXmlReader (xml);
  50. dvr.Read (); // DTD
  51. dvr.Read (); // root
  52. try {
  53. dvr.Read (); // invalid text
  54. Fail ("should be failed.");
  55. } catch (XmlSchemaException) {
  56. }
  57. xml = dtd + "<root><invalid_child /></root>";
  58. dvr = PrepareXmlReader (xml);
  59. dvr.Read (); // DTD
  60. dvr.Read (); // root
  61. try {
  62. dvr.Read (); // invalid child
  63. Fail ("should be failed.");
  64. } catch (XmlSchemaException) {
  65. }
  66. }
  67. [Test]
  68. public void TestElementContent ()
  69. {
  70. string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY>";
  71. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  72. string xml = dtd + "<root />";
  73. dvr = PrepareXmlReader (xml);
  74. dvr.Read (); // DTD
  75. try {
  76. dvr.Read (); // root: invalid end
  77. Fail ("should be failed.");
  78. } catch (XmlSchemaException) {
  79. }
  80. xml = dtd + "<root>Test.</root>";
  81. dvr = PrepareXmlReader (xml);
  82. dvr.Read (); // DTD
  83. dvr.Read (); // root
  84. try {
  85. dvr.Read (); // invalid end
  86. Fail ("should be failed.");
  87. } catch (XmlSchemaException) {
  88. }
  89. xml = dtd + "<root><foo /></root>";
  90. dvr = PrepareXmlReader (xml);
  91. dvr.Read (); // DTD
  92. dvr.Read (); // root
  93. dvr.Read (); // foo
  94. xml = dtd + "<root><bar /></root>";
  95. dvr = PrepareXmlReader (xml);
  96. dvr.Read (); // DTD
  97. dvr.Read (); // root
  98. try {
  99. dvr.Read (); // invalid element
  100. Fail ("should be failed.");
  101. } catch (XmlSchemaException) {
  102. }
  103. }
  104. [Test]
  105. public void TestMixedContent ()
  106. {
  107. string intSubset = "<!ELEMENT root (#PCDATA | foo)*><!ELEMENT foo EMPTY>";
  108. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  109. string xml = dtd + "<root />";
  110. dvr = PrepareXmlReader (xml);
  111. dvr.Read (); // DTD
  112. dvr.Read (); // root
  113. dvr.Read (); // end
  114. xml = dtd + "<root>Test.</root>";
  115. dvr = PrepareXmlReader (xml);
  116. dvr.Read (); // DTD
  117. dvr.Read (); // root
  118. dvr.Read (); // valid PCDATA
  119. dvr.Read (); // endelement root
  120. xml = dtd + "<root><foo/>Test.<foo></foo></root>";
  121. dvr = PrepareXmlReader (xml);
  122. dvr.Read (); // DTD
  123. dvr.Read (); // root
  124. dvr.Read (); // valid foo
  125. dvr.Read (); // valid #PCDATA
  126. dvr.Read (); // valid foo
  127. dvr.Read (); // valid endElement foo
  128. dvr.Read (); // valid endElement root
  129. xml = dtd + "<root>Test.<bar /></root>";
  130. dvr = PrepareXmlReader (xml);
  131. dvr.Read (); // DTD
  132. dvr.Read (); // root
  133. dvr.Read (); // valid #PCDATA
  134. try {
  135. dvr.Read (); // invalid element
  136. Fail ("should be failed.");
  137. } catch (XmlSchemaException) {
  138. }
  139. }
  140. [Test]
  141. public void TestSequence ()
  142. {
  143. string intSubset = "<!ELEMENT root (foo, bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";
  144. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  145. string xml = dtd + "<root><foo/><bar/></root>";
  146. dvr = PrepareXmlReader (xml);
  147. dvr.Read (); // DTD
  148. dvr.Read (); // root
  149. dvr.Read (); // foo
  150. dvr.Read (); // bar
  151. dvr.Read (); // end root
  152. xml = dtd + "<root><foo/></root>";
  153. dvr = PrepareXmlReader (xml);
  154. dvr.Read (); // DTD
  155. dvr.Read (); // root
  156. dvr.Read (); // foo
  157. try {
  158. dvr.Read (); // invalid end root
  159. Fail ("should be failed.");
  160. } catch (XmlSchemaException) {
  161. }
  162. xml = dtd + "<root><bar/></root>";
  163. dvr = PrepareXmlReader (xml);
  164. dvr.Read (); // DTD
  165. dvr.Read (); // root
  166. try {
  167. dvr.Read (); // invalid element bar
  168. Fail ("should be failed.");
  169. } catch (XmlSchemaException) {
  170. }
  171. }
  172. [Test]
  173. public void TestChoice ()
  174. {
  175. string intSubset = "<!ELEMENT root (foo|bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";
  176. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  177. string xml = dtd + "<root><foo/><bar/></root>";
  178. dvr = PrepareXmlReader (xml);
  179. dvr.Read (); // DTD
  180. dvr.Read (); // root
  181. dvr.Read (); // foo
  182. try {
  183. dvr.Read (); // invalid element bar
  184. Fail ("should be failed.");
  185. } catch (XmlSchemaException) {
  186. }
  187. xml = dtd + "<root><foo/></root>";
  188. dvr = PrepareXmlReader (xml);
  189. dvr.Read (); // DTD
  190. dvr.Read (); // root
  191. dvr.Read (); // foo
  192. dvr.Read (); // end root
  193. xml = dtd + "<root><bar/></root>";
  194. dvr = PrepareXmlReader (xml);
  195. dvr.Read (); // DTD
  196. dvr.Read (); // root
  197. dvr.Read (); // bar
  198. dvr.Read (); // end root
  199. xml = dtd + "<root><foo/>text.<bar/></root>";
  200. dvr = PrepareXmlReader (xml);
  201. dvr.Read (); // DTD
  202. dvr.Read (); // root
  203. dvr.Read (); // foo
  204. try {
  205. dvr.Read (); // invalid text
  206. Fail ("should be failed.");
  207. } catch (XmlSchemaException) {
  208. }
  209. }
  210. [Test]
  211. public void TestAny ()
  212. {
  213. string intSubset = "<!ELEMENT root ANY><!ELEMENT foo EMPTY>";
  214. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  215. string xml = dtd + "<root />";
  216. dvr = PrepareXmlReader (xml);
  217. dvr.Read (); // DTD
  218. dvr.Read (); // empty root.
  219. dvr.Read (); // end of document.
  220. xml = dtd + "<root><foo/></root>";
  221. dvr = PrepareXmlReader (xml);
  222. dvr.Read (); // DTD
  223. dvr.Read (); // root
  224. dvr.Read (); // foo
  225. dvr.Read (); // end root
  226. xml = dtd + "<root><foo /><foo></foo><foo/></root>";
  227. dvr = PrepareXmlReader (xml);
  228. dvr.Read (); // DTD
  229. dvr.Read (); // root
  230. dvr.Read (); // foo
  231. dvr.Read (); // foo
  232. dvr.Read (); // foo
  233. dvr.Read (); // end root
  234. xml = dtd + "<root><bar /></root>";
  235. dvr = PrepareXmlReader (xml);
  236. dvr.Read (); // DTD
  237. dvr.Read (); // root
  238. try {
  239. dvr.Read (); // bar: invalid (undeclared) element
  240. Fail ("should be failed.");
  241. } catch (XmlSchemaException) {
  242. }
  243. }
  244. [Test]
  245. [Category ("NotDotNet")]
  246. // MS fails to validate nondeterministic content validation.
  247. public void TestNonDeterministicContent ()
  248. {
  249. string intSubset = "<!ELEMENT root ((foo, bar)|(foo,baz))><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY><!ELEMENT baz EMPTY>";
  250. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  251. string xml = dtd + "<root><foo/><bar/></root>";
  252. dvr = PrepareXmlReader (xml);
  253. dvr.Read (); // DTD
  254. dvr.Read (); // root
  255. dvr.Read (); // foo
  256. dvr.Read (); // bar
  257. dvr.Read (); // end root
  258. xml = dtd + "<root><foo/><baz/></root>";
  259. dvr = PrepareXmlReader (xml);
  260. dvr.Read (); // DTD
  261. dvr.Read (); // root
  262. dvr.Read (); // foo
  263. dvr.Read (); // end root
  264. }
  265. [Test]
  266. [Category ("NotDotNet")]
  267. public void TestAttributes ()
  268. {
  269. // simple content and attributes are required
  270. string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";
  271. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  272. string xml = dtd + "<root><foo/></root>";
  273. dvr = PrepareXmlReader (xml);
  274. dvr.ValidationType = ValidationType.DTD;
  275. dvr.Read (); // DTD
  276. try {
  277. dvr.Read (); // missing attributes
  278. Fail ("should be failed."); // MS.NET fails to fail this test.
  279. } catch (XmlSchemaException) {
  280. }
  281. // empty element but attributes are required
  282. intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";
  283. dtd = "<!DOCTYPE root [" + intSubset + "]>";
  284. xml = dtd + "<root />";
  285. dvr = PrepareXmlReader (xml);
  286. dvr.ValidationType = ValidationType.DTD;
  287. dvr.Read (); // DTD
  288. try {
  289. dvr.Read (); // missing attributes
  290. Fail ("should be failed.");
  291. } catch (XmlSchemaException) {
  292. }
  293. xml = dtd + "<root foo='value' />";
  294. dvr = PrepareXmlReader (xml);
  295. dvr.Read (); // DTD
  296. dvr.Read (); // root
  297. dvr.Read (); // end of document
  298. xml = dtd + "<root foo='value' bar='2nd' />";
  299. dvr = PrepareXmlReader (xml);
  300. dvr.Read (); // DTD
  301. dvr.Read (); // root
  302. dvr.Read (); // end of document
  303. xml = dtd + "<root foo='value' bar='2nd' baz='3rd' />";
  304. dvr = PrepareXmlReader (xml);
  305. dvr.Read (); // DTD
  306. try {
  307. dvr.Read (); // undeclared attribute baz
  308. Fail ("should be failed.");
  309. } catch (XmlSchemaException) {
  310. }
  311. }
  312. [Test]
  313. public void TestAttributeDefaultContribution ()
  314. {
  315. string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'>";
  316. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  317. string xml = dtd + "<root />";
  318. dvr = PrepareXmlReader (xml);
  319. dvr.ValidationType = ValidationType.DTD;
  320. this.TestAttributeDefaultContributionInternal (dvr);
  321. dvr = PrepareXmlReader (xml);
  322. dvr.ValidationType = ValidationType.None;
  323. this.TestAttributeDefaultContributionInternal (dvr);
  324. }
  325. private void TestAttributeDefaultContributionInternal (XmlReader dvr)
  326. {
  327. dvr.Read (); // DTD
  328. dvr.Read ();
  329. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  330. AssertEquals ("root", dvr.Name);
  331. AssertEquals (2, dvr.AttributeCount);
  332. // foo
  333. Assert (dvr.MoveToFirstAttribute ());
  334. AssertEquals ("foo", dvr.Name);
  335. AssertEquals ("foo-def", dvr ["foo"]);
  336. AssertNotNull (dvr ["bar"]);
  337. AssertEquals ("foo-def", dvr.Value);
  338. Assert (dvr.ReadAttributeValue ());
  339. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  340. AssertEquals (String.Empty, dvr.Name);
  341. AssertEquals ("foo-def", dvr.Value);
  342. // bar
  343. Assert (dvr.MoveToNextAttribute ());
  344. AssertEquals ("bar", dvr.Name);
  345. AssertEquals ("foo-def", dvr ["foo"]);
  346. AssertNotNull (dvr ["bar"]);
  347. AssertEquals ("bar-def", dvr.Value);
  348. Assert (dvr.ReadAttributeValue ());
  349. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  350. AssertEquals (String.Empty, dvr.Name);
  351. AssertEquals ("bar-def", dvr.Value);
  352. }
  353. [Test]
  354. public void TestExpandEntity ()
  355. {
  356. string intSubset = "<!ELEMENT root (#PCDATA)><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
  357. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  358. string xml = dtd + "<root foo='&ent;' bar='internal &ent; value'>&ent;</root>";
  359. dvr = PrepareXmlReader (xml);
  360. dvr.EntityHandling = EntityHandling.ExpandEntities;
  361. dvr.Read (); // DTD
  362. dvr.Read ();
  363. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  364. AssertEquals ("root", dvr.Name);
  365. Assert (dvr.MoveToFirstAttribute ());
  366. AssertEquals ("foo", dvr.Name);
  367. AssertEquals ("entity string", dvr.Value);
  368. Assert (dvr.MoveToNextAttribute ());
  369. AssertEquals ("bar", dvr.Name);
  370. AssertEquals ("internal entity string value", dvr.Value);
  371. AssertEquals ("entity string", dvr.ReadString ());
  372. // ValidationType = None
  373. dvr = PrepareXmlReader (xml);
  374. dvr.EntityHandling = EntityHandling.ExpandEntities;
  375. dvr.ValidationType = ValidationType.None;
  376. dvr.Read (); // DTD
  377. dvr.Read ();
  378. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  379. AssertEquals ("root", dvr.Name);
  380. Assert (dvr.MoveToFirstAttribute ());
  381. AssertEquals ("foo", dvr.Name);
  382. AssertEquals ("entity string", dvr.Value);
  383. Assert (dvr.MoveToNextAttribute ());
  384. AssertEquals ("bar", dvr.Name);
  385. AssertEquals ("internal entity string value", dvr.Value);
  386. AssertEquals ("entity string", dvr.ReadString ());
  387. }
  388. [Test]
  389. public void TestPreserveEntity ()
  390. {
  391. string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
  392. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  393. string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";
  394. dvr = PrepareXmlReader (xml);
  395. dvr.EntityHandling = EntityHandling.ExpandCharEntities;
  396. dvr.Read (); // DTD
  397. dvr.Read ();
  398. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  399. AssertEquals ("root", dvr.Name);
  400. Assert (dvr.MoveToFirstAttribute ());
  401. AssertEquals ("foo", dvr.Name);
  402. // MS BUG: it returns "entity string", however, entity should not be exanded.
  403. // ReadAttributeValue()
  404. Assert (dvr.ReadAttributeValue ());
  405. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  406. AssertEquals ("ent", dvr.Name);
  407. AssertEquals (String.Empty, dvr.Value);
  408. Assert (!dvr.ReadAttributeValue ());
  409. // bar
  410. Assert (dvr.MoveToNextAttribute ());
  411. AssertEquals ("bar", dvr.Name);
  412. // ReadAttributeValue()
  413. Assert (dvr.ReadAttributeValue ());
  414. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  415. AssertEquals (String.Empty, dvr.Name);
  416. AssertEquals ("internal ", dvr.Value);
  417. Assert (dvr.ReadAttributeValue ());
  418. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  419. AssertEquals ("ent", dvr.Name);
  420. AssertEquals (String.Empty, dvr.Value);
  421. Assert (dvr.ReadAttributeValue ());
  422. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  423. AssertEquals (String.Empty, dvr.Name);
  424. AssertEquals (" value", dvr.Value);
  425. // ValidationType = None
  426. dvr = PrepareXmlReader (xml);
  427. dvr.EntityHandling = EntityHandling.ExpandCharEntities;
  428. dvr.ValidationType = ValidationType.None;
  429. dvr.Read (); // DTD
  430. dvr.Read ();
  431. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  432. AssertEquals ("root", dvr.Name);
  433. // foo
  434. Assert (dvr.MoveToFirstAttribute ());
  435. AssertEquals ("foo", dvr.Name);
  436. // ReadAttributeValue()
  437. Assert (dvr.ReadAttributeValue ());
  438. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  439. AssertEquals ("ent", dvr.Name);
  440. AssertEquals (String.Empty, dvr.Value);
  441. Assert (!dvr.ReadAttributeValue ());
  442. // bar
  443. Assert (dvr.MoveToNextAttribute ());
  444. AssertEquals ("bar", dvr.Name);
  445. // ReadAttributeValue()
  446. Assert (dvr.ReadAttributeValue ());
  447. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  448. AssertEquals (String.Empty, dvr.Name);
  449. AssertEquals ("internal ", dvr.Value);
  450. Assert (dvr.ReadAttributeValue ());
  451. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  452. AssertEquals ("ent", dvr.Name);
  453. AssertEquals (String.Empty, dvr.Value);
  454. Assert (dvr.ReadAttributeValue ());
  455. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  456. AssertEquals (String.Empty, dvr.Name);
  457. AssertEquals (" value", dvr.Value);
  458. }
  459. [Test]
  460. // it used to be regarded as MS bug but it was not really.
  461. public void TestPreserveEntityNotOnDotNet ()
  462. {
  463. string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
  464. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  465. string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";
  466. dvr = PrepareXmlReader (xml);
  467. dvr.EntityHandling = EntityHandling.ExpandCharEntities;
  468. dvr.Read (); // DTD
  469. dvr.Read ();
  470. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  471. AssertEquals ("root", dvr.Name);
  472. Assert (dvr.MoveToFirstAttribute ());
  473. AssertEquals ("foo", dvr.Name);
  474. AssertEquals ("entity string", dvr.Value);
  475. // ReadAttributeValue()
  476. Assert (dvr.ReadAttributeValue ());
  477. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  478. AssertEquals ("ent", dvr.Name);
  479. AssertEquals (String.Empty, dvr.Value);
  480. Assert (!dvr.ReadAttributeValue ());
  481. // bar
  482. Assert (dvr.MoveToNextAttribute ());
  483. AssertEquals ("bar", dvr.Name);
  484. AssertEquals ("internal entity string value", dvr.Value);
  485. // ReadAttributeValue()
  486. Assert (dvr.ReadAttributeValue ());
  487. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  488. AssertEquals (String.Empty, dvr.Name);
  489. AssertEquals ("internal ", dvr.Value);
  490. Assert (dvr.ReadAttributeValue ());
  491. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  492. AssertEquals ("ent", dvr.Name);
  493. AssertEquals (String.Empty, dvr.Value);
  494. Assert (dvr.ReadAttributeValue ());
  495. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  496. AssertEquals (String.Empty, dvr.Name);
  497. AssertEquals (" value", dvr.Value);
  498. // ValidationType = None
  499. dvr = PrepareXmlReader (xml);
  500. dvr.EntityHandling = EntityHandling.ExpandCharEntities;
  501. dvr.ValidationType = ValidationType.None;
  502. dvr.Read (); // DTD
  503. dvr.Read ();
  504. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  505. AssertEquals ("root", dvr.Name);
  506. // foo
  507. Assert (dvr.MoveToFirstAttribute ());
  508. AssertEquals ("foo", dvr.Name);
  509. AssertEquals ("entity string", dvr.Value);
  510. // ReadAttributeValue()
  511. Assert (dvr.ReadAttributeValue ());
  512. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  513. AssertEquals ("ent", dvr.Name);
  514. AssertEquals (String.Empty, dvr.Value);
  515. Assert (!dvr.ReadAttributeValue ());
  516. // bar
  517. Assert (dvr.MoveToNextAttribute ());
  518. AssertEquals ("bar", dvr.Name);
  519. AssertEquals ("internal entity string value", dvr.Value);
  520. // ReadAttributeValue()
  521. Assert (dvr.ReadAttributeValue ());
  522. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  523. AssertEquals (String.Empty, dvr.Name);
  524. AssertEquals ("internal ", dvr.Value);
  525. Assert (dvr.ReadAttributeValue ());
  526. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  527. AssertEquals ("ent", dvr.Name);
  528. AssertEquals (String.Empty, dvr.Value);
  529. Assert (dvr.ReadAttributeValue ());
  530. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  531. AssertEquals (String.Empty, dvr.Name);
  532. AssertEquals (" value", dvr.Value);
  533. }
  534. [Test]
  535. public void TestNormalization ()
  536. {
  537. string intSubset = "<!ELEMENT root EMPTY>"
  538. + "<!ATTLIST root foo ID #REQUIRED"
  539. + " bar NMTOKEN #IMPLIED "
  540. + " baz NMTOKENS #IMPLIED "
  541. + " quux CDATA #IMPLIED >";
  542. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  543. string xml = dtd + "<root foo=' id1 ' bar=' nameToken ' baz=' list of\r\nname token' quux=' quuux\tquuux\t ' />";
  544. dvr = PrepareXmlReader (xml);
  545. ((XmlTextReader) dvr.Reader).Normalization = true;
  546. dvr.EntityHandling = EntityHandling.ExpandEntities;
  547. dvr.Read (); // DTD
  548. dvr.Read ();
  549. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  550. AssertEquals ("root", dvr.Name);
  551. Assert (dvr.MoveToFirstAttribute ());
  552. AssertEquals ("foo", dvr.Name);
  553. AssertEquals ("id1", dvr.Value);
  554. Assert (dvr.MoveToNextAttribute ());
  555. AssertEquals ("bar", dvr.Name);
  556. AssertEquals ("nameToken", dvr.Value);
  557. Assert (dvr.MoveToNextAttribute ());
  558. AssertEquals ("baz", dvr.Name);
  559. AssertEquals ("list of name token", dvr.Value);
  560. Assert (dvr.MoveToNextAttribute ());
  561. AssertEquals ("quux", dvr.Name);
  562. AssertEquals (" quuux quuux ", dvr.Value);
  563. }
  564. [Test]
  565. public void TestValidationEvent ()
  566. {
  567. string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'>";
  568. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  569. string xml = dtd + "<foo><bar att='val' /></foo>";
  570. eventFired = false;
  571. dvr = PrepareXmlReader (xml);
  572. dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound);
  573. dvr.ValidationType = ValidationType.DTD;
  574. dvr.Read (); // DTD
  575. Assert (dvr.Read ()); // invalid foo
  576. Assert (eventFired);
  577. AssertEquals ("foo", dvr.Name);
  578. Assert (dvr.Read ()); // invalid bar
  579. AssertEquals ("bar", dvr.Name);
  580. Assert (dvr.MoveToFirstAttribute ()); // att
  581. AssertEquals ("att", dvr.Name);
  582. Assert (dvr.Read ()); // invalid end foo
  583. AssertEquals ("foo", dvr.Name);
  584. AssertEquals (XmlNodeType.EndElement, dvr.NodeType);
  585. Assert (!dvr.Read ());
  586. // When ValidationType is None, event should not be fired,
  587. eventFired = false;
  588. dvr = PrepareXmlReader (xml);
  589. dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound);
  590. dvr.ValidationType = ValidationType.None;
  591. dvr.Read (); // DTD
  592. Assert (dvr.Read ()); // invalid foo
  593. Assert (!eventFired);
  594. }
  595. private bool eventFired;
  596. private void OnInvalidityFound (object o, ValidationEventArgs e)
  597. {
  598. eventFired = true;
  599. }
  600. [Test]
  601. public void TestIdentityConstraints ()
  602. {
  603. string intSubset = "<!ELEMENT root (c)+><!ELEMENT c EMPTY><!ATTLIST root foo ID #REQUIRED>";
  604. string dtd = "<!DOCTYPE root [" + intSubset + "]>";
  605. string xml = dtd + "<root><c foo='val' /><c foo='val'></root>";
  606. dvr = PrepareXmlReader (xml);
  607. dvr.ValidationType = ValidationType.DTD;
  608. dvr.Read (); // DTD
  609. try {
  610. dvr.Read (); // root misses attribute foo
  611. Fail ();
  612. } catch (XmlSchemaException) {
  613. }
  614. intSubset = "<!ELEMENT root (c)+><!ELEMENT c EMPTY><!ATTLIST c foo ID #REQUIRED bar IDREF #IMPLIED baz IDREFS #IMPLIED>";
  615. dtd = "<!DOCTYPE root [" + intSubset + "]>";
  616. xml = dtd + "<root><c foo='val' /><c foo='val'></root>";
  617. dvr = PrepareXmlReader (xml);
  618. dvr.ValidationType = ValidationType.DTD;
  619. dvr.Read (); // DTD
  620. dvr.Read (); // root
  621. dvr.Read (); // c[1]
  622. try {
  623. dvr.Read (); // c[2]
  624. Fail ();
  625. } catch (XmlSchemaException) {
  626. }
  627. xml = dtd + "<root><c foo='val' /><c baz='val val val 1 2 3'></root>";
  628. dvr = PrepareXmlReader (xml);
  629. dvr.Read (); // DTD
  630. dvr.Read (); // root
  631. dvr.Read (); // c[1]
  632. try {
  633. dvr.Read (); // c[2]
  634. Fail ();
  635. } catch (XmlSchemaException) {
  636. }
  637. }
  638. // Entity tests are almost copied from XmlNodeReaderTests.
  639. [Test]
  640. public void ResolveEntity ()
  641. {
  642. string ent1 = "<!ENTITY ent 'entity string'>";
  643. string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
  644. string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
  645. string xml = dtd + "<root>&ent;&ent2;</root>";
  646. dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  647. dvr.ValidationType = ValidationType.None;
  648. dvr.EntityHandling = EntityHandling.ExpandCharEntities;
  649. dvr.Read (); // DTD
  650. dvr.Read (); // root
  651. dvr.Read (); // &ent;
  652. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  653. AssertEquals (1, dvr.Depth);
  654. dvr.ResolveEntity ();
  655. // It is still entity reference.
  656. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  657. dvr.Read ();
  658. AssertEquals (XmlNodeType.Text, dvr.NodeType);
  659. AssertEquals (2, dvr.Depth);
  660. AssertEquals ("entity string", dvr.Value);
  661. dvr.Read ();
  662. AssertEquals (XmlNodeType.EndEntity, dvr.NodeType);
  663. AssertEquals (1, dvr.Depth);
  664. AssertEquals (String.Empty, dvr.Value);
  665. dvr.Read (); // &ent2;
  666. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  667. AssertEquals (1, dvr.Depth);
  668. dvr.ResolveEntity ();
  669. // It is still entity reference.
  670. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  671. // It now became element node.
  672. dvr.Read ();
  673. AssertEquals (XmlNodeType.Element, dvr.NodeType);
  674. AssertEquals (2, dvr.Depth);
  675. }
  676. [Test]
  677. public void ResolveEntity2 ()
  678. {
  679. string ent1 = "<!ENTITY ent 'entity string'>";
  680. string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
  681. string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
  682. string xml = dtd + "<root>&ent3;&ent2;</root>";
  683. dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  684. dvr.ValidationType = ValidationType.None;
  685. dvr.EntityHandling = EntityHandling.ExpandCharEntities;
  686. dvr.Read (); // DTD
  687. dvr.Read (); // root
  688. dvr.Read (); // &ent3;
  689. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  690. #if NET_2_0
  691. // under .NET 2.0, an error is raised here.
  692. // under .NET 1.1, the error is thrown on the next read.
  693. try {
  694. dvr.ResolveEntity ();
  695. Fail ("Attempt to resolve undeclared entity should fail.");
  696. } catch (XmlException) {
  697. }
  698. #else
  699. // ent3 does not exist in this dtd.
  700. dvr.ResolveEntity ();
  701. AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
  702. try {
  703. dvr.Read ();
  704. Fail ("Attempt to resolve undeclared entity should fail.");
  705. } catch (XmlException) {
  706. }
  707. #endif
  708. }
  709. [Test]
  710. [ExpectedException (typeof (XmlException))]
  711. public void ResolveEntityWithoutDTD ()
  712. {
  713. string xml = "<root>&ent;&ent2;</root>";
  714. dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  715. dvr.Read (); // root
  716. dvr.Read (); // &ent;
  717. }
  718. [Test]
  719. public void ResolveEntityReadAttributeValue ()
  720. {
  721. string dtd = "<!DOCTYPE root [<!ELEMENT root (#PCDATA)*><!ATTLIST root attr CDATA #REQUIRED><!ENTITY ent 'entity string'>]>";
  722. string xml = dtd + "<root attr='&ent; text'>&ent;</root>";
  723. dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  724. dvr.Read (); // doctype
  725. dvr.Read (); // root
  726. dvr.MoveToAttribute (0); // attr
  727. Assert (dvr.ReadAttributeValue ()); // Should read expanded text
  728. AssertEquals (XmlNodeType.Text, dvr.NodeType); // not EntityReference
  729. AssertEquals ("entity string text", dvr.Value);
  730. Assert (!dvr.ReadAttributeValue ());
  731. }
  732. [Test]
  733. public void ResolveEntitySequentialText ()
  734. {
  735. string xml = @"<!DOCTYPE doc [
  736. <!ELEMENT doc ANY>
  737. <!ELEMENT foo ANY>
  738. <!ENTITY ref1 '<![CDATA[cdata]]>test'>
  739. ]>
  740. <doc><foo>&ref1; test </foo></doc>";
  741. string refOut = "<doc><foo><![CDATA[cdata]]>test test </foo></doc>";
  742. XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
  743. XmlValidatingReader r = new XmlValidatingReader (xtr);
  744. r.Read ();
  745. r.Read ();
  746. r.Read ();
  747. AssertEquals (refOut, r.ReadOuterXml ());
  748. }
  749. [Test]
  750. // imported testcase from sys.security which had regression.
  751. public void ResolveEntityAndBaseURI ()
  752. {
  753. try {
  754. using (TextWriter w = File.CreateText ("world.txt")) {
  755. w.WriteLine ("world");
  756. }
  757. using (TextWriter w = File.CreateText ("doc.dtd")) {
  758. w.WriteLine ("<!-- dummy -->");
  759. }
  760. string xml = "<!DOCTYPE doc SYSTEM \"doc.dtd\" [\n" +
  761. "<!ATTLIST doc attrExtEnt ENTITY #IMPLIED>\n" +
  762. "<!ENTITY ent1 \"Hello\">\n" +
  763. "<!ENTITY ent2 SYSTEM \"world.txt\">\n" +
  764. "<!ENTITY entExt SYSTEM \"earth.gif\" NDATA gif>\n" +
  765. "<!NOTATION gif SYSTEM \"viewgif.exe\">\n" +
  766. "]>\n" +
  767. "<doc attrExtEnt=\"entExt\">\n" +
  768. " &ent1;, &ent2;!\n" +
  769. "</doc>\n" +
  770. "\n" +
  771. "<!-- Let world.txt contain \"world\" (excluding the quotes) -->\n";
  772. XmlValidatingReader xvr =
  773. new XmlValidatingReader (
  774. xml, XmlNodeType.Document, null);
  775. xvr.ValidationType = ValidationType.None;
  776. xvr.EntityHandling =
  777. EntityHandling.ExpandCharEntities;
  778. XmlDocument doc = new XmlDocument ();
  779. doc.Load (xvr);
  780. } finally {
  781. if (File.Exists ("world.txt"))
  782. File.Delete ("world.txt");
  783. if (File.Exists ("doc.dtd"))
  784. File.Delete ("doc.dtd");
  785. }
  786. }
  787. [Test]
  788. //[NotWorking ("default namespace seems null, not String.Empty")]
  789. #if NET_2_0
  790. #else
  791. // MS.NET 1.x does not consider cases that xmlns* attributes
  792. // could be declared as default.
  793. [Category ("NotDotNet")]
  794. #endif
  795. public void DefaultXmlnsAttributeLookup ()
  796. {
  797. string xml = @"<!DOCTYPE X [
  798. <!ELEMENT X (Y)+>
  799. <!ENTITY baz 'urn:baz'>
  800. <!ATTLIST X
  801. xmlns CDATA 'urn:foo'
  802. xmlns:bar CDATA 'urn:bar'
  803. xmlns:baz CDATA #IMPLIED
  804. dummy CDATA 'dummy'
  805. baz:dummy CDATA 'dummy'>
  806. <!ELEMENT Y (#PCDATA)*>
  807. <!ATTLIST Y
  808. xmlns CDATA #IMPLIED
  809. xmlns:bar CDATA #IMPLIED>
  810. ]>
  811. <X xmlns:baz='&baz;'><Y/><Y>text.</Y><Y xmlns='' xmlns:bar='urn:hoge'>text.</Y></X>";
  812. XmlValidatingReader xvr = new XmlValidatingReader (
  813. xml, XmlNodeType.Document, null);
  814. xvr.Read (); // DTD
  815. xvr.Read (); // whitespace
  816. xvr.Read ();
  817. AssertEquals ("#1-1", "urn:foo", xvr.LookupNamespace (String.Empty));
  818. AssertEquals ("#1-2", "urn:bar", xvr.LookupNamespace ("bar"));
  819. AssertEquals ("#1-a", "urn:baz", xvr.LookupNamespace ("baz"));
  820. Assert ("#1-b", xvr.MoveToAttribute ("baz:dummy"));
  821. AssertEquals ("#1-c", "urn:baz", xvr.NamespaceURI);
  822. Assert ("#1-d", xvr.MoveToAttribute ("dummy"));
  823. AssertEquals ("#1-e", String.Empty, xvr.NamespaceURI);
  824. xvr.Read (); // first Y, empty element
  825. AssertEquals ("#2-1", "urn:foo", xvr.LookupNamespace (String.Empty));
  826. AssertEquals ("#2-2", "urn:bar", xvr.LookupNamespace ("bar"));
  827. xvr.Read (); // second Y, start element
  828. AssertEquals ("#3-1", "urn:foo", xvr.LookupNamespace (String.Empty));
  829. AssertEquals ("#3-2", "urn:bar", xvr.LookupNamespace ("bar"));
  830. xvr.Read (); // inside normal Y. Check inheritance
  831. AssertEquals ("#4-1", "urn:foo", xvr.LookupNamespace (String.Empty));
  832. AssertEquals ("#4-2", "urn:bar", xvr.LookupNamespace ("bar"));
  833. xvr.Read (); // second Y, end element
  834. AssertEquals ("#5-1", "urn:foo", xvr.LookupNamespace (String.Empty));
  835. AssertEquals ("#5-2", "urn:bar", xvr.LookupNamespace ("bar"));
  836. xvr.Read (); // third Y, suppresses default namespaces
  837. AssertEquals ("#6-1", null, xvr.LookupNamespace (String.Empty));
  838. AssertEquals ("#6-2", "urn:hoge", xvr.LookupNamespace ("bar"));
  839. xvr.Read (); // inside suppressing Y. Check inheritance
  840. AssertEquals ("#7-1", null, xvr.LookupNamespace (String.Empty));
  841. AssertEquals ("#7-2", "urn:hoge", xvr.LookupNamespace ("bar"));
  842. xvr.Read (); // end of suppressing element
  843. AssertEquals ("#8-1", null, xvr.LookupNamespace (String.Empty));
  844. AssertEquals ("#8-2", "urn:hoge", xvr.LookupNamespace ("bar"));
  845. }
  846. }
  847. }