blob: be984bf6f2c723b75e68810840d19764df5d1d7b [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
#include <stdio.h>
#include <string.h>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DomMemDebug.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLException.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/parsers/DOMParser.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
#include <xercesc/sax/ErrorHandler.hpp>
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/sax/SAXParseException.hpp>
//-------------------------------------------------------------
//
// Macros of general use in tests.
//
//-------------------------------------------------------------
#define TASSERT(c) tassert((c), __FILE__, __LINE__)
void tassert(bool c, const char *file, int line)
{
if (!c)
printf("Failure. Line %d, file %s\n", line, file);
};
#define TESTPROLOG entryMemState = DomMemDebug();
#define TESTEPILOG \
exitMemState = DomMemDebug(); \
if (entryMemState != exitMemState) { \
printf(" Memory leak at line %d, file %s: ", __LINE__, __FILE__); \
exitMemState.printDifference(entryMemState); \
}
#define EXCEPTION_TEST(operation, expected_exception) \
{ \
try { \
operation; \
printf(" Error: no exception thrown at line %d\n", __LINE__); \
} \
catch (DOM_DOMException &e) { \
if (e.code != expected_exception) \
printf(" Wrong exception code: %d at line %d\n", e.code, __LINE__); \
} \
catch (...) { \
printf(" Wrong exception thrown at line %d\n", __LINE__); \
} \
}
// ---------------------------------------------------------------------------
//
// Simple error handler to install on parser
// With no error handler errors are silently ignored.
// This test program does not normally produce XML errors, but having
// an error handler is useful for debugging.
//
// ---------------------------------------------------------------------------
class SimpleErrorHandler : public ErrorHandler
{
public:
SimpleErrorHandler() {};
virtual ~SimpleErrorHandler() {};
void warning(const SAXParseException& e) {printError(e);};
void error(const SAXParseException& e){printError(e);};
void fatalError(const SAXParseException& e){printError(e);};
void resetErrors() {};
void printError(const SAXParseException &e) { fprintf(stderr, "\n Error in parsing.\n"
" line: %d, col: %d \n"
" Message: %s\n",
e.getLineNumber(),
e.getColumnNumber(),
XMLString::transcode(e.getMessage()));};
private :
SimpleErrorHandler(const SimpleErrorHandler&);
void operator=(const SimpleErrorHandler&);
};
// ---------------------------------------------------------------------------
//
// Small in-memory test document
//
// ---------------------------------------------------------------------------
//
// NOTE: If your encoding is not ascii you will need to change
// the following #define for DOMIDTEST_ENCODING
//
#ifndef DOMIDTEST_ENCODING
#if defined(OS390)
#define DOMIDTEST_ENCODING "ibm-1047-s390"
#else
#define DOMIDTEST_ENCODING "ascii"
#endif
#endif /* ifndef DOMIDTEST_ENCODING */
static const char* TestDoc1 =
"<?xml version='1.0' encoding='" DOMIDTEST_ENCODING "'?> \n\
<!DOCTYPE doc [ \n\
<!ELEMENT doc (elA | elB)*> \n\
<!ELEMENT elA (#PCDATA)> \n\
<!ELEMENT elB (#PCDATA)> \n\
<!ATTLIST elA id ID #IMPLIED> \n\
<!ATTLIST elB id CDATA #IMPLIED> \n\
]> \n\
\n\
<doc> \n\
<elA id='a001'/> \n\
<elB id='a002'/> \n\
<elA id='a003'/> \n\
</doc> \n\
";
int main()
{
// Initialize the XML4C2 system
try
{
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch)
{
fprintf(stderr, "Error during initialization! Message: \n%s\n",
XMLString::transcode(toCatch.getMessage()));
return 1;
}
{
// Nest entire test in an inner block.
// Reference counting should recover all document
// storage when this block exits.
bool doValidation = true;
bool doNamespaces = false;
DOMParser *parser = new DOMParser;
parser->setDoValidation(doValidation);
parser->setDoNamespaces(doNamespaces);
ErrorHandler *ehandler = new SimpleErrorHandler();
parser->setErrorHandler(ehandler);
MemBufInputSource* memBufIS = new MemBufInputSource (
(const XMLByte*)TestDoc1,
strlen(TestDoc1),
"TestDoc1",
false
);
parser->parse(*memBufIS);
DOM_Document doc = parser->getDocument();
DomMemDebug entryMemState, exitMemState;
TESTPROLOG;
{
DOM_Element elA = doc.getElementById("a001");
TASSERT(elA != 0);
DOM_Element elB = doc.getElementById("a002");
TASSERT(elB == 0);
DOM_Element elC = doc.getElementById("a003");
TASSERT(elC != 0);
TASSERT(elC != elA);
DOMString s = elA.getAttribute("id");
TASSERT(s.equals("a001"));
s = elC.getAttribute("id");
TASSERT(s.equals("a003"));
}
TESTEPILOG;
parser->parse(*memBufIS);
doc = parser->getDocument();
TESTPROLOG;
{
// This one should get an element
DOM_Element elA = doc.getElementById("a001");
TASSERT(!elA.isNull());
elA.setAttribute("id", "a004");
// This one should NOT get an element
elA = doc.getElementById("a001");
TASSERT(elA.isNull());
};
parser->parse(*memBufIS);
doc = parser->getDocument();
TESTPROLOG;
{
// This one should get an element
DOM_Element elA = doc.getElementById("a001");
TASSERT(!elA.isNull());
DOM_Node parent = elA.getParentNode();
DOM_Node removed = parent.removeChild(elA);
removed = 0;
elA = 0;
// This one should NOT get an element
elA = doc.getElementById("a001");
TASSERT(elA.isNull());
}
doc = 0;
delete parser;
delete memBufIS;
delete ehandler;
}
//
// Print Final allocation stats for full set of tests
//
DomMemDebug().print();
XMLPlatformUtils::Terminate();
return 0;
return 0;
}