comparison genshi/template/tests/markup.py @ 336:7763f7aec949 trunk

Refactoring: `genshi.template` is now a package, it was getting way to crowded in that file.
author cmlenz
date Wed, 08 Nov 2006 15:50:15 +0000
parents
children 37e4b4bb0b53 a81675590258
comparison
equal deleted inserted replaced
335:8e651f5f2ee0 336:7763f7aec949
1 # -*- coding: utf-8 -*-
2 #
3 # Copyright (C) 2006 Edgewall Software
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
8 # are also available at http://genshi.edgewall.org/wiki/License.
9 #
10 # This software consists of voluntary contributions made by many
11 # individuals. For the exact contribution history, see the revision
12 # history and logs, available at http://genshi.edgewall.org/log/.
13
14 import doctest
15 import sys
16 import unittest
17
18 from genshi.core import Markup
19 from genshi.template.core import BadDirectiveError, TemplateSyntaxError
20 from genshi.template.markup import MarkupTemplate
21
22
23 class MarkupTemplateTestCase(unittest.TestCase):
24 """Tests for markup template processing."""
25
26 def test_interpolate_mixed3(self):
27 tmpl = MarkupTemplate('<root> ${var} $var</root>')
28 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
29
30 def test_interpolate_leading_trailing_space(self):
31 tmpl = MarkupTemplate('<root>${ foo }</root>')
32 self.assertEqual('<root>bar</root>', str(tmpl.generate(foo='bar')))
33
34 def test_interpolate_multiline(self):
35 tmpl = MarkupTemplate("""<root>${dict(
36 bar = 'baz'
37 )[foo]}</root>""")
38 self.assertEqual('<root>baz</root>', str(tmpl.generate(foo='bar')))
39
40 def test_interpolate_non_string_attrs(self):
41 tmpl = MarkupTemplate('<root attr="${1}"/>')
42 self.assertEqual('<root attr="1"/>', str(tmpl.generate()))
43
44 def test_interpolate_list_result(self):
45 tmpl = MarkupTemplate('<root>$foo</root>')
46 self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',))))
47
48 def test_empty_attr(self):
49 tmpl = MarkupTemplate('<root attr=""/>')
50 self.assertEqual('<root attr=""/>', str(tmpl.generate()))
51
52 def test_bad_directive_error(self):
53 xml = '<p xmlns:py="http://genshi.edgewall.org/" py:do="nothing" />'
54 try:
55 tmpl = MarkupTemplate(xml, filename='test.html')
56 except BadDirectiveError, e:
57 self.assertEqual('test.html', e.filename)
58 if sys.version_info[:2] >= (2, 4):
59 self.assertEqual(1, e.lineno)
60
61 def test_directive_value_syntax_error(self):
62 xml = """<p xmlns:py="http://genshi.edgewall.org/" py:if="bar'" />"""
63 try:
64 tmpl = MarkupTemplate(xml, filename='test.html')
65 self.fail('Expected SyntaxError')
66 except TemplateSyntaxError, e:
67 self.assertEqual('test.html', e.filename)
68 if sys.version_info[:2] >= (2, 4):
69 self.assertEqual(1, e.lineno)
70
71 def test_expression_syntax_error(self):
72 xml = """<p>
73 Foo <em>${bar"}</em>
74 </p>"""
75 try:
76 tmpl = MarkupTemplate(xml, filename='test.html')
77 self.fail('Expected SyntaxError')
78 except TemplateSyntaxError, e:
79 self.assertEqual('test.html', e.filename)
80 if sys.version_info[:2] >= (2, 4):
81 self.assertEqual(2, e.lineno)
82
83 def test_expression_syntax_error_multi_line(self):
84 xml = """<p><em></em>
85
86 ${bar"}
87
88 </p>"""
89 try:
90 tmpl = MarkupTemplate(xml, filename='test.html')
91 self.fail('Expected SyntaxError')
92 except TemplateSyntaxError, e:
93 self.assertEqual('test.html', e.filename)
94 if sys.version_info[:2] >= (2, 4):
95 self.assertEqual(3, e.lineno)
96
97 def test_markup_noescape(self):
98 """
99 Verify that outputting context data that is a `Markup` instance is not
100 escaped.
101 """
102 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
103 $myvar
104 </div>""")
105 self.assertEqual("""<div>
106 <b>foo</b>
107 </div>""", str(tmpl.generate(myvar=Markup('<b>foo</b>'))))
108
109 def test_text_noescape_quotes(self):
110 """
111 Verify that outputting context data in text nodes doesn't escape quotes.
112 """
113 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
114 $myvar
115 </div>""")
116 self.assertEqual("""<div>
117 "foo"
118 </div>""", str(tmpl.generate(myvar='"foo"')))
119
120 def test_attr_escape_quotes(self):
121 """
122 Verify that outputting context data in attribtes escapes quotes.
123 """
124 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
125 <elem class="$myvar"/>
126 </div>""")
127 self.assertEqual("""<div>
128 <elem class="&#34;foo&#34;"/>
129 </div>""", str(tmpl.generate(myvar='"foo"')))
130
131 def test_directive_element(self):
132 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
133 <py:if test="myvar">bar</py:if>
134 </div>""")
135 self.assertEqual("""<div>
136 bar
137 </div>""", str(tmpl.generate(myvar='"foo"')))
138
139 def test_normal_comment(self):
140 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
141 <!-- foo bar -->
142 </div>""")
143 self.assertEqual("""<div>
144 <!-- foo bar -->
145 </div>""", str(tmpl.generate()))
146
147 def test_template_comment(self):
148 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
149 <!-- !foo -->
150 <!--!bar-->
151 </div>""")
152 self.assertEqual("""<div>
153 </div>""", str(tmpl.generate()))
154
155 def test_parse_with_same_namespace_nested(self):
156 tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
157 <span xmlns:py="http://genshi.edgewall.org/">
158 </span>
159 </div>""")
160 self.assertEqual("""<div>
161 <span>
162 </span>
163 </div>""", str(tmpl.generate()))
164
165 def test_latin1_encoded_with_xmldecl(self):
166 tmpl = MarkupTemplate(u"""<?xml version="1.0" encoding="iso-8859-1" ?>
167 <div xmlns:py="http://genshi.edgewall.org/">
168 \xf6
169 </div>""".encode('iso-8859-1'), encoding='iso-8859-1')
170 self.assertEqual(u"""<div>
171 \xf6
172 </div>""", unicode(tmpl.generate()))
173
174 def test_latin1_encoded_explicit_encoding(self):
175 tmpl = MarkupTemplate(u"""<div xmlns:py="http://genshi.edgewall.org/">
176 \xf6
177 </div>""".encode('iso-8859-1'), encoding='iso-8859-1')
178 self.assertEqual(u"""<div>
179 \xf6
180 </div>""", unicode(tmpl.generate()))
181
182
183 def suite():
184 suite = unittest.TestSuite()
185 suite.addTest(doctest.DocTestSuite(MarkupTemplate.__module__))
186 suite.addTest(unittest.makeSuite(MarkupTemplateTestCase, 'test'))
187 return suite
188
189 if __name__ == '__main__':
190 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software