DTest.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:78k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: DTest.cpp,v $
  58.  * Revision 1.15  2001/12/07 01:46:40  tng
  59.  * [Bug 1959] setNodeValue throws exception when spec specifies NOP.
  60.  *
  61.  * Revision 1.14  2001/11/23 20:44:10  tng
  62.  * Solaris Forte C++ core dump when handling this long condition check; so break it into smaller check to bypass this compiler problem.
  63.  *
  64.  * Revision 1.13  2000/08/30 22:21:44  andyh
  65.  * Unix Build script fixes.  Clean up some UNIX compiler warnings.
  66.  *
  67.  * Revision 1.12  2000/05/15 23:08:59  andyh
  68.  * Remove entity tests, which failed because entity nodes are (correctly)
  69.  * read-only.
  70.  *
  71.  * Revision 1.11  2000/04/19 02:25:18  aruna1
  72.  * Full support for DOM_EntityReference, DOM_Entity and DOM_DocumentType introduced
  73.  *
  74.  * Revision 1.10  2000/03/11 03:00:24  chchou
  75.  * Fix bug # 18, remove set method of readonly attributes.
  76.  * As a result, remove related test cases
  77.  *
  78.  * Revision 1.9  2000/03/02 19:55:45  roddey
  79.  * This checkin includes many changes done while waiting for the
  80.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  81.  * available elsewhere.
  82.  *
  83.  * Revision 1.8  2000/02/29 02:19:13  rahulj
  84.  * No more compilation errors under HPUX 11.0. We do not build
  85.  * DOMMemTest as it crashes the aCC compiler.
  86.  *
  87.  * Revision 1.7  2000/02/06 07:48:36  rahulj
  88.  * Year 2K copyright swat.
  89.  *
  90.  * Revision 1.6  2000/02/04 05:46:31  andyh
  91.  * Change offsets and lengths form signed to unsigned
  92.  *
  93.  * Revision 1.5  2000/02/04 01:50:13  aruna1
  94.  * TreeWalker and NodeIterator changes
  95.  *
  96.  * Revision 1.4  2000/01/29 00:39:09  andyh
  97.  * Redo synchronization in DOMStringHandle allocator.  There
  98.  * was a bug in the use of Compare and Swap.  Switched to mutexes.
  99.  *
  100.  * Changed a few plain deletes to delete [].
  101.  *
  102.  * Revision 1.3  2000/01/19 21:40:58  andyh
  103.  * Remove a few remaining dependencies on the (now defunct)
  104.  * XML StdOut stream.
  105.  *
  106.  * Revision 1.2  1999/12/03 00:02:25  andyh
  107.  * DOM tests updated to catch DOMException by ref.
  108.  * Added tests of DOMString::transcode() and append()
  109.  *
  110.  * Revision 1.1.1.1  1999/11/09 01:02:34  twl
  111.  * Initial checkin
  112.  *
  113.  * Revision 1.2  1999/11/08 20:42:24  rahul
  114.  * Swat for adding in Product name and CVS comment log variable.
  115.  *
  116.  */
  117. /**
  118.  * This class tests methods for XML DOM implementation
  119.  * version 2.0 10/12/98
  120.  *
  121.  * DOM_DOMException errors are tested by calls to DOMExceptionsTest from: Main, docBuilder...
  122.  *
  123.  */
  124. #include <stdio.h>
  125. #include "DTest.h"
  126. #include <util/PlatformUtils.hpp>
  127. #include <util/XMLException.hpp>
  128. #include <util/XMLString.hpp>
  129. #define EXCEPTIONSTEST(operation, expectedException, resultFlag, testNum) 
  130.     {                                                               
  131.         try                                                         
  132.         {                                                           
  133.             operation;                                              
  134.             fprintf(stderr, "Exceptions Test # %d: no Exception thrown.n", testNum); 
  135.         }                                                           
  136.         catch (DOM_DOMException &e)                                 
  137.         {                                                           
  138.             if (e.code != expectedException) {                      
  139.                 fprintf(stderr, "Exceptions Test # %d: wrong DOM_DOMException thrown.n", 
  140.                     testNum);                                       
  141.                 resultFlag = false;                                 
  142.             }                                                       
  143.         }                                                           
  144.         catch (...)                                                 
  145.         {                                                           
  146.             fprintf(stderr, "Exceptions Test # %d: unknown exception thrown.n",    
  147.                 testNum);                                           
  148.             resultFlag = false;                                     
  149.         }                                                           
  150.     }
  151. #define LEAKTEST(operation)                             
  152. {                                                       
  153.     operation;   /* Precondition  */                    
  154.     DomMemDebug entryMemState;                          
  155.     {                                                   
  156.         operation;                                      
  157.     }                                                   
  158.     DomMemDebug exitMemState;                           
  159.     if (entryMemState != exitMemState)                  
  160.     {                                                   
  161.         printf("Memory Leak at line %dn", __LINE__);   
  162.         exitMemState.printDifference(entryMemState);    
  163.     }                                                   
  164. }
  165. DOM_Element                 DTest::testElementNode;
  166. DOM_Attr                    DTest::testAttributeNode;
  167. DOM_Text                    DTest::testTextNode;
  168. DOM_CDATASection            DTest::testCDATASectionNode;
  169. DOM_EntityReference         DTest::testEntityReferenceNode;
  170. DOM_Entity                  DTest::testEntityNode;
  171. DOM_ProcessingInstruction   DTest::testProcessingInstructionNode;
  172. DOM_Comment                 DTest::testCommentNode;
  173. DOM_Document                DTest::testDocumentNode;
  174. DOM_DocumentType            DTest::testDocumentTypeNode;
  175. DOM_DocumentFragment        DTest::testDocumentFragmentNode;
  176. DOM_Notation                DTest::testNotationNode;
  177. /**
  178.  *
  179.  * version 2.0 10/12/98
  180.  *
  181.  */
  182. DTest::DTest()
  183. {
  184. };
  185. /**
  186.  * version 3.0 01/25/99
  187.  *
  188.  * @return DOM_Document
  189.  *
  190.  */
  191. DOM_Document DTest::createDocument() {
  192.     return DOM_Document::createDocument();
  193. };
  194. /**
  195.  * version 3.0 01/25/99
  196.  *
  197.  * @return DOM_DocumentType
  198.  * @param name DOMString
  199.  *
  200.  */
  201. DOM_DocumentType DTest::createDocumentType(DOM_Document doc, DOMString name) {
  202.     return doc.createDocumentType(name);    //Replace with a DOM_DocumentType creator
  203. };
  204. /**
  205.  * version 3.0 01/25/99
  206.  *
  207.  * @return org.w3c.dom.DOM_Entity
  208.  * @param doc org.w3c.dom.DOM_Document
  209.  * @param name DOMString
  210.  *
  211.  */
  212. DOM_Entity DTest::createEntity(DOM_Document doc, DOMString name) {
  213.     return doc.createEntity(name);
  214. };
  215. /**
  216.  * version 3.0 01/25/99
  217.  *
  218.  * @return org.w3c.dom.DOM_Notation
  219.  * @param doc org.w3c.dom.DOM_Document
  220.  * @param name DOMString
  221.  *
  222.  */
  223. DOM_Notation DTest::createNotation(DOM_Document doc, DOMString name) {
  224.     return doc.createNotation(name);
  225. };
  226. /**
  227.  * This method builds test documents for the XML DOM implementation
  228.  * version 2.0 10/12/98
  229.  * @param document org.w3c.dom.DOM_Document
  230.  * @param name document's name
  231.  * @param type document's type
  232.  *
  233.  */
  234. void DTest::docBuilder(DOM_Document document, DOMString name)
  235. {
  236.     DOM_Document doc = document;
  237.     bool OK = true;
  238.     DOM_Element docFirstElement = doc.createElement(name + "FirstElement");
  239.     doc.appendChild(docFirstElement);
  240.     docFirstElement.setAttribute(name + "FirstElement", name + "firstElement");
  241.     DOM_ProcessingInstruction docProcessingInstruction = doc.createProcessingInstruction(name +
  242.                     "TargetProcessorChannel", DOMString("This is ") + doc.getNodeName() + "'s processing instruction");
  243.     docFirstElement.appendChild(docProcessingInstruction);
  244.     DOM_Element docBody = doc.createElement(name + "TestBody");
  245.     docFirstElement.appendChild(docBody);
  246.     DOM_Element docBodyLevel21 = doc.createElement(name + "BodyLevel21");
  247.     DOM_Element docBodyLevel22 = doc.createElement(name + "BodyLevel22");
  248.     DOM_Element docBodyLevel23 = doc.createElement(name + "BodyLevel23");
  249.     DOM_Element docBodyLevel24 = doc.createElement(name + "BodyLevel24");
  250.     docBody.appendChild(docBodyLevel21);
  251.     docBody.appendChild(docBodyLevel22);
  252.     docBody.appendChild(docBodyLevel23);
  253.     docBody.appendChild(docBodyLevel24);
  254.     DOM_Element docBodyLevel31 = doc.createElement(name + "BodyLevel31");
  255.     DOM_Element docBodyLevel32 = doc.createElement(name + "BodyLevel32");
  256.     DOM_Element docBodyLevel33 = doc.createElement(name + "BodyLevel33");
  257.     DOM_Element docBodyLevel34 = doc.createElement(name + "BodyLevel34");
  258.     docBodyLevel21.appendChild(docBodyLevel31);
  259.     docBodyLevel21.appendChild(docBodyLevel32);
  260.     docBodyLevel22.appendChild(docBodyLevel33);
  261.     docBodyLevel22.appendChild(docBodyLevel34);
  262.     DOM_Text docTextNode11 = doc.createTextNode(name + "BodyLevel31'sChildTextNode11");
  263.     DOM_Text docTextNode12 = doc.createTextNode(name + "BodyLevel31'sChildTextNode12");
  264.     DOM_Text docTextNode13 = doc.createTextNode(name + "BodyLevel31'sChildTextNode13");
  265.     DOM_Text docTextNode2 = doc.createTextNode(name + "TextNode2");
  266.     DOM_Text docTextNode3 = doc.createTextNode(name + "TextNode3");
  267.     DOM_Text docTextNode4 = doc.createTextNode(name + "TextNode4");
  268.     docBodyLevel31.appendChild(docTextNode11);
  269.     docBodyLevel31.appendChild(docTextNode12);
  270.     docBodyLevel31.appendChild(docTextNode13);
  271.     docBodyLevel32.appendChild(docTextNode2);
  272.     docBodyLevel33.appendChild(docTextNode3);
  273.     docBodyLevel34.appendChild(docTextNode4);
  274.     DOM_CDATASection docCDATASection = doc.createCDATASection("<![CDATA[<greeting>Hello, world!</greeting>]]>");
  275.     docBodyLevel23.appendChild(docCDATASection);
  276.     DOM_Comment docComment = doc.createComment("This should be a comment of some kind ");
  277.     docBodyLevel23.appendChild(docComment);
  278.     DOM_EntityReference docReferenceEntity = doc.createEntityReference("ourEntityNode");
  279.     docBodyLevel24.appendChild(docReferenceEntity);
  280.     DTest make;
  281.     DOM_Notation docNotation = make.createNotation(doc, "ourNotationNode");
  282.     DOM_Node abc1 = doc.getFirstChild();
  283.     DOM_DocumentType docType = (DOM_DocumentType &) abc1;
  284.     docType.getNotations().setNamedItem(docNotation);
  285.     DOM_DocumentFragment docDocFragment = doc.createDocumentFragment();
  286. //  printf("This document's first element name is " + docFirstElement.getTagName() + "n");
  287. //***********Following are for errorTests
  288.     DOM_Text docNode3 = doc.createTextNode(name + "docTextNode3");
  289.     DOM_Text docNode4 = doc.createTextNode(name + "docTextNode4");
  290.     DOM_Node  abc2 =  doc.getDoctype().getEntities().getNamedItem("ourEntityNode"); // Get the DOM_Entity node
  291.     DOM_Entity docEntity = (DOM_Entity &) abc2;
  292.     DOM_Node  abc3 = doc.getFirstChild(); // Get the DOM_DocumentType node
  293.     DOM_DocumentType docDocType = (DOM_DocumentType &) abc3;
  294.     DOM_Node  abc4 = doc.getLastChild().getLastChild().getLastChild().getFirstChild();
  295.     DOM_EntityReference & entityReferenceText = (DOM_EntityReference &) abc4;
  296.     DOM_Text entityReferenceText2 = doc.createTextNode("entityReferenceText information");
  297. //************************************************* ERROR TESTS
  298.     DTest tests;
  299.     EXCEPTIONSTEST(document.appendChild(docBody), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK,  1);
  300.     EXCEPTIONSTEST(document.appendChild(docBody), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 2);
  301.     EXCEPTIONSTEST(docNode3.appendChild(docNode4), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 3);
  302.     // EXCEPTIONSTEST(doc.insertBefore(docEntity, docFirstElement), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 4);
  303.     EXCEPTIONSTEST(doc.replaceChild(docCDATASection, docFirstElement), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 5);
  304.     // The following setNodeValue tests are not invalid
  305.     // According to DOM spec, exception is raised only if the node is readonly, otherwise should be no-op.
  306.     // EXCEPTIONSTEST(docFirstElement.setNodeValue("This shouldn't work!" ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 6);
  307.     EXCEPTIONSTEST(docReferenceEntity.setNodeValue("This shouldn't work!" ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 7);
  308.     // The following setNodeValue tests are not invalid
  309.     // According to DOM spec, exception is raised only if the node is readonly, otherwise should be no-op.
  310.     // EXCEPTIONSTEST(docEntity.setNodeValue("This shouldn't work!" ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 8);
  311.     // EXCEPTIONSTEST(doc.setNodeValue("This shouldn't work!" ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 9);
  312.     // EXCEPTIONSTEST(docDocType.setNodeValue("This shouldn't work!" ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 10);
  313.     // EXCEPTIONSTEST(docDocFragment.setNodeValue("This shouldn't work!" ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 11);
  314.     // EXCEPTIONSTEST(docNotation.setNodeValue("This shouldn't work!" ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 12);
  315.     EXCEPTIONSTEST(docReferenceEntity.appendChild(entityReferenceText2 ), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR , OK, 13);
  316.     EXCEPTIONSTEST(docBodyLevel32.insertBefore(docTextNode11,docBody ), DOM_DOMException::NOT_FOUND_ERR, OK, 14);
  317.     EXCEPTIONSTEST(docBodyLevel32.removeChild(docFirstElement), DOM_DOMException::NOT_FOUND_ERR, OK, 15);
  318.     EXCEPTIONSTEST(docBodyLevel32.replaceChild(docTextNode11,docFirstElement ), DOM_DOMException::NOT_FOUND_ERR, OK, 16);
  319. //!! Throws a NOT_FOUND_ERR ********
  320.      // docBodyLevel32.getAttributes().removeNamedItem(testAttribute.getName());    16  // To test removeNamedItem
  321. };  //END OF DOCBUILDER
  322. /**
  323.  * @param document org.w3c.dom.DOM_Document
  324.  */
  325.  void DTest::findTestNodes(DOM_Document document) {
  326.     DOM_Node node = document;
  327.     int nodeCount = 0;
  328.     // Walk the tree until you find and assign all node types needed that exist.
  329.     while (node != null && nodeCount < 12)
  330.     {
  331.         switch (node.getNodeType())
  332.     {
  333.         case DOM_Node::ELEMENT_NODE :
  334.             if (testElementNode == null) {testElementNode = (DOM_Element &)node; nodeCount++;}
  335.             break;
  336.         case DOM_Node::ATTRIBUTE_NODE :
  337.             if (testAttributeNode == null) {testAttributeNode = (DOM_Attr &)node; nodeCount++;}
  338.             break;
  339.         case DOM_Node::TEXT_NODE :
  340.             if (testTextNode == null) {testTextNode = (DOM_Text &)node; nodeCount++;}
  341.             break;
  342.         case DOM_Node::CDATA_SECTION_NODE :
  343.             if (testCDATASectionNode == null) {testCDATASectionNode = (DOM_CDATASection &)node; nodeCount++;}
  344.             break;
  345.         case DOM_Node::ENTITY_REFERENCE_NODE :
  346.             if (testEntityReferenceNode == null) {testEntityReferenceNode = (DOM_EntityReference &)node; nodeCount++;}
  347.             break;
  348.         case DOM_Node::ENTITY_NODE :
  349.             if (testEntityNode == null) {testEntityNode = (DOM_Entity &)node; nodeCount++;}
  350.             break;
  351.         case DOM_Node::PROCESSING_INSTRUCTION_NODE :
  352.             if (testProcessingInstructionNode == null) {testProcessingInstructionNode = (DOM_ProcessingInstruction &)node; nodeCount++;}
  353.             break;
  354.         case DOM_Node::COMMENT_NODE :
  355.             if (testCommentNode == null) {testCommentNode = (DOM_Comment &)node; nodeCount++;}
  356.             break;
  357.         case DOM_Node::DOCUMENT_TYPE_NODE :
  358.             if (testDocumentTypeNode == null) {testDocumentTypeNode = (DOM_DocumentType &)node; nodeCount++;}
  359.             break;
  360.         case DOM_Node::DOCUMENT_FRAGMENT_NODE :
  361.             if (testDocumentFragmentNode == null) {testDocumentFragmentNode = (DOM_DocumentFragment &)node; nodeCount++;}
  362.             break;
  363.         case DOM_Node::NOTATION_NODE :
  364.             if (testNotationNode == null) {testNotationNode = (DOM_Notation &)node; nodeCount++;}
  365.             break;
  366.         case DOM_Node::DOCUMENT_NODE :
  367.             if (testDocumentNode == null) {testDocumentNode = (DOM_Document &)node; nodeCount++;}
  368.             break;
  369.         default:
  370.             ;
  371.     }// End of switch
  372.     }   // End of while
  373. };
  374. /**
  375.  * @param document org.w3c.dom.DOM_Document
  376.  */
  377.  void DTest::findTestNodes(DOM_Node node) {
  378.     DTest test;
  379.     DOM_Node kid;
  380.     // Walk the tree until you find and assign all node types needed that exist.
  381.     if (node.getFirstChild() != null)
  382.     {
  383.         kid = node.getFirstChild();
  384.         test.findTestNodes(kid);
  385.     }
  386.     if (node.getNextSibling() != null)
  387.     {
  388.         kid = node.getNextSibling();
  389.         test.findTestNodes(kid);
  390.     }
  391.     switch (node.getNodeType())
  392.     {
  393.         case DOM_Node::ELEMENT_NODE :
  394.             if (testElementNode == null) {testElementNode = (DOM_Element &)node; }
  395.             break;
  396.         case DOM_Node::ATTRIBUTE_NODE :
  397.             if (testAttributeNode == null) {testAttributeNode = (DOM_Attr &)node; }
  398.             break;
  399.         case DOM_Node::TEXT_NODE :
  400.             if (testTextNode == null) {testTextNode = (DOM_Text &)node; }
  401.             break;
  402.         case DOM_Node::CDATA_SECTION_NODE :
  403.             if (testCDATASectionNode == null) {testCDATASectionNode = (DOM_CDATASection &)node; }
  404.             break;
  405.         case DOM_Node::ENTITY_REFERENCE_NODE :
  406.             if (testEntityReferenceNode == null) {testEntityReferenceNode = (DOM_EntityReference &)node;}
  407.             break;
  408.         case DOM_Node::ENTITY_NODE :
  409.             if (testEntityNode == null) {testEntityNode = (DOM_Entity &)node;}
  410.             break;
  411.         case DOM_Node::PROCESSING_INSTRUCTION_NODE :
  412.             if (testProcessingInstructionNode == null) {testProcessingInstructionNode = (DOM_ProcessingInstruction &)node;}
  413.             break;
  414.         case DOM_Node::COMMENT_NODE :
  415.             if (testCommentNode == null) {testCommentNode = (DOM_Comment &)node;}
  416.             break;
  417.         case DOM_Node::DOCUMENT_TYPE_NODE :
  418.             if (testDocumentTypeNode == null) {testDocumentTypeNode = (DOM_DocumentType &)node; }
  419.             break;
  420.         case DOM_Node::DOCUMENT_FRAGMENT_NODE :
  421.             if (testDocumentFragmentNode == null) {testDocumentFragmentNode = (DOM_DocumentFragment &)node;}
  422.             break;
  423.         case DOM_Node::NOTATION_NODE :
  424.             if (testNotationNode == null) {testNotationNode = (DOM_Notation &)node;}
  425.             break;
  426.         case DOM_Node::DOCUMENT_NODE :
  427.             if (testDocumentNode == null) {testDocumentNode = (DOM_Document &)node;}
  428.             break;
  429.         default:
  430.             ;
  431.     }// End of switch
  432. };//End of class
  433. /**
  434.  *
  435.  * version 2.0 10/12/98
  436.  *
  437.  */
  438.  int main(int argc, char **argv)
  439.  {
  440.      {
  441.          //  Nest entire test in an inner block.
  442.          //     Reference counting should recover all document
  443.          //     storage when this block exits.
  444.          DTest test;
  445.          try {
  446.              XMLPlatformUtils::Initialize();
  447.          }
  448.          catch (const XMLException& toCatch) {
  449.              char *pMessage = XMLString::transcode(toCatch.getMessage());
  450.              fprintf(stderr, "Error during initialization! n  %s n", pMessage);
  451.              delete [] pMessage;
  452.              return -1;
  453.          }
  454.          long avgTime = 0;
  455.          bool OK = true;
  456.          long startTime = 0;//****************Time the whole thing for efficiency of DOM implementation
  457.          // for (int i=0; i< 1000; i++)
  458.          // {
  459.          // AH Revisit  //  startTime = System.currentTimeMillis();
  460.          //     if(!OK)
  461.          //     break;
  462.          DOM_Document d = test.createDocument();
  463.          // DOM_Document z = test.createDocument();
  464.          DOM_DocumentType docDocType = test.createDocumentType(d,"testDocument1");
  465.          d.appendChild(docDocType);
  466.          DOM_Entity docEntity = test.createEntity( d, "ourEntityNode");
  467.          //Build a branch for entityReference tests
  468.          // DOM_Text entityChildText = d.createTextNode("entityChildText information"); //
  469.          // docEntity.appendChild(entityChildText);
  470.          // docDocType.getEntities().setNamedItem(docEntity);
  471.          test.docBuilder(d, "d");
  472.          test.findTestNodes((DOM_Node)d);
  473.          // test.docBuilder(z, "z");
  474.          // try {
  475.          LEAKTEST(test.testAttr(d););
  476.          LEAKTEST(test.testCDATASection(d););
  477.          LEAKTEST(test.testCharacterData(d););
  478.          LEAKTEST(test.testChildNodeList(d););
  479.          LEAKTEST(test.testComment(d););
  480.          LEAKTEST(test.testDeepNodeList(d););
  481.          LEAKTEST(test.testDocument(d););
  482.          LEAKTEST(test.testDocumentFragment(d););
  483.          LEAKTEST(test.testDocumentType(d););
  484.          LEAKTEST(test.testDOMImplementation(d););
  485.          LEAKTEST(test.testElement(d););
  486. //       LEAKTEST(test.testEntity(d););      // Can not test entities;  only parser can create them.
  487.          LEAKTEST(test.testEntityReference(d););
  488.          LEAKTEST(test.testNode(d););
  489.          LEAKTEST(test.testNotation(d););
  490.          LEAKTEST(test.testPI(d););
  491.          LEAKTEST(test.testText(d););
  492.          LEAKTEST(test.testDOMerrors(d););
  493.          //!! Throws WRONG_DOCUMENT_ERR **********
  494.          // z.appendChild(d.createComment("Test doc d comment"));// Tries to append z document with document d comment
  495.          // d.getDocumentElement().appendChild(z.createElement("newZdocElement"));// Tries to append d document with document z DOM_Element
  496.          // d.getLastChild().getLastChild().insertBefore(z.createElement("newZdocElement"),d.getLastChild().getLastChild().getFirstChild());// Tries to insert into d document with document z DOM_Element
  497.          // d.replaceChild(z.createElement("newZdocElement"),d.getLastChild().getLastChild().getFirstChild());  // Tries to replace in d document with document z DOM_Element
  498.          /* Attribute newAttribute = d.createAttribute("newAttribute");
  499.          d.getDocumentElement().setAttributeNode(newAttribute);
  500.          d.getDocumentElement().getAttributes().setNamedItem(z.createAttribute("newzAttribute"));
  501.          */
  502.          //!! Throws INVALID_CHARACTER_ERR **********
  503.          // ******This just gets us through each method. JKess has a comprehensive test of Invalid Names******
  504.          // d.createAttribute("Invalid Name"); // Name with blank space
  505.          // d.createElement("5InvalidName"); // Name starts with numeric
  506.          // d.createProcessingInstruction("This is the target processor channel","InvalidName>");// Name ends with >
  507.          // d.getDocumentElement().setAttribute("Invalid%Name",""); // Name contains %
  508.          //!!   ******** NO_DATA_ALLOWED_ERR ********No cases to test as of 9/15
  509.          //!!   ******** NO_MODIFICATION_ALLOWED_ERR ******** When read only exists
  510.          /*
  511.                // **** FOR DOM_Element when read only exists********
  512.                .removeAttribute("aString");        // ***** Not until read only exists.
  513.                .removeAttributeNode(Attribute);        // ***** Not until read only exists.
  514.                .setAttribute("aString", "anotherString"); // ***** Not until read only exists.
  515.                    // **** FOR DOM_Node when read only exists********
  516.                    .appendChild(aNode);         // ***** Not until read only exists.
  517.                    .insertBefore(aNode, AnotherNode);   // ***** Not until read only exists.
  518.                    .removeChild(aNode);         // ***** Not until read only exists.
  519.                    .replaceChild(aNode);            // ***** Not until read only exists.
  520.                      .splitText(2); // ***** Not until read only exists.
  521.                        .setNamedItem(DOM_Node); // ***** Not until read only exists.
  522.          */
  523.          //!!******** NOT_SUPPORTED_ERR ********For HTML when implemented
  524.          /*
  525.          .createCDATASection("String stuff");
  526.          .createEntityReference("String stuff");
  527.          .createProcessingInstruction("String stuff", "Some more String stuff");
  528.          */
  529.          // } catch (DOM_DOMException &e) {
  530.          //     fprintf(stderr, "Unexpected DOM Exception caught.  Code is: %dn", e.code);
  531.          //     OK = false;
  532.          // }
  533.          //    catch (...) {
  534.          //        fprintf(stderr, "Unexpected non-DOM exception caught.");
  535.          //    };
  536.          //System.err.println("Elapsed time (measured in seconds): " +   ((System.currentTimeMillis() - startTime) / 1000.0));
  537.          // AH revisit avgTime += System.currentTimeMillis() - startTime;
  538.          // }//END OF FOR
  539.          // System.err.println("Elapsed time (measured in seconds): " +
  540.          //                    ((System.currentTimeMillis() - startTime) / 1000.0));
  541.          //       System.err.println("Elapsed time (measured in mili-seconds): " +
  542.          //                    ((System.currentTimeMillis() - startTime)));
  543.          // System.err.println("Average Elapsed time (measured in seconds): " + (avgTime/10000000.0) );
  544.          // Null out the static object references in class DTest,
  545.          // which will recover their storage.  Part of testing for memory leaks.
  546.          DTest::testElementNode = null;
  547.          DTest::testAttributeNode = null;
  548.          DTest::testTextNode = null;
  549.          DTest::testCDATASectionNode = null;
  550.          DTest::testEntityReferenceNode = null;
  551.          DTest::testEntityNode = null;
  552.          DTest::testProcessingInstructionNode = null;
  553.          DTest::testCommentNode = null;
  554.          DTest::testDocumentNode = null;
  555.          DTest::testDocumentTypeNode = null;
  556.          DTest::testDocumentFragmentNode = null;
  557.          DTest::testNotationNode = null;
  558.     };
  559.     XMLPlatformUtils::Terminate();
  560.     DomMemDebug().print();
  561.     return 0;
  562. };
  563. /**
  564.  * This method tests DOM_Attr methods for the XML DOM implementation
  565.  * version 2.0 10/12/98
  566.  * @param document org.w3c.dom.DOM_Document
  567.  *
  568.  */
  569. void DTest::testAttr(DOM_Document document)
  570. {
  571.     DOM_Node node;
  572.     DOM_Attr attributeNode, attribute2;
  573.     DOMString compare;
  574.     bool T = true;
  575.     bool F = false;
  576.     bool OK = true;
  577. // For debugging*****   printf("n          testAttr's outputs:nn");
  578.     DOM_Attr testAttribute = document.createAttribute("testAttribute");
  579.     testAttribute.setValue("testAttribute's value");
  580.     node = document.getDocumentElement(); // node gets first element
  581.     // ((DOM_Element &)node).setAttributeNode(testAttribute);
  582.     // attributeNode = ((DOM_Element &)node).getAttributeNode("testAttribute");
  583.     DOM_Element el = (DOM_Element &)node;
  584.     el.setAttributeNode(testAttribute);
  585.     attributeNode = el.getAttributeNode("testAttribute");
  586.     compare = "testAttribute";
  587.     if (!compare.equals(attributeNode.getName()))
  588.     {
  589.         printf("Warning!!! DOM_Attr's 'getName' method failed to work properly!n");
  590.         OK = false;
  591.     }
  592.     compare = "testAttribute's value";
  593.     if (!compare.equals(attributeNode.getNodeValue()))
  594.     {
  595.         printf("Warning!!! DOM_Attr's 'getNodeValue' method failed to work properly!n");
  596.         OK = false;
  597.     }
  598.     if (! T ==attributeNode.getSpecified())
  599.     {
  600.         printf("Warning!!! DOM_Attr's 'getSpecified' method failed to work properly!n");
  601.         OK = false;
  602.     }
  603.     if (!compare.equals(attributeNode.getValue()))
  604.     {
  605.         printf("Warning!!! DOM_Attr's 'getValue' method failed to work properly!n");
  606.         OK = false;
  607.     }
  608.     attributeNode.setNodeValue("Reset Value");   /// LEAK!!!!!
  609.     compare = "Reset Value";
  610.     if (!compare.equals(attributeNode.getNodeValue()))
  611.     {
  612.         printf("Warning!!! DOM_Attr's 'setNodeValue' method failed to work properly!n");
  613.         OK = false;
  614.     }
  615.     attributeNode.setValue(null);
  616.     if (! attributeNode.getValue().equals(""))
  617.     {
  618.         printf("Warning!!! DOM_Attr's 'setValue' to 'null' method failed to work properly!n");
  619.         OK = false;
  620.     }
  621.     attributeNode.setValue("Another value ");
  622.     compare = "Another value ";
  623.     if (!compare.equals(attributeNode.getValue()))
  624.     {
  625.         printf("Warning!!! DOM_Attr's 'setValue' method failed to work properly!");
  626.         OK = false;
  627.     }
  628.     node = attributeNode.cloneNode(T);
  629.     // Check nodes for equality, both their name and value or lack thereof
  630.     bool cloneOK = true;
  631.     if (!(node.getNodeName().equals(attributeNode.getNodeName())))
  632.         cloneOK = false;
  633.     if (node.getNodeValue() == null &&
  634.         attributeNode.getNodeValue() != null)
  635.     {
  636.         attributeNode.getNodeValue().print();
  637.         cloneOK = false;
  638.     }
  639.     if (node.getNodeValue() != null && attributeNode.getNodeValue() == null)
  640.     {
  641.         cloneOK = false;
  642.         node.getNodeValue().print();
  643.     };
  644.     if (node.getNodeValue() != null && attributeNode.getNodeValue() != null)
  645.     {
  646.         if (!(node.getNodeValue().equals(attributeNode.getNodeValue())))
  647.             cloneOK = false;
  648.     }
  649. /*
  650.     if (! (node.getNodeName().equals(attributeNode.getNodeName()) &&         // Compares node names for equality
  651.           (node.getNodeValue() != null && attributeNode.getNodeValue() != null)  // Checks to make sure each node has a value node
  652.         ?  node.getNodeValue().equals(attributeNode.getNodeValue())          // If both have value nodes test those value nodes for equality
  653.         : (node.getNodeValue() == null && attributeNode.getNodeValue() == null)))// If one node doesn't have a value node make sure both don't
  654. */
  655.     if (cloneOK == false)
  656.         {
  657.             printf("'cloneNode' did not clone the Attribute node correctlyn");
  658.             OK = false;
  659.         }
  660.         // Deep clone test comparison is in testNode & testDocument
  661. //************************************************* ERROR TESTS
  662.     DTest tests;
  663. //!! Throws HIERARCHY_REQUEST_ERR ****************
  664.     //  doc.getDocumentElement().appendChild(attributeNode);
  665. //!! Throws a NOT_FOUND_ERR ********
  666.     //  attribute2 = doc.createAttribute("testAttribute2");
  667.     //  doc.getDocumentElement().removeAttributeNode(attribute2);
  668. //!! Throws an INUSE_ATTRIBUTE_ERR ******
  669.     //  DOM_Element element = (DOM_Element &)doc.getLastChild().getLastChild();
  670.     //  element.setAttributeNode(testAttribute );// Tests setNamedItem which generates error through justSetNamedItem.
  671. // For debugging*****       printf("All DOM_Attr method calls worked correctly.n");
  672.     if (! OK)
  673.         printf("n*****The DOM_Attr method calls listed above failed, all others worked correctly.*****n");
  674. //  printf("");
  675. };
  676. /**
  677.  * This method tests DOM_CDATASection methods for the XML DOM implementation
  678.  * version 2.0 10/12/98
  679.  * @param document org.w3c.dom.DOM_Document
  680.  *
  681.  */
  682. void DTest::testCDATASection(DOM_Document document)
  683. {
  684.     DOM_Node node, node2;
  685.     bool T = true;
  686.     bool OK = true;
  687. // For debugging*****   printf("n          testCDATASection's outputs:n");
  688.     node = document.getDocumentElement().getElementsByTagName("dBodyLevel23").item(0).getFirstChild(); // node gets DOM_CDATASection node
  689.     node2 = node.cloneNode(T);//*****?
  690.     // Check nodes for equality, both their name and value or lack thereof
  691.     if (! (node.getNodeName().equals(node2.getNodeName()) &&        // Compares node names for equality
  692.           (node.getNodeValue() != null && node2.getNodeValue() != null)     // Checks to make sure each node has a value node
  693.         ?  node.getNodeValue().equals(node2.getNodeValue())         // If both have value nodes test those value nodes for equality
  694.         : (node.getNodeValue() == null && node2.getNodeValue() == null)))   // If one node doesn't have a value node make sure both don't
  695.     {
  696.         printf("'cloneNode' did not clone the DOM_CDATASection node correctlyn");
  697.         OK = false;
  698.     }
  699.     // Deep clone test comparison is in testNode & testDocument
  700. // For debugging*****   printf("All DOM_CDATASection method calls worked correctly.n");
  701.     if (! OK)
  702.         printf("n*****The DOM_CDATASection method calls listed above failed, all others worked correctly.*****n");
  703. //  printf("");
  704. };
  705. /**
  706.  * This method tests DOM_CharacterData methods for the XML DOM implementation
  707.  * version 2.0 10/12/98
  708.  * @param document org.w3c.dom.DOM_Document
  709.  *
  710.  */
  711. void DTest::testCharacterData(DOM_Document document)
  712. {
  713.     DOM_CharacterData charData;
  714.     DOMString compareData, newData, resetData;
  715.     bool OK = true;
  716. // For debugging*****   printf("n          testCharacterData's outputs:n");
  717.     DOM_Node abc1 = document.getDocumentElement().getElementsByTagName("dBodyLevel31").item(0).getFirstChild(); // charData gets textNode11
  718.     charData = (DOM_CharacterData &) abc1;
  719.     compareData = "dBodyLevel31'sChildTextNode11";
  720.     if (!compareData.equals(charData.getData()))
  721.     {
  722.         printf("Warning!!! DOM_CharacterData's 'getData' failed to work properly!n This may corrupt other DOM_CharacterData tests!!!*****n");
  723.         OK = false;
  724.     }
  725.     resetData = charData.getData();
  726.     //  printf("This node's original data is: " + charData.getData());
  727.     newData = " This is new data for this node";
  728.     compareData = charData.getData() + newData;
  729.     charData.appendData(newData);
  730.     if (!compareData.equals(charData.getData()))
  731.     {
  732.         printf("Warning!!! DOM_CharacterData's 'appendData' failed to work properly!n");
  733.         OK = false;
  734.     }
  735.     //  printf("This node's appended data is: " + charData.getData());
  736.     compareData = "dBodyLevel";
  737.     charData.deleteData(10, 100);
  738.     if (!compareData.equals(charData.getData()))
  739.     {
  740.         printf("Warning!!! DOM_CharacterData's 'deleteData' failed to work properly!n");
  741.         OK = false;
  742.     }
  743.     //  printf("This node's partially deleted data is: " + charData.getData());
  744.     unsigned int length = 10;
  745.     if (!(length == charData.getLength()))
  746.     {
  747.         printf("Warning!!! DOM_CharacterData's 'getLength' failed to work properly!n");
  748.         OK = false;
  749.     }
  750.     //  printf("This node's data length is: " + charData.getLength());
  751.     compareData = "dBody' This is data inserted into this node'Level";
  752.     charData.insertData(5, "' This is data inserted into this node'");
  753.     if (!compareData.equals(charData.getData()))
  754.     {
  755.         printf("Warning!!! DOM_CharacterData's 'insertData' failed to work properly!n");
  756.         OK = false;
  757.     }
  758.     //  printf("This node's updated with insert data is: " + charData.getData());
  759.     compareData = "dBody' This is ' replacement data'ted into this node'Level";
  760.     charData.replaceData(15, 10, "' replacement data'");
  761.     if (!compareData.equals(charData.getData()))
  762.     {
  763.         printf("Warning!!! DOM_CharacterData's 'replaceData' failed to work properly!n");
  764.         OK = false;
  765.     }
  766.     //  printf("This node's updated with replacement data is: " +charData.getData());
  767.     compareData = "New data A123456789B123456789C123456789D123456789E123456789";
  768.     charData.setData("New data A123456789B123456789C123456789D123456789E123456789");
  769.     if (!compareData.equals(charData.getData()))
  770.     {
  771.         printf("Warning!!! DOM_CharacterData's 'setData' failed to work properly!");
  772.         OK = false;
  773.     }
  774.     //  printf("This node's new data via setData: " + charData.getData());
  775.     compareData = "123456789D123456789E123456789";
  776.     if (!compareData.equals(charData.substringData(30, 30)))
  777.     {
  778.         printf("Warning!!! DOM_CharacterData's 'substringData' failed to work properly!n");
  779.         OK = false;
  780.     }
  781.     //  printf("Using subString 30,30 you get:");  charData.substringData(30,30)).print();
  782.     compareData = "New data A123456789B12345";
  783.     if (!compareData.equals(charData.substringData(0, 25)))
  784.     {
  785.         printf("Warning!!! DOM_CharacterData's 'substringData' failed to work properly!n");
  786.         OK = false;
  787.     }
  788.     //  printf("Using subString 0,25 you get: ");   charData.substringData(0,25)).print();
  789. //************************************************* ERROR TESTS
  790.     DTest tests;   // What is this for?  'tests' is never used.
  791. //!! Throws INDEX_SIZE_ERR ********************
  792.     EXCEPTIONSTEST(charData.deleteData(-1, 5), DOM_DOMException::INDEX_SIZE_ERR, OK, 101 );
  793.     // Test 102 is not an error because the -1 parameter is an unsigned value, and counts
  794.     //   that exceed the length of the string are allowed.
  795. //    EXCEPTIONSTEST(charData.deleteData(2, -1), DOM_DOMException::INDEX_SIZE_ERR, OK, 102 );
  796.     EXCEPTIONSTEST(charData.deleteData(100, 5), DOM_DOMException::INDEX_SIZE_ERR, OK,103 );
  797. //can't set negative unsigned int in c++ compiler
  798.   //  EXCEPTIONSTEST(charData.insertData(-1, "Stuff inserted"), DOM_DOMException::INDEX_SIZE_ERR, OK, 104 );
  799.     EXCEPTIONSTEST(charData.insertData(100,"Stuff inserted"), DOM_DOMException::INDEX_SIZE_ERR, OK, 105 );
  800.   //  EXCEPTIONSTEST(charData.replaceData(-1, 5, "Replacement stuff") , DOM_DOMException::INDEX_SIZE_ERR, OK, 106 );
  801.     EXCEPTIONSTEST(charData.replaceData(100, 5 ,"Replacement stuff"), DOM_DOMException::INDEX_SIZE_ERR, OK, 107 );
  802.   //  EXCEPTIONSTEST(charData.replaceData(2, -1, "Replacement stuff"), DOM_DOMException::INDEX_SIZE_ERR,  OK, 108 );
  803.     EXCEPTIONSTEST(charData.substringData(-1, 5), DOM_DOMException::INDEX_SIZE_ERR, OK, 109 );
  804.     EXCEPTIONSTEST(charData.substringData(100, 5), DOM_DOMException::INDEX_SIZE_ERR, OK, 110 );
  805.  //   EXCEPTIONSTEST(charData.substringData(2, -1), DOM_DOMException::INDEX_SIZE_ERR, OK, 111 );
  806. //!! Throws NO_MODIFICATION_ALLOWED_ERR ********
  807. // Since user cannot add children to Entity and EntityReference Nodes this test can't be done.
  808. #if 0
  809.     DOM_Node abc8 = document.getDocumentElement().getElementsByTagName("dBodyLevel24").
  810.         item(0).getFirstChild().getChildNodes().item(0); // node gets ourEntityReference node's child text
  811.     DOM_Text node = (DOM_Text &) abc8;
  812.     EXCEPTIONSTEST(node.appendData("new data"), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 112 );
  813.     EXCEPTIONSTEST(node.deleteData(5, 10), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 113 );
  814.     EXCEPTIONSTEST(node.insertData(5, "Stuff inserted"), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 114 );
  815.     EXCEPTIONSTEST(node.replaceData(5, 10, "Replacementstuff"), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 115 );
  816.     EXCEPTIONSTEST(node.setData("New setdata stuff"), DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 116 );
  817. #endif
  818. // For debugging*****       printf("All DOM_CharacterData method calls worked correctly.n");
  819.     if (!OK)
  820.         printf("n*****The DOM_CharacterData method calls listed above failed, all others worked correctly.*****n");
  821.     charData.setData(resetData); // reset node to original data
  822. //  printf(""n);
  823. };
  824. /**
  825.  * This method tests ChildNodeList methods for the XML DOM implementation
  826.  * version 2.0 10/12/98
  827.  * @param document org.w3c.dom.DOM_Document
  828.  *
  829.  */
  830. void DTest::testChildNodeList(DOM_Document document)
  831. {
  832.     DOM_Node node, node2;
  833.     bool OK = true;
  834. // For debugging*****   printf("n          testChildNodeList's outputs:n");
  835.     node = document.getDocumentElement().getLastChild(); // node gets doc's testBody element
  836.     if (!(node.getChildNodes().getLength()== 4))
  837.         OK = false;
  838.     node2 = node.getChildNodes().item(2);
  839.     if (! node2.getNodeName().equals("dBodyLevel23"))
  840.         OK = false;
  841. // For debugging*****       printf("All ChildNodeList method calls worked correctly.n");
  842.     if (!OK)
  843.         printf("n*****The ChildNodeList method calls listed above failed, all others worked correctly.*****n");
  844. //  printf("");
  845. };
  846. /**
  847.  * This method tests DOM_Comment methods for the XML DOM implementation
  848.  * version 1.0 10/12/98
  849.  * @param document org.w3c.dom.DOM_Document
  850.  *
  851.  */
  852. void DTest::testComment(DOM_Document document)
  853. {
  854.     DOM_Node node, node2;
  855.     bool T = true;
  856.     bool OK = true;
  857. // For debugging*****   printf("n          testComment's outputs:n");
  858.     node = document.getDocumentElement().getElementsByTagName("dBodyLevel31").item(0).getFirstChild(); // node gets textNode11
  859.     node2 = node.cloneNode(T);
  860.     // Check nodes for equality, both their name and value or lack thereof
  861.     if (!(node.getNodeName().equals(node2.getNodeName()) &&         // Compares node names for equality
  862.           (node.getNodeValue() != null && node2.getNodeValue() != null)     // Checks to make sure each node has a value node
  863.         ?  node.getNodeValue().equals(node2.getNodeValue())         // If both have value nodes test those value nodes for equality
  864.         : (node.getNodeValue() == null && node2.getNodeValue() == null)))   // If one node doesn't have a value node make sure both don't
  865.         //printf("'cloneNode' did not clone the DOM_Comment node correctlyn");
  866.         OK = false;
  867.     // Deep clone test comparison is in testNode & testDocument
  868.     if (OK)
  869. // For debugging*****       printf("All DOM_Comment method calls worked correctly.n");
  870.     if (!OK)
  871.         printf("n*****The DOM_Comment method calls listed above failed, all others worked correctly.*****n");
  872. //  printf("n");
  873. };
  874. /**
  875.  * This method tests DeepNodeList methods for the XML DOM implementation
  876.  * version 2.0 10/12/98
  877.  * @param document org.w3c.dom.DOM_Document
  878.  *
  879.  */
  880. void DTest::testDeepNodeList(DOM_Document document)
  881. {
  882.     DOM_Node node, node2;
  883.     bool OK = true;
  884. // For debugging*****   printf("n          testDeepNodeList's outputs:nn");
  885.     node = document.getLastChild().getLastChild(); // node gets docBody element
  886. //  DOM_Element el = (DOM_Element &)node;
  887. //  DOM_NodeList nl = el.getElementsByTagName("*");
  888. //  int len = nl.getLength();
  889. //  if (len != 8)
  890.   if (!(8 == ((DOM_Element &) node).getElementsByTagName("*").getLength()))
  891.         {
  892.             printf ("Warning!!! DeepNodeList's 'getLength' failed to work properly!n");
  893.             OK = false;
  894.         }
  895.     node2 = ((DOM_Element &) node).getElementsByTagName("*").item(2); //This also runs through 'nextMatchingElementAfter"
  896.     if (! node2.getNodeName().equals("dBodyLevel32"))
  897.         {
  898.             printf ("Warning!!! DeepNodeList's 'item' (or DOM_Element's 'getElementsBy TagName)failed to work properly!n");
  899.             OK = false;
  900.         }
  901.     node2 = document.getLastChild();
  902.     if (! ((DOM_Element &) node2).getElementsByTagName("dTestBody").item(0).getNodeName().equals("dTestBody"))//This also runs through 'nextMatchingElementAfter"
  903.         {
  904.             printf ("Warning!!! DeepNodeList's 'item' (or DOM_Element's 'getElementsBy TagName)failed to work properly!n");
  905.             OK = false;
  906.         }
  907. // For debugging*****       printf("All DeepNodeList method calls worked correctly.n");
  908.     if (!OK)
  909.         printf("n*****The DeepNodeList method calls listed above failed, all others worked correctly.*****n");
  910. //  printf("");
  911. };
  912. /**
  913.  * This method tests DOM_Document methods for the XML DOM implementation
  914.  * version 2.0 10/12/98
  915.  * @param document org.w3c.dom.DOM_Document
  916.  *
  917.  *
  918.  **** ALL DOM_Document create methods are run in docBuilder except createAttribute which is in testAttribute**
  919.  */
  920. void DTest::testDocument(DOM_Document document)
  921. {
  922.     DTest make;
  923.     DOM_DocumentFragment docFragment, docFragment2;
  924.     DOM_Element newElement;
  925.     DOM_Node node, node2;
  926.     DOMString elementNames[] =  {"dFirstElement", "dTestBody", "dBodyLevel21","dBodyLevel31","dBodyLevel32",
  927.                    "dBodyLevel22","dBodyLevel33","dBodyLevel34","dBodyLevel23","dBodyLevel24"};
  928.     DOMString newElementNames[] = {"dFirstElement", "dTestBody", "dBodyLevel22","dBodyLevel33","dBodyLevel34","dBodyLevel23"};
  929.     bool result;
  930.     bool OK = true;
  931. // For debugging*****   printf("n          testDocument's outputs:n n");
  932.     DOM_DocumentType checkDocType =  make.createDocumentType(document,"testDocument1");
  933.     DOM_DocumentType docType = document.getDoctype();
  934.     if (! checkDocType.getNodeName().equals(docType.getNodeName() ))
  935.     {
  936.         printf("Warning!!! DOM_Document's 'getDocType method failed!n" );
  937.         OK = false;
  938.     }
  939.     if (!checkDocType.getNodeValue().equals(docType.getNodeValue()))
  940.     {
  941.         printf("Warning!!! DOM_Document's 'getDocType method failed!n" );
  942.         OK = false;
  943.     }
  944.     /*
  945.     if (! (checkDocType.getNodeName().equals(docType.getNodeName()) &&      // Compares node names for equality
  946.           (checkDocType.getNodeValue() != null && docType.getNodeValue() != null)   // Checks to make sure each node has a value node
  947.         ?  checkDocType.getNodeValue().equals(docType.getNodeValue())       // If both have value nodes test those value nodes for equality
  948.         : (checkDocType.getNodeValue() == null && docType.getNodeValue() == null))) // If one node doesn't have a value node make sure both don't
  949.     {
  950.         printf("Warning!!! DOM_Document's 'getDocType method failed!n" );
  951.         OK = false;
  952.     }
  953.     */
  954.     DOM_Node rootElement = document.getLastChild();
  955.     bool check = (rootElement.getNodeValue() != null && document.getDocumentElement().getNodeValue() != null)   // Checks to make sure each node has a value node
  956.         ?  rootElement.getNodeValue().equals(document.getDocumentElement().getNodeValue())      // If both have value nodes test those value nodes for equality
  957.         : (rootElement.getNodeValue() == null && document.getDocumentElement().getNodeValue() == null);    // If one node doesn't have a value node make sure both don't
  958.     if (! (rootElement.getNodeName().equals(document.getDocumentElement().getNodeName()) &&        // Compares node names for equality
  959.          check))
  960.     {
  961.         printf("Warning!!! DOM_Document's 'getDocumentElement' method failed!n" );
  962.         OK = false;
  963.     }
  964.     DOM_NodeList docElements = document.getElementsByTagName("*");
  965.     int docSize = docElements.getLength();
  966.     int i;
  967.     for (i = 0; i < docSize; i++)
  968.     {
  969.         DOM_Node n = (DOM_Node) docElements.item(i);
  970.         if (! (elementNames[i].equals(n.getNodeName())))
  971.         {
  972.             printf("Comparison of this document's elements failed at element number %d : ", i);
  973.             n.getNodeName().print();
  974.             OK = false;
  975.             break;
  976.         }
  977.     }
  978.     // What is this supposed to be doing?
  979.     //
  980.     //if (document.equals(document.getImplementation()))
  981.     //{
  982.     //  printf("Warning!!! DOM_Document's 'getImplementation' method failed!n" );
  983.     //  OK = false;
  984.     //}
  985.     newElement = document.createElement("NewElementTestsInsertBefore");
  986.     //  doc.insertBefore(newElement,null);//!! Throws a HIERARCHY_REQUEST_ERR   *******
  987.     //  doc.removeChild(docElements.item(9));//!! Throws a NOT_FOUND_ERR  ********
  988.     docFragment = document.createDocumentFragment();
  989.     //Tests removeChild and stores removed branch for tree reconstruction
  990.     docFragment.appendChild(docElements.item(1).removeChild(docElements.item(9)));
  991.     docFragment2 = document.createDocumentFragment();
  992.     //Tests removeChild and stores removed branch for tree reconstruction
  993.     docFragment2.appendChild(docElements.item(1).removeChild(docElements.item(2)));
  994.     docSize = docElements.getLength();
  995.     for (i = 0; i < docSize; i++)
  996.     {
  997.         DOM_Node n = (DOM_Node) docElements.item(i);
  998.         if (! (newElementNames[i].equals(n.getNodeName())))
  999.         {
  1000.             printf("Comparison of new document's elements failed at element number %d : ", i);
  1001.             n.getNodeName().print();
  1002.             OK = false;
  1003.             break;
  1004.         }
  1005.     }
  1006.     docElements.item(1).insertBefore(docFragment, DOM_Node()); //Reattaches removed branch to restore tree to the original
  1007.                                                 // AH Revist.  Note: insertBefore should be able to take
  1008.                                                 //   a null as its second parameter.
  1009.     docElements.item(1).insertBefore(docFragment2, docElements.item(2)); //Reattaches removed branch to restore tree to the original
  1010.     //  printf(docElements.item(2).getNodeName());
  1011.     docSize = docElements.getLength();
  1012.     for (i = 0; i < docSize; i++)
  1013.     {
  1014.         DOM_Node n = (DOM_Node) docElements.item(i);
  1015.         if (! (elementNames[i].equals(n.getNodeName())))
  1016.         {
  1017.             printf("Comparison of restored document's elements failed at element number %d : ", i);
  1018.             n.getNodeName().print();
  1019.             OK = false;
  1020.             break;
  1021.         }
  1022.     }
  1023.     DTest tests;
  1024. //  DOM_Document z = tests.createDocument();
  1025. //  tests.docBuilder(z, "z");
  1026. //!! Throws WRONG_DOCUMENT_ERR **********
  1027. //  EXCEPTIONSTEST(z.appendChild(
  1028.     //  z.appendChild(d.createComment("Test doc d comment"));// Tries to append z document with document d comment
  1029.     //  d.getDocumentElement().appendChild(z.createElement("newZdocElement"));// Tries to append d document with document z DOM_Element
  1030.     //  d.getLastChild().getLastChild().insertBefore(z.createElement("newZdocElement"),d.getLastChild().getLastChild().getFirstChild());// Tries to insert into d document with document z DOM_Element
  1031.     //  d.replaceChild(z.createElement("newZdocElement"),d.getLastChild().getLastChild().getFirstChild());  // Tries to replace in d document with document z DOM_Element
  1032.     //  doc.setNodeValue("This shouldn't work");//!! Throws a NO_MODIFICATION_ALLOWED_ERR ********
  1033.     node = document;
  1034.     node2 = document.cloneNode(true);
  1035.     result = treeCompare(node, node2); // Deep clone test comparison of document cloneNode
  1036.     if (!result)
  1037.     {
  1038.         printf("Warning!!! Deep clone of the document failed!n");
  1039.         OK = false;
  1040.     }
  1041.     // Deep clone test comparison is also in testNode
  1042. // For debugging*****       printf("All DOM_Document method calls worked correctly.n");
  1043.     if (!OK)
  1044.         printf("n*****The DOM_Document method calls listed above failed, all others worked correctly.*****n");
  1045. //  printf("n");
  1046. };
  1047. /**
  1048.  * This method tests DOM_DocumentFragment methods for the XML DOM implementation
  1049.  * version 2.0 10/12/98
  1050.  * @param document org.w3c.dom.DOM_Document
  1051.  *
  1052.  *
  1053.  *
  1054.  ********This really isn't needed, only exists to throw NO_MODIFICATION_ALLOWED_ERR ********
  1055.  */
  1056. void DTest::testDocumentFragment(DOM_Document document)
  1057. {
  1058.     bool OK = true;
  1059. // For debugging*****   printf("n          testDocumentFragment's outputs:n");
  1060.     DOM_DocumentFragment testDocFragment = document.createDocumentFragment();
  1061.     //  testDocFragment.setNodeValue("This is a document fragment!");//!! Throws a NO_MODIFICATION_ALLOWED_ERR ********
  1062. // For debugging*****       printf("All DOM_DocumentFragment method calls worked correctly.n");
  1063.     if (!OK)
  1064.         printf("n*****The DOM_DocumentFragment method calls listed above failed, all others worked correctly.*****n");
  1065. //  printf("n");
  1066. };
  1067. /**
  1068.  * This method tests DOM_DocumentType methods for the XML DOM implementation
  1069.  * version 2.0 10/12/98
  1070.  * @param document org.w3c.dom.DOM_Document
  1071.  *
  1072.  */
  1073. void DTest::testDocumentType(DOM_Document document)
  1074. {
  1075.     DTest test;
  1076.     DOM_DocumentType docType, holdDocType;
  1077.     DOM_NamedNodeMap docEntityMap, docNotationMap;
  1078.     DOM_Node node, node2;
  1079.     DOMString compare;
  1080.     bool OK = true;
  1081. // For debugging*****   printf("n          testDocumentType's outputs:n");
  1082.     DOM_DocumentType newDocumentType =  test.createDocumentType(document, "TestDocument");
  1083.     node = document.getFirstChild(); // node gets doc's docType node
  1084.     node2 = node.cloneNode(true);
  1085.     // Check nodes for equality, both their name and value or lack thereof
  1086.     bool check = (node.getNodeValue() != null && node2.getNodeValue() != null)  // Checks to make sure each node has a value node
  1087.         ?  node.getNodeValue().equals(node2.getNodeValue())          // If both have value nodes test those value nodes for equality
  1088.         : (node.getNodeValue() == null && node2.getNodeValue() == null);// If one node doesn't have a value node make sure both don't
  1089.     if (! (node.getNodeName().equals(node2.getNodeName()) &&         // Compares node names for equality
  1090.           check))
  1091.     {
  1092.         printf("'cloneNode' did not clone the DOM_DocumentType node correctlyn");
  1093.         OK = false;
  1094.     }
  1095.      // Deep clone test comparison is in testNode & testDocument
  1096.     DOM_Node  abc9 = document.getFirstChild();
  1097.     docType = (DOM_DocumentType &) abc9;
  1098.     compare = "ourEntityNode";
  1099. #if 0
  1100.     // Entity tests omitted; can not create entity nodes outside of the Parser.
  1101.     docEntityMap = docType.getEntities();
  1102.     if (! compare.equals(docEntityMap.item(0).getNodeName()))
  1103.     {
  1104.         printf("Warning!!! DOM_DocumentType's 'getEntities' failed!n" );
  1105.         OK = false;
  1106.     }
  1107. #endif
  1108.     docNotationMap = docType.getNotations();
  1109.     compare = "ourNotationNode";
  1110.     if (! compare.equals(docNotationMap.item(0).getNodeName()))
  1111.     {
  1112.         printf("Warning!!! DOM_DocumentType's 'getNotations' failed!n");
  1113.         OK = false;
  1114.     }
  1115.     //  doc.appendChild(newDocumentTypeImpl);//!! Throws a HIERARCHY_REQUEST_ERR    *******
  1116.     DOM_Node abc10 = document.removeChild(document.getFirstChild()); //Tests removeChild and stores removed branch for tree reconstruction
  1117.     holdDocType = (DOM_DocumentType &) abc10;
  1118.     document.insertBefore(newDocumentType, document.getDocumentElement());
  1119.     //** Other aspects of insertBefore are tested in docBuilder through appendChild*
  1120.     document.removeChild(document.getFirstChild()); //Removes newDocumentType for tree restoral
  1121.     document.insertBefore(holdDocType, document.getFirstChild()); //Reattaches removed branch to restore tree to the original
  1122. // For debugging*****       printf("All DOM_DocumentType method calls worked correctly.n");
  1123.     if (!OK)
  1124.         printf("n*****The DOM_DocumentType method calls listed above failed, all others worked correctly.*****n");
  1125. //  printf("");
  1126. };
  1127. /**
  1128.  * @param document org.w3c.dom.DOM_Document
  1129.  */
  1130. void DTest::testDOMerrors(DOM_Document document) {
  1131.     bool OK = true;
  1132.     DTest tests;
  1133.     EXCEPTIONSTEST(document.appendChild(testElementNode), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 201 );
  1134.     EXCEPTIONSTEST(testTextNode.appendChild(testTextNode), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 202 );
  1135. #ifdef skipthese
  1136.     EXCEPTIONSTEST(document.insertBefore(document.getElementsByTagName("docEntity").item(0),
  1137.         document.getElementsByTagName("docFirstElement").item(0)), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 203 );
  1138.     EXCEPTIONSTEST(document.replaceChild(document.getElementsByTagName("docCDATASection").item(0),
  1139.         document.getElementsByTagName("docFirstElement").item(0)), DOM_DOMException::HIERARCHY_REQUEST_ERR, OK, 204 );
  1140.     EXCEPTIONSTEST(document.getElementsByTagName("docFirstElement").item(0).setNodeValue("This shouldn't work!" ),
  1141.             DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 205 );
  1142.     EXCEPTIONSTEST(docReferenceEntity.setNodeValue("This shouldn't work!"),
  1143.         DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 206 );
  1144.     EXCEPTIONSTEST(docEntity.setNodeValue("This shouldn't work!"),
  1145.         DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 207 );
  1146.     EXCEPTIONSTEST(document.setNodeValue("This shouldn't work!"),
  1147.         DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 208 );
  1148.     EXCEPTIONSTEST(docDocType.setNodeValue("This shouldn't work!"),
  1149.         DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 209 );
  1150.     EXCEPTIONSTEST(docDocFragment.setNodeValue("This shouldn't work!"),
  1151.         DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 210 );
  1152.     EXCEPTIONSTEST(docNotation.setNodeValue("This shouldn't work!"),
  1153.         DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 211 );
  1154.     EXCEPTIONSTEST(docReferenceEntity.appendChild(entityReferenceText2)
  1155.         , DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, OK, 212 );
  1156.     EXCEPTIONSTEST(docBodyLevel32.insertBefore(docTextNode11,docBody), DOM_DOMException::NOT_FOUND_ERR, OK, 213 );
  1157.     EXCEPTIONSTEST(docBodyLevel32.removeChild(docFirstElement), DOM_DOMException::NOT_FOUND_ERR, OK, 214 );
  1158.     EXCEPTIONSTEST(docBodyLevel32.replaceChild(docTextNode11,docFirstElement), DOM_DOMException::NOT_FOUND_ERR );
  1159. #endif
  1160. //!! Throws a NOT_FOUND_ERR ********
  1161.      // docBodyLevel32.getAttributes().removeNamedItem(testAttribute.getName());    16  // To test removeNamedItem
  1162. };
  1163. /**
  1164.  * This method tests DOM_DOMImplementation methods for the XML DOM implementation
  1165.  * version 2.0 10/12/98
  1166.  * @param document org.w3c.dom.DOM_Document
  1167.  *
  1168.  */
  1169. void DTest::testDOMImplementation(DOM_Document document)
  1170. {
  1171.     DOM_DOMImplementation implementation;
  1172.     bool result = false;
  1173.     bool OK = true;
  1174. // For debugging*****   printf("n          testDOMImplementation's outputs:n");
  1175.     implementation = document.getImplementation(); //Uses getDOMImplementation to obtain implementation
  1176.     result = implementation.hasFeature("XML", "1.0");
  1177.     if(!result)
  1178.     {
  1179.         fprintf(stderr, "Warning!!! DOM_DOMImplementation's 'hasFeature' that should be 'true' failed!");
  1180.         OK = false;
  1181.     }
  1182.     result = implementation.hasFeature("HTML", "4.0");
  1183.     if(result)
  1184.     {
  1185.         fprintf(stderr, "Warning!!! DOM_DOMImplementation's 'hasFeature' that should be 'false' failed!");
  1186.         OK = false;
  1187.     }
  1188. // For debugging*****       printf("All DOM_DOMImplementation method calls worked correctly.n");
  1189.     if (!OK)
  1190.         fprintf(stderr, "n*****The DOM_DOMImplementation method calls listed above failed, all others worked correctly.*****n");
  1191. //  printf("");
  1192. };
  1193. /**
  1194.  * This method tests DOM_Element methods for the XML DOM implementation
  1195.  * version 2.0 10/12/98
  1196.  * @param document org.w3c.dom.DOM_Document
  1197.  *
  1198.  */
  1199. void DTest::testElement(DOM_Document document)
  1200. {
  1201.     DOM_Attr attributeNode, newAttributeNode;
  1202.     DOM_Element element, element2;
  1203.     DOM_Node node, node2;
  1204.     DOMString attribute, compare;
  1205.     DOMString attributeCompare[] = {"AnotherFirstElementAttribute", "dFirstElement", "testAttribute"};
  1206.     DOMString elementNames[] =  {"dFirstElement", "dTestBody", "dBodyLevel21","dBodyLevel31","dBodyLevel32",
  1207.                    "dBodyLevel22","dBodyLevel33","dBodyLevel34","dBodyLevel23","dBodyLevel24"};
  1208.     DOMString textCompare[] = {"dBodyLevel31'sChildTextNode11",
  1209.                                 "dBodyLevel31'sChildTextNode12",
  1210.                                 "dBodyLevel31'sChildTextNode13"};
  1211.     DOM_NamedNodeMap nodeMap;
  1212.     bool OK = true;
  1213. // For debugging*****   printf("n          testElement's outputs:n");
  1214.     node = document.getDocumentElement(); // node gets doc's firstElement
  1215.     node2 = node.cloneNode(true);
  1216.     // Check nodes for equality, both their name and value or lack thereof
  1217.     if (!(node.getNodeName().equals(node2.getNodeName()) &&         // Compares node names for equality
  1218.          (node.getNodeValue() != null && node2.getNodeValue() != null)  // Checks to make sure each node has a value node
  1219.         ? node.getNodeValue().equals(node2.getNodeValue())          // If both have value nodes test those value nodes for equality
  1220.         :(node.getNodeValue() == null && node2.getNodeValue() == null)))// If one node doesn't have a value node make sure both don't
  1221.     {
  1222.         fprintf(stderr, "'cloneNode' did not clone the DOM_Element node correctly.n");
  1223.         OK = false;
  1224.     }
  1225.     // Deep clone test comparison is in testNode & testDocument
  1226.     element = document.getDocumentElement(); // element gets doc's firstElement
  1227.     compare = "";
  1228.     attribute = element.getAttribute(document.getNodeValue() + "'s test attribute");
  1229.     if (! compare.equals(element.getAttribute(document.getNodeValue() + "'s test attribute")))
  1230.     {
  1231.         fprintf(stderr, "Warning!!! DOM_Element's 'getAttribute' failed!n");
  1232.         OK = false;
  1233.     }
  1234.     attributeNode = element.getAttributeNode(document.getNodeValue() + "FirstElement");
  1235.     if(! (attributeNode == null))
  1236.     {
  1237.         fprintf(stderr, "Warning!!! DOM_Element's 'getAttributeNode' failed! It should have returned 'null' here!n");
  1238.         OK = false;
  1239.     }
  1240.     newAttributeNode = document.createAttribute("AnotherFirstElementAttribute");
  1241.     newAttributeNode.setValue("A new attribute which helps test calls in DOM_Element");
  1242.     // This test is incorrect.  It assumes that there is a defined ordering of the entries
  1243.     //  in a nodeMap, but there is no ordering required.
  1244. #ifdef TheFollowingCheckIsInvalid
  1245.     element.setAttributeNode(newAttributeNode);
  1246.     nodeMap = element.getAttributes();
  1247.     int size = nodeMap.getLength();
  1248.     int k;
  1249.     for (k = 0; k < size; k++)
  1250.     {
  1251.         DOM_Node n = (DOM_Node) nodeMap.item(k);
  1252.         if (! (attributeCompare[k].equals(n.getNodeName())))
  1253.         {
  1254.             printf("Warning!!! Comparison of firstElement's attributes failed.n");
  1255.             printf("   n.getNodeName() = ""); n.getNodeValue().print(); printf(""n");
  1256.             printf("   expected value  = ""); attributeCompare[k].print(); printf(""n");
  1257.             printf("   This failure can be a result of DOM_Element's 'setValue' and/or 'setAttributeNode' and/or 'getAttributes' failing.n");
  1258.             OK = false;
  1259.             break;
  1260.         }
  1261.     //  printf("firstElement's attribute number " + k + " : " + n.getNodeName());
  1262.     }
  1263. #endif
  1264.     nodeMap = element.getAttributes();
  1265.     int size = nodeMap.getLength();
  1266.     if (size != 2)
  1267.     {
  1268.         printf("DOM_Element Tests Failure 001n");
  1269.         OK = false;
  1270.     };
  1271.     element.setAttributeNode(newAttributeNode);
  1272.     size = nodeMap.getLength();
  1273.     if (size != 3)
  1274.     {
  1275.         printf("DOM_Element Tests Failure 002n");
  1276.         OK = false;
  1277.     };
  1278.     // Fetch the newly added attribute node back out of from the named node map,
  1279.     //  and check that we are returned the same node that we put in.
  1280.     DOM_Node abc12 = nodeMap.getNamedItem("AnotherFirstElementAttribute");
  1281.     DOM_Attr fetchedAttr = (DOM_Attr &) abc12;
  1282.     if (fetchedAttr != newAttributeNode)
  1283.     {
  1284.         printf("DOM_Element Tests Failure 003n");
  1285.         OK = false;
  1286.     };
  1287.     // Fetch the newly added attribute back out directly from the element itself.
  1288.     fetchedAttr = element.getAttributeNode("AnotherFirstElementAttribute");
  1289.     if (fetchedAttr != newAttributeNode)
  1290.     {
  1291.         printf("DOM_Element Tests Failure 004n");
  1292.         OK = false;
  1293.     };
  1294.     DOM_NodeList docElements = document.getElementsByTagName("*");
  1295.     int docSize = docElements.getLength();
  1296.     int i;
  1297.     for (i = 0; i < docSize; i++)
  1298.     {
  1299.         DOM_Node n = docElements.item(i);
  1300.         if (! (elementNames[i].equals(n.getNodeName())))
  1301.         {
  1302.             printf("Warning!!! Comparison of DOM_Element's 'getElementsByTagName' "
  1303.                             "and/or 'item' failed at element number %d : ", i );
  1304.             n.getNodeName().print();
  1305.             printf("n");
  1306.             OK = false;
  1307.             break;
  1308.         }
  1309.     //  printf("docElement's number " + i + " is: " + n.getNodeName());
  1310.     }
  1311.     DOM_Node abc15 = document.getElementsByTagName("dBodyLevel21").item(0); // element gets DOM_Element test BodyLevel21
  1312.     element = (DOM_Element &) abc15;
  1313.     DOM_Node abc16 = document.getElementsByTagName("dBodyLevel31").item(0); // element2 gets DOM_Element test BodyLevel31
  1314.     element2 = (DOM_Element &) abc16;
  1315.     DOM_NodeList text = ((DOM_Node &) element2).getChildNodes();
  1316.     int textSize = text.getLength();
  1317.     int j;
  1318.     static bool firstTime = true;
  1319.     if (firstTime)
  1320.     {
  1321.         firstTime = false;      // Temporary fix.  Subsequent tests alter the doc, causing
  1322.                                 //   this test to fail on all but the first time through.
  1323.         for (j = 0; j < textSize; j++)
  1324.         {
  1325.             DOM_Node n = text.item(j);
  1326.             if (! (textCompare[j].equals(n.getNodeValue())))
  1327.             {
  1328.                 printf("Warning!!! Comparison of original text nodes via DOM_Node 'getChildNodes' & DOM_NodeList 'item'n"
  1329.                     "     failed at text node: #%d n     ", j );
  1330.                 n.getNodeValue().print();
  1331.                 printf("n");
  1332.                 OK = false;
  1333.                 break;
  1334.             }
  1335.             //  printf("DOM_Element testBodyLevel31's child text node " + j + " is: " + n.getNodeValue());
  1336.         }
  1337.     }
  1338.     element = document.getDocumentElement(); // element gets doc's firstElement
  1339.     element.normalize();        // Concatenates all adjacent text nodes in this element's subtree
  1340.     DOM_NodeList text2 = ((DOM_Node) element2).getChildNodes();
  1341.     compare = "dBodyLevel31'sChildTextNode11dBodyLevel31'sChildTextNode12dBodyLevel31'sChildTextNode13";
  1342.     DOM_Node n = text2.item(0);
  1343.     if (! (compare.equals(n.getNodeValue())))
  1344.     {
  1345.         printf("Warning!!! Comparison of concatenated text nodes created by DOM_Element's 'normalize' failed!n");
  1346.         OK = false;
  1347.     }
  1348.     element.setAttribute("FirstElementLastAttribute", "More attribute stuff for firstElement!!");
  1349.     element.removeAttribute("FirstElementLastAttribute");
  1350.     element.removeAttributeNode(newAttributeNode);
  1351.     //  doc.getLastChild().setNodeValue("This shouldn't work");//!! Throws a NO_MODIFICATION_ALLOWED_ERR***
  1352. // For debugging*****       printf("All DOM_Element method calls worked correctly.n");
  1353.     if (!OK)
  1354.         printf("n*****The DOM_Element method calls listed above failed, all others worked correctly.*****n");
  1355. //  printf("");
  1356. };
  1357. /**
  1358.  * This method tests DOM_Entity methods for the XML DOM implementation
  1359.  * version 2.0 10/12/98
  1360.  * @param document org.w3c.dom.DOM_Document
  1361.  *
  1362.  */
  1363. void DTest::testEntity(DOM_Document document)
  1364. {
  1365.     DOM_Entity entity;
  1366.     DOM_Node node, node2;
  1367.     bool OK = true;
  1368.     DOMString compare;
  1369. // For debugging*****   printf("n          testEntity's outputs:nn");
  1370.     DOM_Node abc20 = document.getDoctype().getEntities().getNamedItem("ourEntityNode");
  1371.     entity = (DOM_Entity &) abc20;
  1372.     node = entity;
  1373.     node2 = entity.cloneNode(true);
  1374.     // Check nodes for equality, both their name and value or lack thereof
  1375.     if (!(node.getNodeName().equals(node2.getNodeName()) &&         // Compares node names for equality
  1376.             ((node.getNodeValue() != null && node2.getNodeValue() != null) ?    // Checks to make sure each node has a value node
  1377.                node.getNodeValue().equals(node2.getNodeValue()) :       // If both have value nodes test those value nodes for equality
  1378.                (node.getNodeValue() == null && node2.getNodeValue() == null)))) // If one node doesn't have a value node make sure both don't
  1379.     {
  1380.         printf("Warning!!! 'cloneNode' did not clone the DOM_Entity node correctly");
  1381.         OK = false;
  1382.     }
  1383.     // Deep clone test comparison is in testNode & testDocument
  1384. // For debugging*****       printf("All DOM_Entity method calls worked correctly.n");
  1385.     if (!OK)
  1386.         printf("n*****The DOM_Entity method calls listed above failed, all others worked correctly.*****n");
  1387. //  printf("");
  1388. };
  1389. /**
  1390.  * This method tests DOM_EntityReference methods for the XML DOM implementation
  1391.  * version 2.0 10/12/98
  1392.  * @param document org.w3c.dom.DOM_Document
  1393.  *
  1394.  */
  1395. void DTest::testEntityReference(DOM_Document document)
  1396. {
  1397.     DOM_EntityReference entityReference;
  1398.     DOM_Node node, node2;
  1399.     bool OK = true;
  1400. // For debugging*****   printf("n          testEntityReference's outputs:n");
  1401.     DOM_Node abc30 = document.getLastChild().getLastChild().getLastChild().getFirstChild();
  1402.     entityReference = (DOM_EntityReference &) abc30;
  1403.     node = entityReference;
  1404.     node2 = node.cloneNode(true);
  1405.     // Check nodes for equality, both their name and value or lack thereof
  1406.     if (!(node.getNodeName().equals(node2.getNodeName()) &&         // Compares node names for equality
  1407.          (node.getNodeValue() != null && node2.getNodeValue() != null)  // Checks to make sure each node has a value node
  1408.         ? node.getNodeValue().equals(node2.getNodeValue())          // If both have value nodes test those value nodes for equality
  1409.         :(node.getNodeValue() == null && node2.getNodeValue() == null)))// If one node doesn't have a value node make sure both don't
  1410.     {
  1411.         printf("'cloneNode' did not clone the DOM_EntityReference node correctlyn");
  1412.         OK = false;
  1413.     }
  1414.     // Deep clone test comparison is in testNode & testDocument
  1415.     //  entityReference.setNodeValue("This shouldn't work");//!! Throws a NO_MODIFICATION_ALLOWED_ERR ********
  1416. // For debugging*****       printf("All DOM_EntityReference method calls worked correctly.n");
  1417.     if (!OK)
  1418.         printf("n*****The DOM_EntityReference method calls listed above failed, all others worked correctly.*****n");
  1419. //  printf("n");
  1420. };
  1421. /**
  1422.  * This method tests DOM_Node methods for the XML DOM implementation
  1423.  * version 2.0 10/12/98
  1424.  * @param document org.w3c.dom.DOM_Document
  1425.  *
  1426.  *
  1427.  *
  1428.  ********* This is only for a test of cloneNode "deep"*******
  1429.  ********* And for error tests*********
  1430.  */
  1431. void DTest::testNode(DOM_Document document)
  1432. {
  1433.     DOM_Node node, node2;
  1434.     bool result;
  1435.     bool OK = true;
  1436. // For debugging*****   printf("n          testNode's outputs:n");
  1437.     node = document.getDocumentElement();
  1438.     node2 = node.cloneNode(true);
  1439.     result = treeCompare(node, node2); // Deep clone test of cloneNode
  1440.     if (result)
  1441.     {
  1442.         //printf("'cloneNode' successfully cloned this whole node tree (deep)!n");
  1443.     }
  1444.     else
  1445.     {
  1446.         printf("'cloneNode' did not successfully clone this whole node tree (deep)!n");
  1447.         OK = false;
  1448.     }
  1449.     //!! The following gives a did not clone successfully message*********
  1450.     node = document.getDocumentElement();
  1451.     node2 = node.getFirstChild();
  1452.     result = treeCompare(node, node2);
  1453.     if (!result)
  1454.     {
  1455.         //printf("'cloneNode' did not successfully clone this whole node tree (deep)!n");
  1456.     }
  1457.     else
  1458.     {
  1459.         printf("'cloneNode' was supposed to fail here, either it or 'treeCompare' failed!!!n");
  1460.         OK = false;
  1461.     }
  1462.     // Deep clone test also in testDocument
  1463. // For debugging*****       printf("All DOM_Node method calls worked correctly.n");
  1464.     if (!OK)
  1465.         printf("n*****The DOM_Node method calls listed above failed, all others worked correctly.*****n");
  1466. //  printf("n");
  1467. };
  1468. /**
  1469.  * This method tests DOM_Notation methods for the XML DOM implementation
  1470.  * version 2.0 10/12/98
  1471.  * @param document org.w3c.dom.DOM_Document
  1472.  *
  1473.  */
  1474. void DTest::testNotation(DOM_Document document)
  1475. {
  1476.     DOM_Node node, node2;
  1477.     DOM_Notation notation;
  1478.     bool OK = true;
  1479.     DOMString compare;
  1480. // For debugging*****   printf("n          testNotation's outputs:n");
  1481. DOM_Node abc40 = document.getDoctype().getNotations().getNamedItem("ourNotationNode");
  1482.     notation = (DOM_Notation &) abc40;
  1483.     node = notation;
  1484.     node2 = notation.cloneNode(true);//*****?
  1485.     // Check nodes for equality, both their name and value or lack thereof
  1486.     if (!(node.getNodeName().equals(node2.getNodeName()) &&         // Compares node names for equality
  1487.          (node.getNodeValue() != null && node2.getNodeValue() != null)  // Checks to make sure each node has a value node
  1488.         ? node.getNodeValue().equals(node2.getNodeValue())          // If both have value nodes test those value nodes for equality
  1489.         :(node.getNodeValue() == null && node2.getNodeValue() == null)))// If one node doesn't have a value node make sure both don't
  1490.     {
  1491.         printf("'cloneNode' did not clone the DOM_Notation node correctly");
  1492.         OK = false;
  1493.     }
  1494.     // Deep clone test comparison is in testNode & testDocument
  1495.     //  notation.setNodeValue("This shouldn't work");//!! Throws a NO_MODIFICATION_ALLOWED_ERR ********
  1496. // For debugging*****       printf("All DOM_Notation method calls worked correctly.n");
  1497.     if (!OK)
  1498.         printf("n*****The DOM_Notation method calls listed above failed, all others worked correctly.*****n");
  1499. //  printf("");
  1500. };
  1501. /**
  1502.  * This method tests DOM_ProcessingInstruction methods for the XML DOM implementation
  1503.  * version 2.0 10/12/98
  1504.  * @param document org.w3c.dom.DOM_Document
  1505.  *
  1506.  */
  1507. void DTest::testPI(DOM_Document document)
  1508. {
  1509.     DOM_Node node, node2;
  1510.     DOM_ProcessingInstruction pI, pI2;
  1511.     DOMString compare;
  1512.     bool OK = true;
  1513. // For debugging*****   printf("n          testPI's outputs:n");
  1514. DOM_Node  abc50 = document.getDocumentElement().getFirstChild();// Get doc's DOM_ProcessingInstruction
  1515.     pI  = (DOM_ProcessingInstruction &) abc50;
  1516. DOM_Node  abc51 = pI.cloneNode(true);//*****?
  1517.     pI2 = (DOM_ProcessingInstruction &) abc51;
  1518.     // Check nodes for equality, both their name and value or lack thereof
  1519.     if (!(pI.getNodeName().equals(pI2.getNodeName()) &&         // Compares node names for equality
  1520.          (pI.getNodeValue() != null && pI2.getNodeValue() != null)  // Checks to make sure each node has a value node
  1521.         ? pI.getNodeValue().equals(pI2.getNodeValue())      // If both have value nodes test those value nodes for equality
  1522.         :(pI.getNodeValue() == null && pI2.getNodeValue() == null)))// If one node doesn't have a value node make sure both don't
  1523.     {
  1524.         printf("'cloneNode' did not clone the DOM_Entity node correctlyn");
  1525.         OK = false;
  1526.     }
  1527.     // Deep clone test comparison is in testNode & testDocument
  1528.     // compare = "This is [#document: null]'s processing instruction";  // AH Revisit.  Where id
  1529.     //                  this ": null]" stuff come from in the Java version??  I don' think that it is right.
  1530.     compare = "This is #document's processing instruction";
  1531.     if (! compare.equals(pI.getData()))
  1532.     {
  1533.         printf("Warning!!! PI's 'getData' failed!n");
  1534.         OK = false;
  1535.     }
  1536.     pI.setData("PI's reset data");
  1537.     compare = "PI's reset data";
  1538.     if (! compare.equals(pI.getData()))
  1539.     {
  1540.         printf("Warning!!! PI's 'setData' failed!n");
  1541.         OK = false;
  1542.     }
  1543.     compare = "dTargetProcessorChannel";
  1544.     if (! compare.equals(pI.getTarget()))
  1545.     {
  1546.         printf("Warning!!! PI's 'getTarget' failed!n");
  1547.         OK = false;
  1548.     }
  1549.     // Restore original PI data.
  1550.     pI.setData("This is #document's processing instruction");
  1551. // For debugging*****       printf("All PI method calls worked correctly.n");
  1552.     if (!OK)
  1553.         printf("n*****The PI method calls listed above failed, all others worked correctly.*****n");
  1554. //  printf("n");
  1555. };
  1556. /**
  1557.  * This method tests DOM_Text methods for the XML DOM implementation
  1558.  * version 2.0 10/12/98
  1559.  * @param document org.w3c.dom.DOM_Document
  1560.  *
  1561.  */
  1562. void DTest::testText(DOM_Document document)
  1563. {
  1564.     DOM_Node node, node2;
  1565.     DOM_Text text;
  1566.     DOMString compare;
  1567.     bool OK = true;
  1568. // For debugging*****   printf("n          testText's outputs:n");
  1569.     DOM_Node abc70 = document.getDocumentElement().getElementsByTagName("dBodyLevel31").item(0);
  1570.     DOM_Element elem = (DOM_Element &) abc70;
  1571.     node = elem.getFirstChild(); // charData gets textNode11
  1572.     text = (DOM_Text &) node;
  1573.     node2 = node.cloneNode(true);//*****?
  1574.     // Check nodes for equality, both their name and value or lack thereof
  1575.     if (!(node.getNodeName().equals(node2.getNodeName()) &&         // Compares node names for equality
  1576.          (node.getNodeValue() != null && node2.getNodeValue() != null)  // Checks to make sure each node has a value node
  1577.         ? node.getNodeValue().equals(node2.getNodeValue())          // If both have value nodes test those value nodes for equality
  1578.         :(node.getNodeValue() == null && node2.getNodeValue() == null)))// If one node doesn't have a value node make sure both don't
  1579.     {
  1580.         printf("'cloneNode' did not clone the DOM_Text node correctlyn");
  1581.         OK = false;
  1582.     }
  1583.     // Deep clone test comparison is in testNode & testDocument
  1584.     text.splitText(25);
  1585.     // Three original text nodes were concatenated by 'normalize' in testElement
  1586.     compare = "dBodyLevel31'sChildTextNo";
  1587.     if (! compare.equals(text.getNodeValue()))
  1588.         {
  1589.             printf("First part of DOM_Text's split text failed!n" );
  1590.             OK = false;
  1591.         }
  1592.     // Three original text nodes were concatenated by 'normalize' in testElement
  1593.     compare = "de11dBodyLevel31'sChildTextNode12dBodyLevel31'sChildTextNode13";
  1594.     if (! compare.equals(text.getNextSibling().getNodeValue()))
  1595.         {
  1596.             printf("The second part of DOM_Text's split text failed!n") ;
  1597.             OK = false;
  1598.         }
  1599.     // Re-normalize the text nodes under elem, so that this test can be rerun.
  1600.     elem.normalize();
  1601. //************************************************* ERROR TESTS
  1602.     DTest tests;
  1603.     //!! Throws INDEX_SIZE_ERR ********************
  1604.     //  text.splitText(-1);
  1605.     //  text.splitText(100);
  1606. // For debugging*****       printf("All DOM_Text method calls worked correctly.n");
  1607.     if (!OK)
  1608.         printf("n*****The DOM_Text method calls listed above failed, all others worked correctly.*****n");
  1609. //  printf("n");
  1610. };
  1611. /**
  1612.  *
  1613.  * @param node org.w3c.dom.DOM_Node
  1614.  * @param node2 org.w3c.dom.DOM_Node
  1615.  *
  1616.  */
  1617. bool DTest::treeCompare(DOM_Node node, DOM_Node node2)
  1618. {
  1619.     bool answer = true;
  1620.     DOM_Node kid, kid2;         // Check the subtree for equality
  1621.     kid = node.getFirstChild();
  1622.     kid2 = node2.getFirstChild();
  1623.     if (!kid.isNull() && !kid2.isNull())
  1624.     {
  1625.         answer = treeCompare(kid, kid2);
  1626.         if (!answer)
  1627.             return answer;
  1628.         else
  1629.             if (!kid.getNextSibling().isNull() && !kid2.getNextSibling().isNull())
  1630.             {
  1631.                 while (!kid.getNextSibling().isNull() && !kid2.getNextSibling().isNull())
  1632.                 {
  1633.                     answer = treeCompare(kid.getNextSibling(), kid2.getNextSibling());
  1634.                     if (!answer)
  1635.                         return answer;
  1636.                     else
  1637.                     {
  1638.                         kid = kid.getNextSibling();
  1639.                         kid2 = kid2.getNextSibling();
  1640.                     }
  1641.                 }
  1642.             } else
  1643.                 if (!(kid.getNextSibling().isNull() && kid2.getNextSibling().isNull()))
  1644.                 {
  1645.                     return false;
  1646.                 }
  1647.     } else
  1648.         if (kid != kid2)
  1649.         {
  1650.             // One or the other of (kid1, kid2) is null, but not both.
  1651.             return false;
  1652.         }
  1653.     if (!(node.getNodeName().equals(node2.getNodeName())))
  1654.         return false;
  1655.     if (node.getNodeValue()==null && node2.getNodeValue()!=null)
  1656.         return false;
  1657.     if (node.getNodeValue()!=null && node2.getNodeValue()==null)
  1658.         return false;
  1659.     if (!(node.getNodeValue().equals(node2.getNodeValue())))
  1660.         return false;
  1661.     return answer;
  1662. };