Edgewall Software

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

Last change on this file was 856, checked in by cmlenz, 15 years ago

Fix expression interpolation for expression containing triple-quoted multiline strings. Thanks to Armin Ronacher for reporting the issue and providing a patch.

  • Property svn:eol-style set to native
File size: 7.4 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2007-2008 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 sys
16import unittest
17
18from genshi.core import TEXT
19from genshi.template.base import TemplateSyntaxError, EXPR
20from genshi.template.interpolation import interpolate
21
22
23class InterpolateTestCase(unittest.TestCase):
24
25    def test_interpolate_string(self):
26        parts = list(interpolate('bla'))
27        self.assertEqual(1, len(parts))
28        self.assertEqual(TEXT, parts[0][0])
29        self.assertEqual('bla', parts[0][1])
30
31    def test_interpolate_simple(self):
32        parts = list(interpolate('${bla}'))
33        self.assertEqual(1, len(parts))
34        self.assertEqual(EXPR, parts[0][0])
35        self.assertEqual('bla', parts[0][1].source)
36
37    def test_interpolate_escaped(self):
38        parts = list(interpolate('$${bla}'))
39        self.assertEqual(1, len(parts))
40        self.assertEqual(TEXT, parts[0][0])
41        self.assertEqual('${bla}', parts[0][1])
42
43    def test_interpolate_dobuleescaped(self):
44        parts = list(interpolate('$$${bla}'))
45        self.assertEqual(2, len(parts))
46        self.assertEqual(TEXT, parts[0][0])
47        self.assertEqual('$', parts[0][1])
48        self.assertEqual(EXPR, parts[1][0])
49        self.assertEqual('bla', parts[1][1].source)
50
51    def test_interpolate_short(self):
52        parts = list(interpolate('$bla'))
53        self.assertEqual(1, len(parts))
54        self.assertEqual(EXPR, parts[0][0])
55        self.assertEqual('bla', parts[0][1].source)
56
57    def test_interpolate_short_escaped(self):
58        parts = list(interpolate('$$bla'))
59        self.assertEqual(1, len(parts))
60        self.assertEqual(TEXT, parts[0][0])
61        self.assertEqual('$bla', parts[0][1])
62
63    def test_interpolate_short_escaped_2(self):
64        parts = list(interpolate('my $$bla = 2'))
65        self.assertEqual(1, len(parts))
66        self.assertEqual(TEXT, parts[0][0])
67        self.assertEqual('my $bla = 2', parts[0][1])
68
69    def test_interpolate_short_doubleescaped(self):
70        parts = list(interpolate('$$$bla'))
71        self.assertEqual(2, len(parts))
72        self.assertEqual(TEXT, parts[0][0])
73        self.assertEqual('$', parts[0][1])
74        self.assertEqual(EXPR, parts[1][0])
75        self.assertEqual('bla', parts[1][1].source)
76
77    def test_interpolate_short_starting_with_underscore(self):
78        parts = list(interpolate('$_bla'))
79        self.assertEqual(1, len(parts))
80        self.assertEqual(EXPR, parts[0][0])
81        self.assertEqual('_bla', parts[0][1].source)
82
83    def test_interpolate_short_containing_underscore(self):
84        parts = list(interpolate('$foo_bar'))
85        self.assertEqual(1, len(parts))
86        self.assertEqual(EXPR, parts[0][0])
87        self.assertEqual('foo_bar', parts[0][1].source)
88
89    def test_interpolate_short_starting_with_dot(self):
90        parts = list(interpolate('$.bla'))
91        self.assertEqual(1, len(parts))
92        self.assertEqual(TEXT, parts[0][0])
93        self.assertEqual('$.bla', parts[0][1])
94
95    def test_interpolate_short_containing_dot(self):
96        parts = list(interpolate('$foo.bar'))
97        self.assertEqual(1, len(parts))
98        self.assertEqual(EXPR, parts[0][0])
99        self.assertEqual('foo.bar', parts[0][1].source)
100
101    def test_interpolate_short_starting_with_digit(self):
102        parts = list(interpolate('$0bla'))
103        self.assertEqual(1, len(parts))
104        self.assertEqual(TEXT, parts[0][0])
105        self.assertEqual('$0bla', parts[0][1])
106
107    def test_interpolate_short_containing_digit(self):
108        parts = list(interpolate('$foo0'))
109        self.assertEqual(1, len(parts))
110        self.assertEqual(EXPR, parts[0][0])
111        self.assertEqual('foo0', parts[0][1].source)
112
113    def test_interpolate_short_starting_with_digit(self):
114        parts = list(interpolate('$0bla'))
115        self.assertEqual(1, len(parts))
116        self.assertEqual(TEXT, parts[0][0])
117        self.assertEqual('$0bla', parts[0][1])
118
119    def test_interpolate_short_containing_digit(self):
120        parts = list(interpolate('$foo0'))
121        self.assertEqual(1, len(parts))
122        self.assertEqual(EXPR, parts[0][0])
123        self.assertEqual('foo0', parts[0][1].source)
124
125    def test_interpolate_full_nested_brackets(self):
126        parts = list(interpolate('${{1:2}}'))
127        self.assertEqual(1, len(parts))
128        self.assertEqual(EXPR, parts[0][0])
129        self.assertEqual('{1:2}', parts[0][1].source)
130
131    def test_interpolate_full_mismatched_brackets(self):
132        try:
133            list(interpolate('${{1:2}'))
134        except TemplateSyntaxError, e:
135            pass
136        else:
137            self.fail('Expected TemplateSyntaxError')
138
139    def test_interpolate_quoted_brackets_1(self):
140        parts = list(interpolate('${"}"}'))
141        self.assertEqual(1, len(parts))
142        self.assertEqual(EXPR, parts[0][0])
143        self.assertEqual('"}"', parts[0][1].source)
144
145    def test_interpolate_quoted_brackets_2(self):
146        parts = list(interpolate("${'}'}"))
147        self.assertEqual(1, len(parts))
148        self.assertEqual(EXPR, parts[0][0])
149        self.assertEqual("'}'", parts[0][1].source)
150
151    def test_interpolate_quoted_brackets_3(self):
152        parts = list(interpolate("${'''}'''}"))
153        self.assertEqual(1, len(parts))
154        self.assertEqual(EXPR, parts[0][0])
155        self.assertEqual("'''}'''", parts[0][1].source)
156
157    def test_interpolate_quoted_brackets_4(self):
158        parts = list(interpolate("${'''}\"\"\"'''}"))
159        self.assertEqual(1, len(parts))
160        self.assertEqual(EXPR, parts[0][0])
161        self.assertEqual("'''}\"\"\"'''", parts[0][1].source)
162
163    def test_interpolate_quoted_brackets_5(self):
164        parts = list(interpolate(r"${'\'}'}"))
165        self.assertEqual(1, len(parts))
166        self.assertEqual(EXPR, parts[0][0])
167        self.assertEqual(r"'\'}'", parts[0][1].source)
168
169    def test_interpolate_mixed1(self):
170        parts = list(interpolate('$foo bar $baz'))
171        self.assertEqual(3, len(parts))
172        self.assertEqual(EXPR, parts[0][0])
173        self.assertEqual('foo', parts[0][1].source)
174        self.assertEqual(TEXT, parts[1][0])
175        self.assertEqual(' bar ', parts[1][1])
176        self.assertEqual(EXPR, parts[2][0])
177        self.assertEqual('baz', parts[2][1].source)
178
179    def test_interpolate_mixed2(self):
180        parts = list(interpolate('foo $bar baz'))
181        self.assertEqual(3, len(parts))
182        self.assertEqual(TEXT, parts[0][0])
183        self.assertEqual('foo ', parts[0][1])
184        self.assertEqual(EXPR, parts[1][0])
185        self.assertEqual('bar', parts[1][1].source)
186        self.assertEqual(TEXT, parts[2][0])
187        self.assertEqual(' baz', parts[2][1])
188
189    def test_interpolate_triplequoted(self):
190        parts = list(interpolate('${"""foo\nbar"""}'))
191        self.assertEqual(1, len(parts))
192        self.assertEqual('"""foo\nbar"""', parts[0][1].source)
193
194
195def suite():
196    suite = unittest.TestSuite()
197    suite.addTest(doctest.DocTestSuite(interpolate.__module__))
198    suite.addTest(unittest.makeSuite(InterpolateTestCase, 'test'))
199    return suite
200
201if __name__ == '__main__':
202    unittest.main(defaultTest='suite')
Note: See TracBrowser for help on using the repository browser.