|
16 | 16 | import types |
17 | 17 | import unittest |
18 | 18 | import warnings |
| 19 | +from collections import OrderedDict |
19 | 20 | from operator import neg |
20 | | -from test.support import TESTFN, unlink, run_unittest, check_warnings |
| 21 | +from test.support import (TESTFN, unlink, run_unittest, check_warnings, |
| 22 | + cpython_only) |
21 | 23 | from test.support.script_helper import assert_python_ok |
22 | 24 | try: |
23 | 25 | import pty, signal |
@@ -1778,6 +1780,194 @@ def test_type_doc(self): |
1778 | 1780 | A.__doc__ = doc |
1779 | 1781 | self.assertEqual(A.__doc__, doc) |
1780 | 1782 |
|
| 1783 | + def test_type_definition_order_nonempty(self): |
| 1784 | + class Spam: |
| 1785 | + b = 1 |
| 1786 | + c = 3 |
| 1787 | + a = 2 |
| 1788 | + d = 4 |
| 1789 | + eggs = 2 |
| 1790 | + e = 5 |
| 1791 | + b = 42 |
| 1792 | + |
| 1793 | + self.assertEqual(Spam.__definition_order__, |
| 1794 | + ('__module__', '__qualname__', |
| 1795 | + 'b', 'c', 'a', 'd', 'eggs', 'e')) |
| 1796 | + |
| 1797 | + def test_type_definition_order_empty(self): |
| 1798 | + class Empty: |
| 1799 | + pass |
| 1800 | + |
| 1801 | + self.assertEqual(Empty.__definition_order__, |
| 1802 | + ('__module__', '__qualname__')) |
| 1803 | + |
| 1804 | + def test_type_definition_order_on_instance(self): |
| 1805 | + class Spam: |
| 1806 | + a = 2 |
| 1807 | + b = 1 |
| 1808 | + c = 3 |
| 1809 | + with self.assertRaises(AttributeError): |
| 1810 | + Spam().__definition_order__ |
| 1811 | + |
| 1812 | + def test_type_definition_order_set_to_None(self): |
| 1813 | + class Spam: |
| 1814 | + a = 2 |
| 1815 | + b = 1 |
| 1816 | + c = 3 |
| 1817 | + Spam.__definition_order__ = None |
| 1818 | + self.assertEqual(Spam.__definition_order__, None) |
| 1819 | + |
| 1820 | + def test_type_definition_order_set_to_tuple(self): |
| 1821 | + class Spam: |
| 1822 | + a = 2 |
| 1823 | + b = 1 |
| 1824 | + c = 3 |
| 1825 | + Spam.__definition_order__ = ('x', 'y', 'z') |
| 1826 | + self.assertEqual(Spam.__definition_order__, ('x', 'y', 'z')) |
| 1827 | + |
| 1828 | + def test_type_definition_order_deleted(self): |
| 1829 | + class Spam: |
| 1830 | + a = 2 |
| 1831 | + b = 1 |
| 1832 | + c = 3 |
| 1833 | + del Spam.__definition_order__ |
| 1834 | + self.assertEqual(Spam.__definition_order__, None) |
| 1835 | + |
| 1836 | + def test_type_definition_order_set_to_bad_type(self): |
| 1837 | + class Spam: |
| 1838 | + a = 2 |
| 1839 | + b = 1 |
| 1840 | + c = 3 |
| 1841 | + Spam.__definition_order__ = 42 |
| 1842 | + self.assertEqual(Spam.__definition_order__, 42) |
| 1843 | + |
| 1844 | + def test_type_definition_order_builtins(self): |
| 1845 | + self.assertEqual(object.__definition_order__, None) |
| 1846 | + self.assertEqual(type.__definition_order__, None) |
| 1847 | + self.assertEqual(dict.__definition_order__, None) |
| 1848 | + self.assertEqual(type(None).__definition_order__, None) |
| 1849 | + |
| 1850 | + def test_type_definition_order_dunder_names_included(self): |
| 1851 | + class Dunder: |
| 1852 | + VAR = 3 |
| 1853 | + def __init__(self): |
| 1854 | + pass |
| 1855 | + |
| 1856 | + self.assertEqual(Dunder.__definition_order__, |
| 1857 | + ('__module__', '__qualname__', |
| 1858 | + 'VAR', '__init__')) |
| 1859 | + |
| 1860 | + def test_type_definition_order_only_dunder_names(self): |
| 1861 | + class DunderOnly: |
| 1862 | + __xyz__ = None |
| 1863 | + def __init__(self): |
| 1864 | + pass |
| 1865 | + |
| 1866 | + self.assertEqual(DunderOnly.__definition_order__, |
| 1867 | + ('__module__', '__qualname__', |
| 1868 | + '__xyz__', '__init__')) |
| 1869 | + |
| 1870 | + def test_type_definition_order_underscore_names(self): |
| 1871 | + class HalfDunder: |
| 1872 | + __whether_to_be = True |
| 1873 | + or_not_to_be__ = False |
| 1874 | + |
| 1875 | + self.assertEqual(HalfDunder.__definition_order__, |
| 1876 | + ('__module__', '__qualname__', |
| 1877 | + '_HalfDunder__whether_to_be', 'or_not_to_be__')) |
| 1878 | + |
| 1879 | + def test_type_definition_order_with_slots(self): |
| 1880 | + class Slots: |
| 1881 | + __slots__ = ('x', 'y') |
| 1882 | + a = 1 |
| 1883 | + b = 2 |
| 1884 | + |
| 1885 | + self.assertEqual(Slots.__definition_order__, |
| 1886 | + ('__module__', '__qualname__', |
| 1887 | + '__slots__', 'a', 'b')) |
| 1888 | + |
| 1889 | + def test_type_definition_order_overwritten_None(self): |
| 1890 | + class OverwrittenNone: |
| 1891 | + __definition_order__ = None |
| 1892 | + a = 1 |
| 1893 | + b = 2 |
| 1894 | + c = 3 |
| 1895 | + |
| 1896 | + self.assertEqual(OverwrittenNone.__definition_order__, None) |
| 1897 | + |
| 1898 | + def test_type_definition_order_overwritten_tuple(self): |
| 1899 | + class OverwrittenTuple: |
| 1900 | + __definition_order__ = ('x', 'y', 'z') |
| 1901 | + a = 1 |
| 1902 | + b = 2 |
| 1903 | + c = 3 |
| 1904 | + |
| 1905 | + self.assertEqual(OverwrittenTuple.__definition_order__, |
| 1906 | + ('x', 'y', 'z')) |
| 1907 | + |
| 1908 | + def test_type_definition_order_overwritten_bad_item(self): |
| 1909 | + with self.assertRaises(TypeError): |
| 1910 | + class PoorlyOverwritten: |
| 1911 | + __definition_order__ = ('a', 2, 'c') |
| 1912 | + a = 1 |
| 1913 | + b = 2 |
| 1914 | + c = 3 |
| 1915 | + |
| 1916 | + def test_type_definition_order_overwritten_bad_type(self): |
| 1917 | + with self.assertRaises(TypeError): |
| 1918 | + class PoorlyOverwritten: |
| 1919 | + __definition_order__ = ['a', 2, 'c'] |
| 1920 | + a = 1 |
| 1921 | + b = 2 |
| 1922 | + c = 3 |
| 1923 | + |
| 1924 | + def test_type_definition_order_metaclass(self): |
| 1925 | + class Meta(type): |
| 1926 | + SPAM = 42 |
| 1927 | + |
| 1928 | + def __init__(self, *args, **kwargs): |
| 1929 | + super().__init__(*args, **kwargs) |
| 1930 | + |
| 1931 | + self.assertEqual(Meta.__definition_order__, |
| 1932 | + ('__module__', '__qualname__', |
| 1933 | + 'SPAM', '__init__')) |
| 1934 | + |
| 1935 | + def test_type_definition_order_OrderedDict(self): |
| 1936 | + class Meta(type): |
| 1937 | + def __prepare__(self, *args, **kwargs): |
| 1938 | + return OrderedDict() |
| 1939 | + |
| 1940 | + class WithODict(metaclass=Meta): |
| 1941 | + x='y' |
| 1942 | + |
| 1943 | + self.assertEqual(WithODict.__definition_order__, |
| 1944 | + ('__module__', '__qualname__', 'x')) |
| 1945 | + |
| 1946 | + class Meta(type): |
| 1947 | + def __prepare__(self, *args, **kwargs): |
| 1948 | + class ODictSub(OrderedDict): |
| 1949 | + pass |
| 1950 | + return ODictSub() |
| 1951 | + |
| 1952 | + class WithODictSub(metaclass=Meta): |
| 1953 | + x='y' |
| 1954 | + |
| 1955 | + self.assertEqual(WithODictSub.__definition_order__, |
| 1956 | + ('__module__', '__qualname__', 'x')) |
| 1957 | + |
| 1958 | + @cpython_only |
| 1959 | + def test_type_definition_order_cpython(self): |
| 1960 | + # some implementations will have an ordered-by-default dict. |
| 1961 | + |
| 1962 | + class Meta(type): |
| 1963 | + def __prepare__(self, *args, **kwargs): |
| 1964 | + return {} |
| 1965 | + |
| 1966 | + class NotOrdered(metaclass=Meta): |
| 1967 | + x='y' |
| 1968 | + |
| 1969 | + self.assertEqual(NotOrdered.__definition_order__, None) |
| 1970 | + |
1781 | 1971 | def test_bad_args(self): |
1782 | 1972 | with self.assertRaises(TypeError): |
1783 | 1973 | type() |
|
0 commit comments