|
9 | 9 | import importlib
|
10 | 10 | import inspect
|
11 | 11 | import io
|
| 12 | +import itertools |
12 | 13 | import pickle
|
13 | 14 | import re
|
14 | 15 | import subprocess
|
@@ -7685,6 +7686,71 @@ def f(x: int):
|
7685 | 7686 | self.assertEqual(get_annotations(f), {"x": str})
|
7686 | 7687 |
|
7687 | 7688 |
|
| 7689 | +class TestGetAnnotationsMetaclasses(BaseTestCase): |
| 7690 | + def test_annotated_meta(self): |
| 7691 | + class Meta(type): |
| 7692 | + a: int |
| 7693 | + |
| 7694 | + class X(metaclass=Meta): |
| 7695 | + pass |
| 7696 | + |
| 7697 | + class Y(metaclass=Meta): |
| 7698 | + b: float |
| 7699 | + |
| 7700 | + self.assertEqual(get_annotations(Meta), {"a": int}) |
| 7701 | + self.assertEqual(get_annotations(X), {}) |
| 7702 | + self.assertEqual(get_annotations(Y), {"b": float}) |
| 7703 | + |
| 7704 | + def test_unannotated_meta(self): |
| 7705 | + class Meta(type): pass |
| 7706 | + |
| 7707 | + class X(metaclass=Meta): |
| 7708 | + a: str |
| 7709 | + |
| 7710 | + class Y(X): pass |
| 7711 | + |
| 7712 | + self.assertEqual(get_annotations(Meta), {}) |
| 7713 | + self.assertEqual(get_annotations(Y), {}) |
| 7714 | + self.assertEqual(get_annotations(X), {"a": str}) |
| 7715 | + |
| 7716 | + def test_ordering(self): |
| 7717 | + # Based on a sample by David Ellis |
| 7718 | + # https://discuss.python.org/t/pep-749-implementing-pep-649/54974/38 |
| 7719 | + |
| 7720 | + def make_classes(): |
| 7721 | + class Meta(type): |
| 7722 | + a: int |
| 7723 | + expected_annotations = {"a": int} |
| 7724 | + |
| 7725 | + class A(type, metaclass=Meta): |
| 7726 | + b: float |
| 7727 | + expected_annotations = {"b": float} |
| 7728 | + |
| 7729 | + class B(metaclass=A): |
| 7730 | + c: str |
| 7731 | + expected_annotations = {"c": str} |
| 7732 | + |
| 7733 | + class C(B): |
| 7734 | + expected_annotations = {} |
| 7735 | + |
| 7736 | + class D(metaclass=Meta): |
| 7737 | + expected_annotations = {} |
| 7738 | + |
| 7739 | + return Meta, A, B, C, D |
| 7740 | + |
| 7741 | + classes = make_classes() |
| 7742 | + class_count = len(classes) |
| 7743 | + for order in itertools.permutations(range(class_count), class_count): |
| 7744 | + names = ", ".join(classes[i].__name__ for i in order) |
| 7745 | + with self.subTest(names=names): |
| 7746 | + classes = make_classes() # Regenerate classes |
| 7747 | + for i in order: |
| 7748 | + get_annotations(classes[i]) |
| 7749 | + for c in classes: |
| 7750 | + with self.subTest(c=c): |
| 7751 | + self.assertEqual(get_annotations(c), c.expected_annotations) |
| 7752 | + |
| 7753 | + |
7688 | 7754 | @skipIf(STRINGIZED_ANNOTATIONS_PEP_695 is None, "PEP 695 has yet to be")
|
7689 | 7755 | class TestGetAnnotationsWithPEP695(BaseTestCase):
|
7690 | 7756 | @classmethod
|
|
0 commit comments