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 &lt; 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>&#xa;</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>&#xa;</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>&#xa;</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>&#xa;</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>&#xa0;</xsl:text>
 357              <xsl:value-of select="$result"/>
 358            </xsl:when>
 359            <xsl:when test="$level &lt; $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>