ยปCore Development>Code coverage>Lib/test/test_pep292.py

Python code coverage for Lib/test/test_pep292.py

#countcontent
1n/a# Copyright (C) 2004 Python Software Foundation
2n/a# Author: barry@python.org (Barry Warsaw)
3n/a# License: http://www.opensource.org/licenses/PythonSoftFoundation.php
4n/a
5n/aimport unittest
6n/afrom string import Template
7n/a
8n/a
9n/aclass Bag:
10n/a pass
11n/a
12n/aclass Mapping:
13n/a def __getitem__(self, name):
14n/a obj = self
15n/a for part in name.split('.'):
16n/a try:
17n/a obj = getattr(obj, part)
18n/a except AttributeError:
19n/a raise KeyError(name)
20n/a return obj
21n/a
22n/a
23n/aclass TestTemplate(unittest.TestCase):
24n/a def test_regular_templates(self):
25n/a s = Template('$who likes to eat a bag of $what worth $$100')
26n/a self.assertEqual(s.substitute(dict(who='tim', what='ham')),
27n/a 'tim likes to eat a bag of ham worth $100')
28n/a self.assertRaises(KeyError, s.substitute, dict(who='tim'))
29n/a
30n/a def test_regular_templates_with_braces(self):
31n/a s = Template('$who likes ${what} for ${meal}')
32n/a d = dict(who='tim', what='ham', meal='dinner')
33n/a self.assertEqual(s.substitute(d), 'tim likes ham for dinner')
34n/a self.assertRaises(KeyError, s.substitute,
35n/a dict(who='tim', what='ham'))
36n/a
37n/a def test_escapes(self):
38n/a eq = self.assertEqual
39n/a s = Template('$who likes to eat a bag of $$what worth $$100')
40n/a eq(s.substitute(dict(who='tim', what='ham')),
41n/a 'tim likes to eat a bag of $what worth $100')
42n/a s = Template('$who likes $$')
43n/a eq(s.substitute(dict(who='tim', what='ham')), 'tim likes $')
44n/a
45n/a def test_percents(self):
46n/a eq = self.assertEqual
47n/a s = Template('%(foo)s $foo ${foo}')
48n/a d = dict(foo='baz')
49n/a eq(s.substitute(d), '%(foo)s baz baz')
50n/a eq(s.safe_substitute(d), '%(foo)s baz baz')
51n/a
52n/a def test_stringification(self):
53n/a eq = self.assertEqual
54n/a s = Template('tim has eaten $count bags of ham today')
55n/a d = dict(count=7)
56n/a eq(s.substitute(d), 'tim has eaten 7 bags of ham today')
57n/a eq(s.safe_substitute(d), 'tim has eaten 7 bags of ham today')
58n/a s = Template('tim has eaten ${count} bags of ham today')
59n/a eq(s.substitute(d), 'tim has eaten 7 bags of ham today')
60n/a
61n/a def test_tupleargs(self):
62n/a eq = self.assertEqual
63n/a s = Template('$who ate ${meal}')
64n/a d = dict(who=('tim', 'fred'), meal=('ham', 'kung pao'))
65n/a eq(s.substitute(d), "('tim', 'fred') ate ('ham', 'kung pao')")
66n/a eq(s.safe_substitute(d), "('tim', 'fred') ate ('ham', 'kung pao')")
67n/a
68n/a def test_SafeTemplate(self):
69n/a eq = self.assertEqual
70n/a s = Template('$who likes ${what} for ${meal}')
71n/a eq(s.safe_substitute(dict(who='tim')), 'tim likes ${what} for ${meal}')
72n/a eq(s.safe_substitute(dict(what='ham')), '$who likes ham for ${meal}')
73n/a eq(s.safe_substitute(dict(what='ham', meal='dinner')),
74n/a '$who likes ham for dinner')
75n/a eq(s.safe_substitute(dict(who='tim', what='ham')),
76n/a 'tim likes ham for ${meal}')
77n/a eq(s.safe_substitute(dict(who='tim', what='ham', meal='dinner')),
78n/a 'tim likes ham for dinner')
79n/a
80n/a def test_invalid_placeholders(self):
81n/a raises = self.assertRaises
82n/a s = Template('$who likes $')
83n/a raises(ValueError, s.substitute, dict(who='tim'))
84n/a s = Template('$who likes ${what)')
85n/a raises(ValueError, s.substitute, dict(who='tim'))
86n/a s = Template('$who likes $100')
87n/a raises(ValueError, s.substitute, dict(who='tim'))
88n/a
89n/a def test_idpattern_override(self):
90n/a class PathPattern(Template):
91n/a idpattern = r'[_a-z][._a-z0-9]*'
92n/a m = Mapping()
93n/a m.bag = Bag()
94n/a m.bag.foo = Bag()
95n/a m.bag.foo.who = 'tim'
96n/a m.bag.what = 'ham'
97n/a s = PathPattern('$bag.foo.who likes to eat a bag of $bag.what')
98n/a self.assertEqual(s.substitute(m), 'tim likes to eat a bag of ham')
99n/a
100n/a def test_pattern_override(self):
101n/a class MyPattern(Template):
102n/a pattern = r"""
103n/a (?P<escaped>@{2}) |
104n/a @(?P<named>[_a-z][._a-z0-9]*) |
105n/a @{(?P<braced>[_a-z][._a-z0-9]*)} |
106n/a (?P<invalid>@)
107n/a """
108n/a m = Mapping()
109n/a m.bag = Bag()
110n/a m.bag.foo = Bag()
111n/a m.bag.foo.who = 'tim'
112n/a m.bag.what = 'ham'
113n/a s = MyPattern('@bag.foo.who likes to eat a bag of @bag.what')
114n/a self.assertEqual(s.substitute(m), 'tim likes to eat a bag of ham')
115n/a
116n/a class BadPattern(Template):
117n/a pattern = r"""
118n/a (?P<badname>.*) |
119n/a (?P<escaped>@{2}) |
120n/a @(?P<named>[_a-z][._a-z0-9]*) |
121n/a @{(?P<braced>[_a-z][._a-z0-9]*)} |
122n/a (?P<invalid>@) |
123n/a """
124n/a s = BadPattern('@bag.foo.who likes to eat a bag of @bag.what')
125n/a self.assertRaises(ValueError, s.substitute, {})
126n/a self.assertRaises(ValueError, s.safe_substitute, {})
127n/a
128n/a def test_braced_override(self):
129n/a class MyTemplate(Template):
130n/a pattern = r"""
131n/a \$(?:
132n/a (?P<escaped>$) |
133n/a (?P<named>[_a-z][_a-z0-9]*) |
134n/a @@(?P<braced>[_a-z][_a-z0-9]*)@@ |
135n/a (?P<invalid>) |
136n/a )
137n/a """
138n/a
139n/a tmpl = 'PyCon in $@@location@@'
140n/a t = MyTemplate(tmpl)
141n/a self.assertRaises(KeyError, t.substitute, {})
142n/a val = t.substitute({'location': 'Cleveland'})
143n/a self.assertEqual(val, 'PyCon in Cleveland')
144n/a
145n/a def test_braced_override_safe(self):
146n/a class MyTemplate(Template):
147n/a pattern = r"""
148n/a \$(?:
149n/a (?P<escaped>$) |
150n/a (?P<named>[_a-z][_a-z0-9]*) |
151n/a @@(?P<braced>[_a-z][_a-z0-9]*)@@ |
152n/a (?P<invalid>) |
153n/a )
154n/a """
155n/a
156n/a tmpl = 'PyCon in $@@location@@'
157n/a t = MyTemplate(tmpl)
158n/a self.assertEqual(t.safe_substitute(), tmpl)
159n/a val = t.safe_substitute({'location': 'Cleveland'})
160n/a self.assertEqual(val, 'PyCon in Cleveland')
161n/a
162n/a def test_invalid_with_no_lines(self):
163n/a # The error formatting for invalid templates
164n/a # has a special case for no data that the default
165n/a # pattern can't trigger (always has at least '$')
166n/a # So we craft a pattern that is always invalid
167n/a # with no leading data.
168n/a class MyTemplate(Template):
169n/a pattern = r"""
170n/a (?P<invalid>) |
171n/a unreachable(
172n/a (?P<named>) |
173n/a (?P<braced>) |
174n/a (?P<escaped>)
175n/a )
176n/a """
177n/a s = MyTemplate('')
178n/a with self.assertRaises(ValueError) as err:
179n/a s.substitute({})
180n/a self.assertIn('line 1, col 1', str(err.exception))
181n/a
182n/a def test_unicode_values(self):
183n/a s = Template('$who likes $what')
184n/a d = dict(who='t\xffm', what='f\xfe\fed')
185n/a self.assertEqual(s.substitute(d), 't\xffm likes f\xfe\x0ced')
186n/a
187n/a def test_keyword_arguments(self):
188n/a eq = self.assertEqual
189n/a s = Template('$who likes $what')
190n/a eq(s.substitute(who='tim', what='ham'), 'tim likes ham')
191n/a eq(s.substitute(dict(who='tim'), what='ham'), 'tim likes ham')
192n/a eq(s.substitute(dict(who='fred', what='kung pao'),
193n/a who='tim', what='ham'),
194n/a 'tim likes ham')
195n/a s = Template('the mapping is $mapping')
196n/a eq(s.substitute(dict(foo='none'), mapping='bozo'),
197n/a 'the mapping is bozo')
198n/a eq(s.substitute(dict(mapping='one'), mapping='two'),
199n/a 'the mapping is two')
200n/a
201n/a def test_keyword_arguments_safe(self):
202n/a eq = self.assertEqual
203n/a raises = self.assertRaises
204n/a s = Template('$who likes $what')
205n/a eq(s.safe_substitute(who='tim', what='ham'), 'tim likes ham')
206n/a eq(s.safe_substitute(dict(who='tim'), what='ham'), 'tim likes ham')
207n/a eq(s.safe_substitute(dict(who='fred', what='kung pao'),
208n/a who='tim', what='ham'),
209n/a 'tim likes ham')
210n/a s = Template('the mapping is $mapping')
211n/a eq(s.safe_substitute(dict(foo='none'), mapping='bozo'),
212n/a 'the mapping is bozo')
213n/a eq(s.safe_substitute(dict(mapping='one'), mapping='two'),
214n/a 'the mapping is two')
215n/a d = dict(mapping='one')
216n/a raises(TypeError, s.substitute, d, {})
217n/a raises(TypeError, s.safe_substitute, d, {})
218n/a
219n/a def test_delimiter_override(self):
220n/a eq = self.assertEqual
221n/a raises = self.assertRaises
222n/a class AmpersandTemplate(Template):
223n/a delimiter = '&'
224n/a s = AmpersandTemplate('this &gift is for &{who} &&')
225n/a eq(s.substitute(gift='bud', who='you'), 'this bud is for you &')
226n/a raises(KeyError, s.substitute)
227n/a eq(s.safe_substitute(gift='bud', who='you'), 'this bud is for you &')
228n/a eq(s.safe_substitute(), 'this &gift is for &{who} &')
229n/a s = AmpersandTemplate('this &gift is for &{who} &')
230n/a raises(ValueError, s.substitute, dict(gift='bud', who='you'))
231n/a eq(s.safe_substitute(), 'this &gift is for &{who} &')
232n/a
233n/a class PieDelims(Template):
234n/a delimiter = '@'
235n/a s = PieDelims('@who likes to eat a bag of @{what} worth $100')
236n/a self.assertEqual(s.substitute(dict(who='tim', what='ham')),
237n/a 'tim likes to eat a bag of ham worth $100')
238n/a
239n/a
240n/adef test_main():
241n/a from test import support
242n/a test_classes = [TestTemplate,]
243n/a support.run_unittest(*test_classes)
244n/a
245n/a
246n/aif __name__ == '__main__':
247n/a test_main()