DTest.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:187k
源码类别:

词法分析

开发平台:

Visual C++

  1.         OK = false;
  2.     }
  3.     node2->release();
  4.     // Deep clone test comparison is also in testNode
  5.     // Test the user data
  6.     // Test simple set and get
  7.     DOMDocumentFragment* userTest = docFragment;
  8.     DOMDocumentFragment*  userFirst = docFragment2;
  9.     XMLCh* userSecond = tempStr2;
  10.     XMLString::transcode("first", tempStr, 3999);
  11.     XMLString::transcode("document", tempStr2, 3999);
  12.     userTest->setUserData(tempStr2, (void*) document, 0);
  13.     void* mydocument = userTest->getUserData(tempStr2);
  14.     if (document != mydocument) {
  15.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  16.         OK = false;
  17.     }
  18.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  19.     void* myFirst = userTest->getUserData(tempStr);
  20.     if (userFirst != myFirst) {
  21.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  22.         OK = false;
  23.     }
  24.     // Test overwrite
  25.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  26.     void* mySecond = userTest->getUserData(tempStr);
  27.     if (userSecond != mySecond) {
  28.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  29.         OK = false;
  30.     }
  31.     if (userFirst != myFirst2) {
  32.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  33.         OK = false;
  34.     }
  35.     if (userFirst == mySecond) {
  36.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  37.         OK = false;
  38.     }
  39.     // Test null
  40.     // test non-exist key
  41.     XMLString::transcode("not-exist", tempStr3, 3999);
  42.     if (userTest->getUserData(tempStr3)) {
  43.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  44.         OK = false;
  45.     }
  46.     // use a node that does not have user data set before
  47.     if (userFirst->getUserData(tempStr)) {
  48.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  49.         OK = false;
  50.     }
  51.     // Test reset
  52.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  53.     void* myNull = userTest->getUserData(tempStr);
  54.     if (userSecond != mySecond2) {
  55.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  56.         OK = false;
  57.     }
  58.     if (myNull) {
  59.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  60.         OK = false;
  61.     }
  62.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  63.     void* myNull2 = userTest->getUserData(tempStr2);
  64.     if (mydocument != mydocument2) {
  65.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  66.         OK = false;
  67.     }
  68.     if (myNull2) {
  69.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  70.         OK = false;
  71.     }
  72.     //the userTest user data table should be null now
  73.     if (userTest->getUserData(tempStr)) {
  74.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  75.         OK = false;
  76.     }
  77.     if (userTest->getUserData(tempStr2)) {
  78.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  79.         OK = false;
  80.     }
  81.     // Test DOMUserDataHandler
  82.     // test clone
  83.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  84.     DOMNode* mycloned = userTest->cloneNode(true);
  85.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  86.     // test import
  87.     document->setUserData(tempStr2, (void*) document, &userhandler);
  88.     DOMNode* myimport = document->importNode(userTest,true);
  89.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  90.     // test delete
  91.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  92.     myimport->release();
  93.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  94.     // Test isSameNode
  95.     if (!userTest->isSameNode(userTest)) {
  96.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  97.         OK = false;
  98.     }
  99.     if (userTest->isSameNode(userFirst)) {
  100.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  101.         OK = false;
  102.     }
  103.     // Test isEqualNode
  104.     if (!userTest->isEqualNode(mycloned)) {
  105.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  106.         OK = false;
  107.     }
  108.     if (!userTest->isEqualNode(userTest)) {
  109.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  110.         OK = false;
  111.     }
  112.     if (userTest->isEqualNode(document)) {
  113.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  114.         OK = false;
  115.     }
  116.     // Test rename, should throw exception
  117.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 207 );
  118.     if (!OK)
  119.         printf("n*****The DOMDocument* method calls listed above failed, all others worked correctly.*****n");
  120.     return OK;
  121. };
  122. /**
  123.  * This method tests DOMDocumentFragment* methods for the XML DOM implementation
  124.  * @param document org.w3c.dom.DOMDocument
  125.  *
  126.  *
  127.  *
  128.  ********This really isn't needed, only exists to throw NO_MODIFICATION_ALLOWED_ERR ********
  129.  */
  130. bool DOMTest::testDocumentFragment(DOMDocument* document)
  131. {
  132.     bool OK = true;
  133. // For debugging*****   printf("n          testDocumentFragment's outputs:n");
  134.     DOMDocumentFragment* testDocFragment = document->createDocumentFragment();
  135.     //  testDocFragment->setNodeValue("This is a document fragment!");//!! Throws a NO_MODIFICATION_ALLOWED_ERR ********
  136.     // Test isSameNode
  137.     DOMDocumentFragment* userTest = testDocFragment;
  138.     DOMNode* mycloned = testDocFragment->cloneNode(true);
  139.     DOMDocument* userFirst = document;
  140.     if (!userTest->isSameNode(userTest)) {
  141.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  142.         OK = false;
  143.     }
  144.     if (userTest->isSameNode(userFirst)) {
  145.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  146.         OK = false;
  147.     }
  148.     // Test isEqualNode
  149.     if (!userTest->isEqualNode(mycloned)) {
  150.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  151.         OK = false;
  152.     }
  153.     if (!userTest->isEqualNode(userTest)) {
  154.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  155.         OK = false;
  156.     }
  157.     if (userTest->isEqualNode(userFirst)) {
  158.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  159.         OK = false;
  160.     }
  161.     // Test rename, should throw exception
  162.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 208 );
  163.     if (!OK)
  164.         printf("n*****The DOMDocumentFragment* method calls listed above failed, all others worked correctly.*****n");
  165.     return OK;
  166. };
  167. /**
  168.  * This method tests DOMDocumentType* methods for the XML DOM implementation
  169.  * @param document org.w3c.dom.DOMDocument
  170.  *
  171.  */
  172. bool DOMTest::testDocumentType(DOMDocument* document)
  173. {
  174.     DOMTest test;
  175.     DOMDocumentType* docType, *holdDocType;
  176.     DOMNamedNodeMap* docNotationMap;
  177.     DOMNode* node, *node2;
  178.     bool OK = true;
  179. // For debugging*****   printf("n          testDocumentType's outputs:n");
  180.     XMLString::transcode("TestDocument", tempStr, 3999);
  181.     DOMDocumentType* newDocumentType =  test.createDocumentType(document, tempStr);
  182.     node = document->getFirstChild(); // node gets doc's docType node
  183.     node2 = node->cloneNode(true);
  184.     // Check nodes for equality, both their name and value or lack thereof
  185.     if (!(!XMLString::compareString(node->getNodeName(), node2->getNodeName()) &&        // Compares node names for equality
  186.           (node->getNodeValue() != 0 && node2->getNodeValue() != 0)     // Checks to make sure each node has a value node
  187.         ? !XMLString::compareString(node->getNodeValue(), node2->getNodeValue())         // If both have value nodes test those value nodes for equality
  188.         : (node->getNodeValue() == 0 && node2->getNodeValue() == 0)))   // If one node doesn't have a value node make sure both don't
  189.     {
  190.         fprintf(stderr, "'cloneNode' did not clone the DOMDocumentType* node correctlyn");
  191.         OK = false;
  192.     }
  193.      // Deep clone test comparison is in testNode & testDocument
  194.     DOMNode*   abc9 = document->getFirstChild();
  195.     docType = (DOMDocumentType*) abc9;
  196.     XMLString::transcode("ourNotationNode", tempStr, 3999);
  197.     docNotationMap = docType->getNotations();
  198.     if (XMLString::compareString(tempStr, docNotationMap->item(0)->getNodeName()))
  199.     {
  200.         fprintf(stderr, "Warning!!! DOMDocumentType's 'getNotations' failed!n");
  201.         OK = false;
  202.     }
  203.     //  doc->appendChild(newDocumentTypeImpl);//!! Throws a HIERARCHY_REQUEST_ERR    *******
  204.     DOMNode*  abc10 = document->removeChild(document->getFirstChild()); //Tests removeChild and stores removed branch for tree reconstruction
  205.     holdDocType = (DOMDocumentType*) abc10;
  206.     document->insertBefore(newDocumentType, document->getDocumentElement());
  207.     //** Other aspects of insertBefore are tested in docBuilder through appendChild*
  208.     DOMNode* rem = document->removeChild(document->getFirstChild()); //Removes newDocumentType for tree restoral
  209.     rem->release();
  210.     document->insertBefore(holdDocType, document->getFirstChild()); //Reattaches removed branch to restore tree to the original
  211.     // Test the user data
  212.     // Test simple set and get
  213.     DOMDocumentType* userTest = docType;
  214.     DOMNamedNodeMap*  userFirst = docNotationMap;
  215.     XMLCh* userSecond = tempStr2;
  216.     XMLString::transcode("first", tempStr, 3999);
  217.     XMLString::transcode("document", tempStr2, 3999);
  218.     userTest->setUserData(tempStr2, (void*) document, 0);
  219.     void* mydocument = userTest->getUserData(tempStr2);
  220.     if (document != mydocument) {
  221.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  222.         OK = false;
  223.     }
  224.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  225.     void* myFirst = userTest->getUserData(tempStr);
  226.     if (userFirst != myFirst) {
  227.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  228.         OK = false;
  229.     }
  230.     // Test overwrite
  231.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  232.     void* mySecond = userTest->getUserData(tempStr);
  233.     if (userSecond != mySecond) {
  234.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  235.         OK = false;
  236.     }
  237.     if (userFirst != myFirst2) {
  238.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  239.         OK = false;
  240.     }
  241.     if (userFirst == mySecond) {
  242.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  243.         OK = false;
  244.     }
  245.     // Test null
  246.     // test non-exist key
  247.     XMLString::transcode("not-exist", tempStr3, 3999);
  248.     if (userTest->getUserData(tempStr3)) {
  249.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  250.         OK = false;
  251.     }
  252.     // use a node that does not have user data set before
  253.     if (node2->getUserData(tempStr)) {
  254.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  255.         OK = false;
  256.     }
  257.     // Test reset
  258.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  259.     void* myNull = userTest->getUserData(tempStr);
  260.     if (userSecond != mySecond2) {
  261.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  262.         OK = false;
  263.     }
  264.     if (myNull) {
  265.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  266.         OK = false;
  267.     }
  268.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  269.     void* myNull2 = userTest->getUserData(tempStr2);
  270.     if (mydocument != mydocument2) {
  271.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  272.         OK = false;
  273.     }
  274.     if (myNull2) {
  275.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  276.         OK = false;
  277.     }
  278.     //the userTest user data table should be null now
  279.     if (userTest->getUserData(tempStr)) {
  280.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  281.         OK = false;
  282.     }
  283.     if (userTest->getUserData(tempStr2)) {
  284.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  285.         OK = false;
  286.     }
  287.     // Test DOMUserDataHandler
  288.     // test clone
  289.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  290.     DOMNode* mycloned = userTest->cloneNode(true);
  291.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  292.     // document type cannot be imported, so no test import, rather test the exception
  293.     document->setUserData(tempStr2, (void*) document, &userhandler);
  294.     EXCEPTIONSTEST(document->importNode(userTest,true), DOMException::NOT_SUPPORTED_ERR, OK, 203 );
  295.     // Test isSameNode
  296.     if (!userTest->isSameNode(userTest)) {
  297.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  298.         OK = false;
  299.     }
  300.     if (userTest->isSameNode(document)) {
  301.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  302.         OK = false;
  303.     }
  304.     // Test isEqualNode
  305.     if (!userTest->isEqualNode(mycloned)) {
  306.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  307.         OK = false;
  308.     }
  309.     if (!userTest->isEqualNode(userTest)) {
  310.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  311.         OK = false;
  312.     }
  313.     if (userTest->isEqualNode(document)) {
  314.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  315.         OK = false;
  316.     }
  317.     // Test rename, should throw exception
  318.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 209 );
  319.     if (!OK)
  320.         printf("n*****The DOMDocumentType* method calls listed above failed, all others worked correctly.*****n");
  321.     return OK;
  322. };
  323. /**
  324.  * @param document org.w3c.dom.DOMDocument
  325.  */
  326. bool DOMTest::testDOMerrors(DOMDocument* document) {
  327.     bool OK = true;
  328.     DOMTest tests;
  329.     EXCEPTIONSTEST(document->appendChild(testElementNode), DOMException::HIERARCHY_REQUEST_ERR, OK, 201 );
  330.     EXCEPTIONSTEST(testTextNode->appendChild(testTextNode), DOMException::HIERARCHY_REQUEST_ERR, OK, 202 );
  331.     return OK;
  332. };
  333. /**
  334.  * This method tests DOMImplementation methods for the XML DOM implementation
  335.  * @param document org.w3c.dom.DOMDocument
  336.  *
  337.  */
  338. bool DOMTest::testDOMImplementation(DOMDocument* document)
  339. {
  340.     DOMImplementation* implementation;
  341.     bool result = false;
  342.     bool OK = true;
  343. // For debugging*****   printf("n          testDOMImplementation's outputs:n");
  344.     implementation = document->getImplementation(); //Uses getDOMImplementation to obtain implementation
  345.     XMLString::transcode("XML", tempStr, 3999);
  346.     XMLString::transcode("1.0", tempStr2, 3999);
  347.     result = implementation->hasFeature(tempStr, tempStr2);
  348.     if(!result)
  349.     {
  350.         fprintf(stderr, "Warning!!! DOMImplementation's 'hasFeature' that should be 'true' failed!");
  351.         OK = false;
  352.     }
  353.     XMLString::transcode("HTML", tempStr, 3999);
  354.     XMLString::transcode("4.0", tempStr2, 3999);
  355.     result = implementation->hasFeature(tempStr, tempStr2);
  356.     if(result)
  357.     {
  358.         fprintf(stderr, "Warning!!! DOMImplementation's 'hasFeature' that should be 'false' failed!");
  359.         OK = false;
  360.     }
  361.     if (!OK)
  362.         fprintf(stderr, "n*****The DOMImplementation method calls listed above failed, all others worked correctly.*****n");
  363.     return OK;
  364. };
  365. /**
  366.  * This method tests DOMElement* methods for the XML DOM implementation
  367.  * @param document org.w3c.dom.DOMDocument
  368.  *
  369.  */
  370. bool DOMTest::testElement(DOMDocument* document)
  371. {
  372.     DOMAttr* attributeNode, *newAttributeNode;
  373.     DOMElement* element, *element2;
  374.     DOMNode* node, *node2;
  375.     const char* attributeCompare[] = {"AnotherFirstElementAttribute", "dFirstElement", "testAttribute"};
  376.     const char* elementNames[] =  {"dFirstElement", "dTestBody", "dBodyLevel21","dBodyLevel31","dBodyLevel32",
  377.                    "dBodyLevel22","dBodyLevel33","dBodyLevel34","dBodyLevel23","dBodyLevel24"};
  378.     const char* textCompare[] = {"dBodyLevel31'sChildTextNode11",
  379.                                 "dBodyLevel31'sChildTextNode12",
  380.                                 "dBodyLevel31'sChildTextNode13"};
  381.     DOMNamedNodeMap* nodeMap;
  382.     bool OK = true;
  383.     node = document->getDocumentElement(); // node gets doc's firstElement
  384.     node2 = node->cloneNode(true);
  385.     // Check nodes for equality, both their name and value or lack thereof
  386.     if (!(!XMLString::compareString(node->getNodeName(), node2->getNodeName()) &&        // Compares node names for equality
  387.           (node->getNodeValue() != 0 && node2->getNodeValue() != 0)     // Checks to make sure each node has a value node
  388.         ? !XMLString::compareString(node->getNodeValue(), node2->getNodeValue())         // If both have value nodes test those value nodes for equality
  389.         : (node->getNodeValue() == 0 && node2->getNodeValue() == 0)))   // If one node doesn't have a value node make sure both don't
  390.     {
  391.         fprintf(stderr, "'cloneNode' did not clone the DOMElement* node correctly.n");
  392.         OK = false;
  393.     }
  394.     // Deep clone test comparison is in testNode & testDocument
  395.     element = document->getDocumentElement(); // element gets doc's firstElement
  396.     XMLString::copyString(tempStr, document->getNodeValue());
  397.     XMLString::transcode("'s test attribute", tempStr2, 3999);
  398.     XMLString::catString(tempStr, tempStr2);
  399.     if (XMLString::compareString(XMLUni::fgZeroLenString, element->getAttribute(tempStr)))
  400.     {
  401.         fprintf(stderr, "Warning!!! DOMElement's 'getAttribute' failed!n");
  402.         OK = false;
  403.     }
  404.     XMLString::copyString(tempStr, document->getNodeValue());
  405.     XMLString::transcode("FirstElement", tempStr2, 3999);
  406.     XMLString::catString(tempStr, tempStr2);
  407.     attributeNode = element->getAttributeNode(tempStr);
  408.     if(! (attributeNode == 0))
  409.     {
  410.         fprintf(stderr, "Warning!!! DOMElement's 'getAttributeNode' failed! It should have returned '0' here!n");
  411.         OK = false;
  412.     }
  413.     XMLString::transcode("AnotherFirstElementAttribute", tempStr, 3999);
  414.     newAttributeNode = document->createAttribute(tempStr);
  415.     XMLString::transcode("A new attribute which helps test calls in DOMElement", tempStr, 3999);
  416.     newAttributeNode->setValue(tempStr);
  417.     // This test is incorrect.  It assumes that there is a defined ordering of the entries
  418.     //  in a nodeMap, but there is no ordering required.
  419. #ifdef TheFollowingCheckIsInvalid
  420.     DOMNode* rem2 = element->setAttributeNode(newAttributeNode);
  421.     if (rem2)
  422.         rem2->release();
  423.     nodeMap = element->getAttributes();
  424.     int size = nodeMap->getLength();
  425.     int k;
  426.     for (k = 0; k < size; k++)
  427.     {
  428.         DOMNode*  n = (DOMNode) nodeMap->item(k);
  429.         XMLString::transcode(attributeCompare[k], tempStr, 3999);
  430.         if (XMLString::compareString(tempStr, n->getNodeName())))
  431.         {
  432.             fprintf(stderr, "Warning!!! Comparison of firstElement's attributes failed at line %i.n", __LINE__);
  433.             fprintf(stderr, "   This failure can be a result of DOMElement's 'setValue' and/or 'setAttributeNode' and/or 'getAttributes' failing.n");
  434.             OK = false;
  435.             break;
  436.         }
  437.     //  printf("firstElement's attribute number " + k + " : " + n->getNodeName());
  438.     }
  439. #endif
  440.     nodeMap = element->getAttributes();
  441.     int size = nodeMap->getLength();
  442.     if (size != 2)
  443.     {
  444.         fprintf(stderr, "DOMElement* Tests Failure 001n");
  445.         OK = false;
  446.     };
  447.     DOMNode* rem = element->setAttributeNode(newAttributeNode);
  448.     if (rem)
  449.         rem->release();
  450.     size = nodeMap->getLength();
  451.     if (size != 3)
  452.     {
  453.         fprintf(stderr, "DOMElement* Tests Failure 002n");
  454.         OK = false;
  455.     };
  456.     // Fetch the newly added attribute node back out of from the named node map,
  457.     //  and check that we are returned the same node that we put in->
  458.     XMLString::transcode("AnotherFirstElementAttribute", tempStr, 3999);
  459.     DOMNode*  abc12 = nodeMap->getNamedItem(tempStr);
  460.     DOMAttr* fetchedAttr = (DOMAttr*) abc12;
  461.     if (fetchedAttr != newAttributeNode)
  462.     {
  463.         fprintf(stderr, "DOMElement* Tests Failure 003n");
  464.         OK = false;
  465.     };
  466.     // Fetch the newly added attribute back out directly from the element itself.
  467.     XMLString::transcode("AnotherFirstElementAttribute", tempStr, 3999);
  468.     fetchedAttr = element->getAttributeNode(tempStr);
  469.     if (fetchedAttr != newAttributeNode)
  470.     {
  471.         fprintf(stderr, "DOMElement* Tests Failure 004n");
  472.         OK = false;
  473.     };
  474.     XMLString::transcode("*",tempStr, 3999);
  475.     DOMNodeList* docElements = document->getElementsByTagName(tempStr);
  476.     int docSize = docElements->getLength();
  477.     int i;
  478.     for (i = 0; i < docSize; i++)
  479.     {
  480.         DOMNode*  n = docElements->item(i);
  481.         XMLString::transcode(elementNames[i], tempStr, 3999);
  482.         if (XMLString::compareString(tempStr, n->getNodeName()))
  483.         {
  484.             fprintf(stderr, "Warning!!! Comparison of DOMElement's 'getElementsByTagName' "
  485.                             "and/or 'item' failed at element number %d at line %i n", i, __LINE__ );
  486.             fprintf(stderr, "n");
  487.             OK = false;
  488.             break;
  489.         }
  490.     //  printf("docElement's number " + i + " is: " + n->getNodeName());
  491.     }
  492.     XMLString::transcode("dBodyLevel21", tempStr, 3999);
  493.     DOMNode*  abc15 = document->getElementsByTagName(tempStr)->item(0); // element gets DOMElement* test BodyLevel21
  494.     element = (DOMElement*) abc15;
  495.     XMLString::transcode("dBodyLevel31", tempStr, 3999);
  496.     DOMNode*  abc16 = document->getElementsByTagName(tempStr)->item(0); // element2 gets DOMElement* test BodyLevel31
  497.     element2 = (DOMElement*) abc16;
  498.     DOMNodeList* text = ((DOMNode*  &) element2)->getChildNodes();
  499.     int textSize = text->getLength();
  500.     int j;
  501.     static bool firstTime = true;
  502.     if (firstTime)
  503.     {
  504.         firstTime = false;      // Temporary fix.  Subsequent tests alter the doc, causing
  505.                                 //   this test to fail on all but the first time through.
  506.         for (j = 0; j < textSize; j++)
  507.         {
  508.             DOMNode*  n = text->item(j);
  509.             XMLString::transcode(textCompare[j], tempStr, 3999);
  510.             if (XMLString::compareString(tempStr, n->getNodeValue()))
  511.             {
  512.                 fprintf(stderr, "Warning!!! Comparison of original text nodes via DOMNode*  'getChildNodes' & DOMNodeList 'item'n"
  513.                     "     failed at text node: #%d at line %i n     ", j, __LINE__ );
  514.                 OK = false;
  515.                 break;
  516.             }
  517.             //  printf("DOMElement* testBodyLevel31's child text node " + j + " is: " + n->getNodeValue());
  518.         }
  519.     }
  520.     element = document->getDocumentElement(); // element gets doc's firstElement
  521.     element->normalize();        // Concatenates all adjacent text nodes in this element's subtree
  522.     DOMNodeList* text2 = ((DOMNode*) element2)->getChildNodes();
  523.     XMLString::transcode("dBodyLevel31'sChildTextNode11dBodyLevel31'sChildTextNode12dBodyLevel31'sChildTextNode13", tempStr, 3999);
  524.     DOMNode*  n = text2->item(0);
  525.     if (XMLString::compareString(tempStr, n->getNodeValue()))
  526.     {
  527.         fprintf(stderr, "Warning!!! Comparison of concatenated text nodes created by DOMElement's 'normalize' failed!n");
  528.         OK = false;
  529.     }
  530.     XMLString::transcode("FirstElementLastAttribute", tempStr, 3999);
  531.     XMLString::transcode("More attribute stuff for firstElement!!", tempStr2, 3999);
  532.     element->setAttribute(tempStr, tempStr2);
  533.     XMLString::transcode("FirstElementLastAttribute", tempStr, 3999);
  534.     element->removeAttribute(tempStr);
  535.     rem = element->removeAttributeNode(newAttributeNode);
  536.     if (rem)
  537.         rem->release();
  538.     //  doc->getLastChild()->setNodeValue("This shouldn't work");//!! Throws a NO_MODIFICATION_ALLOWED_ERR***
  539.     // Test the user data
  540.     // Test simple set and get
  541.     DOMElement* userTest = element;
  542.     DOMAttr*  userFirst = newAttributeNode;
  543.     XMLCh* userSecond = tempStr2;
  544.     XMLString::transcode("first", tempStr, 3999);
  545.     XMLString::transcode("document", tempStr2, 3999);
  546.     userTest->setUserData(tempStr2, (void*) document, 0);
  547.     void* mydocument = userTest->getUserData(tempStr2);
  548.     if (document != mydocument) {
  549.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  550.         OK = false;
  551.     }
  552.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  553.     void* myFirst = userTest->getUserData(tempStr);
  554.     if (userFirst != myFirst) {
  555.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  556.         OK = false;
  557.     }
  558.     // Test overwrite
  559.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  560.     void* mySecond = userTest->getUserData(tempStr);
  561.     if (userSecond != mySecond) {
  562.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  563.         OK = false;
  564.     }
  565.     if (userFirst != myFirst2) {
  566.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  567.         OK = false;
  568.     }
  569.     if (userFirst == mySecond) {
  570.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  571.         OK = false;
  572.     }
  573.     // Test null
  574.     // test non-exist key
  575.     XMLString::transcode("not-exist", tempStr3, 3999);
  576.     if (userTest->getUserData(tempStr3)) {
  577.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  578.         OK = false;
  579.     }
  580.     // use a node that does not have user data set before
  581.     if (userFirst->getUserData(tempStr)) {
  582.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  583.         OK = false;
  584.     }
  585.     // Test reset
  586.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  587.     void* myNull = userTest->getUserData(tempStr);
  588.     if (userSecond != mySecond2) {
  589.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  590.         OK = false;
  591.     }
  592.     if (myNull) {
  593.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  594.         OK = false;
  595.     }
  596.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  597.     void* myNull2 = userTest->getUserData(tempStr2);
  598.     if (mydocument != mydocument2) {
  599.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  600.         OK = false;
  601.     }
  602.     if (myNull2) {
  603.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  604.         OK = false;
  605.     }
  606.     //the userTest user data table should be null now
  607.     if (userTest->getUserData(tempStr)) {
  608.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  609.         OK = false;
  610.     }
  611.     if (userTest->getUserData(tempStr2)) {
  612.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  613.         OK = false;
  614.     }
  615.     // Test DOMUserDataHandler
  616.     // test clone
  617.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  618.     DOMNode* mycloned = userTest->cloneNode(true);
  619.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  620.     // test import
  621.     document->setUserData(tempStr2, (void*) document, &userhandler);
  622.     DOMNode* myimport = document->importNode(userTest,true);
  623.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  624.     // test delete
  625.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  626.     myimport->release();
  627.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  628.     // Test isSameNode
  629.     if (!userTest->isSameNode(userTest)) {
  630.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  631.         OK = false;
  632.     }
  633.     if (userTest->isSameNode(userFirst)) {
  634.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  635.         OK = false;
  636.     }
  637.     // Test isEqualNode
  638.     if (!userTest->isEqualNode(mycloned)) {
  639.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  640.         OK = false;
  641.     }
  642.     if (!userTest->isEqualNode(userTest)) {
  643.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  644.         OK = false;
  645.     }
  646.     if (userTest->isEqualNode(userFirst)) {
  647.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  648.         OK = false;
  649.     }
  650.     // Test renameNode
  651.     XMLString::transcode("http://nsa", tempStr4, 3999);
  652.     XMLString::transcode("aa", tempStr5, 3999);
  653.     XMLString::transcode("pnsa:aa", tempStr3, 3999);
  654.     // create the element
  655.     DOMElement* renameTestElement = document->createElement(tempStr5);
  656.     DOMElement* renameTestElementNS = document->createElementNS(tempStr4, tempStr3);
  657.     // create the parent
  658.     DOMElement* renameTestParent = document->createElement(tempStr5);
  659.     renameTestParent->appendChild(renameTestElement);
  660.     renameTestParent->appendChild(renameTestElementNS);
  661.     // set up the userdata
  662.     renameTestElement->setUserData(tempStr5, (void*) document, &userhandler);
  663.     renameTestElementNS->setUserData(tempStr4, (void*) document, 0);
  664.     // append a text node as child
  665.     DOMText* renameTestText = document->createTextNode(tempStr5);
  666.     DOMText* renameTestTextNS = document->createTextNode(tempStr4);
  667.     renameTestElement->appendChild(renameTestText);
  668.     renameTestElementNS->appendChild(renameTestTextNS);
  669.     XMLString::transcode("http://nsb", tempStr, 3999);
  670.     XMLString::transcode("bb", tempStr2, 3999);
  671.     XMLString::transcode("pnsb:bb", tempStr3, 3999);
  672.     // set up some attributes
  673.     DOMAttr* renameTestAttribute = document->createAttribute(tempStr5);
  674.     DOMAttr* renameTestAttributeNS = document->createAttributeNS(tempStr4, tempStr3);
  675.     renameTestElement->setAttributeNode(renameTestAttribute);
  676.     renameTestElementNS->setAttributeNodeNS(renameTestAttributeNS);
  677.     //Test compareTreePosition first before testing rename
  678.     // renameTestParent
  679.     //  |
  680.     //  |_ renameTestElement (has renameTestAttribute)
  681.     //  |          |
  682.     //  |          |_ renameTestText
  683.     //  |
  684.     //  |_ renameTestElementNS (has renameTestAttributeNS)
  685.     //  |          |
  686.     //  |          |_ renameTestTextNS
  687.     //
  688.     COMPARETREEPOSITIONTEST(renameTestAttribute, renameTestAttributeNS, DOMNode::TREE_POSITION_FOLLOWING, __LINE__);
  689.     COMPARETREEPOSITIONTEST(renameTestAttribute, renameTestElement, DOMNode::TREE_POSITION_PRECEDING, __LINE__);
  690.     COMPARETREEPOSITIONTEST(renameTestAttribute, renameTestText, DOMNode::TREE_POSITION_FOLLOWING, __LINE__);
  691.     COMPARETREEPOSITIONTEST(renameTestAttribute, renameTestTextNS, DOMNode::TREE_POSITION_FOLLOWING, __LINE__);
  692.     COMPARETREEPOSITIONTEST(renameTestAttribute, renameTestParent, DOMNode::TREE_POSITION_PRECEDING, __LINE__);
  693.     COMPARETREEPOSITIONTEST(renameTestAttributeNS, renameTestAttribute, DOMNode::TREE_POSITION_PRECEDING, __LINE__);
  694.     COMPARETREEPOSITIONTEST(renameTestElement, renameTestAttributeNS, DOMNode::TREE_POSITION_FOLLOWING, __LINE__);
  695.     COMPARETREEPOSITIONTEST(renameTestAttributeNS, renameTestText, DOMNode::TREE_POSITION_PRECEDING, __LINE__);
  696.     COMPARETREEPOSITIONTEST(renameTestTextNS, renameTestAttributeNS, DOMNode::TREE_POSITION_PRECEDING, __LINE__);
  697.     // start the rename tests
  698.     // rename the NS Element
  699.     DOMElement* renameTest = (DOMElement*) document->renameNode(renameTestElementNS, tempStr, tempStr3);
  700.     // test the name
  701.     if (XMLString::compareString(tempStr, renameTest->getNamespaceURI()))
  702.     {
  703.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  704.         OK = false;
  705.     }
  706.     if (XMLString::compareString(tempStr2, renameTest->getLocalName()))
  707.     {
  708.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  709.         OK = false;
  710.     }
  711.     if (XMLString::compareString(tempStr3, renameTest->getNodeName()))
  712.     {
  713.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  714.         OK = false;
  715.     }
  716.     // test the child / nodevalue
  717.     if (XMLString::compareString(tempStr4, renameTest->getFirstChild()->getNodeValue()))
  718.     {
  719.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  720.         OK = false;
  721.     }
  722.     // test the attribute
  723.     if (!renameTest->getAttributeNodeNS(tempStr4, tempStr2))
  724.     {
  725.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  726.         OK = false;
  727.     }
  728.     // test the owner element
  729.     if (renameTestParent->getElementsByTagNameNS(tempStr, tempStr2)->getLength() != 1) {
  730.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  731.         OK = false;
  732.     }
  733.     if (renameTestParent->getElementsByTagNameNS(tempStr4, tempStr5)->getLength() != 0) {
  734.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  735.         OK = false;
  736.     }
  737.     // test user data
  738.     void* renamedocument = renameTest->getUserData(tempStr4);
  739.     if (document != renamedocument) {
  740.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  741.         OK = false;
  742.     }
  743.     // test isSame and isEqual
  744.     if (!renameTestElementNS->isEqualNode(renameTest)) {
  745.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  746.         OK = false;
  747.     }
  748.     if (!renameTestElementNS->isSameNode(renameTest)) {
  749.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  750.         OK = false;
  751.     }
  752.     // rename the Element (null namespace)
  753.     renameTest = (DOMElement*) document->renameNode(renameTestElement, 0, tempStr2);
  754.     // test the name
  755.     if (renameTest->getNamespaceURI())
  756.     {
  757.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  758.         OK = false;
  759.     }
  760.     if (renameTest->getLocalName())
  761.     {
  762.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  763.         OK = false;
  764.     }
  765.     if (XMLString::compareString(tempStr2, renameTest->getNodeName()))
  766.     {
  767.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  768.         OK = false;
  769.     }
  770.     // test the child / nodevalue
  771.     if (XMLString::compareString(tempStr5, renameTest->getFirstChild()->getNodeValue()))
  772.     {
  773.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  774.         OK = false;
  775.     }
  776.     // test the attribute
  777.     if (!renameTest->getAttributeNode(tempStr5))
  778.     {
  779.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  780.         OK = false;
  781.     }
  782.     // test the owner element
  783.     if (renameTestParent->getElementsByTagName(tempStr2)->getLength() != 1) {
  784.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  785.         OK = false;
  786.     }
  787.     if (renameTestParent->getElementsByTagName(tempStr5)->getLength() != 0) {
  788.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  789.         OK = false;
  790.     }
  791.     // test user data
  792.     renamedocument = renameTest->getUserData(tempStr5);
  793.     if (document != renamedocument) {
  794.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  795.         OK = false;
  796.     }
  797.     // test isSame and isEqual
  798.     if (!renameTestElement->isEqualNode(renameTest)) {
  799.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  800.         OK = false;
  801.     }
  802.     if (!renameTestElement->isSameNode(renameTest)) {
  803.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  804.         OK = false;
  805.     }
  806.     // rename the Element (with namespace)
  807.     renameTest = (DOMElement*) document->renameNode(renameTestElement, tempStr, tempStr3);
  808.     // test the name
  809.     if (XMLString::compareString(tempStr, renameTest->getNamespaceURI()))
  810.     {
  811.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  812.         OK = false;
  813.     }
  814.     if (XMLString::compareString(tempStr2, renameTest->getLocalName()))
  815.     {
  816.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  817.         OK = false;
  818.     }
  819.     if (XMLString::compareString(tempStr3, renameTest->getNodeName()))
  820.     {
  821.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  822.         OK = false;
  823.     }
  824.     // test the child / nodevalue
  825.     if (XMLString::compareString(tempStr5, renameTest->getFirstChild()->getNodeValue()))
  826.     {
  827.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  828.         OK = false;
  829.     }
  830.     if (renameTestElement->getFirstChild())
  831.     {
  832.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  833.         OK = false;
  834.     }
  835.     // test the attribute
  836.     if (!renameTest->getAttributeNode(tempStr5))
  837.     {
  838.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  839.         OK = false;
  840.     }
  841.     if (renameTestElement->getAttributeNode(tempStr5))
  842.     {
  843.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  844.         OK = false;
  845.     }
  846.     // test the owner element
  847.     // the nodelist should be 2 items as we have to count the renameTestElementNS as well
  848.     if (renameTestParent->getElementsByTagNameNS(tempStr, tempStr2)->getLength() != 2) {
  849.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  850.         OK = false;
  851.     }
  852.     if (renameTestParent->getElementsByTagNameNS(0, tempStr2)->getLength() != 0) {
  853.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  854.         OK = false;
  855.     }
  856.     if (renameTestParent->getElementsByTagName(tempStr2)->getLength() != 0) {
  857.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  858.         OK = false;
  859.     }
  860.     // test user data
  861.     renamedocument = renameTest->getUserData(tempStr5);
  862.     if (document != renamedocument) {
  863.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  864.         OK = false;
  865.     }
  866.     // test userdatahandler
  867.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_RENAMED, tempStr5, document, renameTestElement, renameTest, __LINE__);
  868.     // test isSame and isEqual
  869.     // a new node is created here, so both isSame and isEqual are not compared
  870.     if (renameTestElement->isEqualNode(renameTest)) {
  871.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  872.         OK = false;
  873.     }
  874.     if (renameTestElement->isSameNode(renameTest)) {
  875.         fprintf(stderr, "renameNode failed in line %in", __LINE__);
  876.         OK = false;
  877.     }
  878.     //setIdAttribute tests
  879.     XMLString::transcode("http://nsa", tempStr4, 3999);
  880.     XMLString::transcode("aa", tempStr5, 3999);
  881.     DOMAttr *idAtt = document->createAttributeNS(tempStr4, tempStr5);
  882.     //tests for node not being on testElementNode
  883.     EXCEPTIONSTEST(testElementNode->setIdAttribute(tempStr4), DOMException::NOT_FOUND_ERR, OK,  1000);
  884.     EXCEPTIONSTEST(testElementNode->setIdAttributeNS(tempStr4, tempStr5), DOMException::NOT_FOUND_ERR, OK,  1001);
  885.     EXCEPTIONSTEST(testElementNode->setIdAttributeNode(idAtt), DOMException::NOT_FOUND_ERR, OK,  1002);
  886.     //should test NO_MODIFICATION_ALLOWED_ERR but dont know how to without direct access to DOMAttrImpl.
  887.     idAtt = document->createAttributeNS(tempStr4, tempStr5);
  888.     idAtt->setValue(tempStr3);
  889.     testElementNode->setAttributeNode(idAtt);
  890.     testElementNode->setIdAttributeNode(idAtt);
  891.     if(!idAtt->isId()) {
  892.         fprintf(stderr, "setIdAttributeNode failed in line %in", __LINE__);
  893.         OK = false;
  894.     }
  895.     DOMElement *idEle = document->getElementById(tempStr3);
  896.     if(!idEle || !idEle->isSameNode(testElementNode)) {
  897.         fprintf(stderr, "setIdAttributeNode failed in line %in", __LINE__);
  898.         OK = false;
  899.     }
  900.     testElementNode->removeAttributeNode(idAtt);
  901.     XMLString::transcode("someval", tempStr3, 3999);
  902.     idAtt = document->createAttributeNS(tempStr4, tempStr5);
  903.     idAtt->setValue(tempStr3);
  904.     testElementNode->setAttributeNode(idAtt);
  905.     testElementNode->setIdAttributeNS(tempStr4, tempStr5);
  906.     if(!idAtt->isId()) {
  907.         fprintf(stderr, "setIdAttributeNS failed in line %in", __LINE__);
  908.         OK = false;
  909.     }
  910.     idEle = document->getElementById(tempStr3);
  911.     if(!idEle || !idEle->isSameNode(testElementNode)) {
  912.         fprintf(stderr, "setIdAttributeNS failed in line %in", __LINE__);
  913.         OK = false;
  914.     }
  915.     testElementNode->removeAttributeNode(idAtt);
  916.     idAtt->release();
  917.     XMLString::transcode("somevalDif", tempStr3, 3999);
  918.     idAtt = document->createAttribute(tempStr5);
  919.     idAtt->setValue(tempStr3);
  920.     testElementNode->setAttributeNode(idAtt);
  921.     testElementNode->setIdAttribute(tempStr5);
  922.     if(!idAtt->isId()) {
  923.         fprintf(stderr, "setIdAttribute failed in line %in", __LINE__);
  924.         OK = false;
  925.     }
  926.     idEle = document->getElementById(tempStr3);
  927.     if(!idEle || !idEle->isSameNode(testElementNode)) {
  928.         fprintf(stderr, "setIdAttribute failed in line %in", __LINE__);
  929.         OK = false;
  930.     }
  931.     testElementNode->removeAttributeNode(idAtt);
  932.     idAtt->release();
  933.     if (!OK)
  934.         printf("n*****The DOMElement* method calls listed above failed, all others worked correctly.*****n");
  935.     return OK;
  936. };
  937. /**
  938.  * This method tests DOMEntity* methods for the XML DOM implementation
  939.  * @param document org.w3c.dom.DOMDocument
  940.  *
  941.  */
  942. bool DOMTest::testEntity(DOMDocument* document)
  943. {
  944.     DOMEntity* entity;
  945.     DOMNode* node, *node2;
  946.     bool OK = true;
  947. // For debugging*****   printf("n          testEntity's outputs:nn");
  948.     XMLString::transcode("ourEntityNode", tempStr, 3999);
  949.     DOMNode*  abc20 = document->getDoctype()->getEntities()->getNamedItem(tempStr);
  950.     entity = (DOMEntity*) abc20;
  951.     node = entity;
  952.     node2 = entity->cloneNode(true);
  953.     // Check nodes for equality, both their name and value or lack thereof
  954.     if (!(!XMLString::compareString(node->getNodeName(), node2->getNodeName()) &&        // Compares node names for equality
  955.           (node->getNodeValue() != 0 && node2->getNodeValue() != 0)     // Checks to make sure each node has a value node
  956.         ? !XMLString::compareString(node->getNodeValue(), node2->getNodeValue())         // If both have value nodes test those value nodes for equality
  957.         : (node->getNodeValue() == 0 && node2->getNodeValue() == 0)))   // If one node doesn't have a value node make sure both don't
  958.     {
  959.         fprintf(stderr, "'cloneNode' did not clone the DOMEntity* node correctly");
  960.         OK = false;
  961.     }
  962.     // Deep clone test comparison is in testNode & testDocument
  963.     // Test the user data
  964.     // Test simple set and get
  965.     DOMEntity* userTest = entity;
  966.     DOMNode*  userFirst = node;
  967.     XMLCh* userSecond = tempStr2;
  968.     XMLString::transcode("first", tempStr, 3999);
  969.     XMLString::transcode("document", tempStr2, 3999);
  970.     userTest->setUserData(tempStr2, (void*) document, 0);
  971.     void* mydocument = userTest->getUserData(tempStr2);
  972.     if (document != mydocument) {
  973.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  974.         OK = false;
  975.     }
  976.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  977.     void* myFirst = userTest->getUserData(tempStr);
  978.     if (userFirst != myFirst) {
  979.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  980.         OK = false;
  981.     }
  982.     // Test overwrite
  983.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  984.     void* mySecond = userTest->getUserData(tempStr);
  985.     if (userSecond != mySecond) {
  986.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  987.         OK = false;
  988.     }
  989.     if (userFirst != myFirst2) {
  990.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  991.         OK = false;
  992.     }
  993.     if (userFirst == mySecond) {
  994.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  995.         OK = false;
  996.     }
  997.     // Test null
  998.     // test non-exist key
  999.     XMLString::transcode("not-exist", tempStr3, 3999);
  1000.     if (userTest->getUserData(tempStr3)) {
  1001.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1002.         OK = false;
  1003.     }
  1004.     // use a node that does not have user data set before
  1005.     if (userFirst->getUserData(tempStr)) {
  1006.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1007.         OK = false;
  1008.     }
  1009.     // Test reset
  1010.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  1011.     void* myNull = userTest->getUserData(tempStr);
  1012.     if (userSecond != mySecond2) {
  1013.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1014.         OK = false;
  1015.     }
  1016.     if (myNull) {
  1017.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1018.         OK = false;
  1019.     }
  1020.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  1021.     void* myNull2 = userTest->getUserData(tempStr2);
  1022.     if (mydocument != mydocument2) {
  1023.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1024.         OK = false;
  1025.     }
  1026.     if (myNull2) {
  1027.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1028.         OK = false;
  1029.     }
  1030.     //the userTest user data table should be null now
  1031.     if (userTest->getUserData(tempStr)) {
  1032.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1033.         OK = false;
  1034.     }
  1035.     if (userTest->getUserData(tempStr2)) {
  1036.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1037.         OK = false;
  1038.     }
  1039.     // Test DOMUserDataHandler
  1040.     // test clone
  1041.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  1042.     DOMNode* mycloned = userTest->cloneNode(true);
  1043.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  1044.     // test import
  1045.     document->setUserData(tempStr2, (void*) document, &userhandler);
  1046.     DOMNode* myimport = document->importNode(userTest,true);
  1047.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  1048.     // test delete
  1049.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  1050.     myimport->release();
  1051.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  1052.     // Test isSameNode
  1053.     if (!userTest->isSameNode(userTest)) {
  1054.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1055.         OK = false;
  1056.     }
  1057.     if (userTest->isSameNode(userFirst)) {
  1058.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1059.         OK = false;
  1060.     }
  1061.     // Test isEqualNode
  1062.     if (!userTest->isEqualNode(mycloned)) {
  1063.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1064.         OK = false;
  1065.     }
  1066.     if (!userTest->isEqualNode(userTest)) {
  1067.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1068.         OK = false;
  1069.     }
  1070.     if (userTest->isEqualNode(userFirst)) {
  1071.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1072.         OK = false;
  1073.     }
  1074.     // Test rename, should throw exception
  1075.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 210 );
  1076.     if (!OK)
  1077.         printf("n*****The DOMEntity* method calls listed above failed, all others worked correctly.*****n");
  1078.     return OK;
  1079. };
  1080. /**
  1081.  * This method tests DOMEntityReference* methods for the XML DOM implementation
  1082.  * @param document org.w3c.dom.DOMDocument
  1083.  *
  1084.  */
  1085. bool DOMTest::testEntityReference(DOMDocument* document)
  1086. {
  1087.     DOMEntityReference* entityReference;
  1088.     DOMNode* node, *node2;
  1089.     bool OK = true;
  1090. // For debugging*****   printf("n          testEntityReference's outputs:n");
  1091.     DOMNode*  abc30 = document->getLastChild()->getLastChild()->getLastChild()->getFirstChild();
  1092.     entityReference = (DOMEntityReference*) abc30;
  1093.     node = entityReference;
  1094.     node2 = node->cloneNode(true);
  1095.     // Check nodes for equality, both their name and value or lack thereof
  1096.     if (!(!XMLString::compareString(node->getNodeName(), node2->getNodeName()) &&        // Compares node names for equality
  1097.           (node->getNodeValue() != 0 && node2->getNodeValue() != 0)     // Checks to make sure each node has a value node
  1098.         ? !XMLString::compareString(node->getNodeValue(), node2->getNodeValue())         // If both have value nodes test those value nodes for equality
  1099.         : (node->getNodeValue() == 0 && node2->getNodeValue() == 0)))   // If one node doesn't have a value node make sure both don't
  1100.     {
  1101.         fprintf(stderr, "'cloneNode' did not clone the DOMEntityReference* node correctlyn");
  1102.         OK = false;
  1103.     }
  1104.     // Deep clone test comparison is in testNode & testDocument
  1105.     //  entityReference->setNodeValue("This shouldn't work");//!! Throws a NO_MODIFICATION_ALLOWED_ERR ********
  1106.     // Test the user data
  1107.     // Test simple set and get
  1108.     DOMEntityReference* userTest = entityReference;
  1109.     DOMNode*  userFirst = node2;
  1110.     XMLCh* userSecond = tempStr2;
  1111.     XMLString::transcode("first", tempStr, 3999);
  1112.     XMLString::transcode("document", tempStr2, 3999);
  1113.     userTest->setUserData(tempStr2, (void*) document, 0);
  1114.     void* mydocument = userTest->getUserData(tempStr2);
  1115.     if (document != mydocument) {
  1116.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1117.         OK = false;
  1118.     }
  1119.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  1120.     void* myFirst = userTest->getUserData(tempStr);
  1121.     if (userFirst != myFirst) {
  1122.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1123.         OK = false;
  1124.     }
  1125.     // Test overwrite
  1126.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  1127.     void* mySecond = userTest->getUserData(tempStr);
  1128.     if (userSecond != mySecond) {
  1129.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1130.         OK = false;
  1131.     }
  1132.     if (userFirst != myFirst2) {
  1133.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1134.         OK = false;
  1135.     }
  1136.     if (userFirst == mySecond) {
  1137.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1138.         OK = false;
  1139.     }
  1140.     // Test null
  1141.     // test non-exist key
  1142.     XMLString::transcode("not-exist", tempStr3, 3999);
  1143.     if (userTest->getUserData(tempStr3)) {
  1144.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1145.         OK = false;
  1146.     }
  1147.     // use a node that does not have user data set before
  1148.     if (node2->getUserData(tempStr)) {
  1149.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1150.         OK = false;
  1151.     }
  1152.     // Test reset
  1153.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  1154.     void* myNull = userTest->getUserData(tempStr);
  1155.     if (userSecond != mySecond2) {
  1156.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1157.         OK = false;
  1158.     }
  1159.     if (myNull) {
  1160.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1161.         OK = false;
  1162.     }
  1163.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  1164.     void* myNull2 = userTest->getUserData(tempStr2);
  1165.     if (mydocument != mydocument2) {
  1166.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1167.         OK = false;
  1168.     }
  1169.     if (myNull2) {
  1170.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1171.         OK = false;
  1172.     }
  1173.     //the userTest user data table should be null now
  1174.     if (userTest->getUserData(tempStr)) {
  1175.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1176.         OK = false;
  1177.     }
  1178.     if (userTest->getUserData(tempStr2)) {
  1179.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1180.         OK = false;
  1181.     }
  1182.     // Test DOMUserDataHandler
  1183.     // test clone
  1184.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  1185.     DOMNode* mycloned = userTest->cloneNode(true);
  1186.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  1187.     // test import
  1188.     document->setUserData(tempStr2, (void*) document, &userhandler);
  1189.     DOMNode* myimport = document->importNode(userTest,true);
  1190.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  1191.     // test delete
  1192.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  1193.     myimport->release();
  1194.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  1195.     // Test isSameNode
  1196.     if (!userTest->isSameNode(userTest)) {
  1197.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1198.         OK = false;
  1199.     }
  1200.     if (userTest->isSameNode(userFirst)) {
  1201.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1202.         OK = false;
  1203.     }
  1204.     // Test isEqualNode
  1205.     if (!userTest->isEqualNode(mycloned)) {
  1206.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1207.         OK = false;
  1208.     }
  1209.     if (!userTest->isEqualNode(userTest)) {
  1210.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1211.         OK = false;
  1212.     }
  1213.     if (userTest->isEqualNode(document)) {
  1214.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1215.         OK = false;
  1216.     }
  1217.     // Test rename, should throw exception
  1218.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 211 );
  1219.     if (!OK)
  1220.         printf("n*****The DOMEntityReference* method calls listed above failed, all others worked correctly.*****n");
  1221.     return OK;
  1222. };
  1223. /**
  1224.  * This method tests DOMNode*  methods for the XML DOM implementation
  1225.  * @param document org.w3c.dom.DOMDocument
  1226.  *
  1227.  *
  1228.  *
  1229.  ********* This is only for a test of cloneNode "deep"*******
  1230.  ********* And for error tests*********
  1231.  */
  1232. bool DOMTest::testNode(DOMDocument* document)
  1233. {
  1234.     DOMNode* node, *node2;
  1235.     bool result;
  1236.     bool OK = true;
  1237. // For debugging*****   printf("n          testNode's outputs:n");
  1238.     node = document->getDocumentElement();
  1239.     node2 = node->cloneNode(true);
  1240.     result = treeCompare(node, node2); // Deep clone test of cloneNode
  1241.     if (result)
  1242.     {
  1243.         //printf("'cloneNode' successfully cloned this whole node tree (deep)!n");
  1244.     }
  1245.     else
  1246.     {
  1247.         fprintf(stderr, "'cloneNode' did not successfully clone this whole node tree (deep)!n");
  1248.         OK = false;
  1249.     }
  1250.     //!! The following gives a did not clone successfully message*********
  1251.     node = document->getDocumentElement();
  1252.     node2 = node->getFirstChild();
  1253.     result = treeCompare(node, node2);
  1254.     if (!result)
  1255.     {
  1256.         //fprintf(stderr, "'cloneNode' did not successfully clone this whole node tree (deep)!n");
  1257.     }
  1258.     else
  1259.     {
  1260.         fprintf(stderr, "'cloneNode' was supposed to fail here, either it or 'treeCompare' failed!!!n");
  1261.         OK = false;
  1262.     }
  1263.     // Deep clone test also in testDocument
  1264.     // Test the user data
  1265.     // Test simple set and get
  1266.     DOMNode* userTest = node;
  1267.     DOMNode*  userFirst = node2;
  1268.     XMLCh* userSecond = tempStr2;
  1269.     XMLString::transcode("first", tempStr, 3999);
  1270.     XMLString::transcode("document", tempStr2, 3999);
  1271.     userTest->setUserData(tempStr2, (void*) document, 0);
  1272.     void* mydocument = userTest->getUserData(tempStr2);
  1273.     if (document != mydocument) {
  1274.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1275.         OK = false;
  1276.     }
  1277.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  1278.     void* myFirst = userTest->getUserData(tempStr);
  1279.     if (userFirst != myFirst) {
  1280.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1281.         OK = false;
  1282.     }
  1283.     // Test overwrite
  1284.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  1285.     void* mySecond = userTest->getUserData(tempStr);
  1286.     if (userSecond != mySecond) {
  1287.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1288.         OK = false;
  1289.     }
  1290.     if (userFirst != myFirst2) {
  1291.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1292.         OK = false;
  1293.     }
  1294.     if (userFirst == mySecond) {
  1295.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1296.         OK = false;
  1297.     }
  1298.     // Test null
  1299.     // test non-exist key
  1300.     XMLString::transcode("not-exist", tempStr3, 3999);
  1301.     if (userTest->getUserData(tempStr3)) {
  1302.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1303.         OK = false;
  1304.     }
  1305.     // use a node that does not have user data set before
  1306.     if (userFirst->getUserData(tempStr)) {
  1307.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1308.         OK = false;
  1309.     }
  1310.     // Test reset
  1311.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  1312.     void* myNull = userTest->getUserData(tempStr);
  1313.     if (userSecond != mySecond2) {
  1314.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1315.         OK = false;
  1316.     }
  1317.     if (myNull) {
  1318.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1319.         OK = false;
  1320.     }
  1321.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  1322.     void* myNull2 = userTest->getUserData(tempStr2);
  1323.     if (mydocument != mydocument2) {
  1324.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1325.         OK = false;
  1326.     }
  1327.     if (myNull2) {
  1328.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1329.         OK = false;
  1330.     }
  1331.     //the userTest user data table should be null now
  1332.     if (userTest->getUserData(tempStr)) {
  1333.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1334.         OK = false;
  1335.     }
  1336.     if (userTest->getUserData(tempStr2)) {
  1337.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1338.         OK = false;
  1339.     }
  1340.     // Test DOMUserDataHandler
  1341.     // test clone
  1342.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  1343.     DOMNode* mycloned = userTest->cloneNode(true);
  1344.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  1345.     // test import
  1346.     document->setUserData(tempStr2, (void*) document, &userhandler);
  1347.     DOMNode* myimport = document->importNode(userTest,true);
  1348.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  1349.     // test delete
  1350.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  1351.     myimport->release();
  1352.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  1353.     // Test isSameNode
  1354.     if (!userTest->isSameNode(userTest)) {
  1355.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1356.         OK = false;
  1357.     }
  1358.     if (userTest->isSameNode(userFirst)) {
  1359.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1360.         OK = false;
  1361.     }
  1362.     // Test isEqualNode
  1363.     if (!userTest->isEqualNode(mycloned)) {
  1364.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1365.         OK = false;
  1366.     }
  1367.     if (!userTest->isEqualNode(userTest)) {
  1368.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1369.         OK = false;
  1370.     }
  1371.     if (userTest->isEqualNode(document)) {
  1372.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1373.         OK = false;
  1374.     }
  1375.     if (!OK)
  1376.         printf("n*****The DOMNode*  method calls listed above failed, all others worked correctly.*****n");
  1377.     return OK;
  1378. };
  1379. /**
  1380.  * This method tests DOMNotation* methods for the XML DOM implementation
  1381.  * @param document org.w3c.dom.DOMDocument
  1382.  *
  1383.  */
  1384. bool DOMTest::testNotation(DOMDocument* document)
  1385. {
  1386.     DOMNode* node, *node2;
  1387.     DOMNotation* notation;
  1388.     bool OK = true;
  1389. // For debugging*****   printf("n          testNotation's outputs:n");
  1390.     XMLString::transcode("ourNotationNode", tempStr, 3999);
  1391. DOMNode*  abc40 = document->getDoctype()->getNotations()->getNamedItem(tempStr);
  1392.     notation = (DOMNotation*) abc40;
  1393.     node = notation;
  1394.     node2 = notation->cloneNode(true);//*****?
  1395.     // Check nodes for equality, both their name and value or lack thereof
  1396.     if (!(!XMLString::compareString(node->getNodeName(), node2->getNodeName()) &&        // Compares node names for equality
  1397.           (node->getNodeValue() != 0 && node2->getNodeValue() != 0)     // Checks to make sure each node has a value node
  1398.         ? !XMLString::compareString(node->getNodeValue(), node2->getNodeValue())         // If both have value nodes test those value nodes for equality
  1399.         : (node->getNodeValue() == 0 && node2->getNodeValue() == 0)))   // If one node doesn't have a value node make sure both don't
  1400.     {
  1401.         fprintf(stderr, "'cloneNode' did not clone the DOMNotation* node correctly");
  1402.         OK = false;
  1403.     }
  1404.     // Deep clone test comparison is in testNode & testDocument
  1405.     //  notation->setNodeValue("This shouldn't work");//!! Throws a NO_MODIFICATION_ALLOWED_ERR ********
  1406.     // Test the user data
  1407.     // Test simple set and get
  1408.     DOMNotation* userTest = notation;
  1409.     DOMNode*  userFirst = node2;
  1410.     XMLCh* userSecond = tempStr2;
  1411.     XMLString::transcode("first", tempStr, 3999);
  1412.     XMLString::transcode("document", tempStr2, 3999);
  1413.     userTest->setUserData(tempStr2, (void*) document, 0);
  1414.     void* mydocument = userTest->getUserData(tempStr2);
  1415.     if (document != mydocument) {
  1416.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1417.         OK = false;
  1418.     }
  1419.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  1420.     void* myFirst = userTest->getUserData(tempStr);
  1421.     if (userFirst != myFirst) {
  1422.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1423.         OK = false;
  1424.     }
  1425.     // Test overwrite
  1426.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  1427.     void* mySecond = userTest->getUserData(tempStr);
  1428.     if (userSecond != mySecond) {
  1429.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1430.         OK = false;
  1431.     }
  1432.     if (userFirst != myFirst2) {
  1433.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1434.         OK = false;
  1435.     }
  1436.     if (userFirst == mySecond) {
  1437.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1438.         OK = false;
  1439.     }
  1440.     // Test null
  1441.     // test non-exist key
  1442.     XMLString::transcode("not-exist", tempStr3, 3999);
  1443.     if (userTest->getUserData(tempStr3)) {
  1444.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1445.         OK = false;
  1446.     }
  1447.     // use a node that does not have user data set before
  1448.     if (userFirst->getUserData(tempStr)) {
  1449.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1450.         OK = false;
  1451.     }
  1452.     // Test reset
  1453.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  1454.     void* myNull = userTest->getUserData(tempStr);
  1455.     if (userSecond != mySecond2) {
  1456.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1457.         OK = false;
  1458.     }
  1459.     if (myNull) {
  1460.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1461.         OK = false;
  1462.     }
  1463.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  1464.     void* myNull2 = userTest->getUserData(tempStr2);
  1465.     if (mydocument != mydocument2) {
  1466.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1467.         OK = false;
  1468.     }
  1469.     if (myNull2) {
  1470.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1471.         OK = false;
  1472.     }
  1473.     //the userTest user data table should be null now
  1474.     if (userTest->getUserData(tempStr)) {
  1475.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1476.         OK = false;
  1477.     }
  1478.     if (userTest->getUserData(tempStr2)) {
  1479.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1480.         OK = false;
  1481.     }
  1482.     // Test DOMUserDataHandler
  1483.     // test clone
  1484.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  1485.     DOMNode* mycloned = userTest->cloneNode(true);
  1486.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  1487.     // test import
  1488.     document->setUserData(tempStr2, (void*) document, &userhandler);
  1489.     DOMNode* myimport = document->importNode(userTest,true);
  1490.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  1491.     // test delete
  1492.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  1493.     myimport->release();
  1494.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  1495.     // Test isSameNode
  1496.     if (!userTest->isSameNode(userTest)) {
  1497.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1498.         OK = false;
  1499.     }
  1500.     if (userTest->isSameNode(userFirst)) {
  1501.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1502.         OK = false;
  1503.     }
  1504.     // Test isEqualNode
  1505.     if (!userTest->isEqualNode(mycloned)) {
  1506.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1507.         OK = false;
  1508.     }
  1509.     if (!userTest->isEqualNode(userTest)) {
  1510.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1511.         OK = false;
  1512.     }
  1513.     if (userTest->isEqualNode(document)) {
  1514.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1515.         OK = false;
  1516.     }
  1517.     // Test rename, should throw exception
  1518.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 212 );
  1519.     if (!OK)
  1520.         printf("n*****The DOMNotation* method calls listed above failed, all others worked correctly.*****n");
  1521.     return OK;
  1522. };
  1523. /**
  1524.  * This method tests DOMProcessingInstruction* methods for the XML DOM implementation
  1525.  * @param document org.w3c.dom.DOMDocument
  1526.  *
  1527.  */
  1528. bool DOMTest::testPI(DOMDocument* document)
  1529. {
  1530.     DOMProcessingInstruction* pI, *pI2;
  1531.     bool OK = true;
  1532. // For debugging*****   printf("n          testPI's outputs:n");
  1533. DOMNode*   abc50 = document->getDocumentElement()->getFirstChild();// Get doc's DOMProcessingInstruction
  1534.     pI  = (DOMProcessingInstruction*) abc50;
  1535. DOMNode*   abc51 = pI->cloneNode(true);//*****?
  1536.     pI2 = (DOMProcessingInstruction*) abc51;
  1537.     // Check nodes for equality, both their name and value or lack thereof
  1538.     if (!(!XMLString::compareString(pI->getNodeName(), pI2->getNodeName()) &&         // Compares node names for equality
  1539.          (pI->getNodeValue() != 0 && pI2->getNodeValue() != 0)  // Checks to make sure each node has a value node
  1540.         ? !XMLString::compareString(pI->getNodeValue(), pI2->getNodeValue())      // If both have value nodes test those value nodes for equality
  1541.         :(pI->getNodeValue() == 0 && pI2->getNodeValue() == 0)))// If one node doesn't have a value node make sure both don't
  1542.     {
  1543.         fprintf(stderr, "'cloneNode' did not clone the DOMEntity* node correctlyn");
  1544.         OK = false;
  1545.     }
  1546.     // Deep clone test comparison is in testNode & testDocument
  1547.     // compare = "This is [#document: 0]'s processing instruction";  // AH Revisit.  Where id
  1548.     //                  this ": 0]" stuff come from in the Java version??  I don' think that it is right.
  1549.     XMLString::transcode("This is #document's processing instruction", tempStr, 3999);
  1550.     if (XMLString::compareString(tempStr, pI->getData()))
  1551.     {
  1552.         fprintf(stderr, "Warning!!! PI's 'getData' failed!n");
  1553.         OK = false;
  1554.     }
  1555.     XMLString::transcode("PI's reset data", tempStr, 3999);
  1556.     pI->setData(tempStr);
  1557.     if (XMLString::compareString(tempStr, pI->getData()))
  1558.     {
  1559.         fprintf(stderr, "Warning!!! PI's 'setData' failed!n");
  1560.         OK = false;
  1561.     }
  1562.     XMLString::transcode("dTargetProcessorChannel", tempStr, 3999);
  1563.     if (XMLString::compareString(tempStr, pI->getTarget()))
  1564.     {
  1565.         fprintf(stderr, "Warning!!! PI's 'getTarget' failed!n");
  1566.         OK = false;
  1567.     }
  1568.     // Restore original PI data.
  1569.     XMLString::transcode("This is #document's processing instruction", tempStr, 3999);
  1570.     pI->setData(tempStr);
  1571.     // Test the user data
  1572.     // Test simple set and get
  1573.     DOMProcessingInstruction* userTest = pI;
  1574.     DOMNode*  userFirst = abc51;
  1575.     XMLCh* userSecond = tempStr2;
  1576.     XMLString::transcode("first", tempStr, 3999);
  1577.     XMLString::transcode("document", tempStr2, 3999);
  1578.     userTest->setUserData(tempStr2, (void*) document, 0);
  1579.     void* mydocument = userTest->getUserData(tempStr2);
  1580.     if (document != mydocument) {
  1581.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1582.         OK = false;
  1583.     }
  1584.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  1585.     void* myFirst = userTest->getUserData(tempStr);
  1586.     if (userFirst != myFirst) {
  1587.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1588.         OK = false;
  1589.     }
  1590.     // Test overwrite
  1591.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  1592.     void* mySecond = userTest->getUserData(tempStr);
  1593.     if (userSecond != mySecond) {
  1594.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1595.         OK = false;
  1596.     }
  1597.     if (userFirst != myFirst2) {
  1598.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1599.         OK = false;
  1600.     }
  1601.     if (userFirst == mySecond) {
  1602.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1603.         OK = false;
  1604.     }
  1605.     // Test null
  1606.     // test non-exist key
  1607.     XMLString::transcode("not-exist", tempStr3, 3999);
  1608.     if (userTest->getUserData(tempStr3)) {
  1609.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1610.         OK = false;
  1611.     }
  1612.     // use a node that does not have user data set before
  1613.     if (abc51->getUserData(tempStr)) {
  1614.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1615.         OK = false;
  1616.     }
  1617.     // Test reset(reset)
  1618.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  1619.     void* myNull = userTest->getUserData(tempStr);
  1620.     if (userSecond != mySecond2) {
  1621.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1622.         OK = false;
  1623.     }
  1624.     if (myNull) {
  1625.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1626.         OK = false;
  1627.     }
  1628.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  1629.     void* myNull2 = userTest->getUserData(tempStr2);
  1630.     if (mydocument != mydocument2) {
  1631.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1632.         OK = false;
  1633.     }
  1634.     if (myNull2) {
  1635.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1636.         OK = false;
  1637.     }
  1638.     //the userTest user data table should be null now
  1639.     if (userTest->getUserData(tempStr)) {
  1640.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1641.         OK = false;
  1642.     }
  1643.     if (userTest->getUserData(tempStr2)) {
  1644.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1645.         OK = false;
  1646.     }
  1647.     // Test DOMUserDataHandler
  1648.     // test clone
  1649.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  1650.     DOMNode* mycloned = userTest->cloneNode(true);
  1651.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  1652.     // test import
  1653.     document->setUserData(tempStr2, (void*) document, &userhandler);
  1654.     DOMNode* myimport = document->importNode(userTest,true);
  1655.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  1656.     // test delete
  1657.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  1658.     myimport->release();
  1659.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  1660.     // Test isSameNode
  1661.     if (!userTest->isSameNode(userTest)) {
  1662.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1663.         OK = false;
  1664.     }
  1665.     if (userTest->isSameNode(userFirst)) {
  1666.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1667.         OK = false;
  1668.     }
  1669.     // Test isEqualNode
  1670.     if (!userTest->isEqualNode(mycloned)) {
  1671.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1672.         OK = false;
  1673.     }
  1674.     if (!userTest->isEqualNode(userTest)) {
  1675.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1676.         OK = false;
  1677.     }
  1678.     if (userTest->isEqualNode(document)) {
  1679.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1680.         OK = false;
  1681.     }
  1682.     // Test rename, should throw exception
  1683.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 213 );
  1684.     if (!OK)
  1685.         printf("n*****The PI method calls listed above failed, all others worked correctly.*****n");
  1686.     return OK;
  1687. };
  1688. /**
  1689.  * This method tests DOMText* methods for the XML DOM implementation
  1690.  * @param document org.w3c.dom.DOMDocument
  1691.  *
  1692.  */
  1693. bool DOMTest::testText(DOMDocument* document)
  1694. {
  1695.     DOMNode* node, *node2;
  1696.     DOMText* text;
  1697.     bool OK = true;
  1698. // For debugging*****   printf("n          testText's outputs:n");
  1699.     XMLString::transcode("dBodyLevel31", tempStr, 3999);
  1700.     DOMNode*  abc70 = document->getDocumentElement()->getElementsByTagName(tempStr)->item(0);
  1701.     DOMElement* elem = (DOMElement*) abc70;
  1702.     node = elem->getFirstChild(); // charData gets textNode11
  1703.     text = (DOMText*) node;
  1704.     node2 = node->cloneNode(true);//*****?
  1705.     // Check nodes for equality, both their name and value or lack thereof
  1706.     if (!(!XMLString::compareString(node->getNodeName(), node2->getNodeName()) &&        // Compares node names for equality
  1707.           (node->getNodeValue() != 0 && node2->getNodeValue() != 0)     // Checks to make sure each node has a value node
  1708.         ? !XMLString::compareString(node->getNodeValue(), node2->getNodeValue())         // If both have value nodes test those value nodes for equality
  1709.         : (node->getNodeValue() == 0 && node2->getNodeValue() == 0)))   // If one node doesn't have a value node make sure both don't
  1710.     {
  1711.         fprintf(stderr, "'cloneNode' did not clone the DOMText* node correctlyn");
  1712.         OK = false;
  1713.     }
  1714.     // Deep clone test comparison is in testNode & testDocument
  1715.     text->splitText(25);
  1716.     // Three original text nodes were concatenated by 'normalize' in testElement
  1717.     XMLString::transcode("dBodyLevel31'sChildTextNo", tempStr, 3999);
  1718.     if (XMLString::compareString(tempStr, text->getNodeValue()))
  1719.         {
  1720.             fprintf(stderr, "First part of DOMText's split text failed!n" );
  1721.             OK = false;
  1722.         }
  1723.     // Three original text nodes were concatenated by 'normalize' in testElement
  1724.     XMLString::transcode("de11dBodyLevel31'sChildTextNode12dBodyLevel31'sChildTextNode13", tempStr, 3999);
  1725.     if (XMLString::compareString(tempStr, text->getNextSibling()->getNodeValue()))
  1726.         {
  1727.             fprintf(stderr, "The second part of DOMText's split text failed!n") ;
  1728.             OK = false;
  1729.         }
  1730.     // Re-normalize the text nodes under elem, so that this test can be rerun->
  1731.     elem->normalize();
  1732. //************************************************* ERROR TESTS
  1733.     DOMTest tests;
  1734.     //!! Throws INDEX_SIZE_ERR ********************
  1735.     //  text.splitText(-1);
  1736.     //  text.splitText(100);
  1737.     // Test the user data
  1738.     // Test simple set and get
  1739.     DOMText* userTest = text;
  1740.     DOMNode*  userFirst = node2;
  1741.     XMLCh* userSecond = tempStr2;
  1742.     XMLString::transcode("first", tempStr, 3999);
  1743.     XMLString::transcode("document", tempStr2, 3999);
  1744.     userTest->setUserData(tempStr2, (void*) document, 0);
  1745.     void* mydocument = userTest->getUserData(tempStr2);
  1746.     if (document != mydocument) {
  1747.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1748.         OK = false;
  1749.     }
  1750.     userTest->setUserData(tempStr, (void*) userFirst, 0);
  1751.     void* myFirst = userTest->getUserData(tempStr);
  1752.     if (userFirst != myFirst) {
  1753.         fprintf(stderr, "'set/getUserData' in line %i does not workn", __LINE__);
  1754.         OK = false;
  1755.     }
  1756.     // Test overwrite
  1757.     void* myFirst2 = userTest->setUserData(tempStr, (void*) userSecond, 0);
  1758.     void* mySecond = userTest->getUserData(tempStr);
  1759.     if (userSecond != mySecond) {
  1760.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1761.         OK = false;
  1762.     }
  1763.     if (userFirst != myFirst2) {
  1764.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1765.         OK = false;
  1766.     }
  1767.     if (userFirst == mySecond) {
  1768.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1769.         OK = false;
  1770.     }
  1771.     // Test null
  1772.     // test non-exist key
  1773.     XMLString::transcode("not-exist", tempStr3, 3999);
  1774.     if (userTest->getUserData(tempStr3)) {
  1775.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1776.         OK = false;
  1777.     }
  1778.     // use a node that does not have user data set before
  1779.     if (userFirst->getUserData(tempStr)) {
  1780.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1781.         OK = false;
  1782.     }
  1783.     // Test reset
  1784.     void* mySecond2 = userTest->setUserData(tempStr, (void*) 0, 0);
  1785.     void* myNull = userTest->getUserData(tempStr);
  1786.     if (userSecond != mySecond2) {
  1787.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1788.         OK = false;
  1789.     }
  1790.     if (myNull) {
  1791.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1792.         OK = false;
  1793.     }
  1794.     void* mydocument2 = userTest->setUserData(tempStr2, (void*) 0, 0);
  1795.     void* myNull2 = userTest->getUserData(tempStr2);
  1796.     if (mydocument != mydocument2) {
  1797.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1798.         OK = false;
  1799.     }
  1800.     if (myNull2) {
  1801.         fprintf(stderr, "overwrite userdata with same key in line %i does not workn", __LINE__);
  1802.         OK = false;
  1803.     }
  1804.     //the userTest user data table should be null now
  1805.     if (userTest->getUserData(tempStr)) {
  1806.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1807.         OK = false;
  1808.     }
  1809.     if (userTest->getUserData(tempStr2)) {
  1810.         fprintf(stderr, "get non-exist user data in line %i does not workn", __LINE__);
  1811.         OK = false;
  1812.     }
  1813.     // Test DOMUserDataHandler
  1814.     // test clone
  1815.     userTest->setUserData(tempStr2, (void*) document, &userhandler);
  1816.     DOMNode* mycloned = userTest->cloneNode(true);
  1817.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_CLONED, tempStr2, document, userTest, mycloned, __LINE__);
  1818.     // test import
  1819.     document->setUserData(tempStr2, (void*) document, &userhandler);
  1820.     DOMNode* myimport = document->importNode(userTest,true);
  1821.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_IMPORTED, tempStr2, document, userTest, myimport, __LINE__);
  1822.     // test delete
  1823.     myimport->setUserData(tempStr2, (void*) userTest, &userhandler);
  1824.     myimport->release();
  1825.     USERDATAHANDLERTEST(userhandler, DOMUserDataHandler::NODE_DELETED, tempStr2, userTest, 0, 0, __LINE__);
  1826.     // Test isSameNode
  1827.     if (!userTest->isSameNode(userTest)) {
  1828.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1829.         OK = false;
  1830.     }
  1831.     if (userTest->isSameNode(userFirst)) {
  1832.         fprintf(stderr, "isSameNode failed in line %in", __LINE__);
  1833.         OK = false;
  1834.     }
  1835.     // Test isEqualNode
  1836.     if (!userTest->isEqualNode(mycloned)) {
  1837.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1838.         OK = false;
  1839.     }
  1840.     if (!userTest->isEqualNode(userTest)) {
  1841.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1842.         OK = false;
  1843.     }
  1844.     if (userTest->isEqualNode(abc70)) {
  1845.         fprintf(stderr, "isEqualNode failed in line %in", __LINE__);
  1846.         OK = false;
  1847.     }
  1848.     // Test rename, should throw exception
  1849.     EXCEPTIONSTEST(document->renameNode(userTest, 0, tempStr2), DOMException::NOT_SUPPORTED_ERR, OK, 214 );
  1850.     if (!OK)
  1851.         printf("n*****The DOMText* method calls listed above failed, all others worked correctly.*****n");
  1852.     return OK;
  1853. };
  1854. /**
  1855.  * This method tests setting the DOM Level 3 baseURI attribute at
  1856.  * parse time on nodes from the document personal-schema.xml.xml
  1857.  *
  1858.  */
  1859. bool DOMTest::testBaseURI(XercesDOMParser* parser) {
  1860.     bool OK = true;
  1861.     try {
  1862.         // this one assumes executing in samples/data where personal-schema.xml resides
  1863.         // please modify if this is not correct
  1864.         parser->parse("personal-schema.xml");
  1865.     }
  1866.     catch (...) {
  1867.         fprintf(stderr, "parsing personal-schema.xml failed at line %in", __LINE__);
  1868.         return false;
  1869.     }
  1870.     // test only if there is no error
  1871.     if (!parser->getErrorCount()) {
  1872.         //Setup testing strings
  1873.         XMLCh *fileSchema = XMLString::transcode("file://");
  1874.         XMLCh *filePath = XMLString::transcode("samples/data/personal-schema.xml");
  1875.         //Test document baseURI
  1876.         DOMDocument *document = parser->getDocument();
  1877.         //The baseURI should contain `file://' and `samples/data/personal-schema.xml'
  1878.         const XMLCh *docBaseURI = document->getBaseURI();
  1879.         if(XMLString::patternMatch(docBaseURI, fileSchema) == -1) {
  1880.             OK = false;
  1881.             fprintf(stderr, "checking baseURI failed at line %in", __LINE__);
  1882.         }
  1883.         if(XMLString::patternMatch(docBaseURI, filePath) == -1) {
  1884.             OK = false;
  1885.             fprintf(stderr, "checking baseURI failed at line %in", __LINE__);
  1886.         }
  1887.         //Create relative paths from document baseURI
  1888.         XMLCh *docBaseURIRoot = new XMLCh [ XMLString::stringLen(docBaseURI) ];
  1889.         XMLString::copyNString(docBaseURIRoot, docBaseURI, XMLString::lastIndexOf(docBaseURI, chForwardSlash) + 1);
  1890.         XMLCh *base_foobar = new XMLCh [ XMLString::stringLen(docBaseURIRoot) + 8];
  1891.         XMLString::copyString(base_foobar, docBaseURIRoot);
  1892.         XMLCh *foobar = XMLString::transcode("foo/bar");
  1893.         XMLString::catString(base_foobar, foobar);
  1894.         XMLCh *base_foobarbar = new XMLCh [ XMLString::stringLen(docBaseURIRoot) + 12];
  1895.         XMLString::copyString(base_foobarbar, docBaseURIRoot);
  1896.         XMLCh *foobarbar = XMLString::transcode("foo/bar/bar");
  1897.         XMLString::catString(base_foobarbar, foobarbar);
  1898.         XMLCh *base_foocarbar = new XMLCh [ XMLString::stringLen(docBaseURIRoot) + 12];
  1899.         XMLString::copyString(base_foocarbar, docBaseURIRoot);
  1900.         XMLCh *foocarbar = XMLString::transcode("foo/car/bar");
  1901.         XMLString::catString(base_foocarbar, foocarbar);
  1902.         XMLCh *file_autobar = XMLString::transcode("file:///auto/bar");
  1903.         XMLCh *file_carfoo = XMLString::transcode("file:///car/foo/");
  1904.         XMLCh *file_carfoobarbar = XMLString::transcode("file:///car/foo/bar/bar");
  1905.         XMLCh *http_carcar = XMLString::transcode("http://www.example.com/car/car");
  1906.         XMLCh *http_barfoo = XMLString::transcode("http://www.example.com/bar/foo/");
  1907.         XMLCh *http_barfoofoobar = XMLString::transcode("http://www.example.com/bar/foo/foo/bar");
  1908.         //Processing instruction before Document Element (has document baseURI)
  1909.         DOMNode *node = document->getFirstChild();
  1910.         while(node->getNodeType() != DOMNode::PROCESSING_INSTRUCTION_NODE)
  1911.             node = node->getNextSibling();
  1912.         if(XMLString::compareString(node->getBaseURI(), docBaseURI) != 0) {
  1913.             OK = false;
  1914.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1915.         }
  1916.         //Document Element baseURI (same as document)
  1917.         node = document->getDocumentElement();
  1918.         if(XMLString::compareString(node->getBaseURI(), docBaseURI) != 0) {
  1919.             OK = false;
  1920.             fprintf(stderr, "checking baseURI, failed at line %in", __LINE__);
  1921.         }
  1922.         // <level 1>
  1923.         node = node->getFirstChild();
  1924.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1925.             node = node->getNextSibling();
  1926.         DOMNode *level1 = node;
  1927.         // <one>
  1928.         node = node->getFirstChild();
  1929.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1930.             node = node->getNextSibling();
  1931.         if(XMLString::compareString(node->getBaseURI(), base_foobar) != 0) {
  1932.             OK = false;
  1933.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1934.         }
  1935.         // <inner1>
  1936.         node = node->getFirstChild();
  1937.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1938.             node = node->getNextSibling();
  1939.         if(XMLString::compareString(node->getBaseURI(), base_foobarbar) != 0) {
  1940.             OK = false;
  1941.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1942.         }
  1943.         // <inner2>
  1944.         node = node->getNextSibling();
  1945.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1946.             node = node->getNextSibling();
  1947.         if(XMLString::compareString(node->getBaseURI(), base_foocarbar) != 0) {
  1948.             OK = false;
  1949.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1950.         }
  1951.         // <?proc-inst-2?>
  1952.         node = node->getNextSibling();
  1953.         while(node->getNodeType() != DOMNode::PROCESSING_INSTRUCTION_NODE)
  1954.             node = node->getNextSibling();
  1955.         if(XMLString::compareString(node->getBaseURI(), base_foobar) != 0) {
  1956.             OK = false;
  1957.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1958.         }
  1959.         // <level2>
  1960.         node = level1->getNextSibling();
  1961.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1962.             node = node->getNextSibling();
  1963.         DOMNode *level2 = node;
  1964.         if(XMLString::compareString(node->getBaseURI(), file_autobar) != 0) {
  1965.             OK = false;
  1966.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1967.         }
  1968.         // <two>
  1969.         node = node->getFirstChild();
  1970.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1971.             node = node->getNextSibling();
  1972.         if(XMLString::compareString(node->getBaseURI(), file_carfoo) != 0) {
  1973.             OK = false;
  1974.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1975.         }
  1976.         // <inner1>
  1977.         node = node->getFirstChild();
  1978.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1979.             node = node->getNextSibling();
  1980.         if(XMLString::compareString(node->getBaseURI(), file_carfoobarbar) != 0) {
  1981.             OK = false;
  1982.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1983.         }
  1984.         // <level3>
  1985.         node = level2->getNextSibling();
  1986.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1987.             node = node->getNextSibling();
  1988.         if(XMLString::compareString(node->getBaseURI(), http_carcar) != 0) {
  1989.             OK = false;
  1990.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1991.         }
  1992.         // <three>
  1993.         node = node->getFirstChild();
  1994.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  1995.             node = node->getNextSibling();
  1996.         if(XMLString::compareString(node->getBaseURI(), http_barfoo) != 0) {
  1997.             OK = false;
  1998.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  1999.         }
  2000.         // <inner1>
  2001.         node = node->getFirstChild();
  2002.         while(node->getNodeType() != DOMNode::ELEMENT_NODE)
  2003.             node = node->getNextSibling();
  2004.         if(XMLString::compareString(node->getBaseURI(), http_barfoofoobar) != 0) {
  2005.             OK = false;
  2006.             fprintf(stderr, "checking baseURI failed at line %in",  __LINE__);
  2007.         }
  2008.     }
  2009.     else {
  2010.         printf("baseURI test was not carried outn");
  2011.     }
  2012.     return OK;
  2013. }
  2014. /**
  2015.  *
  2016.  * @param node org.w3c.dom.DOMNode
  2017.  * @param node2 org.w3c.dom.DOMNode
  2018.  *
  2019.  */
  2020. bool DOMTest::treeCompare(DOMNode* node, DOMNode* node2)
  2021. {
  2022.     bool answer = true;
  2023.     DOMNode*  kid, *kid2;         // Check the subtree for equality
  2024.     kid = node->getFirstChild();
  2025.     kid2 = node2->getFirstChild();
  2026.     if (kid && kid2)
  2027.     {
  2028.         answer = treeCompare(kid, kid2);
  2029.         if (!answer)
  2030.             return answer;
  2031.         else
  2032.             if (kid->getNextSibling() && kid2->getNextSibling())
  2033.             {
  2034.                 while (kid->getNextSibling() && kid2->getNextSibling())
  2035.                 {
  2036.                     answer = treeCompare(kid->getNextSibling(), kid2->getNextSibling());
  2037.                     if (!answer)
  2038.                         return answer;
  2039.                     else
  2040.                     {
  2041.                         kid = kid->getNextSibling();
  2042.                         kid2 = kid2->getNextSibling();
  2043.                     }
  2044.                 }
  2045.             } else
  2046.                 if (!(!kid->getNextSibling() && !kid2->getNextSibling()))
  2047.                 {
  2048.                     return false;
  2049.                 }
  2050.     } else
  2051.         if (kid != kid2)
  2052.         {
  2053.             // One or the other of (kid1, kid2) is 0, but not both.
  2054.             return false;
  2055.         }
  2056.     if (XMLString::compareString(node->getNodeName(), node2->getNodeName()))
  2057.         return false;
  2058.     if (node->getNodeValue()==0 && node2->getNodeValue()!=0)
  2059.         return false;
  2060.     if (node->getNodeValue()!=0 && node2->getNodeValue()==0)
  2061.         return false;
  2062.     if (XMLString::compareString(node->getNodeValue(), node2->getNodeValue()))
  2063.         return false;
  2064.     return answer;
  2065. };