Mercurial > genshi > mirror
annotate markup/tests/template.py @ 145:47bbd9d2a5af trunk
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
* The first location step in path expressions longer assumes the `descendant::` axis, but rather the `child::` axis.
* Import cleanups.
author | cmlenz |
---|---|
date | Tue, 15 Aug 2006 09:52:47 +0000 |
parents | d681d2c3cd8d |
children | 537f819c547b |
rev | line source |
---|---|
1 | 1 # -*- coding: utf-8 -*- |
2 # | |
66
59eb24184e9c
Switch copyright to Edgewall and URLs to markup.edgewall.org.
cmlenz
parents:
65
diff
changeset
|
3 # Copyright (C) 2006 Edgewall Software |
1 | 4 # All rights reserved. |
5 # | |
6 # This software is licensed as described in the file COPYING, which | |
7 # you should have received as part of this distribution. The terms | |
66
59eb24184e9c
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 | 9 # |
10 # This software consists of voluntary contributions made by many | |
11 # individuals. For the exact contribution history, see the revision | |
66
59eb24184e9c
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 | 13 |
14 import doctest | |
15 import unittest | |
16 import sys | |
17 | |
54 | 18 from markup.core import Markup, Stream |
1 | 19 from markup.template import BadDirectiveError, Context, Template, \ |
20 TemplateSyntaxError | |
21 | |
22 | |
50
d3842cd76e92
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): |
d3842cd76e92
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.""" |
d3842cd76e92
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 |
d3842cd76e92
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): |
d3842cd76e92
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 """ |
d3842cd76e92
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. |
d3842cd76e92
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 | 30 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
d3842cd76e92
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"/> |
d3842cd76e92
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>""") |
d3842cd76e92
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'}] |
d3842cd76e92
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> |
d3842cd76e92
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"/> |
d3842cd76e92
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)))) |
d3842cd76e92
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 | 38 def test_update_existing_attr(self): |
39 """ | |
40 Verify that an attribute value that evaluates to `None` removes an | |
41 existing attribute of that name. | |
42 """ | |
61 | 43 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
54 | 44 <elem class="foo" py:attrs="{'class': 'bar'}"/> |
45 </doc>""") | |
46 self.assertEqual("""<doc> | |
47 <elem class="bar"/> | |
48 </doc>""", str(tmpl.generate())) | |
49 | |
50 def test_remove_existing_attr(self): | |
51 """ | |
52 Verify that an attribute value that evaluates to `None` removes an | |
53 existing attribute of that name. | |
54 """ | |
61 | 55 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
54 | 56 <elem class="foo" py:attrs="{'class': None}"/> |
57 </doc>""") | |
58 self.assertEqual("""<doc> | |
59 <elem/> | |
60 </doc>""", str(tmpl.generate())) | |
61 | |
50
d3842cd76e92
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
512eb72dbb19
* 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): |
512eb72dbb19
* 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 |
512eb72dbb19
* 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`.""" |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
66 |
512eb72dbb19
* 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): |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
68 """ |
512eb72dbb19
* 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 |
512eb72dbb19
* 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. |
512eb72dbb19
* 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 | 72 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> |
53
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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>""") |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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())) |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
80 |
512eb72dbb19
* 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 | 82 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> |
53
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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>""") |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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())) |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
89 |
512eb72dbb19
* 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): |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
91 """ |
512eb72dbb19
* 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: |
512eb72dbb19
* 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 | 94 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
53
512eb72dbb19
* 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"> |
512eb72dbb19
* 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"> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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>""") |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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())) |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
109 |
512eb72dbb19
* 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): |
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
111 """ |
512eb72dbb19
* 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 |
512eb72dbb19
* 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. |
512eb72dbb19
* 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 | 115 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
53
512eb72dbb19
* 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=""> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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>""") |
512eb72dbb19
* 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> |
512eb72dbb19
* 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> |
512eb72dbb19
* 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())) |
512eb72dbb19
* 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
b3fdf93057ab
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): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
125 """ |
b3fdf93057ab
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. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
127 """ |
b3fdf93057ab
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/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
129 <py:choose> |
b3fdf93057ab
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> |
b3fdf93057ab
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> |
b3fdf93057ab
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> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
133 </py:choose> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
134 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
135 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
136 1 |
b3fdf93057ab
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())) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
138 |
53
512eb72dbb19
* 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
d3842cd76e92
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): |
d3842cd76e92
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.""" |
d3842cd76e92
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 |
d3842cd76e92
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): |
d3842cd76e92
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
512eb72dbb19
* 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 |
512eb72dbb19
* 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
d3842cd76e92
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 | 148 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
d3842cd76e92
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=""> |
d3842cd76e92
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> |
d3842cd76e92
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> |
d3842cd76e92
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')} |
d3842cd76e92
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>""") |
d3842cd76e92
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> |
d3842cd76e92
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> |
d3842cd76e92
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())) |
d3842cd76e92
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
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
158 def test_exec_in_replace(self): |
c835e81c50af
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/"> |
c835e81c50af
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"> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
161 ${greeting}, ${name}! |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
162 </p> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
163 <div py:replace="echo('hello')"></div> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
164 </div>""") |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
165 self.assertEqual("""<div> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
166 <p class="message"> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
167 hello, world! |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
168 </p> |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
169 </div>""", str(tmpl.generate())) |
c835e81c50af
When an expression evaluates to a callable, it is called implicitly.
cmlenz
parents:
89
diff
changeset
|
170 |
65
b3fdf93057ab
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): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
172 """ |
b3fdf93057ab
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. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
174 """ |
b3fdf93057ab
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/"> |
b3fdf93057ab
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)"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
177 <b>${what}</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
178 </py:def> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
179 ${echo('foo')} |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
180 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
181 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
182 <b>foo</b> |
b3fdf93057ab
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())) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
184 |
50
d3842cd76e92
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
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
186 class ForDirectiveTestCase(unittest.TestCase): |
53
512eb72dbb19
* 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
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
188 |
b2383634ec04
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): |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
190 """ |
53
512eb72dbb19
* 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 |
512eb72dbb19
* 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
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
193 """ |
61 | 194 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
51
b2383634ec04
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=""> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
196 <b>${item}</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
197 </div> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
198 </doc>""") |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
199 self.assertEqual("""<doc> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
200 <b>1</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
201 <b>2</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
202 <b>3</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
203 <b>4</b> |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
204 <b>5</b> |
b2383634ec04
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))))) |
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
206 |
65
b3fdf93057ab
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): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
208 """ |
b3fdf93057ab
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. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
210 """ |
b3fdf93057ab
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/"> |
b3fdf93057ab
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"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
213 <b>${item}</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
214 </py:for> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
215 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
216 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
217 <b>1</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
218 <b>2</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
219 <b>3</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
220 <b>4</b> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
221 <b>5</b> |
b3fdf93057ab
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))))) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
223 |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
224 |
b3fdf93057ab
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): |
b3fdf93057ab
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.""" |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
227 |
b3fdf93057ab
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): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
229 """ |
b3fdf93057ab
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 |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
231 correctly. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
232 """ |
b3fdf93057ab
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/"> |
b3fdf93057ab
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> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
235 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
236 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
237 Hello |
b3fdf93057ab
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')))) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
239 |
b3fdf93057ab
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): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
241 """ |
b3fdf93057ab
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. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
243 """ |
b3fdf93057ab
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/"> |
b3fdf93057ab
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> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
246 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
247 self.assertEqual("""<doc> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
248 Hello |
b3fdf93057ab
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')))) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
250 |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
251 |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
252 class MatchDirectiveTestCase(unittest.TestCase): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
253 """Tests for the `py:match` template directive.""" |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
254 |
50
d3842cd76e92
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): |
d3842cd76e92
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 """ |
d3842cd76e92
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 |
d3842cd76e92
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. |
d3842cd76e92
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 | 260 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
50
d3842cd76e92
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=""> |
d3842cd76e92
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> |
d3842cd76e92
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> |
d3842cd76e92
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> |
d3842cd76e92
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>""") |
d3842cd76e92
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> |
d3842cd76e92
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> |
d3842cd76e92
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())) |
d3842cd76e92
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
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
270 def test_without_strip(self): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
271 """ |
ed370ebfa794
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 |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
273 it matched without entering an infinite recursion. |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
274 """ |
61 | 275 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
276 <elem py:match="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
277 <div class="elem">${select('*/text()')}</div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
278 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
279 <elem>Hey Joe</elem> |
37
37557b8fb925
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
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
281 self.assertEqual("""<doc> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
282 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
283 <div class="elem">Hey Joe</div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
284 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
285 </doc>""", str(tmpl.generate())) |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
286 |
65
b3fdf93057ab
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): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
288 """ |
b3fdf93057ab
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. |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
290 """ |
b3fdf93057ab
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/"> |
b3fdf93057ab
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"> |
b3fdf93057ab
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> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
294 </py:match> |
b3fdf93057ab
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> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
296 </doc>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
297 self.assertEqual("""<doc> |
b3fdf93057ab
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> |
b3fdf93057ab
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())) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
300 |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
301 def test_recursive_match_1(self): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
302 """ |
ed370ebfa794
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 |
ed370ebfa794
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: |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
305 """ |
61 | 306 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
307 <elem py:match="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
308 <div class="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
309 ${select('*/*')} |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
310 </div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
311 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
312 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
313 <subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
314 <elem/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
315 </subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
316 </elem> |
37
37557b8fb925
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
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
318 self.assertEqual("""<doc> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
319 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
320 <div class="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
321 <subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
322 <elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
323 <div class="elem"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
324 </div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
325 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
326 </subelem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
327 </div> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
328 </elem> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
329 </doc>""", str(tmpl.generate())) |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
330 |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
331 def test_recursive_match_2(self): |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
332 """ |
ed370ebfa794
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 |
ed370ebfa794
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 |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
335 more complex, but should work. |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
336 """ |
61 | 337 tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
338 <body py:match="body"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
339 <div id="header"/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
340 ${select('*/*')} |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
341 </body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
342 <body py:match="body"> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
343 ${select('*/*')} |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
344 <div id="footer"/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
345 </body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
346 <body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
347 <h1>Foo</h1> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
348 </body> |
37
37557b8fb925
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
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
350 self.assertEqual("""<html> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
351 <body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
352 <div id="header"/><h1>Foo</h1> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
353 <div id="footer"/> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
354 </body> |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
355 </html>""", str(tmpl.generate())) |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
356 |
77
f5ec6d4a61e4
* 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): |
f5ec6d4a61e4
* 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/"> |
f5ec6d4a61e4
* 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('@*')"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
360 ${select('*/text()')} |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
361 </div> |
f5ec6d4a61e4
* 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> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
363 </doc>""") |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
364 self.assertEqual("""<doc> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
365 <div id="joe"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
366 Hey Joe |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
367 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
368 </doc>""", str(tmpl.generate())) |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
369 |
f5ec6d4a61e4
* 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): |
f5ec6d4a61e4
* 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/"> |
f5ec6d4a61e4
* 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('@*')"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
373 ${select('*/text()')} |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
374 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
375 <elem>Hey Joe</elem> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
376 </doc>""") |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
377 self.assertEqual("""<doc> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
378 <div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
379 Hey Joe |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
380 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
381 </doc>""", str(tmpl.generate())) |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
382 |
f5ec6d4a61e4
* 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): |
f5ec6d4a61e4
* 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/"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
385 <div py:match="elem"> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
386 Hey ${select('text()')} ${select('@*')} |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
387 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
388 <elem title="Cool">Joe</elem> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
389 </doc>""") |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
390 self.assertEqual("""<doc> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
391 <div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
392 Hey Joe Cool |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
393 </div> |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
394 </doc>""", str(tmpl.generate())) |
f5ec6d4a61e4
* Simplify implementation of the individual XPath tests (use closures instead of callable classes)
cmlenz
parents:
75
diff
changeset
|
395 |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
396 |
37
37557b8fb925
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): |
37557b8fb925
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.""" |
37557b8fb925
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 |
37557b8fb925
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 | 401 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
37557b8fb925
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> |
37557b8fb925
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>""") |
37557b8fb925
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> |
37557b8fb925
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> |
37557b8fb925
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())) |
37557b8fb925
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 |
37557b8fb925
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 | 409 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
37
37557b8fb925
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> |
37557b8fb925
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>""") |
37557b8fb925
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> |
37557b8fb925
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> |
37557b8fb925
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())) |
37557b8fb925
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 |
37557b8fb925
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
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
417 class WithDirectiveTestCase(unittest.TestCase): |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
418 """Tests for the `py:with` template directive.""" |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
419 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
420 def test_shadowing(self): |
f12e7987d7f4
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/"> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
422 ${x} |
f12e7987d7f4
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"/> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
424 ${x} |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
425 </div>""") |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
426 self.assertEqual("""<div> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
427 42 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
428 84 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
429 42 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
430 </div>""", str(tmpl.generate(Context(x=42)))) |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
431 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
432 def test_as_element(self): |
f12e7987d7f4
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/"> |
f12e7987d7f4
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> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
435 </div>""") |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
436 self.assertEqual("""<div> |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
437 84 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
438 </div>""", str(tmpl.generate(Context(x=42)))) |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
439 |
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
440 |
1 | 441 class TemplateTestCase(unittest.TestCase): |
36
ed370ebfa794
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 |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
443 reporting. |
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
444 """ |
1 | 445 |
446 def test_interpolate_string(self): | |
447 parts = list(Template._interpolate('bla')) | |
448 self.assertEqual(1, len(parts)) | |
449 self.assertEqual(Stream.TEXT, parts[0][0]) | |
450 self.assertEqual('bla', parts[0][1]) | |
451 | |
452 def test_interpolate_simple(self): | |
453 parts = list(Template._interpolate('${bla}')) | |
454 self.assertEqual(1, len(parts)) | |
10
f77f7a91aa46
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 | 456 self.assertEqual('bla', parts[0][1].source) |
457 | |
458 def test_interpolate_escaped(self): | |
459 parts = list(Template._interpolate('$${bla}')) | |
460 self.assertEqual(1, len(parts)) | |
461 self.assertEqual(Stream.TEXT, parts[0][0]) | |
462 self.assertEqual('${bla}', parts[0][1]) | |
463 | |
464 def test_interpolate_short(self): | |
465 parts = list(Template._interpolate('$bla')) | |
466 self.assertEqual(1, len(parts)) | |
10
f77f7a91aa46
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 | 468 self.assertEqual('bla', parts[0][1].source) |
469 | |
470 def test_interpolate_mixed1(self): | |
471 parts = list(Template._interpolate('$foo bar $baz')) | |
472 self.assertEqual(3, len(parts)) | |
10
f77f7a91aa46
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 | 474 self.assertEqual('foo', parts[0][1].source) |
475 self.assertEqual(Stream.TEXT, parts[1][0]) | |
476 self.assertEqual(' bar ', parts[1][1]) | |
10
f77f7a91aa46
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 | 478 self.assertEqual('baz', parts[2][1].source) |
479 | |
480 def test_interpolate_mixed2(self): | |
481 parts = list(Template._interpolate('foo $bar baz')) | |
482 self.assertEqual(3, len(parts)) | |
483 self.assertEqual(Stream.TEXT, parts[0][0]) | |
484 self.assertEqual('foo ', parts[0][1]) | |
10
f77f7a91aa46
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 | 486 self.assertEqual('bar', parts[1][1].source) |
487 self.assertEqual(Stream.TEXT, parts[2][0]) | |
488 self.assertEqual(' baz', parts[2][1]) | |
489 | |
74
d54b5fd60b52
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): |
d54b5fd60b52
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) |
d54b5fd60b52
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>') |
d54b5fd60b52
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))) |
d54b5fd60b52
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
a5d585dd38c4
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): |
a5d585dd38c4
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
3722696d0343
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())) |
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
498 |
145
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
499 def test_interpolate_list_result(self): |
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
500 tmpl = Template('<root>$foo</root>') |
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
501 ctxt = Context(foo=('buzz',)) |
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
502 self.assertEqual('<root>buzz</root>', str(tmpl.generate(ctxt))) |
47bbd9d2a5af
* Fix error in expression evaluation when the expression evaluates to an iterable that does not produce event tuples.
cmlenz
parents:
134
diff
changeset
|
503 |
75
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
504 def test_empty_attr(self): |
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
505 tmpl = Template('<root attr=""/>') |
3722696d0343
Empty attributes in templates were being stripped out. Thanks to Jonas for the patch.
cmlenz
parents:
74
diff
changeset
|
506 self.assertEqual('<root attr=""/>', str(tmpl.generate())) |
48
a5d585dd38c4
convert the result of expressions in attributes to strings so that values like ints are output correctly
mgood
parents:
37
diff
changeset
|
507 |
1 | 508 def test_bad_directive_error(self): |
61 | 509 xml = '<p xmlns:py="http://markup.edgewall.org/" py:do="nothing" />' |
1 | 510 try: |
21
b4d17897d053
* Include paths are now interpreted relative to the path of the including template. Closes #3.
cmlenz
parents:
10
diff
changeset
|
511 tmpl = Template(xml, filename='test.html') |
1 | 512 except BadDirectiveError, e: |
513 self.assertEqual('test.html', e.filename) | |
514 if sys.version_info[:2] >= (2, 4): | |
515 self.assertEqual(1, e.lineno) | |
516 | |
517 def test_directive_value_syntax_error(self): | |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
518 xml = """<p xmlns:py="http://markup.edgewall.org/" py:if="bar'" />""" |
1 | 519 try: |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
520 tmpl = Template(xml, filename='test.html') |
1 | 521 self.fail('Expected SyntaxError') |
522 except TemplateSyntaxError, e: | |
523 self.assertEqual('test.html', e.filename) | |
524 if sys.version_info[:2] >= (2, 4): | |
525 self.assertEqual(1, e.lineno) | |
526 | |
527 def test_expression_syntax_error(self): | |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
528 xml = """<p> |
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
529 Foo <em>${bar"}</em> |
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
530 </p>""" |
1 | 531 try: |
81
d60486018004
Template expressions are now compiled to Python bytecode.
cmlenz
parents:
77
diff
changeset
|
532 tmpl = Template(xml, filename='test.html') |
1 | 533 self.fail('Expected SyntaxError') |
534 except TemplateSyntaxError, e: | |
535 self.assertEqual('test.html', e.filename) | |
536 if sys.version_info[:2] >= (2, 4): | |
537 self.assertEqual(2, e.lineno) | |
538 | |
134
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
539 def test_expression_syntax_error_multi_line(self): |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
540 xml = """<p><em></em> |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
541 |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
542 ${bar"} |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
543 |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
544 </p>""" |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
545 try: |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
546 tmpl = Template(xml, filename='test.html') |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
547 self.fail('Expected SyntaxError') |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
548 except TemplateSyntaxError, e: |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
549 self.assertEqual('test.html', e.filename) |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
550 if sys.version_info[:2] >= (2, 4): |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
551 self.assertEqual(3, e.lineno) |
d681d2c3cd8d
* Improve the accuracy of line numbers for text nodes, so that reported errors about syntax or evaluation errors in expressions point to the right line (not quite perfect yet, though).
cmlenz
parents:
104
diff
changeset
|
552 |
54 | 553 def test_markup_noescape(self): |
554 """ | |
555 Verify that outputting context data that is a `Markup` instance is not | |
556 escaped. | |
557 """ | |
61 | 558 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 559 $myvar |
560 </div>""") | |
561 self.assertEqual("""<div> | |
562 <b>foo</b> | |
563 </div>""", str(tmpl.generate(Context(myvar=Markup('<b>foo</b>'))))) | |
564 | |
565 def test_text_noescape_quotes(self): | |
566 """ | |
567 Verify that outputting context data in text nodes doesn't escape quotes. | |
568 """ | |
61 | 569 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 570 $myvar |
571 </div>""") | |
572 self.assertEqual("""<div> | |
573 "foo" | |
574 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) | |
575 | |
576 def test_attr_escape_quotes(self): | |
577 """ | |
578 Verify that outputting context data in attribtes escapes quotes. | |
579 """ | |
61 | 580 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
54 | 581 <elem class="$myvar"/> |
582 </div>""") | |
583 self.assertEqual("""<div> | |
584 <elem class=""foo""/> | |
585 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) | |
586 | |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
587 def test_directive_element(self): |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
588 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
589 <py:if test="myvar">bar</py:if> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
590 </div>""") |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
591 self.assertEqual("""<div> |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
592 bar |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
593 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) |
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
594 |
89
80386d62814f
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
|
595 def test_normal_comment(self): |
80386d62814f
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
|
596 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
80386d62814f
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
|
597 <!-- foo bar --> |
80386d62814f
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
|
598 </div>""") |
80386d62814f
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
|
599 self.assertEqual("""<div> |
80386d62814f
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
|
600 <!-- foo bar --> |
80386d62814f
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
|
601 </div>""", str(tmpl.generate())) |
80386d62814f
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
|
602 |
80386d62814f
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
|
603 def test_template_comment(self): |
80386d62814f
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
|
604 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
80386d62814f
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
|
605 <!-- !foo --> |
80386d62814f
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
|
606 <!--!bar--> |
80386d62814f
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
|
607 </div>""") |
80386d62814f
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
|
608 self.assertEqual("""<div> |
80386d62814f
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
|
609 </div>""", str(tmpl.generate())) |
80386d62814f
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
|
610 |
1 | 611 |
612 def suite(): | |
613 suite = unittest.TestSuite() | |
614 suite.addTest(doctest.DocTestSuite(Template.__module__)) | |
615 suite.addTest(unittest.makeSuite(TemplateTestCase, 'test')) | |
50
d3842cd76e92
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
|
616 suite.addTest(unittest.makeSuite(AttrsDirectiveTestCase, 'test')) |
53
512eb72dbb19
* Add helper function to let directives apply any remaining directives, and use that helper consistently in every directive.
cmlenz
parents:
51
diff
changeset
|
617 suite.addTest(unittest.makeSuite(ChooseDirectiveTestCase, 'test')) |
50
d3842cd76e92
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
|
618 suite.addTest(unittest.makeSuite(DefDirectiveTestCase, 'test')) |
51
b2383634ec04
Fix `py:for` directive when combined with other directives (such as `py:strip`).
cmlenz
parents:
50
diff
changeset
|
619 suite.addTest(unittest.makeSuite(ForDirectiveTestCase, 'test')) |
65
b3fdf93057ab
Support the use of directives as elements to reduce the need for using `py:strip`.
cmlenz
parents:
61
diff
changeset
|
620 suite.addTest(unittest.makeSuite(IfDirectiveTestCase, 'test')) |
36
ed370ebfa794
Fix for #7: match templates no longer process their own output.
cmlenz
parents:
27
diff
changeset
|
621 suite.addTest(unittest.makeSuite(MatchDirectiveTestCase, 'test')) |
37
37557b8fb925
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
|
622 suite.addTest(unittest.makeSuite(StripDirectiveTestCase, 'test')) |
104
f12e7987d7f4
Added `py:with` directive based on Jonas' patch in #17.
cmlenz
parents:
90
diff
changeset
|
623 suite.addTest(unittest.makeSuite(WithDirectiveTestCase, 'test')) |
1 | 624 return suite |
625 | |
626 if __name__ == '__main__': | |
627 unittest.main(defaultTest='suite') |