readertest.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. {**********************************************************************
  2. This file is part of the Free Component Library (FCL)
  3. Test cases for TXMLReader class and its descendants
  4. Copyright (c) 2012 by Sergei Gorelkin, [email protected]
  5. Using tests from Mono test suite, written by
  6. Jason Diamond ([email protected])
  7. Martin Willemoes Hansen ([email protected])
  8. (C) 2001, 2002 Jason Diamond http://injektilo.org/
  9. See the file COPYING.FPC, included in this distribution,
  10. for details about the copyright.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. **********************************************************************}
  15. unit readertest;
  16. {$mode objfpc}{$h+}
  17. interface
  18. implementation
  19. uses
  20. sysutils, fpcunit, testregistry, xmlutils, readerunit, XmlReader;
  21. type
  22. TXMLReaderTest = class(TXMLReaderTestBase)
  23. public
  24. procedure TestInitialState(r: TXMLReader);
  25. procedure TestReadEmptySource(r: TXMLReader);
  26. procedure TestRead(r: TXMLReader);
  27. procedure TestReadAttributeValue(r: TXMLReader);
  28. procedure TestReadAttributeValue2(r: TXMLReader);
  29. procedure TestDTDProperties(r: TXMLReader);
  30. procedure TestReadStringFromElement(r: TXMLReader);
  31. procedure TestEmptyElement(r: TXMLReader);
  32. procedure TestNestedEmptyTag(r: TXMLReader);
  33. procedure TestNestedText(r: TXMLReader);
  34. procedure TestEmptyElementWithAttributes(r: TXMLReader);
  35. procedure TestPIBeforeRoot(r: TXMLReader);
  36. procedure TestCommentBeforeRoot(r: TXMLReader);
  37. procedure TestCDATA(r: TXMLReader);
  38. procedure TestChildElementInNamespace(r: TXMLReader);
  39. procedure TestMoveToElementFromAttribute(r: TXMLReader);
  40. procedure TestMoveToElementFromElement(r: TXMLReader);
  41. procedure TestMoveToNextAttribute(r: TXMLReader);
  42. procedure TestResolveEntity(r: TXMLReader);
  43. procedure TestLineInfo(r: TXMLReader);
  44. published
  45. procedure InitialState;
  46. procedure ReadEmptySource;
  47. procedure Read;
  48. procedure ReadAttributeValue;
  49. procedure ReadAttributeValue2;
  50. procedure DTDProperties;
  51. procedure ReadStringFromElement;
  52. procedure EmptyElement;
  53. procedure NestedEmptyTag;
  54. procedure NestedText;
  55. procedure EmptyElementWithAttributes;
  56. procedure PIBeforeRoot;
  57. procedure CommentBeforeRoot;
  58. procedure CDATA;
  59. procedure ChildElementInNamespace;
  60. procedure MoveToElementFromAttribute;
  61. procedure MoveToElementFromElement;
  62. procedure MoveToNextAttribute;
  63. procedure ResolveEntity;
  64. procedure LineInfo;
  65. end;
  66. const
  67. xml1 = '<root attr1=''value1''><child /></root>';
  68. xml2 = '<root><foo/><bar>test.</bar></root>';
  69. xml3 = '<root> test of <b>mixed</b> string.<![CDATA[ cdata string.]]></root>';
  70. procedure TXMLReaderTest.TestInitialState(r: TXMLReader);
  71. begin
  72. AssertEquals('Depth', 0, r.Depth);
  73. AssertEquals('EOF', False, r.EOF);
  74. AssertEquals('HasValue', False, r.HasValue);
  75. AssertEqualsW('LocalName', '', r.LocalName);
  76. AssertEquals('NodeType', ntNone, r.NodeType);
  77. AssertEquals('ReadState', rsInitial, r.ReadState);
  78. end;
  79. procedure TXMLReaderTest.InitialState;
  80. begin
  81. DoTest(xml1, @TestInitialState);
  82. end;
  83. // TODO: this should fail only when conformancelevel=document
  84. procedure TXMLReaderTest.TestReadEmptySource(r: TXMLReader);
  85. begin
  86. try
  87. r.Read;
  88. Fail('Read empty source succeeded');
  89. except
  90. end;
  91. end;
  92. procedure TXMLReaderTest.ReadEmptySource;
  93. begin
  94. DoTest('', @TestReadEmptySource);
  95. end;
  96. procedure TXMLReaderTest.TestRead(r: TXMLReader);
  97. begin
  98. r.Read;
  99. AssertEquals('<root>.NodeType', ntElement, r.NodeType);
  100. AssertEqualsW('<root>.Name', 'root', r.Name);
  101. AssertEquals('<root>.ReadState', rsInteractive, r.ReadState);
  102. AssertEquals('<root>.Depth', 0, r.Depth);
  103. // move to 'child'
  104. r.Read;
  105. AssertEquals('<child/>.Depth', 1, r.Depth);
  106. AssertEquals('<child/>.NodeType', ntElement, r.NodeType);
  107. AssertEqualsW('<child/>.Name', 'child', r.Name);
  108. { this differs from .net; we don't support EmptyElement }
  109. r.Read;
  110. AssertEquals('<child/>.EndDepth', 1, r.Depth);
  111. AssertEquals('<child/>.EndNodeType', ntEndElement, r.NodeType);
  112. AssertEqualsW('<child/>.EndName', 'child', r.Name);
  113. r.Read;
  114. AssertEquals('</root>.Depth', 0, r.Depth);
  115. AssertEquals('</root>.NodeType', ntEndElement, r.NodeType);
  116. AssertEqualsW('</root>.Name', 'root', r.Name);
  117. r.Read;
  118. AssertTrue('end.EOF', r.EOF);
  119. AssertEquals('end.NodeType', ntNone, r.NodeType);
  120. end;
  121. procedure TXMLReaderTest.Read;
  122. begin
  123. DoTest(xml1, @TestRead);
  124. end;
  125. procedure TXMLReaderTest.TestReadAttributeValue(r: TXMLReader);
  126. begin
  127. r.Read; // root
  128. AssertTrue('#1',r.MoveToFirstAttribute);
  129. AssertNodeValues('#2', r,
  130. ntAttribute,
  131. 1, 'attr', '', 'attr', '', 'value', true, 1, true);
  132. AssertTrue('#3',r.ReadAttributeValue);
  133. AssertNodeValues('#4', r,
  134. ntText,
  135. 2, '', '', '', '', 'value', true, 1, true);
  136. AssertTrue('#5',r.MoveToElement);
  137. AssertNodeValues('#6', r,
  138. ntElement,
  139. 0, 'root', '', 'root', '', '', false, 1, true);
  140. end;
  141. procedure TXMLReaderTest.ReadAttributeValue;
  142. begin
  143. DoTest('<root attr="value"/>', @TestReadAttributeValue);
  144. end;
  145. procedure TXMLReaderTest.TestReadAttributeValue2(r: TXMLReader);
  146. begin
  147. r.Read; // DTD
  148. r.Read; // root
  149. AssertTrue('#1',r.MoveToFirstAttribute);
  150. AssertNodeValues('#2', r,
  151. ntAttribute,
  152. 1, 'attr', '', 'attr', '', 'ax1y1x1b', true, 1, true);
  153. AssertTrue('#3',r.ReadAttributeValue);
  154. AssertNodeValues('#4', r,
  155. ntText, 2,
  156. '', '', '', '', 'a', true, 1, true);
  157. AssertTrue('#5', r.ReadAttributeValue);
  158. AssertNodeValues('#6', r,
  159. ntEntityReference, 2,
  160. 'e1','','e1','', '', false, 1, true);
  161. r.ResolveEntity;
  162. AssertEquals('#6a', 2, r.Depth);
  163. AssertEquals('#6b', ntEntityReference, r.nodeType);
  164. AssertTrue('#6c', r.ReadAttributeValue);
  165. AssertNodeValues('#6d', r,
  166. ntEntityReference, 3,
  167. 'e2', '', 'e2', '', '', false, 1, true);
  168. // Don't resolve it and advance to 'y1' textnode
  169. AssertTrue('#6e', r.ReadAttributeValue);
  170. AssertNodeValues('#6f', r,
  171. ntText, 3,
  172. '', '', '', '', 'y1', true, 1, true);
  173. AssertTrue('#6g', r.ReadAttributeValue);
  174. AssertNodeValues('#6h', r,
  175. ntEntityReference, 3,
  176. 'e2', '', 'e2', '', '', false, 1, true);
  177. r.ResolveEntity;
  178. AssertTrue('#6i', r.ReadAttributeValue);
  179. AssertNodeValues('#6j', r,
  180. ntText, 4,
  181. '','','','','x1', true, 1, true);
  182. AssertTrue('#6k', r.ReadAttributeValue);
  183. AssertNodeValues('#6l', r,
  184. ntEndEntity, 3,
  185. 'e2','','e2','', '', false, 1, true);
  186. AssertTrue('#7', r.ReadAttributeValue);
  187. AssertNodeValues('#8', r,
  188. ntEndEntity, 2,
  189. 'e1','','e1','', '', false, 1, true);
  190. AssertTrue('#9', r.ReadAttributeValue);
  191. AssertNodeValues('#10', r,
  192. ntText, 2,
  193. '', '', '', '', 'b', true, 1, true);
  194. AssertFalse('#11', r.ReadAttributeValue);
  195. AssertTrue('#12',r.MoveToElement);
  196. AssertNodeValues('#13', r,
  197. ntElement, 0,
  198. 'root', '', 'root', '', '', false, 1, true);
  199. end;
  200. procedure TXMLReaderTest.ReadAttributeValue2;
  201. const
  202. xml = '<!DOCTYPE root ['+
  203. '<!ELEMENT root ANY>'+
  204. '<!ENTITY e2 "x1">'+
  205. '<!ENTITY e1 "&e2;y1&e2;">]>'+
  206. '<root attr="a&e1;b"/>';
  207. begin
  208. DoTest(xml, @TestReadAttributeValue2);
  209. end;
  210. procedure TXMLReaderTest.TestDTDProperties(r: TXMLReader);
  211. begin
  212. r.Read;
  213. AssertNodeValues('#DTD',r,
  214. ntDocumentType, 0,
  215. 'root', '', 'root', '', '<!ELEMENT root ANY><!ENTITY e2 "x1"><!ENTITY e1 "&e2;y1&e2;">', True, 0, False);
  216. r.Read;
  217. AssertNodeValues('#root',r,
  218. ntElement, 0,
  219. 'root','', 'root', '', '', False,
  220. 1, True);
  221. end;
  222. procedure TXMLReaderTest.DTDProperties;
  223. const
  224. xml = '<!DOCTYPE root ['+
  225. '<!ELEMENT root ANY>'+
  226. '<!ENTITY e2 "x1">'+
  227. '<!ENTITY e1 "&e2;y1&e2;">]>'+
  228. '<root attr="a&e1;b"/>';
  229. begin
  230. DoTest(xml, @TestDTDProperties);
  231. end;
  232. procedure TXMLReaderTest.TestReadStringFromElement(r: TXMLReader);
  233. var
  234. s: XMLString;
  235. begin
  236. r.Read;
  237. s := r.ReadString;
  238. AssertEqualsW('readString.1.ret_val', ' test of ', s);
  239. AssertEqualsW('readString.1.Name', 'b', r.Name);
  240. s := r.ReadString;
  241. AssertEqualsW('readString.2.ret_val', 'mixed', s);
  242. AssertEquals('readString.2.nodeType', ntEndElement, r.NodeType);
  243. s := r.ReadString; // does not advance
  244. AssertEqualsW('readString.3.ret_val', '',s);
  245. AssertEquals('readString.3.nodeType', ntEndElement, r.NodeType);
  246. r.Read;
  247. AssertEquals('readString.4.nodeType', ntText, r.NodeType);
  248. AssertEqualsW('readString.4.Value', ' string.', r.Value);
  249. s := r.ReadString;
  250. AssertEqualsW('readString.5.ret_val', ' string. cdata string.', s);
  251. AssertEquals('readString.5.nodeType', ntEndElement, r.NodeType);
  252. end;
  253. procedure TXMLReaderTest.ReadStringFromElement;
  254. begin
  255. DoTest(xml3, @TestReadStringFromElement);
  256. end;
  257. procedure TXMLReaderTest.TestEmptyElement(r: TXMLReader);
  258. begin
  259. AssertStartDocument(r);
  260. AssertNode('#1', r, ntElement, 0,
  261. 'foo', '', 'foo', '', // name, prefix, localname, nsuri
  262. '', 0);
  263. AssertNode('#2', r, ntEndElement, 0,
  264. 'foo', '', 'foo', '',
  265. '', 0);
  266. AssertEndDocument(r);
  267. end;
  268. procedure TXMLReaderTest.EmptyElement;
  269. begin
  270. DoTest('<foo/>', @TestEmptyElement);
  271. end;
  272. procedure TXMLReaderTest.TestNestedEmptyTag(r: TXMLReader);
  273. begin
  274. AssertStartDocument(r);
  275. AssertNode('#1', r,
  276. ntElement, 0,
  277. 'foo', '', 'foo', '',
  278. '', 0);
  279. AssertNode('#2', r,
  280. ntElement, 1,
  281. 'bar', '', 'bar', '',
  282. '', 0);
  283. AssertNode('#3', r,
  284. ntEndElement, 1,
  285. 'bar', '', 'bar', '',
  286. '', 0);
  287. AssertNode('#4', r,
  288. ntEndElement, 0,
  289. 'foo', '', 'foo', '',
  290. '', 0);
  291. AssertEndDocument(r);
  292. end;
  293. procedure TXMLReaderTest.NestedEmptyTag;
  294. begin
  295. DoTest('<foo><bar/></foo>', @TestNestedEmptyTag);
  296. end;
  297. procedure TXMLReaderTest.TestNestedText(r: TXMLReader);
  298. begin
  299. AssertStartDocument(r);
  300. AssertNode('#1', r,
  301. ntElement, 0,
  302. 'foo', '', 'foo', '',
  303. '', 0);
  304. AssertNode('#2', r,
  305. ntText, 1,
  306. '', '', '', '',
  307. 'bar', 0);
  308. AssertNode('#3', r,
  309. ntEndElement, 0,
  310. 'foo', '', 'foo', '',
  311. '', 0);
  312. AssertEndDocument(r);
  313. end;
  314. procedure TXMLReaderTest.NestedText;
  315. begin
  316. DoTest('<foo>bar</foo>', @TestNestedText);
  317. end;
  318. procedure TXMLReaderTest.TestEmptyElementWithAttributes(r: TXMLReader);
  319. begin
  320. AssertStartDocument(r);
  321. AssertNode('#1', r,
  322. ntElement, 0,
  323. 'foo', '', 'foo', '',
  324. '', 4);
  325. AssertAttribute(r,
  326. 'bar', '', 'bar', '',
  327. 'baz');
  328. AssertAttribute(r,
  329. 'quux', '', 'quux', '',
  330. 'quuux');
  331. AssertAttribute(r, // non-existing attribute
  332. 'notexist', '', 'notexist', '',
  333. '');
  334. AssertAttribute(r, // non-existing prefixed attribute
  335. 'x:bar', 'x', 'bar', 'urn:xfoo',
  336. '');
  337. AssertAttribute(r,
  338. 'x:foo', 'x', 'foo', 'urn:xfoo',
  339. 'x-foo');
  340. AssertNode('#2', r,
  341. ntEndElement, 0,
  342. 'foo', '', 'foo', '',
  343. '', 0);
  344. AssertEndDocument(r);
  345. end;
  346. procedure TXMLReaderTest.EmptyElementWithAttributes;
  347. begin
  348. DoTest('<foo bar="baz" quux=''quuux'' x:foo=''x-foo'' xmlns:x = ''urn:xfoo'' />',
  349. @TestEmptyElementWithAttributes);
  350. end;
  351. procedure TXMLReaderTest.TestPIBeforeRoot(r: TXMLReader);
  352. begin
  353. AssertStartDocument(r);
  354. AssertNode('#1', r,
  355. ntProcessingInstruction, 0,
  356. 'foo', '', 'foo', '',
  357. 'bar', 0);
  358. AssertNode('#2', r,
  359. ntElement, 0,
  360. 'baz', '', 'baz', '',
  361. '', 0);
  362. AssertNode('#3', r,
  363. ntEndElement, 0,
  364. 'baz', '', 'baz', '',
  365. '', 0);
  366. AssertEndDocument(r);
  367. end;
  368. procedure TXMLReaderTest.PIBeforeRoot;
  369. begin
  370. DoTest('<?foo bar?><baz/>', @TestPIBeforeRoot);
  371. end;
  372. procedure TXMLReaderTest.TestCommentBeforeRoot(r: TXMLReader);
  373. begin
  374. AssertStartDocument(r);
  375. AssertNode('#1', r,
  376. ntComment, 0,
  377. '','','','',
  378. 'foo', 0);
  379. AssertNode('#2', r,
  380. ntElement, 0,
  381. 'bar', '', 'bar', '',
  382. '', 0);
  383. AssertNode('#3', r,
  384. ntEndElement, 0,
  385. 'bar', '', 'bar', '',
  386. '', 0);
  387. AssertEndDocument(r);
  388. end;
  389. procedure TXMLReaderTest.CommentBeforeRoot;
  390. begin
  391. DoTest('<!--foo--><bar/>', @TestCommentBeforeRoot);
  392. end;
  393. procedure TXMLReaderTest.TestCDATA(r: TXMLReader);
  394. begin
  395. AssertStartDocument(r);
  396. AssertNode('#1', r,
  397. ntElement, 0,
  398. 'foo', '', 'foo', '',
  399. '', 0);
  400. AssertNode('#2', r,
  401. ntCDATA, 1,
  402. '','','','',
  403. '<>&', 0);
  404. AssertNode('#3', r,
  405. ntEndElement, 0,
  406. 'foo', '', 'foo', '',
  407. '',0);
  408. AssertEndDocument(r);
  409. end;
  410. procedure TXMLReaderTest.CDATA;
  411. begin
  412. DoTest('<foo><![CDATA[<>&]]></foo>', @TestCDATA);
  413. end;
  414. procedure TXMLReaderTest.ChildElementInNamespace;
  415. begin
  416. DoTest('<foo:bar xmlns:foo=''http://foo/''><baz:quux xmlns:baz=''http://baz/'' /></foo:bar>', @TestChildElementInNamespace);
  417. end;
  418. procedure TXMLReaderTest.TestChildElementInNamespace(r: TXMLReader);
  419. begin
  420. AssertStartDocument(r);
  421. AssertNode('#1', r,
  422. ntElement, 0,
  423. 'foo:bar', 'foo', 'bar', 'http://foo/',
  424. '', 1);
  425. AssertAttribute(r,
  426. 'xmlns:foo', 'xmlns', 'foo', 'http://www.w3.org/2000/xmlns/',
  427. 'http://foo/');
  428. AssertEqualsW('http://foo/', r.LookupNamespace('foo'));
  429. AssertNode('#2', r,
  430. ntElement, 1,
  431. 'baz:quux', 'baz', 'quux', 'http://baz/',
  432. '', 1);
  433. AssertAttribute(r,
  434. 'xmlns:baz', 'xmlns', 'baz', 'http://www.w3.org/2000/xmlns/',
  435. 'http://baz/');
  436. AssertEqualsW('http://foo/', r.LookupNamespace ('foo'));
  437. AssertEqualsW('http://baz/', r.LookupNamespace ('baz'));
  438. AssertNode('#3', r,
  439. ntEndElement, 1,
  440. 'baz:quux', 'baz', 'quux', 'http://baz/',
  441. '', 0);
  442. AssertNode('#4', r,
  443. ntEndElement, 0,
  444. 'foo:bar', 'foo', 'bar', 'http://foo/',
  445. '', 0);
  446. AssertEqualsW('http://foo/', r.LookupNamespace('foo'));
  447. AssertNull('', r.LookupNamespace('baz'));
  448. AssertEndDocument(r);
  449. end;
  450. procedure TXMLReaderTest.TestMoveToElementFromAttribute(r: TXMLReader);
  451. begin
  452. AssertTrue(r.Read);
  453. AssertEquals(ntElement, r.NodeType);
  454. AssertTrue(r.MoveToFirstAttribute);
  455. AssertEquals(ntAttribute, r.NodeType);
  456. AssertTrue(r.MoveToElement);
  457. AssertEquals(ntElement, r.NodeType);
  458. end;
  459. procedure TXMLReaderTest.MoveToElementFromAttribute;
  460. begin
  461. DoTest('<foo bar="baz" />', @TestMoveToElementFromAttribute);
  462. end;
  463. procedure TXMLReaderTest.TestMoveToElementFromElement(r: TXMLReader);
  464. begin
  465. AssertTrue(r.Read);
  466. AssertEquals(ntElement, r.NodeType);
  467. AssertFalse(r.MoveToElement);
  468. AssertEquals(ntElement, r.NodeType);
  469. end;
  470. procedure TXMLReaderTest.MoveToElementFromElement;
  471. begin
  472. DoTest('<foo bar="baz" />', @TestMoveToElementFromElement);
  473. end;
  474. // TODO: moveToFirstAttribute_negative
  475. // moveToNextAttribute_negative
  476. procedure TXMLReaderTest.TestMoveToNextAttribute(r: TXMLReader);
  477. begin
  478. AssertStartDocument(r);
  479. AssertNode('#1', r,
  480. ntElement, 0,
  481. 'foo', '', 'foo', '',
  482. '', 2);
  483. AssertAttribute(r,
  484. 'bar', '', 'bar', '',
  485. 'baz');
  486. AssertAttribute(r,
  487. 'quux', '', 'quux', '',
  488. 'quuux');
  489. AssertTrue(r.MoveToNextAttribute);
  490. AssertEqualsW('bar', r.Name);
  491. AssertEqualsW('baz', r.Value);
  492. AssertTrue(r.MoveToNextAttribute);
  493. AssertEqualsW('quux', r.Name);
  494. AssertEqualsW('quuux', r.Value);
  495. AssertFalse(r.MoveToNextAttribute);
  496. AssertTrue(r.MoveToElement);
  497. AssertNodeValues('#1', r,
  498. ntElement, 0,
  499. 'foo','','foo','',
  500. '', False, 2, True);
  501. AssertNode('#2', r,
  502. ntEndElement, 0,
  503. 'foo','','foo','',
  504. '', 0);
  505. AssertEndDocument(r);
  506. end;
  507. procedure TXMLReaderTest.MoveToNextAttribute;
  508. begin
  509. DoTest('<foo bar="baz" quux=''quuux''/>', @TestMoveToNextAttribute);
  510. end;
  511. procedure TXMLReaderTest.TestResolveEntity(r: TXMLReader);
  512. begin
  513. r.Read; // DTD
  514. r.Read; // root
  515. r.Read; // &ent;
  516. AssertEquals('#1', ntEntityReference, r.NodeType);
  517. AssertEquals('#2', 1, r.Depth);
  518. r.ResolveEntity;
  519. // stays on entity reference
  520. AssertEquals('#3', ntEntityReference, r.NodeType);
  521. AssertEquals('#3a', 1, r.Depth);
  522. r.Read;
  523. // now advances to replacement text
  524. AssertEquals('#4', ntText, r.NodeType);
  525. AssertEquals('#5', 2, r.Depth);
  526. AssertEqualsW('#6', 'entity string', r.Value);
  527. r.Read;
  528. AssertEquals('#7', ntEndEntity, r.NodeType);
  529. AssertEquals('#8', 1, r.Depth);
  530. AssertEqualsW('#9', '', r.Value);
  531. r.Read; // &ent2;
  532. AssertEquals('#10', ntEntityReference, r.NodeType);
  533. AssertEquals('#11', 1, r.Depth);
  534. r.ResolveEntity;
  535. // stays on entity reference
  536. AssertEquals('#12', ntEntityReference, r.NodeType);
  537. AssertEquals('#12a', 1, r.Depth);
  538. // now advances to element node
  539. r.Read;
  540. AssertEquals('#13', ntElement, r.NodeType);
  541. AssertEquals('#14', 2, r.Depth);
  542. end;
  543. procedure TXMLReaderTest.ResolveEntity;
  544. const
  545. xml='<!DOCTYPE root [<!ELEMENT root (#PCDATA|foo)*>'+
  546. '<!ENTITY ent "entity string">'+
  547. '<!ENTITY ent2 "<foo/><foo/>">]>'+
  548. '<root>&ent;&ent2;</root>';
  549. begin
  550. DoTest(xml, @TestResolveEntity);
  551. end;
  552. procedure TXMLReaderTest.TestLineInfo(r: TXMLReader);
  553. var
  554. aux: IXmlLineInfo;
  555. begin
  556. if not Supports(r, IXmlLineInfo, aux) then
  557. Exit;
  558. AssertEquals('#1a', 0, aux.LineNumber);
  559. AssertEquals('#1b', 0, aux.LinePosition);
  560. r.MoveToContent;
  561. AssertEquals('#2a', 1, aux.LineNumber);
  562. AssertEquals('#2b', 2, aux.LinePosition);
  563. r.Read;
  564. AssertEquals('#3a', 1, aux.LineNumber);
  565. AssertEquals('#3b', 7, aux.LinePosition);
  566. r.Read;
  567. r.Read;
  568. // r.ReadOuterXml;
  569. AssertEquals('#4a', 1, aux.LineNumber);
  570. AssertEquals('#4b', 22, aux.LinePosition);
  571. r.Read;
  572. r.Read;
  573. // r.ReadInnerXml;
  574. AssertEquals('#5a', 1, aux.LineNumber);
  575. AssertEquals('#5b', 34, aux.LinePosition);
  576. r.Read; { now at EOF }
  577. AssertEquals('#6a', 1, aux.LineNumber);
  578. AssertEquals('#6b', 38, aux.LinePosition);
  579. r.Close;
  580. AssertEquals('#7a', 0, aux.LineNumber);
  581. AssertEquals('#7b', 0, aux.LinePosition);
  582. end;
  583. procedure TXMLReaderTest.LineInfo;
  584. begin
  585. DoTest('<all><hello></hello><bug></bug></all>', @TestLineInfo);
  586. end;
  587. initialization
  588. RegisterTest(TXMLReaderTest);
  589. end.