blob: 41ec196f70db98e1f5485ab3fe478ab9f75c64f0 [file] [log] [blame]
<?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>