annotate markup/tests/template.py @ 104:e9259920db05

Added `py:with` directive based on Jonas' patch in #17.
author cmlenz
date Thu, 27 Jul 2006 09:22:17 +0000
parents 242610137d1f
children df44110ca91d
rev   line source
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
2 #
66
822089ae65ce Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents: 65
diff changeset
3 # Copyright (C) 2006 Edgewall Software
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
4 # All rights reserved.
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
5 #
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
66
822089ae65ce Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents: 65
diff changeset
8 # are also available at http://markup.edgewall.org/wiki/License.
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
9 #
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
66
822089ae65ce Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents: 65
diff changeset
12 # history and logs, available at http://markup.edgewall.org/log/.
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
13
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
14 import doctest
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
15 import unittest
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
16 import sys
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
17
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
18 from markup.core import Markup, Stream
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
19 from markup.template import BadDirectiveError, Context, Template, \
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
20 TemplateSyntaxError
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
21
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
22
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
23 class AttrsDirectiveTestCase(unittest.TestCase):
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
24 """Tests for the `py:attrs` template directive."""
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
25
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
26 def test_combined_with_loop(self):
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
27 """
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
28 Verify that the directive has access to the loop variables.
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
29 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
30 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
31 <elem py:for="item in items" py:attrs="item"/>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
32 </doc>""")
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
33 items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}]
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
34 self.assertEqual("""<doc>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
35 <elem id="1" class="foo"/><elem id="2" class="bar"/>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
36 </doc>""", str(tmpl.generate(Context(items=items))))
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
37
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
38 def test_update_existing_attr(self):
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
39 """
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
40 Verify that an attribute value that evaluates to `None` removes an
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
41 existing attribute of that name.
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
42 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
43 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
44 <elem class="foo" py:attrs="{'class': 'bar'}"/>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
45 </doc>""")
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
46 self.assertEqual("""<doc>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
47 <elem class="bar"/>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
48 </doc>""", str(tmpl.generate()))
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
49
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
50 def test_remove_existing_attr(self):
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
51 """
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
52 Verify that an attribute value that evaluates to `None` removes an
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
53 existing attribute of that name.
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
54 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
55 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
56 <elem class="foo" py:attrs="{'class': None}"/>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
57 </doc>""")
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
58 self.assertEqual("""<doc>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
59 <elem/>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
60 </doc>""", str(tmpl.generate()))
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
61
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
62
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
63 class ChooseDirectiveTestCase(unittest.TestCase):
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
64 """Tests for the `py:choose` template directive and the complementary
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
65 directives `py:when` and `py:otherwise`."""
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
66
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
67 def test_multiple_true_whens(self):
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
68 """
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
69 Verify that, if multiple `py:when` bodies match, only the first is
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
70 output.
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
71 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
72 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose="">
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
73 <span py:when="1 == 1">1</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
74 <span py:when="2 == 2">2</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
75 <span py:when="3 == 3">3</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
76 </div>""")
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
77 self.assertEqual("""<div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
78 <span>1</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
79 </div>""", str(tmpl.generate()))
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
80
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
81 def test_otherwise(self):
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
82 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose="">
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
83 <span py:when="False">hidden</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
84 <span py:otherwise="">hello</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
85 </div>""")
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
86 self.assertEqual("""<div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
87 <span>hello</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
88 </div>""", str(tmpl.generate()))
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
89
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
90 def test_nesting(self):
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
91 """
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
92 Verify that `py:choose` blocks can be nested:
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
93 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
94 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
95 <div py:choose="1">
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
96 <div py:when="1" py:choose="3">
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
97 <span py:when="2">2</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
98 <span py:when="3">3</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
99 </div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
100 </div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
101 </doc>""")
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
102 self.assertEqual("""<doc>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
103 <div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
104 <div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
105 <span>3</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
106 </div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
107 </div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
108 </doc>""", str(tmpl.generate()))
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
109
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
110 def test_when_with_strip(self):
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
111 """
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
112 Verify that a when directive with a strip directive actually strips of
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
113 the outer element.
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
114 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
115 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
116 <div py:choose="" py:strip="">
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
117 <span py:otherwise="">foo</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
118 </div>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
119 </doc>""")
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
120 self.assertEqual("""<doc>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
121 <span>foo</span>
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
122 </doc>""", str(tmpl.generate()))
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
123
65
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
124 def test_as_element(self):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
125 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
126 Verify that the directive can also be used as an element.
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
127 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
128 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
129 <py:choose>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
130 <py:when test="1 == 1">1</py:when>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
131 <py:when test="2 == 2">2</py:when>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
132 <py:when test="3 == 3">3</py:when>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
133 </py:choose>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
134 </doc>""")
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
135 self.assertEqual("""<doc>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
136 1
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
137 </doc>""", str(tmpl.generate()))
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
138
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
139
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
140 class DefDirectiveTestCase(unittest.TestCase):
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
141 """Tests for the `py:def` template directive."""
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
142
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
143 def test_function_with_strip(self):
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
144 """
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
145 Verify that a named template function with a strip directive actually
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
146 strips of the outer element.
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
147 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
148 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
149 <div py:def="echo(what)" py:strip="">
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
150 <b>${what}</b>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
151 </div>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
152 ${echo('foo')}
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
153 </doc>""")
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
154 self.assertEqual("""<doc>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
155 <b>foo</b>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
156 </doc>""", str(tmpl.generate()))
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
157
90
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
158 def test_exec_in_replace(self):
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
159 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
160 <p py:def="echo(greeting, name='world')" class="message">
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
161 ${greeting}, ${name}!
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
162 </p>
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
163 <div py:replace="echo('hello')"></div>
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
164 </div>""")
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
165 self.assertEqual("""<div>
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
166 <p class="message">
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
167 hello, world!
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
168 </p>
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
169 </div>""", str(tmpl.generate()))
242610137d1f When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents: 89
diff changeset
170
65
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
171 def test_as_element(self):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
172 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
173 Verify that the directive can also be used as an element.
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
174 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
175 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
176 <py:def function="echo(what)">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
177 <b>${what}</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
178 </py:def>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
179 ${echo('foo')}
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
180 </doc>""")
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
181 self.assertEqual("""<doc>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
182 <b>foo</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
183 </doc>""", str(tmpl.generate()))
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
184
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
185
51
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
186 class ForDirectiveTestCase(unittest.TestCase):
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
187 """Tests for the `py:for` template directive."""
51
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
188
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
189 def test_loop_with_strip(self):
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
190 """
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
191 Verify that the combining the `py:for` directive with `py:strip` works
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
192 correctly.
51
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
193 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
194 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
51
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
195 <div py:for="item in items" py:strip="">
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
196 <b>${item}</b>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
197 </div>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
198 </doc>""")
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
199 self.assertEqual("""<doc>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
200 <b>1</b>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
201 <b>2</b>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
202 <b>3</b>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
203 <b>4</b>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
204 <b>5</b>
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
205 </doc>""", str(tmpl.generate(Context(items=range(1, 6)))))
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
206
65
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
207 def test_as_element(self):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
208 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
209 Verify that the directive can also be used as an element.
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
210 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
211 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
212 <py:for each="item in items">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
213 <b>${item}</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
214 </py:for>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
215 </doc>""")
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
216 self.assertEqual("""<doc>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
217 <b>1</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
218 <b>2</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
219 <b>3</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
220 <b>4</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
221 <b>5</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
222 </doc>""", str(tmpl.generate(Context(items=range(1, 6)))))
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
223
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
224
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
225 class IfDirectiveTestCase(unittest.TestCase):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
226 """Tests for the `py:if` template directive."""
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
227
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
228 def test_loop_with_strip(self):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
229 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
230 Verify that the combining the `py:if` directive with `py:strip` works
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
231 correctly.
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
232 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
233 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
234 <b py:if="foo" py:strip="">${bar}</b>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
235 </doc>""")
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
236 self.assertEqual("""<doc>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
237 Hello
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
238 </doc>""", str(tmpl.generate(Context(foo=True, bar='Hello'))))
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
239
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
240 def test_as_element(self):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
241 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
242 Verify that the directive can also be used as an element.
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
243 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
244 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
245 <py:if test="foo">${bar}</py:if>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
246 </doc>""")
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
247 self.assertEqual("""<doc>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
248 Hello
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
249 </doc>""", str(tmpl.generate(Context(foo=True, bar='Hello'))))
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
250
51
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
251
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
252 class MatchDirectiveTestCase(unittest.TestCase):
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
253 """Tests for the `py:match` template directive."""
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
254
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
255 def test_with_strip(self):
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
256 """
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
257 Verify that a match template can produce the same kind of element that
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
258 it matched without entering an infinite recursion.
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
259 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
260 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
261 <elem py:match="elem" py:strip="">
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
262 <div class="elem">${select('*/text()')}</div>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
263 </elem>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
264 <elem>Hey Joe</elem>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
265 </doc>""")
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
266 self.assertEqual("""<doc>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
267 <div class="elem">Hey Joe</div>
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
268 </doc>""", str(tmpl.generate()))
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
269
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
270 def test_without_strip(self):
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
271 """
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
272 Verify that a match template can produce the same kind of element that
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
273 it matched without entering an infinite recursion.
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
274 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
275 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
276 <elem py:match="elem">
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
277 <div class="elem">${select('*/text()')}</div>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
278 </elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
279 <elem>Hey Joe</elem>
37
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
280 </doc>""")
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
281 self.assertEqual("""<doc>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
282 <elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
283 <div class="elem">Hey Joe</div>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
284 </elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
285 </doc>""", str(tmpl.generate()))
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
286
65
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
287 def test_as_element(self):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
288 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
289 Verify that the directive can also be used as an element.
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
290 """
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
291 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
292 <py:match path="elem">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
293 <div class="elem">${select('*/text()')}</div>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
294 </py:match>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
295 <elem>Hey Joe</elem>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
296 </doc>""")
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
297 self.assertEqual("""<doc>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
298 <div class="elem">Hey Joe</div>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
299 </doc>""", str(tmpl.generate()))
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
300
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
301 def test_recursive_match_1(self):
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
302 """
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
303 Match directives are applied recursively, meaning that they are also
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
304 applied to any content they may have produced themselves:
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
305 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
306 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
307 <elem py:match="elem">
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
308 <div class="elem">
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
309 ${select('*/*')}
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
310 </div>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
311 </elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
312 <elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
313 <subelem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
314 <elem/>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
315 </subelem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
316 </elem>
37
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
317 </doc>""")
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
318 self.assertEqual("""<doc>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
319 <elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
320 <div class="elem">
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
321 <subelem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
322 <elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
323 <div class="elem">
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
324 </div>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
325 </elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
326 </subelem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
327 </div>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
328 </elem>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
329 </doc>""", str(tmpl.generate()))
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
330
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
331 def test_recursive_match_2(self):
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
332 """
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
333 When two or more match templates match the same element and also
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
334 themselves output the element they match, avoiding recursion is even
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
335 more complex, but should work.
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
336 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
337 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/">
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
338 <body py:match="body">
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
339 <div id="header"/>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
340 ${select('*/*')}
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
341 </body>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
342 <body py:match="body">
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
343 ${select('*/*')}
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
344 <div id="footer"/>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
345 </body>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
346 <body>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
347 <h1>Foo</h1>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
348 </body>
37
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
349 </html>""")
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
350 self.assertEqual("""<html>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
351 <body>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
352 <div id="header"/><h1>Foo</h1>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
353 <div id="footer"/>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
354 </body>
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
355 </html>""", str(tmpl.generate()))
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
356
77
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
357 def test_select_all_attrs(self):
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
358 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
359 <div py:match="elem" py:attrs="select('@*')">
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
360 ${select('*/text()')}
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
361 </div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
362 <elem id="joe">Hey Joe</elem>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
363 </doc>""")
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
364 self.assertEqual("""<doc>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
365 <div id="joe">
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
366 Hey Joe
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
367 </div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
368 </doc>""", str(tmpl.generate()))
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
369
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
370 def test_select_all_attrs_empty(self):
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
371 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
372 <div py:match="elem" py:attrs="select('@*')">
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
373 ${select('*/text()')}
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
374 </div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
375 <elem>Hey Joe</elem>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
376 </doc>""")
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
377 self.assertEqual("""<doc>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
378 <div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
379 Hey Joe
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
380 </div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
381 </doc>""", str(tmpl.generate()))
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
382
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
383 def test_select_all_attrs_in_body(self):
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
384 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/">
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
385 <div py:match="elem">
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
386 Hey ${select('text()')} ${select('@*')}
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
387 </div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
388 <elem title="Cool">Joe</elem>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
389 </doc>""")
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
390 self.assertEqual("""<doc>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
391 <div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
392 Hey Joe Cool
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
393 </div>
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
394 </doc>""", str(tmpl.generate()))
f1aa49c759b2 * Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents: 75
diff changeset
395
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
396
37
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
397 class StripDirectiveTestCase(unittest.TestCase):
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
398 """Tests for the `py:strip` template directive."""
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
399
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
400 def test_strip_false(self):
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
401 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
37
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
402 <div py:strip="False"><b>foo</b></div>
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
403 </div>""")
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
404 self.assertEqual("""<div>
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
405 <div><b>foo</b></div>
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
406 </div>""", str(tmpl.generate()))
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
407
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
408 def test_strip_empty(self):
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
409 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
37
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
410 <div py:strip=""><b>foo</b></div>
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
411 </div>""")
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
412 self.assertEqual("""<div>
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
413 <b>foo</b>
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
414 </div>""", str(tmpl.generate()))
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
415
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
416
104
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
417 class WithDirectiveTestCase(unittest.TestCase):
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
418 """Tests for the `py:with` template directive."""
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
419
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
420 def test_shadowing(self):
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
421 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
422 ${x}
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
423 <span py:with="x = x * 2" py:replace="x"/>
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
424 ${x}
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
425 </div>""")
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
426 self.assertEqual("""<div>
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
427 42
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
428 84
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
429 42
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
430 </div>""", str(tmpl.generate(Context(x=42))))
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
431
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
432 def test_as_element(self):
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
433 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
434 <py:with vars="x = x * 2">${x}</py:with>
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
435 </div>""")
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
436 self.assertEqual("""<div>
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
437 84
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
438 </div>""", str(tmpl.generate(Context(x=42))))
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
439
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
440
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
441 class TemplateTestCase(unittest.TestCase):
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
442 """Tests for basic template processing, expression evaluation and error
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
443 reporting.
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
444 """
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
445
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
446 def test_interpolate_string(self):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
447 parts = list(Template._interpolate('bla'))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
448 self.assertEqual(1, len(parts))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
449 self.assertEqual(Stream.TEXT, parts[0][0])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
450 self.assertEqual('bla', parts[0][1])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
451
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
452 def test_interpolate_simple(self):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
453 parts = list(Template._interpolate('${bla}'))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
454 self.assertEqual(1, len(parts))
10
c5890ef863ba Moved the template-specific stream event kinds into the template module.
cmlenz
parents: 1
diff changeset
455 self.assertEqual(Template.EXPR, parts[0][0])
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
456 self.assertEqual('bla', parts[0][1].source)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
457
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
458 def test_interpolate_escaped(self):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
459 parts = list(Template._interpolate('$${bla}'))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
460 self.assertEqual(1, len(parts))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
461 self.assertEqual(Stream.TEXT, parts[0][0])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
462 self.assertEqual('${bla}', parts[0][1])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
463
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
464 def test_interpolate_short(self):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
465 parts = list(Template._interpolate('$bla'))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
466 self.assertEqual(1, len(parts))
10
c5890ef863ba Moved the template-specific stream event kinds into the template module.
cmlenz
parents: 1
diff changeset
467 self.assertEqual(Template.EXPR, parts[0][0])
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
468 self.assertEqual('bla', parts[0][1].source)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
469
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
470 def test_interpolate_mixed1(self):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
471 parts = list(Template._interpolate('$foo bar $baz'))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
472 self.assertEqual(3, len(parts))
10
c5890ef863ba Moved the template-specific stream event kinds into the template module.
cmlenz
parents: 1
diff changeset
473 self.assertEqual(Template.EXPR, parts[0][0])
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
474 self.assertEqual('foo', parts[0][1].source)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
475 self.assertEqual(Stream.TEXT, parts[1][0])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
476 self.assertEqual(' bar ', parts[1][1])
10
c5890ef863ba Moved the template-specific stream event kinds into the template module.
cmlenz
parents: 1
diff changeset
477 self.assertEqual(Template.EXPR, parts[2][0])
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
478 self.assertEqual('baz', parts[2][1].source)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
479
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
480 def test_interpolate_mixed2(self):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
481 parts = list(Template._interpolate('foo $bar baz'))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
482 self.assertEqual(3, len(parts))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
483 self.assertEqual(Stream.TEXT, parts[0][0])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
484 self.assertEqual('foo ', parts[0][1])
10
c5890ef863ba Moved the template-specific stream event kinds into the template module.
cmlenz
parents: 1
diff changeset
485 self.assertEqual(Template.EXPR, parts[1][0])
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
486 self.assertEqual('bar', parts[1][1].source)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
487 self.assertEqual(Stream.TEXT, parts[2][0])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
488 self.assertEqual(' baz', parts[2][1])
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
489
74
3c271699c398 Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents: 66
diff changeset
490 def test_interpolate_mixed3(self):
3c271699c398 Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents: 66
diff changeset
491 ctxt = Context(var=42)
3c271699c398 Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents: 66
diff changeset
492 tmpl = Template('<root> ${var} $var</root>')
3c271699c398 Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents: 66
diff changeset
493 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(ctxt)))
3c271699c398 Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas.
cmlenz
parents: 66
diff changeset
494
48
06c642ba2b08 convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents: 37
diff changeset
495 def test_interpolate_non_string_attrs(self):
06c642ba2b08 convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents: 37
diff changeset
496 tmpl = Template('<root attr="${1}"/>')
75
c3c26300a46d Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents: 74
diff changeset
497 self.assertEqual('<root attr="1"/>', str(tmpl.generate()))
c3c26300a46d Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents: 74
diff changeset
498
c3c26300a46d Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents: 74
diff changeset
499 def test_empty_attr(self):
c3c26300a46d Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents: 74
diff changeset
500 tmpl = Template('<root attr=""/>')
c3c26300a46d Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents: 74
diff changeset
501 self.assertEqual('<root attr=""/>', str(tmpl.generate()))
48
06c642ba2b08 convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents: 37
diff changeset
502
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
503 def test_bad_directive_error(self):
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
504 xml = '<p xmlns:py="http://markup.edgewall.org/" py:do="nothing" />'
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
505 try:
21
eca77129518a * Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents: 10
diff changeset
506 tmpl = Template(xml, filename='test.html')
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
507 except BadDirectiveError, e:
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
508 self.assertEqual('test.html', e.filename)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
509 if sys.version_info[:2] >= (2, 4):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
510 self.assertEqual(1, e.lineno)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
511
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
512 def test_directive_value_syntax_error(self):
81
cc034182061e Template expressions are now compiled to Python bytecode.
cmlenz
parents: 77
diff changeset
513 xml = """<p xmlns:py="http://markup.edgewall.org/" py:if="bar'" />"""
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
514 try:
81
cc034182061e Template expressions are now compiled to Python bytecode.
cmlenz
parents: 77
diff changeset
515 tmpl = Template(xml, filename='test.html')
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
516 self.fail('Expected SyntaxError')
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
517 except TemplateSyntaxError, e:
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
518 self.assertEqual('test.html', e.filename)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
519 if sys.version_info[:2] >= (2, 4):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
520 self.assertEqual(1, e.lineno)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
521 # We don't really care about the offset here, do we?
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
522
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
523 def test_expression_syntax_error(self):
81
cc034182061e Template expressions are now compiled to Python bytecode.
cmlenz
parents: 77
diff changeset
524 xml = """<p>
cc034182061e Template expressions are now compiled to Python bytecode.
cmlenz
parents: 77
diff changeset
525 Foo <em>${bar"}</em>
cc034182061e Template expressions are now compiled to Python bytecode.
cmlenz
parents: 77
diff changeset
526 </p>"""
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
527 try:
81
cc034182061e Template expressions are now compiled to Python bytecode.
cmlenz
parents: 77
diff changeset
528 tmpl = Template(xml, filename='test.html')
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
529 self.fail('Expected SyntaxError')
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
530 except TemplateSyntaxError, e:
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
531 self.assertEqual('test.html', e.filename)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
532 if sys.version_info[:2] >= (2, 4):
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
533 self.assertEqual(2, e.lineno)
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
534
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
535 def test_markup_noescape(self):
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
536 """
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
537 Verify that outputting context data that is a `Markup` instance is not
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
538 escaped.
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
539 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
540 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
541 $myvar
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
542 </div>""")
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
543 self.assertEqual("""<div>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
544 <b>foo</b>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
545 </div>""", str(tmpl.generate(Context(myvar=Markup('<b>foo</b>')))))
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
546
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
547 def test_text_noescape_quotes(self):
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
548 """
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
549 Verify that outputting context data in text nodes doesn't escape quotes.
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
550 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
551 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
552 $myvar
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
553 </div>""")
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
554 self.assertEqual("""<div>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
555 "foo"
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
556 </div>""", str(tmpl.generate(Context(myvar='"foo"'))))
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
557
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
558 def test_attr_escape_quotes(self):
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
559 """
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
560 Verify that outputting context data in attribtes escapes quotes.
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
561 """
61
33c2702cf6da Use a different namespace than Kid uses.
cmlenz
parents: 54
diff changeset
562 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
54
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
563 <elem class="$myvar"/>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
564 </div>""")
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
565 self.assertEqual("""<div>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
566 <elem class="&#34;foo&#34;"/>
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
567 </div>""", str(tmpl.generate(Context(myvar='"foo"'))))
01981cbc7575 Fix a number of escaping problems:
cmlenz
parents: 53
diff changeset
568
65
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
569 def test_directive_element(self):
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
570 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
571 <py:if test="myvar">bar</py:if>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
572 </div>""")
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
573 self.assertEqual("""<div>
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
574 bar
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
575 </div>""", str(tmpl.generate(Context(myvar='"foo"'))))
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
576
89
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
577 def test_normal_comment(self):
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
578 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
579 <!-- foo bar -->
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
580 </div>""")
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
581 self.assertEqual("""<div>
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
582 <!-- foo bar -->
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
583 </div>""", str(tmpl.generate()))
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
584
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
585 def test_template_comment(self):
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
586 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/">
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
587 <!-- !foo -->
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
588 <!--!bar-->
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
589 </div>""")
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
590 self.assertEqual("""<div>
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
591 </div>""", str(tmpl.generate()))
d4c7617900e3 Support comments in templates that are not included in the output, in the same way Kid does: if the comment text starts with a `!` character, it is stripped from the output.
cmlenz
parents: 81
diff changeset
592
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
593
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
594 def suite():
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
595 suite = unittest.TestSuite()
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
596 suite.addTest(doctest.DocTestSuite(Template.__module__))
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
597 suite.addTest(unittest.makeSuite(TemplateTestCase, 'test'))
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
598 suite.addTest(unittest.makeSuite(AttrsDirectiveTestCase, 'test'))
53
60f1a556690e * Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents: 51
diff changeset
599 suite.addTest(unittest.makeSuite(ChooseDirectiveTestCase, 'test'))
50
a053ffb834cb Fix the way multiple directives are applied to a single `SUB` in many cases by making the directives themselves responsible for applying any remaining directives.
cmlenz
parents: 48
diff changeset
600 suite.addTest(unittest.makeSuite(DefDirectiveTestCase, 'test'))
51
a572b1018b66 Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents: 50
diff changeset
601 suite.addTest(unittest.makeSuite(ForDirectiveTestCase, 'test'))
65
5c024cf58ecb Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents: 61
diff changeset
602 suite.addTest(unittest.makeSuite(IfDirectiveTestCase, 'test'))
36
57d607f25484 Fix for #7: match templates no longer process their own output.
cmlenz
parents: 27
diff changeset
603 suite.addTest(unittest.makeSuite(MatchDirectiveTestCase, 'test'))
37
224b0b41d1da Moved some of the tests for the strip directive to a new unittest test case to not clutter up the documentation.
cmlenz
parents: 36
diff changeset
604 suite.addTest(unittest.makeSuite(StripDirectiveTestCase, 'test'))
104
e9259920db05 Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents: 90
diff changeset
605 suite.addTest(unittest.makeSuite(WithDirectiveTestCase, 'test'))
1
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
606 return suite
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
607
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
608 if __name__ == '__main__':
821114ec4f69 Initial import.
cmlenz
parents:
diff changeset
609 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software