Edgewall Software

source: trunk/genshi/template/tests/text.py

Last change on this file was 1255, checked in by hodgestar, 10 years ago

Support slash escaped of CRLF newlines (fixes #569; patch from tetsuya.morimoto@…).

  • Property svn:eol-style set to native
File size: 8.7 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2006-2009 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
14import doctest
15import os
16import shutil
17import tempfile
18import unittest
19
20from genshi.template.base import TemplateSyntaxError
21from genshi.template.loader import TemplateLoader
22from genshi.template.text import OldTextTemplate, NewTextTemplate
23
24
25class OldTextTemplateTestCase(unittest.TestCase):
26    """Tests for text template processing."""
27
28    def setUp(self):
29        self.dirname = tempfile.mkdtemp(suffix='markup_test')
30
31    def tearDown(self):
32        shutil.rmtree(self.dirname)
33
34    def test_escaping(self):
35        tmpl = OldTextTemplate('\\#escaped')
36        self.assertEqual('#escaped', tmpl.generate().render(encoding=None))
37
38    def test_comment(self):
39        tmpl = OldTextTemplate('## a comment')
40        self.assertEqual('', tmpl.generate().render(encoding=None))
41
42    def test_comment_escaping(self):
43        tmpl = OldTextTemplate('\\## escaped comment')
44        self.assertEqual('## escaped comment',
45                         tmpl.generate().render(encoding=None))
46
47    def test_end_with_args(self):
48        tmpl = OldTextTemplate("""
49        #if foo
50          bar
51        #end 'if foo'""")
52        self.assertEqual('\n', tmpl.generate(foo=False).render(encoding=None))
53
54    def test_latin1_encoded(self):
55        text = u'$foo\xf6$bar'.encode('iso-8859-1')
56        tmpl = OldTextTemplate(text, encoding='iso-8859-1')
57        self.assertEqual(u'x\xf6y',
58                         tmpl.generate(foo='x', bar='y').render(encoding=None))
59
60    def test_unicode_input(self):
61        text = u'$foo\xf6$bar'
62        tmpl = OldTextTemplate(text)
63        self.assertEqual(u'x\xf6y',
64                         tmpl.generate(foo='x', bar='y').render(encoding=None))
65
66    def test_empty_lines1(self):
67        tmpl = OldTextTemplate("""Your items:
68
69        #for item in items
70          * ${item}
71        #end""")
72        self.assertEqual("""Your items:
73
74          * 0
75          * 1
76          * 2
77""", tmpl.generate(items=range(3)).render(encoding=None))
78
79    def test_empty_lines2(self):
80        tmpl = OldTextTemplate("""Your items:
81
82        #for item in items
83          * ${item}
84
85        #end""")
86        self.assertEqual("""Your items:
87
88          * 0
89
90          * 1
91
92          * 2
93
94""", tmpl.generate(items=range(3)).render(encoding=None))
95
96    def test_include(self):
97        file1 = open(os.path.join(self.dirname, 'tmpl1.txt'), 'wb')
98        try:
99            file1.write(u"Included\n".encode("utf-8"))
100        finally:
101            file1.close()
102
103        file2 = open(os.path.join(self.dirname, 'tmpl2.txt'), 'wb')
104        try:
105            file2.write(u"""----- Included data below this line -----
106            #include tmpl1.txt
107            ----- Included data above this line -----""".encode("utf-8"))
108        finally:
109            file2.close()
110
111        loader = TemplateLoader([self.dirname])
112        tmpl = loader.load('tmpl2.txt', cls=OldTextTemplate)
113        self.assertEqual("""----- Included data below this line -----
114Included
115            ----- Included data above this line -----""",
116                         tmpl.generate().render(encoding=None))
117
118
119class NewTextTemplateTestCase(unittest.TestCase):
120    """Tests for text template processing."""
121
122    def setUp(self):
123        self.dirname = tempfile.mkdtemp(suffix='markup_test')
124
125    def tearDown(self):
126        shutil.rmtree(self.dirname)
127
128    def test_escaping(self):
129        tmpl = NewTextTemplate('\\{% escaped %}')
130        self.assertEqual('{% escaped %}',
131                         tmpl.generate().render(encoding=None))
132
133    def test_comment(self):
134        tmpl = NewTextTemplate('{# a comment #}')
135        self.assertEqual('', tmpl.generate().render(encoding=None))
136
137    def test_comment_escaping(self):
138        tmpl = NewTextTemplate('\\{# escaped comment #}')
139        self.assertEqual('{# escaped comment #}',
140                         tmpl.generate().render(encoding=None))
141
142    def test_end_with_args(self):
143        tmpl = NewTextTemplate("""
144{% if foo %}
145  bar
146{% end 'if foo' %}""")
147        self.assertEqual('\n', tmpl.generate(foo=False).render(encoding=None))
148
149    def test_latin1_encoded(self):
150        text = u'$foo\xf6$bar'.encode('iso-8859-1')
151        tmpl = NewTextTemplate(text, encoding='iso-8859-1')
152        self.assertEqual(u'x\xf6y',
153                         tmpl.generate(foo='x', bar='y').render(encoding=None))
154
155    def test_unicode_input(self):
156        text = u'$foo\xf6$bar'
157        tmpl = NewTextTemplate(text)
158        self.assertEqual(u'x\xf6y',
159                         tmpl.generate(foo='x', bar='y').render(encoding=None))
160
161    def test_empty_lines1(self):
162        tmpl = NewTextTemplate("""Your items:
163
164{% for item in items %}\
165  * ${item}
166{% end %}""")
167        self.assertEqual("""Your items:
168
169  * 0
170  * 1
171  * 2
172""", tmpl.generate(items=range(3)).render(encoding=None))
173
174    def test_empty_lines1_with_crlf(self):
175        tmpl = NewTextTemplate('Your items:\r\n'
176'\r\n'
177'{% for item in items %}\\\r\n'
178'  * ${item}\r\n'
179'{% end %}')
180
181        self.assertEqual('Your items:\r\n'
182'\r\n'
183'  * 0\r\n'
184'  * 1\r\n'
185'  * 2\r\n', tmpl.generate(items=range(3)).render(encoding=None))
186
187    def test_empty_lines2(self):
188        tmpl = NewTextTemplate("""Your items:
189
190{% for item in items %}\
191  * ${item}
192
193{% end %}""")
194        self.assertEqual("""Your items:
195
196  * 0
197
198  * 1
199
200  * 2
201
202""", tmpl.generate(items=range(3)).render(encoding=None))
203
204    def test_empty_lines2_with_crlf(self):
205        tmpl = NewTextTemplate('Your items:\r\n'
206'\r\n'
207'{% for item in items %}\\\r\n'
208'  * ${item}\r\n'
209'\r\n'
210'{% end %}')
211        self.assertEqual('Your items:\r\n'
212'\r\n'
213'  * 0\r\n'
214'\r\n'
215'  * 1\r\n'
216'\r\n'
217'  * 2\r\n'
218'\r\n', tmpl.generate(items=range(3)).render(encoding=None))
219
220    def test_exec_with_trailing_space(self):
221        """
222        Verify that a code block with trailing space does not cause a syntax
223        error (see ticket #127).
224        """
225        NewTextTemplate("""
226          {% python
227            bar = 42
228          $}
229        """)
230
231    def test_exec_import(self):
232        tmpl = NewTextTemplate("""{% python from datetime import timedelta %}
233        ${timedelta(days=2)}
234        """)
235        self.assertEqual("""
236        2 days, 0:00:00
237        """, tmpl.generate().render(encoding=None))
238
239    def test_exec_def(self):
240        tmpl = NewTextTemplate("""{% python
241        def foo():
242            return 42
243        %}
244        ${foo()}
245        """)
246        self.assertEqual("""
247        42
248        """, tmpl.generate().render(encoding=None))
249
250    def test_include(self):
251        file1 = open(os.path.join(self.dirname, 'tmpl1.txt'), 'wb')
252        try:
253            file1.write(u"Included".encode("utf-8"))
254        finally:
255            file1.close()
256
257        file2 = open(os.path.join(self.dirname, 'tmpl2.txt'), 'wb')
258        try:
259            file2.write(u"""----- Included data below this line -----
260{% include tmpl1.txt %}
261----- Included data above this line -----""".encode("utf-8"))
262        finally:
263            file2.close()
264
265        loader = TemplateLoader([self.dirname])
266        tmpl = loader.load('tmpl2.txt', cls=NewTextTemplate)
267        self.assertEqual("""----- Included data below this line -----
268Included
269----- Included data above this line -----""",
270                         tmpl.generate().render(encoding=None))
271
272    def test_include_expr(self):
273         file1 = open(os.path.join(self.dirname, 'tmpl1.txt'), 'wb')
274         try:
275             file1.write(u"Included".encode("utf-8"))
276         finally:
277             file1.close()
278 
279         file2 = open(os.path.join(self.dirname, 'tmpl2.txt'), 'wb')
280         try:
281             file2.write(u"""----- Included data below this line -----
282    {% include ${'%s.txt' % ('tmpl1',)} %}
283    ----- Included data above this line -----""".encode("utf-8"))
284         finally:
285             file2.close()
286
287         loader = TemplateLoader([self.dirname])
288         tmpl = loader.load('tmpl2.txt', cls=NewTextTemplate)
289         self.assertEqual("""----- Included data below this line -----
290    Included
291    ----- Included data above this line -----""",
292                          tmpl.generate().render(encoding=None))
293
294
295def suite():
296    suite = unittest.TestSuite()
297    suite.addTest(doctest.DocTestSuite(NewTextTemplate.__module__))
298    suite.addTest(unittest.makeSuite(OldTextTemplateTestCase, 'test'))
299    suite.addTest(unittest.makeSuite(NewTextTemplateTestCase, 'test'))
300    return suite
301
302if __name__ == '__main__':
303    unittest.main(defaultTest='suite')
Note: See TracBrowser for help on using the repository browser.