Mike Gerwitz

Activist for User Freedom

aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'test/preproc')
-rw-r--r--test/preproc/expand/expand-sequence-test.xsl98
-rw-r--r--test/preproc/expand/expand-sequence.xspec133
2 files changed, 231 insertions, 0 deletions
diff --git a/test/preproc/expand/expand-sequence-test.xsl b/test/preproc/expand/expand-sequence-test.xsl
new file mode 100644
index 0000000..e8315e6
--- /dev/null
+++ b/test/preproc/expand/expand-sequence-test.xsl
@@ -0,0 +1,98 @@
+<?xml version="1.0"?>
+<!--
+ Tests dynamic function reference
+
+ Copyright (C) 2015 LoVullo Associates, Inc.
+
+ This file is part of TAME.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<stylesheet version="2.0"
+ xmlns="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:eseq="http://www.lovullo.com/tame/preproc/expand/eseq"
+ xmlns:foo="http://www.lovullo.com/_junk">
+
+
+ <import href="../../../src/preproc/expand/expand-sequence.xsl" />
+
+
+ <variable name="foo:empty-eseq" as="element( foo:empty )">
+ <foo:empty />
+ </variable>
+
+ <variable name="foo:a" as="element( foo:seq )">
+ <foo:seq foo="bar">
+ <foo:node head="true">
+ <foo:head />
+ </foo:node>
+ <foo:node tail="true" />
+ </foo:seq>
+ </variable>
+
+
+ <variable name="foo:expanded" as="element( foo:seq )">
+ <foo:seq foo="baz">
+ <sequence select="eseq:expand-node( $foo:a/foo:node[1] ),
+ eseq:expand-node( $foo:a/foo:node[2] )" />
+ </foo:seq>
+ </variable>
+
+ <!-- used to assert indirectly that our own @code{is-expanded}
+ predicate is being used -->
+ <variable name="foo:unexpandable" as="element( foo:seq )">
+ <foo:seq>
+ <foo:node no-expand="true" />
+ </foo:seq>
+ </variable>
+
+
+ <function name="eseq:is-expandable" as="xs:boolean"
+ override="yes">
+ <param name="node" as="node()" />
+
+ <sequence select="$node instance of element()
+ and not( $node/@foo:expanded )" />
+ </function>
+
+
+ <function name="eseq:expand-node" as="node()*"
+ override="yes">
+ <param name="node" as="node()" />
+
+ <choose>
+ <when test="$node/@no-expand">
+ <sequence select="$node" />
+ </when>
+
+ <otherwise>
+ <apply-templates mode="foo:expand-node"
+ select="$node" />
+ </otherwise>
+ </choose>
+ </function>
+
+
+ <template mode="foo:expand-node"
+ match="element()">
+ <copy>
+ <attribute name="foo:expanded"
+ select="'true'" />
+
+ <sequence select="@*|node()" />
+ </copy>
+ </template>
+</stylesheet>
diff --git a/test/preproc/expand/expand-sequence.xspec b/test/preproc/expand/expand-sequence.xspec
new file mode 100644
index 0000000..eb780ab
--- /dev/null
+++ b/test/preproc/expand/expand-sequence.xspec
@@ -0,0 +1,133 @@
+<?xml version="1.0"?>
+<!--
+ Tests expansion sequence
+
+ Copyright (C) 2015 LoVullo Associates, Inc.
+
+ This file is part of TAME.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see
+ <http://www.gnu.org/licenses/>.
+-->
+
+<description xmlns="http://www.jenitennison.com/xslt/xspec"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:x="http://www.jenitennison.com/xslt/xspec"
+ xmlns:eseq="http://www.lovullo.com/tame/preproc/expand/eseq"
+ xmlns:foo="http://www.lovullo.com/_junk"
+ stylesheet="expand-sequence-test.xsl">
+
+
+ <scenario label="Pass on an expansion sequence">
+ <scenario label="with an empty sequence">
+ <call function="eseq:expand-step">
+ <param name="eseq"
+ select="$foo:empty-eseq" />
+ </call>
+
+ <expect label="eliminates the sequence and yields nothing"
+ select="()" />
+ </scenario>
+
+
+ <scenario label="with no sequence">
+ <call function="eseq:expand-step">
+ <param name="eseq"
+ select="()" />
+ </call>
+
+ <expect label="retains an empty result"
+ select="()" />
+ </scenario>
+
+
+ <scenario label="with an expansion element">
+ <call function="eseq:expand-step">
+ <param name="eseq"
+ select="$foo:a" />
+ </call>
+
+ <expect label="produces expansion sequence node"
+ test="$x:result instance of element( foo:seq )" />
+
+ <expect label="retains expansion sequence node attributes"
+ test="$x:result/@foo = $foo:a/@foo" />
+
+ <expect label="allows the head to expand"
+ test="$x:result/*[1]/@head = 'true'
+ and $x:result/*[1]/@foo:expanded" />
+ </scenario>
+
+
+ <scenario label="with an expanded node">
+ <!-- notice the additional expand-step calls -->
+ <call function="eseq:expand-step">
+ <param name="eseq"
+ select="eseq:expand-step(
+ eseq:expand-step( $foo:a ) )" />
+ </call>
+
+ <expect label="hoists expanded element out of sequence"
+ test="$x:result[1] instance of element( foo:node )
+ and $x:result[1]/@head = 'true'
+ and $x:result[1]/foo:head" />
+
+ <expect label="maintains remaining sequence"
+ test="$x:result[2] instance of element( foo:seq )
+ and $x:result[2]/foo:node" />
+ </scenario>
+
+
+ <scenario label="with nodes still pending expansion">
+ <!-- notice the additional expand-step calls -->
+ <call function="eseq:expand-step">
+ <param name="eseq"
+ select="eseq:expand-step(
+ eseq:expand-step( $foo:unexpandable ) )" />
+ </call>
+
+ <!-- if this fails, then our is-expanded predicate is not being
+ used -->
+ <expect label="retains unexpanded head instead of hoisting"
+ test="$x:result/foo:node/@no-expand = 'true'" />
+ </scenario>
+ </scenario>
+
+
+ <scenario label="Pass on expansion sequence with hoisted node">
+ <variable name="foo:hoisted"
+ select="eseq:expand-step( $foo:expanded )" />
+
+ <call function="eseq:expand-step">
+ <param name="eseq"
+ select="$foo:hoisted" />
+ </call>
+
+ <expect label="maintains previously hoisted nodes"
+ test="$x:result[1] instance of element( foo:node )
+ and $x:result[1]/@head = 'true'" />
+
+ <expect label="will hoist next node below previously hoisted
+ node"
+ test="$x:result[2] instance of element( foo:node )
+ and $x:result[2]/@tail = 'true'" />
+
+ <expect label="maintains empty expansion sequence"
+ test="$x:result[3] instance of element( foo:seq )
+ and not( $x:result[3]/node() )" />
+
+ <expect label="final pass eliminates empty expansion sequence"
+ test="not( eseq:expand-step( $x:result )/foo:seq )" />
+ </scenario>
+</description>