blob: eb23d0f567bcfac6835ae620f30aaef415477e19 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999-2001 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 "Xalan" 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/>.
*
* FileUtility.hpp
*/
#if !defined(FILEUTILITY_HEADER_GUARD_1357924680)
#define FILEUTILITY_HEADER_GUARD_1357924680
#include <Harness/HarnessDefinitions.hpp>
#include <vector>
#if defined(XALAN_OLD_STREAM_HEADERS)
#include <strstream.h>
#else
#include <strstream>
#endif
#include <XalanDOM/XalanDOMString.hpp>
// Misc typedefs and Global variables.
// These structures hold vectors of directory names and file names.
#if defined(XALAN_NO_NAMESPACES)
typedef vector<XalanDOMString> FileNameVectorType;
#else
typedef std::vector<XalanDOMString> FileNameVectorType;
#endif
class FormatterListener;
class PrintWriter;
class StylesheetRoot;
class XalanCompiledStylesheet;
class XalanNode;
class XalanSourceTreeDocument;
class XalanTransformer;
class XMLFileReporter;
class XSLTInputSource;
// This class is exported from the Harness.dll
class HARNESS_API FileUtility
{
public:
/**
* Initialize static data.
* Should be called only once per process before creating any
* instances of FileUtility.
*/
static void
initialize();
/**
* Clean-up static data.
* Should be called only once per process after deleting all
* instances of FileUtility.
*/
static void
terminate();
struct HARNESS_API reportStruct
{
XalanDOMString theDrive;
XalanDOMString testOrFile;
XalanDOMString xmlFileURL;
XalanDOMString xslFileURL;
XalanDOMString xmlFormat;
const char* msg;
XalanDOMString currentNode;
XalanDOMString actual;
XalanDOMString expected;
int pass;
int fail;
int nogold;
reportStruct();
void
reset();
} data;
struct HARNESS_API cmdParams
{
private:
#if defined(XALAN_NO_NAMESPACES)
ostrstream help;
#else
std::ostrstream help;
#endif
char* data;
public:
XalanDOMString base;
XalanDOMString output;
XalanDOMString gold;
XalanDOMString sub;
int source;
bool skip;
long iters;
cmdParams();
~cmdParams()
{
delete [] data;
}
const char*
getHelpMessage()
{
delete [] data;
help << '\0';
data = help.str();
return data;
}
#if defined(XALAN_NO_NAMESPACES)
ostream&
#else
std::ostream&
#endif
getHelpStream()
{
return help;
}
} args;
/** Simple constructor, does not perform initialization. */
FileUtility();
/**
* Utility method used to get test files from a specific directory.
* @returns a vector containing test files.
*/
XalanDOMString
getDrive();
bool
getParams( int argc,
const char* argv[],
char* outDir,
bool fsetGold = true);
FileNameVectorType
getTestFileNames(
const XalanDOMString& baseDir,
const XalanDOMString& relDir,
bool useDirPrefix);
/**
* Utility method used to get subdirectories from a specific directory.
* @returns a vector containing directory files.
*/
FileNameVectorType
getDirectoryNames(const XalanDOMString& rootDirectory);
/**
* Utility method used to create default directories when neccessary
*/
void
checkAndCreateDir(const XalanDOMString& directory);
/**
* Utility method determines if directory exists.
*/
bool
checkDir(const XalanDOMString& directory);
/**
* Utility method used to get XSL file based on XML file.
* @returns a XalanDOMString.
*/
XalanDOMString
getXSLFileName(const XalanDOMString& theXMLFileName);
/**
* Utility method used to get OUT file based on XML file.
* @returns a XalanDOMString.
*/
XalanDOMString
generateFileName(
const XalanDOMString& theXMLFileName,
const char* suffix,
bool* status = 0);
/**
* Utility method used to generate UniqRunid.
* @returns a XalanDOMString.
*/
XalanDOMString
generateUniqRunid();
/**
* Utility methods used to get Xerces Version number.
* @returns a XalanDOMString.
*/
XalanDOMString
getXercesVersion();
void
checkResults(
const XalanDOMString& outputFile,
const XalanDOMString& goldFile,
XMLFileReporter& logfile);
void
checkAPIResults(
const XalanDOMString& actual,
const XalanDOMString& expected,
const char* msg,
XMLFileReporter& logfile,
const XalanDOMString& outputFile,
const XalanDOMString& goldFile);
void
checkAPIResults(
const char* actual,
const char* expected,
const char* msg,
XMLFileReporter& logfile,
const XalanDOMString& outputFile,
const XalanDOMString& goldFile)
{
checkAPIResults(
XalanDOMString(actual),
XalanDOMString(expected),
msg,
logfile,
outputFile,
goldFile);
}
/**
* Utility method used to compare the results. It inturn
* call domCompare.
* @returns Void.
*/
void
checkDOMResults(
const XalanDOMString& theOutputFile,
const XalanCompiledStylesheet* compiledSS,
const XalanSourceTreeDocument* dom,
const XSLTInputSource& goldInputSource,
XMLFileReporter& logfile);
bool
compareSerializedResults(
const XalanDOMString& transformResult,
const XalanDOMString& goldInputSource);
/**
* Utility method used to create a FormatterToXML FormatterListener.
* This is required to DOM comparisions.
* @returns a pointer to a FormatterListener.
*/
FormatterListener*
getXMLFormatter(
bool shouldWriteXMLHeader,
bool stripCData,
bool escapeCData,
PrintWriter& resultWriter,
int indentAmount,
const XalanDOMString& mimeEncoding,
const StylesheetRoot* stylesheet);
bool
fileCompare(
const char* goldFile,
const char* outputFile);
/**
* Utility methods used to perform a DOM Compare
* @returns boolean
*/
bool
domCompare(const XalanNode& gold, const XalanNode& doc);
/**
* Utility methods used to diff two Element nodes.
* @returns boolean.
*/
bool
diffElement(const XalanNode& gold, const XalanNode& doc);
/**
* Utility methods used to diff two attribute nodes.
* @returns boolean.
*/
bool
diffAttr(const XalanNode* gAttr, const XalanNode* dAttr);
/**
* Utility methods used to report Pass/Fail numbers.
* @returns void.
*/
void
reportPassFail(XMLFileReporter& logfile);
void
reportPassFail(XMLFileReporter& logfile, const XalanDOMString& runid);
void
analyzeResults(XalanTransformer& xalan, const XalanDOMString& resultsFile);
static const XalanDOMString& s_xmlSuffix;
static const XalanDOMString& s_pathSep;
private:
XalanDOMString
getProgramName(const char* fullName);
/**
* Utility methods used to collect information about compare failures.
* @returns void.
*/
void
collectData(
const char* errmsg,
const XalanDOMString& currentnode,
const XalanDOMString& actdata,
const XalanDOMString& expdata);
/**
* Utility methods used to report DOM compare errors.
* @returns void.
*/
void
reportError();
#if defined(NDEBUG)
void
debugNodeData(const XalanDOMString& /* value */) const
{
}
void
debugNodeData(
const XalanDOMString& /* node */,
const XalanDOMString& /* value */) const
{
}
void
debugAttributeData(const XalanDOMString& /* value */) const
{
}
#else
void
debugNodeData(const XalanDOMString& value) const;
void
debugNodeData(
const XalanDOMString& node,
const XalanDOMString& value) const;
void
debugAttributeData(const XalanDOMString& value) const;
#endif
}; // end of class FileUtility
#endif