<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

<xsl:output method="html" indent="yes"/>

<xsl:template name="htmlForResult">
  <xsl:param name="class"/>
  <xsl:param name="text"/>
  <span>
    <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>
    <xsl:value-of select="$text"/>
  </span>
</xsl:template>

<xsl:template name="makeSummaryTableRow">
  <xsl:param name="label"/>
  <xsl:param name="class"/>
  <xsl:param name="text"/>
  <tr>
  <td><xsl:value-of select="$label"/></td>
  <td>
  <xsl:call-template name="htmlForResult">
    <xsl:with-param name="class"><xsl:value-of select="$class"/></xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="$text"/></xsl:with-param>
  </xsl:call-template>
  </td>
  </tr>
</xsl:template>

<xsl:template match="summary">
  <h1>
    <xsl:text>Summary of Test Run</xsl:text>
    <xsl:if test="following-sibling::testresult/@result='START'">
      <xsl:variable name="suiteMsg" select="following-sibling::testresult/@message"/>
      <xsl:text> for Suite &quot;</xsl:text>
      <xsl:value-of select="substring($suiteMsg, 8, string-length($suiteMsg)-8)"/>
      <xsl:text>&quot;</xsl:text>
    </xsl:if>
  </h1>

  <xsl:call-template name="htmlForResult">
    <xsl:with-param name="class">tests</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@tests"/></xsl:with-param>
  </xsl:call-template>
  <xsl:text> tests were conducted while executing </xsl:text>
  <xsl:call-template name="htmlForResult">
    <xsl:with-param name="class">test_case</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@testcases"/></xsl:with-param>
  </xsl:call-template>
  <xsl:text> test cases.</xsl:text>

  <p>
  <xsl:text>Overall results:</xsl:text>
  </p>

  <table>
  <xsl:call-template name="makeSummaryTableRow">
    <xsl:with-param name="label">Passed Tests:</xsl:with-param>
    <xsl:with-param name="class">PASS</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@passes"/></xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="makeSummaryTableRow">
    <xsl:with-param name="label">Failed Tests:</xsl:with-param>
    <xsl:with-param name="class">FAIL</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@fails"/></xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="makeSummaryTableRow">
    <xsl:with-param name="label">Execution Errors:</xsl:with-param>
    <xsl:with-param name="class">ERROR</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@errors"/></xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="makeSummaryTableRow">
    <xsl:with-param name="label">Fatal Errors:</xsl:with-param>
    <xsl:with-param name="class">FATAL</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@fatals"/></xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="makeSummaryTableRow">
    <xsl:with-param name="label">Warnings:</xsl:with-param>
    <xsl:with-param name="class">WARNING</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@warnings"/></xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="makeSummaryTableRow">
    <xsl:with-param name="label">Unexpected Test Passes:</xsl:with-param>
    <xsl:with-param name="class">XPASS</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@unexpected_passes"/></xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="makeSummaryTableRow">
    <xsl:with-param name="label">Expected Test Failures:</xsl:with-param>
    <xsl:with-param name="class">XFAIL</xsl:with-param>
    <xsl:with-param name="text"><xsl:value-of select="@expected_fails"/></xsl:with-param>
  </xsl:call-template>
  </table>
</xsl:template>

<xsl:template match="testresult[@result='START_TEST_CASE']">
  <xsl:variable name="testCaseName"
                select="substring(@message, 8, string-length(@message)-8)"/>
  <xsl:variable name="nextEndResult"
                select="following-sibling::testresult[@result='END_TEST_CASE' and contains(@message, $testCaseName)][1]"/>
  <li>
  <span>
    <xsl:attribute name="class">test_case_start</xsl:attribute>
    <xsl:text>Test case &quot;</xsl:text>
    <xsl:value-of select="$testCaseName"/>
    <xsl:text>&quot;</xsl:text>
  </span>
  <p>
    <xsl:text>Test case started on </xsl:text>
    <xsl:value-of select="substring-before(@time, 'T')"/>
    <xsl:text> at </xsl:text>
    <span>
      <xsl:attribute name="class">timestamp</xsl:attribute>
      <xsl:value-of select="substring-after(@time, 'T')"/>
    </span>
    <xsl:text>.</xsl:text>
  </p>
  <ul>
    <xsl:apply-templates select="following-sibling::testresult[following-sibling::testresult[@result='END_TEST_CASE'][1]=$nextEndResult]"/>
  </ul>
  </li>
  <p>
    <xsl:text>Test case finished on </xsl:text>
    <xsl:value-of select="substring-before($nextEndResult/@time, 'T')"/>
    <xsl:text> at </xsl:text>
    <span>
      <xsl:attribute name="class">timestamp</xsl:attribute>
      <xsl:value-of select="substring-after($nextEndResult/@time, 'T')"/>
    </span>
    <xsl:text>.</xsl:text>
  </p>
</xsl:template>

<xsl:template match="testresult[@result!='START_TEST_CASE' and @result!='END_TEST_CASE']">
  <li>
    <span>
      <xsl:attribute name="class">timestamp</xsl:attribute>
      <xsl:value-of select="substring-after(@time, 'T')"/>
    </span>
    <xsl:text>: </xsl:text>
    <xsl:call-template name="htmlForResult">
      <xsl:with-param name="class"><xsl:value-of select="@result"/></xsl:with-param>
      <xsl:with-param name="text"><xsl:value-of select="text()"/></xsl:with-param>
    </xsl:call-template>
  </li>
</xsl:template>

<xsl:template match="/SquishReport">
  <xsl:choose>
    <xsl:when test="@version='1.2'">
      <html>
      <head>
        <title><xsl:text>Squish Test Execution Report</xsl:text></title>
        <link>
          <xsl:attribute name="rel">stylesheet</xsl:attribute>
          <xsl:attribute name="href">squish-report.css</xsl:attribute>
          <xsl:attribute name="type">text/css</xsl:attribute>
        </link>
      </head>
      <body>
        <xsl:apply-templates select="summary"/>
        <ol>
        <xsl:apply-templates select="testresult[@result = 'START_TEST_CASE' or @result = 'END_TEST_CASE']"/>
        </ol>
      </body>
      </html>
    </xsl:when>
    <xsl:otherwise>
      <xsl:message>
        <xsl:text>Unsupported Squish Report version </xsl:text>
        <xsl:value-of select="@version"/>
        <xsl:text>.</xsl:text>
      </xsl:message>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

