{********************************************************************** This file is part of the Free Component Library (FCL) Some DOM test cases adapted by hand (because automatic conversion is not yet possible for them). Copyright (c) 2001-2004 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. Copyright (c) 2009 by Sergei Gorelkin, sergei_gorelkin@mail.ru See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} unit extras2; {$mode objfpc}{$H+} interface uses SysUtils, Classes, DOM, xmlread, xmlwrite, domunit, testregistry; implementation type TDOMTestExtra2 = class(TDOMTestBase) published procedure ls3_canonicform08; procedure ls3_canonicform09; procedure ls3_canonicform10; procedure ls3_canonicform11; procedure ls3_DomWriterTest5; procedure ls3_DomWriterTest6; end; const // This is example #1 from c14n specs, but modified to comply with HTML grammar canonicform01 = ''^M^J+ ^M^J+ ''^M^J+ ^M^J+ ''^M^J+ 'canonicalform01'^M^J+ '

Hello, world!

'^M^J+ ^M^J+ ''^M^J+ ^M^J+ ''^M^J+ ^M^J+ ''^M^J; canonicform03 = ']>'^M^J+ 'canonicalform03'^M^J+ '
'^M^J+ '

'^M^J+ '
'^M^J+ '
'^M^J+ '
'^M^J+ '
'^M^J+ '
'^M^J+ '
'^M^J+ ' '^M^J+ '
'^M^J+ '
'^M^J+ '
'^M^J+ ''^M^J; { TDOMTestExtra } { test canonical form with comments } procedure TDOMTestExtra2.ls3_canonicform08; var doc: TDOMDocument; node: TDOMNode; nodeType: Integer; nodeValue: DOMString; length: Integer; begin FParser.Options.CanonicalForm := True; LoadStringData(doc, canonicform01); begin node := TDOMNode(doc).firstChild; nodeType := node.nodeType; assertEquals('PIisFirstChild', 7, nodeType); nodeValue := TDOMProcessingInstruction(node).data; length := system.length(nodeValue); assertEquals('piDataLength', 36, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('TextisSecondChild', 3, nodeType); nodeValue := node.nodeValue; length := system.length(nodeValue); assertEquals('secondChildLength', 1, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('ElementisThirdChild', 1, nodeType); node := node.nextSibling; nodeType := node.nodeType; assertEquals('TextisFourthChild', 3, nodeType); nodeValue := node.nodeValue; length := system.length(nodeValue); assertEquals('fourthChildLength', 1, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('PIisFifthChild', 7, nodeType); nodeValue := TDOMProcessingInstruction(node).data; assertEqualsW('trailingPIData', '', nodeValue); node := node.nextSibling; nodeType := node.nodeType; assertEquals('TextisSixthChild', 3, nodeType); nodeValue := node.nodeValue; length := system.length(nodeValue); assertEquals('sixthChildLength', 1, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('CommentisSeventhChild', 8, nodeType); node := node.nextSibling; nodeType := node.nodeType; assertEquals('TextisEighthChild', 3, nodeType); nodeValue := node.nodeValue; length := system.length(nodeValue); assertEquals('eighthChildLength', 1, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('CommentisNinthChild', 8, nodeType); node := node.nextSibling; assertNull('TenthIsNull', node); end; end; { test canonical form without comments } procedure TDOMTestExtra2.ls3_canonicform09; var doc: TDOMDocument; node: TDOMNode; nodeType: Integer; nodeValue: DOMString; length: Integer; begin FParser.Options.CanonicalForm := True; FParser.Options.IgnoreComments := True; LoadStringData(doc, canonicform01); begin node := TDOMNode(doc).firstChild; nodeType := node.nodeType; assertEquals('PIisFirstChild', 7, nodeType); nodeValue := TDOMProcessingInstruction(node).data; length := system.length(nodeValue); assertEquals('piDataLength', 36, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('TextisSecondChild', 3, nodeType); nodeValue := node.nodeValue; length := system.length(nodeValue); assertEquals('secondChildLength', 1, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('ElementisThirdChild', 1, nodeType); node := node.nextSibling; nodeType := node.nodeType; assertEquals('TextisFourthChild', 3, nodeType); nodeValue := node.nodeValue; length := system.length(nodeValue); assertEquals('fourthChildLength', 1, length); node := node.nextSibling; nodeType := node.nodeType; assertEquals('PIisFifthChild', 7, nodeType); nodeValue := TDOMProcessingInstruction(node).data; assertEqualsW('trailingPIData', '', nodeValue); node := node.nextSibling; assertNull('SixthIsNull', node); end; end; { test removal of superfluous namespace declarations } procedure TDOMTestExtra2.ls3_canonicform10; var doc: TDOMDocument; divList: TDOMNodeList; divEl: TDOMElement; node: TDOMNode; begin FParser.Options.CanonicalForm := True; LoadStringData(doc, canonicform03); divList := doc.getElementsByTagName('div'); TDOMNode(divEl) := divList[5]; node := divEl.getAttributeNode('xmlns'); assertNotNull('xmlnsPresent', node); node := divEl.getAttributeNode('xmlns:a'); assertNull('xmlnsANotPresent', node); end; { test that defaulted attributes are being replaced by 'normal' ones } procedure TDOMTestExtra2.ls3_canonicform11; var doc: TDOMDocument; elemList: TDOMNodeList; elem: TDOMElement; attr: TDOMAttr; attrSpecified: Boolean; attrValue: DOMString; begin FParser.Options.CanonicalForm := True; LoadStringData(doc, canonicform03); elemList := doc.getElementsByTagName('acronym'); TDOMNode(elem) := elemList[0]; attr := elem.getAttributeNode('title'); assertNotNull('titlePresent', attr); attrSpecified := attr.specified; assertTrue('titleSpecified', attrSpecified); attrValue := attr.nodeValue; assertEqualsW('titleValue', 'default', attrValue); end; { tests that namespace fixup is done while serializing } { attribute has no prefix } procedure TDOMTestExtra2.ls3_DomWriterTest5; var domImpl: TDOMImplementation; origDoc: TDOMDocument; parsedDoc: TDOMDocument; docElem: TDOMElement; stream: TStringStream; docElemLocalName: DOMString; docElemNS: DOMString; attrValue: DOMString; const namespaceURI = 'http://www.example.com/DOMWriterTest5'; begin FParser.Options.Namespaces := True; domImpl := GetImplementation; origDoc := domImpl.createDocument(namespaceURI, 'test', nil); GC(origDoc); docElem := origDoc.documentElement; docElem.setAttributeNS(namespaceURI, 'attr', 'test value'); stream := TStringStream.Create(''); GC(stream); writeXML(origDoc, stream); LoadStringData(parsedDoc, stream.DataString); docElem := parsedDoc.documentElement; docElemLocalName := docElem.localName; assertEqualsW('docElemLocalName', 'test', docElemLocalName); docElemNS := TDOMNode(docElem).namespaceURI; assertEqualsW('docElemNS', namespaceURI, docElemNS); attrValue := docElem.getAttributeNS(namespaceURI, 'attr'); assertEqualsW('properNSAttrValue', 'test value', attrValue); end; { tests that namespace fixup is done while serializing } { same as above, but using an attribute that has a prefix } procedure TDOMTestExtra2.ls3_DomWriterTest6; var domImpl: TDOMImplementation; origDoc: TDOMDocument; parsedDoc: TDOMDocument; docElem: TDOMElement; stream: TStringStream; docElemLocalName: DOMString; docElemNS: DOMString; attrValue: DOMString; const namespaceURI = 'http://www.example.com/DOMWriterTest5'; begin FParser.Options.Namespaces := True; domImpl := GetImplementation; origDoc := domImpl.createDocument(namespaceURI, 'test', nil); GC(origDoc); docElem := origDoc.documentElement; docElem.setAttributeNS(namespaceURI, 'test:attr', 'test value'); stream := TStringStream.Create(''); GC(stream); writeXML(origDoc, stream); LoadStringData(parsedDoc, stream.DataString); docElem := parsedDoc.documentElement; docElemLocalName := docElem.localName; assertEqualsW('docElemLocalName', 'test', docElemLocalName); docElemNS := TDOMNode(docElem).namespaceURI; assertEqualsW('docElemNS', namespaceURI, docElemNS); attrValue := docElem.getAttributeNS(namespaceURI, 'attr'); assertEqualsW('properNSAttrValue', 'test value', attrValue); end; initialization RegisterTest(TDOMTestExtra2); end.