Coverage for tdom / format_test.py: 100%
58 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-17 23:32 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-17 23:32 +0000
1from string.templatelib import Interpolation
3from .format import convert, format_interpolation, format_template
6class Convertible:
7 def __str__(self) -> str:
8 return "Convertible str"
10 def __repr__(self) -> str:
11 return "Convertible repr"
14def test_convert_none():
15 value = Convertible()
16 assert convert(value, None) is value
19def test_convert_a():
20 value = Convertible()
21 assert convert(value, "a") == "Convertible repr"
22 assert convert("Café", "a") == "'Caf\\xe9'"
25def test_convert_r():
26 value = Convertible()
27 assert convert(value, "r") == "Convertible repr"
30def test_convert_s():
31 value = Convertible()
32 assert convert(value, "s") == "Convertible str"
35def test_format_interpolation_no_formatting():
36 value = Convertible()
37 interp = Interpolation(value, expression="", conversion=None, format_spec="")
38 assert format_interpolation(interp) is value
41def test_format_interpolation_a():
42 value = Convertible()
43 interp = Interpolation(value, expression="", conversion="a", format_spec="")
44 assert format_interpolation(interp) == "Convertible repr"
47def test_format_interpolation_r():
48 value = Convertible()
49 interp = Interpolation(value, expression="", conversion="r", format_spec="")
50 assert format_interpolation(interp) == "Convertible repr"
53def test_format_interpolation_s():
54 value = Convertible()
55 interp = Interpolation(value, expression="", conversion="s", format_spec="")
56 assert format_interpolation(interp) == "Convertible str"
59def test_format_interpolation_default_formatting():
60 value = 42
61 interp = Interpolation(value, expression="", conversion=None, format_spec="5d")
62 assert format_interpolation(interp) == " 42"
65def test_format_interpolation_custom_formatter_match_exact():
66 value = 42
67 interp = Interpolation(value, expression="", conversion=None, format_spec="custom")
69 def formatter(val: object, spec: str) -> str:
70 return f"formatted-{val}-{spec}"
72 assert (
73 format_interpolation(interp, formatters=[("custom", formatter)])
74 == "formatted-42-custom"
75 )
78def test_format_interpolation_custom_formatter_match_predicate():
79 value = 42
80 interp = Interpolation(
81 value, expression="", conversion=None, format_spec="custom123"
82 )
84 def matcher(spec: str) -> bool:
85 return spec.startswith("custom")
87 def formatter(val: object, spec: str) -> str:
88 return f"formatted-{val}-{spec}"
90 assert (
91 format_interpolation(interp, formatters=[(matcher, formatter)])
92 == "formatted-42-custom123"
93 )
96def test_format_template():
97 t = t"Value: {42.19:.1f}, Text: {Convertible()!s}, Raw: {Convertible()!r}"
98 result = format_template(t)
99 assert result == "Value: 42.2, Text: Convertible str, Raw: Convertible repr"