Skip to content

Commit 462e225

Browse files
[3.14] gh-141174: Improve annotationlib._Stringifier test coverage (GH-141220) (#141358)
gh-141174: Improve `annotationlib._Stringifier` test coverage (GH-141220) * Test `_Stringifier.__convert_to_ast()` for containers * Test partial evaluation of `ForwardRef`s in `_Stringifier` (cherry picked from commit 55ea132) Co-authored-by: dr-carlos <[email protected]>
1 parent 9a5cf6f commit 462e225

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

Lib/test/test_annotationlib.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ def f(
119119
alpha: some | obj,
120120
beta: +some,
121121
gamma: some < obj,
122+
delta: some | {obj: module},
123+
epsilon: some | {obj, module},
124+
zeta: some | [obj],
125+
eta: some | (),
122126
):
123127
pass
124128

@@ -147,6 +151,69 @@ def f(
147151
self.assertIsInstance(gamma_anno, ForwardRef)
148152
self.assertEqual(gamma_anno, support.EqualToForwardRef("some < obj", owner=f))
149153

154+
delta_anno = anno["delta"]
155+
self.assertIsInstance(delta_anno, ForwardRef)
156+
self.assertEqual(delta_anno, support.EqualToForwardRef("some | {obj: module}", owner=f))
157+
158+
epsilon_anno = anno["epsilon"]
159+
self.assertIsInstance(epsilon_anno, ForwardRef)
160+
self.assertEqual(epsilon_anno, support.EqualToForwardRef("some | {obj, module}", owner=f))
161+
162+
zeta_anno = anno["zeta"]
163+
self.assertIsInstance(zeta_anno, ForwardRef)
164+
self.assertEqual(zeta_anno, support.EqualToForwardRef("some | [obj]", owner=f))
165+
166+
eta_anno = anno["eta"]
167+
self.assertIsInstance(eta_anno, ForwardRef)
168+
self.assertEqual(eta_anno, support.EqualToForwardRef("some | ()", owner=f))
169+
170+
def test_partially_nonexistent(self):
171+
# These annotations start with a non-existent variable and then use
172+
# global types with defined values. This partially evaluates by putting
173+
# those globals into `fwdref.__extra_names__`.
174+
def f(
175+
x: obj | int,
176+
y: container[int:obj, int],
177+
z: dict_val | {str: int},
178+
alpha: set_val | {str, int},
179+
beta: obj | bool | int,
180+
gamma: obj | call_func(int, kwd=bool),
181+
):
182+
pass
183+
184+
def func(*args, **kwargs):
185+
return Union[*args, *(kwargs.values())]
186+
187+
anno = get_annotations(f, format=Format.FORWARDREF)
188+
globals_ = {
189+
"obj": str, "container": list, "dict_val": {1: 2}, "set_val": {1, 2},
190+
"call_func": func
191+
}
192+
193+
x_anno = anno["x"]
194+
self.assertIsInstance(x_anno, ForwardRef)
195+
self.assertEqual(x_anno.evaluate(globals=globals_), str | int)
196+
197+
y_anno = anno["y"]
198+
self.assertIsInstance(y_anno, ForwardRef)
199+
self.assertEqual(y_anno.evaluate(globals=globals_), list[int:str, int])
200+
201+
z_anno = anno["z"]
202+
self.assertIsInstance(z_anno, ForwardRef)
203+
self.assertEqual(z_anno.evaluate(globals=globals_), {1: 2} | {str: int})
204+
205+
alpha_anno = anno["alpha"]
206+
self.assertIsInstance(alpha_anno, ForwardRef)
207+
self.assertEqual(alpha_anno.evaluate(globals=globals_), {1, 2} | {str, int})
208+
209+
beta_anno = anno["beta"]
210+
self.assertIsInstance(beta_anno, ForwardRef)
211+
self.assertEqual(beta_anno.evaluate(globals=globals_), str | bool | int)
212+
213+
gamma_anno = anno["gamma"]
214+
self.assertIsInstance(gamma_anno, ForwardRef)
215+
self.assertEqual(gamma_anno.evaluate(globals=globals_), str | func(int, kwd=bool))
216+
150217
def test_partially_nonexistent_union(self):
151218
# Test unions with '|' syntax equal unions with typing.Union[] with some forwardrefs
152219
class UnionForwardrefs:

0 commit comments

Comments
 (0)