blob: 2c45e04ded46d0974ffbc832bbc3dff4d12d7c7e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if !defined(XALAN_FILEUTILITY_HEADER_GUARD_1357924680)
#define XALAN_FILEUTILITY_HEADER_GUARD_1357924680
#include "xalanc/Harness/XalanHarnessDefinitions.hpp"
#include "xalanc/Include/XalanVector.hpp"
#include <strstream>
#include "xalanc/XalanDOM/XalanDOMString.hpp"
namespace XALAN_CPP_NAMESPACE {
class FormatterListener;
class PrintWriter;
class StylesheetRoot;
class XalanCompiledStylesheet;
class XalanDocument;
class XalanNode;
class XalanSourceTreeDocument;
class XalanTransformer;
class XalanXMLFileReporter;
class XSLTInputSource;
using xercesc::MemoryManager;
// This class is exported from the Harness.dll
class XALAN_HARNESS_EXPORT XalanFileUtility
{
public:
// A vector to hold directory names and file names.
typedef XalanVector<XalanDOMString> FileNameVectorType;
typedef XalanVector<char> CharVectorType;
struct XALAN_HARNESS_EXPORT 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(MemoryManager& theManager);
void
reset();
private:
//Not implemented
reportStruct();
reportStruct(const reportStruct&);
} data;
struct XALAN_HARNESS_EXPORT cmdParams
{
private:
typedef std::ostrstream StreamType;
StreamType help;
public:
XalanDOMString base;
XalanDOMString output;
XalanDOMString gold;
XalanDOMString sub;
int source;
bool skip;
long iters;
cmdParams(MemoryManager& theManager);
~cmdParams()
{
}
const char*
getHelpMessage();
StreamType&
getHelpStream()
{
return help;
}
private:
//Not implemented
cmdParams();
cmdParams(const cmdParams&);
} args;
/** Simple constructor, does not perform initialization. */
XalanFileUtility(MemoryManager& theManager);
~XalanFileUtility();
bool
getVerbose() const
{
return m_verbose;
}
void
setVerbose(bool flag)
{
m_verbose = flag;
}
int
getFailureCount() const
{
return data.fail;
}
/**
* Utility method used to get test files from a specific directory.
* @returns a vector containing test files.
*/
XalanDOMString&
getDrive(XalanDOMString& theResult);
bool
getParams(
int argc,
char* argv[],
const char* outDir,
bool fsetGold = true);
FileNameVectorType&
getTestFileNames(
const XalanDOMString& baseDir,
const XalanDOMString& relDir,
bool useDirPrefix,
FileNameVectorType& theFiles);
/**
* Utility method used to get subdirectories from a specific directory.
* @returns a vector containing directory files.
*/
FileNameVectorType&
getDirectoryNames(const XalanDOMString& rootDirectory,
FileNameVectorType& theFiles);
/**
* 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,
XalanDOMString& theResult);
/**
* Utility method used to get OUT file based on XML file.
* @returns a XalanDOMString.
*/
XalanDOMString&
generateFileName(
const XalanDOMString& theXMLFileName,
const char* suffix,
XalanDOMString& theResult,
bool* status = 0);
/**
* Utility method used to generate UniqRunid.
* @returns a XalanDOMString.
*/
XalanDOMString&
generateUniqRunid(XalanDOMString& theResult);
/**
* Utility methods used to get Xerces Version number.
* @returns a XalanDOMString.
*/
XalanDOMString&
getXercesVersion(XalanDOMString& theResult);
void
checkResults(
const XalanDOMString& outputFile,
const XalanDOMString& goldFile,
XalanXMLFileReporter& logfile);
void
checkAPIResults(
const XalanDOMString& actual,
const XalanDOMString& expected,
const char* msg,
XalanXMLFileReporter& logfile,
const XalanDOMString& outputFile,
const XalanDOMString& goldFile,
bool containsOnly = false);
// This API is deprecated. Please use the following
// one.
void
checkAPIResults(
const char* actual,
const char* expected,
const char* msg,
XalanXMLFileReporter& logfile,
const XalanDOMString& outputFile,
const XalanDOMString& goldFile,
MemoryManager& /* theManager */,
bool containsOnly = false)
{
checkAPIResults(
actual,
expected,
msg,
logfile,
outputFile,
goldFile,
containsOnly);
}
void
checkAPIResults(
const char* actual,
const char* expected,
const char* msg,
XalanXMLFileReporter& logfile,
const XalanDOMString& outputFile,
const XalanDOMString& goldFile,
bool containsOnly = false)
{
checkAPIResults(
XalanDOMString(actual, getMemoryManager()),
XalanDOMString(expected, getMemoryManager()),
msg,
logfile,
outputFile,
goldFile,
containsOnly);
}
/**
* 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,
XalanXMLFileReporter& 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(
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 perform a DOM Compare
* @returns boolean
*/
bool
domCompare(
const XalanDocument& gold,
const XalanDocument& 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 nodes.
* @returns true if the nodes are equal, and false if not.
*/
bool
diffNode(
const XalanNode& gold,
const XalanNode& doc);
/**
* Utility methods used to diff two nodes.
* @returns true if the nodes are equal, and false if not.
*/
bool
diffNode(
const XalanNode* gold,
const XalanNode* doc);
/**
* Utility methods used to diff two Element nodes.
* @returns boolean.
*/
bool
diffElement2(
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(XalanXMLFileReporter& logfile);
void
reportPassFail(XalanXMLFileReporter& logfile, const XalanDOMString& runid);
void
analyzeResults(XalanTransformer& xalan, const XalanDOMString& resultsFile);
static const XalanDOMChar s_xmlSuffix[];
static const XalanDOMChar s_pathSep[];
const MemoryManager&
getMemoryManager() const
{
return m_buffer.getMemoryManager();
}
MemoryManager&
getMemoryManager()
{
return m_buffer.getMemoryManager();
}
private:
static const XalanDOMString s_emptyString;
XalanDOMString&
getProgramName(const char* fullName, XalanDOMString& theBuffer);
/**
* 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();
void
debugNodeData(const XalanDOMString& /* value */);
void
debugNodeData(
const XalanDOMString& /* node */,
const XalanDOMString& /* value */);
void
debugAttributeData(const XalanDOMString& /* value */);
private:
CharVectorType m_buffer;
bool m_verbose;
//Not implemented
XalanFileUtility();
XalanFileUtility(const XalanFileUtility&);
};
}
#endif // XALAN_FILEUTILITY_HEADER_GUARD_1357924680