extras.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. {**********************************************************************
  2. This file is part of the Free Component Library (FCL)
  3. DOM Test cases which are missing from w3.org test suite
  4. Copyright (c) 2008 by Sergei Gorelkin, [email protected]
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit extras;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. SysUtils, Classes, DOM, xmlread, xmlwrite, domunit, testregistry;
  16. implementation
  17. type
  18. TDOMTestExtra = class(TDOMTestBase)
  19. published
  20. procedure attr_ownership01;
  21. procedure attr_ownership02;
  22. procedure attr_ownership03;
  23. procedure attr_ownership04;
  24. procedure nsFixup1;
  25. procedure nsFixup2;
  26. procedure nsFixup3;
  27. end;
  28. { TDOMTestExtra }
  29. // verify that an attribute created by Element.SetAttribute()
  30. // has its OwnerElement assigned properly
  31. procedure TDOMTestExtra.attr_ownership01;
  32. var
  33. doc: TDOMDocument;
  34. el: TDOMElement;
  35. attr: TDOMAttr;
  36. attrOwner: TDOMElement;
  37. begin
  38. LoadStringData(doc, '<doc/>');
  39. el := doc.CreateElement('element1');
  40. el.SetAttribute('newAttr', 'newValue');
  41. attr := el.GetAttributeNode('newAttr');
  42. AssertNotNull('attribute', attr);
  43. attrOwner := attr.OwnerElement;
  44. AssertEquals('ownerElement', el, attrOwner);
  45. AssertTrue('specified', attr.Specified);
  46. end;
  47. // verify that an attribute created by Element.SetAttributeNS()
  48. // has its OwnerElement assigned properly
  49. procedure TDOMTestExtra.attr_ownership02;
  50. var
  51. doc: TDOMDocument;
  52. el: TDOMElement;
  53. attr: TDOMAttr;
  54. attrOwner: TDOMElement;
  55. begin
  56. LoadStringData(doc, '<doc/>');
  57. el := doc.CreateElement('element1');
  58. el.SetAttributeNS('http://www.freepascal.org', 'fpc:newAttr', 'newValue');
  59. attr := el.GetAttributeNodeNS('http://www.freepascal.org', 'newAttr');
  60. AssertNotNull('attribute', attr);
  61. attrOwner := attr.OwnerElement;
  62. AssertEquals('ownerElement', el, attrOwner);
  63. AssertTrue('specified', attr.Specified);
  64. end;
  65. // verify that NamedNodeMap.SetNamedItem() resets OwnerElement
  66. // of the attribute being replaced
  67. procedure TDOMTestExtra.attr_ownership03;
  68. var
  69. doc: TDOMDocument;
  70. el: TDOMElement;
  71. attr, attr2: TDOMAttr;
  72. retNode: TDOMNode;
  73. begin
  74. LoadStringData(doc, '<doc/>');
  75. el := doc.CreateElement('element1');
  76. attr := doc.CreateAttribute('newAttr');
  77. el.SetAttributeNode(attr);
  78. AssertEquals('ownerElement_before', el, attr.OwnerElement);
  79. attr2 := doc.CreateAttribute('newAttr');
  80. retNode := el.Attributes.SetNamedItem(attr2);
  81. AssertSame('retNode', attr, retNode);
  82. AssertNull('ownerElement_after', attr.OwnerElement);
  83. AssertEquals('ownerElement2', el, attr2.OwnerElement);
  84. end;
  85. // verify that NamedNodeMap.SetNamedItemNS() resets OwnerElement
  86. // of the attribute being replaced
  87. procedure TDOMTestExtra.attr_ownership04;
  88. var
  89. doc: TDOMDocument;
  90. el: TDOMElement;
  91. attr, attr2: TDOMAttr;
  92. retNode: TDOMNode;
  93. begin
  94. LoadStringData(doc, '<doc/>');
  95. el := doc.CreateElement('element1');
  96. attr := doc.CreateAttributeNS('http://www.freepascal.org', 'fpc:newAttr');
  97. el.SetAttributeNodeNS(attr);
  98. AssertEquals('ownerElement_before', el, attr.OwnerElement);
  99. attr2 := doc.CreateAttributeNS('http://www.freepascal.org', 'fpc:newAttr');
  100. retNode := el.Attributes.SetNamedItemNS(attr2);
  101. AssertSame('retNode', attr, retNode);
  102. AssertNull('ownerElement_after', attr.OwnerElement);
  103. AssertEquals('ownerElement2', el, attr2.OwnerElement);
  104. end;
  105. const
  106. nsURI1 = 'http://www.example.com/ns1';
  107. nsURI2 = 'http://www.example.com/ns2';
  108. // verify the namespace fixup with two nested elements
  109. // (same localName, different nsURI, and no prefixes)
  110. procedure TDOMTestExtra.nsFixup1;
  111. var
  112. domImpl: TDOMImplementation;
  113. origDoc: TDOMDocument;
  114. parsedDoc: TDOMDocument;
  115. docElem: TDOMElement;
  116. el: TDOMElement;
  117. stream: TStringStream;
  118. list: TDOMNodeList;
  119. begin
  120. FParser.Options.Namespaces := True;
  121. domImpl := GetImplementation;
  122. origDoc := domImpl.createDocument(nsURI1, 'test', nil);
  123. GC(origDoc);
  124. docElem := origDoc.documentElement;
  125. el := origDoc.CreateElementNS(nsURI2, 'test');
  126. docElem.AppendChild(el);
  127. stream := TStringStream.Create('');
  128. GC(stream);
  129. writeXML(origDoc, stream);
  130. LoadStringData(parsedDoc, stream.DataString);
  131. docElem := parsedDoc.documentElement;
  132. assertEquals('docElemLocalName', 'test', docElem.localName);
  133. assertEquals('docElemNS', nsURI1, docElem.namespaceURI);
  134. list := docElem.GetElementsByTagNameNS(nsURI2, '*');
  135. assertEquals('ns2_elementCount', 1, list.Length);
  136. el := TDOMElement(list[0]);
  137. assertEquals('ns2_nodeName', 'test', el.nodeName);
  138. end;
  139. // verify the namespace fixup with two nested elements
  140. // (same localName, different nsURI, different prefixes)
  141. procedure TDOMTestExtra.nsFixup2;
  142. var
  143. domImpl: TDOMImplementation;
  144. origDoc: TDOMDocument;
  145. parsedDoc: TDOMDocument;
  146. docElem: TDOMElement;
  147. el: TDOMElement;
  148. stream: TStringStream;
  149. list: TDOMNodeList;
  150. begin
  151. FParser.Options.Namespaces := True;
  152. domImpl := GetImplementation;
  153. origDoc := domImpl.createDocument(nsURI1, 'a:test', nil);
  154. GC(origDoc);
  155. docElem := origDoc.documentElement;
  156. el := origDoc.CreateElementNS(nsURI2, 'b:test');
  157. docElem.AppendChild(el);
  158. stream := TStringStream.Create('');
  159. GC(stream);
  160. writeXML(origDoc, stream);
  161. LoadStringData(parsedDoc, stream.DataString);
  162. docElem := parsedDoc.documentElement;
  163. assertEquals('docElemLocalName', 'test', docElem.localName);
  164. assertEquals('docElemNS', nsURI1, docElem.namespaceURI);
  165. list := docElem.GetElementsByTagNameNS(nsURI2, '*');
  166. assertEquals('ns2_elementCount', 1, list.Length);
  167. el := TDOMElement(list[0]);
  168. assertEquals('ns2_nodeName', 'b:test', el.nodeName);
  169. end;
  170. // verify the namespace fixup with two nested elements and an attribute
  171. // attribute's prefix must change to that of document element
  172. procedure TDOMTestExtra.nsFixup3;
  173. var
  174. domImpl: TDOMImplementation;
  175. origDoc: TDOMDocument;
  176. parsedDoc: TDOMDocument;
  177. docElem: TDOMElement;
  178. el: TDOMElement;
  179. stream: TStringStream;
  180. list: TDOMNodeList;
  181. attr: TDOMAttr;
  182. begin
  183. FParser.Options.Namespaces := True;
  184. domImpl := GetImplementation;
  185. origDoc := domImpl.createDocument(nsURI1, 'a:test', nil);
  186. GC(origDoc);
  187. docElem := origDoc.documentElement;
  188. el := origDoc.CreateElementNS(nsURI2, 'b:test');
  189. docElem.AppendChild(el);
  190. el.SetAttributeNS(nsURI1, 'test:attr', 'test value');
  191. stream := TStringStream.Create('');
  192. GC(stream);
  193. writeXML(origDoc, stream);
  194. LoadStringData(parsedDoc, stream.DataString);
  195. docElem := parsedDoc.documentElement;
  196. assertEquals('docElemLocalName', 'test', docElem.localName);
  197. assertEquals('docElemNS', nsURI1, docElem.namespaceURI);
  198. list := docElem.GetElementsByTagNameNS(nsURI2, '*');
  199. assertEquals('ns2_elementCount', 1, list.Length);
  200. el := TDOMElement(list[0]);
  201. attr := el.GetAttributeNodeNS(nsURI1, 'attr');
  202. assertEquals('attr_nodeName', 'a:attr', attr.nodeName);
  203. end;
  204. initialization
  205. RegisterTest(TDOMTestExtra);
  206. end.