pauldick 01/07/11 10:47:07
Modified: c/Tests/Harness FileUtility.cpp FileUtility.hpp
Log:
Initial check in of compare methods. Currently I can not like with
domCompare.
Revision Changes Path
1.8 +362 -0 xml-xalan/c/Tests/Harness/FileUtility.cpp
Index: FileUtility.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/Tests/Harness/FileUtility.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- FileUtility.cpp 2001/06/20 16:15:27 1.7
+++ FileUtility.cpp 2001/07/11 17:46:57 1.8
@@ -41,6 +41,8 @@
#include <XalanDOM/XalanElement.hpp>
#include <XalanDOM/XalanNodeList.hpp>
+#include <XalanSourceTree/FormatterToSourceTree.hpp>
+
#include <PlatformSupport/DoubleSupport.hpp>
#include <PlatformSupport/DirectoryEnumerator.hpp>
#include <PlatformSupport/DOMStringHelper.hpp>
@@ -49,6 +51,24 @@
#include <PlatformSupport/XalanStdOutputStream.hpp>
#include "FileUtility.hpp"
+bool diffElement(const XalanNode& gold, const XalanNode& doc, const XalanDOMString&
fileName);
+bool diffATTR(const XalanNode* gAttr, const XalanNode* dAttr, const XalanDOMString&
fileName);
+void reportDOMError( XalanDOMString file, XalanDOMString node, char* msg);
+
+char *xalanNodeTypes[]=
+ {"UNKNOWN_NODE",
+ "ELEMENT_NODE",
+ "ATTRIBUTE_NODE",
+ "TEXT_NODE",
+ "CDATA_SECTION_NODE",
+ "ENTITY_REFERENCE_NODE",
+ "ENTITY_NODE",
+ "PROCESSING_INSTRUCTION_NODE",
+ "COMMENT_NODE",
+ "DOCUMENT_NODE",
+ "DOCUMENT_TYPE_NODE",
+ "DOCUMENT_FRAGMENT_NODE",
+ "NOTATION_NODE"};
/* This routine retrieves test file names from specified directories.
// Inputs: baseDir: typically "conf" or "perf"
@@ -203,3 +223,345 @@
return(XalanDOMString(gXercesFullVersionStr));
}
+
+/* This routine performs a DOM Comparision.
+// Inputs:
+// gold - Dom tree for the expected results
+// doc - Dom tree created during transformation
+// filename - Current filename
+//
+// Returns:
+// True or False
+//
+*/
+bool
+domCompare(const XalanNode& gold ,const XalanNode& doc, const XalanDOMString&
fileName)
+{
+ const XalanNode::NodeType docNodeType = doc.getNodeType();
+ const XalanNode::NodeType goldNodeType = gold.getNodeType();
+
+ const XalanDOMString& docNodeName = doc.getNodeName();
+ const XalanDOMString& goldNodeName = gold.getNodeName();
+
+ const XalanDOMString& docNodeValue = doc.getNodeValue();
+ const XalanDOMString& goldNodeValue = gold.getNodeValue();
+
+
+ //const XalanDOMString& docNsUri = doc.getNamespaceURI();
+ //const XalanDOMString& goldNsUri = gold.getNamespaceURI();
+
+ //const XalanDOMString& docPrefix = doc.getPrefix();
+ //const XalanDOMString& goldPrefix = gold.getPrefix();
+
+ //const XalanDOMString& docLName = doc.getLocalName();
+ //const XalanDOMString& goldLName = gold.getLocalName();
+
+
+
+ if (goldNodeType != docNodeType)
+ {
+ reportDOMError(fileName, docNodeName, "Error: NodeType mismatch.
Expected: ");
+ cout << xalanNodeTypes[goldNodeType];
+ return false;
+ }
+
+ switch (goldNodeType)
+ {
+ case XalanNode::ELEMENT_NODE: // ATTRIBUTE_NODE's are processed with
diffElement().
+ {
+
+ if ( ! diffElement(gold, doc, fileName) )
+ {
+ return false;
+ }
+
+ break;
+ }
+ case XalanNode::TEXT_NODE:
+ {
+
+#if !defined(NDEBUG) && defined(_MSC_VER)
+ cout << "Node is: " << c_str(TranscodeToLocalCodePage(docNodeValue))
<< endl;
+#endif
+
+ if(goldNodeValue != docNodeValue)
+ {
+ reportDOMError(fileName, docNodeName, "Error: Text node
mismatch. Expected: ");
+ cout << c_str(TranscodeToLocalCodePage(goldNodeValue));
+ return false;
+ }
+
+ break;
+ }
+ case XalanNode::CDATA_SECTION_NODE:
+ case XalanNode::ENTITY_REFERENCE_NODE:
+ case XalanNode::ENTITY_NODE:
+ case XalanNode::PROCESSING_INSTRUCTION_NODE:
+ case XalanNode::COMMENT_NODE:
+ {
+ break;
+ }
+ case XalanNode::DOCUMENT_NODE:
+ {
+
+#if !defined(NDEBUG) && defined(_MSC_VER)
+ cout << "Node is: " << c_str(TranscodeToLocalCodePage(docNodeName)) <<
endl;
+#endif
+
+ if (goldNodeName != docNodeName)
+ {
+ reportDOMError(fileName, docNodeName, "Error: Missing Document
Node");
+ }
+ else
+ {
+ const XalanNode *goldNextNode;
+ const XalanNode *domNextNode;
+
+ goldNextNode = gold.getFirstChild();
+ domNextNode = doc.getFirstChild();
+
+ if (0 != goldNextNode)
+ {
+ if( ! domCompare(*goldNextNode,*domNextNode, fileName)
)
+ return false;
+ }
+
+ }
+
+ break;
+ }
+
+ case XalanNode::DOCUMENT_TYPE_NODE:
+ case XalanNode::DOCUMENT_FRAGMENT_NODE:
+ case XalanNode::NOTATION_NODE:
+ {
+ break;
+ }
+ default:
+ cout << "What are you doing? " << endl;
+ }
+
+ return true;
+}
+
+/* This routine compares two element nodes.
+// Inputs:
+// gold - Dom tree for the expected results
+// doc - Dom tree created during transformation
+// filename - Current filenam
+//
+// Returns:
+// True or False
+//
+*/
+
+bool
+diffElement(const XalanNode& gold, const XalanNode& doc, const XalanDOMString&
fileName)
+{
+ const XalanDOMString& docNodeName = doc.getNodeName();
+ const XalanDOMString& goldNodeName = gold.getNodeName();
+
+ const XalanDOMString& docNsUri = doc.getNamespaceURI();
+ const XalanDOMString& goldNsUri = gold.getNamespaceURI();
+
+ //const XalanDOMString& docPrefix = doc.getPrefix();
+ //const XalanDOMString& goldPrefix = gold.getPrefix();
+
+ //const XalanDOMString& docLName = doc.getLocalName();
+ //const XalanDOMString& goldLName = gold.getLocalName();
+
+#if !defined(NDEBUG) && defined(_MSC_VER)
+ cout << "Node is: " << c_str(TranscodeToLocalCodePage(docNodeName)) << endl;
+#endif
+
+ // This essentially checks 2 things, that the prefix and localname are the
+ // same. So specific checks of these items are not necessary.
+ if (goldNodeName != docNodeName)
+ {
+ reportDOMError(fileName, docNodeName, "Error: Element mismatch.
Expected: ");
+ cout << c_str(TranscodeToLocalCodePage(goldNodeName));
+ return false;
+ }
+
+ if ( goldNsUri != docNsUri)
+ {
+ reportDOMError(fileName, docNodeName, "Error: Element NamespaceURI
mismatch. Expected: ");
+ cout << c_str(TranscodeToLocalCodePage(goldNsUri));
+ return false;
+ }
+
+ if ( goldNsUri != docNsUri)
+ {
+ reportDOMError(fileName, docNodeName, "Error: Element NamespaceURI
mismatch. Expected: ");
+ cout << c_str(TranscodeToLocalCodePage(goldNsUri));
+ return false;
+ }
+
+
+ // Get Attributes for each Element Node.
+ const XalanNamedNodeMap *goldAttrs = gold.getAttributes();
+ const XalanNamedNodeMap *docAttrs = doc.getAttributes();
+
+ // Get number of Attributes
+ int numGoldAttr = goldAttrs->getLength();
+ int numDomAttr = docAttrs ->getLength();
+
+ // Check that each Element has same number of Attributes. If they don't report
error
+ if ( numGoldAttr == numDomAttr )
+ {
+ // Compare Attributes one at a time.
+ for (int i=0; i < numGoldAttr; i++)
+ {
+ // Attribute order is irrelvant, so comparision is base on
Attribute name.
+ XalanNode *gAttr = goldAttrs->item(i);
+ XalanDOMString goldAttrName = gAttr->getNodeName();
+
+ XalanNode *dAttr = docAttrs->getNamedItem(goldAttrName);
+ if (dAttr != 0)
+ {
+ if( ! (diffATTR(gAttr, dAttr, fileName)) )
+ return false;
+ }
+ else
+ {
+ reportDOMError(fileName, docNodeName, "Error: Element
missing named Attribute. Expected: ");
+ cout << c_str(TranscodeToLocalCodePage(goldAttrName));
+ return false;
+ }
+ }
+ }
+ else
+ {
+ reportDOMError( fileName, docNodeName, "Error: Elements don't have
same number of attributes. Expected: ");
+ cout << numGoldAttr;;
+ return false;
+ }
+
+ const XalanNode *goldNextNode;
+ const XalanNode *domNextNode;
+
+ goldNextNode = gold.getFirstChild();
+ domNextNode = doc.getFirstChild();
+
+ if (0 != goldNextNode )
+ {
+ if (0 != domNextNode)
+ {
+ if ( ! domCompare(*goldNextNode, *domNextNode, fileName) )
+ return false;
+ }
+ else
+ {
+ reportDOMError(fileName, docNodeName, "Error: Element missing
ChildNode. Expected: ");
+ cout <<
c_str(TranscodeToLocalCodePage(goldNextNode->getNodeName()));
+ return false;
+ }
+ }
+
+ goldNextNode = gold.getNextSibling();
+ domNextNode = doc.getNextSibling();
+
+ if (0 != goldNextNode)
+ {
+ if (0 != domNextNode)
+ {
+ if ( ! domCompare(*goldNextNode, *domNextNode, fileName) )
+ return false;
+ }
+ else
+ {
+ reportDOMError(fileName, docNodeName, "Error: Element missing
SiblingNode. Expected: ");
+ cout <<
c_str(TranscodeToLocalCodePage(goldNextNode->getNodeName()));
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+/* This routine compares two attribute nodes.
+// Inputs:
+// gold - Dom tree for the expected results
+// doc - Dom tree created during transformation
+// filename - Current filenam
+//
+// Returns:
+// True or False
+//
+*/
+
+bool diffATTR(const XalanNode* gAttr, const XalanNode* dAttr, const XalanDOMString&
fileName)
+{
+
+ const XalanDOMString& goldAttrName = gAttr->getNodeName();
+ const XalanDOMString& docAttrName = dAttr->getNodeName();
+
+
+#if !defined(NDEBUG) && defined(_MSC_VER)
+ cout << " Attribute is: " <<
c_str(TranscodeToLocalCodePage(goldAttrName)) << endl;
+#endif
+
+ const XalanDOMString& goldAttrNsUri = gAttr->getNamespaceURI();
+ const XalanDOMString& docAttrNsUri = dAttr->getNamespaceURI();
+
+ //const XalanDOMString& goldAttrPrefix = gAttr->getPrefix();
+ //const XalanDOMString& docAttrPrefix = dAttr->getPrefix();
+
+ //const XalanDOMString& goldAttrLName = gAttr->getLocalName();
+ //const XalanDOMString& docAttrLName = dAttr->getLocalName();
+
+ const XalanDOMString& goldAttrValue = gAttr->getNodeValue();
+ const XalanDOMString& docAttrValue = dAttr->getNodeValue();
+
+ if (goldAttrValue != docAttrValue)
+ {
+ reportDOMError(fileName, docAttrName, "Error: Attribute Value
mismatch. Expected: ");
+ cout << c_str(TranscodeToLocalCodePage(goldAttrValue));
+ return false;
+ }
+
+ if (goldAttrNsUri != docAttrNsUri)
+ {
+ reportDOMError(fileName, docAttrName, "Error: Attribute NamespaceURI
mismatch. Expected: ");
+ cout << c_str(TranscodeToLocalCodePage(goldAttrNsUri));
+ return false;
+ }
+
+/* I think that these are not necessary. I assume that they will be caught
earlier when
+ checking for named attributes.
+
+ if (goldAttrPrefix != docAttrPrefix)
+ {
+ reportDOMError(fileName, "Error: Attribute Namespace Prefix mismatch.
Expected: ",errAttrName);
+ cout << c_str(TranscodeToLocalCodePage(goldAttrPrefix));
+ return false;
+ }
+
+ if (goldAttrLName != docAttrLName)
+ {
+ reportDOMError(fileName, "Error: Attribute LocalName mismatch.
Expected: ",errAttrName);
+ cout << c_str(TranscodeToLocalCodePage(goldAttrLName));
+ return false;
+ }
+*/
+ return true;
+}
+
+/* This routine reports DOM comparison errors.
+// Inputs:
+// file - Name of current file
+// node - Current node that fails
+// msg - Failure message
+//
+*/
+
+void
+reportDOMError( XalanDOMString file, XalanDOMString node, char* msg)
+{
+
+ cout << endl << "Failed "<< file << endl
+ << " Processing node : " << node << endl
+ << " " << msg ;
+}
+
1.7 +35 -5 xml-xalan/c/Tests/Harness/FileUtility.hpp
Index: FileUtility.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/Tests/Harness/FileUtility.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- FileUtility.hpp 2001/06/20 16:15:27 1.6
+++ FileUtility.hpp 2001/07/11 17:47:01 1.7
@@ -71,6 +71,10 @@
#endif
#include <util/XercesDefs.hpp>
+#include <XSLT/XSLTInputSource.hpp>
+#include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
+#include <XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
+#include <XalanSourceTree/XalanSourceTreeDocument.hpp>
using namespace std;
@@ -79,7 +83,7 @@
/**
* Utility call that extracts test file names from testsuite.
* @author Paul [EMAIL PROTECTED]
- * @version $Id: FileUtility.hpp,v 1.6 2001/06/20 16:15:27 pauldick Exp $
+ * @version $Id: FileUtility.hpp,v 1.7 2001/07/11 17:47:01 pauldick Exp $
*/
#if defined HARNESS_EXPORTS
@@ -112,7 +116,7 @@
FileUtility()
{
- cout << "Using Xerces Version " << gXercesFullVersionStr <<
endl;
+ cout << endl << "Using Xerces Version " <<
gXercesFullVersionStr << endl;
}
/**
@@ -148,22 +152,48 @@
* Utility method used to get OUT file based on XML file.
* @returns a XalanDOMString.
*/
-
XalanDOMString FileUtility::GenerateFileName(const XalanDOMString&
theXMLFileName, char* suffix);
/**
* Utility method used to generate UniqRunid.
* @returns a XalanDOMString.
*/
-
XalanDOMString FileUtility::GenerateUniqRunid();
/**
* Utility methods used to get Xerces Version number.
* @returns a XalanDOMString.
*/
-
XalanDOMString FileUtility::getXercesVersion();
+
+ /**
+ * Utility methods used to perform a DOM Compare
+ * @returns boolean
+ */
+ bool
+ FileUtility::domCompare(const XalanNode& gold, const XalanNode& doc, const
XalanDOMString& fileName);
+
+ /**
+ * Utility methods used to diff two Element nodes.
+ * @returns boolean.
+ */
+ bool
+ FileUtility::diffElement(const XalanNode& gold, const XalanNode& doc, const
XalanDOMString& fileName);
+
+ /**
+ * Utility methods used to diff two attribute nodes.
+ * @returns boolean.
+ */
+ bool
+ FileUtility::diffATTR(const XalanNode* gAttr, const XalanNode* dAttr, const
XalanDOMString& fileName);
+
+ /**
+ * Utility methods used to report DOM compare errors.
+ * @returns void.
+ */
+ void
+ FileUtility::reportDOMError( XalanDOMString file, XalanDOMString node, char*
msg);
+
}; // end of class FileUtility
#endif
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]