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]

Reply via email to