BaseScanner.xsl (315 lines of code) (raw):

<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:redirect="org.apache.xalan.lib.Redirect" extension-element-prefixes="redirect" version="1.0"> <!-- FileName: BaseScanner.xsl --> <!-- Author: shane_curcuru@us.ibm.com --> <!-- Purpose: Base stylesheet for org.apache.qetest.XMLFileLogger logFiles that defines the structure of test output reports. Designed to be 'subclassed' by import/include and defining custom output for your desired elements. --> <xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.0 Transitional"/> <lxslt:component prefix="redirect" elements="write open close" functions=""> <lxslt:script lang="javaclass" src="org.apache.xalan.lib.Redirect"/> </lxslt:component> <!-- Include constant definitions for results file elements, attributes, and values, copied from relevant Java code --> <xsl:include href="resultsConstants.xsl"/> <!-- Name of file for mini-fails redirected output --> <xsl:param name="redirectFilename">BaseScannerMini.html</xsl:param> <!-- ================================== --> <!-- Root template: just define the structure of the output. Allow subclasses to provide templates for each part. --> <xsl:template match="resultsfile"> <html> <head> <title><xsl:text>Test Results file: </xsl:text><xsl:value-of select="@logFile"/></title> </head> <body> <p align="center" font="-2"> <xsl:text>Original results.xml: </xsl:text> <xsl:element name="a"> <xsl:attribute name="href"><xsl:value-of select="@logFile"/></xsl:attribute> <xsl:value-of select="@logFile"/> </xsl:element> <xsl:text> Processing stylesheet: </xsl:text> <xsl:call-template name="printScannerName"/> </p> <!-- Handle each individual testfile (i.e. TestName.java) that ran. --> <xsl:apply-templates select="testfile"/> </body> </html> </xsl:template> <xsl:template name="printScannerName"> <xsl:element name="a"> <xsl:attribute name="href"><xsl:text>BaseScanner.xsl</xsl:text></xsl:attribute> <xsl:text>BaseScanner</xsl:text> </xsl:element> </xsl:template> <xsl:template match="testfile"> <!-- Output any header info, like overall results summary --> <xsl:call-template name="test-header"/> <!-- Output detail results from testcases, etc. --> <xsl:call-template name="test-body"/> <!-- Output any footer info, like environment hashes, etc. --> <xsl:call-template name="test-footer"/> </xsl:template> <!-- ================================== --> <!-- Structural templates: each named template is normally called from the root template of / to perform it's part. --> <!-- Output any header info, like overall results summary --> <xsl:template name="test-header"> <table frame="box" border="1" rules="groups" cellspacing="2" cellpadding="2" bgcolor="#FFFFEE"> <caption> <b><xsl:value-of select="@filename"/><xsl:text>: </xsl:text></b><xsl:value-of select="@desc"/> </caption> <redirect:write select="$redirectFilename" append="true"> <hr/> <h3><xsl:value-of select="@filename"/> <xsl:text>: </xsl:text><xsl:value-of select="@desc"/> <xsl:text> in </xsl:text><xsl:value-of select="../@logFile"/> </h3> </redirect:write> <!-- Print out mini-summary of overall results --> <tr> <td width="20%"><xsl:text>Overall (TestCases/TestPoints)</xsl:text></td> <td> <xsl:text>Pass: </xsl:text> <xsl:value-of select="statistic[@desc='passCount[CASES]']/longval"/><xsl:text>/</xsl:text> <xsl:value-of select="statistic[@desc='passCount[CHECKS]']/longval"/><xsl:text>, </xsl:text> <xsl:text>Fail: </xsl:text> <xsl:value-of select="statistic[@desc='failCount[CASES]']/longval"/><xsl:text>/</xsl:text> <xsl:value-of select="statistic[@desc='failCount[CHECKS]']/longval"/><xsl:text>, </xsl:text> <xsl:text>Errr: </xsl:text> <xsl:value-of select="statistic[@desc='errrCount[CASES]']/longval"/><xsl:text>/</xsl:text> <xsl:value-of select="statistic[@desc='errrCount[CHECKS]']/longval"/><xsl:text>, </xsl:text> <xsl:text>Ambg: </xsl:text> <xsl:value-of select="statistic[@desc='ambgCount[CASES]']/longval"/><xsl:text>/</xsl:text> <xsl:value-of select="statistic[@desc='ambgCount[CHECKS]']/longval"/><xsl:text>, </xsl:text> <xsl:text>Incp: </xsl:text> <xsl:value-of select="statistic[@desc='incpCount[CASES]']/longval"/> </td> </tr> <tr> <td> <xsl:text>Testcases</xsl:text> </td> <td> <!-- Create links to non-passing testcases for easy navigation --> <xsl:text>Fails: </xsl:text> <xsl:for-each select="testcase[caseresult/@result=$FAIL]"> <xsl:call-template name="create-testcase-link"> <xsl:with-param name="testcase" select="."/> </xsl:call-template> </xsl:for-each> <xsl:text> Errors: </xsl:text> <xsl:for-each select="testcase[caseresult/@result=$ERRR]"> <xsl:call-template name="create-testcase-link"> <xsl:with-param name="testcase" select="."/> </xsl:call-template> </xsl:for-each> <xsl:text> Ambiguous: </xsl:text> <xsl:for-each select="testcase[caseresult/@result=$AMBG]"> <xsl:call-template name="create-testcase-link"> <xsl:with-param name="testcase" select="."/> </xsl:call-template> </xsl:for-each> <xsl:text> Incomplete: </xsl:text> <xsl:for-each select="testcase[caseresult/@result=$INCP]"> <xsl:call-template name="create-testcase-link"> <xsl:with-param name="testcase" select="."/> </xsl:call-template> </xsl:for-each> </td> </tr> <tr> <td> <!-- Create a link to the hashtables for this file --> <font size="-1"> <xsl:element name="a"> <xsl:attribute name="href"><xsl:value-of select="$hash-marker"/><xsl:value-of select="@filename"/></xsl:attribute> <xsl:text>System.properties, etc. during the test</xsl:text> </xsl:element> </font> </td> </tr> </table> </xsl:template> <!-- Output detail results from testcases, etc. --> <xsl:template name="test-body"> <!-- Process all testcases and interim messages --> <xsl:apply-templates select="*[not(name(.)='hashtable')]" /> </xsl:template> <!-- Output any footer info, like environment hashes, etc. --> <xsl:template name="test-footer"> <!-- @todo optimize so anchor only appears if there are hashtables --> <br/> <xsl:element name="a"> <xsl:attribute name="name"><xsl:value-of select="$hash-marker"/><xsl:value-of select="@filename"/></xsl:attribute> <xsl:text>System properties follow for: </xsl:text><xsl:value-of select="@filename"/> </xsl:element> <!-- Dump hashtables at the file level, which are system properties & etc. --> <xsl:apply-templates select="hashtable"/> </xsl:template> <!-- 'Worker' template to convert loggingLevels --> <!-- This is not terribly efficient, but it is prettier! --> <xsl:template name="printLevel"> <xsl:param name="level"></xsl:param> <xsl:choose> <xsl:when test="$ERRORMSG=$level"><xsl:text>error</xsl:text></xsl:when> <xsl:when test="$ERRORMSG=$level"><xsl:text>error</xsl:text></xsl:when> <xsl:when test="$FAILSONLY=$level"><xsl:text>failmsg</xsl:text></xsl:when> <xsl:when test="$WARNINGMSG=$level"><xsl:text>warning</xsl:text></xsl:when> <xsl:when test="$STATUSMSG=$level"><xsl:text>status</xsl:text></xsl:when> <xsl:when test="$INFOMSG=$level"><xsl:text>info</xsl:text></xsl:when> <xsl:when test="$TRACEMSG=$level"><xsl:text>trace</xsl:text></xsl:when> <xsl:otherwise><xsl:value-of select="$level"/></xsl:otherwise> </xsl:choose> </xsl:template> <!-- ================================== --> <!-- Element templates: output basic data for each of the common test elements, like messages, checks, etc. --> <!-- Testfile is basically just a redirect to apply lower level templates --> <xsl:template match="testcase"> <table frame="box" border="1" rules="groups" cellspacing="2" cellpadding="2" bgcolor="#FFFFEE"> <caption> <b><xsl:text>Testcase # </xsl:text></b> <!-- This creates the anchor as well as printing the @desc --> <xsl:call-template name="create-testcase-anchor"> <xsl:with-param name="testcase" select="."/> </xsl:call-template> </caption> <!-- establish row widths here --> <tr> <td width="20"></td> <td></td> </tr> <!-- Normally, process all sub-elements using the table mode --> <xsl:apply-templates mode="table"/> <tr> <td><br/><hr/></td> <td><xsl:value-of select="caseresult/@result"/>:<xsl:text>Testcase #</xsl:text><xsl:value-of select="@desc"/></td> </tr> </table> </xsl:template> <!-- Handle checkresult statements: each test point's result --> <xsl:template match="checkresult" mode="table"> <tr> <td> <xsl:call-template name="create-checkresult-anchor"> <xsl:with-param name="checkresult" select="."/> </xsl:call-template> </td> <td> <xsl:if test="@id"> <xsl:text>[</xsl:text><xsl:value-of select="@id"/><xsl:text>] </xsl:text> </xsl:if> <xsl:value-of select="@desc"/> </td> </tr> </xsl:template> <!-- Handle basic test messages: status, info, trace, etc. --> <xsl:template match="message" mode="table"> <tr> <td> <xsl:call-template name="printLevel"> <xsl:with-param name="level" select="@level"/> </xsl:call-template> </td> <td><xsl:value-of select="."/></td> </tr> </xsl:template> <!-- Handle basic test messages when not in a testcase --> <xsl:template match="message"> <p> <xsl:call-template name="printLevel"> <xsl:with-param name="level" select="@level"/> </xsl:call-template> <xsl:text> : </xsl:text><xsl:value-of select="."/> </p> </xsl:template> <!-- Handle arbitrary test messages: smaller font and preformatted --> <xsl:template match="arbitrary" mode="table"> <tr> <td> <xsl:call-template name="printLevel"> <xsl:with-param name="level" select="@level"/> </xsl:call-template> </td> <td><font size="-1"><pre><xsl:value-of select="."/></pre></font></td> </tr> </xsl:template> <!-- Handle arbitrary test messages when not in a testcase --> <xsl:template match="arbitrary"> <p> <xsl:call-template name="printLevel"> <xsl:with-param name="level" select="@level"/> </xsl:call-template> <xsl:text> : </xsl:text> <font size="-1"><pre><xsl:value-of select="."/></pre></font> </p> </xsl:template> <!-- Handle fileCheck elements outputting info about files, etc. Note that we copy the contents of the element, since some tests might have element output here. --> <xsl:template match="fileCheck" mode="table"> <tr> <td><font size="-1">fileCheck</font></td> <td> <xsl:text>Actual: </xsl:text> <xsl:element name="a"> <xsl:attribute name="href"><xsl:value-of select="@actual"/></xsl:attribute> <xsl:value-of select="@actual"/> </xsl:element><br/> <xsl:text>Reference: </xsl:text> <xsl:element name="a"> <xsl:attribute name="href"><xsl:value-of select="@reference"/></xsl:attribute> <xsl:value-of select="@reference"/> </xsl:element><br/> <br/> <pre><font size="-1"><xsl:copy-of select="."/></font></pre> </td> </tr> </xsl:template> <!-- Handle perf info simplistically; print out all attrs as timing data --> <xsl:template match="perf" mode="table"> <tr> <td><font size="-1">perf</font></td> <td> <xsl:text>[</xsl:text><xsl:value-of select="@idref"/><xsl:text>]</xsl:text><br/> <xsl:for-each select="attribute::*"> <xsl:choose> <!-- Skip unneeded attrs --> <xsl:when test="'level' = name()"/> <xsl:when test="'testlet' = name()"/> <xsl:when test="'idref' = name()"/> <xsl:when test="'actual' = name()"/> <xsl:when test="'reference' = name()"/> <!-- Output any other perf-related attrs, whatever they are --> <xsl:otherwise> <xsl:value-of select="name()"/><xsl:text> = </xsl:text><xsl:value-of select="."/><br/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </td> </tr> </xsl:template> <!-- Handle basic hashtables and items within them --> <xsl:template match="hashtable"> <table border="1" width="80%" cellspacing="1" cellpadding="2"> <caption><xsl:value-of select="@desc"/></caption> <xsl:apply-templates select="hashitem"/> </table> </xsl:template> <xsl:template match="hashitem"> <tr> <td><xsl:value-of select="@key"/></td> <td> <!-- Integrate with S4JLoadUtil: create links to loaded schemas --> <xsl:choose> <xsl:when test="@key='current-file'"> <xsl:element name="a"> <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute> <xsl:value-of select="."/> </xsl:element> </xsl:when> <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise> </xsl:choose> </td> </tr> </xsl:template> <!-- Handle basic hashtables and items when in a table, which is a bit tricky --> <xsl:template match="hashtable" mode="table"> <tr> <td><xsl:text>hash</xsl:text></td> <td> <table border="1" width="80%" cellspacing="1" cellpadding="2"> <caption><xsl:value-of select="@desc"/></caption> <xsl:apply-templates select="hashitem"/><!-- note no mode needed --> </table> </td> </tr> </xsl:template> <!-- Worker template to make testcase links: @desc is in anchor --> <xsl:template name="create-testcase-link"> <xsl:param name="testcase"></xsl:param> <font size="-1"> <xsl:element name="a"> <xsl:attribute name="href"><xsl:value-of select="$testcase-marker"/><xsl:value-of select="translate($testcase/@desc,'\ ','-')"/></xsl:attribute> <xsl:text>Testcase#</xsl:text><xsl:value-of select="substring-before($testcase/@desc,' ')"/> </xsl:element> <xsl:text>, </xsl:text> </font> </xsl:template> <!-- Worker template to make testcase anchors: @desc is in anchor --> <xsl:template name="create-testcase-anchor"> <xsl:param name="testcase"></xsl:param> <xsl:element name="a"> <xsl:attribute name="name"><xsl:value-of select="$testcase-marker"/><xsl:value-of select="translate($testcase/@desc,'\ ','-')"/></xsl:attribute> <xsl:value-of select="@desc"/> </xsl:element> </xsl:template> <!-- Worker template to make checkresult anchors: @result is in anchor --> <xsl:template name="create-checkresult-anchor"> <xsl:param name="checkresult"></xsl:param> <xsl:element name="a"> <xsl:attribute name="name"><xsl:value-of select="$checkresult-marker"/><xsl:value-of select="translate($checkresult/@desc,'\ ','-')"/></xsl:attribute> <xsl:value-of select="@result"/> </xsl:element> </xsl:template> <!-- Override default text node processing, so statistics and other misc text is skipped --> <xsl:template match="text()"/> <xsl:template match="text()" mode="table"/> </xsl:stylesheet>