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>alsterTestCase.xsl</code> stylesheet provides standard
022 - unit testing functionality. Many of its templates implement functionality
023 - similar to the
024 - <a href="http://junit.sourceforge.net/javadoc/junit/framework/Assert.html">Assert</a>
025 - class of the JUnit unit testing framework for Java (in versions < 4.0).
026 -->
027 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
028 version="1.0"
029 xmlns:alster="http://alster.sourceforge.net"
030 xmlns:exsl="http://exslt.org/common"
031 extension-element-prefixes="exsl">
032
033
034 <!---
035 - Fails a test with the given message.
036 -
037 - @param message The message to be produced.
038 -->
039 <xsl:template name="alster:fail">
040 <xsl:param name="message"/>
041 <xsl:text>Test failed. </xsl:text>
042 <xsl:value-of select="$message"/>
043 </xsl:template>
044
045
046 <!---
047 - Asserts that two Strings are equal.
048 -
049 - @param expected The expected result of the test
050 - @param actual The actual result of the test
051 - @param tolerateWhitespace If this is "1", then differences in whitespace
052 - are ignored in the comparison
053 - @param message An (optional) message to be used in case of test failure
054 -->
055 <xsl:template name="alster:assertEqualsAsString">
056 <xsl:param name="expected"/>
057 <xsl:param name="actual"/>
058 <xsl:param name="tolerateWhitespace">0</xsl:param>
059 <xsl:param name="message"/>
060 <xsl:choose>
061 <xsl:when test="string($expected) = string($actual)"/>
062 <xsl:when test="not ($tolerateWhitespace = 0) and (normalize-space(string($expected)) = normalize-space(string($actual)))"/>
063 <xsl:otherwise>
064 <xsl:value-of select="$message"/>
065 <xsl:text>Expected value: </xsl:text>
066 <xsl:value-of select="$expected"/>
067 <xsl:text>; actual value: </xsl:text>
068 <xsl:value-of select="$actual"/>
069 <xsl:text>
</xsl:text>
070 </xsl:otherwise>
071 </xsl:choose>
072 </xsl:template>
073
074
075 <!---
076 - Asserts that two Strings are not equal.
077 -
078 - @param expected The expected result of the test
079 - @param actual The actual result of the test
080 - @param message An (optional) message to be used in case of test failure
081 -->
082 <xsl:template name="alster:assertNotEqualsAsString">
083 <xsl:param name="expected"/>
084 <xsl:param name="actual"/>
085 <xsl:param name="message"/>
086 <xsl:if test="string($expected) = string($actual)">
087 <xsl:value-of select="$message"/>
088 <xsl:text> Expected (and actual) value: </xsl:text>
089 <xsl:value-of select="$expected"/>
090 <xsl:text>
</xsl:text>
091 </xsl:if>
092 </xsl:template>
093
094
095 <!---
096 - Asserts that a String is not null.
097 -
098 - @param actual The actual value to be tested
099 - @param message An (optional) message to be used in case of test failure
100 -->
101 <xsl:template name="alster:assertNotNull">
102 <xsl:param name="actual"/>
103 <xsl:param name="message"/>
104 <xsl:call-template name="alster:assertNotEqualsAsString">
105 <xsl:with-param name="actual" select="$actual"/>
106 <xsl:with-param name="message" select="$message"/>
107 </xsl:call-template>
108 </xsl:template>
109
110
111 <!---
112 - Asserts that a String is null.
113 -
114 - @param actual The actual value to be tested
115 - @param message An (optional) message to be used in case of test failure
116 -->
117 <xsl:template name="alster:assertNull">
118 <xsl:param name="actual"/>
119 <xsl:param name="message"/>
120 <xsl:call-template name="alster:assertEqualsAsString">
121 <xsl:with-param name="actual" select="$actual"/>
122 <xsl:with-param name="message" select="$message"/>
123 </xsl:call-template>
124 </xsl:template>
125
126
127 <!---
128 - Asserts that two numbers are equal.
129 -
130 - @param expected The expected result of the test
131 - @param actual The actual result of the test
132 - @param message An (optional) message to be used in case of test failure
133 -->
134 <xsl:template name="alster:assertEqualsAsNumber">
135 <xsl:param name="actual"/>
136 <xsl:param name="expected"/>
137 <xsl:param name="message"/>
138 <xsl:if test="not (number($expected) = number($actual))">
139 <xsl:value-of select="$message"/>
140 <xsl:text> Expected value: </xsl:text>
141 <xsl:value-of select="$expected"/>
142 <xsl:text>; actual value: </xsl:text>
143 <xsl:value-of select="$actual"/>
144 <xsl:text>
</xsl:text>
145 </xsl:if>
146 </xsl:template>
147
148
149 <!---
150 - Asserts that two numbers are not equal.
151 -
152 - @param expected The expected result of the test
153 - @param actual The actual result of the test
154 - @param message An (optional) message to be used in case of test failure
155 -->
156 <xsl:template name="alster:assertNotEqualsAsNumber">
157 <xsl:param name="actual"/>
158 <xsl:param name="expected"/>
159 <xsl:param name="message"/>
160 <xsl:if test="number($expected) = number($actual)">
161 <xsl:value-of select="$message"/>
162 <xsl:text> Expected (and actual) value: </xsl:text>
163 <xsl:value-of select="$expected"/>
164 <xsl:text>
</xsl:text>
165 </xsl:if>
166 </xsl:template>
167
168
169 <!---
170 - Asserts that two DOM node objects (or result tree fragments) are equal.
171 - Node equality is tested via the template with
172 - {@link #xsl:template~name~alster:assertNodeEquality name="alster:assertNodeEquality"}.
173 -
174 - @param expected The expected result of the test
175 - @param actual The actual result of the test
176 - @param message An (optional) message to be used in case of test failure
177 -->
178 <xsl:template name="alster:assertEqualsAsNode">
179 <xsl:param name="actual"/>
180 <xsl:param name="expected"/>
181 <xsl:param name="message"/>
182
183 <xsl:variable name="result">
184 <xsl:call-template name="alster:assertNodeEquality">
185 <xsl:with-param name="actual" select="exsl:node-set($actual)/*"/>
186 <xsl:with-param name="expected" select="exsl:node-set($expected)/*"/>
187 </xsl:call-template>
188 </xsl:variable>
189 <xsl:if test="string-length($result)">
190 <xsl:value-of select="$message"/>
191 <xsl:value-of select="$result"/>
192 </xsl:if>
193
194 </xsl:template>
195
196
197 <!---
198 - Asserts that two DOM node objects (or result tree fragments) are unequal.
199 - Node equality is tested via the template with
200 - {@link #xsl:template~name~alster:assertNodeEquality name="alster:assertNodeEquality"}.
201 -
202 - @param expected The expected result of the test
203 - @param actual The actual result of the test
204 - @param message An (optional) message to be used in case of test failure
205 -->
206 <xsl:template name="alster:assertNotEqualsAsNode">
207 <xsl:param name="actual"/>
208 <xsl:param name="expected"/>
209 <xsl:param name="message"/>
210
211 <xsl:variable name="result">
212 <xsl:call-template name="alster:assertNodeEquality">
213 <xsl:with-param name="actual" select="exsl:node-set($actual)/*"/>
214 <xsl:with-param name="expected" select="exsl:node-set($expected)/*"/>
215 </xsl:call-template>
216 </xsl:variable>
217 <xsl:choose>
218 <xsl:when test="string-length($result)"/>
219 <xsl:when test="string-length($message)">
220 <xsl:value-of select="$message"/>
221 </xsl:when>
222 <xsl:otherwise>Identical nodes were expected to be different.</xsl:otherwise>
223 </xsl:choose>
224
225 </xsl:template>
226
227 <xsl:variable name="LEVEL_NODE_NAME">1</xsl:variable>
228 <xsl:variable name="LEVEL_ATTRIBUTE_COUNT">2</xsl:variable>
229 <xsl:variable name="LEVEL_ATTRIBUTES">3</xsl:variable>
230 <xsl:variable name="LEVEL_ELEMENT_COUNT">4</xsl:variable>
231 <xsl:variable name="LEVEL_ELEMENTS">5</xsl:variable>
232 <xsl:variable name="LEVEL_TEXTNODE_COUNT">6</xsl:variable>
233 <xsl:variable name="LEVEL_TEXTNODES">7</xsl:variable>
234
235
236 <!---
237 - This "private" template asserts that two DOM node objects (or result
238 - tree fragments) are equal. In case of inequality, a message describing
239 - the type of inequality is generated.<br/>
240 - The template is called recursively, testing different levels of
241 - node comparison in each step. If no iteration detects a difference,
242 - then the nodes are considered equal.<br/>
243 - In detail, the nodes are equal if and only if the following hold:
244 - <ul>
245 - <li>The nodes have equal names,</li>
246 - <li>the nodes have the same number of attributes,</li>
247 - <li>the nodes have the same attributes (i.e. the same set of key/value pairs),</li>
248 - <li>the nodes have the same number of subelements,</li>
249 - <li>the nodes have the same subelements,</li>
250 - <li>the nodes have the same number of text nodes,</li>
251 - <li>the nodes have the same text node values.</li>
252 - </ul>
253 -
254 - @param expected The expected result of the test
255 - @param actual The actual result of the test
256 - @param level The current node comparison level
257 -->
258 <xsl:template name="alster:assertNodeEquality">
259 <xsl:param name="actual"/>
260 <xsl:param name="expected"/>
261 <xsl:param name="level" select="$LEVEL_NODE_NAME"/>
262
263 <xsl:variable name="result">
264 <xsl:choose>
265 <xsl:when test="$level = $LEVEL_NODE_NAME">
266 <xsl:call-template name="alster:assertEqualsAsString">
267 <xsl:with-param name="actual" select="name($actual)"/>
268 <xsl:with-param name="expected" select="name($expected)"/>
269 </xsl:call-template>
270 </xsl:when>
271 <xsl:when test="$level = $LEVEL_ATTRIBUTE_COUNT">
272 <xsl:call-template name="alster:assertEqualsAsNumber">
273 <xsl:with-param name="actual" select="count($actual/@*)"/>
274 <xsl:with-param name="expected" select="count($expected/@*)"/>
275 </xsl:call-template>
276 </xsl:when>
277 <xsl:when test="$level = $LEVEL_ATTRIBUTES">
278 <xsl:for-each select="$actual/@*">
279 <xsl:variable name="attrName" select="name()"/>
280 <xsl:variable name="subresult">
281 <xsl:call-template name="alster:assertEqualsAsString">
282 <xsl:with-param name="actual" select="."/>
283 <xsl:with-param name="expected" select="$expected/@*[name() = $attrName]"/>
284 </xsl:call-template>
285 </xsl:variable>
286 <xsl:if test="string-length($subresult)">
287 <xsl:text>Different values for attribute '</xsl:text>
288 <xsl:value-of select="$attrName"/>
289 <xsl:text>'. </xsl:text>
290 <xsl:value-of select="$subresult"/>
291 </xsl:if>
292 </xsl:for-each>
293 </xsl:when>
294 <xsl:when test="$level = $LEVEL_ELEMENT_COUNT">
295 <xsl:call-template name="alster:assertEqualsAsNumber">
296 <xsl:with-param name="actual" select="count($actual/*)"/>
297 <xsl:with-param name="expected" select="count($expected/*)"/>
298 </xsl:call-template>
299 </xsl:when>
300 <xsl:when test="$level = $LEVEL_ELEMENTS">
301 <xsl:for-each select="$actual/*">
302 <xsl:variable name="idx" select="position()"/>
303 <xsl:variable name="subresult">
304 <xsl:call-template name="alster:assertNodeEquality">
305 <xsl:with-param name="actual" select="."/>
306 <xsl:with-param name="expected" select="$expected/*[$idx]"/>
307 </xsl:call-template>
308 </xsl:variable>
309 <xsl:if test="string-length($subresult)">
310 <xsl:text>Different values for subelement #</xsl:text>
311 <xsl:value-of select="$idx"/>
312 <xsl:text>. </xsl:text>
313 <xsl:value-of select="$subresult"/>
314 </xsl:if>
315 </xsl:for-each>
316 </xsl:when>
317 <xsl:when test="$level = $LEVEL_TEXTNODE_COUNT">
318 <xsl:call-template name="alster:assertEqualsAsNumber">
319 <xsl:with-param name="actual" select="count($actual/text())"/>
320 <xsl:with-param name="expected" select="count($expected/text())"/>
321 </xsl:call-template>
322 </xsl:when>
323 <xsl:when test="$level = $LEVEL_TEXTNODES">
324 <xsl:for-each select="$actual/text()">
325 <xsl:variable name="idx" select="position()"/>
326 <xsl:variable name="subresult">
327 <xsl:call-template
328 name="alster:assertEqualsAsString">
329 <xsl:with-param name="actual" select="."/>
330 <xsl:with-param name="expected"
331 select="$expected/text()[$idx]"/>
332 </xsl:call-template>
333 </xsl:variable>
334 <xsl:if test="string-length($subresult)">
335 <xsl:text>Different values for subelement #</xsl:text>
336 <xsl:value-of select="$idx"/>
337 <xsl:text>. </xsl:text>
338 <xsl:value-of select="$subresult"/>
339 </xsl:if>
340 </xsl:for-each>
341 </xsl:when>
342 </xsl:choose>
343 </xsl:variable>
344
345 <xsl:choose>
346 <xsl:when test="string-length($result)">
347 <xsl:choose>
348 <xsl:when test="$level = $LEVEL_NODE_NAME">Different node names.</xsl:when>
349 <xsl:when test="$level = $LEVEL_ATTRIBUTE_COUNT">Different number of attributes.</xsl:when>
350 <xsl:when test="$level = $LEVEL_ATTRIBUTES">Different attribute values.</xsl:when>
351 <xsl:when test="$level = $LEVEL_ELEMENT_COUNT">Different number of subelements.</xsl:when>
352 <xsl:when test="$level = $LEVEL_ELEMENTS">Different subelement values.</xsl:when>
353 <xsl:when test="$level = $LEVEL_TEXTNODE_COUNT">Different number of text subnodes.</xsl:when>
354 <xsl:when test="$level = $LEVEL_TEXTNODES">Different text subnode values.</xsl:when>
355 </xsl:choose>
356 <xsl:text> </xsl:text>
357 <xsl:value-of select="$result"/>
358 </xsl:when>
359 <xsl:when test="$level < $LEVEL_TEXTNODES">
360 <xsl:call-template name="alster:assertNodeEquality">
361 <xsl:with-param name="actual" select="$actual"/>
362 <xsl:with-param name="expected" select="$expected"/>
363 <xsl:with-param name="level" select="$level + 1"/>
364 </xsl:call-template>
365 </xsl:when>
366 </xsl:choose>
367
368 </xsl:template>
369
370 </xsl:stylesheet>