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