Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Lib/test/test_string/_support.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,37 @@
import unittest
from string.templatelib import Interpolation


class TStringTestCase(unittest.TestCase):
def assertTStringEqual(self, t, strings, interpolations):
"""Test template string literal equality.

The *strings* argument must be a tuple of strings equal to *t.strings*.

The *interpolations* argument must be a sequence of tuples which are
compared against *t.interpolations*. Each tuple consists of
(value, expression, conversion, format_spec), though the final two
items may be omitted, and are assumed to be None and '' respectively.
"""
self.assertEqual(t.strings, strings)
self.assertEqual(len(t.interpolations), len(interpolations))

for i, exp in zip(t.interpolations, interpolations, strict=True):
if len(exp) == 4:
actual = (i.value, i.expression, i.conversion, i.format_spec)
self.assertEqual(actual, exp)
continue

if len(exp) == 3:
self.assertEqual((i.value, i.expression, i.conversion), exp)
self.assertEqual(i.format_spec, '')
continue

self.assertEqual((i.value, i.expression), exp)
self.assertEqual(i.format_spec, '')
self.assertIsNone(i.conversion)


def convert(value, conversion):
if conversion == "a":
return ascii(value)
Expand Down
83 changes: 30 additions & 53 deletions Lib/test/test_string/test_templatelib.py
Original file line number Diff line number Diff line change
@@ -1,78 +1,55 @@
import unittest
from string.templatelib import Template, Interpolation

from test.test_string._support import f
from test.test_string._support import TStringTestCase, f


class TestTemplate(unittest.TestCase):
class TestTemplate(TStringTestCase):

def test_basic_creation(self):
# Simple t-string creation
t = t"Hello, world"
self.assertTrue(isinstance(t, Template))
self.assertEqual(t.strings, ("Hello, world",))
self.assertEqual(len(t.interpolations), 0)
self.assertEqual(f(t), "Hello, world")
t = t'Hello, world'
self.assertIsInstance(t, Template)
self.assertTStringEqual(t, ('Hello, world',), ())
self.assertEqual(f(t), 'Hello, world')

# Empty t-string
t = t""
self.assertEqual(t.strings, ("",))
self.assertEqual(len(t.interpolations), 0)
self.assertEqual(f(t), "")
t = t''
self.assertTStringEqual(t, ('',), ())
self.assertEqual(f(t), '')

# Multi-line t-string
t = t"""Hello,
world"""
self.assertEqual(t.strings, ("Hello,\nworld",))
self.assertEqual(t.strings, ('Hello,\nworld',))
self.assertEqual(len(t.interpolations), 0)
self.assertEqual(f(t), "Hello,\nworld")
self.assertEqual(f(t), 'Hello,\nworld')

def test_creation_interleaving(self):
# Should add strings on either side
t = Template(Interpolation("Maria", "name", None, ""))
self.assertEqual(t.strings, ("", ""))
self.assertEqual(t.interpolations[0].value, "Maria")
self.assertEqual(t.interpolations[0].expression, "name")
self.assertEqual(t.interpolations[0].conversion, None)
self.assertEqual(t.interpolations[0].format_spec, "")
self.assertEqual(f(t), "Maria")
t = Template(Interpolation('Maria', 'name', None, ''))
self.assertTStringEqual(t, ('', ''), [('Maria', 'name')])
self.assertEqual(f(t), 'Maria')

# Should prepend empty string
t = Template(Interpolation("Maria", "name", None, ""), " is my name")
self.assertEqual(t.strings, ("", " is my name"))
self.assertEqual(t.interpolations[0].value, "Maria")
self.assertEqual(t.interpolations[0].expression, "name")
self.assertEqual(t.interpolations[0].conversion, None)
self.assertEqual(t.interpolations[0].format_spec, "")
self.assertEqual(f(t), "Maria is my name")
t = Template(Interpolation('Maria', 'name', None, ''), ' is my name')
self.assertTStringEqual(t, ('', ' is my name'), [('Maria', 'name')])
self.assertEqual(f(t), 'Maria is my name')

# Should append empty string
t = Template("Hello, ", Interpolation("Maria", "name", None, ""))
self.assertEqual(t.strings, ("Hello, ", ""))
self.assertEqual(t.interpolations[0].value, "Maria")
self.assertEqual(t.interpolations[0].expression, "name")
self.assertEqual(t.interpolations[0].conversion, None)
self.assertEqual(t.interpolations[0].format_spec, "")
self.assertEqual(f(t), "Hello, Maria")
t = Template('Hello, ', Interpolation('Maria', 'name', None, ''))
self.assertTStringEqual(t, ('Hello, ', ''), [('Maria', 'name')])
self.assertEqual(f(t), 'Hello, Maria')

# Should concatenate strings
t = Template("Hello", ", ", Interpolation("Maria", "name", None, ""), "!")
self.assertEqual(t.strings, ("Hello, ", "!"))
self.assertEqual(t.interpolations[0].value, "Maria")
self.assertEqual(t.interpolations[0].expression, "name")
self.assertEqual(t.interpolations[0].conversion, None)
self.assertEqual(t.interpolations[0].format_spec, "")
self.assertEqual(f(t), "Hello, Maria!")
t = Template('Hello', ', ', Interpolation('Maria', 'name', None, ''),
'!')
self.assertTStringEqual(t, ('Hello, ', '!'), [('Maria', 'name')])
self.assertEqual(f(t), 'Hello, Maria!')

# Should add strings on either side and in between
t = Template(Interpolation("Maria", "name", None, ""), Interpolation("Python", "language", None, ""))
self.assertEqual(t.strings, ("", "", ""))
self.assertEqual(t.interpolations[0].value, "Maria")
self.assertEqual(t.interpolations[0].expression, "name")
self.assertEqual(t.interpolations[0].conversion, None)
self.assertEqual(t.interpolations[0].format_spec, "")
self.assertEqual(t.interpolations[1].value, "Python")
self.assertEqual(t.interpolations[1].expression, "language")
self.assertEqual(t.interpolations[1].conversion, None)
self.assertEqual(t.interpolations[1].format_spec, "")
self.assertEqual(f(t), "MariaPython")
t = Template(Interpolation('Maria', 'name', None, ''),
Interpolation('Python', 'language', None, ''))
self.assertTStringEqual(
t, ('', '', ''), [('Maria', 'name'), ('Python', 'language')]
)
self.assertEqual(f(t), 'MariaPython')
Loading