xref: /third_party/python/Lib/test/test_enum.py (revision 7db96d56)
17db96d56Sopenharmony_ciimport copy
27db96d56Sopenharmony_ciimport enum
37db96d56Sopenharmony_ciimport doctest
47db96d56Sopenharmony_ciimport inspect
57db96d56Sopenharmony_ciimport os
67db96d56Sopenharmony_ciimport pydoc
77db96d56Sopenharmony_ciimport sys
87db96d56Sopenharmony_ciimport unittest
97db96d56Sopenharmony_ciimport threading
107db96d56Sopenharmony_ciimport typing
117db96d56Sopenharmony_ciimport builtins as bltns
127db96d56Sopenharmony_cifrom collections import OrderedDict
137db96d56Sopenharmony_cifrom datetime import date
147db96d56Sopenharmony_cifrom enum import Enum, EnumMeta, IntEnum, StrEnum, EnumType, Flag, IntFlag, unique, auto
157db96d56Sopenharmony_cifrom enum import STRICT, CONFORM, EJECT, KEEP, _simple_enum, _test_simple_enum
167db96d56Sopenharmony_cifrom enum import verify, UNIQUE, CONTINUOUS, NAMED_FLAGS, ReprEnum
177db96d56Sopenharmony_cifrom enum import member, nonmember, _iter_bits_lsb
187db96d56Sopenharmony_cifrom io import StringIO
197db96d56Sopenharmony_cifrom pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL
207db96d56Sopenharmony_cifrom test import support
217db96d56Sopenharmony_cifrom test.support import ALWAYS_EQ
227db96d56Sopenharmony_cifrom test.support import threading_helper
237db96d56Sopenharmony_cifrom textwrap import dedent
247db96d56Sopenharmony_cifrom datetime import timedelta
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cipython_version = sys.version_info[:2]
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_cidef load_tests(loader, tests, ignore):
297db96d56Sopenharmony_ci    tests.addTests(doctest.DocTestSuite(enum))
307db96d56Sopenharmony_ci    if os.path.exists('Doc/library/enum.rst'):
317db96d56Sopenharmony_ci        tests.addTests(doctest.DocFileSuite(
327db96d56Sopenharmony_ci                '../../Doc/library/enum.rst',
337db96d56Sopenharmony_ci                optionflags=doctest.ELLIPSIS|doctest.NORMALIZE_WHITESPACE,
347db96d56Sopenharmony_ci                ))
357db96d56Sopenharmony_ci    return tests
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ciMODULE = __name__
387db96d56Sopenharmony_ciSHORT_MODULE = MODULE.split('.')[-1]
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci# for pickle tests
417db96d56Sopenharmony_citry:
427db96d56Sopenharmony_ci    class Stooges(Enum):
437db96d56Sopenharmony_ci        LARRY = 1
447db96d56Sopenharmony_ci        CURLY = 2
457db96d56Sopenharmony_ci        MOE = 3
467db96d56Sopenharmony_ciexcept Exception as exc:
477db96d56Sopenharmony_ci    Stooges = exc
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_citry:
507db96d56Sopenharmony_ci    class IntStooges(int, Enum):
517db96d56Sopenharmony_ci        LARRY = 1
527db96d56Sopenharmony_ci        CURLY = 2
537db96d56Sopenharmony_ci        MOE = 3
547db96d56Sopenharmony_ciexcept Exception as exc:
557db96d56Sopenharmony_ci    IntStooges = exc
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_citry:
587db96d56Sopenharmony_ci    class FloatStooges(float, Enum):
597db96d56Sopenharmony_ci        LARRY = 1.39
607db96d56Sopenharmony_ci        CURLY = 2.72
617db96d56Sopenharmony_ci        MOE = 3.142596
627db96d56Sopenharmony_ciexcept Exception as exc:
637db96d56Sopenharmony_ci    FloatStooges = exc
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_citry:
667db96d56Sopenharmony_ci    class FlagStooges(Flag):
677db96d56Sopenharmony_ci        LARRY = 1
687db96d56Sopenharmony_ci        CURLY = 2
697db96d56Sopenharmony_ci        MOE = 4
707db96d56Sopenharmony_ciexcept Exception as exc:
717db96d56Sopenharmony_ci    FlagStooges = exc
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ciclass FlagStoogesWithZero(Flag):
747db96d56Sopenharmony_ci    NOFLAG = 0
757db96d56Sopenharmony_ci    LARRY = 1
767db96d56Sopenharmony_ci    CURLY = 2
777db96d56Sopenharmony_ci    MOE = 4
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ciclass IntFlagStooges(IntFlag):
807db96d56Sopenharmony_ci    LARRY = 1
817db96d56Sopenharmony_ci    CURLY = 2
827db96d56Sopenharmony_ci    MOE = 4
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ciclass IntFlagStoogesWithZero(IntFlag):
857db96d56Sopenharmony_ci    NOFLAG = 0
867db96d56Sopenharmony_ci    LARRY = 1
877db96d56Sopenharmony_ci    CURLY = 2
887db96d56Sopenharmony_ci    MOE = 4
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci# for pickle test and subclass tests
917db96d56Sopenharmony_ciclass Name(StrEnum):
927db96d56Sopenharmony_ci    BDFL = 'Guido van Rossum'
937db96d56Sopenharmony_ci    FLUFL = 'Barry Warsaw'
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_citry:
967db96d56Sopenharmony_ci    Question = Enum('Question', 'who what when where why', module=__name__)
977db96d56Sopenharmony_ciexcept Exception as exc:
987db96d56Sopenharmony_ci    Question = exc
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_citry:
1017db96d56Sopenharmony_ci    Answer = Enum('Answer', 'him this then there because')
1027db96d56Sopenharmony_ciexcept Exception as exc:
1037db96d56Sopenharmony_ci    Answer = exc
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_citry:
1067db96d56Sopenharmony_ci    Theory = Enum('Theory', 'rule law supposition', qualname='spanish_inquisition')
1077db96d56Sopenharmony_ciexcept Exception as exc:
1087db96d56Sopenharmony_ci    Theory = exc
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci# for doctests
1117db96d56Sopenharmony_citry:
1127db96d56Sopenharmony_ci    class Fruit(Enum):
1137db96d56Sopenharmony_ci        TOMATO = 1
1147db96d56Sopenharmony_ci        BANANA = 2
1157db96d56Sopenharmony_ci        CHERRY = 3
1167db96d56Sopenharmony_ciexcept Exception:
1177db96d56Sopenharmony_ci    pass
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_cidef test_pickle_dump_load(assertion, source, target=None):
1207db96d56Sopenharmony_ci    if target is None:
1217db96d56Sopenharmony_ci        target = source
1227db96d56Sopenharmony_ci    for protocol in range(HIGHEST_PROTOCOL + 1):
1237db96d56Sopenharmony_ci        assertion(loads(dumps(source, protocol=protocol)), target)
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_cidef test_pickle_exception(assertion, exception, obj):
1267db96d56Sopenharmony_ci    for protocol in range(HIGHEST_PROTOCOL + 1):
1277db96d56Sopenharmony_ci        with assertion(exception):
1287db96d56Sopenharmony_ci            dumps(obj, protocol=protocol)
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ciclass TestHelpers(unittest.TestCase):
1317db96d56Sopenharmony_ci    # _is_descriptor, _is_sunder, _is_dunder
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci    sunder_names = '_bad_', '_good_', '_what_ho_'
1347db96d56Sopenharmony_ci    dunder_names = '__mal__', '__bien__', '__que_que__'
1357db96d56Sopenharmony_ci    private_names = '_MyEnum__private', '_MyEnum__still_private'
1367db96d56Sopenharmony_ci    private_and_sunder_names = '_MyEnum__private_', '_MyEnum__also_private_'
1377db96d56Sopenharmony_ci    random_names = 'okay', '_semi_private', '_weird__', '_MyEnum__'
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci    def test_is_descriptor(self):
1407db96d56Sopenharmony_ci        class foo:
1417db96d56Sopenharmony_ci            pass
1427db96d56Sopenharmony_ci        for attr in ('__get__','__set__','__delete__'):
1437db96d56Sopenharmony_ci            obj = foo()
1447db96d56Sopenharmony_ci            self.assertFalse(enum._is_descriptor(obj))
1457db96d56Sopenharmony_ci            setattr(obj, attr, 1)
1467db96d56Sopenharmony_ci            self.assertTrue(enum._is_descriptor(obj))
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci    def test_sunder(self):
1497db96d56Sopenharmony_ci        for name in self.sunder_names + self.private_and_sunder_names:
1507db96d56Sopenharmony_ci            self.assertTrue(enum._is_sunder(name), '%r is a not sunder name?' % name)
1517db96d56Sopenharmony_ci        for name in self.dunder_names + self.private_names + self.random_names:
1527db96d56Sopenharmony_ci            self.assertFalse(enum._is_sunder(name), '%r is a sunder name?' % name)
1537db96d56Sopenharmony_ci        for s in ('_a_', '_aa_'):
1547db96d56Sopenharmony_ci            self.assertTrue(enum._is_sunder(s))
1557db96d56Sopenharmony_ci        for s in ('a', 'a_', '_a', '__a', 'a__', '__a__', '_a__', '__a_', '_',
1567db96d56Sopenharmony_ci                '__', '___', '____', '_____',):
1577db96d56Sopenharmony_ci            self.assertFalse(enum._is_sunder(s))
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci    def test_dunder(self):
1607db96d56Sopenharmony_ci        for name in self.dunder_names:
1617db96d56Sopenharmony_ci            self.assertTrue(enum._is_dunder(name), '%r is a not dunder name?' % name)
1627db96d56Sopenharmony_ci        for name in self.sunder_names + self.private_names + self.private_and_sunder_names + self.random_names:
1637db96d56Sopenharmony_ci            self.assertFalse(enum._is_dunder(name), '%r is a dunder name?' % name)
1647db96d56Sopenharmony_ci        for s in ('__a__', '__aa__'):
1657db96d56Sopenharmony_ci            self.assertTrue(enum._is_dunder(s))
1667db96d56Sopenharmony_ci        for s in ('a', 'a_', '_a', '__a', 'a__', '_a_', '_a__', '__a_', '_',
1677db96d56Sopenharmony_ci                '__', '___', '____', '_____',):
1687db96d56Sopenharmony_ci            self.assertFalse(enum._is_dunder(s))
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci    def test_is_private(self):
1727db96d56Sopenharmony_ci        for name in self.private_names + self.private_and_sunder_names:
1737db96d56Sopenharmony_ci            self.assertTrue(enum._is_private('MyEnum', name), '%r is a not private name?')
1747db96d56Sopenharmony_ci        for name in self.sunder_names + self.dunder_names + self.random_names:
1757db96d56Sopenharmony_ci            self.assertFalse(enum._is_private('MyEnum', name), '%r is a private name?')
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci    def test_iter_bits_lsb(self):
1787db96d56Sopenharmony_ci        self.assertEqual(list(_iter_bits_lsb(7)), [1, 2, 4])
1797db96d56Sopenharmony_ci        self.assertRaisesRegex(ValueError, '-8 is not a positive integer', list, _iter_bits_lsb(-8))
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci# for subclassing tests
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ciclass classproperty:
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
1877db96d56Sopenharmony_ci        self.fget = fget
1887db96d56Sopenharmony_ci        self.fset = fset
1897db96d56Sopenharmony_ci        self.fdel = fdel
1907db96d56Sopenharmony_ci        if doc is None and fget is not None:
1917db96d56Sopenharmony_ci            doc = fget.__doc__
1927db96d56Sopenharmony_ci        self.__doc__ = doc
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci    def __get__(self, instance, ownerclass):
1957db96d56Sopenharmony_ci        return self.fget(ownerclass)
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci# for global repr tests
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci@enum.global_enum
2007db96d56Sopenharmony_ciclass HeadlightsK(IntFlag, boundary=enum.KEEP):
2017db96d56Sopenharmony_ci    OFF_K = 0
2027db96d56Sopenharmony_ci    LOW_BEAM_K = auto()
2037db96d56Sopenharmony_ci    HIGH_BEAM_K = auto()
2047db96d56Sopenharmony_ci    FOG_K = auto()
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci@enum.global_enum
2087db96d56Sopenharmony_ciclass HeadlightsC(IntFlag, boundary=enum.CONFORM):
2097db96d56Sopenharmony_ci    OFF_C = 0
2107db96d56Sopenharmony_ci    LOW_BEAM_C = auto()
2117db96d56Sopenharmony_ci    HIGH_BEAM_C = auto()
2127db96d56Sopenharmony_ci    FOG_C = auto()
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci@enum.global_enum
2167db96d56Sopenharmony_ciclass NoName(Flag):
2177db96d56Sopenharmony_ci    ONE = 1
2187db96d56Sopenharmony_ci    TWO = 2
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci# tests
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ciclass _EnumTests:
2247db96d56Sopenharmony_ci    """
2257db96d56Sopenharmony_ci    Test for behavior that is the same across the different types of enumerations.
2267db96d56Sopenharmony_ci    """
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci    values = None
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    def setUp(self):
2317db96d56Sopenharmony_ci        class BaseEnum(self.enum_type):
2327db96d56Sopenharmony_ci            @enum.property
2337db96d56Sopenharmony_ci            def first(self):
2347db96d56Sopenharmony_ci                return '%s is first!' % self.name
2357db96d56Sopenharmony_ci        class MainEnum(BaseEnum):
2367db96d56Sopenharmony_ci            first = auto()
2377db96d56Sopenharmony_ci            second = auto()
2387db96d56Sopenharmony_ci            third = auto()
2397db96d56Sopenharmony_ci            if issubclass(self.enum_type, Flag):
2407db96d56Sopenharmony_ci                dupe = 3
2417db96d56Sopenharmony_ci            else:
2427db96d56Sopenharmony_ci                dupe = third
2437db96d56Sopenharmony_ci        self.MainEnum = MainEnum
2447db96d56Sopenharmony_ci        #
2457db96d56Sopenharmony_ci        class NewStrEnum(self.enum_type):
2467db96d56Sopenharmony_ci            def __str__(self):
2477db96d56Sopenharmony_ci                return self.name.upper()
2487db96d56Sopenharmony_ci            first = auto()
2497db96d56Sopenharmony_ci        self.NewStrEnum = NewStrEnum
2507db96d56Sopenharmony_ci        #
2517db96d56Sopenharmony_ci        class NewFormatEnum(self.enum_type):
2527db96d56Sopenharmony_ci            def __format__(self, spec):
2537db96d56Sopenharmony_ci                return self.name.upper()
2547db96d56Sopenharmony_ci            first = auto()
2557db96d56Sopenharmony_ci        self.NewFormatEnum = NewFormatEnum
2567db96d56Sopenharmony_ci        #
2577db96d56Sopenharmony_ci        class NewStrFormatEnum(self.enum_type):
2587db96d56Sopenharmony_ci            def __str__(self):
2597db96d56Sopenharmony_ci                return self.name.title()
2607db96d56Sopenharmony_ci            def __format__(self, spec):
2617db96d56Sopenharmony_ci                return ''.join(reversed(self.name))
2627db96d56Sopenharmony_ci            first = auto()
2637db96d56Sopenharmony_ci        self.NewStrFormatEnum = NewStrFormatEnum
2647db96d56Sopenharmony_ci        #
2657db96d56Sopenharmony_ci        class NewBaseEnum(self.enum_type):
2667db96d56Sopenharmony_ci            def __str__(self):
2677db96d56Sopenharmony_ci                return self.name.title()
2687db96d56Sopenharmony_ci            def __format__(self, spec):
2697db96d56Sopenharmony_ci                return ''.join(reversed(self.name))
2707db96d56Sopenharmony_ci        class NewSubEnum(NewBaseEnum):
2717db96d56Sopenharmony_ci            first = auto()
2727db96d56Sopenharmony_ci        self.NewSubEnum = NewSubEnum
2737db96d56Sopenharmony_ci        #
2747db96d56Sopenharmony_ci        self.is_flag = False
2757db96d56Sopenharmony_ci        self.names = ['first', 'second', 'third']
2767db96d56Sopenharmony_ci        if issubclass(MainEnum, StrEnum):
2777db96d56Sopenharmony_ci            self.values = self.names
2787db96d56Sopenharmony_ci        elif MainEnum._member_type_ is str:
2797db96d56Sopenharmony_ci            self.values = ['1', '2', '3']
2807db96d56Sopenharmony_ci        elif issubclass(self.enum_type, Flag):
2817db96d56Sopenharmony_ci            self.values = [1, 2, 4]
2827db96d56Sopenharmony_ci            self.is_flag = True
2837db96d56Sopenharmony_ci            self.dupe2 = MainEnum(5)
2847db96d56Sopenharmony_ci        else:
2857db96d56Sopenharmony_ci            self.values = self.values or [1, 2, 3]
2867db96d56Sopenharmony_ci        #
2877db96d56Sopenharmony_ci        if not getattr(self, 'source_values', False):
2887db96d56Sopenharmony_ci            self.source_values = self.values
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci    def assertFormatIsValue(self, spec, member):
2917db96d56Sopenharmony_ci        self.assertEqual(spec.format(member), spec.format(member.value))
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci    def assertFormatIsStr(self, spec, member):
2947db96d56Sopenharmony_ci        self.assertEqual(spec.format(member), spec.format(str(member)))
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    def test_attribute_deletion(self):
2977db96d56Sopenharmony_ci        class Season(self.enum_type):
2987db96d56Sopenharmony_ci            SPRING = auto()
2997db96d56Sopenharmony_ci            SUMMER = auto()
3007db96d56Sopenharmony_ci            AUTUMN = auto()
3017db96d56Sopenharmony_ci            #
3027db96d56Sopenharmony_ci            def spam(cls):
3037db96d56Sopenharmony_ci                pass
3047db96d56Sopenharmony_ci        #
3057db96d56Sopenharmony_ci        self.assertTrue(hasattr(Season, 'spam'))
3067db96d56Sopenharmony_ci        del Season.spam
3077db96d56Sopenharmony_ci        self.assertFalse(hasattr(Season, 'spam'))
3087db96d56Sopenharmony_ci        #
3097db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
3107db96d56Sopenharmony_ci            del Season.SPRING
3117db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
3127db96d56Sopenharmony_ci            del Season.DRY
3137db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
3147db96d56Sopenharmony_ci            del Season.SPRING.name
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci    def test_basics(self):
3177db96d56Sopenharmony_ci        TE = self.MainEnum
3187db96d56Sopenharmony_ci        if self.is_flag:
3197db96d56Sopenharmony_ci            self.assertEqual(repr(TE), "<flag 'MainEnum'>")
3207db96d56Sopenharmony_ci            self.assertEqual(str(TE), "<flag 'MainEnum'>")
3217db96d56Sopenharmony_ci            self.assertEqual(format(TE), "<flag 'MainEnum'>")
3227db96d56Sopenharmony_ci            self.assertTrue(TE(5) is self.dupe2)
3237db96d56Sopenharmony_ci        else:
3247db96d56Sopenharmony_ci            self.assertEqual(repr(TE), "<enum 'MainEnum'>")
3257db96d56Sopenharmony_ci            self.assertEqual(str(TE), "<enum 'MainEnum'>")
3267db96d56Sopenharmony_ci            self.assertEqual(format(TE), "<enum 'MainEnum'>")
3277db96d56Sopenharmony_ci        self.assertEqual(list(TE), [TE.first, TE.second, TE.third])
3287db96d56Sopenharmony_ci        self.assertEqual(
3297db96d56Sopenharmony_ci                [m.name for m in TE],
3307db96d56Sopenharmony_ci                self.names,
3317db96d56Sopenharmony_ci                )
3327db96d56Sopenharmony_ci        self.assertEqual(
3337db96d56Sopenharmony_ci                [m.value for m in TE],
3347db96d56Sopenharmony_ci                self.values,
3357db96d56Sopenharmony_ci                )
3367db96d56Sopenharmony_ci        self.assertEqual(
3377db96d56Sopenharmony_ci                [m.first for m in TE],
3387db96d56Sopenharmony_ci                ['first is first!', 'second is first!', 'third is first!']
3397db96d56Sopenharmony_ci                )
3407db96d56Sopenharmony_ci        for member, name in zip(TE, self.names, strict=True):
3417db96d56Sopenharmony_ci            self.assertIs(TE[name], member)
3427db96d56Sopenharmony_ci        for member, value in zip(TE, self.values, strict=True):
3437db96d56Sopenharmony_ci            self.assertIs(TE(value), member)
3447db96d56Sopenharmony_ci        if issubclass(TE, StrEnum):
3457db96d56Sopenharmony_ci            self.assertTrue(TE.dupe is TE('third') is TE['dupe'])
3467db96d56Sopenharmony_ci        elif TE._member_type_ is str:
3477db96d56Sopenharmony_ci            self.assertTrue(TE.dupe is TE('3') is TE['dupe'])
3487db96d56Sopenharmony_ci        elif issubclass(TE, Flag):
3497db96d56Sopenharmony_ci            self.assertTrue(TE.dupe is TE(3) is TE['dupe'])
3507db96d56Sopenharmony_ci        else:
3517db96d56Sopenharmony_ci            self.assertTrue(TE.dupe is TE(self.values[2]) is TE['dupe'])
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci    def test_bool_is_true(self):
3547db96d56Sopenharmony_ci        class Empty(self.enum_type):
3557db96d56Sopenharmony_ci            pass
3567db96d56Sopenharmony_ci        self.assertTrue(Empty)
3577db96d56Sopenharmony_ci        #
3587db96d56Sopenharmony_ci        self.assertTrue(self.MainEnum)
3597db96d56Sopenharmony_ci        for member in self.MainEnum:
3607db96d56Sopenharmony_ci            self.assertTrue(member)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci    def test_changing_member_fails(self):
3637db96d56Sopenharmony_ci        MainEnum = self.MainEnum
3647db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
3657db96d56Sopenharmony_ci            self.MainEnum.second = 'really first'
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci    @unittest.skipIf(
3687db96d56Sopenharmony_ci            python_version >= (3, 12),
3697db96d56Sopenharmony_ci            '__contains__ now returns True/False for all inputs',
3707db96d56Sopenharmony_ci            )
3717db96d56Sopenharmony_ci    def test_contains_er(self):
3727db96d56Sopenharmony_ci        MainEnum = self.MainEnum
3737db96d56Sopenharmony_ci        self.assertIn(MainEnum.third, MainEnum)
3747db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3757db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
3767db96d56Sopenharmony_ci                self.source_values[1] in MainEnum
3777db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3787db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
3797db96d56Sopenharmony_ci                'first' in MainEnum
3807db96d56Sopenharmony_ci        val = MainEnum.dupe
3817db96d56Sopenharmony_ci        self.assertIn(val, MainEnum)
3827db96d56Sopenharmony_ci        #
3837db96d56Sopenharmony_ci        class OtherEnum(Enum):
3847db96d56Sopenharmony_ci            one = auto()
3857db96d56Sopenharmony_ci            two = auto()
3867db96d56Sopenharmony_ci        self.assertNotIn(OtherEnum.two, MainEnum)
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci    @unittest.skipIf(
3897db96d56Sopenharmony_ci            python_version < (3, 12),
3907db96d56Sopenharmony_ci            '__contains__ works only with enum memmbers before 3.12',
3917db96d56Sopenharmony_ci            )
3927db96d56Sopenharmony_ci    def test_contains_tf(self):
3937db96d56Sopenharmony_ci        MainEnum = self.MainEnum
3947db96d56Sopenharmony_ci        self.assertIn(MainEnum.first, MainEnum)
3957db96d56Sopenharmony_ci        self.assertTrue(self.source_values[0] in MainEnum)
3967db96d56Sopenharmony_ci        self.assertFalse('first' in MainEnum)
3977db96d56Sopenharmony_ci        val = MainEnum.dupe
3987db96d56Sopenharmony_ci        self.assertIn(val, MainEnum)
3997db96d56Sopenharmony_ci        #
4007db96d56Sopenharmony_ci        class OtherEnum(Enum):
4017db96d56Sopenharmony_ci            one = auto()
4027db96d56Sopenharmony_ci            two = auto()
4037db96d56Sopenharmony_ci        self.assertNotIn(OtherEnum.two, MainEnum)
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci    def test_dir_on_class(self):
4067db96d56Sopenharmony_ci        TE = self.MainEnum
4077db96d56Sopenharmony_ci        self.assertEqual(set(dir(TE)), set(enum_dir(TE)))
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci    def test_dir_on_item(self):
4107db96d56Sopenharmony_ci        TE = self.MainEnum
4117db96d56Sopenharmony_ci        self.assertEqual(set(dir(TE.first)), set(member_dir(TE.first)))
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci    def test_dir_with_added_behavior(self):
4147db96d56Sopenharmony_ci        class Test(self.enum_type):
4157db96d56Sopenharmony_ci            this = auto()
4167db96d56Sopenharmony_ci            these = auto()
4177db96d56Sopenharmony_ci            def wowser(self):
4187db96d56Sopenharmony_ci                return ("Wowser! I'm %s!" % self.name)
4197db96d56Sopenharmony_ci        self.assertTrue('wowser' not in dir(Test))
4207db96d56Sopenharmony_ci        self.assertTrue('wowser' in dir(Test.this))
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci    def test_dir_on_sub_with_behavior_on_super(self):
4237db96d56Sopenharmony_ci        # see issue22506
4247db96d56Sopenharmony_ci        class SuperEnum(self.enum_type):
4257db96d56Sopenharmony_ci            def invisible(self):
4267db96d56Sopenharmony_ci                return "did you see me?"
4277db96d56Sopenharmony_ci        class SubEnum(SuperEnum):
4287db96d56Sopenharmony_ci            sample = auto()
4297db96d56Sopenharmony_ci        self.assertTrue('invisible' not in dir(SubEnum))
4307db96d56Sopenharmony_ci        self.assertTrue('invisible' in dir(SubEnum.sample))
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci    def test_dir_on_sub_with_behavior_including_instance_dict_on_super(self):
4337db96d56Sopenharmony_ci        # see issue40084
4347db96d56Sopenharmony_ci        class SuperEnum(self.enum_type):
4357db96d56Sopenharmony_ci            def __new__(cls, *value, **kwds):
4367db96d56Sopenharmony_ci                new = self.enum_type._member_type_.__new__
4377db96d56Sopenharmony_ci                if self.enum_type._member_type_ is object:
4387db96d56Sopenharmony_ci                    obj = new(cls)
4397db96d56Sopenharmony_ci                else:
4407db96d56Sopenharmony_ci                    if isinstance(value[0], tuple):
4417db96d56Sopenharmony_ci                        create_value ,= value[0]
4427db96d56Sopenharmony_ci                    else:
4437db96d56Sopenharmony_ci                        create_value = value
4447db96d56Sopenharmony_ci                    obj = new(cls, *create_value)
4457db96d56Sopenharmony_ci                obj._value_ = value[0] if len(value) == 1 else value
4467db96d56Sopenharmony_ci                obj.description = 'test description'
4477db96d56Sopenharmony_ci                return obj
4487db96d56Sopenharmony_ci        class SubEnum(SuperEnum):
4497db96d56Sopenharmony_ci            sample = self.source_values[1]
4507db96d56Sopenharmony_ci        self.assertTrue('description' not in dir(SubEnum))
4517db96d56Sopenharmony_ci        self.assertTrue('description' in dir(SubEnum.sample), dir(SubEnum.sample))
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci    def test_enum_in_enum_out(self):
4547db96d56Sopenharmony_ci        Main = self.MainEnum
4557db96d56Sopenharmony_ci        self.assertIs(Main(Main.first), Main.first)
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci    def test_hash(self):
4587db96d56Sopenharmony_ci        MainEnum = self.MainEnum
4597db96d56Sopenharmony_ci        mapping = {}
4607db96d56Sopenharmony_ci        mapping[MainEnum.first] = '1225'
4617db96d56Sopenharmony_ci        mapping[MainEnum.second] = '0315'
4627db96d56Sopenharmony_ci        mapping[MainEnum.third] = '0704'
4637db96d56Sopenharmony_ci        self.assertEqual(mapping[MainEnum.second], '0315')
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci    def test_invalid_names(self):
4667db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
4677db96d56Sopenharmony_ci            class Wrong(self.enum_type):
4687db96d56Sopenharmony_ci                mro = 9
4697db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
4707db96d56Sopenharmony_ci            class Wrong(self.enum_type):
4717db96d56Sopenharmony_ci                _create_= 11
4727db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
4737db96d56Sopenharmony_ci            class Wrong(self.enum_type):
4747db96d56Sopenharmony_ci                _get_mixins_ = 9
4757db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
4767db96d56Sopenharmony_ci            class Wrong(self.enum_type):
4777db96d56Sopenharmony_ci                _find_new_ = 1
4787db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
4797db96d56Sopenharmony_ci            class Wrong(self.enum_type):
4807db96d56Sopenharmony_ci                _any_name_ = 9
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci    def test_object_str_override(self):
4837db96d56Sopenharmony_ci        "check that setting __str__ to object's is not reset to Enum's"
4847db96d56Sopenharmony_ci        class Generic(self.enum_type):
4857db96d56Sopenharmony_ci            item = self.source_values[2]
4867db96d56Sopenharmony_ci            def __repr__(self):
4877db96d56Sopenharmony_ci                return "%s.test" % (self._name_, )
4887db96d56Sopenharmony_ci            __str__ = object.__str__
4897db96d56Sopenharmony_ci        self.assertEqual(str(Generic.item), 'item.test')
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci    def test_overridden_str(self):
4927db96d56Sopenharmony_ci        NS = self.NewStrEnum
4937db96d56Sopenharmony_ci        self.assertEqual(str(NS.first), NS.first.name.upper())
4947db96d56Sopenharmony_ci        self.assertEqual(format(NS.first), NS.first.name.upper())
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci    def test_overridden_str_format(self):
4977db96d56Sopenharmony_ci        NSF = self.NewStrFormatEnum
4987db96d56Sopenharmony_ci        self.assertEqual(str(NSF.first), NSF.first.name.title())
4997db96d56Sopenharmony_ci        self.assertEqual(format(NSF.first), ''.join(reversed(NSF.first.name)))
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci    def test_overridden_str_format_inherited(self):
5027db96d56Sopenharmony_ci        NSE = self.NewSubEnum
5037db96d56Sopenharmony_ci        self.assertEqual(str(NSE.first), NSE.first.name.title())
5047db96d56Sopenharmony_ci        self.assertEqual(format(NSE.first), ''.join(reversed(NSE.first.name)))
5057db96d56Sopenharmony_ci
5067db96d56Sopenharmony_ci    def test_programmatic_function_string(self):
5077db96d56Sopenharmony_ci        MinorEnum = self.enum_type('MinorEnum', 'june july august')
5087db96d56Sopenharmony_ci        lst = list(MinorEnum)
5097db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
5107db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
5117db96d56Sopenharmony_ci        self.assertEqual(
5127db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
5137db96d56Sopenharmony_ci                lst,
5147db96d56Sopenharmony_ci                )
5157db96d56Sopenharmony_ci        values = self.values
5167db96d56Sopenharmony_ci        if self.enum_type is StrEnum:
5177db96d56Sopenharmony_ci            values = ['june','july','august']
5187db96d56Sopenharmony_ci        for month, av in zip('june july august'.split(), values):
5197db96d56Sopenharmony_ci            e = MinorEnum[month]
5207db96d56Sopenharmony_ci            self.assertEqual(e.value, av, list(MinorEnum))
5217db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
5227db96d56Sopenharmony_ci            if MinorEnum._member_type_ is not object and issubclass(MinorEnum, MinorEnum._member_type_):
5237db96d56Sopenharmony_ci                self.assertEqual(e, av)
5247db96d56Sopenharmony_ci            else:
5257db96d56Sopenharmony_ci                self.assertNotEqual(e, av)
5267db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
5277db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
5287db96d56Sopenharmony_ci            self.assertIs(e, MinorEnum(av))
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci    def test_programmatic_function_string_list(self):
5317db96d56Sopenharmony_ci        MinorEnum = self.enum_type('MinorEnum', ['june', 'july', 'august'])
5327db96d56Sopenharmony_ci        lst = list(MinorEnum)
5337db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
5347db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
5357db96d56Sopenharmony_ci        self.assertEqual(
5367db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
5377db96d56Sopenharmony_ci                lst,
5387db96d56Sopenharmony_ci                )
5397db96d56Sopenharmony_ci        values = self.values
5407db96d56Sopenharmony_ci        if self.enum_type is StrEnum:
5417db96d56Sopenharmony_ci            values = ['june','july','august']
5427db96d56Sopenharmony_ci        for month, av in zip('june july august'.split(), values):
5437db96d56Sopenharmony_ci            e = MinorEnum[month]
5447db96d56Sopenharmony_ci            self.assertEqual(e.value, av)
5457db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
5467db96d56Sopenharmony_ci            if MinorEnum._member_type_ is not object and issubclass(MinorEnum, MinorEnum._member_type_):
5477db96d56Sopenharmony_ci                self.assertEqual(e, av)
5487db96d56Sopenharmony_ci            else:
5497db96d56Sopenharmony_ci                self.assertNotEqual(e, av)
5507db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
5517db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
5527db96d56Sopenharmony_ci            self.assertIs(e, MinorEnum(av))
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ci    def test_programmatic_function_iterable(self):
5557db96d56Sopenharmony_ci        MinorEnum = self.enum_type(
5567db96d56Sopenharmony_ci                'MinorEnum',
5577db96d56Sopenharmony_ci                (('june', self.source_values[0]), ('july', self.source_values[1]), ('august', self.source_values[2]))
5587db96d56Sopenharmony_ci                )
5597db96d56Sopenharmony_ci        lst = list(MinorEnum)
5607db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
5617db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
5627db96d56Sopenharmony_ci        self.assertEqual(
5637db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
5647db96d56Sopenharmony_ci                lst,
5657db96d56Sopenharmony_ci                )
5667db96d56Sopenharmony_ci        for month, av in zip('june july august'.split(), self.values):
5677db96d56Sopenharmony_ci            e = MinorEnum[month]
5687db96d56Sopenharmony_ci            self.assertEqual(e.value, av)
5697db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
5707db96d56Sopenharmony_ci            if MinorEnum._member_type_ is not object and issubclass(MinorEnum, MinorEnum._member_type_):
5717db96d56Sopenharmony_ci                self.assertEqual(e, av)
5727db96d56Sopenharmony_ci            else:
5737db96d56Sopenharmony_ci                self.assertNotEqual(e, av)
5747db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
5757db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
5767db96d56Sopenharmony_ci            self.assertIs(e, MinorEnum(av))
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci    def test_programmatic_function_from_dict(self):
5797db96d56Sopenharmony_ci        MinorEnum = self.enum_type(
5807db96d56Sopenharmony_ci                'MinorEnum',
5817db96d56Sopenharmony_ci                OrderedDict((('june', self.source_values[0]), ('july', self.source_values[1]), ('august', self.source_values[2])))
5827db96d56Sopenharmony_ci                )
5837db96d56Sopenharmony_ci        lst = list(MinorEnum)
5847db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
5857db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
5867db96d56Sopenharmony_ci        self.assertEqual(
5877db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
5887db96d56Sopenharmony_ci                lst,
5897db96d56Sopenharmony_ci                )
5907db96d56Sopenharmony_ci        for month, av in zip('june july august'.split(), self.values):
5917db96d56Sopenharmony_ci            e = MinorEnum[month]
5927db96d56Sopenharmony_ci            if MinorEnum._member_type_ is not object and issubclass(MinorEnum, MinorEnum._member_type_):
5937db96d56Sopenharmony_ci                self.assertEqual(e, av)
5947db96d56Sopenharmony_ci            else:
5957db96d56Sopenharmony_ci                self.assertNotEqual(e, av)
5967db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
5977db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
5987db96d56Sopenharmony_ci            self.assertIs(e, MinorEnum(av))
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci    def test_repr(self):
6017db96d56Sopenharmony_ci        TE = self.MainEnum
6027db96d56Sopenharmony_ci        if self.is_flag:
6037db96d56Sopenharmony_ci            self.assertEqual(repr(TE(0)), "<MainEnum: 0>")
6047db96d56Sopenharmony_ci            self.assertEqual(repr(TE.dupe), "<MainEnum.dupe: 3>")
6057db96d56Sopenharmony_ci            self.assertEqual(repr(self.dupe2), "<MainEnum.first|third: 5>")
6067db96d56Sopenharmony_ci        elif issubclass(TE, StrEnum):
6077db96d56Sopenharmony_ci            self.assertEqual(repr(TE.dupe), "<MainEnum.third: 'third'>")
6087db96d56Sopenharmony_ci        else:
6097db96d56Sopenharmony_ci            self.assertEqual(repr(TE.dupe), "<MainEnum.third: %r>" % (self.values[2], ), TE._value_repr_)
6107db96d56Sopenharmony_ci        for name, value, member in zip(self.names, self.values, TE, strict=True):
6117db96d56Sopenharmony_ci            self.assertEqual(repr(member), "<MainEnum.%s: %r>" % (member.name, member.value))
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci    def test_repr_override(self):
6147db96d56Sopenharmony_ci        class Generic(self.enum_type):
6157db96d56Sopenharmony_ci            first = auto()
6167db96d56Sopenharmony_ci            second = auto()
6177db96d56Sopenharmony_ci            third = auto()
6187db96d56Sopenharmony_ci            def __repr__(self):
6197db96d56Sopenharmony_ci                return "don't you just love shades of %s?" % self.name
6207db96d56Sopenharmony_ci        self.assertEqual(
6217db96d56Sopenharmony_ci                repr(Generic.third),
6227db96d56Sopenharmony_ci                "don't you just love shades of third?",
6237db96d56Sopenharmony_ci                )
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci    def test_inherited_repr(self):
6267db96d56Sopenharmony_ci        class MyEnum(self.enum_type):
6277db96d56Sopenharmony_ci            def __repr__(self):
6287db96d56Sopenharmony_ci                return "My name is %s." % self.name
6297db96d56Sopenharmony_ci        class MySubEnum(MyEnum):
6307db96d56Sopenharmony_ci            this = auto()
6317db96d56Sopenharmony_ci            that = auto()
6327db96d56Sopenharmony_ci            theother = auto()
6337db96d56Sopenharmony_ci        self.assertEqual(repr(MySubEnum.that), "My name is that.")
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci    def test_multiple_superclasses_repr(self):
6367db96d56Sopenharmony_ci        class _EnumSuperClass(metaclass=EnumMeta):
6377db96d56Sopenharmony_ci            pass
6387db96d56Sopenharmony_ci        class E(_EnumSuperClass, Enum):
6397db96d56Sopenharmony_ci            A = 1
6407db96d56Sopenharmony_ci        self.assertEqual(repr(E.A), "<E.A: 1>")
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci    def test_reversed_iteration_order(self):
6437db96d56Sopenharmony_ci        self.assertEqual(
6447db96d56Sopenharmony_ci                list(reversed(self.MainEnum)),
6457db96d56Sopenharmony_ci                [self.MainEnum.third, self.MainEnum.second, self.MainEnum.first],
6467db96d56Sopenharmony_ci                )
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ciclass _PlainOutputTests:
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci    def test_str(self):
6517db96d56Sopenharmony_ci        TE = self.MainEnum
6527db96d56Sopenharmony_ci        if self.is_flag:
6537db96d56Sopenharmony_ci            self.assertEqual(str(TE(0)), "MainEnum(0)")
6547db96d56Sopenharmony_ci            self.assertEqual(str(TE.dupe), "MainEnum.dupe")
6557db96d56Sopenharmony_ci            self.assertEqual(str(self.dupe2), "MainEnum.first|third")
6567db96d56Sopenharmony_ci        else:
6577db96d56Sopenharmony_ci            self.assertEqual(str(TE.dupe), "MainEnum.third")
6587db96d56Sopenharmony_ci        for name, value, member in zip(self.names, self.values, TE, strict=True):
6597db96d56Sopenharmony_ci            self.assertEqual(str(member), "MainEnum.%s" % (member.name, ))
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci    def test_format(self):
6627db96d56Sopenharmony_ci        TE = self.MainEnum
6637db96d56Sopenharmony_ci        if self.is_flag:
6647db96d56Sopenharmony_ci            self.assertEqual(format(TE.dupe), "MainEnum.dupe")
6657db96d56Sopenharmony_ci            self.assertEqual(format(self.dupe2), "MainEnum.first|third")
6667db96d56Sopenharmony_ci        else:
6677db96d56Sopenharmony_ci            self.assertEqual(format(TE.dupe), "MainEnum.third")
6687db96d56Sopenharmony_ci        for name, value, member in zip(self.names, self.values, TE, strict=True):
6697db96d56Sopenharmony_ci            self.assertEqual(format(member), "MainEnum.%s" % (member.name, ))
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ci    def test_overridden_format(self):
6727db96d56Sopenharmony_ci        NF = self.NewFormatEnum
6737db96d56Sopenharmony_ci        self.assertEqual(str(NF.first), "NewFormatEnum.first", '%s %r' % (NF.__str__, NF.first))
6747db96d56Sopenharmony_ci        self.assertEqual(format(NF.first), "FIRST")
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci    def test_format_specs(self):
6777db96d56Sopenharmony_ci        TE = self.MainEnum
6787db96d56Sopenharmony_ci        self.assertFormatIsStr('{}', TE.second)
6797db96d56Sopenharmony_ci        self.assertFormatIsStr('{:}', TE.second)
6807db96d56Sopenharmony_ci        self.assertFormatIsStr('{:20}', TE.second)
6817db96d56Sopenharmony_ci        self.assertFormatIsStr('{:^20}', TE.second)
6827db96d56Sopenharmony_ci        self.assertFormatIsStr('{:>20}', TE.second)
6837db96d56Sopenharmony_ci        self.assertFormatIsStr('{:<20}', TE.second)
6847db96d56Sopenharmony_ci        self.assertFormatIsStr('{:5.2}', TE.second)
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ci
6877db96d56Sopenharmony_ciclass _MixedOutputTests:
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci    def test_str(self):
6907db96d56Sopenharmony_ci        TE = self.MainEnum
6917db96d56Sopenharmony_ci        if self.is_flag:
6927db96d56Sopenharmony_ci            self.assertEqual(str(TE.dupe), "MainEnum.dupe")
6937db96d56Sopenharmony_ci            self.assertEqual(str(self.dupe2), "MainEnum.first|third")
6947db96d56Sopenharmony_ci        else:
6957db96d56Sopenharmony_ci            self.assertEqual(str(TE.dupe), "MainEnum.third")
6967db96d56Sopenharmony_ci        for name, value, member in zip(self.names, self.values, TE, strict=True):
6977db96d56Sopenharmony_ci            self.assertEqual(str(member), "MainEnum.%s" % (member.name, ))
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci    def test_format(self):
7007db96d56Sopenharmony_ci        TE = self.MainEnum
7017db96d56Sopenharmony_ci        if self.is_flag:
7027db96d56Sopenharmony_ci            self.assertEqual(format(TE.dupe), "MainEnum.dupe")
7037db96d56Sopenharmony_ci            self.assertEqual(format(self.dupe2), "MainEnum.first|third")
7047db96d56Sopenharmony_ci        else:
7057db96d56Sopenharmony_ci            self.assertEqual(format(TE.dupe), "MainEnum.third")
7067db96d56Sopenharmony_ci        for name, value, member in zip(self.names, self.values, TE, strict=True):
7077db96d56Sopenharmony_ci            self.assertEqual(format(member), "MainEnum.%s" % (member.name, ))
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_ci    def test_overridden_format(self):
7107db96d56Sopenharmony_ci        NF = self.NewFormatEnum
7117db96d56Sopenharmony_ci        self.assertEqual(str(NF.first), "NewFormatEnum.first")
7127db96d56Sopenharmony_ci        self.assertEqual(format(NF.first), "FIRST")
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci    def test_format_specs(self):
7157db96d56Sopenharmony_ci        TE = self.MainEnum
7167db96d56Sopenharmony_ci        self.assertFormatIsStr('{}', TE.first)
7177db96d56Sopenharmony_ci        self.assertFormatIsStr('{:}', TE.first)
7187db96d56Sopenharmony_ci        self.assertFormatIsStr('{:20}', TE.first)
7197db96d56Sopenharmony_ci        self.assertFormatIsStr('{:^20}', TE.first)
7207db96d56Sopenharmony_ci        self.assertFormatIsStr('{:>20}', TE.first)
7217db96d56Sopenharmony_ci        self.assertFormatIsStr('{:<20}', TE.first)
7227db96d56Sopenharmony_ci        self.assertFormatIsStr('{:5.2}', TE.first)
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ciclass _MinimalOutputTests:
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci    def test_str(self):
7287db96d56Sopenharmony_ci        TE = self.MainEnum
7297db96d56Sopenharmony_ci        if self.is_flag:
7307db96d56Sopenharmony_ci            self.assertEqual(str(TE.dupe), "3")
7317db96d56Sopenharmony_ci            self.assertEqual(str(self.dupe2), "5")
7327db96d56Sopenharmony_ci        else:
7337db96d56Sopenharmony_ci            self.assertEqual(str(TE.dupe), str(self.values[2]))
7347db96d56Sopenharmony_ci        for name, value, member in zip(self.names, self.values, TE, strict=True):
7357db96d56Sopenharmony_ci            self.assertEqual(str(member), str(value))
7367db96d56Sopenharmony_ci
7377db96d56Sopenharmony_ci    def test_format(self):
7387db96d56Sopenharmony_ci        TE = self.MainEnum
7397db96d56Sopenharmony_ci        if self.is_flag:
7407db96d56Sopenharmony_ci            self.assertEqual(format(TE.dupe), "3")
7417db96d56Sopenharmony_ci            self.assertEqual(format(self.dupe2), "5")
7427db96d56Sopenharmony_ci        else:
7437db96d56Sopenharmony_ci            self.assertEqual(format(TE.dupe), format(self.values[2]))
7447db96d56Sopenharmony_ci        for name, value, member in zip(self.names, self.values, TE, strict=True):
7457db96d56Sopenharmony_ci            self.assertEqual(format(member), format(value))
7467db96d56Sopenharmony_ci
7477db96d56Sopenharmony_ci    def test_overridden_format(self):
7487db96d56Sopenharmony_ci        NF = self.NewFormatEnum
7497db96d56Sopenharmony_ci        self.assertEqual(str(NF.first), str(self.values[0]))
7507db96d56Sopenharmony_ci        self.assertEqual(format(NF.first), "FIRST")
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci    def test_format_specs(self):
7537db96d56Sopenharmony_ci        TE = self.MainEnum
7547db96d56Sopenharmony_ci        self.assertFormatIsValue('{}', TE.third)
7557db96d56Sopenharmony_ci        self.assertFormatIsValue('{:}', TE.third)
7567db96d56Sopenharmony_ci        self.assertFormatIsValue('{:20}', TE.third)
7577db96d56Sopenharmony_ci        self.assertFormatIsValue('{:^20}', TE.third)
7587db96d56Sopenharmony_ci        self.assertFormatIsValue('{:>20}', TE.third)
7597db96d56Sopenharmony_ci        self.assertFormatIsValue('{:<20}', TE.third)
7607db96d56Sopenharmony_ci        if TE._member_type_ is float:
7617db96d56Sopenharmony_ci            self.assertFormatIsValue('{:n}', TE.third)
7627db96d56Sopenharmony_ci            self.assertFormatIsValue('{:5.2}', TE.third)
7637db96d56Sopenharmony_ci            self.assertFormatIsValue('{:f}', TE.third)
7647db96d56Sopenharmony_ci
7657db96d56Sopenharmony_ci    def test_copy(self):
7667db96d56Sopenharmony_ci        TE = self.MainEnum
7677db96d56Sopenharmony_ci        copied = copy.copy(TE)
7687db96d56Sopenharmony_ci        self.assertEqual(copied, TE)
7697db96d56Sopenharmony_ci        deep = copy.deepcopy(TE)
7707db96d56Sopenharmony_ci        self.assertEqual(deep, TE)
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ci
7737db96d56Sopenharmony_ciclass _FlagTests:
7747db96d56Sopenharmony_ci
7757db96d56Sopenharmony_ci    def test_default_missing_with_wrong_type_value(self):
7767db96d56Sopenharmony_ci        with self.assertRaisesRegex(
7777db96d56Sopenharmony_ci            ValueError,
7787db96d56Sopenharmony_ci            "'RED' is not a valid ",
7797db96d56Sopenharmony_ci            ) as ctx:
7807db96d56Sopenharmony_ci            self.MainEnum('RED')
7817db96d56Sopenharmony_ci        self.assertIs(ctx.exception.__context__, None)
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ciclass TestPlainEnum(_EnumTests, _PlainOutputTests, unittest.TestCase):
7847db96d56Sopenharmony_ci    enum_type = Enum
7857db96d56Sopenharmony_ci
7867db96d56Sopenharmony_ci
7877db96d56Sopenharmony_ciclass TestPlainFlag(_EnumTests, _PlainOutputTests, _FlagTests, unittest.TestCase):
7887db96d56Sopenharmony_ci    enum_type = Flag
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ciclass TestIntEnum(_EnumTests, _MinimalOutputTests, unittest.TestCase):
7927db96d56Sopenharmony_ci    enum_type = IntEnum
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci
7957db96d56Sopenharmony_ciclass TestStrEnum(_EnumTests, _MinimalOutputTests, unittest.TestCase):
7967db96d56Sopenharmony_ci    enum_type = StrEnum
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ci
7997db96d56Sopenharmony_ciclass TestIntFlag(_EnumTests, _MinimalOutputTests, _FlagTests, unittest.TestCase):
8007db96d56Sopenharmony_ci    enum_type = IntFlag
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ciclass TestMixedInt(_EnumTests, _MixedOutputTests, unittest.TestCase):
8047db96d56Sopenharmony_ci    class enum_type(int, Enum): pass
8057db96d56Sopenharmony_ci
8067db96d56Sopenharmony_ci
8077db96d56Sopenharmony_ciclass TestMixedStr(_EnumTests, _MixedOutputTests, unittest.TestCase):
8087db96d56Sopenharmony_ci    class enum_type(str, Enum): pass
8097db96d56Sopenharmony_ci
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ciclass TestMixedIntFlag(_EnumTests, _MixedOutputTests, _FlagTests, unittest.TestCase):
8127db96d56Sopenharmony_ci    class enum_type(int, Flag): pass
8137db96d56Sopenharmony_ci
8147db96d56Sopenharmony_ci
8157db96d56Sopenharmony_ciclass TestMixedDate(_EnumTests, _MixedOutputTests, unittest.TestCase):
8167db96d56Sopenharmony_ci
8177db96d56Sopenharmony_ci    values = [date(2021, 12, 25), date(2020, 3, 15), date(2019, 11, 27)]
8187db96d56Sopenharmony_ci    source_values = [(2021, 12, 25), (2020, 3, 15), (2019, 11, 27)]
8197db96d56Sopenharmony_ci
8207db96d56Sopenharmony_ci    class enum_type(date, Enum):
8217db96d56Sopenharmony_ci        def _generate_next_value_(name, start, count, last_values):
8227db96d56Sopenharmony_ci            values = [(2021, 12, 25), (2020, 3, 15), (2019, 11, 27)]
8237db96d56Sopenharmony_ci            return values[count]
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ciclass TestMinimalDate(_EnumTests, _MinimalOutputTests, unittest.TestCase):
8277db96d56Sopenharmony_ci
8287db96d56Sopenharmony_ci    values = [date(2023, 12, 1), date(2016, 2, 29), date(2009, 1, 1)]
8297db96d56Sopenharmony_ci    source_values = [(2023, 12, 1), (2016, 2, 29), (2009, 1, 1)]
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci    class enum_type(date, ReprEnum):
8327db96d56Sopenharmony_ci        def _generate_next_value_(name, start, count, last_values):
8337db96d56Sopenharmony_ci            values = [(2023, 12, 1), (2016, 2, 29), (2009, 1, 1)]
8347db96d56Sopenharmony_ci            return values[count]
8357db96d56Sopenharmony_ci
8367db96d56Sopenharmony_ci
8377db96d56Sopenharmony_ciclass TestMixedFloat(_EnumTests, _MixedOutputTests, unittest.TestCase):
8387db96d56Sopenharmony_ci
8397db96d56Sopenharmony_ci    values = [1.1, 2.2, 3.3]
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ci    class enum_type(float, Enum):
8427db96d56Sopenharmony_ci        def _generate_next_value_(name, start, count, last_values):
8437db96d56Sopenharmony_ci            values = [1.1, 2.2, 3.3]
8447db96d56Sopenharmony_ci            return values[count]
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ciclass TestMinimalFloat(_EnumTests, _MinimalOutputTests, unittest.TestCase):
8487db96d56Sopenharmony_ci
8497db96d56Sopenharmony_ci    values = [4.4, 5.5, 6.6]
8507db96d56Sopenharmony_ci
8517db96d56Sopenharmony_ci    class enum_type(float, ReprEnum):
8527db96d56Sopenharmony_ci        def _generate_next_value_(name, start, count, last_values):
8537db96d56Sopenharmony_ci            values = [4.4, 5.5, 6.6]
8547db96d56Sopenharmony_ci            return values[count]
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci
8577db96d56Sopenharmony_ciclass TestSpecial(unittest.TestCase):
8587db96d56Sopenharmony_ci    """
8597db96d56Sopenharmony_ci    various operations that are not attributable to every possible enum
8607db96d56Sopenharmony_ci    """
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ci    def setUp(self):
8637db96d56Sopenharmony_ci        class Season(Enum):
8647db96d56Sopenharmony_ci            SPRING = 1
8657db96d56Sopenharmony_ci            SUMMER = 2
8667db96d56Sopenharmony_ci            AUTUMN = 3
8677db96d56Sopenharmony_ci            WINTER = 4
8687db96d56Sopenharmony_ci        self.Season = Season
8697db96d56Sopenharmony_ci        #
8707db96d56Sopenharmony_ci        class Grades(IntEnum):
8717db96d56Sopenharmony_ci            A = 5
8727db96d56Sopenharmony_ci            B = 4
8737db96d56Sopenharmony_ci            C = 3
8747db96d56Sopenharmony_ci            D = 2
8757db96d56Sopenharmony_ci            F = 0
8767db96d56Sopenharmony_ci        self.Grades = Grades
8777db96d56Sopenharmony_ci        #
8787db96d56Sopenharmony_ci        class Directional(str, Enum):
8797db96d56Sopenharmony_ci            EAST = 'east'
8807db96d56Sopenharmony_ci            WEST = 'west'
8817db96d56Sopenharmony_ci            NORTH = 'north'
8827db96d56Sopenharmony_ci            SOUTH = 'south'
8837db96d56Sopenharmony_ci        self.Directional = Directional
8847db96d56Sopenharmony_ci        #
8857db96d56Sopenharmony_ci        from datetime import date
8867db96d56Sopenharmony_ci        class Holiday(date, Enum):
8877db96d56Sopenharmony_ci            NEW_YEAR = 2013, 1, 1
8887db96d56Sopenharmony_ci            IDES_OF_MARCH = 2013, 3, 15
8897db96d56Sopenharmony_ci        self.Holiday = Holiday
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci    def test_bool(self):
8927db96d56Sopenharmony_ci        # plain Enum members are always True
8937db96d56Sopenharmony_ci        class Logic(Enum):
8947db96d56Sopenharmony_ci            true = True
8957db96d56Sopenharmony_ci            false = False
8967db96d56Sopenharmony_ci        self.assertTrue(Logic.true)
8977db96d56Sopenharmony_ci        self.assertTrue(Logic.false)
8987db96d56Sopenharmony_ci        # unless overridden
8997db96d56Sopenharmony_ci        class RealLogic(Enum):
9007db96d56Sopenharmony_ci            true = True
9017db96d56Sopenharmony_ci            false = False
9027db96d56Sopenharmony_ci            def __bool__(self):
9037db96d56Sopenharmony_ci                return bool(self._value_)
9047db96d56Sopenharmony_ci        self.assertTrue(RealLogic.true)
9057db96d56Sopenharmony_ci        self.assertFalse(RealLogic.false)
9067db96d56Sopenharmony_ci        # mixed Enums depend on mixed-in type
9077db96d56Sopenharmony_ci        class IntLogic(int, Enum):
9087db96d56Sopenharmony_ci            true = 1
9097db96d56Sopenharmony_ci            false = 0
9107db96d56Sopenharmony_ci        self.assertTrue(IntLogic.true)
9117db96d56Sopenharmony_ci        self.assertFalse(IntLogic.false)
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_ci    def test_comparisons(self):
9147db96d56Sopenharmony_ci        Season = self.Season
9157db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9167db96d56Sopenharmony_ci            Season.SPRING < Season.WINTER
9177db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9187db96d56Sopenharmony_ci            Season.SPRING > 4
9197db96d56Sopenharmony_ci        #
9207db96d56Sopenharmony_ci        self.assertNotEqual(Season.SPRING, 1)
9217db96d56Sopenharmony_ci        #
9227db96d56Sopenharmony_ci        class Part(Enum):
9237db96d56Sopenharmony_ci            SPRING = 1
9247db96d56Sopenharmony_ci            CLIP = 2
9257db96d56Sopenharmony_ci            BARREL = 3
9267db96d56Sopenharmony_ci        #
9277db96d56Sopenharmony_ci        self.assertNotEqual(Season.SPRING, Part.SPRING)
9287db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9297db96d56Sopenharmony_ci            Season.SPRING < Part.CLIP
9307db96d56Sopenharmony_ci
9317db96d56Sopenharmony_ci    @unittest.skip('to-do list')
9327db96d56Sopenharmony_ci    def test_dir_with_custom_dunders(self):
9337db96d56Sopenharmony_ci        class PlainEnum(Enum):
9347db96d56Sopenharmony_ci            pass
9357db96d56Sopenharmony_ci        cls_dir = dir(PlainEnum)
9367db96d56Sopenharmony_ci        self.assertNotIn('__repr__', cls_dir)
9377db96d56Sopenharmony_ci        self.assertNotIn('__str__', cls_dir)
9387db96d56Sopenharmony_ci        self.assertNotIn('__format__', cls_dir)
9397db96d56Sopenharmony_ci        self.assertNotIn('__init__', cls_dir)
9407db96d56Sopenharmony_ci        #
9417db96d56Sopenharmony_ci        class MyEnum(Enum):
9427db96d56Sopenharmony_ci            def __repr__(self):
9437db96d56Sopenharmony_ci                return object.__repr__(self)
9447db96d56Sopenharmony_ci            def __str__(self):
9457db96d56Sopenharmony_ci                return object.__repr__(self)
9467db96d56Sopenharmony_ci            def __format__(self):
9477db96d56Sopenharmony_ci                return object.__repr__(self)
9487db96d56Sopenharmony_ci            def __init__(self):
9497db96d56Sopenharmony_ci                pass
9507db96d56Sopenharmony_ci        cls_dir = dir(MyEnum)
9517db96d56Sopenharmony_ci        self.assertIn('__repr__', cls_dir)
9527db96d56Sopenharmony_ci        self.assertIn('__str__', cls_dir)
9537db96d56Sopenharmony_ci        self.assertIn('__format__', cls_dir)
9547db96d56Sopenharmony_ci        self.assertIn('__init__', cls_dir)
9557db96d56Sopenharmony_ci
9567db96d56Sopenharmony_ci    def test_duplicate_name_error(self):
9577db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9587db96d56Sopenharmony_ci            class Color(Enum):
9597db96d56Sopenharmony_ci                red = 1
9607db96d56Sopenharmony_ci                green = 2
9617db96d56Sopenharmony_ci                blue = 3
9627db96d56Sopenharmony_ci                red = 4
9637db96d56Sopenharmony_ci        #
9647db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9657db96d56Sopenharmony_ci            class Color(Enum):
9667db96d56Sopenharmony_ci                red = 1
9677db96d56Sopenharmony_ci                green = 2
9687db96d56Sopenharmony_ci                blue = 3
9697db96d56Sopenharmony_ci                def red(self):
9707db96d56Sopenharmony_ci                    return 'red'
9717db96d56Sopenharmony_ci        #
9727db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9737db96d56Sopenharmony_ci            class Color(Enum):
9747db96d56Sopenharmony_ci                @enum.property
9757db96d56Sopenharmony_ci                def red(self):
9767db96d56Sopenharmony_ci                    return 'redder'
9777db96d56Sopenharmony_ci                red = 1
9787db96d56Sopenharmony_ci                green = 2
9797db96d56Sopenharmony_ci                blue = 3
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci    def test_enum_function_with_qualname(self):
9827db96d56Sopenharmony_ci        if isinstance(Theory, Exception):
9837db96d56Sopenharmony_ci            raise Theory
9847db96d56Sopenharmony_ci        self.assertEqual(Theory.__qualname__, 'spanish_inquisition')
9857db96d56Sopenharmony_ci
9867db96d56Sopenharmony_ci    def test_enum_of_types(self):
9877db96d56Sopenharmony_ci        """Support using Enum to refer to types deliberately."""
9887db96d56Sopenharmony_ci        class MyTypes(Enum):
9897db96d56Sopenharmony_ci            i = int
9907db96d56Sopenharmony_ci            f = float
9917db96d56Sopenharmony_ci            s = str
9927db96d56Sopenharmony_ci        self.assertEqual(MyTypes.i.value, int)
9937db96d56Sopenharmony_ci        self.assertEqual(MyTypes.f.value, float)
9947db96d56Sopenharmony_ci        self.assertEqual(MyTypes.s.value, str)
9957db96d56Sopenharmony_ci        class Foo:
9967db96d56Sopenharmony_ci            pass
9977db96d56Sopenharmony_ci        class Bar:
9987db96d56Sopenharmony_ci            pass
9997db96d56Sopenharmony_ci        class MyTypes2(Enum):
10007db96d56Sopenharmony_ci            a = Foo
10017db96d56Sopenharmony_ci            b = Bar
10027db96d56Sopenharmony_ci        self.assertEqual(MyTypes2.a.value, Foo)
10037db96d56Sopenharmony_ci        self.assertEqual(MyTypes2.b.value, Bar)
10047db96d56Sopenharmony_ci        class SpamEnumNotInner:
10057db96d56Sopenharmony_ci            pass
10067db96d56Sopenharmony_ci        class SpamEnum(Enum):
10077db96d56Sopenharmony_ci            spam = SpamEnumNotInner
10087db96d56Sopenharmony_ci        self.assertEqual(SpamEnum.spam.value, SpamEnumNotInner)
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_ci    def test_enum_of_generic_aliases(self):
10117db96d56Sopenharmony_ci        class E(Enum):
10127db96d56Sopenharmony_ci            a = typing.List[int]
10137db96d56Sopenharmony_ci            b = list[int]
10147db96d56Sopenharmony_ci        self.assertEqual(E.a.value, typing.List[int])
10157db96d56Sopenharmony_ci        self.assertEqual(E.b.value, list[int])
10167db96d56Sopenharmony_ci        self.assertEqual(repr(E.a), '<E.a: typing.List[int]>')
10177db96d56Sopenharmony_ci        self.assertEqual(repr(E.b), '<E.b: list[int]>')
10187db96d56Sopenharmony_ci
10197db96d56Sopenharmony_ci    @unittest.skipIf(
10207db96d56Sopenharmony_ci            python_version >= (3, 13),
10217db96d56Sopenharmony_ci            'inner classes are not members',
10227db96d56Sopenharmony_ci            )
10237db96d56Sopenharmony_ci    def test_nested_classes_in_enum_are_members(self):
10247db96d56Sopenharmony_ci        """
10257db96d56Sopenharmony_ci        Check for warnings pre-3.13
10267db96d56Sopenharmony_ci        """
10277db96d56Sopenharmony_ci        with self.assertWarnsRegex(DeprecationWarning, 'will not become a member'):
10287db96d56Sopenharmony_ci            class Outer(Enum):
10297db96d56Sopenharmony_ci                a = 1
10307db96d56Sopenharmony_ci                b = 2
10317db96d56Sopenharmony_ci                class Inner(Enum):
10327db96d56Sopenharmony_ci                    foo = 10
10337db96d56Sopenharmony_ci                    bar = 11
10347db96d56Sopenharmony_ci        self.assertTrue(isinstance(Outer.Inner, Outer))
10357db96d56Sopenharmony_ci        self.assertEqual(Outer.a.value, 1)
10367db96d56Sopenharmony_ci        self.assertEqual(Outer.Inner.value.foo.value, 10)
10377db96d56Sopenharmony_ci        self.assertEqual(
10387db96d56Sopenharmony_ci            list(Outer.Inner.value),
10397db96d56Sopenharmony_ci            [Outer.Inner.value.foo, Outer.Inner.value.bar],
10407db96d56Sopenharmony_ci            )
10417db96d56Sopenharmony_ci        self.assertEqual(
10427db96d56Sopenharmony_ci            list(Outer),
10437db96d56Sopenharmony_ci            [Outer.a, Outer.b, Outer.Inner],
10447db96d56Sopenharmony_ci            )
10457db96d56Sopenharmony_ci
10467db96d56Sopenharmony_ci    @unittest.skipIf(
10477db96d56Sopenharmony_ci            python_version < (3, 13),
10487db96d56Sopenharmony_ci            'inner classes are still members',
10497db96d56Sopenharmony_ci            )
10507db96d56Sopenharmony_ci    def test_nested_classes_in_enum_are_not_members(self):
10517db96d56Sopenharmony_ci        """Support locally-defined nested classes."""
10527db96d56Sopenharmony_ci        class Outer(Enum):
10537db96d56Sopenharmony_ci            a = 1
10547db96d56Sopenharmony_ci            b = 2
10557db96d56Sopenharmony_ci            class Inner(Enum):
10567db96d56Sopenharmony_ci                foo = 10
10577db96d56Sopenharmony_ci                bar = 11
10587db96d56Sopenharmony_ci        self.assertTrue(isinstance(Outer.Inner, type))
10597db96d56Sopenharmony_ci        self.assertEqual(Outer.a.value, 1)
10607db96d56Sopenharmony_ci        self.assertEqual(Outer.Inner.foo.value, 10)
10617db96d56Sopenharmony_ci        self.assertEqual(
10627db96d56Sopenharmony_ci            list(Outer.Inner),
10637db96d56Sopenharmony_ci            [Outer.Inner.foo, Outer.Inner.bar],
10647db96d56Sopenharmony_ci            )
10657db96d56Sopenharmony_ci        self.assertEqual(
10667db96d56Sopenharmony_ci            list(Outer),
10677db96d56Sopenharmony_ci            [Outer.a, Outer.b],
10687db96d56Sopenharmony_ci            )
10697db96d56Sopenharmony_ci
10707db96d56Sopenharmony_ci    def test_nested_classes_in_enum_with_nonmember(self):
10717db96d56Sopenharmony_ci        class Outer(Enum):
10727db96d56Sopenharmony_ci            a = 1
10737db96d56Sopenharmony_ci            b = 2
10747db96d56Sopenharmony_ci            @nonmember
10757db96d56Sopenharmony_ci            class Inner(Enum):
10767db96d56Sopenharmony_ci                foo = 10
10777db96d56Sopenharmony_ci                bar = 11
10787db96d56Sopenharmony_ci        self.assertTrue(isinstance(Outer.Inner, type))
10797db96d56Sopenharmony_ci        self.assertEqual(Outer.a.value, 1)
10807db96d56Sopenharmony_ci        self.assertEqual(Outer.Inner.foo.value, 10)
10817db96d56Sopenharmony_ci        self.assertEqual(
10827db96d56Sopenharmony_ci            list(Outer.Inner),
10837db96d56Sopenharmony_ci            [Outer.Inner.foo, Outer.Inner.bar],
10847db96d56Sopenharmony_ci            )
10857db96d56Sopenharmony_ci        self.assertEqual(
10867db96d56Sopenharmony_ci            list(Outer),
10877db96d56Sopenharmony_ci            [Outer.a, Outer.b],
10887db96d56Sopenharmony_ci            )
10897db96d56Sopenharmony_ci
10907db96d56Sopenharmony_ci    def test_enum_of_types_with_nonmember(self):
10917db96d56Sopenharmony_ci        """Support using Enum to refer to types deliberately."""
10927db96d56Sopenharmony_ci        class MyTypes(Enum):
10937db96d56Sopenharmony_ci            i = int
10947db96d56Sopenharmony_ci            f = nonmember(float)
10957db96d56Sopenharmony_ci            s = str
10967db96d56Sopenharmony_ci        self.assertEqual(MyTypes.i.value, int)
10977db96d56Sopenharmony_ci        self.assertTrue(MyTypes.f is float)
10987db96d56Sopenharmony_ci        self.assertEqual(MyTypes.s.value, str)
10997db96d56Sopenharmony_ci        class Foo:
11007db96d56Sopenharmony_ci            pass
11017db96d56Sopenharmony_ci        class Bar:
11027db96d56Sopenharmony_ci            pass
11037db96d56Sopenharmony_ci        class MyTypes2(Enum):
11047db96d56Sopenharmony_ci            a = Foo
11057db96d56Sopenharmony_ci            b = nonmember(Bar)
11067db96d56Sopenharmony_ci        self.assertEqual(MyTypes2.a.value, Foo)
11077db96d56Sopenharmony_ci        self.assertTrue(MyTypes2.b is Bar)
11087db96d56Sopenharmony_ci        class SpamEnumIsInner:
11097db96d56Sopenharmony_ci            pass
11107db96d56Sopenharmony_ci        class SpamEnum(Enum):
11117db96d56Sopenharmony_ci            spam = nonmember(SpamEnumIsInner)
11127db96d56Sopenharmony_ci        self.assertTrue(SpamEnum.spam is SpamEnumIsInner)
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci    def test_nested_classes_in_enum_with_member(self):
11157db96d56Sopenharmony_ci        """Support locally-defined nested classes."""
11167db96d56Sopenharmony_ci        class Outer(Enum):
11177db96d56Sopenharmony_ci            a = 1
11187db96d56Sopenharmony_ci            b = 2
11197db96d56Sopenharmony_ci            @member
11207db96d56Sopenharmony_ci            class Inner(Enum):
11217db96d56Sopenharmony_ci                foo = 10
11227db96d56Sopenharmony_ci                bar = 11
11237db96d56Sopenharmony_ci        self.assertTrue(isinstance(Outer.Inner, Outer))
11247db96d56Sopenharmony_ci        self.assertEqual(Outer.a.value, 1)
11257db96d56Sopenharmony_ci        self.assertEqual(Outer.Inner.value.foo.value, 10)
11267db96d56Sopenharmony_ci        self.assertEqual(
11277db96d56Sopenharmony_ci            list(Outer.Inner.value),
11287db96d56Sopenharmony_ci            [Outer.Inner.value.foo, Outer.Inner.value.bar],
11297db96d56Sopenharmony_ci            )
11307db96d56Sopenharmony_ci        self.assertEqual(
11317db96d56Sopenharmony_ci            list(Outer),
11327db96d56Sopenharmony_ci            [Outer.a, Outer.b, Outer.Inner],
11337db96d56Sopenharmony_ci            )
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ci    def test_enum_with_value_name(self):
11367db96d56Sopenharmony_ci        class Huh(Enum):
11377db96d56Sopenharmony_ci            name = 1
11387db96d56Sopenharmony_ci            value = 2
11397db96d56Sopenharmony_ci        self.assertEqual(list(Huh), [Huh.name, Huh.value])
11407db96d56Sopenharmony_ci        self.assertIs(type(Huh.name), Huh)
11417db96d56Sopenharmony_ci        self.assertEqual(Huh.name.name, 'name')
11427db96d56Sopenharmony_ci        self.assertEqual(Huh.name.value, 1)
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci    def test_inherited_data_type(self):
11457db96d56Sopenharmony_ci        class HexInt(int):
11467db96d56Sopenharmony_ci            __qualname__ = 'HexInt'
11477db96d56Sopenharmony_ci            def __repr__(self):
11487db96d56Sopenharmony_ci                return hex(self)
11497db96d56Sopenharmony_ci        class MyEnum(HexInt, enum.Enum):
11507db96d56Sopenharmony_ci            __qualname__ = 'MyEnum'
11517db96d56Sopenharmony_ci            A = 1
11527db96d56Sopenharmony_ci            B = 2
11537db96d56Sopenharmony_ci            C = 3
11547db96d56Sopenharmony_ci        self.assertEqual(repr(MyEnum.A), '<MyEnum.A: 0x1>')
11557db96d56Sopenharmony_ci        globals()['HexInt'] = HexInt
11567db96d56Sopenharmony_ci        globals()['MyEnum'] = MyEnum
11577db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, MyEnum.A)
11587db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, MyEnum)
11597db96d56Sopenharmony_ci        #
11607db96d56Sopenharmony_ci        class SillyInt(HexInt):
11617db96d56Sopenharmony_ci            __qualname__ = 'SillyInt'
11627db96d56Sopenharmony_ci            pass
11637db96d56Sopenharmony_ci        class MyOtherEnum(SillyInt, enum.Enum):
11647db96d56Sopenharmony_ci            __qualname__ = 'MyOtherEnum'
11657db96d56Sopenharmony_ci            D = 4
11667db96d56Sopenharmony_ci            E = 5
11677db96d56Sopenharmony_ci            F = 6
11687db96d56Sopenharmony_ci        self.assertIs(MyOtherEnum._member_type_, SillyInt)
11697db96d56Sopenharmony_ci        globals()['SillyInt'] = SillyInt
11707db96d56Sopenharmony_ci        globals()['MyOtherEnum'] = MyOtherEnum
11717db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, MyOtherEnum.E)
11727db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, MyOtherEnum)
11737db96d56Sopenharmony_ci        #
11747db96d56Sopenharmony_ci        # This did not work in 3.10, but does now with pickling by name
11757db96d56Sopenharmony_ci        class UnBrokenInt(int):
11767db96d56Sopenharmony_ci            __qualname__ = 'UnBrokenInt'
11777db96d56Sopenharmony_ci            def __new__(cls, value):
11787db96d56Sopenharmony_ci                return int.__new__(cls, value)
11797db96d56Sopenharmony_ci        class MyUnBrokenEnum(UnBrokenInt, Enum):
11807db96d56Sopenharmony_ci            __qualname__ = 'MyUnBrokenEnum'
11817db96d56Sopenharmony_ci            G = 7
11827db96d56Sopenharmony_ci            H = 8
11837db96d56Sopenharmony_ci            I = 9
11847db96d56Sopenharmony_ci        self.assertIs(MyUnBrokenEnum._member_type_, UnBrokenInt)
11857db96d56Sopenharmony_ci        self.assertIs(MyUnBrokenEnum(7), MyUnBrokenEnum.G)
11867db96d56Sopenharmony_ci        globals()['UnBrokenInt'] = UnBrokenInt
11877db96d56Sopenharmony_ci        globals()['MyUnBrokenEnum'] = MyUnBrokenEnum
11887db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, MyUnBrokenEnum.I)
11897db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, MyUnBrokenEnum)
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_ci    def test_floatenum_fromhex(self):
11927db96d56Sopenharmony_ci        h = float.hex(FloatStooges.MOE.value)
11937db96d56Sopenharmony_ci        self.assertIs(FloatStooges.fromhex(h), FloatStooges.MOE)
11947db96d56Sopenharmony_ci        h = float.hex(FloatStooges.MOE.value + 0.01)
11957db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
11967db96d56Sopenharmony_ci            FloatStooges.fromhex(h)
11977db96d56Sopenharmony_ci
11987db96d56Sopenharmony_ci    def test_programmatic_function_type(self):
11997db96d56Sopenharmony_ci        MinorEnum = Enum('MinorEnum', 'june july august', type=int)
12007db96d56Sopenharmony_ci        lst = list(MinorEnum)
12017db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
12027db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
12037db96d56Sopenharmony_ci        self.assertEqual(
12047db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
12057db96d56Sopenharmony_ci                lst,
12067db96d56Sopenharmony_ci                )
12077db96d56Sopenharmony_ci        for i, month in enumerate('june july august'.split(), 1):
12087db96d56Sopenharmony_ci            e = MinorEnum(i)
12097db96d56Sopenharmony_ci            self.assertEqual(e, i)
12107db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
12117db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
12127db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
12137db96d56Sopenharmony_ci
12147db96d56Sopenharmony_ci    def test_programmatic_function_string_with_start(self):
12157db96d56Sopenharmony_ci        MinorEnum = Enum('MinorEnum', 'june july august', start=10)
12167db96d56Sopenharmony_ci        lst = list(MinorEnum)
12177db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
12187db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
12197db96d56Sopenharmony_ci        self.assertEqual(
12207db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
12217db96d56Sopenharmony_ci                lst,
12227db96d56Sopenharmony_ci                )
12237db96d56Sopenharmony_ci        for i, month in enumerate('june july august'.split(), 10):
12247db96d56Sopenharmony_ci            e = MinorEnum(i)
12257db96d56Sopenharmony_ci            self.assertEqual(int(e.value), i)
12267db96d56Sopenharmony_ci            self.assertNotEqual(e, i)
12277db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
12287db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
12297db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
12307db96d56Sopenharmony_ci
12317db96d56Sopenharmony_ci    def test_programmatic_function_type_with_start(self):
12327db96d56Sopenharmony_ci        MinorEnum = Enum('MinorEnum', 'june july august', type=int, start=30)
12337db96d56Sopenharmony_ci        lst = list(MinorEnum)
12347db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
12357db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
12367db96d56Sopenharmony_ci        self.assertEqual(
12377db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
12387db96d56Sopenharmony_ci                lst,
12397db96d56Sopenharmony_ci                )
12407db96d56Sopenharmony_ci        for i, month in enumerate('june july august'.split(), 30):
12417db96d56Sopenharmony_ci            e = MinorEnum(i)
12427db96d56Sopenharmony_ci            self.assertEqual(e, i)
12437db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
12447db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
12457db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci    def test_programmatic_function_string_list_with_start(self):
12487db96d56Sopenharmony_ci        MinorEnum = Enum('MinorEnum', ['june', 'july', 'august'], start=20)
12497db96d56Sopenharmony_ci        lst = list(MinorEnum)
12507db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
12517db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
12527db96d56Sopenharmony_ci        self.assertEqual(
12537db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
12547db96d56Sopenharmony_ci                lst,
12557db96d56Sopenharmony_ci                )
12567db96d56Sopenharmony_ci        for i, month in enumerate('june july august'.split(), 20):
12577db96d56Sopenharmony_ci            e = MinorEnum(i)
12587db96d56Sopenharmony_ci            self.assertEqual(int(e.value), i)
12597db96d56Sopenharmony_ci            self.assertNotEqual(e, i)
12607db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
12617db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
12627db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci    def test_programmatic_function_type_from_subclass(self):
12657db96d56Sopenharmony_ci        MinorEnum = IntEnum('MinorEnum', 'june july august')
12667db96d56Sopenharmony_ci        lst = list(MinorEnum)
12677db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
12687db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
12697db96d56Sopenharmony_ci        self.assertEqual(
12707db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
12717db96d56Sopenharmony_ci                lst,
12727db96d56Sopenharmony_ci                )
12737db96d56Sopenharmony_ci        for i, month in enumerate('june july august'.split(), 1):
12747db96d56Sopenharmony_ci            e = MinorEnum(i)
12757db96d56Sopenharmony_ci            self.assertEqual(e, i)
12767db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
12777db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
12787db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
12797db96d56Sopenharmony_ci
12807db96d56Sopenharmony_ci    def test_programmatic_function_type_from_subclass_with_start(self):
12817db96d56Sopenharmony_ci        MinorEnum = IntEnum('MinorEnum', 'june july august', start=40)
12827db96d56Sopenharmony_ci        lst = list(MinorEnum)
12837db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(MinorEnum))
12847db96d56Sopenharmony_ci        self.assertEqual(len(MinorEnum), 3, MinorEnum)
12857db96d56Sopenharmony_ci        self.assertEqual(
12867db96d56Sopenharmony_ci                [MinorEnum.june, MinorEnum.july, MinorEnum.august],
12877db96d56Sopenharmony_ci                lst,
12887db96d56Sopenharmony_ci                )
12897db96d56Sopenharmony_ci        for i, month in enumerate('june july august'.split(), 40):
12907db96d56Sopenharmony_ci            e = MinorEnum(i)
12917db96d56Sopenharmony_ci            self.assertEqual(e, i)
12927db96d56Sopenharmony_ci            self.assertEqual(e.name, month)
12937db96d56Sopenharmony_ci            self.assertIn(e, MinorEnum)
12947db96d56Sopenharmony_ci            self.assertIs(type(e), MinorEnum)
12957db96d56Sopenharmony_ci
12967db96d56Sopenharmony_ci    def test_intenum_from_bytes(self):
12977db96d56Sopenharmony_ci        self.assertIs(IntStooges.from_bytes(b'\x00\x03', 'big'), IntStooges.MOE)
12987db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
12997db96d56Sopenharmony_ci            IntStooges.from_bytes(b'\x00\x05', 'big')
13007db96d56Sopenharmony_ci
13017db96d56Sopenharmony_ci    def test_reserved_sunder_error(self):
13027db96d56Sopenharmony_ci        with self.assertRaisesRegex(
13037db96d56Sopenharmony_ci                ValueError,
13047db96d56Sopenharmony_ci                '_sunder_ names, such as ._bad_., are reserved',
13057db96d56Sopenharmony_ci            ):
13067db96d56Sopenharmony_ci            class Bad(Enum):
13077db96d56Sopenharmony_ci                _bad_ = 1
13087db96d56Sopenharmony_ci
13097db96d56Sopenharmony_ci    def test_too_many_data_types(self):
13107db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'too many data types'):
13117db96d56Sopenharmony_ci            class Huh(str, int, Enum):
13127db96d56Sopenharmony_ci                One = 1
13137db96d56Sopenharmony_ci
13147db96d56Sopenharmony_ci        class MyStr(str):
13157db96d56Sopenharmony_ci            def hello(self):
13167db96d56Sopenharmony_ci                return 'hello, %s' % self
13177db96d56Sopenharmony_ci        class MyInt(int):
13187db96d56Sopenharmony_ci            def repr(self):
13197db96d56Sopenharmony_ci                return hex(self)
13207db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'too many data types'):
13217db96d56Sopenharmony_ci            class Huh(MyStr, MyInt, Enum):
13227db96d56Sopenharmony_ci                One = 1
13237db96d56Sopenharmony_ci
13247db96d56Sopenharmony_ci    def test_pickle_enum(self):
13257db96d56Sopenharmony_ci        if isinstance(Stooges, Exception):
13267db96d56Sopenharmony_ci            raise Stooges
13277db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, Stooges.CURLY)
13287db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, Stooges)
13297db96d56Sopenharmony_ci
13307db96d56Sopenharmony_ci    def test_pickle_int(self):
13317db96d56Sopenharmony_ci        if isinstance(IntStooges, Exception):
13327db96d56Sopenharmony_ci            raise IntStooges
13337db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, IntStooges.CURLY)
13347db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, IntStooges)
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci    def test_pickle_float(self):
13377db96d56Sopenharmony_ci        if isinstance(FloatStooges, Exception):
13387db96d56Sopenharmony_ci            raise FloatStooges
13397db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, FloatStooges.CURLY)
13407db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, FloatStooges)
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci    def test_pickle_enum_function(self):
13437db96d56Sopenharmony_ci        if isinstance(Answer, Exception):
13447db96d56Sopenharmony_ci            raise Answer
13457db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, Answer.him)
13467db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, Answer)
13477db96d56Sopenharmony_ci
13487db96d56Sopenharmony_ci    def test_pickle_enum_function_with_module(self):
13497db96d56Sopenharmony_ci        if isinstance(Question, Exception):
13507db96d56Sopenharmony_ci            raise Question
13517db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, Question.who)
13527db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, Question)
13537db96d56Sopenharmony_ci
13547db96d56Sopenharmony_ci    def test_pickle_nested_class(self):
13557db96d56Sopenharmony_ci        # would normally just have this directly in the class namespace
13567db96d56Sopenharmony_ci        class NestedEnum(Enum):
13577db96d56Sopenharmony_ci            twigs = 'common'
13587db96d56Sopenharmony_ci            shiny = 'rare'
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ci        self.__class__.NestedEnum = NestedEnum
13617db96d56Sopenharmony_ci        self.NestedEnum.__qualname__ = '%s.NestedEnum' % self.__class__.__name__
13627db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, self.NestedEnum.twigs)
13637db96d56Sopenharmony_ci
13647db96d56Sopenharmony_ci    def test_pickle_by_name(self):
13657db96d56Sopenharmony_ci        class ReplaceGlobalInt(IntEnum):
13667db96d56Sopenharmony_ci            ONE = 1
13677db96d56Sopenharmony_ci            TWO = 2
13687db96d56Sopenharmony_ci        ReplaceGlobalInt.__reduce_ex__ = enum._reduce_ex_by_global_name
13697db96d56Sopenharmony_ci        for proto in range(HIGHEST_PROTOCOL):
13707db96d56Sopenharmony_ci            self.assertEqual(ReplaceGlobalInt.TWO.__reduce_ex__(proto), 'TWO')
13717db96d56Sopenharmony_ci
13727db96d56Sopenharmony_ci    def test_pickle_explodes(self):
13737db96d56Sopenharmony_ci        BadPickle = Enum(
13747db96d56Sopenharmony_ci                'BadPickle', 'dill sweet bread-n-butter', module=__name__)
13757db96d56Sopenharmony_ci        globals()['BadPickle'] = BadPickle
13767db96d56Sopenharmony_ci        # now break BadPickle to test exception raising
13777db96d56Sopenharmony_ci        enum._make_class_unpicklable(BadPickle)
13787db96d56Sopenharmony_ci        test_pickle_exception(self.assertRaises, TypeError, BadPickle.dill)
13797db96d56Sopenharmony_ci        test_pickle_exception(self.assertRaises, PicklingError, BadPickle)
13807db96d56Sopenharmony_ci
13817db96d56Sopenharmony_ci    def test_string_enum(self):
13827db96d56Sopenharmony_ci        class SkillLevel(str, Enum):
13837db96d56Sopenharmony_ci            master = 'what is the sound of one hand clapping?'
13847db96d56Sopenharmony_ci            journeyman = 'why did the chicken cross the road?'
13857db96d56Sopenharmony_ci            apprentice = 'knock, knock!'
13867db96d56Sopenharmony_ci        self.assertEqual(SkillLevel.apprentice, 'knock, knock!')
13877db96d56Sopenharmony_ci
13887db96d56Sopenharmony_ci    def test_getattr_getitem(self):
13897db96d56Sopenharmony_ci        class Period(Enum):
13907db96d56Sopenharmony_ci            morning = 1
13917db96d56Sopenharmony_ci            noon = 2
13927db96d56Sopenharmony_ci            evening = 3
13937db96d56Sopenharmony_ci            night = 4
13947db96d56Sopenharmony_ci        self.assertIs(Period(2), Period.noon)
13957db96d56Sopenharmony_ci        self.assertIs(getattr(Period, 'night'), Period.night)
13967db96d56Sopenharmony_ci        self.assertIs(Period['morning'], Period.morning)
13977db96d56Sopenharmony_ci
13987db96d56Sopenharmony_ci    def test_getattr_dunder(self):
13997db96d56Sopenharmony_ci        Season = self.Season
14007db96d56Sopenharmony_ci        self.assertTrue(getattr(Season, '__eq__'))
14017db96d56Sopenharmony_ci
14027db96d56Sopenharmony_ci    def test_iteration_order(self):
14037db96d56Sopenharmony_ci        class Season(Enum):
14047db96d56Sopenharmony_ci            SUMMER = 2
14057db96d56Sopenharmony_ci            WINTER = 4
14067db96d56Sopenharmony_ci            AUTUMN = 3
14077db96d56Sopenharmony_ci            SPRING = 1
14087db96d56Sopenharmony_ci        self.assertEqual(
14097db96d56Sopenharmony_ci                list(Season),
14107db96d56Sopenharmony_ci                [Season.SUMMER, Season.WINTER, Season.AUTUMN, Season.SPRING],
14117db96d56Sopenharmony_ci                )
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_ci    def test_subclassing(self):
14147db96d56Sopenharmony_ci        if isinstance(Name, Exception):
14157db96d56Sopenharmony_ci            raise Name
14167db96d56Sopenharmony_ci        self.assertEqual(Name.BDFL, 'Guido van Rossum')
14177db96d56Sopenharmony_ci        self.assertTrue(Name.BDFL, Name('Guido van Rossum'))
14187db96d56Sopenharmony_ci        self.assertIs(Name.BDFL, getattr(Name, 'BDFL'))
14197db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, Name.BDFL)
14207db96d56Sopenharmony_ci
14217db96d56Sopenharmony_ci    def test_extending(self):
14227db96d56Sopenharmony_ci        class Color(Enum):
14237db96d56Sopenharmony_ci            red = 1
14247db96d56Sopenharmony_ci            green = 2
14257db96d56Sopenharmony_ci            blue = 3
14267db96d56Sopenharmony_ci        #
14277db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
14287db96d56Sopenharmony_ci            class MoreColor(Color):
14297db96d56Sopenharmony_ci                cyan = 4
14307db96d56Sopenharmony_ci                magenta = 5
14317db96d56Sopenharmony_ci                yellow = 6
14327db96d56Sopenharmony_ci        #
14337db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "<enum .EvenMoreColor.> cannot extend <enum .Color.>"):
14347db96d56Sopenharmony_ci            class EvenMoreColor(Color, IntEnum):
14357db96d56Sopenharmony_ci                chartruese = 7
14367db96d56Sopenharmony_ci        #
14377db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "<enum .Foo.> cannot extend <enum .Color.>"):
14387db96d56Sopenharmony_ci            Color('Foo', ('pink', 'black'))
14397db96d56Sopenharmony_ci
14407db96d56Sopenharmony_ci    def test_exclude_methods(self):
14417db96d56Sopenharmony_ci        class whatever(Enum):
14427db96d56Sopenharmony_ci            this = 'that'
14437db96d56Sopenharmony_ci            these = 'those'
14447db96d56Sopenharmony_ci            def really(self):
14457db96d56Sopenharmony_ci                return 'no, not %s' % self.value
14467db96d56Sopenharmony_ci        self.assertIsNot(type(whatever.really), whatever)
14477db96d56Sopenharmony_ci        self.assertEqual(whatever.this.really(), 'no, not that')
14487db96d56Sopenharmony_ci
14497db96d56Sopenharmony_ci    def test_wrong_inheritance_order(self):
14507db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
14517db96d56Sopenharmony_ci            class Wrong(Enum, str):
14527db96d56Sopenharmony_ci                NotHere = 'error before this point'
14537db96d56Sopenharmony_ci
14547db96d56Sopenharmony_ci    def test_intenum_transitivity(self):
14557db96d56Sopenharmony_ci        class number(IntEnum):
14567db96d56Sopenharmony_ci            one = 1
14577db96d56Sopenharmony_ci            two = 2
14587db96d56Sopenharmony_ci            three = 3
14597db96d56Sopenharmony_ci        class numero(IntEnum):
14607db96d56Sopenharmony_ci            uno = 1
14617db96d56Sopenharmony_ci            dos = 2
14627db96d56Sopenharmony_ci            tres = 3
14637db96d56Sopenharmony_ci        self.assertEqual(number.one, numero.uno)
14647db96d56Sopenharmony_ci        self.assertEqual(number.two, numero.dos)
14657db96d56Sopenharmony_ci        self.assertEqual(number.three, numero.tres)
14667db96d56Sopenharmony_ci
14677db96d56Sopenharmony_ci    def test_wrong_enum_in_call(self):
14687db96d56Sopenharmony_ci        class Monochrome(Enum):
14697db96d56Sopenharmony_ci            black = 0
14707db96d56Sopenharmony_ci            white = 1
14717db96d56Sopenharmony_ci        class Gender(Enum):
14727db96d56Sopenharmony_ci            male = 0
14737db96d56Sopenharmony_ci            female = 1
14747db96d56Sopenharmony_ci        self.assertRaises(ValueError, Monochrome, Gender.male)
14757db96d56Sopenharmony_ci
14767db96d56Sopenharmony_ci    def test_wrong_enum_in_mixed_call(self):
14777db96d56Sopenharmony_ci        class Monochrome(IntEnum):
14787db96d56Sopenharmony_ci            black = 0
14797db96d56Sopenharmony_ci            white = 1
14807db96d56Sopenharmony_ci        class Gender(Enum):
14817db96d56Sopenharmony_ci            male = 0
14827db96d56Sopenharmony_ci            female = 1
14837db96d56Sopenharmony_ci        self.assertRaises(ValueError, Monochrome, Gender.male)
14847db96d56Sopenharmony_ci
14857db96d56Sopenharmony_ci    def test_mixed_enum_in_call_1(self):
14867db96d56Sopenharmony_ci        class Monochrome(IntEnum):
14877db96d56Sopenharmony_ci            black = 0
14887db96d56Sopenharmony_ci            white = 1
14897db96d56Sopenharmony_ci        class Gender(IntEnum):
14907db96d56Sopenharmony_ci            male = 0
14917db96d56Sopenharmony_ci            female = 1
14927db96d56Sopenharmony_ci        self.assertIs(Monochrome(Gender.female), Monochrome.white)
14937db96d56Sopenharmony_ci
14947db96d56Sopenharmony_ci    def test_mixed_enum_in_call_2(self):
14957db96d56Sopenharmony_ci        class Monochrome(Enum):
14967db96d56Sopenharmony_ci            black = 0
14977db96d56Sopenharmony_ci            white = 1
14987db96d56Sopenharmony_ci        class Gender(IntEnum):
14997db96d56Sopenharmony_ci            male = 0
15007db96d56Sopenharmony_ci            female = 1
15017db96d56Sopenharmony_ci        self.assertIs(Monochrome(Gender.male), Monochrome.black)
15027db96d56Sopenharmony_ci
15037db96d56Sopenharmony_ci    def test_flufl_enum(self):
15047db96d56Sopenharmony_ci        class Fluflnum(Enum):
15057db96d56Sopenharmony_ci            def __int__(self):
15067db96d56Sopenharmony_ci                return int(self.value)
15077db96d56Sopenharmony_ci        class MailManOptions(Fluflnum):
15087db96d56Sopenharmony_ci            option1 = 1
15097db96d56Sopenharmony_ci            option2 = 2
15107db96d56Sopenharmony_ci            option3 = 3
15117db96d56Sopenharmony_ci        self.assertEqual(int(MailManOptions.option1), 1)
15127db96d56Sopenharmony_ci
15137db96d56Sopenharmony_ci    def test_introspection(self):
15147db96d56Sopenharmony_ci        class Number(IntEnum):
15157db96d56Sopenharmony_ci            one = 100
15167db96d56Sopenharmony_ci            two = 200
15177db96d56Sopenharmony_ci        self.assertIs(Number.one._member_type_, int)
15187db96d56Sopenharmony_ci        self.assertIs(Number._member_type_, int)
15197db96d56Sopenharmony_ci        class String(str, Enum):
15207db96d56Sopenharmony_ci            yarn = 'soft'
15217db96d56Sopenharmony_ci            rope = 'rough'
15227db96d56Sopenharmony_ci            wire = 'hard'
15237db96d56Sopenharmony_ci        self.assertIs(String.yarn._member_type_, str)
15247db96d56Sopenharmony_ci        self.assertIs(String._member_type_, str)
15257db96d56Sopenharmony_ci        class Plain(Enum):
15267db96d56Sopenharmony_ci            vanilla = 'white'
15277db96d56Sopenharmony_ci            one = 1
15287db96d56Sopenharmony_ci        self.assertIs(Plain.vanilla._member_type_, object)
15297db96d56Sopenharmony_ci        self.assertIs(Plain._member_type_, object)
15307db96d56Sopenharmony_ci
15317db96d56Sopenharmony_ci    def test_no_such_enum_member(self):
15327db96d56Sopenharmony_ci        class Color(Enum):
15337db96d56Sopenharmony_ci            red = 1
15347db96d56Sopenharmony_ci            green = 2
15357db96d56Sopenharmony_ci            blue = 3
15367db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
15377db96d56Sopenharmony_ci            Color(4)
15387db96d56Sopenharmony_ci        with self.assertRaises(KeyError):
15397db96d56Sopenharmony_ci            Color['chartreuse']
15407db96d56Sopenharmony_ci
15417db96d56Sopenharmony_ci    # tests that need to be evalualted for moving
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ci    def test_multiple_mixin_mro(self):
15447db96d56Sopenharmony_ci        class auto_enum(type(Enum)):
15457db96d56Sopenharmony_ci            def __new__(metacls, cls, bases, classdict):
15467db96d56Sopenharmony_ci                temp = type(classdict)()
15477db96d56Sopenharmony_ci                temp._cls_name = cls
15487db96d56Sopenharmony_ci                names = set(classdict._member_names)
15497db96d56Sopenharmony_ci                i = 0
15507db96d56Sopenharmony_ci                for k in classdict._member_names:
15517db96d56Sopenharmony_ci                    v = classdict[k]
15527db96d56Sopenharmony_ci                    if v is Ellipsis:
15537db96d56Sopenharmony_ci                        v = i
15547db96d56Sopenharmony_ci                    else:
15557db96d56Sopenharmony_ci                        i = v
15567db96d56Sopenharmony_ci                    i += 1
15577db96d56Sopenharmony_ci                    temp[k] = v
15587db96d56Sopenharmony_ci                for k, v in classdict.items():
15597db96d56Sopenharmony_ci                    if k not in names:
15607db96d56Sopenharmony_ci                        temp[k] = v
15617db96d56Sopenharmony_ci                return super(auto_enum, metacls).__new__(
15627db96d56Sopenharmony_ci                        metacls, cls, bases, temp)
15637db96d56Sopenharmony_ci
15647db96d56Sopenharmony_ci        class AutoNumberedEnum(Enum, metaclass=auto_enum):
15657db96d56Sopenharmony_ci            pass
15667db96d56Sopenharmony_ci
15677db96d56Sopenharmony_ci        class AutoIntEnum(IntEnum, metaclass=auto_enum):
15687db96d56Sopenharmony_ci            pass
15697db96d56Sopenharmony_ci
15707db96d56Sopenharmony_ci        class TestAutoNumber(AutoNumberedEnum):
15717db96d56Sopenharmony_ci            a = ...
15727db96d56Sopenharmony_ci            b = 3
15737db96d56Sopenharmony_ci            c = ...
15747db96d56Sopenharmony_ci
15757db96d56Sopenharmony_ci        class TestAutoInt(AutoIntEnum):
15767db96d56Sopenharmony_ci            a = ...
15777db96d56Sopenharmony_ci            b = 3
15787db96d56Sopenharmony_ci            c = ...
15797db96d56Sopenharmony_ci
15807db96d56Sopenharmony_ci    def test_subclasses_with_getnewargs(self):
15817db96d56Sopenharmony_ci        class NamedInt(int):
15827db96d56Sopenharmony_ci            __qualname__ = 'NamedInt'       # needed for pickle protocol 4
15837db96d56Sopenharmony_ci            def __new__(cls, *args):
15847db96d56Sopenharmony_ci                _args = args
15857db96d56Sopenharmony_ci                name, *args = args
15867db96d56Sopenharmony_ci                if len(args) == 0:
15877db96d56Sopenharmony_ci                    raise TypeError("name and value must be specified")
15887db96d56Sopenharmony_ci                self = int.__new__(cls, *args)
15897db96d56Sopenharmony_ci                self._intname = name
15907db96d56Sopenharmony_ci                self._args = _args
15917db96d56Sopenharmony_ci                return self
15927db96d56Sopenharmony_ci            def __getnewargs__(self):
15937db96d56Sopenharmony_ci                return self._args
15947db96d56Sopenharmony_ci            @bltns.property
15957db96d56Sopenharmony_ci            def __name__(self):
15967db96d56Sopenharmony_ci                return self._intname
15977db96d56Sopenharmony_ci            def __repr__(self):
15987db96d56Sopenharmony_ci                # repr() is updated to include the name and type info
15997db96d56Sopenharmony_ci                return "{}({!r}, {})".format(
16007db96d56Sopenharmony_ci                        type(self).__name__,
16017db96d56Sopenharmony_ci                        self.__name__,
16027db96d56Sopenharmony_ci                        int.__repr__(self),
16037db96d56Sopenharmony_ci                        )
16047db96d56Sopenharmony_ci            def __str__(self):
16057db96d56Sopenharmony_ci                # str() is unchanged, even if it relies on the repr() fallback
16067db96d56Sopenharmony_ci                base = int
16077db96d56Sopenharmony_ci                base_str = base.__str__
16087db96d56Sopenharmony_ci                if base_str.__objclass__ is object:
16097db96d56Sopenharmony_ci                    return base.__repr__(self)
16107db96d56Sopenharmony_ci                return base_str(self)
16117db96d56Sopenharmony_ci            # for simplicity, we only define one operator that
16127db96d56Sopenharmony_ci            # propagates expressions
16137db96d56Sopenharmony_ci            def __add__(self, other):
16147db96d56Sopenharmony_ci                temp = int(self) + int( other)
16157db96d56Sopenharmony_ci                if isinstance(self, NamedInt) and isinstance(other, NamedInt):
16167db96d56Sopenharmony_ci                    return NamedInt(
16177db96d56Sopenharmony_ci                        '({0} + {1})'.format(self.__name__, other.__name__),
16187db96d56Sopenharmony_ci                        temp,
16197db96d56Sopenharmony_ci                        )
16207db96d56Sopenharmony_ci                else:
16217db96d56Sopenharmony_ci                    return temp
16227db96d56Sopenharmony_ci
16237db96d56Sopenharmony_ci        class NEI(NamedInt, Enum):
16247db96d56Sopenharmony_ci            __qualname__ = 'NEI'      # needed for pickle protocol 4
16257db96d56Sopenharmony_ci            x = ('the-x', 1)
16267db96d56Sopenharmony_ci            y = ('the-y', 2)
16277db96d56Sopenharmony_ci
16287db96d56Sopenharmony_ci
16297db96d56Sopenharmony_ci        self.assertIs(NEI.__new__, Enum.__new__)
16307db96d56Sopenharmony_ci        self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
16317db96d56Sopenharmony_ci        globals()['NamedInt'] = NamedInt
16327db96d56Sopenharmony_ci        globals()['NEI'] = NEI
16337db96d56Sopenharmony_ci        NI5 = NamedInt('test', 5)
16347db96d56Sopenharmony_ci        self.assertEqual(NI5, 5)
16357db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual, NI5, 5)
16367db96d56Sopenharmony_ci        self.assertEqual(NEI.y.value, 2)
16377db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI.y)
16387db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI)
16397db96d56Sopenharmony_ci
16407db96d56Sopenharmony_ci    def test_subclasses_with_getnewargs_ex(self):
16417db96d56Sopenharmony_ci        class NamedInt(int):
16427db96d56Sopenharmony_ci            __qualname__ = 'NamedInt'       # needed for pickle protocol 4
16437db96d56Sopenharmony_ci            def __new__(cls, *args):
16447db96d56Sopenharmony_ci                _args = args
16457db96d56Sopenharmony_ci                name, *args = args
16467db96d56Sopenharmony_ci                if len(args) == 0:
16477db96d56Sopenharmony_ci                    raise TypeError("name and value must be specified")
16487db96d56Sopenharmony_ci                self = int.__new__(cls, *args)
16497db96d56Sopenharmony_ci                self._intname = name
16507db96d56Sopenharmony_ci                self._args = _args
16517db96d56Sopenharmony_ci                return self
16527db96d56Sopenharmony_ci            def __getnewargs_ex__(self):
16537db96d56Sopenharmony_ci                return self._args, {}
16547db96d56Sopenharmony_ci            @bltns.property
16557db96d56Sopenharmony_ci            def __name__(self):
16567db96d56Sopenharmony_ci                return self._intname
16577db96d56Sopenharmony_ci            def __repr__(self):
16587db96d56Sopenharmony_ci                # repr() is updated to include the name and type info
16597db96d56Sopenharmony_ci                return "{}({!r}, {})".format(
16607db96d56Sopenharmony_ci                        type(self).__name__,
16617db96d56Sopenharmony_ci                        self.__name__,
16627db96d56Sopenharmony_ci                        int.__repr__(self),
16637db96d56Sopenharmony_ci                        )
16647db96d56Sopenharmony_ci            def __str__(self):
16657db96d56Sopenharmony_ci                # str() is unchanged, even if it relies on the repr() fallback
16667db96d56Sopenharmony_ci                base = int
16677db96d56Sopenharmony_ci                base_str = base.__str__
16687db96d56Sopenharmony_ci                if base_str.__objclass__ is object:
16697db96d56Sopenharmony_ci                    return base.__repr__(self)
16707db96d56Sopenharmony_ci                return base_str(self)
16717db96d56Sopenharmony_ci            # for simplicity, we only define one operator that
16727db96d56Sopenharmony_ci            # propagates expressions
16737db96d56Sopenharmony_ci            def __add__(self, other):
16747db96d56Sopenharmony_ci                temp = int(self) + int( other)
16757db96d56Sopenharmony_ci                if isinstance(self, NamedInt) and isinstance(other, NamedInt):
16767db96d56Sopenharmony_ci                    return NamedInt(
16777db96d56Sopenharmony_ci                        '({0} + {1})'.format(self.__name__, other.__name__),
16787db96d56Sopenharmony_ci                        temp,
16797db96d56Sopenharmony_ci                        )
16807db96d56Sopenharmony_ci                else:
16817db96d56Sopenharmony_ci                    return temp
16827db96d56Sopenharmony_ci
16837db96d56Sopenharmony_ci        class NEI(NamedInt, Enum):
16847db96d56Sopenharmony_ci            __qualname__ = 'NEI'      # needed for pickle protocol 4
16857db96d56Sopenharmony_ci            x = ('the-x', 1)
16867db96d56Sopenharmony_ci            y = ('the-y', 2)
16877db96d56Sopenharmony_ci
16887db96d56Sopenharmony_ci
16897db96d56Sopenharmony_ci        self.assertIs(NEI.__new__, Enum.__new__)
16907db96d56Sopenharmony_ci        self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
16917db96d56Sopenharmony_ci        globals()['NamedInt'] = NamedInt
16927db96d56Sopenharmony_ci        globals()['NEI'] = NEI
16937db96d56Sopenharmony_ci        NI5 = NamedInt('test', 5)
16947db96d56Sopenharmony_ci        self.assertEqual(NI5, 5)
16957db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual, NI5, 5)
16967db96d56Sopenharmony_ci        self.assertEqual(NEI.y.value, 2)
16977db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI.y)
16987db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI)
16997db96d56Sopenharmony_ci
17007db96d56Sopenharmony_ci    def test_subclasses_with_reduce(self):
17017db96d56Sopenharmony_ci        class NamedInt(int):
17027db96d56Sopenharmony_ci            __qualname__ = 'NamedInt'       # needed for pickle protocol 4
17037db96d56Sopenharmony_ci            def __new__(cls, *args):
17047db96d56Sopenharmony_ci                _args = args
17057db96d56Sopenharmony_ci                name, *args = args
17067db96d56Sopenharmony_ci                if len(args) == 0:
17077db96d56Sopenharmony_ci                    raise TypeError("name and value must be specified")
17087db96d56Sopenharmony_ci                self = int.__new__(cls, *args)
17097db96d56Sopenharmony_ci                self._intname = name
17107db96d56Sopenharmony_ci                self._args = _args
17117db96d56Sopenharmony_ci                return self
17127db96d56Sopenharmony_ci            def __reduce__(self):
17137db96d56Sopenharmony_ci                return self.__class__, self._args
17147db96d56Sopenharmony_ci            @bltns.property
17157db96d56Sopenharmony_ci            def __name__(self):
17167db96d56Sopenharmony_ci                return self._intname
17177db96d56Sopenharmony_ci            def __repr__(self):
17187db96d56Sopenharmony_ci                # repr() is updated to include the name and type info
17197db96d56Sopenharmony_ci                return "{}({!r}, {})".format(
17207db96d56Sopenharmony_ci                        type(self).__name__,
17217db96d56Sopenharmony_ci                        self.__name__,
17227db96d56Sopenharmony_ci                        int.__repr__(self),
17237db96d56Sopenharmony_ci                        )
17247db96d56Sopenharmony_ci            def __str__(self):
17257db96d56Sopenharmony_ci                # str() is unchanged, even if it relies on the repr() fallback
17267db96d56Sopenharmony_ci                base = int
17277db96d56Sopenharmony_ci                base_str = base.__str__
17287db96d56Sopenharmony_ci                if base_str.__objclass__ is object:
17297db96d56Sopenharmony_ci                    return base.__repr__(self)
17307db96d56Sopenharmony_ci                return base_str(self)
17317db96d56Sopenharmony_ci            # for simplicity, we only define one operator that
17327db96d56Sopenharmony_ci            # propagates expressions
17337db96d56Sopenharmony_ci            def __add__(self, other):
17347db96d56Sopenharmony_ci                temp = int(self) + int( other)
17357db96d56Sopenharmony_ci                if isinstance(self, NamedInt) and isinstance(other, NamedInt):
17367db96d56Sopenharmony_ci                    return NamedInt(
17377db96d56Sopenharmony_ci                        '({0} + {1})'.format(self.__name__, other.__name__),
17387db96d56Sopenharmony_ci                        temp,
17397db96d56Sopenharmony_ci                        )
17407db96d56Sopenharmony_ci                else:
17417db96d56Sopenharmony_ci                    return temp
17427db96d56Sopenharmony_ci
17437db96d56Sopenharmony_ci        class NEI(NamedInt, Enum):
17447db96d56Sopenharmony_ci            __qualname__ = 'NEI'      # needed for pickle protocol 4
17457db96d56Sopenharmony_ci            x = ('the-x', 1)
17467db96d56Sopenharmony_ci            y = ('the-y', 2)
17477db96d56Sopenharmony_ci
17487db96d56Sopenharmony_ci
17497db96d56Sopenharmony_ci        self.assertIs(NEI.__new__, Enum.__new__)
17507db96d56Sopenharmony_ci        self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
17517db96d56Sopenharmony_ci        globals()['NamedInt'] = NamedInt
17527db96d56Sopenharmony_ci        globals()['NEI'] = NEI
17537db96d56Sopenharmony_ci        NI5 = NamedInt('test', 5)
17547db96d56Sopenharmony_ci        self.assertEqual(NI5, 5)
17557db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual, NI5, 5)
17567db96d56Sopenharmony_ci        self.assertEqual(NEI.y.value, 2)
17577db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI.y)
17587db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI)
17597db96d56Sopenharmony_ci
17607db96d56Sopenharmony_ci    def test_subclasses_with_reduce_ex(self):
17617db96d56Sopenharmony_ci        class NamedInt(int):
17627db96d56Sopenharmony_ci            __qualname__ = 'NamedInt'       # needed for pickle protocol 4
17637db96d56Sopenharmony_ci            def __new__(cls, *args):
17647db96d56Sopenharmony_ci                _args = args
17657db96d56Sopenharmony_ci                name, *args = args
17667db96d56Sopenharmony_ci                if len(args) == 0:
17677db96d56Sopenharmony_ci                    raise TypeError("name and value must be specified")
17687db96d56Sopenharmony_ci                self = int.__new__(cls, *args)
17697db96d56Sopenharmony_ci                self._intname = name
17707db96d56Sopenharmony_ci                self._args = _args
17717db96d56Sopenharmony_ci                return self
17727db96d56Sopenharmony_ci            def __reduce_ex__(self, proto):
17737db96d56Sopenharmony_ci                return self.__class__, self._args
17747db96d56Sopenharmony_ci            @bltns.property
17757db96d56Sopenharmony_ci            def __name__(self):
17767db96d56Sopenharmony_ci                return self._intname
17777db96d56Sopenharmony_ci            def __repr__(self):
17787db96d56Sopenharmony_ci                # repr() is updated to include the name and type info
17797db96d56Sopenharmony_ci                return "{}({!r}, {})".format(
17807db96d56Sopenharmony_ci                        type(self).__name__,
17817db96d56Sopenharmony_ci                        self.__name__,
17827db96d56Sopenharmony_ci                        int.__repr__(self),
17837db96d56Sopenharmony_ci                        )
17847db96d56Sopenharmony_ci            def __str__(self):
17857db96d56Sopenharmony_ci                # str() is unchanged, even if it relies on the repr() fallback
17867db96d56Sopenharmony_ci                base = int
17877db96d56Sopenharmony_ci                base_str = base.__str__
17887db96d56Sopenharmony_ci                if base_str.__objclass__ is object:
17897db96d56Sopenharmony_ci                    return base.__repr__(self)
17907db96d56Sopenharmony_ci                return base_str(self)
17917db96d56Sopenharmony_ci            # for simplicity, we only define one operator that
17927db96d56Sopenharmony_ci            # propagates expressions
17937db96d56Sopenharmony_ci            def __add__(self, other):
17947db96d56Sopenharmony_ci                temp = int(self) + int( other)
17957db96d56Sopenharmony_ci                if isinstance(self, NamedInt) and isinstance(other, NamedInt):
17967db96d56Sopenharmony_ci                    return NamedInt(
17977db96d56Sopenharmony_ci                        '({0} + {1})'.format(self.__name__, other.__name__),
17987db96d56Sopenharmony_ci                        temp,
17997db96d56Sopenharmony_ci                        )
18007db96d56Sopenharmony_ci                else:
18017db96d56Sopenharmony_ci                    return temp
18027db96d56Sopenharmony_ci
18037db96d56Sopenharmony_ci        class NEI(NamedInt, Enum):
18047db96d56Sopenharmony_ci            __qualname__ = 'NEI'      # needed for pickle protocol 4
18057db96d56Sopenharmony_ci            x = ('the-x', 1)
18067db96d56Sopenharmony_ci            y = ('the-y', 2)
18077db96d56Sopenharmony_ci
18087db96d56Sopenharmony_ci        self.assertIs(NEI.__new__, Enum.__new__)
18097db96d56Sopenharmony_ci        self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
18107db96d56Sopenharmony_ci        globals()['NamedInt'] = NamedInt
18117db96d56Sopenharmony_ci        globals()['NEI'] = NEI
18127db96d56Sopenharmony_ci        NI5 = NamedInt('test', 5)
18137db96d56Sopenharmony_ci        self.assertEqual(NI5, 5)
18147db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual, NI5, 5)
18157db96d56Sopenharmony_ci        self.assertEqual(NEI.y.value, 2)
18167db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI.y)
18177db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI)
18187db96d56Sopenharmony_ci
18197db96d56Sopenharmony_ci    def test_subclasses_without_direct_pickle_support(self):
18207db96d56Sopenharmony_ci        class NamedInt(int):
18217db96d56Sopenharmony_ci            __qualname__ = 'NamedInt'
18227db96d56Sopenharmony_ci            def __new__(cls, *args):
18237db96d56Sopenharmony_ci                _args = args
18247db96d56Sopenharmony_ci                name, *args = args
18257db96d56Sopenharmony_ci                if len(args) == 0:
18267db96d56Sopenharmony_ci                    raise TypeError("name and value must be specified")
18277db96d56Sopenharmony_ci                self = int.__new__(cls, *args)
18287db96d56Sopenharmony_ci                self._intname = name
18297db96d56Sopenharmony_ci                self._args = _args
18307db96d56Sopenharmony_ci                return self
18317db96d56Sopenharmony_ci            @bltns.property
18327db96d56Sopenharmony_ci            def __name__(self):
18337db96d56Sopenharmony_ci                return self._intname
18347db96d56Sopenharmony_ci            def __repr__(self):
18357db96d56Sopenharmony_ci                # repr() is updated to include the name and type info
18367db96d56Sopenharmony_ci                return "{}({!r}, {})".format(
18377db96d56Sopenharmony_ci                        type(self).__name__,
18387db96d56Sopenharmony_ci                        self.__name__,
18397db96d56Sopenharmony_ci                        int.__repr__(self),
18407db96d56Sopenharmony_ci                        )
18417db96d56Sopenharmony_ci            def __str__(self):
18427db96d56Sopenharmony_ci                # str() is unchanged, even if it relies on the repr() fallback
18437db96d56Sopenharmony_ci                base = int
18447db96d56Sopenharmony_ci                base_str = base.__str__
18457db96d56Sopenharmony_ci                if base_str.__objclass__ is object:
18467db96d56Sopenharmony_ci                    return base.__repr__(self)
18477db96d56Sopenharmony_ci                return base_str(self)
18487db96d56Sopenharmony_ci            # for simplicity, we only define one operator that
18497db96d56Sopenharmony_ci            # propagates expressions
18507db96d56Sopenharmony_ci            def __add__(self, other):
18517db96d56Sopenharmony_ci                temp = int(self) + int( other)
18527db96d56Sopenharmony_ci                if isinstance(self, NamedInt) and isinstance(other, NamedInt):
18537db96d56Sopenharmony_ci                    return NamedInt(
18547db96d56Sopenharmony_ci                        '({0} + {1})'.format(self.__name__, other.__name__),
18557db96d56Sopenharmony_ci                        temp )
18567db96d56Sopenharmony_ci                else:
18577db96d56Sopenharmony_ci                    return temp
18587db96d56Sopenharmony_ci
18597db96d56Sopenharmony_ci        class NEI(NamedInt, Enum):
18607db96d56Sopenharmony_ci            __qualname__ = 'NEI'
18617db96d56Sopenharmony_ci            x = ('the-x', 1)
18627db96d56Sopenharmony_ci            y = ('the-y', 2)
18637db96d56Sopenharmony_ci
18647db96d56Sopenharmony_ci        self.assertIs(NEI.__new__, Enum.__new__)
18657db96d56Sopenharmony_ci        self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
18667db96d56Sopenharmony_ci        globals()['NamedInt'] = NamedInt
18677db96d56Sopenharmony_ci        globals()['NEI'] = NEI
18687db96d56Sopenharmony_ci        NI5 = NamedInt('test', 5)
18697db96d56Sopenharmony_ci        self.assertEqual(NI5, 5)
18707db96d56Sopenharmony_ci        self.assertEqual(NEI.y.value, 2)
18717db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI.y)
18727db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI)
18737db96d56Sopenharmony_ci
18747db96d56Sopenharmony_ci    def test_subclasses_with_direct_pickle_support(self):
18757db96d56Sopenharmony_ci        class NamedInt(int):
18767db96d56Sopenharmony_ci            __qualname__ = 'NamedInt'
18777db96d56Sopenharmony_ci            def __new__(cls, *args):
18787db96d56Sopenharmony_ci                _args = args
18797db96d56Sopenharmony_ci                name, *args = args
18807db96d56Sopenharmony_ci                if len(args) == 0:
18817db96d56Sopenharmony_ci                    raise TypeError("name and value must be specified")
18827db96d56Sopenharmony_ci                self = int.__new__(cls, *args)
18837db96d56Sopenharmony_ci                self._intname = name
18847db96d56Sopenharmony_ci                self._args = _args
18857db96d56Sopenharmony_ci                return self
18867db96d56Sopenharmony_ci            @bltns.property
18877db96d56Sopenharmony_ci            def __name__(self):
18887db96d56Sopenharmony_ci                return self._intname
18897db96d56Sopenharmony_ci            def __repr__(self):
18907db96d56Sopenharmony_ci                # repr() is updated to include the name and type info
18917db96d56Sopenharmony_ci                return "{}({!r}, {})".format(
18927db96d56Sopenharmony_ci                        type(self).__name__,
18937db96d56Sopenharmony_ci                        self.__name__,
18947db96d56Sopenharmony_ci                        int.__repr__(self),
18957db96d56Sopenharmony_ci                        )
18967db96d56Sopenharmony_ci            def __str__(self):
18977db96d56Sopenharmony_ci                # str() is unchanged, even if it relies on the repr() fallback
18987db96d56Sopenharmony_ci                base = int
18997db96d56Sopenharmony_ci                base_str = base.__str__
19007db96d56Sopenharmony_ci                if base_str.__objclass__ is object:
19017db96d56Sopenharmony_ci                    return base.__repr__(self)
19027db96d56Sopenharmony_ci                return base_str(self)
19037db96d56Sopenharmony_ci            # for simplicity, we only define one operator that
19047db96d56Sopenharmony_ci            # propagates expressions
19057db96d56Sopenharmony_ci            def __add__(self, other):
19067db96d56Sopenharmony_ci                temp = int(self) + int( other)
19077db96d56Sopenharmony_ci                if isinstance(self, NamedInt) and isinstance(other, NamedInt):
19087db96d56Sopenharmony_ci                    return NamedInt(
19097db96d56Sopenharmony_ci                        '({0} + {1})'.format(self.__name__, other.__name__),
19107db96d56Sopenharmony_ci                        temp,
19117db96d56Sopenharmony_ci                        )
19127db96d56Sopenharmony_ci                else:
19137db96d56Sopenharmony_ci                    return temp
19147db96d56Sopenharmony_ci
19157db96d56Sopenharmony_ci        class NEI(NamedInt, Enum):
19167db96d56Sopenharmony_ci            __qualname__ = 'NEI'
19177db96d56Sopenharmony_ci            x = ('the-x', 1)
19187db96d56Sopenharmony_ci            y = ('the-y', 2)
19197db96d56Sopenharmony_ci            def __reduce_ex__(self, proto):
19207db96d56Sopenharmony_ci                return getattr, (self.__class__, self._name_)
19217db96d56Sopenharmony_ci
19227db96d56Sopenharmony_ci        self.assertIs(NEI.__new__, Enum.__new__)
19237db96d56Sopenharmony_ci        self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
19247db96d56Sopenharmony_ci        globals()['NamedInt'] = NamedInt
19257db96d56Sopenharmony_ci        globals()['NEI'] = NEI
19267db96d56Sopenharmony_ci        NI5 = NamedInt('test', 5)
19277db96d56Sopenharmony_ci        self.assertEqual(NI5, 5)
19287db96d56Sopenharmony_ci        self.assertEqual(NEI.y.value, 2)
19297db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI.y)
19307db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, NEI)
19317db96d56Sopenharmony_ci
19327db96d56Sopenharmony_ci    def test_tuple_subclass(self):
19337db96d56Sopenharmony_ci        class SomeTuple(tuple, Enum):
19347db96d56Sopenharmony_ci            __qualname__ = 'SomeTuple'      # needed for pickle protocol 4
19357db96d56Sopenharmony_ci            first = (1, 'for the money')
19367db96d56Sopenharmony_ci            second = (2, 'for the show')
19377db96d56Sopenharmony_ci            third = (3, 'for the music')
19387db96d56Sopenharmony_ci        self.assertIs(type(SomeTuple.first), SomeTuple)
19397db96d56Sopenharmony_ci        self.assertIsInstance(SomeTuple.second, tuple)
19407db96d56Sopenharmony_ci        self.assertEqual(SomeTuple.third, (3, 'for the music'))
19417db96d56Sopenharmony_ci        globals()['SomeTuple'] = SomeTuple
19427db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, SomeTuple.first)
19437db96d56Sopenharmony_ci
19447db96d56Sopenharmony_ci    def test_duplicate_values_give_unique_enum_items(self):
19457db96d56Sopenharmony_ci        class AutoNumber(Enum):
19467db96d56Sopenharmony_ci            first = ()
19477db96d56Sopenharmony_ci            second = ()
19487db96d56Sopenharmony_ci            third = ()
19497db96d56Sopenharmony_ci            def __new__(cls):
19507db96d56Sopenharmony_ci                value = len(cls.__members__) + 1
19517db96d56Sopenharmony_ci                obj = object.__new__(cls)
19527db96d56Sopenharmony_ci                obj._value_ = value
19537db96d56Sopenharmony_ci                return obj
19547db96d56Sopenharmony_ci            def __int__(self):
19557db96d56Sopenharmony_ci                return int(self._value_)
19567db96d56Sopenharmony_ci        self.assertEqual(
19577db96d56Sopenharmony_ci                list(AutoNumber),
19587db96d56Sopenharmony_ci                [AutoNumber.first, AutoNumber.second, AutoNumber.third],
19597db96d56Sopenharmony_ci                )
19607db96d56Sopenharmony_ci        self.assertEqual(int(AutoNumber.second), 2)
19617db96d56Sopenharmony_ci        self.assertEqual(AutoNumber.third.value, 3)
19627db96d56Sopenharmony_ci        self.assertIs(AutoNumber(1), AutoNumber.first)
19637db96d56Sopenharmony_ci
19647db96d56Sopenharmony_ci    def test_inherited_new_from_enhanced_enum(self):
19657db96d56Sopenharmony_ci        class AutoNumber(Enum):
19667db96d56Sopenharmony_ci            def __new__(cls):
19677db96d56Sopenharmony_ci                value = len(cls.__members__) + 1
19687db96d56Sopenharmony_ci                obj = object.__new__(cls)
19697db96d56Sopenharmony_ci                obj._value_ = value
19707db96d56Sopenharmony_ci                return obj
19717db96d56Sopenharmony_ci            def __int__(self):
19727db96d56Sopenharmony_ci                return int(self._value_)
19737db96d56Sopenharmony_ci        class Color(AutoNumber):
19747db96d56Sopenharmony_ci            red = ()
19757db96d56Sopenharmony_ci            green = ()
19767db96d56Sopenharmony_ci            blue = ()
19777db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.red, Color.green, Color.blue])
19787db96d56Sopenharmony_ci        self.assertEqual(list(map(int, Color)), [1, 2, 3])
19797db96d56Sopenharmony_ci
19807db96d56Sopenharmony_ci    def test_inherited_new_from_mixed_enum(self):
19817db96d56Sopenharmony_ci        class AutoNumber(IntEnum):
19827db96d56Sopenharmony_ci            def __new__(cls):
19837db96d56Sopenharmony_ci                value = len(cls.__members__) + 1
19847db96d56Sopenharmony_ci                obj = int.__new__(cls, value)
19857db96d56Sopenharmony_ci                obj._value_ = value
19867db96d56Sopenharmony_ci                return obj
19877db96d56Sopenharmony_ci        class Color(AutoNumber):
19887db96d56Sopenharmony_ci            red = ()
19897db96d56Sopenharmony_ci            green = ()
19907db96d56Sopenharmony_ci            blue = ()
19917db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.red, Color.green, Color.blue])
19927db96d56Sopenharmony_ci        self.assertEqual(list(map(int, Color)), [1, 2, 3])
19937db96d56Sopenharmony_ci
19947db96d56Sopenharmony_ci    def test_equality(self):
19957db96d56Sopenharmony_ci        class OrdinaryEnum(Enum):
19967db96d56Sopenharmony_ci            a = 1
19977db96d56Sopenharmony_ci        self.assertEqual(ALWAYS_EQ, OrdinaryEnum.a)
19987db96d56Sopenharmony_ci        self.assertEqual(OrdinaryEnum.a, ALWAYS_EQ)
19997db96d56Sopenharmony_ci
20007db96d56Sopenharmony_ci    def test_ordered_mixin(self):
20017db96d56Sopenharmony_ci        class OrderedEnum(Enum):
20027db96d56Sopenharmony_ci            def __ge__(self, other):
20037db96d56Sopenharmony_ci                if self.__class__ is other.__class__:
20047db96d56Sopenharmony_ci                    return self._value_ >= other._value_
20057db96d56Sopenharmony_ci                return NotImplemented
20067db96d56Sopenharmony_ci            def __gt__(self, other):
20077db96d56Sopenharmony_ci                if self.__class__ is other.__class__:
20087db96d56Sopenharmony_ci                    return self._value_ > other._value_
20097db96d56Sopenharmony_ci                return NotImplemented
20107db96d56Sopenharmony_ci            def __le__(self, other):
20117db96d56Sopenharmony_ci                if self.__class__ is other.__class__:
20127db96d56Sopenharmony_ci                    return self._value_ <= other._value_
20137db96d56Sopenharmony_ci                return NotImplemented
20147db96d56Sopenharmony_ci            def __lt__(self, other):
20157db96d56Sopenharmony_ci                if self.__class__ is other.__class__:
20167db96d56Sopenharmony_ci                    return self._value_ < other._value_
20177db96d56Sopenharmony_ci                return NotImplemented
20187db96d56Sopenharmony_ci        class Grade(OrderedEnum):
20197db96d56Sopenharmony_ci            A = 5
20207db96d56Sopenharmony_ci            B = 4
20217db96d56Sopenharmony_ci            C = 3
20227db96d56Sopenharmony_ci            D = 2
20237db96d56Sopenharmony_ci            F = 1
20247db96d56Sopenharmony_ci        self.assertGreater(Grade.A, Grade.B)
20257db96d56Sopenharmony_ci        self.assertLessEqual(Grade.F, Grade.C)
20267db96d56Sopenharmony_ci        self.assertLess(Grade.D, Grade.A)
20277db96d56Sopenharmony_ci        self.assertGreaterEqual(Grade.B, Grade.B)
20287db96d56Sopenharmony_ci        self.assertEqual(Grade.B, Grade.B)
20297db96d56Sopenharmony_ci        self.assertNotEqual(Grade.C, Grade.D)
20307db96d56Sopenharmony_ci
20317db96d56Sopenharmony_ci    def test_extending2(self):
20327db96d56Sopenharmony_ci        class Shade(Enum):
20337db96d56Sopenharmony_ci            def shade(self):
20347db96d56Sopenharmony_ci                print(self.name)
20357db96d56Sopenharmony_ci        class Color(Shade):
20367db96d56Sopenharmony_ci            red = 1
20377db96d56Sopenharmony_ci            green = 2
20387db96d56Sopenharmony_ci            blue = 3
20397db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
20407db96d56Sopenharmony_ci            class MoreColor(Color):
20417db96d56Sopenharmony_ci                cyan = 4
20427db96d56Sopenharmony_ci                magenta = 5
20437db96d56Sopenharmony_ci                yellow = 6
20447db96d56Sopenharmony_ci
20457db96d56Sopenharmony_ci    def test_extending3(self):
20467db96d56Sopenharmony_ci        class Shade(Enum):
20477db96d56Sopenharmony_ci            def shade(self):
20487db96d56Sopenharmony_ci                return self.name
20497db96d56Sopenharmony_ci        class Color(Shade):
20507db96d56Sopenharmony_ci            def hex(self):
20517db96d56Sopenharmony_ci                return '%s hexlified!' % self.value
20527db96d56Sopenharmony_ci        class MoreColor(Color):
20537db96d56Sopenharmony_ci            cyan = 4
20547db96d56Sopenharmony_ci            magenta = 5
20557db96d56Sopenharmony_ci            yellow = 6
20567db96d56Sopenharmony_ci        self.assertEqual(MoreColor.magenta.hex(), '5 hexlified!')
20577db96d56Sopenharmony_ci
20587db96d56Sopenharmony_ci    def test_subclass_duplicate_name(self):
20597db96d56Sopenharmony_ci        class Base(Enum):
20607db96d56Sopenharmony_ci            def test(self):
20617db96d56Sopenharmony_ci                pass
20627db96d56Sopenharmony_ci        class Test(Base):
20637db96d56Sopenharmony_ci            test = 1
20647db96d56Sopenharmony_ci        self.assertIs(type(Test.test), Test)
20657db96d56Sopenharmony_ci
20667db96d56Sopenharmony_ci    def test_subclass_duplicate_name_dynamic(self):
20677db96d56Sopenharmony_ci        from types import DynamicClassAttribute
20687db96d56Sopenharmony_ci        class Base(Enum):
20697db96d56Sopenharmony_ci            @DynamicClassAttribute
20707db96d56Sopenharmony_ci            def test(self):
20717db96d56Sopenharmony_ci                return 'dynamic'
20727db96d56Sopenharmony_ci        class Test(Base):
20737db96d56Sopenharmony_ci            test = 1
20747db96d56Sopenharmony_ci        self.assertEqual(Test.test.test, 'dynamic')
20757db96d56Sopenharmony_ci        self.assertEqual(Test.test.value, 1)
20767db96d56Sopenharmony_ci        class Base2(Enum):
20777db96d56Sopenharmony_ci            @enum.property
20787db96d56Sopenharmony_ci            def flash(self):
20797db96d56Sopenharmony_ci                return 'flashy dynamic'
20807db96d56Sopenharmony_ci        class Test(Base2):
20817db96d56Sopenharmony_ci            flash = 1
20827db96d56Sopenharmony_ci        self.assertEqual(Test.flash.flash, 'flashy dynamic')
20837db96d56Sopenharmony_ci        self.assertEqual(Test.flash.value, 1)
20847db96d56Sopenharmony_ci
20857db96d56Sopenharmony_ci    def test_no_duplicates(self):
20867db96d56Sopenharmony_ci        class UniqueEnum(Enum):
20877db96d56Sopenharmony_ci            def __init__(self, *args):
20887db96d56Sopenharmony_ci                cls = self.__class__
20897db96d56Sopenharmony_ci                if any(self.value == e.value for e in cls):
20907db96d56Sopenharmony_ci                    a = self.name
20917db96d56Sopenharmony_ci                    e = cls(self.value).name
20927db96d56Sopenharmony_ci                    raise ValueError(
20937db96d56Sopenharmony_ci                            "aliases not allowed in UniqueEnum:  %r --> %r"
20947db96d56Sopenharmony_ci                            % (a, e)
20957db96d56Sopenharmony_ci                            )
20967db96d56Sopenharmony_ci        class Color(UniqueEnum):
20977db96d56Sopenharmony_ci            red = 1
20987db96d56Sopenharmony_ci            green = 2
20997db96d56Sopenharmony_ci            blue = 3
21007db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
21017db96d56Sopenharmony_ci            class Color(UniqueEnum):
21027db96d56Sopenharmony_ci                red = 1
21037db96d56Sopenharmony_ci                green = 2
21047db96d56Sopenharmony_ci                blue = 3
21057db96d56Sopenharmony_ci                grene = 2
21067db96d56Sopenharmony_ci
21077db96d56Sopenharmony_ci    def test_init(self):
21087db96d56Sopenharmony_ci        class Planet(Enum):
21097db96d56Sopenharmony_ci            MERCURY = (3.303e+23, 2.4397e6)
21107db96d56Sopenharmony_ci            VENUS   = (4.869e+24, 6.0518e6)
21117db96d56Sopenharmony_ci            EARTH   = (5.976e+24, 6.37814e6)
21127db96d56Sopenharmony_ci            MARS    = (6.421e+23, 3.3972e6)
21137db96d56Sopenharmony_ci            JUPITER = (1.9e+27,   7.1492e7)
21147db96d56Sopenharmony_ci            SATURN  = (5.688e+26, 6.0268e7)
21157db96d56Sopenharmony_ci            URANUS  = (8.686e+25, 2.5559e7)
21167db96d56Sopenharmony_ci            NEPTUNE = (1.024e+26, 2.4746e7)
21177db96d56Sopenharmony_ci            def __init__(self, mass, radius):
21187db96d56Sopenharmony_ci                self.mass = mass       # in kilograms
21197db96d56Sopenharmony_ci                self.radius = radius   # in meters
21207db96d56Sopenharmony_ci            @enum.property
21217db96d56Sopenharmony_ci            def surface_gravity(self):
21227db96d56Sopenharmony_ci                # universal gravitational constant  (m3 kg-1 s-2)
21237db96d56Sopenharmony_ci                G = 6.67300E-11
21247db96d56Sopenharmony_ci                return G * self.mass / (self.radius * self.radius)
21257db96d56Sopenharmony_ci        self.assertEqual(round(Planet.EARTH.surface_gravity, 2), 9.80)
21267db96d56Sopenharmony_ci        self.assertEqual(Planet.EARTH.value, (5.976e+24, 6.37814e6))
21277db96d56Sopenharmony_ci
21287db96d56Sopenharmony_ci    def test_ignore(self):
21297db96d56Sopenharmony_ci        class Period(timedelta, Enum):
21307db96d56Sopenharmony_ci            '''
21317db96d56Sopenharmony_ci            different lengths of time
21327db96d56Sopenharmony_ci            '''
21337db96d56Sopenharmony_ci            def __new__(cls, value, period):
21347db96d56Sopenharmony_ci                obj = timedelta.__new__(cls, value)
21357db96d56Sopenharmony_ci                obj._value_ = value
21367db96d56Sopenharmony_ci                obj.period = period
21377db96d56Sopenharmony_ci                return obj
21387db96d56Sopenharmony_ci            _ignore_ = 'Period i'
21397db96d56Sopenharmony_ci            Period = vars()
21407db96d56Sopenharmony_ci            for i in range(13):
21417db96d56Sopenharmony_ci                Period['month_%d' % i] = i*30, 'month'
21427db96d56Sopenharmony_ci            for i in range(53):
21437db96d56Sopenharmony_ci                Period['week_%d' % i] = i*7, 'week'
21447db96d56Sopenharmony_ci            for i in range(32):
21457db96d56Sopenharmony_ci                Period['day_%d' % i] = i, 'day'
21467db96d56Sopenharmony_ci            OneDay = day_1
21477db96d56Sopenharmony_ci            OneWeek = week_1
21487db96d56Sopenharmony_ci            OneMonth = month_1
21497db96d56Sopenharmony_ci        self.assertFalse(hasattr(Period, '_ignore_'))
21507db96d56Sopenharmony_ci        self.assertFalse(hasattr(Period, 'Period'))
21517db96d56Sopenharmony_ci        self.assertFalse(hasattr(Period, 'i'))
21527db96d56Sopenharmony_ci        self.assertTrue(isinstance(Period.day_1, timedelta))
21537db96d56Sopenharmony_ci        self.assertTrue(Period.month_1 is Period.day_30)
21547db96d56Sopenharmony_ci        self.assertTrue(Period.week_4 is Period.day_28)
21557db96d56Sopenharmony_ci
21567db96d56Sopenharmony_ci    def test_nonhash_value(self):
21577db96d56Sopenharmony_ci        class AutoNumberInAList(Enum):
21587db96d56Sopenharmony_ci            def __new__(cls):
21597db96d56Sopenharmony_ci                value = [len(cls.__members__) + 1]
21607db96d56Sopenharmony_ci                obj = object.__new__(cls)
21617db96d56Sopenharmony_ci                obj._value_ = value
21627db96d56Sopenharmony_ci                return obj
21637db96d56Sopenharmony_ci        class ColorInAList(AutoNumberInAList):
21647db96d56Sopenharmony_ci            red = ()
21657db96d56Sopenharmony_ci            green = ()
21667db96d56Sopenharmony_ci            blue = ()
21677db96d56Sopenharmony_ci        self.assertEqual(list(ColorInAList), [ColorInAList.red, ColorInAList.green, ColorInAList.blue])
21687db96d56Sopenharmony_ci        for enum, value in zip(ColorInAList, range(3)):
21697db96d56Sopenharmony_ci            value += 1
21707db96d56Sopenharmony_ci            self.assertEqual(enum.value, [value])
21717db96d56Sopenharmony_ci            self.assertIs(ColorInAList([value]), enum)
21727db96d56Sopenharmony_ci
21737db96d56Sopenharmony_ci    def test_conflicting_types_resolved_in_new(self):
21747db96d56Sopenharmony_ci        class LabelledIntEnum(int, Enum):
21757db96d56Sopenharmony_ci            def __new__(cls, *args):
21767db96d56Sopenharmony_ci                value, label = args
21777db96d56Sopenharmony_ci                obj = int.__new__(cls, value)
21787db96d56Sopenharmony_ci                obj.label = label
21797db96d56Sopenharmony_ci                obj._value_ = value
21807db96d56Sopenharmony_ci                return obj
21817db96d56Sopenharmony_ci
21827db96d56Sopenharmony_ci        class LabelledList(LabelledIntEnum):
21837db96d56Sopenharmony_ci            unprocessed = (1, "Unprocessed")
21847db96d56Sopenharmony_ci            payment_complete = (2, "Payment Complete")
21857db96d56Sopenharmony_ci
21867db96d56Sopenharmony_ci        self.assertEqual(list(LabelledList), [LabelledList.unprocessed, LabelledList.payment_complete])
21877db96d56Sopenharmony_ci        self.assertEqual(LabelledList.unprocessed, 1)
21887db96d56Sopenharmony_ci        self.assertEqual(LabelledList(1), LabelledList.unprocessed)
21897db96d56Sopenharmony_ci
21907db96d56Sopenharmony_ci    def test_default_missing_no_chained_exception(self):
21917db96d56Sopenharmony_ci        class Color(Enum):
21927db96d56Sopenharmony_ci            RED = 1
21937db96d56Sopenharmony_ci            GREEN = 2
21947db96d56Sopenharmony_ci            BLUE = 3
21957db96d56Sopenharmony_ci        try:
21967db96d56Sopenharmony_ci            Color(7)
21977db96d56Sopenharmony_ci        except ValueError as exc:
21987db96d56Sopenharmony_ci            self.assertTrue(exc.__context__ is None)
21997db96d56Sopenharmony_ci        else:
22007db96d56Sopenharmony_ci            raise Exception('Exception not raised.')
22017db96d56Sopenharmony_ci
22027db96d56Sopenharmony_ci    def test_missing_override(self):
22037db96d56Sopenharmony_ci        class Color(Enum):
22047db96d56Sopenharmony_ci            red = 1
22057db96d56Sopenharmony_ci            green = 2
22067db96d56Sopenharmony_ci            blue = 3
22077db96d56Sopenharmony_ci            @classmethod
22087db96d56Sopenharmony_ci            def _missing_(cls, item):
22097db96d56Sopenharmony_ci                if item == 'three':
22107db96d56Sopenharmony_ci                    return cls.blue
22117db96d56Sopenharmony_ci                elif item == 'bad return':
22127db96d56Sopenharmony_ci                    # trigger internal error
22137db96d56Sopenharmony_ci                    return 5
22147db96d56Sopenharmony_ci                elif item == 'error out':
22157db96d56Sopenharmony_ci                    raise ZeroDivisionError
22167db96d56Sopenharmony_ci                else:
22177db96d56Sopenharmony_ci                    # trigger not found
22187db96d56Sopenharmony_ci                    return None
22197db96d56Sopenharmony_ci        self.assertIs(Color('three'), Color.blue)
22207db96d56Sopenharmony_ci        try:
22217db96d56Sopenharmony_ci            Color(7)
22227db96d56Sopenharmony_ci        except ValueError as exc:
22237db96d56Sopenharmony_ci            self.assertTrue(exc.__context__ is None)
22247db96d56Sopenharmony_ci        else:
22257db96d56Sopenharmony_ci            raise Exception('Exception not raised.')
22267db96d56Sopenharmony_ci        try:
22277db96d56Sopenharmony_ci            Color('bad return')
22287db96d56Sopenharmony_ci        except TypeError as exc:
22297db96d56Sopenharmony_ci            self.assertTrue(isinstance(exc.__context__, ValueError))
22307db96d56Sopenharmony_ci        else:
22317db96d56Sopenharmony_ci            raise Exception('Exception not raised.')
22327db96d56Sopenharmony_ci        try:
22337db96d56Sopenharmony_ci            Color('error out')
22347db96d56Sopenharmony_ci        except ZeroDivisionError as exc:
22357db96d56Sopenharmony_ci            self.assertTrue(isinstance(exc.__context__, ValueError))
22367db96d56Sopenharmony_ci        else:
22377db96d56Sopenharmony_ci            raise Exception('Exception not raised.')
22387db96d56Sopenharmony_ci
22397db96d56Sopenharmony_ci    def test_missing_exceptions_reset(self):
22407db96d56Sopenharmony_ci        import gc
22417db96d56Sopenharmony_ci        import weakref
22427db96d56Sopenharmony_ci        #
22437db96d56Sopenharmony_ci        class TestEnum(enum.Enum):
22447db96d56Sopenharmony_ci            VAL1 = 'val1'
22457db96d56Sopenharmony_ci            VAL2 = 'val2'
22467db96d56Sopenharmony_ci        #
22477db96d56Sopenharmony_ci        class Class1:
22487db96d56Sopenharmony_ci            def __init__(self):
22497db96d56Sopenharmony_ci                # Gracefully handle an exception of our own making
22507db96d56Sopenharmony_ci                try:
22517db96d56Sopenharmony_ci                    raise ValueError()
22527db96d56Sopenharmony_ci                except ValueError:
22537db96d56Sopenharmony_ci                    pass
22547db96d56Sopenharmony_ci        #
22557db96d56Sopenharmony_ci        class Class2:
22567db96d56Sopenharmony_ci            def __init__(self):
22577db96d56Sopenharmony_ci                # Gracefully handle an exception of Enum's making
22587db96d56Sopenharmony_ci                try:
22597db96d56Sopenharmony_ci                    TestEnum('invalid_value')
22607db96d56Sopenharmony_ci                except ValueError:
22617db96d56Sopenharmony_ci                    pass
22627db96d56Sopenharmony_ci        # No strong refs here so these are free to die.
22637db96d56Sopenharmony_ci        class_1_ref = weakref.ref(Class1())
22647db96d56Sopenharmony_ci        class_2_ref = weakref.ref(Class2())
22657db96d56Sopenharmony_ci        #
22667db96d56Sopenharmony_ci        # The exception raised by Enum used to create a reference loop and thus
22677db96d56Sopenharmony_ci        # Class2 instances would stick around until the next garbage collection
22687db96d56Sopenharmony_ci        # cycle, unlike Class1.  Verify Class2 no longer does this.
22697db96d56Sopenharmony_ci        gc.collect()  # For PyPy or other GCs.
22707db96d56Sopenharmony_ci        self.assertIs(class_1_ref(), None)
22717db96d56Sopenharmony_ci        self.assertIs(class_2_ref(), None)
22727db96d56Sopenharmony_ci
22737db96d56Sopenharmony_ci    def test_multiple_mixin(self):
22747db96d56Sopenharmony_ci        class MaxMixin:
22757db96d56Sopenharmony_ci            @classproperty
22767db96d56Sopenharmony_ci            def MAX(cls):
22777db96d56Sopenharmony_ci                max = len(cls)
22787db96d56Sopenharmony_ci                cls.MAX = max
22797db96d56Sopenharmony_ci                return max
22807db96d56Sopenharmony_ci        class StrMixin:
22817db96d56Sopenharmony_ci            def __str__(self):
22827db96d56Sopenharmony_ci                return self._name_.lower()
22837db96d56Sopenharmony_ci        class SomeEnum(Enum):
22847db96d56Sopenharmony_ci            def behavior(self):
22857db96d56Sopenharmony_ci                return 'booyah'
22867db96d56Sopenharmony_ci        class AnotherEnum(Enum):
22877db96d56Sopenharmony_ci            def behavior(self):
22887db96d56Sopenharmony_ci                return 'nuhuh!'
22897db96d56Sopenharmony_ci            def social(self):
22907db96d56Sopenharmony_ci                return "what's up?"
22917db96d56Sopenharmony_ci        class Color(MaxMixin, Enum):
22927db96d56Sopenharmony_ci            RED = auto()
22937db96d56Sopenharmony_ci            GREEN = auto()
22947db96d56Sopenharmony_ci            BLUE = auto()
22957db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
22967db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
22977db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 3)
22987db96d56Sopenharmony_ci        self.assertEqual(Color.MAX, 3)
22997db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'Color.BLUE')
23007db96d56Sopenharmony_ci        class Color(MaxMixin, StrMixin, Enum):
23017db96d56Sopenharmony_ci            RED = auto()
23027db96d56Sopenharmony_ci            GREEN = auto()
23037db96d56Sopenharmony_ci            BLUE = auto()
23047db96d56Sopenharmony_ci            __str__ = StrMixin.__str__          # needed as of 3.11
23057db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
23067db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
23077db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 3)
23087db96d56Sopenharmony_ci        self.assertEqual(Color.MAX, 3)
23097db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'blue')
23107db96d56Sopenharmony_ci        class Color(StrMixin, MaxMixin, Enum):
23117db96d56Sopenharmony_ci            RED = auto()
23127db96d56Sopenharmony_ci            GREEN = auto()
23137db96d56Sopenharmony_ci            BLUE = auto()
23147db96d56Sopenharmony_ci            __str__ = StrMixin.__str__          # needed as of 3.11
23157db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
23167db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
23177db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 3)
23187db96d56Sopenharmony_ci        self.assertEqual(Color.MAX, 3)
23197db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'blue')
23207db96d56Sopenharmony_ci        class CoolColor(StrMixin, SomeEnum, Enum):
23217db96d56Sopenharmony_ci            RED = auto()
23227db96d56Sopenharmony_ci            GREEN = auto()
23237db96d56Sopenharmony_ci            BLUE = auto()
23247db96d56Sopenharmony_ci            __str__ = StrMixin.__str__          # needed as of 3.11
23257db96d56Sopenharmony_ci        self.assertEqual(CoolColor.RED.value, 1)
23267db96d56Sopenharmony_ci        self.assertEqual(CoolColor.GREEN.value, 2)
23277db96d56Sopenharmony_ci        self.assertEqual(CoolColor.BLUE.value, 3)
23287db96d56Sopenharmony_ci        self.assertEqual(str(CoolColor.BLUE), 'blue')
23297db96d56Sopenharmony_ci        self.assertEqual(CoolColor.RED.behavior(), 'booyah')
23307db96d56Sopenharmony_ci        class CoolerColor(StrMixin, AnotherEnum, Enum):
23317db96d56Sopenharmony_ci            RED = auto()
23327db96d56Sopenharmony_ci            GREEN = auto()
23337db96d56Sopenharmony_ci            BLUE = auto()
23347db96d56Sopenharmony_ci            __str__ = StrMixin.__str__          # needed as of 3.11
23357db96d56Sopenharmony_ci        self.assertEqual(CoolerColor.RED.value, 1)
23367db96d56Sopenharmony_ci        self.assertEqual(CoolerColor.GREEN.value, 2)
23377db96d56Sopenharmony_ci        self.assertEqual(CoolerColor.BLUE.value, 3)
23387db96d56Sopenharmony_ci        self.assertEqual(str(CoolerColor.BLUE), 'blue')
23397db96d56Sopenharmony_ci        self.assertEqual(CoolerColor.RED.behavior(), 'nuhuh!')
23407db96d56Sopenharmony_ci        self.assertEqual(CoolerColor.RED.social(), "what's up?")
23417db96d56Sopenharmony_ci        class CoolestColor(StrMixin, SomeEnum, AnotherEnum):
23427db96d56Sopenharmony_ci            RED = auto()
23437db96d56Sopenharmony_ci            GREEN = auto()
23447db96d56Sopenharmony_ci            BLUE = auto()
23457db96d56Sopenharmony_ci            __str__ = StrMixin.__str__          # needed as of 3.11
23467db96d56Sopenharmony_ci        self.assertEqual(CoolestColor.RED.value, 1)
23477db96d56Sopenharmony_ci        self.assertEqual(CoolestColor.GREEN.value, 2)
23487db96d56Sopenharmony_ci        self.assertEqual(CoolestColor.BLUE.value, 3)
23497db96d56Sopenharmony_ci        self.assertEqual(str(CoolestColor.BLUE), 'blue')
23507db96d56Sopenharmony_ci        self.assertEqual(CoolestColor.RED.behavior(), 'booyah')
23517db96d56Sopenharmony_ci        self.assertEqual(CoolestColor.RED.social(), "what's up?")
23527db96d56Sopenharmony_ci        class ConfusedColor(StrMixin, AnotherEnum, SomeEnum):
23537db96d56Sopenharmony_ci            RED = auto()
23547db96d56Sopenharmony_ci            GREEN = auto()
23557db96d56Sopenharmony_ci            BLUE = auto()
23567db96d56Sopenharmony_ci            __str__ = StrMixin.__str__          # needed as of 3.11
23577db96d56Sopenharmony_ci        self.assertEqual(ConfusedColor.RED.value, 1)
23587db96d56Sopenharmony_ci        self.assertEqual(ConfusedColor.GREEN.value, 2)
23597db96d56Sopenharmony_ci        self.assertEqual(ConfusedColor.BLUE.value, 3)
23607db96d56Sopenharmony_ci        self.assertEqual(str(ConfusedColor.BLUE), 'blue')
23617db96d56Sopenharmony_ci        self.assertEqual(ConfusedColor.RED.behavior(), 'nuhuh!')
23627db96d56Sopenharmony_ci        self.assertEqual(ConfusedColor.RED.social(), "what's up?")
23637db96d56Sopenharmony_ci        class ReformedColor(StrMixin, IntEnum, SomeEnum, AnotherEnum):
23647db96d56Sopenharmony_ci            RED = auto()
23657db96d56Sopenharmony_ci            GREEN = auto()
23667db96d56Sopenharmony_ci            BLUE = auto()
23677db96d56Sopenharmony_ci            __str__ = StrMixin.__str__          # needed as of 3.11
23687db96d56Sopenharmony_ci        self.assertEqual(ReformedColor.RED.value, 1)
23697db96d56Sopenharmony_ci        self.assertEqual(ReformedColor.GREEN.value, 2)
23707db96d56Sopenharmony_ci        self.assertEqual(ReformedColor.BLUE.value, 3)
23717db96d56Sopenharmony_ci        self.assertEqual(str(ReformedColor.BLUE), 'blue')
23727db96d56Sopenharmony_ci        self.assertEqual(ReformedColor.RED.behavior(), 'booyah')
23737db96d56Sopenharmony_ci        self.assertEqual(ConfusedColor.RED.social(), "what's up?")
23747db96d56Sopenharmony_ci        self.assertTrue(issubclass(ReformedColor, int))
23757db96d56Sopenharmony_ci
23767db96d56Sopenharmony_ci    def test_multiple_inherited_mixin(self):
23777db96d56Sopenharmony_ci        @unique
23787db96d56Sopenharmony_ci        class Decision1(StrEnum):
23797db96d56Sopenharmony_ci            REVERT = "REVERT"
23807db96d56Sopenharmony_ci            REVERT_ALL = "REVERT_ALL"
23817db96d56Sopenharmony_ci            RETRY = "RETRY"
23827db96d56Sopenharmony_ci        class MyEnum(StrEnum):
23837db96d56Sopenharmony_ci            pass
23847db96d56Sopenharmony_ci        @unique
23857db96d56Sopenharmony_ci        class Decision2(MyEnum):
23867db96d56Sopenharmony_ci            REVERT = "REVERT"
23877db96d56Sopenharmony_ci            REVERT_ALL = "REVERT_ALL"
23887db96d56Sopenharmony_ci            RETRY = "RETRY"
23897db96d56Sopenharmony_ci
23907db96d56Sopenharmony_ci    def test_multiple_mixin_inherited(self):
23917db96d56Sopenharmony_ci        class MyInt(int):
23927db96d56Sopenharmony_ci            def __new__(cls, value):
23937db96d56Sopenharmony_ci                return super().__new__(cls, value)
23947db96d56Sopenharmony_ci
23957db96d56Sopenharmony_ci        class HexMixin:
23967db96d56Sopenharmony_ci            def __repr__(self):
23977db96d56Sopenharmony_ci                return hex(self)
23987db96d56Sopenharmony_ci
23997db96d56Sopenharmony_ci        class MyIntEnum(HexMixin, MyInt, enum.Enum):
24007db96d56Sopenharmony_ci            __repr__ = HexMixin.__repr__
24017db96d56Sopenharmony_ci
24027db96d56Sopenharmony_ci        class Foo(MyIntEnum):
24037db96d56Sopenharmony_ci            TEST = 1
24047db96d56Sopenharmony_ci        self.assertTrue(isinstance(Foo.TEST, MyInt))
24057db96d56Sopenharmony_ci        self.assertEqual(Foo._member_type_, MyInt)
24067db96d56Sopenharmony_ci        self.assertEqual(repr(Foo.TEST), "0x1")
24077db96d56Sopenharmony_ci
24087db96d56Sopenharmony_ci        class Fee(MyIntEnum):
24097db96d56Sopenharmony_ci            TEST = 1
24107db96d56Sopenharmony_ci            def __new__(cls, value):
24117db96d56Sopenharmony_ci                value += 1
24127db96d56Sopenharmony_ci                member = int.__new__(cls, value)
24137db96d56Sopenharmony_ci                member._value_ = value
24147db96d56Sopenharmony_ci                return member
24157db96d56Sopenharmony_ci        self.assertEqual(Fee.TEST, 2)
24167db96d56Sopenharmony_ci
24177db96d56Sopenharmony_ci    def test_multiple_mixin_with_common_data_type(self):
24187db96d56Sopenharmony_ci        class CaseInsensitiveStrEnum(str, Enum):
24197db96d56Sopenharmony_ci            @classmethod
24207db96d56Sopenharmony_ci            def _missing_(cls, value):
24217db96d56Sopenharmony_ci                for member in cls._member_map_.values():
24227db96d56Sopenharmony_ci                    if member._value_.lower() == value.lower():
24237db96d56Sopenharmony_ci                        return member
24247db96d56Sopenharmony_ci                return super()._missing_(value)
24257db96d56Sopenharmony_ci        #
24267db96d56Sopenharmony_ci        class LenientStrEnum(str, Enum):
24277db96d56Sopenharmony_ci            def __init__(self, *args):
24287db96d56Sopenharmony_ci                self._valid = True
24297db96d56Sopenharmony_ci            @classmethod
24307db96d56Sopenharmony_ci            def _missing_(cls, value):
24317db96d56Sopenharmony_ci                unknown = cls._member_type_.__new__(cls, value)
24327db96d56Sopenharmony_ci                unknown._valid = False
24337db96d56Sopenharmony_ci                unknown._name_ = value.upper()
24347db96d56Sopenharmony_ci                unknown._value_ = value
24357db96d56Sopenharmony_ci                cls._member_map_[value] = unknown
24367db96d56Sopenharmony_ci                return unknown
24377db96d56Sopenharmony_ci            @enum.property
24387db96d56Sopenharmony_ci            def valid(self):
24397db96d56Sopenharmony_ci                return self._valid
24407db96d56Sopenharmony_ci        #
24417db96d56Sopenharmony_ci        class JobStatus(CaseInsensitiveStrEnum, LenientStrEnum):
24427db96d56Sopenharmony_ci            ACTIVE = "active"
24437db96d56Sopenharmony_ci            PENDING = "pending"
24447db96d56Sopenharmony_ci            TERMINATED = "terminated"
24457db96d56Sopenharmony_ci        #
24467db96d56Sopenharmony_ci        JS = JobStatus
24477db96d56Sopenharmony_ci        self.assertEqual(list(JobStatus), [JS.ACTIVE, JS.PENDING, JS.TERMINATED])
24487db96d56Sopenharmony_ci        self.assertEqual(JS.ACTIVE, 'active')
24497db96d56Sopenharmony_ci        self.assertEqual(JS.ACTIVE.value, 'active')
24507db96d56Sopenharmony_ci        self.assertIs(JS('Active'), JS.ACTIVE)
24517db96d56Sopenharmony_ci        self.assertTrue(JS.ACTIVE.valid)
24527db96d56Sopenharmony_ci        missing = JS('missing')
24537db96d56Sopenharmony_ci        self.assertEqual(list(JobStatus), [JS.ACTIVE, JS.PENDING, JS.TERMINATED])
24547db96d56Sopenharmony_ci        self.assertEqual(JS.ACTIVE, 'active')
24557db96d56Sopenharmony_ci        self.assertEqual(JS.ACTIVE.value, 'active')
24567db96d56Sopenharmony_ci        self.assertIs(JS('Active'), JS.ACTIVE)
24577db96d56Sopenharmony_ci        self.assertTrue(JS.ACTIVE.valid)
24587db96d56Sopenharmony_ci        self.assertTrue(isinstance(missing, JS))
24597db96d56Sopenharmony_ci        self.assertFalse(missing.valid)
24607db96d56Sopenharmony_ci
24617db96d56Sopenharmony_ci    def test_empty_globals(self):
24627db96d56Sopenharmony_ci        # bpo-35717: sys._getframe(2).f_globals['__name__'] fails with KeyError
24637db96d56Sopenharmony_ci        # when using compile and exec because f_globals is empty
24647db96d56Sopenharmony_ci        code = "from enum import Enum; Enum('Animal', 'ANT BEE CAT DOG')"
24657db96d56Sopenharmony_ci        code = compile(code, "<string>", "exec")
24667db96d56Sopenharmony_ci        global_ns = {}
24677db96d56Sopenharmony_ci        local_ls = {}
24687db96d56Sopenharmony_ci        exec(code, global_ns, local_ls)
24697db96d56Sopenharmony_ci
24707db96d56Sopenharmony_ci    def test_strenum(self):
24717db96d56Sopenharmony_ci        class GoodStrEnum(StrEnum):
24727db96d56Sopenharmony_ci            one = '1'
24737db96d56Sopenharmony_ci            two = '2'
24747db96d56Sopenharmony_ci            three = b'3', 'ascii'
24757db96d56Sopenharmony_ci            four = b'4', 'latin1', 'strict'
24767db96d56Sopenharmony_ci        self.assertEqual(GoodStrEnum.one, '1')
24777db96d56Sopenharmony_ci        self.assertEqual(str(GoodStrEnum.one), '1')
24787db96d56Sopenharmony_ci        self.assertEqual('{}'.format(GoodStrEnum.one), '1')
24797db96d56Sopenharmony_ci        self.assertEqual(GoodStrEnum.one, str(GoodStrEnum.one))
24807db96d56Sopenharmony_ci        self.assertEqual(GoodStrEnum.one, '{}'.format(GoodStrEnum.one))
24817db96d56Sopenharmony_ci        self.assertEqual(repr(GoodStrEnum.one), "<GoodStrEnum.one: '1'>")
24827db96d56Sopenharmony_ci        #
24837db96d56Sopenharmony_ci        class DumbMixin:
24847db96d56Sopenharmony_ci            def __str__(self):
24857db96d56Sopenharmony_ci                return "don't do this"
24867db96d56Sopenharmony_ci        class DumbStrEnum(DumbMixin, StrEnum):
24877db96d56Sopenharmony_ci            five = '5'
24887db96d56Sopenharmony_ci            six = '6'
24897db96d56Sopenharmony_ci            seven = '7'
24907db96d56Sopenharmony_ci            __str__ = DumbMixin.__str__             # needed as of 3.11
24917db96d56Sopenharmony_ci        self.assertEqual(DumbStrEnum.seven, '7')
24927db96d56Sopenharmony_ci        self.assertEqual(str(DumbStrEnum.seven), "don't do this")
24937db96d56Sopenharmony_ci        #
24947db96d56Sopenharmony_ci        class EnumMixin(Enum):
24957db96d56Sopenharmony_ci            def hello(self):
24967db96d56Sopenharmony_ci                print('hello from %s' % (self, ))
24977db96d56Sopenharmony_ci        class HelloEnum(EnumMixin, StrEnum):
24987db96d56Sopenharmony_ci            eight = '8'
24997db96d56Sopenharmony_ci        self.assertEqual(HelloEnum.eight, '8')
25007db96d56Sopenharmony_ci        self.assertEqual(HelloEnum.eight, str(HelloEnum.eight))
25017db96d56Sopenharmony_ci        #
25027db96d56Sopenharmony_ci        class GoodbyeMixin:
25037db96d56Sopenharmony_ci            def goodbye(self):
25047db96d56Sopenharmony_ci                print('%s wishes you a fond farewell')
25057db96d56Sopenharmony_ci        class GoodbyeEnum(GoodbyeMixin, EnumMixin, StrEnum):
25067db96d56Sopenharmony_ci            nine = '9'
25077db96d56Sopenharmony_ci        self.assertEqual(GoodbyeEnum.nine, '9')
25087db96d56Sopenharmony_ci        self.assertEqual(GoodbyeEnum.nine, str(GoodbyeEnum.nine))
25097db96d56Sopenharmony_ci        #
25107db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, '1 is not a string'):
25117db96d56Sopenharmony_ci            class FirstFailedStrEnum(StrEnum):
25127db96d56Sopenharmony_ci                one = 1
25137db96d56Sopenharmony_ci                two = '2'
25147db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "2 is not a string"):
25157db96d56Sopenharmony_ci            class SecondFailedStrEnum(StrEnum):
25167db96d56Sopenharmony_ci                one = '1'
25177db96d56Sopenharmony_ci                two = 2,
25187db96d56Sopenharmony_ci                three = '3'
25197db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, '2 is not a string'):
25207db96d56Sopenharmony_ci            class ThirdFailedStrEnum(StrEnum):
25217db96d56Sopenharmony_ci                one = '1'
25227db96d56Sopenharmony_ci                two = 2
25237db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'encoding must be a string, not %r' % (sys.getdefaultencoding, )):
25247db96d56Sopenharmony_ci            class ThirdFailedStrEnum(StrEnum):
25257db96d56Sopenharmony_ci                one = '1'
25267db96d56Sopenharmony_ci                two = b'2', sys.getdefaultencoding
25277db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'errors must be a string, not 9'):
25287db96d56Sopenharmony_ci            class ThirdFailedStrEnum(StrEnum):
25297db96d56Sopenharmony_ci                one = '1'
25307db96d56Sopenharmony_ci                two = b'2', 'ascii', 9
25317db96d56Sopenharmony_ci
25327db96d56Sopenharmony_ci    def test_custom_strenum(self):
25337db96d56Sopenharmony_ci        class CustomStrEnum(str, Enum):
25347db96d56Sopenharmony_ci            pass
25357db96d56Sopenharmony_ci        class OkayEnum(CustomStrEnum):
25367db96d56Sopenharmony_ci            one = '1'
25377db96d56Sopenharmony_ci            two = '2'
25387db96d56Sopenharmony_ci            three = b'3', 'ascii'
25397db96d56Sopenharmony_ci            four = b'4', 'latin1', 'strict'
25407db96d56Sopenharmony_ci        self.assertEqual(OkayEnum.one, '1')
25417db96d56Sopenharmony_ci        self.assertEqual(str(OkayEnum.one), 'OkayEnum.one')
25427db96d56Sopenharmony_ci        self.assertEqual('{}'.format(OkayEnum.one), 'OkayEnum.one')
25437db96d56Sopenharmony_ci        self.assertEqual(repr(OkayEnum.one), "<OkayEnum.one: '1'>")
25447db96d56Sopenharmony_ci        #
25457db96d56Sopenharmony_ci        class DumbMixin:
25467db96d56Sopenharmony_ci            def __str__(self):
25477db96d56Sopenharmony_ci                return "don't do this"
25487db96d56Sopenharmony_ci        class DumbStrEnum(DumbMixin, CustomStrEnum):
25497db96d56Sopenharmony_ci            five = '5'
25507db96d56Sopenharmony_ci            six = '6'
25517db96d56Sopenharmony_ci            seven = '7'
25527db96d56Sopenharmony_ci            __str__ = DumbMixin.__str__         # needed as of 3.11
25537db96d56Sopenharmony_ci        self.assertEqual(DumbStrEnum.seven, '7')
25547db96d56Sopenharmony_ci        self.assertEqual(str(DumbStrEnum.seven), "don't do this")
25557db96d56Sopenharmony_ci        #
25567db96d56Sopenharmony_ci        class EnumMixin(Enum):
25577db96d56Sopenharmony_ci            def hello(self):
25587db96d56Sopenharmony_ci                print('hello from %s' % (self, ))
25597db96d56Sopenharmony_ci        class HelloEnum(EnumMixin, CustomStrEnum):
25607db96d56Sopenharmony_ci            eight = '8'
25617db96d56Sopenharmony_ci        self.assertEqual(HelloEnum.eight, '8')
25627db96d56Sopenharmony_ci        self.assertEqual(str(HelloEnum.eight), 'HelloEnum.eight')
25637db96d56Sopenharmony_ci        #
25647db96d56Sopenharmony_ci        class GoodbyeMixin:
25657db96d56Sopenharmony_ci            def goodbye(self):
25667db96d56Sopenharmony_ci                print('%s wishes you a fond farewell')
25677db96d56Sopenharmony_ci        class GoodbyeEnum(GoodbyeMixin, EnumMixin, CustomStrEnum):
25687db96d56Sopenharmony_ci            nine = '9'
25697db96d56Sopenharmony_ci        self.assertEqual(GoodbyeEnum.nine, '9')
25707db96d56Sopenharmony_ci        self.assertEqual(str(GoodbyeEnum.nine), 'GoodbyeEnum.nine')
25717db96d56Sopenharmony_ci        #
25727db96d56Sopenharmony_ci        class FirstFailedStrEnum(CustomStrEnum):
25737db96d56Sopenharmony_ci            one = 1   # this will become '1'
25747db96d56Sopenharmony_ci            two = '2'
25757db96d56Sopenharmony_ci        class SecondFailedStrEnum(CustomStrEnum):
25767db96d56Sopenharmony_ci            one = '1'
25777db96d56Sopenharmony_ci            two = 2,  # this will become '2'
25787db96d56Sopenharmony_ci            three = '3'
25797db96d56Sopenharmony_ci        class ThirdFailedStrEnum(CustomStrEnum):
25807db96d56Sopenharmony_ci            one = '1'
25817db96d56Sopenharmony_ci            two = 2  # this will become '2'
25827db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, '.encoding. must be str, not '):
25837db96d56Sopenharmony_ci            class ThirdFailedStrEnum(CustomStrEnum):
25847db96d56Sopenharmony_ci                one = '1'
25857db96d56Sopenharmony_ci                two = b'2', sys.getdefaultencoding
25867db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, '.errors. must be str, not '):
25877db96d56Sopenharmony_ci            class ThirdFailedStrEnum(CustomStrEnum):
25887db96d56Sopenharmony_ci                one = '1'
25897db96d56Sopenharmony_ci                two = b'2', 'ascii', 9
25907db96d56Sopenharmony_ci
25917db96d56Sopenharmony_ci    def test_missing_value_error(self):
25927db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "_value_ not set in __new__"):
25937db96d56Sopenharmony_ci            class Combined(str, Enum):
25947db96d56Sopenharmony_ci                #
25957db96d56Sopenharmony_ci                def __new__(cls, value, sequence):
25967db96d56Sopenharmony_ci                    enum = str.__new__(cls, value)
25977db96d56Sopenharmony_ci                    if '(' in value:
25987db96d56Sopenharmony_ci                        fis_name, segment = value.split('(', 1)
25997db96d56Sopenharmony_ci                        segment = segment.strip(' )')
26007db96d56Sopenharmony_ci                    else:
26017db96d56Sopenharmony_ci                        fis_name = value
26027db96d56Sopenharmony_ci                        segment = None
26037db96d56Sopenharmony_ci                    enum.fis_name = fis_name
26047db96d56Sopenharmony_ci                    enum.segment = segment
26057db96d56Sopenharmony_ci                    enum.sequence = sequence
26067db96d56Sopenharmony_ci                    return enum
26077db96d56Sopenharmony_ci                #
26087db96d56Sopenharmony_ci                def __repr__(self):
26097db96d56Sopenharmony_ci                    return "<%s.%s>" % (self.__class__.__name__, self._name_)
26107db96d56Sopenharmony_ci                #
26117db96d56Sopenharmony_ci                key_type      = 'An$(1,2)', 0
26127db96d56Sopenharmony_ci                company_id    = 'An$(3,2)', 1
26137db96d56Sopenharmony_ci                code          = 'An$(5,1)', 2
26147db96d56Sopenharmony_ci                description   = 'Bn$',      3
26157db96d56Sopenharmony_ci
26167db96d56Sopenharmony_ci
26177db96d56Sopenharmony_ci    def test_private_variable_is_normal_attribute(self):
26187db96d56Sopenharmony_ci        class Private(Enum):
26197db96d56Sopenharmony_ci            __corporal = 'Radar'
26207db96d56Sopenharmony_ci            __major_ = 'Hoolihan'
26217db96d56Sopenharmony_ci        self.assertEqual(Private._Private__corporal, 'Radar')
26227db96d56Sopenharmony_ci        self.assertEqual(Private._Private__major_, 'Hoolihan')
26237db96d56Sopenharmony_ci
26247db96d56Sopenharmony_ci    def test_member_from_member_access(self):
26257db96d56Sopenharmony_ci        class Di(Enum):
26267db96d56Sopenharmony_ci            YES = 1
26277db96d56Sopenharmony_ci            NO = 0
26287db96d56Sopenharmony_ci            name = 3
26297db96d56Sopenharmony_ci        warn = Di.YES.NO
26307db96d56Sopenharmony_ci        self.assertIs(warn, Di.NO)
26317db96d56Sopenharmony_ci        self.assertIs(Di.name, Di['name'])
26327db96d56Sopenharmony_ci        self.assertEqual(Di.name.name, 'name')
26337db96d56Sopenharmony_ci
26347db96d56Sopenharmony_ci    def test_dynamic_members_with_static_methods(self):
26357db96d56Sopenharmony_ci        #
26367db96d56Sopenharmony_ci        foo_defines = {'FOO_CAT': 'aloof', 'BAR_DOG': 'friendly', 'FOO_HORSE': 'big'}
26377db96d56Sopenharmony_ci        class Foo(Enum):
26387db96d56Sopenharmony_ci            vars().update({
26397db96d56Sopenharmony_ci                    k: v
26407db96d56Sopenharmony_ci                    for k, v in foo_defines.items()
26417db96d56Sopenharmony_ci                    if k.startswith('FOO_')
26427db96d56Sopenharmony_ci                    })
26437db96d56Sopenharmony_ci            def upper(self):
26447db96d56Sopenharmony_ci                return self.value.upper()
26457db96d56Sopenharmony_ci        self.assertEqual(list(Foo), [Foo.FOO_CAT, Foo.FOO_HORSE])
26467db96d56Sopenharmony_ci        self.assertEqual(Foo.FOO_CAT.value, 'aloof')
26477db96d56Sopenharmony_ci        self.assertEqual(Foo.FOO_HORSE.upper(), 'BIG')
26487db96d56Sopenharmony_ci        #
26497db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "'FOO_CAT' already defined as 'aloof'"):
26507db96d56Sopenharmony_ci            class FooBar(Enum):
26517db96d56Sopenharmony_ci                vars().update({
26527db96d56Sopenharmony_ci                        k: v
26537db96d56Sopenharmony_ci                        for k, v in foo_defines.items()
26547db96d56Sopenharmony_ci                        if k.startswith('FOO_')
26557db96d56Sopenharmony_ci                        },
26567db96d56Sopenharmony_ci                        **{'FOO_CAT': 'small'},
26577db96d56Sopenharmony_ci                        )
26587db96d56Sopenharmony_ci                def upper(self):
26597db96d56Sopenharmony_ci                    return self.value.upper()
26607db96d56Sopenharmony_ci
26617db96d56Sopenharmony_ci    def test_repr_with_dataclass(self):
26627db96d56Sopenharmony_ci        "ensure dataclass-mixin has correct repr()"
26637db96d56Sopenharmony_ci        from dataclasses import dataclass
26647db96d56Sopenharmony_ci        @dataclass
26657db96d56Sopenharmony_ci        class Foo:
26667db96d56Sopenharmony_ci            __qualname__ = 'Foo'
26677db96d56Sopenharmony_ci            a: int
26687db96d56Sopenharmony_ci        class Entries(Foo, Enum):
26697db96d56Sopenharmony_ci            ENTRY1 = 1
26707db96d56Sopenharmony_ci        self.assertTrue(isinstance(Entries.ENTRY1, Foo))
26717db96d56Sopenharmony_ci        self.assertTrue(Entries._member_type_ is Foo, Entries._member_type_)
26727db96d56Sopenharmony_ci        self.assertTrue(Entries.ENTRY1.value == Foo(1), Entries.ENTRY1.value)
26737db96d56Sopenharmony_ci        self.assertEqual(repr(Entries.ENTRY1), '<Entries.ENTRY1: Foo(a=1)>')
26747db96d56Sopenharmony_ci
26757db96d56Sopenharmony_ci    def test_repr_with_init_mixin(self):
26767db96d56Sopenharmony_ci        class Foo:
26777db96d56Sopenharmony_ci            def __init__(self, a):
26787db96d56Sopenharmony_ci                self.a = a
26797db96d56Sopenharmony_ci            def __repr__(self):
26807db96d56Sopenharmony_ci                return 'Foo(a=%r)' % self._value_
26817db96d56Sopenharmony_ci        class Entries(Foo, Enum):
26827db96d56Sopenharmony_ci            ENTRY1 = 1
26837db96d56Sopenharmony_ci        #
26847db96d56Sopenharmony_ci        self.assertEqual(repr(Entries.ENTRY1), 'Foo(a=1)')
26857db96d56Sopenharmony_ci
26867db96d56Sopenharmony_ci    def test_repr_and_str_with_no_init_mixin(self):
26877db96d56Sopenharmony_ci        # non-data_type is a mixin that doesn't define __new__
26887db96d56Sopenharmony_ci        class Foo:
26897db96d56Sopenharmony_ci            def __repr__(self):
26907db96d56Sopenharmony_ci                return 'Foo'
26917db96d56Sopenharmony_ci            def __str__(self):
26927db96d56Sopenharmony_ci                return 'ooF'
26937db96d56Sopenharmony_ci        class Entries(Foo, Enum):
26947db96d56Sopenharmony_ci            ENTRY1 = 1
26957db96d56Sopenharmony_ci        #
26967db96d56Sopenharmony_ci        self.assertEqual(repr(Entries.ENTRY1), 'Foo')
26977db96d56Sopenharmony_ci        self.assertEqual(str(Entries.ENTRY1), 'ooF')
26987db96d56Sopenharmony_ci
26997db96d56Sopenharmony_ci    def test_value_backup_assign(self):
27007db96d56Sopenharmony_ci        # check that enum will add missing values when custom __new__ does not
27017db96d56Sopenharmony_ci        class Some(Enum):
27027db96d56Sopenharmony_ci            def __new__(cls, val):
27037db96d56Sopenharmony_ci                return object.__new__(cls)
27047db96d56Sopenharmony_ci            x = 1
27057db96d56Sopenharmony_ci            y = 2
27067db96d56Sopenharmony_ci        self.assertEqual(Some.x.value, 1)
27077db96d56Sopenharmony_ci        self.assertEqual(Some.y.value, 2)
27087db96d56Sopenharmony_ci
27097db96d56Sopenharmony_ci    def test_custom_flag_bitwise(self):
27107db96d56Sopenharmony_ci        class MyIntFlag(int, Flag):
27117db96d56Sopenharmony_ci            ONE = 1
27127db96d56Sopenharmony_ci            TWO = 2
27137db96d56Sopenharmony_ci            FOUR = 4
27147db96d56Sopenharmony_ci        self.assertTrue(isinstance(MyIntFlag.ONE | MyIntFlag.TWO, MyIntFlag), MyIntFlag.ONE | MyIntFlag.TWO)
27157db96d56Sopenharmony_ci        self.assertTrue(isinstance(MyIntFlag.ONE | 2, MyIntFlag))
27167db96d56Sopenharmony_ci
27177db96d56Sopenharmony_ci    def test_int_flags_copy(self):
27187db96d56Sopenharmony_ci        class MyIntFlag(IntFlag):
27197db96d56Sopenharmony_ci            ONE = 1
27207db96d56Sopenharmony_ci            TWO = 2
27217db96d56Sopenharmony_ci            FOUR = 4
27227db96d56Sopenharmony_ci
27237db96d56Sopenharmony_ci        flags = MyIntFlag.ONE | MyIntFlag.TWO
27247db96d56Sopenharmony_ci        copied = copy.copy(flags)
27257db96d56Sopenharmony_ci        deep = copy.deepcopy(flags)
27267db96d56Sopenharmony_ci        self.assertEqual(copied, flags)
27277db96d56Sopenharmony_ci        self.assertEqual(deep, flags)
27287db96d56Sopenharmony_ci
27297db96d56Sopenharmony_ci        flags = MyIntFlag.ONE | MyIntFlag.TWO | 8
27307db96d56Sopenharmony_ci        copied = copy.copy(flags)
27317db96d56Sopenharmony_ci        deep = copy.deepcopy(flags)
27327db96d56Sopenharmony_ci        self.assertEqual(copied, flags)
27337db96d56Sopenharmony_ci        self.assertEqual(deep, flags)
27347db96d56Sopenharmony_ci        self.assertEqual(copied.value, 1 | 2 | 8)
27357db96d56Sopenharmony_ci
27367db96d56Sopenharmony_ci    def test_namedtuple_as_value(self):
27377db96d56Sopenharmony_ci        from collections import namedtuple
27387db96d56Sopenharmony_ci        TTuple = namedtuple('TTuple', 'id a blist')
27397db96d56Sopenharmony_ci        class NTEnum(Enum):
27407db96d56Sopenharmony_ci            NONE = TTuple(0, 0, [])
27417db96d56Sopenharmony_ci            A = TTuple(1, 2, [4])
27427db96d56Sopenharmony_ci            B = TTuple(2, 4, [0, 1, 2])
27437db96d56Sopenharmony_ci        self.assertEqual(repr(NTEnum.NONE), "<NTEnum.NONE: TTuple(id=0, a=0, blist=[])>")
27447db96d56Sopenharmony_ci        self.assertEqual(NTEnum.NONE.value, TTuple(id=0, a=0, blist=[]))
27457db96d56Sopenharmony_ci        self.assertEqual(
27467db96d56Sopenharmony_ci                [x.value for x in NTEnum],
27477db96d56Sopenharmony_ci                [TTuple(id=0, a=0, blist=[]), TTuple(id=1, a=2, blist=[4]), TTuple(id=2, a=4, blist=[0, 1, 2])],
27487db96d56Sopenharmony_ci                )
27497db96d56Sopenharmony_ci
27507db96d56Sopenharmony_ci    def test_flag_with_custom_new(self):
27517db96d56Sopenharmony_ci        class FlagFromChar(IntFlag):
27527db96d56Sopenharmony_ci            def __new__(cls, c):
27537db96d56Sopenharmony_ci                value = 1 << c
27547db96d56Sopenharmony_ci                self = int.__new__(cls, value)
27557db96d56Sopenharmony_ci                self._value_ = value
27567db96d56Sopenharmony_ci                return self
27577db96d56Sopenharmony_ci            #
27587db96d56Sopenharmony_ci            a = ord('a')
27597db96d56Sopenharmony_ci        #
27607db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar._all_bits_, 316912650057057350374175801343)
27617db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar._flag_mask_, 158456325028528675187087900672)
27627db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
27637db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
27647db96d56Sopenharmony_ci        #
27657db96d56Sopenharmony_ci        #
27667db96d56Sopenharmony_ci        class FlagFromChar(Flag):
27677db96d56Sopenharmony_ci            def __new__(cls, c):
27687db96d56Sopenharmony_ci                value = 1 << c
27697db96d56Sopenharmony_ci                self = object.__new__(cls)
27707db96d56Sopenharmony_ci                self._value_ = value
27717db96d56Sopenharmony_ci                return self
27727db96d56Sopenharmony_ci            #
27737db96d56Sopenharmony_ci            a = ord('a')
27747db96d56Sopenharmony_ci            z = 1
27757db96d56Sopenharmony_ci        #
27767db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar._all_bits_, 316912650057057350374175801343)
27777db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar._flag_mask_, 158456325028528675187087900674)
27787db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar.a.value, 158456325028528675187087900672)
27797db96d56Sopenharmony_ci        self.assertEqual((FlagFromChar.a|FlagFromChar.z).value, 158456325028528675187087900674)
27807db96d56Sopenharmony_ci        #
27817db96d56Sopenharmony_ci        #
27827db96d56Sopenharmony_ci        class FlagFromChar(int, Flag, boundary=KEEP):
27837db96d56Sopenharmony_ci            def __new__(cls, c):
27847db96d56Sopenharmony_ci                value = 1 << c
27857db96d56Sopenharmony_ci                self = int.__new__(cls, value)
27867db96d56Sopenharmony_ci                self._value_ = value
27877db96d56Sopenharmony_ci                return self
27887db96d56Sopenharmony_ci            #
27897db96d56Sopenharmony_ci            a = ord('a')
27907db96d56Sopenharmony_ci        #
27917db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar._all_bits_, 316912650057057350374175801343)
27927db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar._flag_mask_, 158456325028528675187087900672)
27937db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar.a, 158456325028528675187087900672)
27947db96d56Sopenharmony_ci        self.assertEqual(FlagFromChar.a|1, 158456325028528675187087900673)
27957db96d56Sopenharmony_ci
27967db96d56Sopenharmony_ci    def test_init_exception(self):
27977db96d56Sopenharmony_ci        class Base:
27987db96d56Sopenharmony_ci            def __new__(cls, *args):
27997db96d56Sopenharmony_ci                return object.__new__(cls)
28007db96d56Sopenharmony_ci            def __init__(self, x):
28017db96d56Sopenharmony_ci                raise ValueError("I don't like", x)
28027db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
28037db96d56Sopenharmony_ci            class MyEnum(Base, enum.Enum):
28047db96d56Sopenharmony_ci                A = 'a'
28057db96d56Sopenharmony_ci                def __init__(self, y):
28067db96d56Sopenharmony_ci                    self.y = y
28077db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
28087db96d56Sopenharmony_ci            class MyEnum(Base, enum.Enum):
28097db96d56Sopenharmony_ci                A = 'a'
28107db96d56Sopenharmony_ci                def __init__(self, y):
28117db96d56Sopenharmony_ci                    self.y = y
28127db96d56Sopenharmony_ci                def __new__(cls, value):
28137db96d56Sopenharmony_ci                    member = Base.__new__(cls)
28147db96d56Sopenharmony_ci                    member._value_ = Base(value)
28157db96d56Sopenharmony_ci                    return member
28167db96d56Sopenharmony_ci
28177db96d56Sopenharmony_ci
28187db96d56Sopenharmony_ciclass TestOrder(unittest.TestCase):
28197db96d56Sopenharmony_ci    "test usage of the `_order_` attribute"
28207db96d56Sopenharmony_ci
28217db96d56Sopenharmony_ci    def test_same_members(self):
28227db96d56Sopenharmony_ci        class Color(Enum):
28237db96d56Sopenharmony_ci            _order_ = 'red green blue'
28247db96d56Sopenharmony_ci            red = 1
28257db96d56Sopenharmony_ci            green = 2
28267db96d56Sopenharmony_ci            blue = 3
28277db96d56Sopenharmony_ci
28287db96d56Sopenharmony_ci    def test_same_members_with_aliases(self):
28297db96d56Sopenharmony_ci        class Color(Enum):
28307db96d56Sopenharmony_ci            _order_ = 'red green blue'
28317db96d56Sopenharmony_ci            red = 1
28327db96d56Sopenharmony_ci            green = 2
28337db96d56Sopenharmony_ci            blue = 3
28347db96d56Sopenharmony_ci            verde = green
28357db96d56Sopenharmony_ci
28367db96d56Sopenharmony_ci    def test_same_members_wrong_order(self):
28377db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'member order does not match _order_'):
28387db96d56Sopenharmony_ci            class Color(Enum):
28397db96d56Sopenharmony_ci                _order_ = 'red green blue'
28407db96d56Sopenharmony_ci                red = 1
28417db96d56Sopenharmony_ci                blue = 3
28427db96d56Sopenharmony_ci                green = 2
28437db96d56Sopenharmony_ci
28447db96d56Sopenharmony_ci    def test_order_has_extra_members(self):
28457db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'member order does not match _order_'):
28467db96d56Sopenharmony_ci            class Color(Enum):
28477db96d56Sopenharmony_ci                _order_ = 'red green blue purple'
28487db96d56Sopenharmony_ci                red = 1
28497db96d56Sopenharmony_ci                green = 2
28507db96d56Sopenharmony_ci                blue = 3
28517db96d56Sopenharmony_ci
28527db96d56Sopenharmony_ci    def test_order_has_extra_members_with_aliases(self):
28537db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'member order does not match _order_'):
28547db96d56Sopenharmony_ci            class Color(Enum):
28557db96d56Sopenharmony_ci                _order_ = 'red green blue purple'
28567db96d56Sopenharmony_ci                red = 1
28577db96d56Sopenharmony_ci                green = 2
28587db96d56Sopenharmony_ci                blue = 3
28597db96d56Sopenharmony_ci                verde = green
28607db96d56Sopenharmony_ci
28617db96d56Sopenharmony_ci    def test_enum_has_extra_members(self):
28627db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'member order does not match _order_'):
28637db96d56Sopenharmony_ci            class Color(Enum):
28647db96d56Sopenharmony_ci                _order_ = 'red green blue'
28657db96d56Sopenharmony_ci                red = 1
28667db96d56Sopenharmony_ci                green = 2
28677db96d56Sopenharmony_ci                blue = 3
28687db96d56Sopenharmony_ci                purple = 4
28697db96d56Sopenharmony_ci
28707db96d56Sopenharmony_ci    def test_enum_has_extra_members_with_aliases(self):
28717db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'member order does not match _order_'):
28727db96d56Sopenharmony_ci            class Color(Enum):
28737db96d56Sopenharmony_ci                _order_ = 'red green blue'
28747db96d56Sopenharmony_ci                red = 1
28757db96d56Sopenharmony_ci                green = 2
28767db96d56Sopenharmony_ci                blue = 3
28777db96d56Sopenharmony_ci                purple = 4
28787db96d56Sopenharmony_ci                verde = green
28797db96d56Sopenharmony_ci
28807db96d56Sopenharmony_ci
28817db96d56Sopenharmony_ciclass OldTestFlag(unittest.TestCase):
28827db96d56Sopenharmony_ci    """Tests of the Flags."""
28837db96d56Sopenharmony_ci
28847db96d56Sopenharmony_ci    class Perm(Flag):
28857db96d56Sopenharmony_ci        R, W, X = 4, 2, 1
28867db96d56Sopenharmony_ci
28877db96d56Sopenharmony_ci    class Open(Flag):
28887db96d56Sopenharmony_ci        RO = 0
28897db96d56Sopenharmony_ci        WO = 1
28907db96d56Sopenharmony_ci        RW = 2
28917db96d56Sopenharmony_ci        AC = 3
28927db96d56Sopenharmony_ci        CE = 1<<19
28937db96d56Sopenharmony_ci
28947db96d56Sopenharmony_ci    class Color(Flag):
28957db96d56Sopenharmony_ci        BLACK = 0
28967db96d56Sopenharmony_ci        RED = 1
28977db96d56Sopenharmony_ci        ROJO = 1
28987db96d56Sopenharmony_ci        GREEN = 2
28997db96d56Sopenharmony_ci        BLUE = 4
29007db96d56Sopenharmony_ci        PURPLE = RED|BLUE
29017db96d56Sopenharmony_ci        WHITE = RED|GREEN|BLUE
29027db96d56Sopenharmony_ci        BLANCO = RED|GREEN|BLUE
29037db96d56Sopenharmony_ci
29047db96d56Sopenharmony_ci    def test_or(self):
29057db96d56Sopenharmony_ci        Perm = self.Perm
29067db96d56Sopenharmony_ci        for i in Perm:
29077db96d56Sopenharmony_ci            for j in Perm:
29087db96d56Sopenharmony_ci                self.assertEqual((i | j), Perm(i.value | j.value))
29097db96d56Sopenharmony_ci                self.assertEqual((i | j).value, i.value | j.value)
29107db96d56Sopenharmony_ci                self.assertIs(type(i | j), Perm)
29117db96d56Sopenharmony_ci        for i in Perm:
29127db96d56Sopenharmony_ci            self.assertIs(i | i, i)
29137db96d56Sopenharmony_ci        Open = self.Open
29147db96d56Sopenharmony_ci        self.assertIs(Open.RO | Open.CE, Open.CE)
29157db96d56Sopenharmony_ci
29167db96d56Sopenharmony_ci    def test_and(self):
29177db96d56Sopenharmony_ci        Perm = self.Perm
29187db96d56Sopenharmony_ci        RW = Perm.R | Perm.W
29197db96d56Sopenharmony_ci        RX = Perm.R | Perm.X
29207db96d56Sopenharmony_ci        WX = Perm.W | Perm.X
29217db96d56Sopenharmony_ci        RWX = Perm.R | Perm.W | Perm.X
29227db96d56Sopenharmony_ci        values = list(Perm) + [RW, RX, WX, RWX, Perm(0)]
29237db96d56Sopenharmony_ci        for i in values:
29247db96d56Sopenharmony_ci            for j in values:
29257db96d56Sopenharmony_ci                self.assertEqual((i & j).value, i.value & j.value)
29267db96d56Sopenharmony_ci                self.assertIs(type(i & j), Perm)
29277db96d56Sopenharmony_ci        for i in Perm:
29287db96d56Sopenharmony_ci            self.assertIs(i & i, i)
29297db96d56Sopenharmony_ci            self.assertIs(i & RWX, i)
29307db96d56Sopenharmony_ci            self.assertIs(RWX & i, i)
29317db96d56Sopenharmony_ci        Open = self.Open
29327db96d56Sopenharmony_ci        self.assertIs(Open.RO & Open.CE, Open.RO)
29337db96d56Sopenharmony_ci
29347db96d56Sopenharmony_ci    def test_xor(self):
29357db96d56Sopenharmony_ci        Perm = self.Perm
29367db96d56Sopenharmony_ci        for i in Perm:
29377db96d56Sopenharmony_ci            for j in Perm:
29387db96d56Sopenharmony_ci                self.assertEqual((i ^ j).value, i.value ^ j.value)
29397db96d56Sopenharmony_ci                self.assertIs(type(i ^ j), Perm)
29407db96d56Sopenharmony_ci        for i in Perm:
29417db96d56Sopenharmony_ci            self.assertIs(i ^ Perm(0), i)
29427db96d56Sopenharmony_ci            self.assertIs(Perm(0) ^ i, i)
29437db96d56Sopenharmony_ci        Open = self.Open
29447db96d56Sopenharmony_ci        self.assertIs(Open.RO ^ Open.CE, Open.CE)
29457db96d56Sopenharmony_ci        self.assertIs(Open.CE ^ Open.CE, Open.RO)
29467db96d56Sopenharmony_ci
29477db96d56Sopenharmony_ci    def test_invert(self):
29487db96d56Sopenharmony_ci        Perm = self.Perm
29497db96d56Sopenharmony_ci        RW = Perm.R | Perm.W
29507db96d56Sopenharmony_ci        RX = Perm.R | Perm.X
29517db96d56Sopenharmony_ci        WX = Perm.W | Perm.X
29527db96d56Sopenharmony_ci        RWX = Perm.R | Perm.W | Perm.X
29537db96d56Sopenharmony_ci        values = list(Perm) + [RW, RX, WX, RWX, Perm(0)]
29547db96d56Sopenharmony_ci        for i in values:
29557db96d56Sopenharmony_ci            self.assertIs(type(~i), Perm)
29567db96d56Sopenharmony_ci            self.assertEqual(~~i, i)
29577db96d56Sopenharmony_ci        for i in Perm:
29587db96d56Sopenharmony_ci            self.assertIs(~~i, i)
29597db96d56Sopenharmony_ci        Open = self.Open
29607db96d56Sopenharmony_ci        self.assertIs(Open.WO & ~Open.WO, Open.RO)
29617db96d56Sopenharmony_ci        self.assertIs((Open.WO|Open.CE) & ~Open.WO, Open.CE)
29627db96d56Sopenharmony_ci
29637db96d56Sopenharmony_ci    def test_bool(self):
29647db96d56Sopenharmony_ci        Perm = self.Perm
29657db96d56Sopenharmony_ci        for f in Perm:
29667db96d56Sopenharmony_ci            self.assertTrue(f)
29677db96d56Sopenharmony_ci        Open = self.Open
29687db96d56Sopenharmony_ci        for f in Open:
29697db96d56Sopenharmony_ci            self.assertEqual(bool(f.value), bool(f))
29707db96d56Sopenharmony_ci
29717db96d56Sopenharmony_ci    def test_boundary(self):
29727db96d56Sopenharmony_ci        self.assertIs(enum.Flag._boundary_, STRICT)
29737db96d56Sopenharmony_ci        class Iron(Flag, boundary=CONFORM):
29747db96d56Sopenharmony_ci            ONE = 1
29757db96d56Sopenharmony_ci            TWO = 2
29767db96d56Sopenharmony_ci            EIGHT = 8
29777db96d56Sopenharmony_ci        self.assertIs(Iron._boundary_, CONFORM)
29787db96d56Sopenharmony_ci        #
29797db96d56Sopenharmony_ci        class Water(Flag, boundary=STRICT):
29807db96d56Sopenharmony_ci            ONE = 1
29817db96d56Sopenharmony_ci            TWO = 2
29827db96d56Sopenharmony_ci            EIGHT = 8
29837db96d56Sopenharmony_ci        self.assertIs(Water._boundary_, STRICT)
29847db96d56Sopenharmony_ci        #
29857db96d56Sopenharmony_ci        class Space(Flag, boundary=EJECT):
29867db96d56Sopenharmony_ci            ONE = 1
29877db96d56Sopenharmony_ci            TWO = 2
29887db96d56Sopenharmony_ci            EIGHT = 8
29897db96d56Sopenharmony_ci        self.assertIs(Space._boundary_, EJECT)
29907db96d56Sopenharmony_ci        #
29917db96d56Sopenharmony_ci        class Bizarre(Flag, boundary=KEEP):
29927db96d56Sopenharmony_ci            b = 3
29937db96d56Sopenharmony_ci            c = 4
29947db96d56Sopenharmony_ci            d = 6
29957db96d56Sopenharmony_ci        #
29967db96d56Sopenharmony_ci        self.assertRaisesRegex(ValueError, 'invalid value 7', Water, 7)
29977db96d56Sopenharmony_ci        #
29987db96d56Sopenharmony_ci        self.assertIs(Iron(7), Iron.ONE|Iron.TWO)
29997db96d56Sopenharmony_ci        self.assertIs(Iron(~9), Iron.TWO)
30007db96d56Sopenharmony_ci        #
30017db96d56Sopenharmony_ci        self.assertEqual(Space(7), 7)
30027db96d56Sopenharmony_ci        self.assertTrue(type(Space(7)) is int)
30037db96d56Sopenharmony_ci        #
30047db96d56Sopenharmony_ci        self.assertEqual(list(Bizarre), [Bizarre.c])
30057db96d56Sopenharmony_ci        self.assertIs(Bizarre(3), Bizarre.b)
30067db96d56Sopenharmony_ci        self.assertIs(Bizarre(6), Bizarre.d)
30077db96d56Sopenharmony_ci        #
30087db96d56Sopenharmony_ci        class SkipFlag(enum.Flag):
30097db96d56Sopenharmony_ci            A = 1
30107db96d56Sopenharmony_ci            B = 2
30117db96d56Sopenharmony_ci            C = 4 | B
30127db96d56Sopenharmony_ci        #
30137db96d56Sopenharmony_ci        self.assertTrue(SkipFlag.C in (SkipFlag.A|SkipFlag.C))
30147db96d56Sopenharmony_ci        self.assertRaisesRegex(ValueError, 'SkipFlag.. invalid value 42', SkipFlag, 42)
30157db96d56Sopenharmony_ci        #
30167db96d56Sopenharmony_ci        class SkipIntFlag(enum.IntFlag):
30177db96d56Sopenharmony_ci            A = 1
30187db96d56Sopenharmony_ci            B = 2
30197db96d56Sopenharmony_ci            C = 4 | B
30207db96d56Sopenharmony_ci        #
30217db96d56Sopenharmony_ci        self.assertTrue(SkipIntFlag.C in (SkipIntFlag.A|SkipIntFlag.C))
30227db96d56Sopenharmony_ci        self.assertEqual(SkipIntFlag(42).value, 42)
30237db96d56Sopenharmony_ci        #
30247db96d56Sopenharmony_ci        class MethodHint(Flag):
30257db96d56Sopenharmony_ci            HiddenText = 0x10
30267db96d56Sopenharmony_ci            DigitsOnly = 0x01
30277db96d56Sopenharmony_ci            LettersOnly = 0x02
30287db96d56Sopenharmony_ci            OnlyMask = 0x0f
30297db96d56Sopenharmony_ci        #
30307db96d56Sopenharmony_ci        self.assertEqual(str(MethodHint.HiddenText|MethodHint.OnlyMask), 'MethodHint.HiddenText|DigitsOnly|LettersOnly|OnlyMask')
30317db96d56Sopenharmony_ci
30327db96d56Sopenharmony_ci
30337db96d56Sopenharmony_ci    def test_iter(self):
30347db96d56Sopenharmony_ci        Color = self.Color
30357db96d56Sopenharmony_ci        Open = self.Open
30367db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.RED, Color.GREEN, Color.BLUE])
30377db96d56Sopenharmony_ci        self.assertEqual(list(Open), [Open.WO, Open.RW, Open.CE])
30387db96d56Sopenharmony_ci
30397db96d56Sopenharmony_ci    def test_programatic_function_string(self):
30407db96d56Sopenharmony_ci        Perm = Flag('Perm', 'R W X')
30417db96d56Sopenharmony_ci        lst = list(Perm)
30427db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
30437db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
30447db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
30457db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
30467db96d56Sopenharmony_ci            v = 1<<i
30477db96d56Sopenharmony_ci            e = Perm(v)
30487db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
30497db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
30507db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
30517db96d56Sopenharmony_ci            self.assertIn(e, Perm)
30527db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
30537db96d56Sopenharmony_ci
30547db96d56Sopenharmony_ci    def test_programatic_function_string_with_start(self):
30557db96d56Sopenharmony_ci        Perm = Flag('Perm', 'R W X', start=8)
30567db96d56Sopenharmony_ci        lst = list(Perm)
30577db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
30587db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
30597db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
30607db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
30617db96d56Sopenharmony_ci            v = 8<<i
30627db96d56Sopenharmony_ci            e = Perm(v)
30637db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
30647db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
30657db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
30667db96d56Sopenharmony_ci            self.assertIn(e, Perm)
30677db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
30687db96d56Sopenharmony_ci
30697db96d56Sopenharmony_ci    def test_programatic_function_string_list(self):
30707db96d56Sopenharmony_ci        Perm = Flag('Perm', ['R', 'W', 'X'])
30717db96d56Sopenharmony_ci        lst = list(Perm)
30727db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
30737db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
30747db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
30757db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
30767db96d56Sopenharmony_ci            v = 1<<i
30777db96d56Sopenharmony_ci            e = Perm(v)
30787db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
30797db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
30807db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
30817db96d56Sopenharmony_ci            self.assertIn(e, Perm)
30827db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
30837db96d56Sopenharmony_ci
30847db96d56Sopenharmony_ci    def test_programatic_function_iterable(self):
30857db96d56Sopenharmony_ci        Perm = Flag('Perm', (('R', 2), ('W', 8), ('X', 32)))
30867db96d56Sopenharmony_ci        lst = list(Perm)
30877db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
30887db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
30897db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
30907db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
30917db96d56Sopenharmony_ci            v = 1<<(2*i+1)
30927db96d56Sopenharmony_ci            e = Perm(v)
30937db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
30947db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
30957db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
30967db96d56Sopenharmony_ci            self.assertIn(e, Perm)
30977db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
30987db96d56Sopenharmony_ci
30997db96d56Sopenharmony_ci    def test_programatic_function_from_dict(self):
31007db96d56Sopenharmony_ci        Perm = Flag('Perm', OrderedDict((('R', 2), ('W', 8), ('X', 32))))
31017db96d56Sopenharmony_ci        lst = list(Perm)
31027db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
31037db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
31047db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
31057db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
31067db96d56Sopenharmony_ci            v = 1<<(2*i+1)
31077db96d56Sopenharmony_ci            e = Perm(v)
31087db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
31097db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
31107db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
31117db96d56Sopenharmony_ci            self.assertIn(e, Perm)
31127db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
31137db96d56Sopenharmony_ci
31147db96d56Sopenharmony_ci    def test_pickle(self):
31157db96d56Sopenharmony_ci        if isinstance(FlagStooges, Exception):
31167db96d56Sopenharmony_ci            raise FlagStooges
31177db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, FlagStooges.CURLY)
31187db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual,
31197db96d56Sopenharmony_ci                        FlagStooges.CURLY|FlagStooges.MOE)
31207db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual,
31217db96d56Sopenharmony_ci                        FlagStooges.CURLY&~FlagStooges.CURLY)
31227db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, FlagStooges)
31237db96d56Sopenharmony_ci
31247db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, FlagStoogesWithZero.CURLY)
31257db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual,
31267db96d56Sopenharmony_ci                        FlagStoogesWithZero.CURLY|FlagStoogesWithZero.MOE)
31277db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, FlagStoogesWithZero.NOFLAG)
31287db96d56Sopenharmony_ci
31297db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, IntFlagStooges.CURLY)
31307db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual,
31317db96d56Sopenharmony_ci                        IntFlagStooges.CURLY|IntFlagStooges.MOE)
31327db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual,
31337db96d56Sopenharmony_ci                        IntFlagStooges.CURLY|IntFlagStooges.MOE|0x30)
31347db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual, IntFlagStooges(0))
31357db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual, IntFlagStooges(0x30))
31367db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, IntFlagStooges)
31377db96d56Sopenharmony_ci
31387db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, IntFlagStoogesWithZero.CURLY)
31397db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertEqual,
31407db96d56Sopenharmony_ci                        IntFlagStoogesWithZero.CURLY|IntFlagStoogesWithZero.MOE)
31417db96d56Sopenharmony_ci        test_pickle_dump_load(self.assertIs, IntFlagStoogesWithZero.NOFLAG)
31427db96d56Sopenharmony_ci
31437db96d56Sopenharmony_ci    @unittest.skipIf(
31447db96d56Sopenharmony_ci            python_version >= (3, 12),
31457db96d56Sopenharmony_ci            '__contains__ now returns True/False for all inputs',
31467db96d56Sopenharmony_ci            )
31477db96d56Sopenharmony_ci    def test_contains_er(self):
31487db96d56Sopenharmony_ci        Open = self.Open
31497db96d56Sopenharmony_ci        Color = self.Color
31507db96d56Sopenharmony_ci        self.assertFalse(Color.BLACK in Open)
31517db96d56Sopenharmony_ci        self.assertFalse(Open.RO in Color)
31527db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31537db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
31547db96d56Sopenharmony_ci                'BLACK' in Color
31557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31567db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
31577db96d56Sopenharmony_ci                'RO' in Open
31587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31597db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
31607db96d56Sopenharmony_ci                1 in Color
31617db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31627db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
31637db96d56Sopenharmony_ci                1 in Open
31647db96d56Sopenharmony_ci
31657db96d56Sopenharmony_ci    @unittest.skipIf(
31667db96d56Sopenharmony_ci            python_version < (3, 12),
31677db96d56Sopenharmony_ci            '__contains__ only works with enum memmbers before 3.12',
31687db96d56Sopenharmony_ci            )
31697db96d56Sopenharmony_ci    def test_contains_tf(self):
31707db96d56Sopenharmony_ci        Open = self.Open
31717db96d56Sopenharmony_ci        Color = self.Color
31727db96d56Sopenharmony_ci        self.assertFalse(Color.BLACK in Open)
31737db96d56Sopenharmony_ci        self.assertFalse(Open.RO in Color)
31747db96d56Sopenharmony_ci        self.assertFalse('BLACK' in Color)
31757db96d56Sopenharmony_ci        self.assertFalse('RO' in Open)
31767db96d56Sopenharmony_ci        self.assertTrue(1 in Color)
31777db96d56Sopenharmony_ci        self.assertTrue(1 in Open)
31787db96d56Sopenharmony_ci
31797db96d56Sopenharmony_ci    def test_member_contains(self):
31807db96d56Sopenharmony_ci        Perm = self.Perm
31817db96d56Sopenharmony_ci        R, W, X = Perm
31827db96d56Sopenharmony_ci        RW = R | W
31837db96d56Sopenharmony_ci        RX = R | X
31847db96d56Sopenharmony_ci        WX = W | X
31857db96d56Sopenharmony_ci        RWX = R | W | X
31867db96d56Sopenharmony_ci        self.assertTrue(R in RW)
31877db96d56Sopenharmony_ci        self.assertTrue(R in RX)
31887db96d56Sopenharmony_ci        self.assertTrue(R in RWX)
31897db96d56Sopenharmony_ci        self.assertTrue(W in RW)
31907db96d56Sopenharmony_ci        self.assertTrue(W in WX)
31917db96d56Sopenharmony_ci        self.assertTrue(W in RWX)
31927db96d56Sopenharmony_ci        self.assertTrue(X in RX)
31937db96d56Sopenharmony_ci        self.assertTrue(X in WX)
31947db96d56Sopenharmony_ci        self.assertTrue(X in RWX)
31957db96d56Sopenharmony_ci        self.assertFalse(R in WX)
31967db96d56Sopenharmony_ci        self.assertFalse(W in RX)
31977db96d56Sopenharmony_ci        self.assertFalse(X in RW)
31987db96d56Sopenharmony_ci
31997db96d56Sopenharmony_ci    def test_member_iter(self):
32007db96d56Sopenharmony_ci        Color = self.Color
32017db96d56Sopenharmony_ci        self.assertEqual(list(Color.BLACK), [])
32027db96d56Sopenharmony_ci        self.assertEqual(list(Color.PURPLE), [Color.RED, Color.BLUE])
32037db96d56Sopenharmony_ci        self.assertEqual(list(Color.BLUE), [Color.BLUE])
32047db96d56Sopenharmony_ci        self.assertEqual(list(Color.GREEN), [Color.GREEN])
32057db96d56Sopenharmony_ci        self.assertEqual(list(Color.WHITE), [Color.RED, Color.GREEN, Color.BLUE])
32067db96d56Sopenharmony_ci        self.assertEqual(list(Color.WHITE), [Color.RED, Color.GREEN, Color.BLUE])
32077db96d56Sopenharmony_ci
32087db96d56Sopenharmony_ci    def test_member_length(self):
32097db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.BLACK), 0)
32107db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.GREEN), 1)
32117db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.PURPLE), 2)
32127db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.BLANCO), 3)
32137db96d56Sopenharmony_ci
32147db96d56Sopenharmony_ci    def test_number_reset_and_order_cleanup(self):
32157db96d56Sopenharmony_ci        class Confused(Flag):
32167db96d56Sopenharmony_ci            _order_ = 'ONE TWO FOUR DOS EIGHT SIXTEEN'
32177db96d56Sopenharmony_ci            ONE = auto()
32187db96d56Sopenharmony_ci            TWO = auto()
32197db96d56Sopenharmony_ci            FOUR = auto()
32207db96d56Sopenharmony_ci            DOS = 2
32217db96d56Sopenharmony_ci            EIGHT = auto()
32227db96d56Sopenharmony_ci            SIXTEEN = auto()
32237db96d56Sopenharmony_ci        self.assertEqual(
32247db96d56Sopenharmony_ci                list(Confused),
32257db96d56Sopenharmony_ci                [Confused.ONE, Confused.TWO, Confused.FOUR, Confused.EIGHT, Confused.SIXTEEN])
32267db96d56Sopenharmony_ci        self.assertIs(Confused.TWO, Confused.DOS)
32277db96d56Sopenharmony_ci        self.assertEqual(Confused.DOS._value_, 2)
32287db96d56Sopenharmony_ci        self.assertEqual(Confused.EIGHT._value_, 8)
32297db96d56Sopenharmony_ci        self.assertEqual(Confused.SIXTEEN._value_, 16)
32307db96d56Sopenharmony_ci
32317db96d56Sopenharmony_ci    def test_aliases(self):
32327db96d56Sopenharmony_ci        Color = self.Color
32337db96d56Sopenharmony_ci        self.assertEqual(Color(1).name, 'RED')
32347db96d56Sopenharmony_ci        self.assertEqual(Color['ROJO'].name, 'RED')
32357db96d56Sopenharmony_ci        self.assertEqual(Color(7).name, 'WHITE')
32367db96d56Sopenharmony_ci        self.assertEqual(Color['BLANCO'].name, 'WHITE')
32377db96d56Sopenharmony_ci        self.assertIs(Color.BLANCO, Color.WHITE)
32387db96d56Sopenharmony_ci        Open = self.Open
32397db96d56Sopenharmony_ci        self.assertIs(Open['AC'], Open.AC)
32407db96d56Sopenharmony_ci
32417db96d56Sopenharmony_ci    def test_auto_number(self):
32427db96d56Sopenharmony_ci        class Color(Flag):
32437db96d56Sopenharmony_ci            red = auto()
32447db96d56Sopenharmony_ci            blue = auto()
32457db96d56Sopenharmony_ci            green = auto()
32467db96d56Sopenharmony_ci
32477db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.red, Color.blue, Color.green])
32487db96d56Sopenharmony_ci        self.assertEqual(Color.red.value, 1)
32497db96d56Sopenharmony_ci        self.assertEqual(Color.blue.value, 2)
32507db96d56Sopenharmony_ci        self.assertEqual(Color.green.value, 4)
32517db96d56Sopenharmony_ci
32527db96d56Sopenharmony_ci    def test_auto_number_garbage(self):
32537db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'invalid flag value .not an int.'):
32547db96d56Sopenharmony_ci            class Color(Flag):
32557db96d56Sopenharmony_ci                red = 'not an int'
32567db96d56Sopenharmony_ci                blue = auto()
32577db96d56Sopenharmony_ci
32587db96d56Sopenharmony_ci    def test_duplicate_auto(self):
32597db96d56Sopenharmony_ci        class Dupes(Enum):
32607db96d56Sopenharmony_ci            first = primero = auto()
32617db96d56Sopenharmony_ci            second = auto()
32627db96d56Sopenharmony_ci            third = auto()
32637db96d56Sopenharmony_ci        self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes))
32647db96d56Sopenharmony_ci
32657db96d56Sopenharmony_ci    def test_multiple_mixin(self):
32667db96d56Sopenharmony_ci        class AllMixin:
32677db96d56Sopenharmony_ci            @classproperty
32687db96d56Sopenharmony_ci            def ALL(cls):
32697db96d56Sopenharmony_ci                members = list(cls)
32707db96d56Sopenharmony_ci                all_value = None
32717db96d56Sopenharmony_ci                if members:
32727db96d56Sopenharmony_ci                    all_value = members[0]
32737db96d56Sopenharmony_ci                    for member in members[1:]:
32747db96d56Sopenharmony_ci                        all_value |= member
32757db96d56Sopenharmony_ci                cls.ALL = all_value
32767db96d56Sopenharmony_ci                return all_value
32777db96d56Sopenharmony_ci        class StrMixin:
32787db96d56Sopenharmony_ci            def __str__(self):
32797db96d56Sopenharmony_ci                return self._name_.lower()
32807db96d56Sopenharmony_ci        class Color(AllMixin, Flag):
32817db96d56Sopenharmony_ci            RED = auto()
32827db96d56Sopenharmony_ci            GREEN = auto()
32837db96d56Sopenharmony_ci            BLUE = auto()
32847db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
32857db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
32867db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 4)
32877db96d56Sopenharmony_ci        self.assertEqual(Color.ALL.value, 7)
32887db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'Color.BLUE')
32897db96d56Sopenharmony_ci        class Color(AllMixin, StrMixin, Flag):
32907db96d56Sopenharmony_ci            RED = auto()
32917db96d56Sopenharmony_ci            GREEN = auto()
32927db96d56Sopenharmony_ci            BLUE = auto()
32937db96d56Sopenharmony_ci            __str__ = StrMixin.__str__
32947db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
32957db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
32967db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 4)
32977db96d56Sopenharmony_ci        self.assertEqual(Color.ALL.value, 7)
32987db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'blue')
32997db96d56Sopenharmony_ci        class Color(StrMixin, AllMixin, Flag):
33007db96d56Sopenharmony_ci            RED = auto()
33017db96d56Sopenharmony_ci            GREEN = auto()
33027db96d56Sopenharmony_ci            BLUE = auto()
33037db96d56Sopenharmony_ci            __str__ = StrMixin.__str__
33047db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
33057db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
33067db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 4)
33077db96d56Sopenharmony_ci        self.assertEqual(Color.ALL.value, 7)
33087db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'blue')
33097db96d56Sopenharmony_ci
33107db96d56Sopenharmony_ci    @threading_helper.reap_threads
33117db96d56Sopenharmony_ci    @threading_helper.requires_working_threading()
33127db96d56Sopenharmony_ci    def test_unique_composite(self):
33137db96d56Sopenharmony_ci        # override __eq__ to be identity only
33147db96d56Sopenharmony_ci        class TestFlag(Flag):
33157db96d56Sopenharmony_ci            one = auto()
33167db96d56Sopenharmony_ci            two = auto()
33177db96d56Sopenharmony_ci            three = auto()
33187db96d56Sopenharmony_ci            four = auto()
33197db96d56Sopenharmony_ci            five = auto()
33207db96d56Sopenharmony_ci            six = auto()
33217db96d56Sopenharmony_ci            seven = auto()
33227db96d56Sopenharmony_ci            eight = auto()
33237db96d56Sopenharmony_ci            def __eq__(self, other):
33247db96d56Sopenharmony_ci                return self is other
33257db96d56Sopenharmony_ci            def __hash__(self):
33267db96d56Sopenharmony_ci                return hash(self._value_)
33277db96d56Sopenharmony_ci        # have multiple threads competing to complete the composite members
33287db96d56Sopenharmony_ci        seen = set()
33297db96d56Sopenharmony_ci        failed = False
33307db96d56Sopenharmony_ci        def cycle_enum():
33317db96d56Sopenharmony_ci            nonlocal failed
33327db96d56Sopenharmony_ci            try:
33337db96d56Sopenharmony_ci                for i in range(256):
33347db96d56Sopenharmony_ci                    seen.add(TestFlag(i))
33357db96d56Sopenharmony_ci            except Exception:
33367db96d56Sopenharmony_ci                failed = True
33377db96d56Sopenharmony_ci        threads = [
33387db96d56Sopenharmony_ci                threading.Thread(target=cycle_enum)
33397db96d56Sopenharmony_ci                for _ in range(8)
33407db96d56Sopenharmony_ci                ]
33417db96d56Sopenharmony_ci        with threading_helper.start_threads(threads):
33427db96d56Sopenharmony_ci            pass
33437db96d56Sopenharmony_ci        # check that only 248 members were created
33447db96d56Sopenharmony_ci        self.assertFalse(
33457db96d56Sopenharmony_ci                failed,
33467db96d56Sopenharmony_ci                'at least one thread failed while creating composite members')
33477db96d56Sopenharmony_ci        self.assertEqual(256, len(seen), 'too many composite members created')
33487db96d56Sopenharmony_ci
33497db96d56Sopenharmony_ci    def test_init_subclass(self):
33507db96d56Sopenharmony_ci        class MyEnum(Flag):
33517db96d56Sopenharmony_ci            def __init_subclass__(cls, **kwds):
33527db96d56Sopenharmony_ci                super().__init_subclass__(**kwds)
33537db96d56Sopenharmony_ci                self.assertFalse(cls.__dict__.get('_test', False))
33547db96d56Sopenharmony_ci                cls._test1 = 'MyEnum'
33557db96d56Sopenharmony_ci        #
33567db96d56Sopenharmony_ci        class TheirEnum(MyEnum):
33577db96d56Sopenharmony_ci            def __init_subclass__(cls, **kwds):
33587db96d56Sopenharmony_ci                super(TheirEnum, cls).__init_subclass__(**kwds)
33597db96d56Sopenharmony_ci                cls._test2 = 'TheirEnum'
33607db96d56Sopenharmony_ci        class WhoseEnum(TheirEnum):
33617db96d56Sopenharmony_ci            def __init_subclass__(cls, **kwds):
33627db96d56Sopenharmony_ci                pass
33637db96d56Sopenharmony_ci        class NoEnum(WhoseEnum):
33647db96d56Sopenharmony_ci            ONE = 1
33657db96d56Sopenharmony_ci        self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum')
33667db96d56Sopenharmony_ci        self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum')
33677db96d56Sopenharmony_ci        self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum')
33687db96d56Sopenharmony_ci        self.assertFalse(NoEnum.__dict__.get('_test1', False))
33697db96d56Sopenharmony_ci        self.assertFalse(NoEnum.__dict__.get('_test2', False))
33707db96d56Sopenharmony_ci        #
33717db96d56Sopenharmony_ci        class OurEnum(MyEnum):
33727db96d56Sopenharmony_ci            def __init_subclass__(cls, **kwds):
33737db96d56Sopenharmony_ci                cls._test2 = 'OurEnum'
33747db96d56Sopenharmony_ci        class WhereEnum(OurEnum):
33757db96d56Sopenharmony_ci            def __init_subclass__(cls, **kwds):
33767db96d56Sopenharmony_ci                pass
33777db96d56Sopenharmony_ci        class NeverEnum(WhereEnum):
33787db96d56Sopenharmony_ci            ONE = 1
33797db96d56Sopenharmony_ci        self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum')
33807db96d56Sopenharmony_ci        self.assertFalse(WhereEnum.__dict__.get('_test1', False))
33817db96d56Sopenharmony_ci        self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum')
33827db96d56Sopenharmony_ci        self.assertFalse(NeverEnum.__dict__.get('_test1', False))
33837db96d56Sopenharmony_ci        self.assertFalse(NeverEnum.__dict__.get('_test2', False))
33847db96d56Sopenharmony_ci
33857db96d56Sopenharmony_ci
33867db96d56Sopenharmony_ciclass OldTestIntFlag(unittest.TestCase):
33877db96d56Sopenharmony_ci    """Tests of the IntFlags."""
33887db96d56Sopenharmony_ci
33897db96d56Sopenharmony_ci    class Perm(IntFlag):
33907db96d56Sopenharmony_ci        R = 1 << 2
33917db96d56Sopenharmony_ci        W = 1 << 1
33927db96d56Sopenharmony_ci        X = 1 << 0
33937db96d56Sopenharmony_ci
33947db96d56Sopenharmony_ci    class Open(IntFlag):
33957db96d56Sopenharmony_ci        RO = 0
33967db96d56Sopenharmony_ci        WO = 1
33977db96d56Sopenharmony_ci        RW = 2
33987db96d56Sopenharmony_ci        AC = 3
33997db96d56Sopenharmony_ci        CE = 1<<19
34007db96d56Sopenharmony_ci
34017db96d56Sopenharmony_ci    class Color(IntFlag):
34027db96d56Sopenharmony_ci        BLACK = 0
34037db96d56Sopenharmony_ci        RED = 1
34047db96d56Sopenharmony_ci        ROJO = 1
34057db96d56Sopenharmony_ci        GREEN = 2
34067db96d56Sopenharmony_ci        BLUE = 4
34077db96d56Sopenharmony_ci        PURPLE = RED|BLUE
34087db96d56Sopenharmony_ci        WHITE = RED|GREEN|BLUE
34097db96d56Sopenharmony_ci        BLANCO = RED|GREEN|BLUE
34107db96d56Sopenharmony_ci
34117db96d56Sopenharmony_ci    class Skip(IntFlag):
34127db96d56Sopenharmony_ci        FIRST = 1
34137db96d56Sopenharmony_ci        SECOND = 2
34147db96d56Sopenharmony_ci        EIGHTH = 8
34157db96d56Sopenharmony_ci
34167db96d56Sopenharmony_ci    def test_type(self):
34177db96d56Sopenharmony_ci        Perm = self.Perm
34187db96d56Sopenharmony_ci        self.assertTrue(Perm._member_type_ is int)
34197db96d56Sopenharmony_ci        Open = self.Open
34207db96d56Sopenharmony_ci        for f in Perm:
34217db96d56Sopenharmony_ci            self.assertTrue(isinstance(f, Perm))
34227db96d56Sopenharmony_ci            self.assertEqual(f, f.value)
34237db96d56Sopenharmony_ci        self.assertTrue(isinstance(Perm.W | Perm.X, Perm))
34247db96d56Sopenharmony_ci        self.assertEqual(Perm.W | Perm.X, 3)
34257db96d56Sopenharmony_ci        for f in Open:
34267db96d56Sopenharmony_ci            self.assertTrue(isinstance(f, Open))
34277db96d56Sopenharmony_ci            self.assertEqual(f, f.value)
34287db96d56Sopenharmony_ci        self.assertTrue(isinstance(Open.WO | Open.RW, Open))
34297db96d56Sopenharmony_ci        self.assertEqual(Open.WO | Open.RW, 3)
34307db96d56Sopenharmony_ci
34317db96d56Sopenharmony_ci    def test_global_repr_keep(self):
34327db96d56Sopenharmony_ci        self.assertEqual(
34337db96d56Sopenharmony_ci                repr(HeadlightsK(0)),
34347db96d56Sopenharmony_ci                '%s.OFF_K' % SHORT_MODULE,
34357db96d56Sopenharmony_ci                )
34367db96d56Sopenharmony_ci        self.assertEqual(
34377db96d56Sopenharmony_ci                repr(HeadlightsK(2**0 + 2**2 + 2**3)),
34387db96d56Sopenharmony_ci                '%(m)s.LOW_BEAM_K|%(m)s.FOG_K|8' % {'m': SHORT_MODULE},
34397db96d56Sopenharmony_ci                )
34407db96d56Sopenharmony_ci        self.assertEqual(
34417db96d56Sopenharmony_ci                repr(HeadlightsK(2**3)),
34427db96d56Sopenharmony_ci                '%(m)s.HeadlightsK(8)' % {'m': SHORT_MODULE},
34437db96d56Sopenharmony_ci                )
34447db96d56Sopenharmony_ci
34457db96d56Sopenharmony_ci    def test_global_repr_conform1(self):
34467db96d56Sopenharmony_ci        self.assertEqual(
34477db96d56Sopenharmony_ci                repr(HeadlightsC(0)),
34487db96d56Sopenharmony_ci                '%s.OFF_C' % SHORT_MODULE,
34497db96d56Sopenharmony_ci                )
34507db96d56Sopenharmony_ci        self.assertEqual(
34517db96d56Sopenharmony_ci                repr(HeadlightsC(2**0 + 2**2 + 2**3)),
34527db96d56Sopenharmony_ci                '%(m)s.LOW_BEAM_C|%(m)s.FOG_C' % {'m': SHORT_MODULE},
34537db96d56Sopenharmony_ci                )
34547db96d56Sopenharmony_ci        self.assertEqual(
34557db96d56Sopenharmony_ci                repr(HeadlightsC(2**3)),
34567db96d56Sopenharmony_ci                '%(m)s.OFF_C' % {'m': SHORT_MODULE},
34577db96d56Sopenharmony_ci                )
34587db96d56Sopenharmony_ci
34597db96d56Sopenharmony_ci    def test_global_enum_str(self):
34607db96d56Sopenharmony_ci        self.assertEqual(str(NoName.ONE & NoName.TWO), 'NoName(0)')
34617db96d56Sopenharmony_ci        self.assertEqual(str(NoName(0)), 'NoName(0)')
34627db96d56Sopenharmony_ci
34637db96d56Sopenharmony_ci    def test_format(self):
34647db96d56Sopenharmony_ci        Perm = self.Perm
34657db96d56Sopenharmony_ci        self.assertEqual(format(Perm.R, ''), '4')
34667db96d56Sopenharmony_ci        self.assertEqual(format(Perm.R | Perm.X, ''), '5')
34677db96d56Sopenharmony_ci        #
34687db96d56Sopenharmony_ci        class NewPerm(IntFlag):
34697db96d56Sopenharmony_ci            R = 1 << 2
34707db96d56Sopenharmony_ci            W = 1 << 1
34717db96d56Sopenharmony_ci            X = 1 << 0
34727db96d56Sopenharmony_ci            def __str__(self):
34737db96d56Sopenharmony_ci                return self._name_
34747db96d56Sopenharmony_ci        self.assertEqual(format(NewPerm.R, ''), 'R')
34757db96d56Sopenharmony_ci        self.assertEqual(format(NewPerm.R | Perm.X, ''), 'R|X')
34767db96d56Sopenharmony_ci
34777db96d56Sopenharmony_ci    def test_or(self):
34787db96d56Sopenharmony_ci        Perm = self.Perm
34797db96d56Sopenharmony_ci        for i in Perm:
34807db96d56Sopenharmony_ci            for j in Perm:
34817db96d56Sopenharmony_ci                self.assertEqual(i | j, i.value | j.value)
34827db96d56Sopenharmony_ci                self.assertEqual((i | j).value, i.value | j.value)
34837db96d56Sopenharmony_ci                self.assertIs(type(i | j), Perm)
34847db96d56Sopenharmony_ci            for j in range(8):
34857db96d56Sopenharmony_ci                self.assertEqual(i | j, i.value | j)
34867db96d56Sopenharmony_ci                self.assertEqual((i | j).value, i.value | j)
34877db96d56Sopenharmony_ci                self.assertIs(type(i | j), Perm)
34887db96d56Sopenharmony_ci                self.assertEqual(j | i, j | i.value)
34897db96d56Sopenharmony_ci                self.assertEqual((j | i).value, j | i.value)
34907db96d56Sopenharmony_ci                self.assertIs(type(j | i), Perm)
34917db96d56Sopenharmony_ci        for i in Perm:
34927db96d56Sopenharmony_ci            self.assertIs(i | i, i)
34937db96d56Sopenharmony_ci            self.assertIs(i | 0, i)
34947db96d56Sopenharmony_ci            self.assertIs(0 | i, i)
34957db96d56Sopenharmony_ci        Open = self.Open
34967db96d56Sopenharmony_ci        self.assertIs(Open.RO | Open.CE, Open.CE)
34977db96d56Sopenharmony_ci
34987db96d56Sopenharmony_ci    def test_and(self):
34997db96d56Sopenharmony_ci        Perm = self.Perm
35007db96d56Sopenharmony_ci        RW = Perm.R | Perm.W
35017db96d56Sopenharmony_ci        RX = Perm.R | Perm.X
35027db96d56Sopenharmony_ci        WX = Perm.W | Perm.X
35037db96d56Sopenharmony_ci        RWX = Perm.R | Perm.W | Perm.X
35047db96d56Sopenharmony_ci        values = list(Perm) + [RW, RX, WX, RWX, Perm(0)]
35057db96d56Sopenharmony_ci        for i in values:
35067db96d56Sopenharmony_ci            for j in values:
35077db96d56Sopenharmony_ci                self.assertEqual(i & j, i.value & j.value, 'i is %r, j is %r' % (i, j))
35087db96d56Sopenharmony_ci                self.assertEqual((i & j).value, i.value & j.value, 'i is %r, j is %r' % (i, j))
35097db96d56Sopenharmony_ci                self.assertIs(type(i & j), Perm, 'i is %r, j is %r' % (i, j))
35107db96d56Sopenharmony_ci            for j in range(8):
35117db96d56Sopenharmony_ci                self.assertEqual(i & j, i.value & j)
35127db96d56Sopenharmony_ci                self.assertEqual((i & j).value, i.value & j)
35137db96d56Sopenharmony_ci                self.assertIs(type(i & j), Perm)
35147db96d56Sopenharmony_ci                self.assertEqual(j & i, j & i.value)
35157db96d56Sopenharmony_ci                self.assertEqual((j & i).value, j & i.value)
35167db96d56Sopenharmony_ci                self.assertIs(type(j & i), Perm)
35177db96d56Sopenharmony_ci        for i in Perm:
35187db96d56Sopenharmony_ci            self.assertIs(i & i, i)
35197db96d56Sopenharmony_ci            self.assertIs(i & 7, i)
35207db96d56Sopenharmony_ci            self.assertIs(7 & i, i)
35217db96d56Sopenharmony_ci        Open = self.Open
35227db96d56Sopenharmony_ci        self.assertIs(Open.RO & Open.CE, Open.RO)
35237db96d56Sopenharmony_ci
35247db96d56Sopenharmony_ci    def test_xor(self):
35257db96d56Sopenharmony_ci        Perm = self.Perm
35267db96d56Sopenharmony_ci        for i in Perm:
35277db96d56Sopenharmony_ci            for j in Perm:
35287db96d56Sopenharmony_ci                self.assertEqual(i ^ j, i.value ^ j.value)
35297db96d56Sopenharmony_ci                self.assertEqual((i ^ j).value, i.value ^ j.value)
35307db96d56Sopenharmony_ci                self.assertIs(type(i ^ j), Perm)
35317db96d56Sopenharmony_ci            for j in range(8):
35327db96d56Sopenharmony_ci                self.assertEqual(i ^ j, i.value ^ j)
35337db96d56Sopenharmony_ci                self.assertEqual((i ^ j).value, i.value ^ j)
35347db96d56Sopenharmony_ci                self.assertIs(type(i ^ j), Perm)
35357db96d56Sopenharmony_ci                self.assertEqual(j ^ i, j ^ i.value)
35367db96d56Sopenharmony_ci                self.assertEqual((j ^ i).value, j ^ i.value)
35377db96d56Sopenharmony_ci                self.assertIs(type(j ^ i), Perm)
35387db96d56Sopenharmony_ci        for i in Perm:
35397db96d56Sopenharmony_ci            self.assertIs(i ^ 0, i)
35407db96d56Sopenharmony_ci            self.assertIs(0 ^ i, i)
35417db96d56Sopenharmony_ci        Open = self.Open
35427db96d56Sopenharmony_ci        self.assertIs(Open.RO ^ Open.CE, Open.CE)
35437db96d56Sopenharmony_ci        self.assertIs(Open.CE ^ Open.CE, Open.RO)
35447db96d56Sopenharmony_ci
35457db96d56Sopenharmony_ci    def test_invert(self):
35467db96d56Sopenharmony_ci        Perm = self.Perm
35477db96d56Sopenharmony_ci        RW = Perm.R | Perm.W
35487db96d56Sopenharmony_ci        RX = Perm.R | Perm.X
35497db96d56Sopenharmony_ci        WX = Perm.W | Perm.X
35507db96d56Sopenharmony_ci        RWX = Perm.R | Perm.W | Perm.X
35517db96d56Sopenharmony_ci        values = list(Perm) + [RW, RX, WX, RWX, Perm(0)]
35527db96d56Sopenharmony_ci        for i in values:
35537db96d56Sopenharmony_ci            self.assertEqual(~i, (~i).value)
35547db96d56Sopenharmony_ci            self.assertIs(type(~i), Perm)
35557db96d56Sopenharmony_ci            self.assertEqual(~~i, i)
35567db96d56Sopenharmony_ci        for i in Perm:
35577db96d56Sopenharmony_ci            self.assertIs(~~i, i)
35587db96d56Sopenharmony_ci        Open = self.Open
35597db96d56Sopenharmony_ci        self.assertIs(Open.WO & ~Open.WO, Open.RO)
35607db96d56Sopenharmony_ci        self.assertIs((Open.WO|Open.CE) & ~Open.WO, Open.CE)
35617db96d56Sopenharmony_ci
35627db96d56Sopenharmony_ci    def test_boundary(self):
35637db96d56Sopenharmony_ci        self.assertIs(enum.IntFlag._boundary_, KEEP)
35647db96d56Sopenharmony_ci        class Simple(IntFlag, boundary=KEEP):
35657db96d56Sopenharmony_ci            SINGLE = 1
35667db96d56Sopenharmony_ci        #
35677db96d56Sopenharmony_ci        class Iron(IntFlag, boundary=STRICT):
35687db96d56Sopenharmony_ci            ONE = 1
35697db96d56Sopenharmony_ci            TWO = 2
35707db96d56Sopenharmony_ci            EIGHT = 8
35717db96d56Sopenharmony_ci        self.assertIs(Iron._boundary_, STRICT)
35727db96d56Sopenharmony_ci        #
35737db96d56Sopenharmony_ci        class Water(IntFlag, boundary=CONFORM):
35747db96d56Sopenharmony_ci            ONE = 1
35757db96d56Sopenharmony_ci            TWO = 2
35767db96d56Sopenharmony_ci            EIGHT = 8
35777db96d56Sopenharmony_ci        self.assertIs(Water._boundary_, CONFORM)
35787db96d56Sopenharmony_ci        #
35797db96d56Sopenharmony_ci        class Space(IntFlag, boundary=EJECT):
35807db96d56Sopenharmony_ci            ONE = 1
35817db96d56Sopenharmony_ci            TWO = 2
35827db96d56Sopenharmony_ci            EIGHT = 8
35837db96d56Sopenharmony_ci        self.assertIs(Space._boundary_, EJECT)
35847db96d56Sopenharmony_ci        #
35857db96d56Sopenharmony_ci        class Bizarre(IntFlag, boundary=KEEP):
35867db96d56Sopenharmony_ci            b = 3
35877db96d56Sopenharmony_ci            c = 4
35887db96d56Sopenharmony_ci            d = 6
35897db96d56Sopenharmony_ci        #
35907db96d56Sopenharmony_ci        self.assertRaisesRegex(ValueError, 'invalid value 5', Iron, 5)
35917db96d56Sopenharmony_ci        #
35927db96d56Sopenharmony_ci        self.assertIs(Water(7), Water.ONE|Water.TWO)
35937db96d56Sopenharmony_ci        self.assertIs(Water(~9), Water.TWO)
35947db96d56Sopenharmony_ci        #
35957db96d56Sopenharmony_ci        self.assertEqual(Space(7), 7)
35967db96d56Sopenharmony_ci        self.assertTrue(type(Space(7)) is int)
35977db96d56Sopenharmony_ci        #
35987db96d56Sopenharmony_ci        self.assertEqual(list(Bizarre), [Bizarre.c])
35997db96d56Sopenharmony_ci        self.assertIs(Bizarre(3), Bizarre.b)
36007db96d56Sopenharmony_ci        self.assertIs(Bizarre(6), Bizarre.d)
36017db96d56Sopenharmony_ci        #
36027db96d56Sopenharmony_ci        simple = Simple.SINGLE | Iron.TWO
36037db96d56Sopenharmony_ci        self.assertEqual(simple, 3)
36047db96d56Sopenharmony_ci        self.assertIsInstance(simple, Simple)
36057db96d56Sopenharmony_ci        self.assertEqual(repr(simple), '<Simple.SINGLE|<Iron.TWO: 2>: 3>')
36067db96d56Sopenharmony_ci        self.assertEqual(str(simple), '3')
36077db96d56Sopenharmony_ci
36087db96d56Sopenharmony_ci    def test_iter(self):
36097db96d56Sopenharmony_ci        Color = self.Color
36107db96d56Sopenharmony_ci        Open = self.Open
36117db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.RED, Color.GREEN, Color.BLUE])
36127db96d56Sopenharmony_ci        self.assertEqual(list(Open), [Open.WO, Open.RW, Open.CE])
36137db96d56Sopenharmony_ci
36147db96d56Sopenharmony_ci    def test_programatic_function_string(self):
36157db96d56Sopenharmony_ci        Perm = IntFlag('Perm', 'R W X')
36167db96d56Sopenharmony_ci        lst = list(Perm)
36177db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
36187db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
36197db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
36207db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
36217db96d56Sopenharmony_ci            v = 1<<i
36227db96d56Sopenharmony_ci            e = Perm(v)
36237db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
36247db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
36257db96d56Sopenharmony_ci            self.assertEqual(e, v)
36267db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
36277db96d56Sopenharmony_ci            self.assertIn(e, Perm)
36287db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
36297db96d56Sopenharmony_ci
36307db96d56Sopenharmony_ci    def test_programatic_function_string_with_start(self):
36317db96d56Sopenharmony_ci        Perm = IntFlag('Perm', 'R W X', start=8)
36327db96d56Sopenharmony_ci        lst = list(Perm)
36337db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
36347db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
36357db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
36367db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
36377db96d56Sopenharmony_ci            v = 8<<i
36387db96d56Sopenharmony_ci            e = Perm(v)
36397db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
36407db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
36417db96d56Sopenharmony_ci            self.assertEqual(e, v)
36427db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
36437db96d56Sopenharmony_ci            self.assertIn(e, Perm)
36447db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
36457db96d56Sopenharmony_ci
36467db96d56Sopenharmony_ci    def test_programatic_function_string_list(self):
36477db96d56Sopenharmony_ci        Perm = IntFlag('Perm', ['R', 'W', 'X'])
36487db96d56Sopenharmony_ci        lst = list(Perm)
36497db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
36507db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
36517db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
36527db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
36537db96d56Sopenharmony_ci            v = 1<<i
36547db96d56Sopenharmony_ci            e = Perm(v)
36557db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
36567db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
36577db96d56Sopenharmony_ci            self.assertEqual(e, v)
36587db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
36597db96d56Sopenharmony_ci            self.assertIn(e, Perm)
36607db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
36617db96d56Sopenharmony_ci
36627db96d56Sopenharmony_ci    def test_programatic_function_iterable(self):
36637db96d56Sopenharmony_ci        Perm = IntFlag('Perm', (('R', 2), ('W', 8), ('X', 32)))
36647db96d56Sopenharmony_ci        lst = list(Perm)
36657db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
36667db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
36677db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
36687db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
36697db96d56Sopenharmony_ci            v = 1<<(2*i+1)
36707db96d56Sopenharmony_ci            e = Perm(v)
36717db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
36727db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
36737db96d56Sopenharmony_ci            self.assertEqual(e, v)
36747db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
36757db96d56Sopenharmony_ci            self.assertIn(e, Perm)
36767db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
36777db96d56Sopenharmony_ci
36787db96d56Sopenharmony_ci    def test_programatic_function_from_dict(self):
36797db96d56Sopenharmony_ci        Perm = IntFlag('Perm', OrderedDict((('R', 2), ('W', 8), ('X', 32))))
36807db96d56Sopenharmony_ci        lst = list(Perm)
36817db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
36827db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 3, Perm)
36837db96d56Sopenharmony_ci        self.assertEqual(lst, [Perm.R, Perm.W, Perm.X])
36847db96d56Sopenharmony_ci        for i, n in enumerate('R W X'.split()):
36857db96d56Sopenharmony_ci            v = 1<<(2*i+1)
36867db96d56Sopenharmony_ci            e = Perm(v)
36877db96d56Sopenharmony_ci            self.assertEqual(e.value, v)
36887db96d56Sopenharmony_ci            self.assertEqual(type(e.value), int)
36897db96d56Sopenharmony_ci            self.assertEqual(e, v)
36907db96d56Sopenharmony_ci            self.assertEqual(e.name, n)
36917db96d56Sopenharmony_ci            self.assertIn(e, Perm)
36927db96d56Sopenharmony_ci            self.assertIs(type(e), Perm)
36937db96d56Sopenharmony_ci
36947db96d56Sopenharmony_ci
36957db96d56Sopenharmony_ci    def test_programatic_function_from_empty_list(self):
36967db96d56Sopenharmony_ci        Perm = enum.IntFlag('Perm', [])
36977db96d56Sopenharmony_ci        lst = list(Perm)
36987db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
36997db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 0, Perm)
37007db96d56Sopenharmony_ci        Thing = enum.Enum('Thing', [])
37017db96d56Sopenharmony_ci        lst = list(Thing)
37027db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Thing))
37037db96d56Sopenharmony_ci        self.assertEqual(len(Thing), 0, Thing)
37047db96d56Sopenharmony_ci
37057db96d56Sopenharmony_ci
37067db96d56Sopenharmony_ci    def test_programatic_function_from_empty_tuple(self):
37077db96d56Sopenharmony_ci        Perm = enum.IntFlag('Perm', ())
37087db96d56Sopenharmony_ci        lst = list(Perm)
37097db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Perm))
37107db96d56Sopenharmony_ci        self.assertEqual(len(Perm), 0, Perm)
37117db96d56Sopenharmony_ci        Thing = enum.Enum('Thing', ())
37127db96d56Sopenharmony_ci        self.assertEqual(len(lst), len(Thing))
37137db96d56Sopenharmony_ci        self.assertEqual(len(Thing), 0, Thing)
37147db96d56Sopenharmony_ci
37157db96d56Sopenharmony_ci    @unittest.skipIf(
37167db96d56Sopenharmony_ci            python_version >= (3, 12),
37177db96d56Sopenharmony_ci            '__contains__ now returns True/False for all inputs',
37187db96d56Sopenharmony_ci            )
37197db96d56Sopenharmony_ci    def test_contains_er(self):
37207db96d56Sopenharmony_ci        Open = self.Open
37217db96d56Sopenharmony_ci        Color = self.Color
37227db96d56Sopenharmony_ci        self.assertTrue(Color.GREEN in Color)
37237db96d56Sopenharmony_ci        self.assertTrue(Open.RW in Open)
37247db96d56Sopenharmony_ci        self.assertFalse(Color.GREEN in Open)
37257db96d56Sopenharmony_ci        self.assertFalse(Open.RW in Color)
37267db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
37277db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
37287db96d56Sopenharmony_ci                'GREEN' in Color
37297db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
37307db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
37317db96d56Sopenharmony_ci                'RW' in Open
37327db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
37337db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
37347db96d56Sopenharmony_ci                2 in Color
37357db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
37367db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
37377db96d56Sopenharmony_ci                2 in Open
37387db96d56Sopenharmony_ci
37397db96d56Sopenharmony_ci    @unittest.skipIf(
37407db96d56Sopenharmony_ci            python_version < (3, 12),
37417db96d56Sopenharmony_ci            '__contains__ only works with enum memmbers before 3.12',
37427db96d56Sopenharmony_ci            )
37437db96d56Sopenharmony_ci    def test_contains_tf(self):
37447db96d56Sopenharmony_ci        Open = self.Open
37457db96d56Sopenharmony_ci        Color = self.Color
37467db96d56Sopenharmony_ci        self.assertTrue(Color.GREEN in Color)
37477db96d56Sopenharmony_ci        self.assertTrue(Open.RW in Open)
37487db96d56Sopenharmony_ci        self.assertTrue(Color.GREEN in Open)
37497db96d56Sopenharmony_ci        self.assertTrue(Open.RW in Color)
37507db96d56Sopenharmony_ci        self.assertFalse('GREEN' in Color)
37517db96d56Sopenharmony_ci        self.assertFalse('RW' in Open)
37527db96d56Sopenharmony_ci        self.assertTrue(2 in Color)
37537db96d56Sopenharmony_ci        self.assertTrue(2 in Open)
37547db96d56Sopenharmony_ci
37557db96d56Sopenharmony_ci    def test_member_contains(self):
37567db96d56Sopenharmony_ci        Perm = self.Perm
37577db96d56Sopenharmony_ci        R, W, X = Perm
37587db96d56Sopenharmony_ci        RW = R | W
37597db96d56Sopenharmony_ci        RX = R | X
37607db96d56Sopenharmony_ci        WX = W | X
37617db96d56Sopenharmony_ci        RWX = R | W | X
37627db96d56Sopenharmony_ci        self.assertTrue(R in RW)
37637db96d56Sopenharmony_ci        self.assertTrue(R in RX)
37647db96d56Sopenharmony_ci        self.assertTrue(R in RWX)
37657db96d56Sopenharmony_ci        self.assertTrue(W in RW)
37667db96d56Sopenharmony_ci        self.assertTrue(W in WX)
37677db96d56Sopenharmony_ci        self.assertTrue(W in RWX)
37687db96d56Sopenharmony_ci        self.assertTrue(X in RX)
37697db96d56Sopenharmony_ci        self.assertTrue(X in WX)
37707db96d56Sopenharmony_ci        self.assertTrue(X in RWX)
37717db96d56Sopenharmony_ci        self.assertFalse(R in WX)
37727db96d56Sopenharmony_ci        self.assertFalse(W in RX)
37737db96d56Sopenharmony_ci        self.assertFalse(X in RW)
37747db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
37757db96d56Sopenharmony_ci            self.assertFalse('test' in RW)
37767db96d56Sopenharmony_ci
37777db96d56Sopenharmony_ci    def test_member_iter(self):
37787db96d56Sopenharmony_ci        Color = self.Color
37797db96d56Sopenharmony_ci        self.assertEqual(list(Color.BLACK), [])
37807db96d56Sopenharmony_ci        self.assertEqual(list(Color.PURPLE), [Color.RED, Color.BLUE])
37817db96d56Sopenharmony_ci        self.assertEqual(list(Color.BLUE), [Color.BLUE])
37827db96d56Sopenharmony_ci        self.assertEqual(list(Color.GREEN), [Color.GREEN])
37837db96d56Sopenharmony_ci        self.assertEqual(list(Color.WHITE), [Color.RED, Color.GREEN, Color.BLUE])
37847db96d56Sopenharmony_ci
37857db96d56Sopenharmony_ci    def test_member_length(self):
37867db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.BLACK), 0)
37877db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.GREEN), 1)
37887db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.PURPLE), 2)
37897db96d56Sopenharmony_ci        self.assertEqual(self.Color.__len__(self.Color.BLANCO), 3)
37907db96d56Sopenharmony_ci
37917db96d56Sopenharmony_ci    def test_aliases(self):
37927db96d56Sopenharmony_ci        Color = self.Color
37937db96d56Sopenharmony_ci        self.assertEqual(Color(1).name, 'RED')
37947db96d56Sopenharmony_ci        self.assertEqual(Color['ROJO'].name, 'RED')
37957db96d56Sopenharmony_ci        self.assertEqual(Color(7).name, 'WHITE')
37967db96d56Sopenharmony_ci        self.assertEqual(Color['BLANCO'].name, 'WHITE')
37977db96d56Sopenharmony_ci        self.assertIs(Color.BLANCO, Color.WHITE)
37987db96d56Sopenharmony_ci        Open = self.Open
37997db96d56Sopenharmony_ci        self.assertIs(Open['AC'], Open.AC)
38007db96d56Sopenharmony_ci
38017db96d56Sopenharmony_ci    def test_bool(self):
38027db96d56Sopenharmony_ci        Perm = self.Perm
38037db96d56Sopenharmony_ci        for f in Perm:
38047db96d56Sopenharmony_ci            self.assertTrue(f)
38057db96d56Sopenharmony_ci        Open = self.Open
38067db96d56Sopenharmony_ci        for f in Open:
38077db96d56Sopenharmony_ci            self.assertEqual(bool(f.value), bool(f))
38087db96d56Sopenharmony_ci
38097db96d56Sopenharmony_ci
38107db96d56Sopenharmony_ci    def test_multiple_mixin(self):
38117db96d56Sopenharmony_ci        class AllMixin:
38127db96d56Sopenharmony_ci            @classproperty
38137db96d56Sopenharmony_ci            def ALL(cls):
38147db96d56Sopenharmony_ci                members = list(cls)
38157db96d56Sopenharmony_ci                all_value = None
38167db96d56Sopenharmony_ci                if members:
38177db96d56Sopenharmony_ci                    all_value = members[0]
38187db96d56Sopenharmony_ci                    for member in members[1:]:
38197db96d56Sopenharmony_ci                        all_value |= member
38207db96d56Sopenharmony_ci                cls.ALL = all_value
38217db96d56Sopenharmony_ci                return all_value
38227db96d56Sopenharmony_ci        class StrMixin:
38237db96d56Sopenharmony_ci            def __str__(self):
38247db96d56Sopenharmony_ci                return self._name_.lower()
38257db96d56Sopenharmony_ci        class Color(AllMixin, IntFlag):
38267db96d56Sopenharmony_ci            RED = auto()
38277db96d56Sopenharmony_ci            GREEN = auto()
38287db96d56Sopenharmony_ci            BLUE = auto()
38297db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
38307db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
38317db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 4)
38327db96d56Sopenharmony_ci        self.assertEqual(Color.ALL.value, 7)
38337db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), '4')
38347db96d56Sopenharmony_ci        class Color(AllMixin, StrMixin, IntFlag):
38357db96d56Sopenharmony_ci            RED = auto()
38367db96d56Sopenharmony_ci            GREEN = auto()
38377db96d56Sopenharmony_ci            BLUE = auto()
38387db96d56Sopenharmony_ci            __str__ = StrMixin.__str__
38397db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
38407db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
38417db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 4)
38427db96d56Sopenharmony_ci        self.assertEqual(Color.ALL.value, 7)
38437db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'blue')
38447db96d56Sopenharmony_ci        class Color(StrMixin, AllMixin, IntFlag):
38457db96d56Sopenharmony_ci            RED = auto()
38467db96d56Sopenharmony_ci            GREEN = auto()
38477db96d56Sopenharmony_ci            BLUE = auto()
38487db96d56Sopenharmony_ci            __str__ = StrMixin.__str__
38497db96d56Sopenharmony_ci        self.assertEqual(Color.RED.value, 1)
38507db96d56Sopenharmony_ci        self.assertEqual(Color.GREEN.value, 2)
38517db96d56Sopenharmony_ci        self.assertEqual(Color.BLUE.value, 4)
38527db96d56Sopenharmony_ci        self.assertEqual(Color.ALL.value, 7)
38537db96d56Sopenharmony_ci        self.assertEqual(str(Color.BLUE), 'blue')
38547db96d56Sopenharmony_ci
38557db96d56Sopenharmony_ci    @threading_helper.reap_threads
38567db96d56Sopenharmony_ci    @threading_helper.requires_working_threading()
38577db96d56Sopenharmony_ci    def test_unique_composite(self):
38587db96d56Sopenharmony_ci        # override __eq__ to be identity only
38597db96d56Sopenharmony_ci        class TestFlag(IntFlag):
38607db96d56Sopenharmony_ci            one = auto()
38617db96d56Sopenharmony_ci            two = auto()
38627db96d56Sopenharmony_ci            three = auto()
38637db96d56Sopenharmony_ci            four = auto()
38647db96d56Sopenharmony_ci            five = auto()
38657db96d56Sopenharmony_ci            six = auto()
38667db96d56Sopenharmony_ci            seven = auto()
38677db96d56Sopenharmony_ci            eight = auto()
38687db96d56Sopenharmony_ci            def __eq__(self, other):
38697db96d56Sopenharmony_ci                return self is other
38707db96d56Sopenharmony_ci            def __hash__(self):
38717db96d56Sopenharmony_ci                return hash(self._value_)
38727db96d56Sopenharmony_ci        # have multiple threads competing to complete the composite members
38737db96d56Sopenharmony_ci        seen = set()
38747db96d56Sopenharmony_ci        failed = False
38757db96d56Sopenharmony_ci        def cycle_enum():
38767db96d56Sopenharmony_ci            nonlocal failed
38777db96d56Sopenharmony_ci            try:
38787db96d56Sopenharmony_ci                for i in range(256):
38797db96d56Sopenharmony_ci                    seen.add(TestFlag(i))
38807db96d56Sopenharmony_ci            except Exception:
38817db96d56Sopenharmony_ci                failed = True
38827db96d56Sopenharmony_ci        threads = [
38837db96d56Sopenharmony_ci                threading.Thread(target=cycle_enum)
38847db96d56Sopenharmony_ci                for _ in range(8)
38857db96d56Sopenharmony_ci                ]
38867db96d56Sopenharmony_ci        with threading_helper.start_threads(threads):
38877db96d56Sopenharmony_ci            pass
38887db96d56Sopenharmony_ci        # check that only 248 members were created
38897db96d56Sopenharmony_ci        self.assertFalse(
38907db96d56Sopenharmony_ci                failed,
38917db96d56Sopenharmony_ci                'at least one thread failed while creating composite members')
38927db96d56Sopenharmony_ci        self.assertEqual(256, len(seen), 'too many composite members created')
38937db96d56Sopenharmony_ci
38947db96d56Sopenharmony_ci
38957db96d56Sopenharmony_ciclass TestEmptyAndNonLatinStrings(unittest.TestCase):
38967db96d56Sopenharmony_ci
38977db96d56Sopenharmony_ci    def test_empty_string(self):
38987db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
38997db96d56Sopenharmony_ci            empty_abc = Enum('empty_abc', ('', 'B', 'C'))
39007db96d56Sopenharmony_ci
39017db96d56Sopenharmony_ci    def test_non_latin_character_string(self):
39027db96d56Sopenharmony_ci        greek_abc = Enum('greek_abc', ('\u03B1', 'B', 'C'))
39037db96d56Sopenharmony_ci        item = getattr(greek_abc, '\u03B1')
39047db96d56Sopenharmony_ci        self.assertEqual(item.value, 1)
39057db96d56Sopenharmony_ci
39067db96d56Sopenharmony_ci    def test_non_latin_number_string(self):
39077db96d56Sopenharmony_ci        hebrew_123 = Enum('hebrew_123', ('\u05D0', '2', '3'))
39087db96d56Sopenharmony_ci        item = getattr(hebrew_123, '\u05D0')
39097db96d56Sopenharmony_ci        self.assertEqual(item.value, 1)
39107db96d56Sopenharmony_ci
39117db96d56Sopenharmony_ci
39127db96d56Sopenharmony_ciclass TestUnique(unittest.TestCase):
39137db96d56Sopenharmony_ci
39147db96d56Sopenharmony_ci    def test_unique_clean(self):
39157db96d56Sopenharmony_ci        @unique
39167db96d56Sopenharmony_ci        class Clean(Enum):
39177db96d56Sopenharmony_ci            one = 1
39187db96d56Sopenharmony_ci            two = 'dos'
39197db96d56Sopenharmony_ci            tres = 4.0
39207db96d56Sopenharmony_ci        #
39217db96d56Sopenharmony_ci        @unique
39227db96d56Sopenharmony_ci        class Cleaner(IntEnum):
39237db96d56Sopenharmony_ci            single = 1
39247db96d56Sopenharmony_ci            double = 2
39257db96d56Sopenharmony_ci            triple = 3
39267db96d56Sopenharmony_ci
39277db96d56Sopenharmony_ci    def test_unique_dirty(self):
39287db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'tres.*one'):
39297db96d56Sopenharmony_ci            @unique
39307db96d56Sopenharmony_ci            class Dirty(Enum):
39317db96d56Sopenharmony_ci                one = 1
39327db96d56Sopenharmony_ci                two = 'dos'
39337db96d56Sopenharmony_ci                tres = 1
39347db96d56Sopenharmony_ci        with self.assertRaisesRegex(
39357db96d56Sopenharmony_ci                ValueError,
39367db96d56Sopenharmony_ci                'double.*single.*turkey.*triple',
39377db96d56Sopenharmony_ci                ):
39387db96d56Sopenharmony_ci            @unique
39397db96d56Sopenharmony_ci            class Dirtier(IntEnum):
39407db96d56Sopenharmony_ci                single = 1
39417db96d56Sopenharmony_ci                double = 1
39427db96d56Sopenharmony_ci                triple = 3
39437db96d56Sopenharmony_ci                turkey = 3
39447db96d56Sopenharmony_ci
39457db96d56Sopenharmony_ci    def test_unique_with_name(self):
39467db96d56Sopenharmony_ci        @verify(UNIQUE)
39477db96d56Sopenharmony_ci        class Silly(Enum):
39487db96d56Sopenharmony_ci            one = 1
39497db96d56Sopenharmony_ci            two = 'dos'
39507db96d56Sopenharmony_ci            name = 3
39517db96d56Sopenharmony_ci        #
39527db96d56Sopenharmony_ci        @verify(UNIQUE)
39537db96d56Sopenharmony_ci        class Sillier(IntEnum):
39547db96d56Sopenharmony_ci            single = 1
39557db96d56Sopenharmony_ci            name = 2
39567db96d56Sopenharmony_ci            triple = 3
39577db96d56Sopenharmony_ci            value = 4
39587db96d56Sopenharmony_ci
39597db96d56Sopenharmony_ciclass TestVerify(unittest.TestCase):
39607db96d56Sopenharmony_ci
39617db96d56Sopenharmony_ci    def test_continuous(self):
39627db96d56Sopenharmony_ci        @verify(CONTINUOUS)
39637db96d56Sopenharmony_ci        class Auto(Enum):
39647db96d56Sopenharmony_ci            FIRST = auto()
39657db96d56Sopenharmony_ci            SECOND = auto()
39667db96d56Sopenharmony_ci            THIRD = auto()
39677db96d56Sopenharmony_ci            FORTH = auto()
39687db96d56Sopenharmony_ci        #
39697db96d56Sopenharmony_ci        @verify(CONTINUOUS)
39707db96d56Sopenharmony_ci        class Manual(Enum):
39717db96d56Sopenharmony_ci            FIRST = 3
39727db96d56Sopenharmony_ci            SECOND = 4
39737db96d56Sopenharmony_ci            THIRD = 5
39747db96d56Sopenharmony_ci            FORTH = 6
39757db96d56Sopenharmony_ci        #
39767db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'invalid enum .Missing.: missing values 5, 6, 7, 8, 9, 10, 12'):
39777db96d56Sopenharmony_ci            @verify(CONTINUOUS)
39787db96d56Sopenharmony_ci            class Missing(Enum):
39797db96d56Sopenharmony_ci                FIRST = 3
39807db96d56Sopenharmony_ci                SECOND = 4
39817db96d56Sopenharmony_ci                THIRD = 11
39827db96d56Sopenharmony_ci                FORTH = 13
39837db96d56Sopenharmony_ci        #
39847db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'invalid flag .Incomplete.: missing values 32'):
39857db96d56Sopenharmony_ci            @verify(CONTINUOUS)
39867db96d56Sopenharmony_ci            class Incomplete(Flag):
39877db96d56Sopenharmony_ci                FIRST = 4
39887db96d56Sopenharmony_ci                SECOND = 8
39897db96d56Sopenharmony_ci                THIRD = 16
39907db96d56Sopenharmony_ci                FORTH = 64
39917db96d56Sopenharmony_ci        #
39927db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'invalid flag .StillIncomplete.: missing values 16'):
39937db96d56Sopenharmony_ci            @verify(CONTINUOUS)
39947db96d56Sopenharmony_ci            class StillIncomplete(Flag):
39957db96d56Sopenharmony_ci                FIRST = 4
39967db96d56Sopenharmony_ci                SECOND = 8
39977db96d56Sopenharmony_ci                THIRD = 11
39987db96d56Sopenharmony_ci                FORTH = 32
39997db96d56Sopenharmony_ci
40007db96d56Sopenharmony_ci
40017db96d56Sopenharmony_ci    def test_composite(self):
40027db96d56Sopenharmony_ci        class Bizarre(Flag):
40037db96d56Sopenharmony_ci            b = 3
40047db96d56Sopenharmony_ci            c = 4
40057db96d56Sopenharmony_ci            d = 6
40067db96d56Sopenharmony_ci        self.assertEqual(list(Bizarre), [Bizarre.c])
40077db96d56Sopenharmony_ci        self.assertEqual(Bizarre.b.value, 3)
40087db96d56Sopenharmony_ci        self.assertEqual(Bizarre.c.value, 4)
40097db96d56Sopenharmony_ci        self.assertEqual(Bizarre.d.value, 6)
40107db96d56Sopenharmony_ci        with self.assertRaisesRegex(
40117db96d56Sopenharmony_ci                ValueError,
40127db96d56Sopenharmony_ci                "invalid Flag 'Bizarre': aliases b and d are missing combined values of 0x3 .use enum.show_flag_values.value. for details.",
40137db96d56Sopenharmony_ci            ):
40147db96d56Sopenharmony_ci            @verify(NAMED_FLAGS)
40157db96d56Sopenharmony_ci            class Bizarre(Flag):
40167db96d56Sopenharmony_ci                b = 3
40177db96d56Sopenharmony_ci                c = 4
40187db96d56Sopenharmony_ci                d = 6
40197db96d56Sopenharmony_ci        #
40207db96d56Sopenharmony_ci        self.assertEqual(enum.show_flag_values(3), [1, 2])
40217db96d56Sopenharmony_ci        class Bizarre(IntFlag):
40227db96d56Sopenharmony_ci            b = 3
40237db96d56Sopenharmony_ci            c = 4
40247db96d56Sopenharmony_ci            d = 6
40257db96d56Sopenharmony_ci        self.assertEqual(list(Bizarre), [Bizarre.c])
40267db96d56Sopenharmony_ci        self.assertEqual(Bizarre.b.value, 3)
40277db96d56Sopenharmony_ci        self.assertEqual(Bizarre.c.value, 4)
40287db96d56Sopenharmony_ci        self.assertEqual(Bizarre.d.value, 6)
40297db96d56Sopenharmony_ci        with self.assertRaisesRegex(
40307db96d56Sopenharmony_ci                ValueError,
40317db96d56Sopenharmony_ci                "invalid Flag 'Bizarre': alias d is missing value 0x2 .use enum.show_flag_values.value. for details.",
40327db96d56Sopenharmony_ci            ):
40337db96d56Sopenharmony_ci            @verify(NAMED_FLAGS)
40347db96d56Sopenharmony_ci            class Bizarre(IntFlag):
40357db96d56Sopenharmony_ci                c = 4
40367db96d56Sopenharmony_ci                d = 6
40377db96d56Sopenharmony_ci        self.assertEqual(enum.show_flag_values(2), [2])
40387db96d56Sopenharmony_ci
40397db96d56Sopenharmony_ci    def test_unique_clean(self):
40407db96d56Sopenharmony_ci        @verify(UNIQUE)
40417db96d56Sopenharmony_ci        class Clean(Enum):
40427db96d56Sopenharmony_ci            one = 1
40437db96d56Sopenharmony_ci            two = 'dos'
40447db96d56Sopenharmony_ci            tres = 4.0
40457db96d56Sopenharmony_ci        #
40467db96d56Sopenharmony_ci        @verify(UNIQUE)
40477db96d56Sopenharmony_ci        class Cleaner(IntEnum):
40487db96d56Sopenharmony_ci            single = 1
40497db96d56Sopenharmony_ci            double = 2
40507db96d56Sopenharmony_ci            triple = 3
40517db96d56Sopenharmony_ci
40527db96d56Sopenharmony_ci    def test_unique_dirty(self):
40537db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'tres.*one'):
40547db96d56Sopenharmony_ci            @verify(UNIQUE)
40557db96d56Sopenharmony_ci            class Dirty(Enum):
40567db96d56Sopenharmony_ci                one = 1
40577db96d56Sopenharmony_ci                two = 'dos'
40587db96d56Sopenharmony_ci                tres = 1
40597db96d56Sopenharmony_ci        with self.assertRaisesRegex(
40607db96d56Sopenharmony_ci                ValueError,
40617db96d56Sopenharmony_ci                'double.*single.*turkey.*triple',
40627db96d56Sopenharmony_ci                ):
40637db96d56Sopenharmony_ci            @verify(UNIQUE)
40647db96d56Sopenharmony_ci            class Dirtier(IntEnum):
40657db96d56Sopenharmony_ci                single = 1
40667db96d56Sopenharmony_ci                double = 1
40677db96d56Sopenharmony_ci                triple = 3
40687db96d56Sopenharmony_ci                turkey = 3
40697db96d56Sopenharmony_ci
40707db96d56Sopenharmony_ci    def test_unique_with_name(self):
40717db96d56Sopenharmony_ci        @verify(UNIQUE)
40727db96d56Sopenharmony_ci        class Silly(Enum):
40737db96d56Sopenharmony_ci            one = 1
40747db96d56Sopenharmony_ci            two = 'dos'
40757db96d56Sopenharmony_ci            name = 3
40767db96d56Sopenharmony_ci        #
40777db96d56Sopenharmony_ci        @verify(UNIQUE)
40787db96d56Sopenharmony_ci        class Sillier(IntEnum):
40797db96d56Sopenharmony_ci            single = 1
40807db96d56Sopenharmony_ci            name = 2
40817db96d56Sopenharmony_ci            triple = 3
40827db96d56Sopenharmony_ci            value = 4
40837db96d56Sopenharmony_ci
40847db96d56Sopenharmony_ci    def test_negative_alias(self):
40857db96d56Sopenharmony_ci        @verify(NAMED_FLAGS)
40867db96d56Sopenharmony_ci        class Color(Flag):
40877db96d56Sopenharmony_ci            RED = 1
40887db96d56Sopenharmony_ci            GREEN = 2
40897db96d56Sopenharmony_ci            BLUE = 4
40907db96d56Sopenharmony_ci            WHITE = -1
40917db96d56Sopenharmony_ci        # no error means success
40927db96d56Sopenharmony_ci
40937db96d56Sopenharmony_ci
40947db96d56Sopenharmony_ciclass TestInternals(unittest.TestCase):
40957db96d56Sopenharmony_ci
40967db96d56Sopenharmony_ci    sunder_names = '_bad_', '_good_', '_what_ho_'
40977db96d56Sopenharmony_ci    dunder_names = '__mal__', '__bien__', '__que_que__'
40987db96d56Sopenharmony_ci    private_names = '_MyEnum__private', '_MyEnum__still_private'
40997db96d56Sopenharmony_ci    private_and_sunder_names = '_MyEnum__private_', '_MyEnum__also_private_'
41007db96d56Sopenharmony_ci    random_names = 'okay', '_semi_private', '_weird__', '_MyEnum__'
41017db96d56Sopenharmony_ci
41027db96d56Sopenharmony_ci    def test_sunder(self):
41037db96d56Sopenharmony_ci        for name in self.sunder_names + self.private_and_sunder_names:
41047db96d56Sopenharmony_ci            self.assertTrue(enum._is_sunder(name), '%r is a not sunder name?' % name)
41057db96d56Sopenharmony_ci        for name in self.dunder_names + self.private_names + self.random_names:
41067db96d56Sopenharmony_ci            self.assertFalse(enum._is_sunder(name), '%r is a sunder name?' % name)
41077db96d56Sopenharmony_ci
41087db96d56Sopenharmony_ci    def test_dunder(self):
41097db96d56Sopenharmony_ci        for name in self.dunder_names:
41107db96d56Sopenharmony_ci            self.assertTrue(enum._is_dunder(name), '%r is a not dunder name?' % name)
41117db96d56Sopenharmony_ci        for name in self.sunder_names + self.private_names + self.private_and_sunder_names + self.random_names:
41127db96d56Sopenharmony_ci            self.assertFalse(enum._is_dunder(name), '%r is a dunder name?' % name)
41137db96d56Sopenharmony_ci
41147db96d56Sopenharmony_ci    def test_is_private(self):
41157db96d56Sopenharmony_ci        for name in self.private_names + self.private_and_sunder_names:
41167db96d56Sopenharmony_ci            self.assertTrue(enum._is_private('MyEnum', name), '%r is a not private name?')
41177db96d56Sopenharmony_ci        for name in self.sunder_names + self.dunder_names + self.random_names:
41187db96d56Sopenharmony_ci            self.assertFalse(enum._is_private('MyEnum', name), '%r is a private name?')
41197db96d56Sopenharmony_ci
41207db96d56Sopenharmony_ci    def test_auto_number(self):
41217db96d56Sopenharmony_ci        class Color(Enum):
41227db96d56Sopenharmony_ci            red = auto()
41237db96d56Sopenharmony_ci            blue = auto()
41247db96d56Sopenharmony_ci            green = auto()
41257db96d56Sopenharmony_ci
41267db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.red, Color.blue, Color.green])
41277db96d56Sopenharmony_ci        self.assertEqual(Color.red.value, 1)
41287db96d56Sopenharmony_ci        self.assertEqual(Color.blue.value, 2)
41297db96d56Sopenharmony_ci        self.assertEqual(Color.green.value, 3)
41307db96d56Sopenharmony_ci
41317db96d56Sopenharmony_ci    def test_auto_name(self):
41327db96d56Sopenharmony_ci        class Color(Enum):
41337db96d56Sopenharmony_ci            def _generate_next_value_(name, start, count, last):
41347db96d56Sopenharmony_ci                return name
41357db96d56Sopenharmony_ci            red = auto()
41367db96d56Sopenharmony_ci            blue = auto()
41377db96d56Sopenharmony_ci            green = auto()
41387db96d56Sopenharmony_ci
41397db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.red, Color.blue, Color.green])
41407db96d56Sopenharmony_ci        self.assertEqual(Color.red.value, 'red')
41417db96d56Sopenharmony_ci        self.assertEqual(Color.blue.value, 'blue')
41427db96d56Sopenharmony_ci        self.assertEqual(Color.green.value, 'green')
41437db96d56Sopenharmony_ci
41447db96d56Sopenharmony_ci    def test_auto_name_inherit(self):
41457db96d56Sopenharmony_ci        class AutoNameEnum(Enum):
41467db96d56Sopenharmony_ci            def _generate_next_value_(name, start, count, last):
41477db96d56Sopenharmony_ci                return name
41487db96d56Sopenharmony_ci        class Color(AutoNameEnum):
41497db96d56Sopenharmony_ci            red = auto()
41507db96d56Sopenharmony_ci            blue = auto()
41517db96d56Sopenharmony_ci            green = auto()
41527db96d56Sopenharmony_ci
41537db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.red, Color.blue, Color.green])
41547db96d56Sopenharmony_ci        self.assertEqual(Color.red.value, 'red')
41557db96d56Sopenharmony_ci        self.assertEqual(Color.blue.value, 'blue')
41567db96d56Sopenharmony_ci        self.assertEqual(Color.green.value, 'green')
41577db96d56Sopenharmony_ci
41587db96d56Sopenharmony_ci    @unittest.skipIf(
41597db96d56Sopenharmony_ci            python_version >= (3, 13),
41607db96d56Sopenharmony_ci            'mixed types with auto() no longer supported',
41617db96d56Sopenharmony_ci            )
41627db96d56Sopenharmony_ci    def test_auto_garbage_ok(self):
41637db96d56Sopenharmony_ci        with self.assertWarnsRegex(DeprecationWarning, 'will require all values to be sortable'):
41647db96d56Sopenharmony_ci            class Color(Enum):
41657db96d56Sopenharmony_ci                red = 'red'
41667db96d56Sopenharmony_ci                blue = auto()
41677db96d56Sopenharmony_ci        self.assertEqual(Color.blue.value, 1)
41687db96d56Sopenharmony_ci
41697db96d56Sopenharmony_ci    @unittest.skipIf(
41707db96d56Sopenharmony_ci            python_version >= (3, 13),
41717db96d56Sopenharmony_ci            'mixed types with auto() no longer supported',
41727db96d56Sopenharmony_ci            )
41737db96d56Sopenharmony_ci    def test_auto_garbage_corrected_ok(self):
41747db96d56Sopenharmony_ci        with self.assertWarnsRegex(DeprecationWarning, 'will require all values to be sortable'):
41757db96d56Sopenharmony_ci            class Color(Enum):
41767db96d56Sopenharmony_ci                red = 'red'
41777db96d56Sopenharmony_ci                blue = 2
41787db96d56Sopenharmony_ci                green = auto()
41797db96d56Sopenharmony_ci                yellow = auto()
41807db96d56Sopenharmony_ci
41817db96d56Sopenharmony_ci        self.assertEqual(list(Color),
41827db96d56Sopenharmony_ci                         [Color.red, Color.blue, Color.green, Color.yellow])
41837db96d56Sopenharmony_ci        self.assertEqual(Color.red.value, 'red')
41847db96d56Sopenharmony_ci        self.assertEqual(Color.blue.value, 2)
41857db96d56Sopenharmony_ci        self.assertEqual(Color.green.value, 3)
41867db96d56Sopenharmony_ci        self.assertEqual(Color.yellow.value, 4)
41877db96d56Sopenharmony_ci
41887db96d56Sopenharmony_ci    @unittest.skipIf(
41897db96d56Sopenharmony_ci            python_version < (3, 13),
41907db96d56Sopenharmony_ci            'mixed types with auto() will raise in 3.13',
41917db96d56Sopenharmony_ci            )
41927db96d56Sopenharmony_ci    def test_auto_garbage_fail(self):
41937db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'will require all values to be sortable'):
41947db96d56Sopenharmony_ci            class Color(Enum):
41957db96d56Sopenharmony_ci                red = 'red'
41967db96d56Sopenharmony_ci                blue = auto()
41977db96d56Sopenharmony_ci
41987db96d56Sopenharmony_ci    @unittest.skipIf(
41997db96d56Sopenharmony_ci            python_version < (3, 13),
42007db96d56Sopenharmony_ci            'mixed types with auto() will raise in 3.13',
42017db96d56Sopenharmony_ci            )
42027db96d56Sopenharmony_ci    def test_auto_garbage_corrected_fail(self):
42037db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'will require all values to be sortable'):
42047db96d56Sopenharmony_ci            class Color(Enum):
42057db96d56Sopenharmony_ci                red = 'red'
42067db96d56Sopenharmony_ci                blue = 2
42077db96d56Sopenharmony_ci                green = auto()
42087db96d56Sopenharmony_ci
42097db96d56Sopenharmony_ci    def test_auto_order(self):
42107db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
42117db96d56Sopenharmony_ci            class Color(Enum):
42127db96d56Sopenharmony_ci                red = auto()
42137db96d56Sopenharmony_ci                green = auto()
42147db96d56Sopenharmony_ci                blue = auto()
42157db96d56Sopenharmony_ci                def _generate_next_value_(name, start, count, last):
42167db96d56Sopenharmony_ci                    return name
42177db96d56Sopenharmony_ci
42187db96d56Sopenharmony_ci    def test_auto_order_wierd(self):
42197db96d56Sopenharmony_ci        weird_auto = auto()
42207db96d56Sopenharmony_ci        weird_auto.value = 'pathological case'
42217db96d56Sopenharmony_ci        class Color(Enum):
42227db96d56Sopenharmony_ci            red = weird_auto
42237db96d56Sopenharmony_ci            def _generate_next_value_(name, start, count, last):
42247db96d56Sopenharmony_ci                return name
42257db96d56Sopenharmony_ci            blue = auto()
42267db96d56Sopenharmony_ci        self.assertEqual(list(Color), [Color.red, Color.blue])
42277db96d56Sopenharmony_ci        self.assertEqual(Color.red.value, 'pathological case')
42287db96d56Sopenharmony_ci        self.assertEqual(Color.blue.value, 'blue')
42297db96d56Sopenharmony_ci
42307db96d56Sopenharmony_ci    @unittest.skipIf(
42317db96d56Sopenharmony_ci            python_version < (3, 13),
42327db96d56Sopenharmony_ci            'auto() will return highest value + 1 in 3.13',
42337db96d56Sopenharmony_ci            )
42347db96d56Sopenharmony_ci    def test_auto_with_aliases(self):
42357db96d56Sopenharmony_ci        class Color(Enum):
42367db96d56Sopenharmony_ci            red = auto()
42377db96d56Sopenharmony_ci            blue = auto()
42387db96d56Sopenharmony_ci            oxford = blue
42397db96d56Sopenharmony_ci            crimson = red
42407db96d56Sopenharmony_ci            green = auto()
42417db96d56Sopenharmony_ci        self.assertIs(Color.crimson, Color.red)
42427db96d56Sopenharmony_ci        self.assertIs(Color.oxford, Color.blue)
42437db96d56Sopenharmony_ci        self.assertIsNot(Color.green, Color.red)
42447db96d56Sopenharmony_ci        self.assertIsNot(Color.green, Color.blue)
42457db96d56Sopenharmony_ci
42467db96d56Sopenharmony_ci    def test_duplicate_auto(self):
42477db96d56Sopenharmony_ci        class Dupes(Enum):
42487db96d56Sopenharmony_ci            first = primero = auto()
42497db96d56Sopenharmony_ci            second = auto()
42507db96d56Sopenharmony_ci            third = auto()
42517db96d56Sopenharmony_ci        self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes))
42527db96d56Sopenharmony_ci
42537db96d56Sopenharmony_ci    def test_multiple_auto_on_line(self):
42547db96d56Sopenharmony_ci        class Huh(Enum):
42557db96d56Sopenharmony_ci            ONE = auto()
42567db96d56Sopenharmony_ci            TWO = auto(), auto()
42577db96d56Sopenharmony_ci            THREE = auto(), auto(), auto()
42587db96d56Sopenharmony_ci        self.assertEqual(Huh.ONE.value, 1)
42597db96d56Sopenharmony_ci        self.assertEqual(Huh.TWO.value, (2, 3))
42607db96d56Sopenharmony_ci        self.assertEqual(Huh.THREE.value, (4, 5, 6))
42617db96d56Sopenharmony_ci        #
42627db96d56Sopenharmony_ci        class Hah(Enum):
42637db96d56Sopenharmony_ci            def __new__(cls, value, abbr=None):
42647db96d56Sopenharmony_ci                member = object.__new__(cls)
42657db96d56Sopenharmony_ci                member._value_ = value
42667db96d56Sopenharmony_ci                member.abbr = abbr or value[:3].lower()
42677db96d56Sopenharmony_ci                return member
42687db96d56Sopenharmony_ci            def _generate_next_value_(name, start, count, last):
42697db96d56Sopenharmony_ci                return name
42707db96d56Sopenharmony_ci            #
42717db96d56Sopenharmony_ci            MONDAY = auto()
42727db96d56Sopenharmony_ci            TUESDAY = auto()
42737db96d56Sopenharmony_ci            WEDNESDAY = auto(), 'WED'
42747db96d56Sopenharmony_ci            THURSDAY = auto(), 'Thu'
42757db96d56Sopenharmony_ci            FRIDAY = auto()
42767db96d56Sopenharmony_ci        self.assertEqual(Hah.MONDAY.value, 'MONDAY')
42777db96d56Sopenharmony_ci        self.assertEqual(Hah.MONDAY.abbr, 'mon')
42787db96d56Sopenharmony_ci        self.assertEqual(Hah.TUESDAY.value, 'TUESDAY')
42797db96d56Sopenharmony_ci        self.assertEqual(Hah.TUESDAY.abbr, 'tue')
42807db96d56Sopenharmony_ci        self.assertEqual(Hah.WEDNESDAY.value, 'WEDNESDAY')
42817db96d56Sopenharmony_ci        self.assertEqual(Hah.WEDNESDAY.abbr, 'WED')
42827db96d56Sopenharmony_ci        self.assertEqual(Hah.THURSDAY.value, 'THURSDAY')
42837db96d56Sopenharmony_ci        self.assertEqual(Hah.THURSDAY.abbr, 'Thu')
42847db96d56Sopenharmony_ci        self.assertEqual(Hah.FRIDAY.value, 'FRIDAY')
42857db96d56Sopenharmony_ci        self.assertEqual(Hah.FRIDAY.abbr, 'fri')
42867db96d56Sopenharmony_ci        #
42877db96d56Sopenharmony_ci        class Huh(Enum):
42887db96d56Sopenharmony_ci            def _generate_next_value_(name, start, count, last):
42897db96d56Sopenharmony_ci                return count+1
42907db96d56Sopenharmony_ci            ONE = auto()
42917db96d56Sopenharmony_ci            TWO = auto(), auto()
42927db96d56Sopenharmony_ci            THREE = auto(), auto(), auto()
42937db96d56Sopenharmony_ci        self.assertEqual(Huh.ONE.value, 1)
42947db96d56Sopenharmony_ci        self.assertEqual(Huh.TWO.value, (2, 2))
42957db96d56Sopenharmony_ci        self.assertEqual(Huh.THREE.value, (3, 3, 3))
42967db96d56Sopenharmony_ci
42977db96d56Sopenharmony_ciclass TestEnumTypeSubclassing(unittest.TestCase):
42987db96d56Sopenharmony_ci    pass
42997db96d56Sopenharmony_ci
43007db96d56Sopenharmony_ciexpected_help_output_with_docs = """\
43017db96d56Sopenharmony_ciHelp on class Color in module %s:
43027db96d56Sopenharmony_ci
43037db96d56Sopenharmony_ciclass Color(enum.Enum)
43047db96d56Sopenharmony_ci |  Color(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
43057db96d56Sopenharmony_ci |\x20\x20
43067db96d56Sopenharmony_ci |  Method resolution order:
43077db96d56Sopenharmony_ci |      Color
43087db96d56Sopenharmony_ci |      enum.Enum
43097db96d56Sopenharmony_ci |      builtins.object
43107db96d56Sopenharmony_ci |\x20\x20
43117db96d56Sopenharmony_ci |  Data and other attributes defined here:
43127db96d56Sopenharmony_ci |\x20\x20
43137db96d56Sopenharmony_ci |  CYAN = <Color.CYAN: 1>
43147db96d56Sopenharmony_ci |\x20\x20
43157db96d56Sopenharmony_ci |  MAGENTA = <Color.MAGENTA: 2>
43167db96d56Sopenharmony_ci |\x20\x20
43177db96d56Sopenharmony_ci |  YELLOW = <Color.YELLOW: 3>
43187db96d56Sopenharmony_ci |\x20\x20
43197db96d56Sopenharmony_ci |  ----------------------------------------------------------------------
43207db96d56Sopenharmony_ci |  Data descriptors inherited from enum.Enum:
43217db96d56Sopenharmony_ci |\x20\x20
43227db96d56Sopenharmony_ci |  name
43237db96d56Sopenharmony_ci |      The name of the Enum member.
43247db96d56Sopenharmony_ci |\x20\x20
43257db96d56Sopenharmony_ci |  value
43267db96d56Sopenharmony_ci |      The value of the Enum member.
43277db96d56Sopenharmony_ci |\x20\x20
43287db96d56Sopenharmony_ci |  ----------------------------------------------------------------------
43297db96d56Sopenharmony_ci |  Methods inherited from enum.EnumType:
43307db96d56Sopenharmony_ci |\x20\x20
43317db96d56Sopenharmony_ci |  __contains__(member) from enum.EnumType
43327db96d56Sopenharmony_ci |      Return True if member is a member of this enum
43337db96d56Sopenharmony_ci |      raises TypeError if member is not an enum member
43347db96d56Sopenharmony_ci |\x20\x20\x20\x20\x20\x20
43357db96d56Sopenharmony_ci |      note: in 3.12 TypeError will no longer be raised, and True will also be
43367db96d56Sopenharmony_ci |      returned if member is the value of a member in this enum
43377db96d56Sopenharmony_ci |\x20\x20
43387db96d56Sopenharmony_ci |  __getitem__(name) from enum.EnumType
43397db96d56Sopenharmony_ci |      Return the member matching `name`.
43407db96d56Sopenharmony_ci |\x20\x20
43417db96d56Sopenharmony_ci |  __iter__() from enum.EnumType
43427db96d56Sopenharmony_ci |      Return members in definition order.
43437db96d56Sopenharmony_ci |\x20\x20
43447db96d56Sopenharmony_ci |  __len__() from enum.EnumType
43457db96d56Sopenharmony_ci |      Return the number of members (no aliases)
43467db96d56Sopenharmony_ci |\x20\x20
43477db96d56Sopenharmony_ci |  ----------------------------------------------------------------------
43487db96d56Sopenharmony_ci |  Readonly properties inherited from enum.EnumType:
43497db96d56Sopenharmony_ci |\x20\x20
43507db96d56Sopenharmony_ci |  __members__
43517db96d56Sopenharmony_ci |      Returns a mapping of member name->value.
43527db96d56Sopenharmony_ci |\x20\x20\x20\x20\x20\x20
43537db96d56Sopenharmony_ci |      This mapping lists all enum members, including aliases. Note that this
43547db96d56Sopenharmony_ci |      is a read-only view of the internal mapping."""
43557db96d56Sopenharmony_ci
43567db96d56Sopenharmony_ciexpected_help_output_without_docs = """\
43577db96d56Sopenharmony_ciHelp on class Color in module %s:
43587db96d56Sopenharmony_ci
43597db96d56Sopenharmony_ciclass Color(enum.Enum)
43607db96d56Sopenharmony_ci |  Color(value, names=None, *, module=None, qualname=None, type=None, start=1)
43617db96d56Sopenharmony_ci |\x20\x20
43627db96d56Sopenharmony_ci |  Method resolution order:
43637db96d56Sopenharmony_ci |      Color
43647db96d56Sopenharmony_ci |      enum.Enum
43657db96d56Sopenharmony_ci |      builtins.object
43667db96d56Sopenharmony_ci |\x20\x20
43677db96d56Sopenharmony_ci |  Data and other attributes defined here:
43687db96d56Sopenharmony_ci |\x20\x20
43697db96d56Sopenharmony_ci |  YELLOW = <Color.YELLOW: 3>
43707db96d56Sopenharmony_ci |\x20\x20
43717db96d56Sopenharmony_ci |  MAGENTA = <Color.MAGENTA: 2>
43727db96d56Sopenharmony_ci |\x20\x20
43737db96d56Sopenharmony_ci |  CYAN = <Color.CYAN: 1>
43747db96d56Sopenharmony_ci |\x20\x20
43757db96d56Sopenharmony_ci |  ----------------------------------------------------------------------
43767db96d56Sopenharmony_ci |  Data descriptors inherited from enum.Enum:
43777db96d56Sopenharmony_ci |\x20\x20
43787db96d56Sopenharmony_ci |  name
43797db96d56Sopenharmony_ci |\x20\x20
43807db96d56Sopenharmony_ci |  value
43817db96d56Sopenharmony_ci |\x20\x20
43827db96d56Sopenharmony_ci |  ----------------------------------------------------------------------
43837db96d56Sopenharmony_ci |  Data descriptors inherited from enum.EnumType:
43847db96d56Sopenharmony_ci |\x20\x20
43857db96d56Sopenharmony_ci |  __members__"""
43867db96d56Sopenharmony_ci
43877db96d56Sopenharmony_ciclass TestStdLib(unittest.TestCase):
43887db96d56Sopenharmony_ci
43897db96d56Sopenharmony_ci    maxDiff = None
43907db96d56Sopenharmony_ci
43917db96d56Sopenharmony_ci    class Color(Enum):
43927db96d56Sopenharmony_ci        CYAN = 1
43937db96d56Sopenharmony_ci        MAGENTA = 2
43947db96d56Sopenharmony_ci        YELLOW = 3
43957db96d56Sopenharmony_ci
43967db96d56Sopenharmony_ci    def test_pydoc(self):
43977db96d56Sopenharmony_ci        # indirectly test __objclass__
43987db96d56Sopenharmony_ci        if StrEnum.__doc__ is None:
43997db96d56Sopenharmony_ci            expected_text = expected_help_output_without_docs % __name__
44007db96d56Sopenharmony_ci        else:
44017db96d56Sopenharmony_ci            expected_text = expected_help_output_with_docs % __name__
44027db96d56Sopenharmony_ci        output = StringIO()
44037db96d56Sopenharmony_ci        helper = pydoc.Helper(output=output)
44047db96d56Sopenharmony_ci        helper(self.Color)
44057db96d56Sopenharmony_ci        result = output.getvalue().strip()
44067db96d56Sopenharmony_ci        self.assertEqual(result, expected_text, result)
44077db96d56Sopenharmony_ci
44087db96d56Sopenharmony_ci    def test_inspect_getmembers(self):
44097db96d56Sopenharmony_ci        values = dict((
44107db96d56Sopenharmony_ci                ('__class__', EnumType),
44117db96d56Sopenharmony_ci                ('__doc__', '...'),
44127db96d56Sopenharmony_ci                ('__members__', self.Color.__members__),
44137db96d56Sopenharmony_ci                ('__module__', __name__),
44147db96d56Sopenharmony_ci                ('YELLOW', self.Color.YELLOW),
44157db96d56Sopenharmony_ci                ('MAGENTA', self.Color.MAGENTA),
44167db96d56Sopenharmony_ci                ('CYAN', self.Color.CYAN),
44177db96d56Sopenharmony_ci                ('name', Enum.__dict__['name']),
44187db96d56Sopenharmony_ci                ('value', Enum.__dict__['value']),
44197db96d56Sopenharmony_ci                ('__len__', self.Color.__len__),
44207db96d56Sopenharmony_ci                ('__contains__', self.Color.__contains__),
44217db96d56Sopenharmony_ci                ('__name__', 'Color'),
44227db96d56Sopenharmony_ci                ('__getitem__', self.Color.__getitem__),
44237db96d56Sopenharmony_ci                ('__qualname__', 'TestStdLib.Color'),
44247db96d56Sopenharmony_ci                ('__init_subclass__', getattr(self.Color, '__init_subclass__')),
44257db96d56Sopenharmony_ci                ('__iter__', self.Color.__iter__),
44267db96d56Sopenharmony_ci                ))
44277db96d56Sopenharmony_ci        result = dict(inspect.getmembers(self.Color))
44287db96d56Sopenharmony_ci        self.assertEqual(set(values.keys()), set(result.keys()))
44297db96d56Sopenharmony_ci        failed = False
44307db96d56Sopenharmony_ci        for k in values.keys():
44317db96d56Sopenharmony_ci            if k == '__doc__':
44327db96d56Sopenharmony_ci                # __doc__ is huge, not comparing
44337db96d56Sopenharmony_ci                continue
44347db96d56Sopenharmony_ci            if result[k] != values[k]:
44357db96d56Sopenharmony_ci                print()
44367db96d56Sopenharmony_ci                print('\n%s\n     key: %s\n  result: %s\nexpected: %s\n%s\n' %
44377db96d56Sopenharmony_ci                        ('=' * 75, k, result[k], values[k], '=' * 75), sep='')
44387db96d56Sopenharmony_ci                failed = True
44397db96d56Sopenharmony_ci        if failed:
44407db96d56Sopenharmony_ci            self.fail("result does not equal expected, see print above")
44417db96d56Sopenharmony_ci
44427db96d56Sopenharmony_ci    def test_inspect_classify_class_attrs(self):
44437db96d56Sopenharmony_ci        # indirectly test __objclass__
44447db96d56Sopenharmony_ci        from inspect import Attribute
44457db96d56Sopenharmony_ci        values = [
44467db96d56Sopenharmony_ci                Attribute(name='__class__', kind='data',
44477db96d56Sopenharmony_ci                    defining_class=object, object=EnumType),
44487db96d56Sopenharmony_ci                Attribute(name='__contains__', kind='method',
44497db96d56Sopenharmony_ci                    defining_class=EnumType, object=self.Color.__contains__),
44507db96d56Sopenharmony_ci                Attribute(name='__doc__', kind='data',
44517db96d56Sopenharmony_ci                    defining_class=self.Color, object='...'),
44527db96d56Sopenharmony_ci                Attribute(name='__getitem__', kind='method',
44537db96d56Sopenharmony_ci                    defining_class=EnumType, object=self.Color.__getitem__),
44547db96d56Sopenharmony_ci                Attribute(name='__iter__', kind='method',
44557db96d56Sopenharmony_ci                    defining_class=EnumType, object=self.Color.__iter__),
44567db96d56Sopenharmony_ci                Attribute(name='__init_subclass__', kind='class method',
44577db96d56Sopenharmony_ci                    defining_class=object, object=getattr(self.Color, '__init_subclass__')),
44587db96d56Sopenharmony_ci                Attribute(name='__len__', kind='method',
44597db96d56Sopenharmony_ci                    defining_class=EnumType, object=self.Color.__len__),
44607db96d56Sopenharmony_ci                Attribute(name='__members__', kind='property',
44617db96d56Sopenharmony_ci                    defining_class=EnumType, object=EnumType.__members__),
44627db96d56Sopenharmony_ci                Attribute(name='__module__', kind='data',
44637db96d56Sopenharmony_ci                    defining_class=self.Color, object=__name__),
44647db96d56Sopenharmony_ci                Attribute(name='__name__', kind='data',
44657db96d56Sopenharmony_ci                    defining_class=self.Color, object='Color'),
44667db96d56Sopenharmony_ci                Attribute(name='__qualname__', kind='data',
44677db96d56Sopenharmony_ci                    defining_class=self.Color, object='TestStdLib.Color'),
44687db96d56Sopenharmony_ci                Attribute(name='YELLOW', kind='data',
44697db96d56Sopenharmony_ci                    defining_class=self.Color, object=self.Color.YELLOW),
44707db96d56Sopenharmony_ci                Attribute(name='MAGENTA', kind='data',
44717db96d56Sopenharmony_ci                    defining_class=self.Color, object=self.Color.MAGENTA),
44727db96d56Sopenharmony_ci                Attribute(name='CYAN', kind='data',
44737db96d56Sopenharmony_ci                    defining_class=self.Color, object=self.Color.CYAN),
44747db96d56Sopenharmony_ci                Attribute(name='name', kind='data',
44757db96d56Sopenharmony_ci                    defining_class=Enum, object=Enum.__dict__['name']),
44767db96d56Sopenharmony_ci                Attribute(name='value', kind='data',
44777db96d56Sopenharmony_ci                    defining_class=Enum, object=Enum.__dict__['value']),
44787db96d56Sopenharmony_ci                ]
44797db96d56Sopenharmony_ci        for v in values:
44807db96d56Sopenharmony_ci            try:
44817db96d56Sopenharmony_ci                v.name
44827db96d56Sopenharmony_ci            except AttributeError:
44837db96d56Sopenharmony_ci                print(v)
44847db96d56Sopenharmony_ci        values.sort(key=lambda item: item.name)
44857db96d56Sopenharmony_ci        result = list(inspect.classify_class_attrs(self.Color))
44867db96d56Sopenharmony_ci        result.sort(key=lambda item: item.name)
44877db96d56Sopenharmony_ci        self.assertEqual(
44887db96d56Sopenharmony_ci                len(values), len(result),
44897db96d56Sopenharmony_ci                "%s != %s" % ([a.name for a in values], [a.name for a in result])
44907db96d56Sopenharmony_ci                )
44917db96d56Sopenharmony_ci        failed = False
44927db96d56Sopenharmony_ci        for v, r in zip(values, result):
44937db96d56Sopenharmony_ci            if r.name in ('__init_subclass__', '__doc__'):
44947db96d56Sopenharmony_ci                # not sure how to make the __init_subclass_ Attributes match
44957db96d56Sopenharmony_ci                # so as long as there is one, call it good
44967db96d56Sopenharmony_ci                # __doc__ is too big to check exactly, so treat the same as __init_subclass__
44977db96d56Sopenharmony_ci                for name in ('name','kind','defining_class'):
44987db96d56Sopenharmony_ci                    if getattr(v, name) != getattr(r, name):
44997db96d56Sopenharmony_ci                        print('\n%s\n%s\n%s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='')
45007db96d56Sopenharmony_ci                        failed = True
45017db96d56Sopenharmony_ci            elif r != v:
45027db96d56Sopenharmony_ci                print('\n%s\n%s\n%s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='')
45037db96d56Sopenharmony_ci                failed = True
45047db96d56Sopenharmony_ci        if failed:
45057db96d56Sopenharmony_ci            self.fail("result does not equal expected, see print above")
45067db96d56Sopenharmony_ci
45077db96d56Sopenharmony_ci    def test_test_simple_enum(self):
45087db96d56Sopenharmony_ci        @_simple_enum(Enum)
45097db96d56Sopenharmony_ci        class SimpleColor:
45107db96d56Sopenharmony_ci            CYAN = 1
45117db96d56Sopenharmony_ci            MAGENTA = 2
45127db96d56Sopenharmony_ci            YELLOW = 3
45137db96d56Sopenharmony_ci            @bltns.property
45147db96d56Sopenharmony_ci            def zeroth(self):
45157db96d56Sopenharmony_ci                return 'zeroed %s' % self.name
45167db96d56Sopenharmony_ci        class CheckedColor(Enum):
45177db96d56Sopenharmony_ci            CYAN = 1
45187db96d56Sopenharmony_ci            MAGENTA = 2
45197db96d56Sopenharmony_ci            YELLOW = 3
45207db96d56Sopenharmony_ci            @bltns.property
45217db96d56Sopenharmony_ci            def zeroth(self):
45227db96d56Sopenharmony_ci                return 'zeroed %s' % self.name
45237db96d56Sopenharmony_ci        self.assertTrue(_test_simple_enum(CheckedColor, SimpleColor) is None)
45247db96d56Sopenharmony_ci        SimpleColor.MAGENTA._value_ = 9
45257db96d56Sopenharmony_ci        self.assertRaisesRegex(
45267db96d56Sopenharmony_ci                TypeError, "enum mismatch",
45277db96d56Sopenharmony_ci                _test_simple_enum, CheckedColor, SimpleColor,
45287db96d56Sopenharmony_ci                )
45297db96d56Sopenharmony_ci        class CheckedMissing(IntFlag, boundary=KEEP):
45307db96d56Sopenharmony_ci            SIXTY_FOUR = 64
45317db96d56Sopenharmony_ci            ONE_TWENTY_EIGHT = 128
45327db96d56Sopenharmony_ci            TWENTY_FORTY_EIGHT = 2048
45337db96d56Sopenharmony_ci            ALL = 2048 + 128 + 64 + 12
45347db96d56Sopenharmony_ci        CM = CheckedMissing
45357db96d56Sopenharmony_ci        self.assertEqual(list(CheckedMissing), [CM.SIXTY_FOUR, CM.ONE_TWENTY_EIGHT, CM.TWENTY_FORTY_EIGHT])
45367db96d56Sopenharmony_ci        #
45377db96d56Sopenharmony_ci        @_simple_enum(IntFlag, boundary=KEEP)
45387db96d56Sopenharmony_ci        class Missing:
45397db96d56Sopenharmony_ci            SIXTY_FOUR = 64
45407db96d56Sopenharmony_ci            ONE_TWENTY_EIGHT = 128
45417db96d56Sopenharmony_ci            TWENTY_FORTY_EIGHT = 2048
45427db96d56Sopenharmony_ci            ALL = 2048 + 128 + 64 + 12
45437db96d56Sopenharmony_ci        M = Missing
45447db96d56Sopenharmony_ci        self.assertEqual(list(CheckedMissing), [M.SIXTY_FOUR, M.ONE_TWENTY_EIGHT, M.TWENTY_FORTY_EIGHT])
45457db96d56Sopenharmony_ci        #
45467db96d56Sopenharmony_ci        _test_simple_enum(CheckedMissing, Missing)
45477db96d56Sopenharmony_ci
45487db96d56Sopenharmony_ci
45497db96d56Sopenharmony_ciclass MiscTestCase(unittest.TestCase):
45507db96d56Sopenharmony_ci
45517db96d56Sopenharmony_ci    def test__all__(self):
45527db96d56Sopenharmony_ci        support.check__all__(self, enum, not_exported={'bin', 'show_flag_values'})
45537db96d56Sopenharmony_ci
45547db96d56Sopenharmony_ci    def test_doc_1(self):
45557db96d56Sopenharmony_ci        class Single(Enum):
45567db96d56Sopenharmony_ci            ONE = 1
45577db96d56Sopenharmony_ci        self.assertEqual(Single.__doc__, None)
45587db96d56Sopenharmony_ci
45597db96d56Sopenharmony_ci    def test_doc_2(self):
45607db96d56Sopenharmony_ci        class Double(Enum):
45617db96d56Sopenharmony_ci            ONE = 1
45627db96d56Sopenharmony_ci            TWO = 2
45637db96d56Sopenharmony_ci        self.assertEqual(Double.__doc__, None)
45647db96d56Sopenharmony_ci
45657db96d56Sopenharmony_ci    def test_doc_3(self):
45667db96d56Sopenharmony_ci        class Triple(Enum):
45677db96d56Sopenharmony_ci            ONE = 1
45687db96d56Sopenharmony_ci            TWO = 2
45697db96d56Sopenharmony_ci            THREE = 3
45707db96d56Sopenharmony_ci        self.assertEqual(Triple.__doc__, None)
45717db96d56Sopenharmony_ci
45727db96d56Sopenharmony_ci    def test_doc_4(self):
45737db96d56Sopenharmony_ci        class Quadruple(Enum):
45747db96d56Sopenharmony_ci            ONE = 1
45757db96d56Sopenharmony_ci            TWO = 2
45767db96d56Sopenharmony_ci            THREE = 3
45777db96d56Sopenharmony_ci            FOUR = 4
45787db96d56Sopenharmony_ci        self.assertEqual(Quadruple.__doc__, None)
45797db96d56Sopenharmony_ci
45807db96d56Sopenharmony_ci
45817db96d56Sopenharmony_ci# These are unordered here on purpose to ensure that declaration order
45827db96d56Sopenharmony_ci# makes no difference.
45837db96d56Sopenharmony_ciCONVERT_TEST_NAME_D = 5
45847db96d56Sopenharmony_ciCONVERT_TEST_NAME_C = 5
45857db96d56Sopenharmony_ciCONVERT_TEST_NAME_B = 5
45867db96d56Sopenharmony_ciCONVERT_TEST_NAME_A = 5  # This one should sort first.
45877db96d56Sopenharmony_ciCONVERT_TEST_NAME_E = 5
45887db96d56Sopenharmony_ciCONVERT_TEST_NAME_F = 5
45897db96d56Sopenharmony_ci
45907db96d56Sopenharmony_ciCONVERT_STRING_TEST_NAME_D = 5
45917db96d56Sopenharmony_ciCONVERT_STRING_TEST_NAME_C = 5
45927db96d56Sopenharmony_ciCONVERT_STRING_TEST_NAME_B = 5
45937db96d56Sopenharmony_ciCONVERT_STRING_TEST_NAME_A = 5  # This one should sort first.
45947db96d56Sopenharmony_ciCONVERT_STRING_TEST_NAME_E = 5
45957db96d56Sopenharmony_ciCONVERT_STRING_TEST_NAME_F = 5
45967db96d56Sopenharmony_ci
45977db96d56Sopenharmony_ci# global names for StrEnum._convert_ test
45987db96d56Sopenharmony_ciCONVERT_STR_TEST_2 = 'goodbye'
45997db96d56Sopenharmony_ciCONVERT_STR_TEST_1 = 'hello'
46007db96d56Sopenharmony_ci
46017db96d56Sopenharmony_ci# We also need values that cannot be compared:
46027db96d56Sopenharmony_ciUNCOMPARABLE_A = 5
46037db96d56Sopenharmony_ciUNCOMPARABLE_C = (9, 1)  # naming order is broken on purpose
46047db96d56Sopenharmony_ciUNCOMPARABLE_B = 'value'
46057db96d56Sopenharmony_ci
46067db96d56Sopenharmony_ciCOMPLEX_C = 1j
46077db96d56Sopenharmony_ciCOMPLEX_A = 2j
46087db96d56Sopenharmony_ciCOMPLEX_B = 3j
46097db96d56Sopenharmony_ci
46107db96d56Sopenharmony_ciclass _ModuleWrapper:
46117db96d56Sopenharmony_ci    """We use this class as a namespace for swapping modules."""
46127db96d56Sopenharmony_ci    def __init__(self, module):
46137db96d56Sopenharmony_ci        self.__dict__.update(module.__dict__)
46147db96d56Sopenharmony_ci
46157db96d56Sopenharmony_ciclass TestConvert(unittest.TestCase):
46167db96d56Sopenharmony_ci    def tearDown(self):
46177db96d56Sopenharmony_ci        # Reset the module-level test variables to their original integer
46187db96d56Sopenharmony_ci        # values, otherwise the already created enum values get converted
46197db96d56Sopenharmony_ci        # instead.
46207db96d56Sopenharmony_ci        g = globals()
46217db96d56Sopenharmony_ci        for suffix in ['A', 'B', 'C', 'D', 'E', 'F']:
46227db96d56Sopenharmony_ci            g['CONVERT_TEST_NAME_%s' % suffix] = 5
46237db96d56Sopenharmony_ci            g['CONVERT_STRING_TEST_NAME_%s' % suffix] = 5
46247db96d56Sopenharmony_ci        for suffix, value in (('A', 5), ('B', (9, 1)), ('C', 'value')):
46257db96d56Sopenharmony_ci            g['UNCOMPARABLE_%s' % suffix] = value
46267db96d56Sopenharmony_ci        for suffix, value in (('A', 2j), ('B', 3j), ('C', 1j)):
46277db96d56Sopenharmony_ci            g['COMPLEX_%s' % suffix] = value
46287db96d56Sopenharmony_ci        for suffix, value in (('1', 'hello'), ('2', 'goodbye')):
46297db96d56Sopenharmony_ci            g['CONVERT_STR_TEST_%s' % suffix] = value
46307db96d56Sopenharmony_ci
46317db96d56Sopenharmony_ci    def test_convert_value_lookup_priority(self):
46327db96d56Sopenharmony_ci        test_type = enum.IntEnum._convert_(
46337db96d56Sopenharmony_ci                'UnittestConvert',
46347db96d56Sopenharmony_ci                MODULE,
46357db96d56Sopenharmony_ci                filter=lambda x: x.startswith('CONVERT_TEST_'))
46367db96d56Sopenharmony_ci        # We don't want the reverse lookup value to vary when there are
46377db96d56Sopenharmony_ci        # multiple possible names for a given value.  It should always
46387db96d56Sopenharmony_ci        # report the first lexigraphical name in that case.
46397db96d56Sopenharmony_ci        self.assertEqual(test_type(5).name, 'CONVERT_TEST_NAME_A')
46407db96d56Sopenharmony_ci
46417db96d56Sopenharmony_ci    def test_convert_int(self):
46427db96d56Sopenharmony_ci        test_type = enum.IntEnum._convert_(
46437db96d56Sopenharmony_ci                'UnittestConvert',
46447db96d56Sopenharmony_ci                MODULE,
46457db96d56Sopenharmony_ci                filter=lambda x: x.startswith('CONVERT_TEST_'))
46467db96d56Sopenharmony_ci        # Ensure that test_type has all of the desired names and values.
46477db96d56Sopenharmony_ci        self.assertEqual(test_type.CONVERT_TEST_NAME_F,
46487db96d56Sopenharmony_ci                         test_type.CONVERT_TEST_NAME_A)
46497db96d56Sopenharmony_ci        self.assertEqual(test_type.CONVERT_TEST_NAME_B, 5)
46507db96d56Sopenharmony_ci        self.assertEqual(test_type.CONVERT_TEST_NAME_C, 5)
46517db96d56Sopenharmony_ci        self.assertEqual(test_type.CONVERT_TEST_NAME_D, 5)
46527db96d56Sopenharmony_ci        self.assertEqual(test_type.CONVERT_TEST_NAME_E, 5)
46537db96d56Sopenharmony_ci        # Ensure that test_type only picked up names matching the filter.
46547db96d56Sopenharmony_ci        int_dir = dir(int) + [
46557db96d56Sopenharmony_ci                'CONVERT_TEST_NAME_A', 'CONVERT_TEST_NAME_B', 'CONVERT_TEST_NAME_C',
46567db96d56Sopenharmony_ci                'CONVERT_TEST_NAME_D', 'CONVERT_TEST_NAME_E', 'CONVERT_TEST_NAME_F',
46577db96d56Sopenharmony_ci                'CONVERT_TEST_SIGABRT', 'CONVERT_TEST_SIGIOT',
46587db96d56Sopenharmony_ci                'CONVERT_TEST_EIO', 'CONVERT_TEST_EBUS',
46597db96d56Sopenharmony_ci                ]
46607db96d56Sopenharmony_ci        extra = [name for name in dir(test_type) if name not in enum_dir(test_type)]
46617db96d56Sopenharmony_ci        missing = [name for name in enum_dir(test_type) if name not in dir(test_type)]
46627db96d56Sopenharmony_ci        self.assertEqual(
46637db96d56Sopenharmony_ci                extra + missing,
46647db96d56Sopenharmony_ci                [],
46657db96d56Sopenharmony_ci                msg='extra names: %r;  missing names: %r' % (extra, missing),
46667db96d56Sopenharmony_ci                )
46677db96d56Sopenharmony_ci
46687db96d56Sopenharmony_ci
46697db96d56Sopenharmony_ci    def test_convert_uncomparable(self):
46707db96d56Sopenharmony_ci        uncomp = enum.Enum._convert_(
46717db96d56Sopenharmony_ci                'Uncomparable',
46727db96d56Sopenharmony_ci                MODULE,
46737db96d56Sopenharmony_ci                filter=lambda x: x.startswith('UNCOMPARABLE_'))
46747db96d56Sopenharmony_ci        # Should be ordered by `name` only:
46757db96d56Sopenharmony_ci        self.assertEqual(
46767db96d56Sopenharmony_ci            list(uncomp),
46777db96d56Sopenharmony_ci            [uncomp.UNCOMPARABLE_A, uncomp.UNCOMPARABLE_B, uncomp.UNCOMPARABLE_C],
46787db96d56Sopenharmony_ci            )
46797db96d56Sopenharmony_ci
46807db96d56Sopenharmony_ci    def test_convert_complex(self):
46817db96d56Sopenharmony_ci        uncomp = enum.Enum._convert_(
46827db96d56Sopenharmony_ci            'Uncomparable',
46837db96d56Sopenharmony_ci            MODULE,
46847db96d56Sopenharmony_ci            filter=lambda x: x.startswith('COMPLEX_'))
46857db96d56Sopenharmony_ci        # Should be ordered by `name` only:
46867db96d56Sopenharmony_ci        self.assertEqual(
46877db96d56Sopenharmony_ci            list(uncomp),
46887db96d56Sopenharmony_ci            [uncomp.COMPLEX_A, uncomp.COMPLEX_B, uncomp.COMPLEX_C],
46897db96d56Sopenharmony_ci            )
46907db96d56Sopenharmony_ci
46917db96d56Sopenharmony_ci    def test_convert_str(self):
46927db96d56Sopenharmony_ci        test_type = enum.StrEnum._convert_(
46937db96d56Sopenharmony_ci                'UnittestConvert',
46947db96d56Sopenharmony_ci                MODULE,
46957db96d56Sopenharmony_ci                filter=lambda x: x.startswith('CONVERT_STR_'),
46967db96d56Sopenharmony_ci                as_global=True)
46977db96d56Sopenharmony_ci        # Ensure that test_type has all of the desired names and values.
46987db96d56Sopenharmony_ci        self.assertEqual(test_type.CONVERT_STR_TEST_1, 'hello')
46997db96d56Sopenharmony_ci        self.assertEqual(test_type.CONVERT_STR_TEST_2, 'goodbye')
47007db96d56Sopenharmony_ci        # Ensure that test_type only picked up names matching the filter.
47017db96d56Sopenharmony_ci        str_dir = dir(str) + ['CONVERT_STR_TEST_1', 'CONVERT_STR_TEST_2']
47027db96d56Sopenharmony_ci        extra = [name for name in dir(test_type) if name not in enum_dir(test_type)]
47037db96d56Sopenharmony_ci        missing = [name for name in enum_dir(test_type) if name not in dir(test_type)]
47047db96d56Sopenharmony_ci        self.assertEqual(
47057db96d56Sopenharmony_ci                extra + missing,
47067db96d56Sopenharmony_ci                [],
47077db96d56Sopenharmony_ci                msg='extra names: %r;  missing names: %r' % (extra, missing),
47087db96d56Sopenharmony_ci                )
47097db96d56Sopenharmony_ci        self.assertEqual(repr(test_type.CONVERT_STR_TEST_1), '%s.CONVERT_STR_TEST_1' % SHORT_MODULE)
47107db96d56Sopenharmony_ci        self.assertEqual(str(test_type.CONVERT_STR_TEST_2), 'goodbye')
47117db96d56Sopenharmony_ci        self.assertEqual(format(test_type.CONVERT_STR_TEST_1), 'hello')
47127db96d56Sopenharmony_ci
47137db96d56Sopenharmony_ci    def test_convert_raise(self):
47147db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
47157db96d56Sopenharmony_ci            enum.IntEnum._convert(
47167db96d56Sopenharmony_ci                'UnittestConvert',
47177db96d56Sopenharmony_ci                MODULE,
47187db96d56Sopenharmony_ci                filter=lambda x: x.startswith('CONVERT_TEST_'))
47197db96d56Sopenharmony_ci
47207db96d56Sopenharmony_ci    def test_convert_repr_and_str(self):
47217db96d56Sopenharmony_ci        test_type = enum.IntEnum._convert_(
47227db96d56Sopenharmony_ci                'UnittestConvert',
47237db96d56Sopenharmony_ci                MODULE,
47247db96d56Sopenharmony_ci                filter=lambda x: x.startswith('CONVERT_STRING_TEST_'),
47257db96d56Sopenharmony_ci                as_global=True)
47267db96d56Sopenharmony_ci        self.assertEqual(repr(test_type.CONVERT_STRING_TEST_NAME_A), '%s.CONVERT_STRING_TEST_NAME_A' % SHORT_MODULE)
47277db96d56Sopenharmony_ci        self.assertEqual(str(test_type.CONVERT_STRING_TEST_NAME_A), '5')
47287db96d56Sopenharmony_ci        self.assertEqual(format(test_type.CONVERT_STRING_TEST_NAME_A), '5')
47297db96d56Sopenharmony_ci
47307db96d56Sopenharmony_ci
47317db96d56Sopenharmony_ci# helpers
47327db96d56Sopenharmony_ci
47337db96d56Sopenharmony_cidef enum_dir(cls):
47347db96d56Sopenharmony_ci    interesting = set([
47357db96d56Sopenharmony_ci            '__class__', '__contains__', '__doc__', '__getitem__',
47367db96d56Sopenharmony_ci            '__iter__', '__len__', '__members__', '__module__',
47377db96d56Sopenharmony_ci            '__name__', '__qualname__',
47387db96d56Sopenharmony_ci            ]
47397db96d56Sopenharmony_ci            + cls._member_names_
47407db96d56Sopenharmony_ci            )
47417db96d56Sopenharmony_ci    if cls._new_member_ is not object.__new__:
47427db96d56Sopenharmony_ci        interesting.add('__new__')
47437db96d56Sopenharmony_ci    if cls.__init_subclass__ is not object.__init_subclass__:
47447db96d56Sopenharmony_ci        interesting.add('__init_subclass__')
47457db96d56Sopenharmony_ci    if cls._member_type_ is object:
47467db96d56Sopenharmony_ci        return sorted(interesting)
47477db96d56Sopenharmony_ci    else:
47487db96d56Sopenharmony_ci        # return whatever mixed-in data type has
47497db96d56Sopenharmony_ci        return sorted(set(dir(cls._member_type_)) | interesting)
47507db96d56Sopenharmony_ci
47517db96d56Sopenharmony_cidef member_dir(member):
47527db96d56Sopenharmony_ci    if member.__class__._member_type_ is object:
47537db96d56Sopenharmony_ci        allowed = set(['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'value'])
47547db96d56Sopenharmony_ci    else:
47557db96d56Sopenharmony_ci        allowed = set(dir(member))
47567db96d56Sopenharmony_ci    for cls in member.__class__.mro():
47577db96d56Sopenharmony_ci        for name, obj in cls.__dict__.items():
47587db96d56Sopenharmony_ci            if name[0] == '_':
47597db96d56Sopenharmony_ci                continue
47607db96d56Sopenharmony_ci            if isinstance(obj, enum.property):
47617db96d56Sopenharmony_ci                if obj.fget is not None or name not in member._member_map_:
47627db96d56Sopenharmony_ci                    allowed.add(name)
47637db96d56Sopenharmony_ci                else:
47647db96d56Sopenharmony_ci                    allowed.discard(name)
47657db96d56Sopenharmony_ci            else:
47667db96d56Sopenharmony_ci                allowed.add(name)
47677db96d56Sopenharmony_ci    return sorted(allowed)
47687db96d56Sopenharmony_ci
47697db96d56Sopenharmony_cimissing = object()
47707db96d56Sopenharmony_ci
47717db96d56Sopenharmony_ci
47727db96d56Sopenharmony_ciif __name__ == '__main__':
47737db96d56Sopenharmony_ci    unittest.main()
4774