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

xml/soap/webservice

开发平台:

C/C++

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