001 <?xml version="1.0" encoding="ISO-8859-1"?>
002
003 <!--
004 - Copyright 2005-2006 Jens Voß.
005 -
006 - Licensed under the Apache License, Version 2.0 (the "License");
007 - you may not use this file except in compliance with the License.
008 - You may obtain a copy of the License at
009 -
010 - http://www.apache.org/licenses/LICENSE-2.0
011 -
012 - Unless required by applicable law or agreed to in writing, software
013 - distributed under the License is distributed on an "AS IS" BASIS,
014 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 - See the License for the specific language governing permissions and
016 - limitations under the License.
017 -
018 -->
019
020 <!---
021 - The <code>alsterTestRunner.xsl</code> stylesheet is the "engine" of the
022 - Alster XSLT unit testing framework.
023 -->
024 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
025 version="1.0"
026 xmlns:xalan="http://xml.apache.org/xalan"
027 xmlns:java="http://xml.apache.org/xalan/java"
028 xmlns:exsl="http://exslt.org/common"
029 xmlns:alster="http://alster.sourceforge.net"
030 xmlns:reflect="http://nalax.sourceforge.net/reflect"
031 xmlns:io="http://nalax.sourceforge.net/io"
032 xmlns:log="http://nalax.sourceforge.net/log"
033 exclude-result-prefixes="alster"
034 extension-element-prefixes="java exsl reflect io log">
035
036 <!---
037 - The <code>testDir</code> stylesheet parameter specifies the path of the
038 - Alster test stylesheet directory. It is passed to this stylesheet by the
039 - <code>AlsterTestRunner</code> class.
040 -->
041 <xsl:param name="testDir"/>
042 <!---
043 - The <code>recurseTests</code> stylesheet parameter specifies whether of
044 - not subdirectories of the directory specified by the <code>testDir</code>
045 - parameter are to be included in the search for Alster test stylesheets.
046 -->
047 <xsl:param name="recurseTests"/>
048
049 <xsl:include href="classpath:/net/sf/nalax/xsl/nalax.xsl"/>
050
051
052 <!---
053 - This template hooks into the root template of the test case
054 - template. It either calls the
055 - {@link #xsl:template~name~alster:runTestSuites template with
056 - name="alster:runTestSuites"} (if and only if the <code>testDir</code>
057 - parameter is set), or it runs the test cases contained in the
058 - current enclosing stylesheet (if the XML file transformed is the
059 - <code>alster.xml</code> file). In all other cases, the template
060 - delegates to the imported root template.
061 -->
062 <xsl:template match="/">
063 <xsl:variable name="alster:runTests">
064 <xsl:call-template name="alster:checkAlster"/>
065 </xsl:variable>
066 <xsl:choose>
067 <xsl:when test="string-length($testDir)">
068 <xsl:call-template name="alster:runTestSuites">
069 <xsl:with-param name="dir" select="$testDir"/>
070 <xsl:with-param name="recurse" select="$recurseTests"/>
071 </xsl:call-template>
072 </xsl:when>
073 <xsl:when test="$alster:runTests = 1">
074 <xsl:call-template name="alster:runTestCases"/>
075 </xsl:when>
076 <xsl:otherwise>
077 <xsl:apply-imports/>
078 </xsl:otherwise>
079 </xsl:choose>
080 </xsl:template>
081
082 <!---
083 - This template ensures tests whether the XML file the enclosing
084 - stylesheet is applied to is identical to the file 'alster.xml'
085 - (which merely consists of one zero-attribute top-level element
086 - named "alster" without any descendants).<br/>
087 - If this is the case, the template produces the string "1"; otherwise,
088 - it generates an error message.
089 -->
090 <xsl:template name="alster:checkAlster">
091 <xsl:choose>
092 <xsl:when test="not (name(/*) = 'alster')">
093 <xsl:text>name=</xsl:text>
094 <xsl:value-of select="name(/*)"/>
095 </xsl:when>
096 <xsl:when test="count(/*/*) > 0">
097 <xsl:text>count=</xsl:text>
098 <xsl:value-of select="count(/*/*)"/>
099 </xsl:when>
100 <xsl:otherwise>1</xsl:otherwise>
101 </xsl:choose>
102 </xsl:template>
103
104
105 <!---
106 - This template executes all test stylesheets in a given directory. It
107 - iterates over the directory's files (and recurses into subdirectories
108 - if so specified) and applies all stylesheets whose name ends with
109 - "Test.xsl" to the XML root element.
110 -
111 - @param dir The path of the directory in which to execute the test
112 - stylesheets
113 - @param recurse Specifies whether the execution should be performed
114 - recursively in all subdirectories of the specified directory
115 - (it does so if the parameter has value "1" and fails to do so
116 - otherwise)
117 - @param package The name of the current package (ensures that the
118 - results can be identified with the correct source stylesheets)
119 -->
120 <xsl:template name="alster:runTestSuites">
121 <xsl:param name="dir"/>
122 <xsl:param name="recurse"/>
123 <xsl:param name="package"/>
124 <log:debug>
125 <xsl:value-of select="$package"/>
126 </log:debug>
127 <testSuites>
128 <xsl:if test="string-length($package)">
129 <xsl:attribute name="package">
130 <xsl:value-of select="$package"/>
131 </xsl:attribute>
132 </xsl:if>
133 <io:files dir="$dir">
134 <xsl:variable name="name" select="io:name()"/>
135 <xsl:choose>
136 <xsl:when test="io:isDirectory() and ($recurse = 1)">
137 <xsl:call-template name="alster:runTestSuites">
138 <xsl:with-param name="dir" select="io:path()"/>
139 <xsl:with-param name="recurse" select="$recurse"/>
140 <xsl:with-param name="package" select="concat($package, '/', $name)"/>
141 </xsl:call-template>
142 </xsl:when>
143 <xsl:when test="not (io:isDirectory())
144 and (string-length($name) > 7)
145 and ($name = concat(substring($name, 1, string-length($name) - 8), 'Test.xsl'))">
146 <log:printOut>
147 <xsl:text>Running </xsl:text>
148 <xsl:value-of select="$name"/>
149 </log:printOut>
150 <!--<log:printOut>-->
151 <!--<xsl:value-of select="name(/*)"/>-->
152 <!--</log:printOut>-->
153 <xsl:variable name="result">
154 <reflect:transform select="." stylesheet="io:path()"/>
155 </xsl:variable>
156 <log:printOut>
157 <xsl:text>Tests run: </xsl:text>
158 <xsl:value-of select="count(exsl:node-set($result)//testCase)"/>
159 <xsl:text>, Failures: </xsl:text>
160 <xsl:value-of select="count(exsl:node-set($result)//testCase[string-length(.) > 0])"/>
161 </log:printOut>
162 <testSuite>
163 <xsl:attribute name="name">
164 <xsl:value-of select="$name"/>
165 </xsl:attribute>
166 <xsl:copy-of select="exsl:node-set($result)//testCase"/>
167 </testSuite>
168 </xsl:when>
169 </xsl:choose>
170 </io:files>
171 </testSuites>
172 </xsl:template>
173
174
175 <!---
176 - This template iterates over all named templates within the enclosing
177 - Alster test stylesheet. If the name of one of these templates has
178 - namespace "alster" and begins with "test", it is considered an Alster
179 - test template and is then reflectively (via the Nalax-Reflection
180 - extension) called. The output of the thus called templates is collected
181 - into <code><testCase></code> subelements of one XML element named
182 - "<code>testCases</code>".
183 -->
184 <xsl:template name="alster:runTestCases">
185 <testCases>
186 <reflect:namedTemplates>
187 <xsl:variable name="tName">
188 <reflect:templateName/>
189 </xsl:variable>
190 <xsl:if test="starts-with($tName, 'alster:test')">
191 <testCase>
192 <xsl:attribute name="name">
193 <xsl:value-of select="$tName"/>
194 </xsl:attribute>
195 <xsl:variable name="startTime">
196 <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
197 </xsl:variable>
198 <xsl:variable name="message">
199 <reflect:callTemplate name="$tName"/>
200 </xsl:variable>
201 <xsl:attribute name="millis">
202 <xsl:value-of select="java:java.lang.System.currentTimeMillis() - $startTime"/>
203 </xsl:attribute>
204 <xsl:if test="string-length(normalize-space($message))">
205 <xsl:value-of select="$message"/>
206 </xsl:if>
207 </testCase>
208 </xsl:if>
209 </reflect:namedTemplates>
210 </testCases>
211 </xsl:template>
212
213 </xsl:stylesheet>