DOMMemTest.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:55k
- /*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 2002 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xerces" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation, and was
- * originally based on software copyright (c) 2002, International
- * Business Machines, Inc., http://www.ibm.com . For more information
- * on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
- //
- // Various DOM tests.
- // This is NOT a complete test of DOM functionality.
- //
- /*
- * $Id: DOMMemTest.cpp,v 1.42 2003/02/05 18:55:19 tng Exp $
- */
- #include <stdio.h>
- #include <string.h>
- #include <xercesc/dom/DOM.hpp>
- #include <xercesc/util/PlatformUtils.hpp>
- #include <xercesc/util/XMLException.hpp>
- #include <xercesc/util/XMLString.hpp>
- #include <xercesc/util/XMLUniDefs.hpp>
- XERCES_CPP_NAMESPACE_USE
- bool errorOccurred = false;
- #define TASSERT(c) tassert((c), __FILE__, __LINE__)
- void tassert(bool c, const char *file, int line)
- {
- if (!c) {
- printf("Failure. Line %d, file %sn", line, file);
- errorOccurred = true;
- }
- };
- #define EXCEPTION_TEST(operation, expected_exception)
- {
- try {
- operation;
- printf(" Error: no exception thrown at line %dn", __LINE__);
- errorOccurred = true;
- }
- catch (DOMException &e) {
- if (e.code != expected_exception) {
- printf(" Wrong exception code: %d at line %dn", e.code, __LINE__);
- errorOccurred = true;
- }
- }
- catch (...) {
- printf(" Wrong exception thrown at line %dn", __LINE__);
- errorOccurred = true;
- }
- }
- // ---------------------------------------------------------------------------
- // This is a simple class that lets us do easy (though not terribly efficient)
- // trancoding of char* data to XMLCh data.
- // ---------------------------------------------------------------------------
- class XStr
- {
- public :
- // -----------------------------------------------------------------------
- // Constructors and Destructor
- // -----------------------------------------------------------------------
- XStr(const char* const toTranscode)
- {
- // Call the private transcoding method
- fUnicodeForm = XMLString::transcode(toTranscode);
- }
- ~XStr()
- {
- XMLString::release(&fUnicodeForm);
- }
- // -----------------------------------------------------------------------
- // Getter methods
- // -----------------------------------------------------------------------
- const XMLCh* unicodeForm() const
- {
- return fUnicodeForm;
- }
- private :
- // -----------------------------------------------------------------------
- // Private data members
- //
- // fUnicodeForm
- // This is the Unicode XMLCh format of the string.
- // -----------------------------------------------------------------------
- XMLCh* fUnicodeForm;
- };
- #define X(str) XStr(str).unicodeForm()
- //---------------------------------------------------------------------------------------
- //
- // DOMBasicTests Basic DOM Level 1 tests
- //
- //---------------------------------------------------------------------------------------
- void DOMBasicTests()
- {
- //
- // Test Doc01 Create a new empty document
- //
- {
- // First precondition, so that lazily created strings do not appear
- // as memory leaks.
- DOMDocument* doc;
- doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- doc->release();
- }
- //
- // Test Doc02 Create one of each kind of node using the
- // document createXXX methods.
- // Watch for memory leaks.
- //
- {
- // Do all operations in a preconditioning step, to force the
- // creation of implementation objects that are set up on first use.
- // Don't watch for leaks in this block (no / )
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* el = doc->createElement(X("Doc02Element"));
- DOMDocumentFragment* frag = doc->createDocumentFragment ();
- DOMText* text = doc->createTextNode(X("Doc02TextNode"));
- DOMComment* comment = doc->createComment(X("Doc02Comment"));
- DOMCDATASection* cdataSec = doc->createCDATASection(X("Doc02CDataSection"));
- DOMDocumentType* docType = doc->createDocumentType(X("Doc02DocumentType"));
- DOMNotation* notation = doc->createNotation(X("Doc02Notation"));
- DOMProcessingInstruction* pi = doc->createProcessingInstruction(X("Doc02PITarget"), X("Doc02PIData"));
- DOMNodeList* nodeList = doc->getElementsByTagName(X("*"));
- doc->release();
- }
- //
- // Doc03 - Create a small document tree
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* rootEl = doc->createElement(X("Doc03RootElement"));
- doc->appendChild(rootEl);
- DOMText* textNode = doc->createTextNode(X("Doc03 text stuff"));
- rootEl->appendChild(textNode);
- DOMNodeList* nodeList = doc->getElementsByTagName(X("*"));
- doc->release();
- };
- //
- // Attr01
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* rootEl = doc->createElement(X("RootElement"));
- doc->appendChild(rootEl);
- {
- DOMAttr* attr01 = doc->createAttribute(X("Attr01"));
- DOMNode* rem = rootEl->setAttributeNode(attr01);
- if (rem)
- rem->release();
- }
- {
- DOMAttr* attr02 = doc->createAttribute(X("Attr01"));
- DOMNode* rem = rootEl->setAttributeNode(attr02);
- if (rem)
- rem->release();
- }
- doc->release();
- };
- //
- // Attr02
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* rootEl = doc->createElement(X("RootElement"));
- doc->appendChild(rootEl);
- DOMAttr* attr01 = doc->createAttribute(X("Attr02"));
- DOMNode* rem = rootEl->setAttributeNode(attr01);
- if (rem)
- rem->release();
- DOMAttr* attr02 = doc->createAttribute(X("Attr02"));
- rem = rootEl->setAttributeNode(attr02);
- if (rem)
- rem->release();
- doc->release();
- }
- //
- // Attr03
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* rootEl = doc->createElement(X("RootElement"));
- doc->appendChild(rootEl);
- DOMAttr* attr01 = doc->createAttribute(X("Attr03"));
- DOMNode* rem = rootEl->setAttributeNode(attr01);
- if (rem)
- rem->release();
- attr01->setValue(X("Attr03Value1"));
- attr01->setValue(X("Attr03Value2"));
- doc->release();
- }
- //
- // Attr04
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* rootEl = doc->createElement(X("RootElement"));
- doc->appendChild(rootEl);
- DOMAttr* attr01 = doc->createAttribute(X("Attr04"));
- DOMNode* rem = rootEl->setAttributeNode(attr01);
- if (rem)
- rem->release();
- attr01->setValue(X("Attr04Value1"));
- DOMNode* value = attr01->getFirstChild();
- doc->release();
- }
- //
- // Text01
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* rootEl = doc->createElement(X("RootElement"));
- doc->appendChild(rootEl);
- DOMText* txt1 = doc->createTextNode(X("Hello Goodbye"));
- rootEl->appendChild(txt1);
- txt1->splitText(6);
- rootEl->normalize();
- doc->release();
- }
- //
- // Notation01
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMDocumentType* dt = doc->createDocumentType(X("DocType_for_Notation01"));
- doc->appendChild(dt);
- DOMNamedNodeMap* notationMap = dt->getNotations();
- DOMNotation* nt1 = doc->createNotation(X("Notation01"));
- DOMNode* rem = notationMap->setNamedItem (nt1);
- if (rem)
- rem->release();
- DOMNode* abc1 = notationMap->getNamedItem(X("Notation01"));
- DOMNotation* nt2 = (DOMNotation*) abc1;
- TASSERT(nt1==nt2);
- nt2 = 0;
- nt1 = 0;
- DOMNode* abc6 = notationMap->getNamedItem(X("Notation01"));
- nt2 = (DOMNotation*) abc6;
- doc->release();
- }
- //
- // NamedNodeMap01 - comparison operators.
- //
- {
- DOMNamedNodeMap* nnm = 0;
- TASSERT(nnm == 0);
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- nnm = doc->getAttributes(); // Should be null, because node type
- // is not Element.
- TASSERT(nnm == 0);
- TASSERT(!(nnm != 0));
- DOMElement* el = doc->createElement(X("NamedNodeMap01"));
- DOMNamedNodeMap* nnm2 = el->getAttributes(); // Should be an empty, but non-null map.
- TASSERT(nnm2 != 0);
- TASSERT(nnm != nnm2);
- nnm = nnm2;
- TASSERT(nnm == nnm2);
- doc->release();
- }
- //
- // importNode quick test
- //
- {
- DOMDocument* doc1 = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMDocument* doc2 = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* el1 = doc1->createElement(X("abc"));
- doc1->appendChild(el1);
- TASSERT(el1->getParentNode() != 0);
- DOMNode* el2 = doc2->importNode(el1, true);
- TASSERT(el2->getParentNode() == 0);
- const XMLCh* tagName = el2->getNodeName();
- TASSERT(!XMLString::compareString(tagName, X("abc")));
- TASSERT(el2->getOwnerDocument() == doc2);
- TASSERT(doc1 != doc2);
- doc1->release();
- doc2->release();
- }
- //
- // getLength() tests. Both Node CharacterData and NodeList implement
- // getLength(). Early versions of the DOM had a clash
- // between the two, originating in the implementation class
- // hirearchy, which has NodeList as a (distant) base class
- // of CharacterData. This is a regression test to verify
- // that the problem stays fixed.
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMText* tx = doc->createTextNode(X("Hello"));
- DOMElement* el = doc->createElement(X("abc"));
- el->appendChild(tx);
- int textLength = tx->getLength();
- TASSERT(textLength == 5);
- DOMNodeList* nl = tx->getChildNodes();
- int nodeListLen = nl->getLength();
- TASSERT(nodeListLen == 0);
- nl = el->getChildNodes();
- nodeListLen = nl->getLength();
- TASSERT(nodeListLen == 1);
- doc->release();
- }
- //
- // NodeList - comparison operators, basic operation.
- //
- {
- DOMNodeList* nl = 0;
- DOMNodeList* nl2 = 0;
- TASSERT(nl == 0);
- TASSERT(!(nl != 0));
- TASSERT(nl == nl2);
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- nl = doc->getChildNodes(); // Should be non-null, but empty
- TASSERT(nl != 0);
- int len = nl->getLength();
- TASSERT(len == 0);
- DOMElement* el = doc->createElement(X("NodeList01"));
- doc->appendChild(el);
- len = nl->getLength();
- TASSERT(len == 1);
- TASSERT(nl != nl2);
- nl2 = nl;
- TASSERT(nl == nl2);
- doc->release();
- }
- //
- // Name validity checking.
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- try
- {
- DOMElement* el = doc->createElement(X("!@@ bad element name"));
- TASSERT(false); // Exception above should prevent us reaching here.
- }
- catch ( DOMException e)
- {
- TASSERT(e.code == DOMException::INVALID_CHARACTER_ERR);
- }
- catch (...)
- {
- TASSERT(false); // Wrong exception thrown.
- }
- doc->release();
- }
- //
- // Assignment ops return value
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* el = doc->createElement(X("NodeList01"));
- doc->appendChild(el);
- DOMElement* n1, *n2, *n3;
- n1 = n2 = n3 = el;
- TASSERT(n1 == n2);
- TASSERT(n1 == n3);
- TASSERT(n1 == el);
- TASSERT(n1 != 0);
- n1 = n2 = n3 = 0;
- TASSERT(n1 == 0);
- doc->release();
- }
- //
- // Cloning of a node with attributes. Regression test for a ref counting
- // bug in attributes of cloned nodes that occured when the "owned" flag
- // was not set in the clone.
- //
- {
- DOMDocument* doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMElement* root = doc->createElement(X("CTestRoot"));
- root->setAttribute(X("CTestAttr"), X("CTestAttrValue"));
- const XMLCh* s = root->getAttribute(X("CTestAttr"));
- TASSERT(!XMLString::compareString(s, X("CTestAttrValue")));
- DOMNode* abc2 = root->cloneNode(true);
- DOMElement* cloned = (DOMElement*) abc2;
- DOMAttr* a = cloned->getAttributeNode(X("CTestAttr"));
- TASSERT(a != 0);
- s = a->getValue();
- TASSERT(!XMLString::compareString(s, X("CTestAttrValue")));
- a = 0;
- a = cloned->getAttributeNode(X("CTestAttr"));
- TASSERT(a != 0);
- s = a->getValue();
- TASSERT(!XMLString::compareString(s, X("CTestAttrValue")));
- doc->release();
- }
- //
- // splitText()
- // Regression test for a bug from Tinny Ng
- //
- {
- DOMDocument* doc;
- doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- DOMText* tn, *tn1, *tn2;
- tn = doc->createTextNode (X("0123456789"));
- tn1 = tn->splitText(5);
- TASSERT(!XMLString::compareString(tn->getNodeValue(), X("01234")));
- TASSERT(!XMLString::compareString(tn1->getNodeValue(), X("56789")));
- tn2 = tn->splitText(5);
- TASSERT(!XMLString::compareString(tn->getNodeValue(), X("01234")));
- TASSERT(!XMLString::compareString(tn2->getNodeValue(), XMLUni::fgZeroLenString));
- EXCEPTION_TEST(tn->splitText(6), DOMException::INDEX_SIZE_ERR);
- doc->release();
- }
- }
- //---------------------------------------------------------------------------------------
- //
- // DOMNSTests DOM Name Space tests
- //
- //---------------------------------------------------------------------------------------
- void DOMNSTests()
- {
- //
- // DOM Level 2 tests. These should be split out as a separate test.
- //
- //
- // hasFeature. The set of supported options tested here is for Xerces 1.1
- // Note: because the implementation lazily creates some of the comprison
- // strings within the implementation, this test must be pre-flighted
- // outside of the TESPROLOG/ macros to avoid spurious
- // reports of memory leaks.
- //
- // Also test the case-insensitive
- //
- {
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- TASSERT(impl->hasFeature(X("XmL"), X("2.0")) == true);
- TASSERT(impl->hasFeature(X("xML"), 0) == true);
- TASSERT(impl->hasFeature(X("xML"), XMLUni::fgZeroLenString) == true);
- TASSERT(impl->hasFeature(X("XMl"), X("1.0")) == true);
- TASSERT(impl->hasFeature(X("xMl"), X("3.0")) == false);
- TASSERT(impl->hasFeature(X("TrAveRsal"), 0) == true);
- TASSERT(impl->hasFeature(X("TrAveRsal"), XMLUni::fgZeroLenString) == true);
- }
- {
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- TASSERT(impl->hasFeature(X("XmL"), 0) == true);
- TASSERT(impl->hasFeature(X("XmL"), X("1.0")) == true);
- TASSERT(impl->hasFeature(X("XmL"), X("2.0")) == true);
- TASSERT(impl->hasFeature(X("XmL"), X("3.0")) == false);
- TASSERT(impl->hasFeature(X("Core"), 0) == true);
- TASSERT(impl->hasFeature(X("coRe"), X("1.0")) == true);
- TASSERT(impl->hasFeature(X("core"), X("2.0")) == true);
- TASSERT(impl->hasFeature(X("cORe"), X("3.0")) == true);
- TASSERT(impl->hasFeature(X("cORe"), X("4.0")) == false);
- TASSERT(impl->hasFeature(X("Traversal"), XMLUni::fgZeroLenString) == true);
- TASSERT(impl->hasFeature(X("traversal"), X("1.0")) == false);
- TASSERT(impl->hasFeature(X("TraVersal"), X("2.0")) == true);
- TASSERT(impl->hasFeature(X("Range"), 0) == true);
- TASSERT(impl->hasFeature(X("raNge"), X("1.0")) == false);
- TASSERT(impl->hasFeature(X("RaNge"), X("2.0")) == true);
- TASSERT(impl->hasFeature(X("HTML"), 0) == false);
- TASSERT(impl->hasFeature(X("Views"), XMLUni::fgZeroLenString) == false);
- TASSERT(impl->hasFeature(X("StyleSheets"), 0) == false);
- TASSERT(impl->hasFeature(X("CSS"), XMLUni::fgZeroLenString) == false);
- TASSERT(impl->hasFeature(X("CSS2"), 0) == false);
- TASSERT(impl->hasFeature(X("Events"), 0) == false);
- TASSERT(impl->hasFeature(X("UIEvents"), 0) == false);
- TASSERT(impl->hasFeature(X("MouseEvents"), 0) == false);
- TASSERT(impl->hasFeature(X("MutationEvents"), 0) == false);
- TASSERT(impl->hasFeature(X("HTMLEvents"), 0) == false);
- }
- //
- // isSupported test (similar to hasFeature)
- //
- {
- DOMDocument* doc;
- doc = DOMImplementationRegistry::getDOMImplementation(X("Core"))->createDocument();
- TASSERT(doc->isSupported(X("XmL"), 0) == true);
- TASSERT(doc->isSupported(X("XmL"), X("1.0")) == true);
- TASSERT(doc->isSupported(X("XmL"), X("2.0")) == true);
- TASSERT(doc->isSupported(X("XmL"), X("3.0")) == false);
- TASSERT(doc->isSupported(X("Core"), 0) == true);
- TASSERT(doc->isSupported(X("Core"), XMLUni::fgZeroLenString) == true);
- TASSERT(doc->isSupported(X("coRe"), X("1.0")) == true);
- TASSERT(doc->isSupported(X("core"), X("2.0")) == true);
- TASSERT(doc->isSupported(X("cORe"), X("3.0")) == true);
- TASSERT(doc->isSupported(X("cORe"), X("4.0")) == false);
- TASSERT(doc->isSupported(X("Traversal"), 0) == true);
- TASSERT(doc->isSupported(X("traversal"), X("1.0")) == false);
- TASSERT(doc->isSupported(X("TraVersal"), X("2.0")) == true);
- TASSERT(doc->isSupported(X("Range"), XMLUni::fgZeroLenString) == true);
- TASSERT(doc->isSupported(X("raNge"), X("1.0")) == false);
- TASSERT(doc->isSupported(X("RaNge"), X("2.0")) == true);
- TASSERT(doc->isSupported(X("HTML"), 0) == false);
- TASSERT(doc->isSupported(X("Views"), 0) == false);
- TASSERT(doc->isSupported(X("StyleSheets"), 0) == false);
- TASSERT(doc->isSupported(X("CSS"), 0) == false);
- TASSERT(doc->isSupported(X("CSS2"), XMLUni::fgZeroLenString) == false);
- TASSERT(doc->isSupported(X("Events"), 0) == false);
- TASSERT(doc->isSupported(X("UIEvents"), 0) == false);
- TASSERT(doc->isSupported(X("MouseEvents"), 0) == false);
- TASSERT(doc->isSupported(X("MutationEvents"), XMLUni::fgZeroLenString) == false);
- TASSERT(doc->isSupported(X("HTMLEvents"), 0) == false);
- doc->release();
- }
- //
- // CreateDocumentType
- //
- {
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- DOMDocumentType* dt = impl->createDocumentType(X("foo:docName"), X("pubId"), X("http://sysId"));
- TASSERT(dt != 0);
- TASSERT(dt->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE);
- TASSERT(!XMLString::compareString(dt->getNodeName(), X("foo:docName")));
- TASSERT(dt->getNamespaceURI() == 0);
- TASSERT(dt->getPrefix() == 0);
- TASSERT(dt->getLocalName() == 0);
- TASSERT(!XMLString::compareString(dt->getPublicId(), X("pubId")));
- TASSERT(!XMLString::compareString(dt->getSystemId(), X("http://sysId")));
- TASSERT(dt->getInternalSubset() == 0);
- TASSERT(dt->getOwnerDocument() == 0);
- DOMNamedNodeMap* nnm = dt->getEntities();
- TASSERT(nnm->getLength() == 0);
- nnm = dt->getNotations();
- TASSERT(nnm->getLength() == 0);
- // release the documentType (dt) which is an orphaned node (does not have the owner)
- dt->release();
- //
- // Qualified name without prefix should also work.
- //
- dt = impl->createDocumentType(X("docName"), X("pubId"), X("http://sysId"));
- TASSERT(dt != 0);
- TASSERT(dt->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE);
- TASSERT(!XMLString::compareString(dt->getNodeName(), X("docName")));
- TASSERT(dt->getNamespaceURI() == 0);
- TASSERT(dt->getPrefix() == 0);
- TASSERT(dt->getLocalName() == 0);
- TASSERT(!XMLString::compareString(dt->getPublicId(), X("pubId")));
- TASSERT(!XMLString::compareString(dt->getSystemId(), X("http://sysId")));
- TASSERT(dt->getInternalSubset() == 0);
- TASSERT(dt->getOwnerDocument() == 0);
- // Creating a DocumentType with invalid or malformed qName should fail.
- EXCEPTION_TEST(impl->createDocumentType(X("<docName"), X("pubId"), X("http://sysId")), DOMException::INVALID_CHARACTER_ERR);
- EXCEPTION_TEST(impl->createDocumentType(X(":docName"), X("pubId"), X("http://sysId")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(impl->createDocumentType(X("docName:"), X("pubId"), X("http://sysId")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(impl->createDocumentType(X("doc::Name"), X("pubId"), X("http://sysId")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(impl->createDocumentType(X("doc:N:ame"), X("pubId"), X("http://sysId")), DOMException::NAMESPACE_ERR);
- // release the documentType (dt) which is an orphaned node (does not have the owner)
- dt->release();
- }
- //
- // DOMImplementation::CreateDocument
- {
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- DOMDocumentType* dt = 0;
- DOMDocument* doc = impl->createDocument(XMLUni::fgZeroLenString, X("a"), dt);
- doc->getNodeName();
- doc->release();
- }
- //
- {
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- DOMDocumentType* dt = impl->createDocumentType(X("foo:docName"), X("pubId"), X("http://sysId"));
- DOMDocument* doc = impl->createDocument(X("http://document.namespace"), X("foo:docName"), dt);
- TASSERT(dt->getOwnerDocument() == doc);
- TASSERT(doc->getOwnerDocument() == 0);
- TASSERT(doc->getNodeType() == DOMNode::DOCUMENT_NODE);
- TASSERT(doc->getDoctype() == dt);
- TASSERT(!XMLString::compareString(doc->getNodeName(), X("#document")));
- TASSERT(doc->getNodeValue() == 0);
- TASSERT(doc->getNamespaceURI() == 0);
- TASSERT(doc->getPrefix() == 0);
- TASSERT(doc->getLocalName() == 0);
- DOMElement* el = doc->getDocumentElement();
- TASSERT(!XMLString::compareString(el->getLocalName(), X("docName")));
- TASSERT(!XMLString::compareString(el->getNamespaceURI(), X("http://document.namespace")));
- TASSERT(!XMLString::compareString(el->getNodeName(), X("foo:docName")));
- TASSERT(el->getOwnerDocument() == doc);
- TASSERT(el->getParentNode() == doc);
- TASSERT(!XMLString::compareString(el->getPrefix(), X("foo")));
- TASSERT(!XMLString::compareString(el->getTagName(), X("foo:docName")));
- TASSERT(el->hasChildNodes() == false);
- //
- // Creating a second document with the same docType object should fail.
- //
- try
- {
- DOMDocument* doc2 = impl->createDocument(X("pubId"), X("foo:docName"), dt);
- TASSERT(false); // should not reach here.
- }
- catch ( DOMException &e)
- {
- TASSERT(e.code == DOMException::WRONG_DOCUMENT_ERR);
- }
- catch (...)
- {
- TASSERT(false); // Wrong exception thrown.
- }
- // release the document, the documentType (dt) still has the owner, and thus no need to release
- doc->release();
- // Creating a document with null NamespaceURI and DocumentType
- doc = impl->createDocument(X("pubId"), X("foo:docName"), 0);
- doc->release();
- // Namespace tests of createDocument are covered by createElementNS below
- }
- //
- // CreateElementNS methods
- //
- {
- // Set up an initial (root element only) document.
- //
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- DOMDocumentType* dt = impl->createDocumentType(X("foo:docName"), X("pubId"), X("http://sysId"));
- DOMDocument* doc = impl->createDocument(X("http://document.namespace"), X("foo:docName"), dt);
- DOMElement* rootEl = doc->getDocumentElement();
- //
- // CreateElementNS
- //
- DOMElement* ela = doc->createElementNS(X("http://nsa"), X("a:ela")); // prefix and URI
- TASSERT(!XMLString::compareString(ela->getNodeName(), X("a:ela")));
- TASSERT(!XMLString::compareString(ela->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(ela->getPrefix(), X("a")));
- TASSERT(!XMLString::compareString(ela->getLocalName(), X("ela")));
- TASSERT(!XMLString::compareString(ela->getTagName(), X("a:ela")));
- DOMElement* elb = doc->createElementNS(X("http://nsb"), X("elb")); // URI, no prefix.
- TASSERT(!XMLString::compareString(elb->getNodeName(), X("elb")));
- TASSERT(!XMLString::compareString(elb->getNamespaceURI(), X("http://nsb")));
- TASSERT(!XMLString::compareString(elb->getPrefix(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(elb->getLocalName(), X("elb")));
- TASSERT(!XMLString::compareString(elb->getTagName(), X("elb")));
- DOMElement* elc = doc->createElementNS(XMLUni::fgZeroLenString, X("elc")); // No URI, no prefix.
- TASSERT(!XMLString::compareString(elc->getNodeName(), X("elc")));
- TASSERT(!XMLString::compareString(elc->getNamespaceURI(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(elc->getPrefix(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(elc->getLocalName(), X("elc")));
- TASSERT(!XMLString::compareString(elc->getTagName(), X("elc")));
- rootEl->appendChild(ela);
- rootEl->appendChild(elb);
- rootEl->appendChild(elc);
- // Badly formed qualified name
- EXCEPTION_TEST(doc->createElementNS(X("http://nsa"), X("<a")), DOMException::INVALID_CHARACTER_ERR);
- EXCEPTION_TEST(doc->createElementNS(X("http://nsa"), X(":a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createElementNS(X("http://nsa"), X("a:")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createElementNS(X("http://nsa"), X("a::a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createElementNS(X("http://nsa"), X("a:a:a")), DOMException::NAMESPACE_ERR);
- // xml:a must have namespaceURI == "http://www.w3.org/XML/1998/namespace"
- TASSERT(!XMLString::compareString(doc->createElementNS(X("http://www.w3.org/XML/1998/namespace"), X("xml:a"))->getNamespaceURI(), X("http://www.w3.org/XML/1998/namespace")));
- EXCEPTION_TEST(doc->createElementNS(X("http://nsa"), X("xml:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createElementNS(XMLUni::fgZeroLenString, X("xml:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createElementNS(0, X("xml:a")), DOMException::NAMESPACE_ERR);
- //unlike Attribute, xmlns (no different from foo) can have any namespaceURI for Element
- TASSERT(!XMLString::compareString(doc->createElementNS(X("http://nsa"), X("xmlns"))->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(doc->createElementNS(X("http://www.w3.org/XML/1998/namespace"), X("xmlns"))->getNamespaceURI(), X("http://www.w3.org/XML/1998/namespace")));
- TASSERT(!XMLString::compareString(doc->createElementNS(XMLUni::fgZeroLenString, X("xmlns"))->getNamespaceURI(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(doc->createElementNS(0, X("xmlns"))->getNamespaceURI(), XMLUni::fgZeroLenString));
- //unlike Attribute, xmlns:a (no different from foo:a) can have any namespaceURI for Element
- //except "" and null
- TASSERT(!XMLString::compareString(doc->createElementNS(X("http://nsa"), X("xmlns:a"))->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(doc->createElementNS(X("http://www.w3.org/XML/1998/namespace"), X("xmlns:a"))->getNamespaceURI(), X("http://www.w3.org/XML/1998/namespace")));
- EXCEPTION_TEST(doc->createElementNS(XMLUni::fgZeroLenString, X("xmlns:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createElementNS(0, X("xmlns:a")), DOMException::NAMESPACE_ERR);
- //In fact, any prefix != null should have a namespaceURI != 0 or != ""
- TASSERT(!XMLString::compareString(doc->createElementNS(X("http://nsa"), X("foo:a"))->getNamespaceURI(), X("http://nsa")));
- EXCEPTION_TEST(doc->createElementNS(XMLUni::fgZeroLenString, X("foo:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createElementNS(0, X("foo:a")), DOMException::NAMESPACE_ERR);
- //Change prefix
- DOMElement* elem = doc->createElementNS(X("http://nsa"), X("foo:a"));
- elem->setPrefix(X("bar"));
- TASSERT(!XMLString::compareString(elem->getNodeName(), X("bar:a")));
- TASSERT(!XMLString::compareString(elem->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(elem->getPrefix(), X("bar")));
- TASSERT(!XMLString::compareString(elem->getLocalName(), X("a")));
- TASSERT(!XMLString::compareString(elem->getTagName(), X("bar:a")));
- //The spec does not prevent us from setting prefix to a node without prefix
- elem = doc->createElementNS(X("http://nsa"), X("a"));
- TASSERT(!XMLString::compareString(elem->getPrefix(), XMLUni::fgZeroLenString));
- elem->setPrefix(X("bar"));
- TASSERT(!XMLString::compareString(elem->getNodeName(), X("bar:a")));
- TASSERT(!XMLString::compareString(elem->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(elem->getPrefix(), X("bar")));
- TASSERT(!XMLString::compareString(elem->getLocalName(), X("a")));
- TASSERT(!XMLString::compareString(elem->getTagName(), X("bar:a")));
- //Special case for xml:a where namespaceURI must be xmlURI
- elem = doc->createElementNS(X("http://www.w3.org/XML/1998/namespace"), X("foo:a"));
- elem->setPrefix(X("xml"));
- elem = doc->createElementNS(X("http://nsa"), X("foo:a"));
- EXCEPTION_TEST(elem->setPrefix(X("xml")), DOMException::NAMESPACE_ERR);
- //However, there is no restriction on prefix xmlns
- elem->setPrefix(X("xmlns"));
- //Also an element can not have a prefix with namespaceURI == null or ""
- elem = doc->createElementNS(0, X("a"));
- EXCEPTION_TEST(elem->setPrefix(X("foo")), DOMException::NAMESPACE_ERR);
- elem = doc->createElementNS(XMLUni::fgZeroLenString, X("a"));
- EXCEPTION_TEST(elem->setPrefix(X("foo")), DOMException::NAMESPACE_ERR);
- //Only prefix of Element and Attribute can be changed
- EXCEPTION_TEST(doc->setPrefix(X("foo")), DOMException::NAMESPACE_ERR);
- //Prefix of readonly Element can not be changed.
- //However, there is no way to create such DOMElement* for testing yet.
- // release the document, the documentType (dt) still has the owner, and thus no need to release
- doc->release();
- }
- //
- // CreateAttributeNS methods
- //
- {
- // Set up an initial (root element only) document.
- //
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- DOMDocumentType* dt = impl->createDocumentType(X("foo:docName"), X("pubId"), X("http://sysId"));
- DOMDocument* doc = impl->createDocument(X("http://document.namespace"), X("foo:docName"), dt);
- DOMElement* rootEl = doc->getDocumentElement();
- //
- // CreateAttributeNS
- //
- DOMAttr* attra = doc->createAttributeNS(X("http://nsa"), X("a:attra")); // prefix and URI
- TASSERT(!XMLString::compareString(attra->getNodeName(), X("a:attra")));
- TASSERT(!XMLString::compareString(attra->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(attra->getPrefix(), X("a")));
- TASSERT(!XMLString::compareString(attra->getLocalName(), X("attra")));
- TASSERT(!XMLString::compareString(attra->getName(), X("a:attra")));
- TASSERT(attra->getOwnerElement() == 0);
- DOMAttr* attrb = doc->createAttributeNS(X("http://nsb"), X("attrb")); // URI, no prefix.
- TASSERT(!XMLString::compareString(attrb->getNodeName(), X("attrb")));
- TASSERT(!XMLString::compareString(attrb->getNamespaceURI(), X("http://nsb")));
- TASSERT(!XMLString::compareString(attrb->getPrefix(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(attrb->getLocalName(), X("attrb")));
- TASSERT(!XMLString::compareString(attrb->getName(), X("attrb")));
- TASSERT(attrb->getOwnerElement() == 0);
- DOMAttr* attrc = doc->createAttributeNS(XMLUni::fgZeroLenString, X("attrc"));
- TASSERT(!XMLString::compareString(attrc->getNodeName(), X("attrc")));
- TASSERT(!XMLString::compareString(attrc->getNamespaceURI(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(attrc->getPrefix(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(attrc->getLocalName(), X("attrc")));
- TASSERT(!XMLString::compareString(attrc->getName(), X("attrc")));
- TASSERT(attrc->getOwnerElement() == 0);
- // Badly formed qualified name
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X("<a")), DOMException::INVALID_CHARACTER_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X(":a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X("a:")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X("a::a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X("a:a:a")), DOMException::NAMESPACE_ERR);
- // xml:a must have namespaceURI == "http://www.w3.org/XML/1998/namespace"
- TASSERT(!XMLString::compareString(doc->createAttributeNS(X("http://www.w3.org/XML/1998/namespace"), X("xml:a"))->getNamespaceURI(), X("http://www.w3.org/XML/1998/namespace")));
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X("xml:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(XMLUni::fgZeroLenString, X("xml:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(0, X("xml:a")), DOMException::NAMESPACE_ERR);
- //unlike Element, xmlns must have namespaceURI == "http://www.w3.org/2000/xmlns/"
- TASSERT(!XMLString::compareString(doc->createAttributeNS(X("http://www.w3.org/2000/xmlns/"), X("xmlns"))->getNamespaceURI(), X("http://www.w3.org/2000/xmlns/")));
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X("xmlns")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(X("http://www.w3.org/XML/1998/namespace"), X("xmlns")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(XMLUni::fgZeroLenString, X("xmlns")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(0, X("xmlns")), DOMException::NAMESPACE_ERR);
- //unlike Element, xmlns:a must have namespaceURI == "http://www.w3.org/2000/xmlns/"
- TASSERT(!XMLString::compareString(doc->createAttributeNS(X("http://www.w3.org/2000/xmlns/"), X("xmlns:a"))->getNamespaceURI(), X("http://www.w3.org/2000/xmlns/")));
- EXCEPTION_TEST(doc->createAttributeNS(X("http://nsa"), X("xmlns:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(X("http://www.w3.org/XML/1998/namespace"), X("xmlns:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(XMLUni::fgZeroLenString, X("xmlns:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(0, X("xmlns:a")), DOMException::NAMESPACE_ERR);
- //In fact, any prefix != null should have a namespaceURI != 0 or != ""
- TASSERT(!XMLString::compareString(doc->createAttributeNS(X("http://nsa"), X("foo:a"))->getNamespaceURI(), X("http://nsa")));
- EXCEPTION_TEST(doc->createAttributeNS(XMLUni::fgZeroLenString, X("foo:a")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(doc->createAttributeNS(0, X("foo:a")), DOMException::NAMESPACE_ERR);
- //Change prefix
- DOMAttr* attr = doc->createAttributeNS(X("http://nsa"), X("foo:a"));
- attr->setPrefix(X("bar"));
- TASSERT(!XMLString::compareString(attr->getNodeName(), X("bar:a")));
- TASSERT(!XMLString::compareString(attr->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(attr->getPrefix(), X("bar")));
- TASSERT(!XMLString::compareString(attr->getName(), X("bar:a")));
- //The spec does not prevent us from setting prefix to a node without prefix
- TASSERT(!XMLString::compareString(attr->getLocalName(), X("a")));
- attr = doc->createAttributeNS(X("http://nsa"), X("a"));
- TASSERT(!XMLString::compareString(attr->getPrefix(), XMLUni::fgZeroLenString));
- attr->setPrefix(X("bar"));
- TASSERT(!XMLString::compareString(attr->getNodeName(), X("bar:a")));
- TASSERT(!XMLString::compareString(attr->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(attr->getPrefix(), X("bar")));
- TASSERT(!XMLString::compareString(attr->getLocalName(), X("a")));
- TASSERT(!XMLString::compareString(attr->getName(), X("bar:a")));
- //Special case for xml:a where namespaceURI must be xmlURI
- attr = doc->createAttributeNS(X("http://www.w3.org/XML/1998/namespace"), X("foo:a"));
- attr->setPrefix(X("xml"));
- attr = doc->createAttributeNS(X("http://nsa"), X("foo:a"));
- EXCEPTION_TEST(attr->setPrefix(X("xml")), DOMException::NAMESPACE_ERR);
- //Special case for xmlns:a where namespaceURI must be xmlURI
- attr = doc->createAttributeNS(X("http://www.w3.org/2000/xmlns/"), X("foo:a"));
- attr->setPrefix(X("xmlns"));
- attr = doc->createAttributeNS(X("http://nsa"), X("foo:a"));
- EXCEPTION_TEST(attr->setPrefix(X("xmlns")), DOMException::NAMESPACE_ERR);
- //Special case for xmlns where no prefix can be set
- attr = doc->createAttributeNS(X("http://www.w3.org/2000/xmlns/"), X("xmlns"));
- EXCEPTION_TEST(attr->setPrefix(X("foo")), DOMException::NAMESPACE_ERR);
- EXCEPTION_TEST(attr->setPrefix(X("xmlns")), DOMException::NAMESPACE_ERR);
- //Also an attribute can not have a prefix with namespaceURI == null or ""
- attr = doc->createAttributeNS(XMLUni::fgZeroLenString, X("a"));
- EXCEPTION_TEST(attr->setPrefix(X("foo")), DOMException::NAMESPACE_ERR);
- attr = doc->createAttributeNS(0, X("a"));
- EXCEPTION_TEST(attr->setPrefix(X("foo")), DOMException::NAMESPACE_ERR);
- //Only prefix of Element and Attribute can be changed
- EXCEPTION_TEST(doc->setPrefix(X("foo")), DOMException::NAMESPACE_ERR);
- //Prefix of readonly Attribute can not be changed.
- //However, there is no way to create such DOMAttribute for testing yet.
- // release the document, the documentType (dt) still has the owner, and thus no need to release
- doc->release();
- }
- //
- // getElementsByTagName*
- //
- {
- // Set up an initial (root element only) document.
- //
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- DOMDocumentType* dt = impl->createDocumentType(X("foo:docName"), X("pubId"), X("http://sysId"));
- DOMDocument* doc = impl->createDocument(X("http://document.namespace"), X("foo:docName"), dt);
- DOMElement* rootEl = doc->getDocumentElement();
- //
- // Populate the document
- //
- DOMElement* ela = doc->createElementNS(X("http://nsa"), X("a:ela"));
- rootEl->appendChild(ela);
- DOMElement* elb = doc->createElementNS(X("http://nsb"), X("elb"));
- rootEl->appendChild(elb);
- DOMElement* elc = doc->createElementNS(XMLUni::fgZeroLenString, X("elc"));
- rootEl->appendChild(elc);
- DOMElement* eld = doc->createElementNS(X("http://nsa"), X("d:ela"));
- rootEl->appendChild(eld);
- DOMElement* ele = doc->createElementNS(X("http://nse"), X("elb"));
- rootEl->appendChild(ele);
- //
- // Access with DOM Level 1 getElementsByTagName
- //
- DOMNodeList* nl;
- nl = doc->getElementsByTagName(X("a:ela"));
- TASSERT(nl->getLength() == 1);
- TASSERT(nl->item(0) == ela);
- nl = doc->getElementsByTagName(X("elb"));
- TASSERT(nl->getLength() == 2);
- TASSERT(nl->item(0) == elb);
- TASSERT(nl->item(1) == ele);
- nl = doc->getElementsByTagName(X("d:ela"));
- TASSERT(nl->getLength() == 1);
- TASSERT(nl->item(0) == eld);
- //
- // Access with DOM Level 2 getElementsByTagNameNS
- //
- nl = doc->getElementsByTagNameNS(XMLUni::fgZeroLenString, X("elc"));
- TASSERT(nl->getLength() == 1);
- TASSERT(nl->item(0) == elc);
- nl = doc->getElementsByTagNameNS(0, X("elc"));
- TASSERT(nl->getLength() == 1);
- TASSERT(nl->item(0) == elc);
- nl = doc->getElementsByTagNameNS(X("http://nsa"), X("ela"));
- TASSERT(nl->getLength() == 2);
- TASSERT(nl->item(0) == ela);
- TASSERT(nl->item(1) == eld);
- nl = doc->getElementsByTagNameNS(XMLUni::fgZeroLenString, X("elb"));
- TASSERT(nl->getLength() == 0);
- nl = doc->getElementsByTagNameNS(X("http://nsb"), X("elb"));
- TASSERT(nl->getLength() == 1);
- TASSERT(nl->item(0) == elb);
- nl = doc->getElementsByTagNameNS(X("*"), X("elb"));
- TASSERT(nl->getLength() == 2);
- TASSERT(nl->item(0) == elb);
- TASSERT(nl->item(1) == ele);
- nl = doc->getElementsByTagNameNS(X("http://nsa"), X("*"));
- TASSERT(nl->getLength() == 2);
- TASSERT(nl->item(0) == ela);
- TASSERT(nl->item(1) == eld);
- nl = doc->getElementsByTagNameNS(X("*"), X("*"));
- TASSERT(nl->getLength() == 6); // Gets the document root element, plus 5 more
- TASSERT(nl->item(6) == 0);
- // TASSERT(nl->item(-1) == 0);
- nl = rootEl->getElementsByTagNameNS(X("*"), X("*"));
- TASSERT(nl->getLength() == 5);
- nl = doc->getElementsByTagNameNS(X("http://nsa"), X("d:ela"));
- TASSERT(nl->getLength() == 0);
- //
- // Node lists are Live
- //
- nl = doc->getElementsByTagNameNS(X("*"), X("*"));
- DOMNodeList* nla = ela->getElementsByTagNameNS(X("*"), X("*"));
- TASSERT(nl->getLength() == 6);
- TASSERT(nla->getLength() == 0);
- DOMNode* rem = rootEl->removeChild(elc);
- rem->release();
- TASSERT(nl->getLength() == 5);
- TASSERT(nla->getLength() == 0);
- ela->appendChild(elc);
- TASSERT(nl->getLength() == 6);
- TASSERT(nla->getLength() == 1);
- // release the document, the documentType (dt) still has the owner, and thus no need to release
- doc->release();
- }
- //
- // Attributes and NamedNodeMaps.
- //
- {
- // Set up an initial (root element only) document.
- //
- DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
- DOMDocumentType* dt = impl->createDocumentType(X("foo:docName"), X("pubId"), X("http://sysId"));
- DOMDocument* doc = impl->createDocument(X("http://document.namespace"), X("foo:docName"), dt);
- DOMElement* rootEl = doc->getDocumentElement();
- //
- // Create a set of attributes and hang them on the root element.
- //
- DOMAttr* attra = doc->createAttributeNS(X("http://nsa"), X("a:attra"));
- DOMNode* rem = rootEl->setAttributeNodeNS(attra);
- if (rem)
- rem->release();
- //
- // Check that the attribute nodes were created with the correct properties.
- //
- TASSERT(!XMLString::compareString(attra->getNodeName(), X("a:attra")));
- TASSERT(!XMLString::compareString(attra->getNamespaceURI(), X("http://nsa")));
- TASSERT(!XMLString::compareString(attra->getLocalName(), X("attra")));
- TASSERT(!XMLString::compareString(attra->getName(), X("a:attra")));
- TASSERT(attra->getNodeType() == DOMNode::ATTRIBUTE_NODE);
- TASSERT(!XMLString::compareString(attra->getNodeValue(), XMLUni::fgZeroLenString));
- TASSERT(!XMLString::compareString(attra->getPrefix(), X("a")));
- TASSERT(attra->getSpecified() == true);
- TASSERT(!XMLString::compareString(attra->getValue(), XMLUni::fgZeroLenString));
- //
- // Create a set of attributes and hang them on the root element.
- //
- DOMAttr* attrb = doc->createAttributeNS(X("http://nsb"), X("attrb"));
- rem = rootEl->setAttributeNodeNS(attrb);
- if (rem)
- rem->release();
- DOMAttr* attrc = doc->createAttributeNS(XMLUni::fgZeroLenString, X("attrc"));
- rem = rootEl->setAttributeNodeNS(attrc);
- if (rem)
- rem->release();
- // this one will replace the attra
- DOMAttr* attrd = doc->createAttributeNS(X("http://nsa"), X("d:attra"));
- rem = rootEl->setAttributeNodeNS(attrd);
- TASSERT(attra->getOwnerElement() == 0);
- if (rem)
- rem->release();
- DOMAttr* attre = doc->createAttributeNS(X("http://nse"), X("attrb"));
- rem = rootEl->setAttributeNodeNS(attre);
- if (rem)
- rem->release();
- // Test methods of NamedNodeMap
- DOMNamedNodeMap* nnm = rootEl->getAttributes();
- TASSERT(nnm->getLength() == 4);
- TASSERT(nnm->getNamedItemNS(X("http://nsa"), X("attra")) == attrd);
- TASSERT(nnm->getNamedItemNS(X("http://nsb"), X("attrb")) == attrb);
- TASSERT(nnm->getNamedItemNS(XMLUni::fgZeroLenString, X("attra")) == 0);
- TASSERT(nnm->getNamedItemNS(X("http://nsa"), X("attrb")) == 0);
- TASSERT(nnm->getNamedItemNS(X("http://nse"), X("attrb")) == attre);
- TASSERT(nnm->getNamedItemNS(XMLUni::fgZeroLenString, X("attrc")) == attrc);
- // Test hasAttributes, hasAttribute, hasAttributeNS
- TASSERT(doc->hasAttributes() == false);
- TASSERT(attrc->hasAttributes() == false);
- TASSERT(rootEl->hasAttributes() == true);
- TASSERT(rootEl->hasAttribute(X("attrc")) == true);
- TASSERT(rootEl->hasAttribute(X("wrong")) == false);
- TASSERT(rootEl->hasAttributeNS(X("http://nsa"), X("attra")) == true);
- TASSERT(rootEl->hasAttributeNS(X("http://nsa"), X("wrong")) == false);
- // release the document, the documentType (dt) still has the owner, and thus no need to release
- doc->release();
- }
- //
- //
- //
- }
- //---------------------------------------------------------------------------------------
- //
- // DOMReleaseTests Test if the release() function
- //
- //---------------------------------------------------------------------------------------
- void DOMReleaseTests()
- {
- XMLCh tempStr[4000];
- XMLCh tempStr2[4000];
- XMLCh tempStr3[4000];
- XMLString::transcode("status", tempStr, 3999);
- XMLString::transcode("true", tempStr2, 3999);
- XMLString::transcode("root", tempStr3, 3999);
- //create document
- DOMDocument* cpXMLDocument;
- cpXMLDocument = DOMImplementation::getImplementation()->createDocument();
- //create root element
- DOMElement* cpRoot = cpXMLDocument->createElement(tempStr3);
- //create status attribute
- cpRoot->setAttribute(tempStr,tempStr2);
- DOMAttr* pAttr = cpRoot->getAttributeNode(tempStr);
- //simulate setting the attribute value
- // The setValue and setAttribute should call release internally so that
- // the overall memory usage is not increased
- int i = 0;
- for(i=0;i<20000;i++)
- {
- pAttr->setValue(tempStr2);
- }
- for(i=0;i<20000;i++)
- {
- //same problem
- cpRoot->removeAttribute(tempStr);
- cpRoot->setAttribute(tempStr,tempStr2);
- }
- //simulate changing node value
- // the overall memory usage is not increased
- char tempchar[4000];
- for(i=0;i<20000;i++)
- {
- sprintf(tempchar, "time is %in",XMLPlatformUtils::getCurrentMillis());
- int len = strlen(tempchar);
- for (int j = len; j < 4000-len; j++)
- tempchar[j] = 'a';
- pAttr->setNodeValue(X(tempchar));
- }
- DOMText* text = cpXMLDocument->createTextNode(tempStr3);
- for(i=0;i<20000;i++)
- {
- sprintf(tempchar, "time is %in",XMLPlatformUtils::getCurrentMillis());
- int len = strlen(tempchar);
- for (int j = len; j < 4000-len; j++)
- tempchar[j] = 'a';
- text->setNodeValue(X(tempchar));
- }
- cpXMLDocument->release();
- }
- //---------------------------------------------------------------------------------------
- //
- // main
- //
- //---------------------------------------------------------------------------------------
- int mymain()
- {
- try {
- XMLPlatformUtils::Initialize();
- }
- catch (const XMLException& toCatch) {
- char *pMessage = XMLString::transcode(toCatch.getMessage());
- fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). n"
- " Message is: %sn", pMessage);
- XMLString::release(&pMessage);
- return -1;
- }
- DOMBasicTests();
- DOMNSTests();
- DOMReleaseTests();
- //
- // Print Final allocation stats for full set of tests
- //
- XMLPlatformUtils::Terminate();
- return 0;
- };
- int main() {
- for (int i = 0; i<3; i++)
- mymain();
- if (errorOccurred) {
- printf("Test Failedn");
- return 4;
- }
- printf("Test Run Successfullyn");
- return 0;
- }