Mercurial > genshi > mirror
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=""foo""/> | |
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') |