1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
import pickle
import unittest
from collections.abc import Iterator, Iterable
from string.templatelib import Template, Interpolation
from test.test_string._support import TStringBaseCase, fstring
class TestTemplate(unittest.TestCase, TStringBaseCase):
def test_common(self):
self.assertEqual(type(t'').__name__, 'Template')
self.assertEqual(type(t'').__qualname__, 'Template')
self.assertEqual(type(t'').__module__, 'string.templatelib')
a = 'a'
i = t'{a}'.interpolations[0]
self.assertEqual(type(i).__name__, 'Interpolation')
self.assertEqual(type(i).__qualname__, 'Interpolation')
self.assertEqual(type(i).__module__, 'string.templatelib')
def test_final_types(self):
with self.assertRaisesRegex(TypeError, 'is not an acceptable base type'):
class Sub(Template): ...
with self.assertRaisesRegex(TypeError, 'is not an acceptable base type'):
class Sub(Interpolation): ...
def test_basic_creation(self):
# Simple t-string creation
t = t'Hello, world'
self.assertIsInstance(t, Template)
self.assertTStringEqual(t, ('Hello, world',), ())
self.assertEqual(fstring(t), 'Hello, world')
# Empty t-string
t = t''
self.assertTStringEqual(t, ('',), ())
self.assertEqual(fstring(t), '')
# Multi-line t-string
t = t"""Hello,
world"""
self.assertEqual(t.strings, ('Hello,\nworld',))
self.assertEqual(len(t.interpolations), 0)
self.assertEqual(fstring(t), 'Hello,\nworld')
def test_creation_interleaving(self):
# Should add strings on either side
t = Template(Interpolation('Maria', 'name', None, ''))
self.assertTStringEqual(t, ('', ''), [('Maria', 'name')])
self.assertEqual(fstring(t), 'Maria')
# Should prepend empty string
t = Template(Interpolation('Maria', 'name', None, ''), ' is my name')
self.assertTStringEqual(t, ('', ' is my name'), [('Maria', 'name')])
self.assertEqual(fstring(t), 'Maria is my name')
# Should append empty string
t = Template('Hello, ', Interpolation('Maria', 'name', None, ''))
self.assertTStringEqual(t, ('Hello, ', ''), [('Maria', 'name')])
self.assertEqual(fstring(t), 'Hello, Maria')
# Should concatenate strings
t = Template('Hello', ', ', Interpolation('Maria', 'name', None, ''),
'!')
self.assertTStringEqual(t, ('Hello, ', '!'), [('Maria', 'name')])
self.assertEqual(fstring(t), 'Hello, Maria!')
# Should add strings on either side and in between
t = Template(Interpolation('Maria', 'name', None, ''),
Interpolation('Python', 'language', None, ''))
self.assertTStringEqual(
t, ('', '', ''), [('Maria', 'name'), ('Python', 'language')]
)
self.assertEqual(fstring(t), 'MariaPython')
def test_template_values(self):
t = t'Hello, world'
self.assertEqual(t.values, ())
name = "Lys"
t = t'Hello, {name}'
self.assertEqual(t.values, ("Lys",))
country = "GR"
age = 0
t = t'Hello, {name}, {age} from {country}'
self.assertEqual(t.values, ("Lys", 0, "GR"))
def test_pickle_template(self):
user = 'test'
for template in (
t'',
t"No values",
t'With inter {user}',
t'With ! {user!r}',
t'With format {1 / 0.3:.2f}',
Template(),
Template('a'),
Template(Interpolation('Nikita', 'name', None, '')),
Template('a', Interpolation('Nikita', 'name', 'r', '')),
):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
with self.subTest(proto=proto, template=template):
pickled = pickle.dumps(template, protocol=proto)
unpickled = pickle.loads(pickled)
self.assertEqual(unpickled.values, template.values)
self.assertEqual(fstring(unpickled), fstring(template))
def test_pickle_interpolation(self):
for interpolation in (
Interpolation('Nikita', 'name', None, ''),
Interpolation('Nikita', 'name', 'r', ''),
Interpolation(1/3, 'x', None, '.2f'),
):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
with self.subTest(proto=proto, interpolation=interpolation):
pickled = pickle.dumps(interpolation, protocol=proto)
unpickled = pickle.loads(pickled)
self.assertEqual(unpickled.value, interpolation.value)
self.assertEqual(unpickled.expression, interpolation.expression)
self.assertEqual(unpickled.conversion, interpolation.conversion)
self.assertEqual(unpickled.format_spec, interpolation.format_spec)
class TemplateIterTests(unittest.TestCase):
def test_abc(self):
self.assertIsInstance(iter(t''), Iterable)
self.assertIsInstance(iter(t''), Iterator)
def test_final(self):
TemplateIter = type(iter(t''))
with self.assertRaisesRegex(TypeError, 'is not an acceptable base type'):
class Sub(TemplateIter): ...
def test_iter(self):
x = 1
res = list(iter(t'abc {x} yz'))
self.assertEqual(res[0], 'abc ')
self.assertIsInstance(res[1], Interpolation)
self.assertEqual(res[1].value, 1)
self.assertEqual(res[1].expression, 'x')
self.assertEqual(res[1].conversion, None)
self.assertEqual(res[1].format_spec, '')
self.assertEqual(res[2], ' yz')
if __name__ == '__main__':
unittest.main()
|