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

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. //
  57. //  Various IDOM tests.
  58. //     Contents include
  59. //       1.  NodeIterator tests
  60. //       2.  Tree Walker tests
  61. //     All individual are wrapped in a memory leak checker.
  62. //
  63. //     This is NOT a complete test of DOM functionality.
  64. //
  65. /**
  66.  * $Log: ITraversal.cpp,v $
  67.  * Revision 1.4  2001/11/23 16:18:54  tng
  68.  * Elimiate compiler warning: Warning: String literal converted to char* in formal argument file in call to tassert(bool, char*, int).
  69.  *
  70.  * Revision 1.3  2001/07/19 20:45:16  tng
  71.  * Add some test cases in the tests folder to sanityTest.pl
  72.  *
  73.  * Revision 1.2  2001/06/05 11:58:31  tng
  74.  * Delete the document at the end for clearing the memory.
  75.  *
  76.  * Revision 1.1  2001/06/04 20:11:55  tng
  77.  * IDOM: Complete IDNodeIterator, IDTreeWalker, IDNodeFilter.
  78.  *
  79.  *
  80.  */
  81. #include <stdio.h>
  82. #include <string.h>
  83. #include <idom/IDOM.hpp>
  84. #include <util/PlatformUtils.hpp>
  85. #include <util/XMLException.hpp>
  86. #include <util/XMLString.hpp>
  87. #include <util/XMLUniDefs.hpp>
  88. #define TASSERT(c) tassert((c), __FILE__, __LINE__)
  89. void tassert(bool c, const char *file, int line)
  90. {
  91.     if (!c)
  92.         printf("Failure.  Line %d,   file %sn", line, file);
  93. };
  94. #define EXCEPTION_TEST(operation, expected_exception)               
  95. {                                                                   
  96.     try {                                                           
  97.     operation;                                                      
  98.     printf(" Error: no exception thrown at line %dn", __LINE__);   
  99. }                                                                   
  100.     catch (IDOM_DOMException &e) {                                       
  101.     if (e.code != expected_exception)                       
  102.     printf(" Wrong exception code: %d at line %dn", e.code, __LINE__); 
  103. }                                                                 
  104.     catch (...)   {                                                 
  105.     printf(" Wrong exception thrown at line %dn", __LINE__);       
  106. }                                                                   
  107. }
  108. class  MyFilter : public IDOM_NodeFilter {
  109. public:
  110.   MyFilter(short nodeType, bool reject=false) : IDOM_NodeFilter(), fNodeType(nodeType), fReject(reject) {};
  111.   virtual short acceptNode(const IDOM_Node* node) const;
  112. private:
  113.     short fNodeType;
  114.     bool fReject;
  115. };
  116. /*
  117.         Node Types can be of the following:
  118.         ELEMENT_NODE         = 1,
  119.         ATTRIBUTE_NODE       = 2,
  120.         TEXT_NODE            = 3,
  121.         CDATA_SECTION_NODE   = 4,
  122.         ENTITY_REFERENCE_NODE = 5,
  123.         ENTITY_NODE          = 6,
  124.         PROCESSING_INSTRUCTION_NODE = 7,
  125.         COMMENT_NODE         = 8,
  126.         DOCUMENT_NODE        = 9,
  127.         DOCUMENT_TYPE_NODE   = 10,
  128.         DOCUMENT_FRAGMENT_NODE = 11,
  129.         NOTATION_NODE        = 12
  130. */
  131. short  MyFilter::acceptNode(const IDOM_Node* node) const {
  132.     if (fNodeType == 0)
  133.         return  IDOM_NodeFilter::FILTER_ACCEPT;
  134. if (node->getNodeType() ==  fNodeType) {
  135.         return  IDOM_NodeFilter::FILTER_ACCEPT;
  136. } else {
  137.     return  fReject ? IDOM_NodeFilter::FILTER_REJECT : IDOM_NodeFilter::FILTER_SKIP;
  138. }
  139. }
  140. int  main()
  141. {
  142. try {
  143. XMLPlatformUtils::Initialize();
  144. }
  145. catch (const XMLException& toCatch) {
  146.         char *pMessage = XMLString::transcode(toCatch.getMessage());
  147.         fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). n"
  148.                         "  Message is: %sn", pMessage);
  149.         delete [] pMessage;
  150.         return -1;
  151.     }
  152.     // Create a XMLCh buffer for string manipulation
  153.     XMLCh tempStr[4000];
  154.     //
  155.     //  Doc - Create a small document tree
  156.     //
  157.     {
  158.         //creating a DOM Tree
  159.          /* Tests are based on the tree structure below
  160.            doc - root - E11 (attr01) - textNode1
  161.                                      - E111
  162.                                      - E112
  163.                                      - cdataSec
  164.                       - E12 (attr02) - textNode2
  165.                                      - E121
  166.                                      - E122
  167.                       - E13          - E131
  168.                                      - docPI
  169.                       - comment
  170.          */
  171.         IDOM_DOMImplementation* impl = IDOM_DOMImplementation::getImplementation();
  172.         IDOM_Document* doc = impl->createDocument();
  173.         //Creating a root element
  174.         XMLString::transcode("RootElement", tempStr, 3999);
  175.         IDOM_Element*     root = doc->createElement(tempStr);
  176.         doc->appendChild(root);
  177.         //Creating the siblings of root
  178.         XMLString::transcode("FirstSibling", tempStr, 3999);
  179.         IDOM_Element*     E11 = doc->createElement(tempStr);
  180.         root->appendChild(E11);
  181.         XMLString::transcode("SecondSibling", tempStr, 3999);
  182.         IDOM_Element*     E12 = doc->createElement(tempStr);
  183.         root->appendChild(E12);
  184.         XMLString::transcode("ThirdSibling", tempStr, 3999);
  185.         IDOM_Element*     E13 = doc->createElement(tempStr);
  186.         root->appendChild(E13);
  187.         //Attaching texts to few siblings
  188.         XMLString::transcode("Text1", tempStr, 3999);
  189.         IDOM_Text*        textNode1 = doc->createTextNode(tempStr);
  190.         E11->appendChild(textNode1);
  191.         XMLString::transcode("Text2", tempStr, 3999);
  192.         IDOM_Text*        textNode2 = doc->createTextNode(tempStr);
  193.         E12->appendChild(textNode2);
  194.         //creating child of siblings
  195.         XMLString::transcode("FirstSiblingChild1", tempStr, 3999);
  196.         IDOM_Element*     E111 = doc->createElement(tempStr);
  197.         E11->appendChild(E111);
  198.         XMLString::transcode("Attr01", tempStr, 3999);
  199.         IDOM_Attr*        attr01  = doc->createAttribute(tempStr);
  200.         E11->setAttributeNode(attr01);
  201.         XMLString::transcode("FirstSiblingChild2", tempStr, 3999);
  202.         IDOM_Element*     E112 = doc->createElement(tempStr);
  203.         E11->appendChild(E112);
  204.         XMLString::transcode("SecondSiblingChild1", tempStr, 3999);
  205.         IDOM_Element*     E121 = doc->createElement(tempStr);
  206.         E12->appendChild(E121);
  207.         XMLString::transcode("Attr01", tempStr, 3999);
  208.         IDOM_Attr* attr02 = doc->createAttribute(tempStr);
  209.         E12->setAttributeNode(attr02);
  210.         XMLString::transcode("SecondSiblingChild2", tempStr, 3999);
  211.         IDOM_Element*     E122 = doc->createElement(tempStr);
  212.         E12->appendChild(E122);
  213.         XMLString::transcode("ThirdSiblingChild1", tempStr, 3999);
  214.         IDOM_Element*     E131 = doc->createElement(tempStr);
  215.         E13->appendChild(E131);
  216.         XMLString::transcode("DocComment", tempStr, 3999);
  217.         IDOM_Comment* comment = doc->createComment(tempStr);
  218.         root->appendChild(comment);
  219.         XMLString::transcode("DocCDataSection", tempStr, 3999);
  220.         IDOM_CDATASection*  cdataSec = doc->createCDATASection(tempStr);
  221.         E11->appendChild(cdataSec);
  222.         XMLString::transcode("DocPI", tempStr, 3999);
  223.         XMLCh piStr[] = {chLatin_D, chLatin_o, chLatin_c, chLatin_P, chLatin_I, chNull};
  224.         IDOM_ProcessingInstruction*  docPI = doc->createProcessingInstruction(piStr, tempStr);
  225.         E13->appendChild(docPI);
  226.         /*
  227.         following are whatToShow types:
  228.             SHOW_ALL                       = 0x0000FFFF,
  229.             SHOW_ELEMENT                   = 0x00000001,
  230.             SHOW_ATTRIBUTE                 = 0x00000002,
  231.             SHOW_TEXT                      = 0x00000004,
  232.             SHOW_CDATA_SECTION             = 0x00000008,
  233.             SHOW_ENTITY_REFERENCE          = 0x00000010,
  234.             SHOW_ENTITY                    = 0x00000020,
  235.             SHOW_PROCESSING_INSTRUCTION    = 0x00000040,
  236.             SHOW_COMMENT                   = 0x00000080,
  237.             SHOW_DOCUMENT                  = 0x00000100,
  238.             SHOW_DOCUMENT_TYPE             = 0x00000200,
  239.             SHOW_DOCUMENT_FRAGMENT         = 0x00000400,
  240.             SHOW_NOTATION                  = 0x00000800
  241.         */
  242.         ////////// NodeIterator Test Cases ////////////////
  243.         {
  244.             // all node iterating test
  245.             IDOM_Node*    node = doc->getFirstChild();
  246.             unsigned long       whatToShow = IDOM_NodeFilter::SHOW_ALL;
  247.             MyFilter* filter = new MyFilter(0);
  248.             IDOM_NodeIterator*  iter = doc->createNodeIterator(root, whatToShow,  filter, true);
  249.             TASSERT(iter->getWhatToShow() == 65535);
  250.             TASSERT(iter->getExpandEntityReferences() == 1);
  251.             IDOM_Node*  nd;
  252.             nd = iter->nextNode();
  253.             TASSERT (nd ==root);
  254.             nd = iter->nextNode();
  255.             TASSERT (nd ==E11);
  256.             nd = iter->nextNode();
  257.             TASSERT(nd == textNode1);
  258.             nd = iter->nextNode();
  259.             TASSERT(nd == E111);
  260.             nd = iter->nextNode();
  261.             TASSERT(nd == E112);
  262.             nd = iter->nextNode();
  263.             TASSERT(nd == cdataSec);
  264.             nd = iter->nextNode();
  265.             TASSERT(nd == E12);
  266.             nd = iter->nextNode();
  267.             TASSERT(nd == textNode2);
  268.             nd = iter->nextNode();
  269.             TASSERT(nd == E121);
  270.             nd = iter->nextNode();
  271.             TASSERT(nd == E122);
  272.             nd = iter->nextNode();
  273.             TASSERT(nd == E13);
  274.             nd = iter->nextNode();
  275.             TASSERT(nd == E131);
  276.             nd = iter->nextNode();
  277.             TASSERT(nd == docPI);
  278.             nd = iter->nextNode();
  279.             TASSERT(nd == comment);
  280.             nd = iter->previousNode();
  281.             TASSERT(nd == comment);
  282.             nd = iter->previousNode();
  283.             TASSERT(nd == docPI);
  284.             nd = iter->previousNode();
  285.             TASSERT(nd == E131);
  286.         }
  287.         {
  288.             //element node iterating test
  289.             IDOM_Node*    node = doc->getFirstChild();
  290.             unsigned long       whatToShow = IDOM_NodeFilter::SHOW_ELEMENT;
  291.             MyFilter* filter = new MyFilter(IDOM_Node::ELEMENT_NODE);
  292.             IDOM_NodeIterator*  iter = doc->createNodeIterator(root, whatToShow,  filter, true);
  293.             TASSERT(iter->getWhatToShow() == 1);
  294.             TASSERT(iter->getExpandEntityReferences() == 1);
  295.             IDOM_Node*  nd;
  296.             nd = iter->nextNode();
  297.             TASSERT (nd ==root);
  298.             nd = iter->nextNode();
  299.             TASSERT (nd ==E11);
  300.             nd = iter->nextNode();
  301.             TASSERT(nd == E111);
  302.             nd = iter->nextNode();
  303.             TASSERT(nd == E112);
  304.             nd = iter->nextNode();
  305.             TASSERT(nd == E12);
  306.             nd = iter->nextNode();
  307.             TASSERT(nd == E121);
  308.             nd = iter->nextNode();
  309.             TASSERT(nd == E122);
  310.             nd = iter->nextNode();
  311.             TASSERT(nd == E13);
  312.             nd = iter->nextNode();
  313.             TASSERT(nd == E131);
  314.             nd = iter->previousNode();
  315.             TASSERT(nd == E131);
  316.             nd = iter->previousNode();
  317.             TASSERT(nd == E13);
  318.             nd = iter->previousNode();
  319.             TASSERT(nd == E122);
  320.         }
  321.         {
  322.             // Text node iterating test
  323.             IDOM_Node*    node = doc->getFirstChild();
  324.             unsigned long       whatToShow = IDOM_NodeFilter::SHOW_TEXT;
  325.             MyFilter* filter = new MyFilter(IDOM_Node::TEXT_NODE);
  326.             IDOM_NodeIterator*  iter = doc->createNodeIterator(root, whatToShow,  filter, true);
  327.             TASSERT(iter->getWhatToShow() == 4);
  328.             TASSERT(iter->getExpandEntityReferences() == 1);
  329.             IDOM_Node*  nd;
  330.             nd = iter->nextNode();
  331.             TASSERT (nd ==textNode1);
  332.             nd = iter->nextNode();
  333.             TASSERT (nd ==textNode2);
  334.             nd = iter->previousNode();
  335.             TASSERT(nd == textNode2);
  336.         }
  337.         {
  338.             //CDataSection node itearating test
  339.             IDOM_Node*    node = doc->getFirstChild();
  340.             unsigned long       whatToShow = IDOM_NodeFilter::SHOW_CDATA_SECTION;
  341.             MyFilter* filter = new MyFilter(IDOM_Node::CDATA_SECTION_NODE);
  342.             IDOM_NodeIterator*  iter = doc->createNodeIterator(root, whatToShow,  filter, true);
  343.             TASSERT(iter->getWhatToShow() == 8);
  344.             TASSERT(iter->getExpandEntityReferences() == 1);
  345.             IDOM_Node*  nd;
  346.             nd = iter->nextNode();
  347.             TASSERT(nd == cdataSec);
  348.             nd = iter->nextNode();
  349.             TASSERT(nd == 0);
  350.         }
  351.         {
  352.             // PI nodes iterating test
  353.             IDOM_Node*    node = doc->getFirstChild();
  354.             unsigned long       whatToShow = IDOM_NodeFilter::SHOW_PROCESSING_INSTRUCTION;
  355.             MyFilter* filter = new MyFilter(IDOM_Node::PROCESSING_INSTRUCTION_NODE);
  356.             IDOM_NodeIterator*  iter = doc->createNodeIterator(root, whatToShow,  filter, true);
  357.             TASSERT(iter->getWhatToShow() == 64);
  358.             TASSERT(iter->getExpandEntityReferences() == 1);
  359.             IDOM_Node*  nd;
  360.             nd = iter->nextNode();
  361.             TASSERT(nd == docPI);
  362.             nd = iter->nextNode();
  363.             TASSERT(nd == 0);
  364.         }
  365.         {
  366.             IDOM_Node*    node = doc->getFirstChild();
  367.             unsigned long       whatToShow = IDOM_NodeFilter::SHOW_COMMENT;
  368.             MyFilter* filter = new MyFilter(IDOM_Node::COMMENT_NODE);
  369.             IDOM_NodeIterator*  iter = doc->createNodeIterator(root, whatToShow,  filter, true);
  370.             TASSERT(iter->getWhatToShow() == 128);
  371.             TASSERT(iter->getExpandEntityReferences() == 1);
  372.             IDOM_Node*  nd;
  373.             nd = iter->nextNode();
  374.             TASSERT(nd == comment);
  375.             nd = iter->nextNode();
  376.             TASSERT(nd == 0);
  377.         }
  378.         ////////// TreeWalker Test Cases ////////////////
  379.         {
  380.             unsigned long whatToShow = IDOM_NodeFilter::SHOW_ALL;
  381.             IDOM_TreeWalker* tw = doc->createTreeWalker(doc, whatToShow, 0, true);
  382.             TASSERT(tw->getCurrentNode() == doc);
  383.             TASSERT(tw->firstChild() == root);
  384.             TASSERT(tw->nextSibling() == 0);
  385.             TASSERT(tw->lastChild() == comment);
  386.             TASSERT(tw->firstChild() == 0);
  387.             TASSERT(tw->lastChild() == 0);
  388.             TASSERT(tw->nextSibling() == 0);
  389.             TASSERT(tw->nextNode() == 0);
  390.             TASSERT(tw->previousSibling() == E13);
  391.             TASSERT(tw->previousNode() == E122);
  392.             TASSERT(tw->parentNode() == E12);
  393.             TASSERT(tw->firstChild() == textNode2);
  394.             TASSERT(tw->previousSibling() == 0);
  395.             TASSERT(tw->nextSibling() == E121);
  396.             TASSERT(tw->nextNode() == E122);
  397.             TASSERT(tw->parentNode() == E12);
  398.             TASSERT(tw->previousSibling() == E11);
  399.             TASSERT(tw->previousNode() == root);
  400.             TASSERT(tw->previousNode() == doc);
  401.             TASSERT(tw->previousNode() == 0);
  402.             TASSERT(tw->parentNode() == 0);
  403.             TASSERT(tw->getCurrentNode() == doc);
  404.         }
  405.         {
  406.             MyFilter mf(IDOM_Node::ELEMENT_NODE);
  407.             unsigned long whatToShow = IDOM_NodeFilter::SHOW_ALL;
  408.             IDOM_TreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true);
  409.             TASSERT(tw->getCurrentNode() == root);
  410.             TASSERT(tw->parentNode() == 0);  //should not change currentNode
  411.             TASSERT(tw->getCurrentNode() == root);
  412.             TASSERT(tw->nextNode() == E11);
  413.             TASSERT(tw->nextNode() == E111);
  414.             tw->setCurrentNode(E12);
  415.             //when first is not visible, should it go to its sibling?
  416.             TASSERT(tw->firstChild() == E121);   //first visible child
  417.             TASSERT(tw->previousSibling() == 0);
  418.         }
  419.         {
  420.             MyFilter mf(IDOM_Node::ELEMENT_NODE, true);
  421.             unsigned long whatToShow = IDOM_NodeFilter::SHOW_ELEMENT;
  422.             IDOM_TreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true);
  423.             tw->setCurrentNode(E12);
  424.             TASSERT(tw->firstChild() == E121);   //still first visible child
  425.         }
  426.         {
  427.             MyFilter mf(IDOM_Node::TEXT_NODE);
  428.             unsigned long whatToShow = IDOM_NodeFilter::SHOW_TEXT;
  429.             IDOM_TreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true);
  430.             //when first is not visible, should it go to its descendent?
  431.             TASSERT(tw->firstChild() == textNode1);   //E11 skipped
  432.             TASSERT(tw->firstChild() == 0);
  433.             TASSERT(tw->nextNode() == textNode2);
  434.             TASSERT(tw->nextSibling() == 0);
  435.             TASSERT(tw->parentNode() == 0);  //no visible ancestor
  436.             TASSERT(tw->getCurrentNode() == textNode2);
  437.             tw->setCurrentNode(root);
  438.             //when last is not visible, should it go to its sibling & descendent?
  439.             TASSERT(tw->lastChild() == textNode2);   //last visible child
  440.             tw->setCurrentNode(E12);
  441.             //when next sibling is not visible, should it go to its descendent?
  442.             TASSERT(tw->nextSibling() == 0);
  443.         }
  444.         {
  445.             MyFilter mf(IDOM_Node::TEXT_NODE, true);
  446.             unsigned long whatToShow = IDOM_NodeFilter::SHOW_TEXT;
  447.             IDOM_TreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true);
  448.             TASSERT(tw->firstChild() == 0);   //E11 rejected and no children is TEXT
  449.             TASSERT(tw->getCurrentNode() == root);
  450.             TASSERT(tw->nextNode() == 0);    //E11 rejected so can't get to textNode1
  451.         }
  452.         delete doc;
  453.     };
  454.     printf("Test Run Successfullyn");
  455.     return 0;
  456. };