Author: antoine Date: Fri Jun 30 16:42:17 2006 New Revision: 418420 URL: http://svn.apache.org/viewvc?rev=418420&view=rev Log: add support to nested XSL parameters in junitreport, Bugzilla 39708
Added: ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl Modified: ant/core/trunk/WHATSNEW ant/core/trunk/docs/manual/OptionalTasks/junitreport.html ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport.xml ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java Modified: ant/core/trunk/WHATSNEW URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/WHATSNEW (original) +++ ant/core/trunk/WHATSNEW Fri Jun 30 16:42:17 2006 @@ -450,6 +450,8 @@ * <fixcrlf> now supports an outputencoding attribute. Bugzilla report 39697. +* <junitreport> now supports nested XSL parameters. Bugzilla report 39708. + Changes from Ant 1.6.4 to Ant 1.6.5 =================================== Modified: ant/core/trunk/docs/manual/OptionalTasks/junitreport.html URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/OptionalTasks/junitreport.html?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/docs/manual/OptionalTasks/junitreport.html (original) +++ ant/core/trunk/docs/manual/OptionalTasks/junitreport.html Fri Jun 30 16:42:17 2006 @@ -95,6 +95,40 @@ <td align="center" valign="top">No. Default to current directory</td> </tr> </table> +<h3>Nested Element of the report tag</h3> +<h4>param</h4> +<em>Since Ant 1.7</em>the report tag supports nested param tags. +These tags can pass XSL parameters to the stylesheet. +<h3>Parameters</h3> +<table width="60%" border="1" cellpadding="2" cellspacing="0"> + <tr> + <td valign="top"><b>Attribute</b></td> + <td valign="top"><b>Description</b></td> + <td align="center" valign="top"><b>Required</b></td> + </tr> + <tr> + <td valign="top">name</td> + <td valign="top">Name of the XSL parameter</td> + <td align="center" valign="top">Yes</td> + </tr> + <tr> + <td valign="top">expression</td> + <td valign="top">Text value to be placed into the param.<br> + Was originally intended to be an XSL expression.</td> + <td align="center" valign="top">Yes</td> + </tr> + <tr> + <td valign="top">if</td> + <td valign="top">The param will only passed if this property is set.</td> + <td align="center" valign="top">No</td> + </tr> + <tr> + <td valign="top">unless</td> + <td valign="top">The param will only passed unless this property is set.</td> + <td align="center" valign="top">No</td> + </tr> + +</table> <h3>Example of report</h3> <blockquote> <pre><junitreport todir="./reports"> @@ -107,9 +141,26 @@ </blockquote> <p>would generate a <tt>TESTS-TestSuites.xml</tt> file in the directory <tt>reports</tt> and generate the default framed report in the directory <tt>report/html</tt>.</p> - +<h3>Example of report with xsl params</h3> +<blockquote> + <pre> +<junitreport todir="${outputdir}"> + <fileset dir="${jrdir}"> + <include name="TEST-*.xml"/> + </fileset> + <report todir="${outputdir}/html" + styledir="junitreport" + format="frames"> + <param name="key1" expression="value1"/> + <param name="key2" expression="value2"/> + </report> +</junitreport> + </pre> + </blockquote> +<p>This example requires a file called <tt>junitreport/junit-frames.xsl</tt>. + The XSL parameters key1 and key2 will be passed to the XSL transformation.</p> <hr> -<p align="center">Copyright © 2001-2002,2004-2005 The Apache Software Foundation. All rights +<p align="center">Copyright © 2001-2002,2004-2006 The Apache Software Foundation. All rights Reserved.</p> </body> Modified: ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport.xml URL: http://svn.apache.org/viewvc/ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport.xml?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport.xml (original) +++ ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport.xml Fri Jun 30 16:42:17 2006 @@ -105,4 +105,45 @@ </junitreport> </target> -</project> \ No newline at end of file + <target name="testWithStyleFromClasspath"> + <mkdir dir="${outputdir}/html"/> + <junitreport todir="${outputdir}"> + <fileset dir="${jrdir}"> + <include name="TEST-*.xml"/> + </fileset> + <report todir="${outputdir}/html"/> + </junitreport> + </target> + + <target name="testWithStyleFromDir"> + <mkdir dir="${outputdir}/html"/> + <junitreport todir="${outputdir}"> + <fileset dir="${jrdir}"> + <include name="TEST-*.xml"/> + </fileset> + <report todir="${outputdir}/html" + styledir="junitreport" + format="frames"/> + </junitreport> + </target> + + <target name="testWithParams"> + <mkdir dir="${outputdir}/html"/> + <junitreport todir="${outputdir}"> + <fileset dir="${jrdir}"> + <include name="TEST-*.xml"/> + </fileset> + <report todir="${outputdir}/html" + styledir="junitreport" + format="frames"> + <param name="key1" expression="value1"/> + <param name="key2" expression="value2"/> + </report> + </junitreport> + <concat> + <fileset file="${outputdir}/html/index.html"/> + </concat> + </target> + +</project> + \ No newline at end of file Added: ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl URL: http://svn.apache.org/viewvc/ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl?rev=418420&view=auto ============================================================================== --- ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl (added) +++ ant/core/trunk/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl Fri Jun 30 16:42:17 2006 @@ -0,0 +1,877 @@ +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" + xmlns:lxslt="http://xml.apache.org/xslt" + xmlns:redirect="http://xml.apache.org/xalan/redirect" + xmlns:stringutils="xalan://org.apache.tools.ant.util.StringUtils" + extension-element-prefixes="redirect"> +<xsl:output method="html" indent="yes" encoding="US-ASCII"/> +<xsl:decimal-format decimal-separator="." grouping-separator=","/> +<!-- + Copyright 2001-2006 The Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<!-- + + Sample stylesheet to be used with Ant JUnitReport output. + + It creates a set of HTML files a la javadoc where you can browse easily + through all packages and classes. + +--> +<xsl:param name="output.dir" select="'.'"/> +<xsl:param name="key1" select="'defaultValue1'"/> +<xsl:param name="key2" select="'defaultValue2'"/> + +<xsl:template match="testsuites"> + <!-- create the index.html --> + <redirect:write file="{$output.dir}/index.html"> + <xsl:call-template name="index.html"/> + </redirect:write> + + <!-- create the stylesheet.css --> + <redirect:write file="{$output.dir}/stylesheet.css"> + <xsl:call-template name="stylesheet.css"/> + </redirect:write> + + <!-- create the overview-packages.html at the root --> + <redirect:write file="{$output.dir}/overview-summary.html"> + <xsl:apply-templates select="." mode="overview.packages"/> + </redirect:write> + + <!-- create the all-packages.html at the root --> + <redirect:write file="{$output.dir}/overview-frame.html"> + <xsl:apply-templates select="." mode="all.packages"/> + </redirect:write> + + <!-- create the all-classes.html at the root --> + <redirect:write file="{$output.dir}/allclasses-frame.html"> + <xsl:apply-templates select="." mode="all.classes"/> + </redirect:write> + + <!-- create the all-tests.html at the root --> + <redirect:write file="{$output.dir}/all-tests.html"> + <xsl:apply-templates select="." mode="all.tests"/> + </redirect:write> + + <!-- create the alltests-fails.html at the root --> + <redirect:write file="{$output.dir}/alltests-fails.html"> + <xsl:apply-templates select="." mode="all.tests"> + <xsl:with-param name="type" select="'fails'"/> + </xsl:apply-templates> + </redirect:write> + + <!-- create the alltests-errors.html at the root --> + <redirect:write file="{$output.dir}/alltests-errors.html"> + <xsl:apply-templates select="." mode="all.tests"> + <xsl:with-param name="type" select="'errors'"/> + </xsl:apply-templates> + </redirect:write> + + <!-- process all packages --> + <xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]"> + <xsl:call-template name="package"> + <xsl:with-param name="name" select="@package"/> + </xsl:call-template> + </xsl:for-each> +</xsl:template> + + +<xsl:template name="package"> + <xsl:param name="name"/> + <xsl:variable name="package.dir"> + <xsl:if test="not($name = '')"><xsl:value-of select="translate($name,'.','/')"/></xsl:if> + <xsl:if test="$name = ''">.</xsl:if> + </xsl:variable> + <!--Processing package <xsl:value-of select="@name"/> in <xsl:value-of select="$output.dir"/> --> + <!-- create a classes-list.html in the package directory --> + <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html"> + <xsl:call-template name="classes.list"> + <xsl:with-param name="name" select="$name"/> + </xsl:call-template> + </redirect:write> + + <!-- create a package-summary.html in the package directory --> + <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html"> + <xsl:call-template name="package.summary"> + <xsl:with-param name="name" select="$name"/> + </xsl:call-template> + </redirect:write> + + <!-- for each class, creates a @name.html --> + <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten --> + <xsl:for-each select="/testsuites/[EMAIL PROTECTED] = $name]"> + <redirect:write file="{$output.dir}/{$package.dir}/[EMAIL PROTECTED]@name}.html"> + <xsl:apply-templates select="." mode="class.details"/> + </redirect:write> + <xsl:if test="string-length(./system-out)!=0"> + <redirect:write file="{$output.dir}/{$package.dir}/[EMAIL PROTECTED]@name}-out.txt"> + <xsl:value-of disable-output-escaping="yes" select="./system-out"/> + </redirect:write> + </xsl:if> + <xsl:if test="string-length(./system-err)!=0"> + <redirect:write file="{$output.dir}/{$package.dir}/[EMAIL PROTECTED]@name}-err.txt"> + <xsl:value-of disable-output-escaping="yes" select="./system-err"/> + </redirect:write> + </xsl:if> + <xsl:if test="@failures != 0"> + <redirect:write file="{$output.dir}/{$package.dir}/[EMAIL PROTECTED]@name}-fails.html"> + <xsl:apply-templates select="." mode="class.details"> + <xsl:with-param name="type" select="'fails'"/> + </xsl:apply-templates> + </redirect:write> + </xsl:if> + <xsl:if test="@errors != 0"> + <redirect:write file="{$output.dir}/{$package.dir}/[EMAIL PROTECTED]@name}-errors.html"> + <xsl:apply-templates select="." mode="class.details"> + <xsl:with-param name="type" select="'errors'"/> + </xsl:apply-templates> + </redirect:write> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<xsl:template name="index.html"> +<html> + <head> + <title> + Unit Test Results. key1=<xsl:value-of select="$key1"/>,key2=<xsl:value-of select="$key2"/> + </title> + </head> + <frameset cols="20%,80%"> + <frameset rows="30%,70%"> + <frame src="overview-frame.html" name="packageListFrame"/> + <frame src="allclasses-frame.html" name="classListFrame"/> + </frameset> + <frame src="overview-summary.html" name="classFrame"/> + <noframes> + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + </noframes> + </frameset> +</html> +</xsl:template> + +<!-- this is the stylesheet css to use for nearly everything --> +<xsl:template name="stylesheet.css"> +body { + font:normal 68% verdana,arial,helvetica; + color:#000000; +} +table tr td, table tr th { + font-size: 68%; +} +table.details tr th{ + font-weight: bold; + text-align:left; + background:#a6caf0; +} +table.details tr td{ + background:#eeeee0; +} + +p { + line-height:1.5em; + margin-top:0.5em; margin-bottom:1.0em; +} +h1 { + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica +} +h2 { + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica +} +h3 { + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica +} +h4 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h5 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h6 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +.Error { + font-weight:bold; color:red; +} +.Failure { + font-weight:bold; color:purple; +} +.Properties { + text-align:right; +} +</xsl:template> + +<!-- Create list of all/failed/errored tests --> +<xsl:template match="testsuites" mode="all.tests"> + <xsl:param name="type" select="'all'"/> + <html> + <xsl:variable name="title"> + <xsl:choose> + <xsl:when test="$type = 'fails'"> + <xsl:text>All Failures</xsl:text> + </xsl:when> + <xsl:when test="$type = 'errors'"> + <xsl:text>All Errors</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text>All Tests</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <head> + <title>Unit Test Results: <xsl:value-of select="$title"/></title> + <xsl:call-template name="create.stylesheet.link"> + <xsl:with-param name="package.name"/> + </xsl:call-template> + </head> + <body> + <xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute> + <xsl:call-template name="pageHeader"/> + <h2><xsl:value-of select="$title"/></h2> + + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> + <xsl:call-template name="testcase.test.header"> + <xsl:with-param name="show.class" select="'yes'"/> + </xsl:call-template> + <!-- + test can even not be started at all (failure to load the class) + so report the error directly + --> + <xsl:if test="./error"> + <tr class="Error"> + <td colspan="4"> + <xsl:apply-templates select="./error"/> + </td> + </tr> + </xsl:if> + <xsl:choose> + <xsl:when test="$type = 'fails'"> + <xsl:apply-templates select=".//testcase[failure]" mode="print.test"> + <xsl:with-param name="show.class" select="'yes'"/> + </xsl:apply-templates> + </xsl:when> + <xsl:when test="$type = 'errors'"> + <xsl:apply-templates select=".//testcase[error]" mode="print.test"> + <xsl:with-param name="show.class" select="'yes'"/> + </xsl:apply-templates> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select=".//testcase" mode="print.test"> + <xsl:with-param name="show.class" select="'yes'"/> + </xsl:apply-templates> + </xsl:otherwise> + </xsl:choose> + </table> + </body> + </html> +</xsl:template> + + +<!-- ====================================================================== + This page is created for every testsuite class. + It prints a summary of the testsuite and detailed information about + testcase methods. + ====================================================================== --> +<xsl:template match="testsuite" mode="class.details"> + <xsl:param name="type" select="'all'"/> + <xsl:variable name="package.name" select="@package"/> + <xsl:variable name="class.name"><xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></xsl:variable> + <html> + <head> + <title>Unit Test Results: <xsl:value-of select="$class.name"/></title> + <xsl:call-template name="create.stylesheet.link"> + <xsl:with-param name="package.name" select="$package.name"/> + </xsl:call-template> + <script type="text/javascript" language="JavaScript"> + var TestCases = new Array(); + var cur; + <xsl:apply-templates select="properties"/> + </script> + <script type="text/javascript" language="JavaScript"><![CDATA[ + function displayProperties (name) { + var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1'); + var doc = win.document; + doc.open(); + doc.write("<html><head><title>Properties of " + name + "</title>"); + doc.write("<style type=\"text/css\">"); + doc.write("body {font:normal 68% verdana,arial,helvetica; color:#000000; }"); + doc.write("table tr td, table tr th { font-size: 68%; }"); + doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }"); + doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }"); + doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }"); + doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }"); + doc.write("</style>"); + doc.write("</head><body>"); + doc.write("<h3>Properties of " + name + "</h3>"); + doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>"); + doc.write("<table class='properties'>"); + doc.write("<tr><th>Name</th><th>Value</th></tr>"); + for (prop in TestCases[name]) { + doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>"); + } + doc.write("</table>"); + doc.write("</body></html>"); + doc.close(); + win.focus(); + } + ]]> + </script> + </head> + <body> + <xsl:call-template name="pageHeader"/> + <h3>Class <xsl:value-of select="$class.name"/></h3> + + + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> + <xsl:call-template name="testsuite.test.header"/> + <xsl:apply-templates select="." mode="print.test"/> + </table> + + <xsl:choose> + <xsl:when test="$type = 'fails'"> + <h2>Failures</h2> + </xsl:when> + <xsl:when test="$type = 'errors'"> + <h2>Errors</h2> + </xsl:when> + <xsl:otherwise> + <h2>Tests</h2> + </xsl:otherwise> + </xsl:choose> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> + <xsl:call-template name="testcase.test.header"/> + <!-- + test can even not be started at all (failure to load the class) + so report the error directly + --> + <xsl:if test="./error"> + <tr class="Error"> + <td colspan="4"><xsl:apply-templates select="./error"/></td> + </tr> + </xsl:if> + <xsl:choose> + <xsl:when test="$type = 'fails'"> + <xsl:apply-templates select="./testcase[failure]" mode="print.test"/> + </xsl:when> + <xsl:when test="$type = 'errors'"> + <xsl:apply-templates select="./testcase[error]" mode="print.test"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="./testcase" mode="print.test"/> + </xsl:otherwise> + </xsl:choose> + </table> + <div class="Properties"> + <a> + <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute> + Properties » + </a> + </div> + <xsl:if test="string-length(./system-out)!=0"> + <div class="Properties"> + <a> + <xsl:attribute name="href">./<xsl:value-of select="@id"/>_<xsl:value-of select="@name"/>-out.txt</xsl:attribute> + System.out » + </a> + </div> + </xsl:if> + <xsl:if test="string-length(./system-err)!=0"> + <div class="Properties"> + <a> + <xsl:attribute name="href">./<xsl:value-of select="@id"/>_<xsl:value-of select="@name"/>-err.txt</xsl:attribute> + System.err » + </a> + </div> + </xsl:if> + </body> + </html> +</xsl:template> + + <!-- + Write properties into a JavaScript data structure. + This is based on the original idea by Erik Hatcher ([EMAIL PROTECTED]) + --> + <xsl:template match="properties"> + cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array(); + <xsl:for-each select="property"> + <xsl:sort select="@name"/> + cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>'; + </xsl:for-each> + </xsl:template> + + +<!-- ====================================================================== + This page is created for every package. + It prints the name of all classes that belongs to this package. + @param name the package name to print classes. + ====================================================================== --> +<!-- list of classes in a package --> +<xsl:template name="classes.list"> + <xsl:param name="name"/> + <html> + <head> + <title>Unit Test Classes: <xsl:value-of select="$name"/></title> + <xsl:call-template name="create.stylesheet.link"> + <xsl:with-param name="package.name" select="$name"/> + </xsl:call-template> + </head> + <body> + <table width="100%"> + <tr> + <td nowrap="nowrap"> + <h2><a href="package-summary.html" target="classFrame"> + <xsl:value-of select="$name"/> + <xsl:if test="$name = ''"><none></xsl:if> + </a></h2> + </td> + </tr> + </table> + + <h2>Classes</h2> + <table width="100%"> + <xsl:for-each select="/testsuites/testsuite[./@package = $name]"> + <xsl:sort select="@name"/> + <tr> + <td nowrap="nowrap"> + <a href="[EMAIL PROTECTED]@name}.html" target="classFrame"><xsl:value-of select="@name"/></a> + </td> + </tr> + </xsl:for-each> + </table> + </body> + </html> +</xsl:template> + + +<!-- + Creates an all-classes.html file that contains a link to all package-summary.html + on each class. +--> +<xsl:template match="testsuites" mode="all.classes"> + <html> + <head> + <title>All Unit Test Classes</title> + <xsl:call-template name="create.stylesheet.link"> + <xsl:with-param name="package.name"/> + </xsl:call-template> + </head> + <body> + <h2>Classes</h2> + <table width="100%"> + <xsl:apply-templates select="testsuite" mode="all.classes"> + <xsl:sort select="@name"/> + </xsl:apply-templates> + </table> + </body> + </html> +</xsl:template> + +<xsl:template match="testsuite" mode="all.classes"> + <xsl:variable name="package.name" select="@package"/> + <tr> + <td nowrap="nowrap"> + <a target="classFrame"> + <xsl:attribute name="href"> + <xsl:if test="not($package.name='')"> + <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text> + </xsl:if><xsl:value-of select="@id"/>_<xsl:value-of select="@name"/><xsl:text>.html</xsl:text> + </xsl:attribute> + <xsl:value-of select="@name"/> + </a> + </td> + </tr> +</xsl:template> + + +<!-- + Creates an html file that contains a link to all package-summary.html files on + each package existing on testsuites. + @bug there will be a problem here, I don't know yet how to handle unnamed package :( +--> +<xsl:template match="testsuites" mode="all.packages"> + <html> + <head> + <title>All Unit Test Packages</title> + <xsl:call-template name="create.stylesheet.link"> + <xsl:with-param name="package.name"/> + </xsl:call-template> + </head> + <body> + <h2><a href="overview-summary.html" target="classFrame">Home</a></h2> + <h2>Packages</h2> + <table width="100%"> + <xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages"> + <xsl:sort select="@package"/> + </xsl:apply-templates> + </table> + </body> + </html> +</xsl:template> + +<xsl:template match="testsuite" mode="all.packages"> + <tr> + <td nowrap="nowrap"> + <a href="./{translate(@package,'.','/')}/package-summary.html" target="classFrame"> + <xsl:value-of select="@package"/> + <xsl:if test="@package = ''"><none></xsl:if> + </a> + </td> + </tr> +</xsl:template> + + +<xsl:template match="testsuites" mode="overview.packages"> + <html> + <head> + <title>Unit Test Results: Summary</title> + <xsl:call-template name="create.stylesheet.link"> + <xsl:with-param name="package.name"/> + </xsl:call-template> + </head> + <body> + <xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute> + <xsl:call-template name="pageHeader"/> + <h2>Summary</h2> + <xsl:variable name="testCount" select="sum(testsuite/@tests)"/> + <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/> + <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/> + <xsl:variable name="timeCount" select="sum(testsuite/@time)"/> + <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> + <tr valign="top"> + <th>Tests</th> + <th>Failures</th> + <th>Errors</th> + <th>Success rate</th> + <th>Time</th> + </tr> + <tr valign="top"> + <xsl:attribute name="class"> + <xsl:choose> + <xsl:when test="$errorCount > 0">Error</xsl:when> + <xsl:when test="$failureCount > 0">Failure</xsl:when> + <xsl:otherwise>Pass</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <td><a title="Display all tests" href="all-tests.html"><xsl:value-of select="$testCount"/></a></td> + <td><a title="Display all failures" href="alltests-fails.html"><xsl:value-of select="$failureCount"/></a></td> + <td><a title="Display all errors" href="alltests-errors.html"><xsl:value-of select="$errorCount"/></a></td> + <td> + <xsl:call-template name="display-percent"> + <xsl:with-param name="value" select="$successRate"/> + </xsl:call-template> + </td> + <td> + <xsl:call-template name="display-time"> + <xsl:with-param name="value" select="$timeCount"/> + </xsl:call-template> + </td> + </tr> + </table> + <table border="0" width="95%"> + <tr> + <td style="text-align: justify;"> + Note: <em>failures</em> are anticipated and checked for with assertions while <em>errors</em> are unanticipated. + </td> + </tr> + </table> + + <h2>Packages</h2> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> + <xsl:call-template name="testsuite.test.header"/> + <xsl:for-each select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]"> + <xsl:sort select="@package" order="ascending"/> + <!-- get the node set containing all testsuites that have the same package --> + <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/> + <tr valign="top"> + <!-- display a failure if there is any failure/error in the package --> + <xsl:attribute name="class"> + <xsl:choose> + <xsl:when test="sum($insamepackage/@errors) > 0">Error</xsl:when> + <xsl:when test="sum($insamepackage/@failures) > 0">Failure</xsl:when> + <xsl:otherwise>Pass</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <td><a href="./{translate(@package,'.','/')}/package-summary.html"> + <xsl:value-of select="@package"/> + <xsl:if test="@package = ''"><none></xsl:if> + </a></td> + <td><xsl:value-of select="sum($insamepackage/@tests)"/></td> + <td><xsl:value-of select="sum($insamepackage/@errors)"/></td> + <td><xsl:value-of select="sum($insamepackage/@failures)"/></td> + <td> + <xsl:call-template name="display-time"> + <xsl:with-param name="value" select="sum($insamepackage/@time)"/> + </xsl:call-template> + </td> + <td><xsl:value-of select="$insamepackage/@timestamp"/></td> + <td><xsl:value-of select="$insamepackage/@hostname"/></td> + </tr> + </xsl:for-each> + </table> + </body> + </html> +</xsl:template> + + +<xsl:template name="package.summary"> + <xsl:param name="name"/> + <html> + <head> + <xsl:call-template name="create.stylesheet.link"> + <xsl:with-param name="package.name" select="$name"/> + </xsl:call-template> + </head> + <body> + <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute> + <xsl:call-template name="pageHeader"/> + <h3>Package <xsl:value-of select="$name"/></h3> + + <!--table border="0" cellpadding="5" cellspacing="2" width="95%"> + <xsl:call-template name="class.metrics.header"/> + <xsl:apply-templates select="." mode="print.metrics"/> + </table--> + + <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/> + <xsl:if test="count($insamepackage) > 0"> + <h2>Classes</h2> + <p> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> + <xsl:call-template name="testsuite.test.header"/> + <xsl:apply-templates select="$insamepackage" mode="print.test"> + <xsl:sort select="@name"/> + </xsl:apply-templates> + </table> + </p> + </xsl:if> + </body> + </html> +</xsl:template> + + +<!-- + transform string like a.b.c to ../../../ + @param path the path to transform into a descending directory path +--> +<xsl:template name="path"> + <xsl:param name="path"/> + <xsl:if test="contains($path,'.')"> + <xsl:text>../</xsl:text> + <xsl:call-template name="path"> + <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param> + </xsl:call-template> + </xsl:if> + <xsl:if test="not(contains($path,'.')) and not($path = '')"> + <xsl:text>../</xsl:text> + </xsl:if> +</xsl:template> + + +<!-- create the link to the stylesheet based on the package name --> +<xsl:template name="create.stylesheet.link"> + <xsl:param name="package.name"/> + <link rel="stylesheet" type="text/css" title="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></link> +</xsl:template> + + +<!-- Page HEADER --> +<xsl:template name="pageHeader"> + <h1>Unit Test Results</h1> + <table width="100%"> + <tr> + <td align="left"></td> + <td align="right">Designed for use with <a href="http://www.junit.org/">JUnit</a> and <a href="http://ant.apache.org/">Ant</a>.</td> + </tr> + </table> + <hr size="1"/> +</xsl:template> + +<!-- class header --> +<xsl:template name="testsuite.test.header"> + <tr valign="top"> + <th width="80%">Name</th> + <th>Tests</th> + <th>Errors</th> + <th>Failures</th> + <th nowrap="nowrap">Time(s)</th> + <th nowrap="nowrap">Time Stamp</th> + <th>Host</th> + </tr> +</xsl:template> + +<!-- method header --> +<xsl:template name="testcase.test.header"> + <xsl:param name="show.class" select="''"/> + <tr valign="top"> + <xsl:if test="boolean($show.class)"> + <th>Class</th> + </xsl:if> + <th>Name</th> + <th>Status</th> + <th width="80%">Type</th> + <th nowrap="nowrap">Time(s)</th> + </tr> +</xsl:template> + + +<!-- class information --> +<xsl:template match="testsuite" mode="print.test"> + <tr valign="top"> + <xsl:attribute name="class"> + <xsl:choose> + <xsl:when test="@errors[.> 0]">Error</xsl:when> + <xsl:when test="@failures[.> 0]">Failure</xsl:when> + <xsl:otherwise>Pass</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <td><a title="Display all tests" href="[EMAIL PROTECTED]@name}.html"><xsl:value-of select="@name"/></a></td> + <td><a title="Display all tests" href="[EMAIL PROTECTED]@name}.html"><xsl:apply-templates select="@tests"/></a></td> + <td> + <xsl:choose> + <xsl:when test="@errors != 0"> + <a title="Display only errors" href="[EMAIL PROTECTED]@name}-errors.html"><xsl:apply-templates select="@errors"/></a> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="@errors"/> + </xsl:otherwise> + </xsl:choose> + </td> + <td> + <xsl:choose> + <xsl:when test="@failures != 0"> + <a title="Display only failures" href="[EMAIL PROTECTED]@name}-fails.html"><xsl:apply-templates select="@failures"/></a> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="@failures"/> + </xsl:otherwise> + </xsl:choose> + </td> + <td><xsl:call-template name="display-time"> + <xsl:with-param name="value" select="@time"/> + </xsl:call-template> + </td> + <td><xsl:apply-templates select="@timestamp"/></td> + <td><xsl:apply-templates select="@hostname"/></td> + </tr> +</xsl:template> + +<xsl:template match="testcase" mode="print.test"> + <xsl:param name="show.class" select="''"/> + <tr valign="top"> + <xsl:attribute name="class"> + <xsl:choose> + <xsl:when test="error">Error</xsl:when> + <xsl:when test="failure">Failure</xsl:when> + <xsl:otherwise>TableRowColor</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <xsl:variable name="class.href"> + <xsl:value-of select="concat(translate(../@package,'.','/'), '/', ../@id, '_', ../@name, '.html')"/> + </xsl:variable> + <xsl:if test="boolean($show.class)"> + <td><a href="{$class.href}"><xsl:value-of select="../@name"/></a></td> + </xsl:if> + <td> + <a name="[EMAIL PROTECTED]"/> + <xsl:choose> + <xsl:when test="boolean($show.class)"> + <a href="{concat($class.href, '#', @name)}"><xsl:value-of select="@name"/></a> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="@name"/> + </xsl:otherwise> + </xsl:choose> + </td> + <xsl:choose> + <xsl:when test="failure"> + <td>Failure</td> + <td><xsl:apply-templates select="failure"/></td> + </xsl:when> + <xsl:when test="error"> + <td>Error</td> + <td><xsl:apply-templates select="error"/></td> + </xsl:when> + <xsl:otherwise> + <td>Success</td> + <td></td> + </xsl:otherwise> + </xsl:choose> + <td> + <xsl:call-template name="display-time"> + <xsl:with-param name="value" select="@time"/> + </xsl:call-template> + </td> + </tr> +</xsl:template> + + +<!-- Note : the below template error and failure are the same style + so just call the same style store in the toolkit template --> +<xsl:template match="failure"> + <xsl:call-template name="display-failures"/> +</xsl:template> + +<xsl:template match="error"> + <xsl:call-template name="display-failures"/> +</xsl:template> + +<!-- Style for the error and failure in the testcase template --> +<xsl:template name="display-failures"> + <xsl:choose> + <xsl:when test="not(@message)">N/A</xsl:when> + <xsl:otherwise> + <xsl:value-of select="@message"/> + </xsl:otherwise> + </xsl:choose> + <!-- display the stacktrace --> + <br/><br/> + <code> + <xsl:call-template name="br-replace"> + <xsl:with-param name="word" select="."/> + </xsl:call-template> + </code> + <!-- the latter is better but might be problematic for non-21" monitors... --> + <!--pre><xsl:value-of select="."/></pre--> +</xsl:template> + +<xsl:template name="JS-escape"> + <xsl:param name="string"/> + <xsl:param name="tmp1" select="stringutils:replace(string($string),'\','\\')"/> + <xsl:param name="tmp2" select="stringutils:replace(string($tmp1),"'","\'")"/> + <xsl:value-of select="$tmp2"/> +</xsl:template> + + +<!-- + template that will convert a carriage return into a br tag + @param word the text from which to convert CR to BR tag +--> +<xsl:template name="br-replace"> + <xsl:param name="word"/> + <xsl:value-of disable-output-escaping="yes" select='stringutils:replace(string($word),"
","<br/>")'/> +</xsl:template> + +<xsl:template name="display-time"> + <xsl:param name="value"/> + <xsl:value-of select="format-number($value,'0.000')"/> +</xsl:template> + +<xsl:template name="display-percent"> + <xsl:param name="value"/> + <xsl:value-of select="format-number($value,'0.00%')"/> +</xsl:template> +</xsl:stylesheet> Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java Fri Jun 30 16:42:17 2006 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2002,2004 The Apache Software Foundation + * Copyright 2001-2002,2004,2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,14 +21,29 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; + import java.net.URL; + +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; + import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.XSLTProcess; +import org.apache.tools.ant.taskdefs.Delete; +import org.apache.tools.ant.taskdefs.TempFile; import org.apache.tools.ant.util.JAXPUtils; +import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.types.EnumeratedAttribute; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.URLResource; +import org.apache.tools.ant.types.resources.FileResource; + import org.w3c.dom.Document; /** @@ -40,12 +55,24 @@ * */ public class AggregateTransformer { - + /** + * name of the frames format. + */ public static final String FRAMES = "frames"; + /** + * name of the no frames format. + */ public static final String NOFRAMES = "noframes"; + /** + * defines acceptable formats. + */ public static class Format extends EnumeratedAttribute { + /** + * list authorized values. + * @return authorized values. + */ public String[] getValues() { return new String[]{FRAMES, NOFRAMES}; } @@ -63,6 +90,25 @@ /** the destination directory, this is the root from where html should be generated */ protected File toDir; + /** + * The params that will be sent to the XSL transformation + * + * @since Ant 1.7 + */ + private List params; + + /** + * Instance of a utility class to use for file operations. + * + * @since Ant 1.7 + */ + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** + * Used to ensure the uniqueness of a property + */ + private static int counter = 0; + /** the format to use for the report. Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt> */ protected String format = FRAMES; @@ -77,8 +123,13 @@ dbfactory = privateDBFactory; } + /** + * constructor creating the transformer from the junitreport task. + * @param task task delegating to this class + */ public AggregateTransformer(Task task) { this.task = task; + params = new Vector(); } /** @@ -90,10 +141,18 @@ return privateDBFactory; } + /** + * sets the format. + * @param format Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt> + */ public void setFormat(Format format) { this.format = format.getValue(); } + /** + * sets the input document. + * @param doc input dom tree + */ public void setXmlDocument(Document doc) { this.document = doc; } @@ -102,6 +161,7 @@ * Set the xml file to be processed. This is a helper if you want * to set the file directly. Much more for testing purposes. * @param xmlfile xml file to be processed + * @throws BuildException if the document cannot be parsed. */ protected void setXmlfile(File xmlfile) throws BuildException { try { @@ -128,31 +188,113 @@ this.styleDir = styledir; } - /** set the destination directory */ + /** set the destination directory. + * @param todir the destination directory + */ public void setTodir(File todir) { this.toDir = todir; } - /** set the extension of the output files */ + /** set the extension of the output files + * @param ext extension. + */ public void setExtension(String ext) { task.log("extension is not used anymore", Project.MSG_WARN); } + /** + * Create an instance of an XSL parameter for configuration by Ant. + * + * @return an instance of the Param class to be configured. + * @since Ant 1.7 + */ + public XSLTProcess.Param createParam() { + XSLTProcess.Param p = new XSLTProcess.Param(); + params.add(p); + return p; + } + + /** + * transformation + * @throws BuildException exception if something goes wrong with the transformation. + */ public void transform() throws BuildException { checkOptions(); + Project project = task.getProject(); + + TempFile tempFileTask = new TempFile(); + tempFileTask.bindToOwner(task); + String tempFileProperty = getClass().getName() + String.valueOf(counter++); + File tmp = FILE_UTILS.resolveFile(project.getBaseDir(), + project.getProperty("java.io.tmpdir")); + tempFileTask.setDestDir(tmp); + tempFileTask.setProperty(tempFileProperty); + tempFileTask.execute(); + + XSLTProcess xsltTask = new XSLTProcess(); + xsltTask.bindToOwner(task); + + xsltTask.addConfigured(getStylesheet()); + // acrobatic cast. + xsltTask.setIn(((XMLResultAggregator) task).getDestinationFile()); + File dummyFile = new File(project.getProperty(tempFileProperty)); + xsltTask.setOut(dummyFile); + for (Iterator i = params.iterator(); i.hasNext();) { + XSLTProcess.Param param = (XSLTProcess.Param) i.next(); + XSLTProcess.Param newParam = xsltTask.createParam(); + newParam.setProject(task.getProject()); + newParam.setName(param.getName()); + newParam.setExpression(param.getExpression()); + } + XSLTProcess.Param paramx = xsltTask.createParam(); + paramx.setProject(task.getProject()); + paramx.setName("output.dir"); + paramx.setExpression(toDir.getAbsolutePath()); final long t0 = System.currentTimeMillis(); - XalanExecutor executor = XalanExecutor.newInstance(this); try { - executor.execute(); + xsltTask.execute(); } catch (Exception e) { throw new BuildException("Errors while applying transformations: " - + e.getMessage(), e); + + e.getMessage(), e); } final long dt = System.currentTimeMillis() - t0; task.log("Transform time: " + dt + "ms"); + Delete delete = new Delete(); + delete.bindToOwner(task); + delete.setFile(dummyFile); + delete.execute(); + } + + /** + * access the stylesheet to be used as a resource. + * @return stylesheet as a resource + */ + protected Resource getStylesheet() { + String xslname = "junit-frames.xsl"; + if (NOFRAMES.equals(format)) { + xslname = "junit-noframes.xsl"; + } + if (styleDir == null) { + // If style dir is not specified we have to retrieve + // the stylesheet from the classloader + URLResource stylesheet = new URLResource(); + URL stylesheetURL = getClass().getClassLoader().getResource( + "org/apache/tools/ant/taskdefs/optional/junit/xsl/" + xslname); + stylesheet.setURL(stylesheetURL); + return stylesheet; + } + // If we are here, then the style dir is here and we + // should read the stylesheet from the filesystem + FileResource stylesheet = new FileResource(); + File stylesheetFile = new File(styleDir, xslname); + stylesheet.setFile(stylesheetFile); + return stylesheet; } - /** check for invalid options */ + + /** check for invalid options + * @throws BuildException if something goes wrong. + */ protected void checkOptions() throws BuildException { // set the destination directory relative from the project if needed. if (toDir == null) { @@ -167,6 +309,7 @@ * name and styledir. If no styledir is defined it will load * it as a java resource in the xsl child package, otherwise it * will get it from the given directory. + * @return system ID of the stylesheet. * @throws IOException thrown if the requested stylesheet does * not exist. */ Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java Fri Jun 30 16:42:17 2006 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2005 The Apache Software Foundation + * Copyright 2001-2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -158,7 +158,7 @@ * the <tt>todir</tt> and <tt>tofile</tt> attributes. * @return the destination file where should be written the result file. */ - protected File getDestinationFile() { + public File getDestinationFile() { if (toFile == null) { toFile = DEFAULT_FILENAME; } Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java Fri Jun 30 16:42:17 2006 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2002,2004 The Apache Software Foundation + * Copyright 2001-2002,2004,2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,8 +28,10 @@ import org.apache.tools.ant.BuildException; /** - * Xalan executor via JAXP. Nothing special must exists in the classpath - * besides of course, a parser, jaxp and xalan. + * This class is not used by the framework any more. + * We plan to remove it in Ant 1.8 + * @deprecated since Ant 1.7 + * * * @ant.task ignore="true" */ Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java Fri Jun 30 16:42:17 2006 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2005 The Apache Software Foundation + * Copyright 2001-2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,10 +27,10 @@ import org.apache.tools.ant.Project; /** - * Command class that encapsulate specific behavior for each - * Xalan version. The right executor will be instantiated at - * runtime via class lookup. For instance, it will check first - * for Xalan2/XSLTC, then for Xalan1. + * This class is not used by the framework any more. + * We plan to remove it in Ant 1.8 + * @deprecated since Ant 1.7 + * */ abstract class XalanExecutor { private static final String PACKAGE = Modified: ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java?rev=418420&r1=418419&r2=418420&view=diff ============================================================================== --- ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java (original) +++ ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java Fri Jun 30 16:42:17 2006 @@ -122,6 +122,7 @@ InputStream reportStream = reportUrl.openStream(); assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0); } + public void testSpecialSignsInHtmlPath() throws Exception { executeTarget("testSpecialSignsInHtmlPath"); File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html# $%\u00A7&-!report/index.html"); @@ -134,4 +135,44 @@ InputStream reportStream = reportUrl.openStream(); assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0); } -} \ No newline at end of file + + //Bugzilla Report 39708 + public void testWithStyleFromDir() throws Exception { + executeTarget("testWithStyleFromDir"); + File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html/index.html"); + // tests one the file object + assertTrue("No index.html present. Not generated?", reportFile.exists() ); + assertTrue("Cant read the report file.", reportFile.canRead() ); + assertTrue("File shouldnt be empty.", reportFile.length() > 0 ); + // conversion to URL via FileUtils like in XMLResultAggregator, not as suggested in the bug report + URL reportUrl = new URL( FileUtils.getFileUtils().toURI(reportFile.getAbsolutePath()) ); + InputStream reportStream = reportUrl.openStream(); + assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0); + } + + public void testWithStyleFromClasspath() throws Exception { + executeTarget("testWithStyleFromClasspath"); + File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html/index.html"); + // tests one the file object + assertTrue("No index.html present. Not generated?", reportFile.exists() ); + assertTrue("Cant read the report file.", reportFile.canRead() ); + assertTrue("File shouldnt be empty.", reportFile.length() > 0 ); + // conversion to URL via FileUtils like in XMLResultAggregator, not as suggested in the bug report + URL reportUrl = new URL( FileUtils.getFileUtils().toURI(reportFile.getAbsolutePath()) ); + InputStream reportStream = reportUrl.openStream(); + assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0); + } + + public void testWithParams() throws Exception { + expectLogContaining("testWithParams", "key1=value1,key2=value2"); + File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html/index.html"); + // tests one the file object + assertTrue("No index.html present. Not generated?", reportFile.exists() ); + assertTrue("Cant read the report file.", reportFile.canRead() ); + assertTrue("File shouldnt be empty.", reportFile.length() > 0 ); + // conversion to URL via FileUtils like in XMLResultAggregator, not as suggested in the bug report + URL reportUrl = new URL( FileUtils.getFileUtils().toURI(reportFile.getAbsolutePath()) ); + InputStream reportStream = reportUrl.openStream(); + assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]