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

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. #include <stdio.h>
  57. #include <string.h>
  58. #include <dom/DOM.hpp>
  59. #include <dom/DomMemDebug.hpp>
  60. #include <util/PlatformUtils.hpp>
  61. #include <util/XMLException.hpp>
  62. #include <util/XMLString.hpp>
  63. #include <parsers/DOMParser.hpp>
  64. #include <framework/MemBufInputSource.hpp>
  65. #include <sax/ErrorHandler.hpp>
  66. #include <sax/SAXException.hpp>
  67. #include <sax/SAXParseException.hpp>
  68. //-------------------------------------------------------------
  69. //
  70. //   Macros of general use in tests.
  71. //
  72. //-------------------------------------------------------------
  73. #define TASSERT(c) tassert((c), __FILE__, __LINE__)
  74. void tassert(bool c, const char *file, int line)
  75. {
  76.     if (!c)
  77.         printf("Failure.  Line %d,   file %sn", line, file);
  78. };
  79. #define TESTPROLOG entryMemState = DomMemDebug();
  80. #define TESTEPILOG 
  81.     exitMemState = DomMemDebug(); 
  82.     if (entryMemState != exitMemState) { 
  83.         printf(" Memory leak at line %d, file %s:  ", __LINE__, __FILE__);  
  84.         exitMemState.printDifference(entryMemState); 
  85.     }
  86. #define EXCEPTION_TEST(operation, expected_exception)               
  87. {                                                                   
  88.     try {                                                           
  89.     operation;                                                      
  90.     printf(" Error: no exception thrown at line %dn", __LINE__);   
  91. }                                                                   
  92.     catch (DOM_DOMException &e) {                                       
  93.     if (e.code != expected_exception)                       
  94.     printf(" Wrong exception code: %d at line %dn", e.code, __LINE__); 
  95. }                                                                 
  96.     catch (...)   {                                                 
  97.     printf(" Wrong exception thrown at line %dn", __LINE__);       
  98. }                                                                   
  99. }
  100. // ---------------------------------------------------------------------------
  101. //
  102. //  Simple error handler to install on parser
  103. //      With no error handler errors are silently ignored.
  104. //      This test program does not normally produce XML errors, but having
  105. //       an error handler is useful for debugging.
  106. //
  107. // ---------------------------------------------------------------------------
  108. class SimpleErrorHandler : public ErrorHandler
  109. {
  110. public:
  111.     SimpleErrorHandler() {};
  112.     virtual ~SimpleErrorHandler() {};
  113.     void warning(const SAXParseException& e) {printError(e);};
  114.     void error(const SAXParseException& e){printError(e);};
  115.     void fatalError(const SAXParseException& e){printError(e);};
  116.     void resetErrors() {};
  117.     void printError(const SAXParseException &e) { fprintf(stderr, "n Error in parsing.n"
  118.                                                             " line: %d,   col: %d n"
  119.                                                             " Message: %sn",
  120.                                                             e.getLineNumber(),
  121.                                                             e.getColumnNumber(),
  122.                                                             XMLString::transcode(e.getMessage()));};
  123. private :
  124.     SimpleErrorHandler(const SimpleErrorHandler&);
  125.     void operator=(const SimpleErrorHandler&);
  126. };
  127. // ---------------------------------------------------------------------------
  128. //
  129. //  Small in-memory test document
  130. //
  131. // ---------------------------------------------------------------------------
  132. //
  133. //      NOTE: If your encoding is not ascii you will need to change
  134. //            the following #define for DOMIDTEST_ENCODING
  135. //
  136. #ifndef DOMIDTEST_ENCODING
  137.    #if defined(OS390)
  138.        #define DOMIDTEST_ENCODING "ibm-1047-s390"
  139.    #else
  140.        #define DOMIDTEST_ENCODING "ascii"
  141.    #endif
  142. #endif /* ifndef DOMIDTEST_ENCODING */
  143.     static const char*  TestDoc1 =
  144. "<?xml version='1.0' encoding='" DOMIDTEST_ENCODING "'?>     n
  145. <!DOCTYPE doc [                             n
  146. <!ELEMENT doc  (elA | elB)*>                n
  147. <!ELEMENT elA             (#PCDATA)>        n
  148. <!ELEMENT elB             (#PCDATA)>        n
  149. <!ATTLIST elA    id ID    #IMPLIED>         n
  150. <!ATTLIST elB    id CDATA #IMPLIED>         n
  151. ]>                                          n
  152.                                             n
  153. <doc>                                       n
  154.     <elA id='a001'/>                        n
  155.     <elB id='a002'/>                        n
  156.     <elA id='a003'/>                        n
  157. </doc>                                      n
  158. ";
  159. int main()
  160. {
  161.     // Initialize the XML4C2 system
  162.     try
  163.     {
  164.          XMLPlatformUtils::Initialize();
  165.     }
  166.     catch (const XMLException& toCatch)
  167.     {
  168.          fprintf(stderr, "Error during initialization! Message: n%sn",
  169.               XMLString::transcode(toCatch.getMessage()));
  170.          return 1;
  171.     }
  172.     {
  173.          //  Nest entire test in an inner block.
  174.          //     Reference counting should recover all document
  175.          //     storage when this block exits.
  176.         bool doValidation    = true;
  177.         bool doNamespaces    = false;
  178.         DOMParser *parser = new DOMParser;
  179.         parser->setDoValidation(doValidation);
  180.         parser->setDoNamespaces(doNamespaces);
  181.         ErrorHandler *ehandler = new SimpleErrorHandler();
  182.         parser->setErrorHandler(ehandler);
  183.         MemBufInputSource* memBufIS = new MemBufInputSource (
  184.             (const XMLByte*)TestDoc1,
  185.             strlen(TestDoc1),
  186.             "TestDoc1",
  187.             false
  188.             );
  189.         parser->parse(*memBufIS);
  190.         DOM_Document doc = parser->getDocument();
  191.         DomMemDebug     entryMemState, exitMemState;
  192.         TESTPROLOG;
  193.         {
  194.             DOM_Element elA = doc.getElementById("a001");
  195.             TASSERT(elA != 0);
  196.             DOM_Element elB = doc.getElementById("a002");
  197.             TASSERT(elB == 0);
  198.             DOM_Element elC = doc.getElementById("a003");
  199.             TASSERT(elC != 0);
  200.             TASSERT(elC != elA);
  201.             DOMString s = elA.getAttribute("id");
  202.             TASSERT(s.equals("a001"));
  203.             s = elC.getAttribute("id");
  204.             TASSERT(s.equals("a003"));
  205.         }
  206.         TESTEPILOG;
  207.         parser->parse(*memBufIS);
  208.         doc = parser->getDocument();
  209.         TESTPROLOG;
  210.         {
  211.             // This one should get an element
  212.             DOM_Element elA = doc.getElementById("a001");
  213.             TASSERT(!elA.isNull());
  214.             elA.setAttribute("id", "a004");
  215.             // This one should NOT get an element
  216.             elA = doc.getElementById("a001");
  217.             TASSERT(elA.isNull());
  218.         };
  219.         parser->parse(*memBufIS);
  220.         doc = parser->getDocument();
  221.         TESTPROLOG;
  222.         {
  223.             // This one should get an element
  224.             DOM_Element elA = doc.getElementById("a001");
  225.             TASSERT(!elA.isNull());
  226.             DOM_Node parent = elA.getParentNode();
  227.             DOM_Node removed = parent.removeChild(elA);
  228.             removed = 0;
  229.             elA = 0;
  230.             // This one should NOT get an element
  231.             elA = doc.getElementById("a001");
  232.             TASSERT(elA.isNull());
  233.         }
  234.         doc = 0;
  235.         delete parser;
  236.         delete memBufIS;
  237.         delete ehandler;
  238.     }
  239.     //
  240.     //  Print Final allocation stats for full set of tests
  241.     //
  242.     DomMemDebug().print();
  243.     XMLPlatformUtils::Terminate();
  244.     return 0;
  245. return 0;
  246. }