diff options
author | ThereforeGames <95403634+ThereforeGames@users.noreply.github.com> | 2022-12-11 23:06:22 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-11 23:06:22 +0000 |
commit | 9170224d230fb22387e955d0b40ceda116f688b6 (patch) | |
tree | bc8ce7cce49f40b433e90a0fe790eda1b70389f4 /venv/Lib/site-packages/aenum/test.py | |
parent | 2e8b5418e3cd4e9212f2fcdb36305d7a40f97916 (diff) | |
download | stable-diffusion-webui-gfx803-9170224d230fb22387e955d0b40ceda116f688b6.tar.gz stable-diffusion-webui-gfx803-9170224d230fb22387e955d0b40ceda116f688b6.tar.bz2 stable-diffusion-webui-gfx803-9170224d230fb22387e955d0b40ceda116f688b6.zip |
Delete venv/Lib/site-packages directory
Diffstat (limited to 'venv/Lib/site-packages/aenum/test.py')
-rw-r--r-- | venv/Lib/site-packages/aenum/test.py | 6832 |
1 files changed, 0 insertions, 6832 deletions
diff --git a/venv/Lib/site-packages/aenum/test.py b/venv/Lib/site-packages/aenum/test.py deleted file mode 100644 index 224293cb..00000000 --- a/venv/Lib/site-packages/aenum/test.py +++ /dev/null @@ -1,6832 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import division, print_function -import sys -import aenum -import doctest -import os -import shutil -import tempfile -import textwrap -import unittest -import uuid -import warnings -from aenum import EnumType, EnumMeta, Enum, IntEnum, StrEnum, LowerStrEnum, UpperStrEnum -from aenum import AutoNumberEnum, MultiValueEnum, OrderedEnum, UniqueEnum, AddValueEnum, Flag, IntFlag -from aenum import NamedTuple, TupleSize, NamedConstant, constant, NoAlias, AddValue, Unique -from aenum import STRICT, CONFORM, EJECT, KEEP -from aenum import _reduce_ex_by_name, unique, skip, extend_enum, auto, enum, MultiValue, member, nonmember, no_arg -from aenum import basestring, baseinteger, unicode, enum_property -from aenum import pyver, PY2, PY3, PY2_6, PY3_3, PY3_4, PY3_5, PY3_6, PY3_11 -from collections import OrderedDict -from datetime import timedelta -from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL -from operator import or_ as _or_, and_ as _and_, xor as _xor_, inv as _inv_ -from operator import abs as _abs_, add as _add_, floordiv as _floordiv_ -from operator import lshift as _lshift_, rshift as _rshift_, mod as _mod_ -from operator import mul as _mul_, neg as _neg_, pos as _pos_, pow as _pow_ -from operator import truediv as _truediv_, sub as _sub_ -if PY2: - from operator import div as _div_ -try: - import threading -except ImportError: - threading = None - -try: - any -except NameError: - from aenum import any - -MODULE = __name__ -SHORT_MODULE = MODULE.split('.')[-1] - -def load_tests(loader, tests, ignore): - tests.addTests(doctest.DocTestSuite(aenum)) - tests.addTests(doctest.DocFileSuite( - 'doc/aenum.rst', - package=aenum, - optionflags=doctest.ELLIPSIS|doctest.NORMALIZE_WHITESPACE, - )) - return tests - -class TestCase(unittest.TestCase): - - def __init__(self, *args, **kwds): - regex = getattr(self, 'assertRaisesRegex', None) - if regex is None: - self.assertRaisesRegex = getattr(self, 'assertRaisesRegexp') - super(TestCase, self).__init__(*args, **kwds) - - -# for pickle tests -try: - class Stooges(Enum): - LARRY = 1 - CURLY = 2 - MOE = 3 -except Exception: - Stooges = sys.exc_info()[1] - -try: - class IntStooges(int, Enum): - LARRY = 1 - CURLY = 2 - MOE = 3 -except Exception: - IntStooges = sys.exc_info()[1] - -try: - class FloatStooges(float, Enum): - LARRY = 1.39 - CURLY = 2.72 - MOE = 3.142596 -except Exception: - FloatStooges = sys.exc_info()[1] - -try: - class FlagStooges(Flag): - LARRY = 1 - CURLY = 2 - MOE = 3 -except Exception as exc: - FlagStooges = exc - -try: - LifeForm = NamedTuple('LifeForm', 'branch genus species', module=__name__) -except Exception: - LifeForm = sys.exc_info()[1] - -try: - class DeathForm(NamedTuple): - color = 0 - rigidity = 1 - odor = 2 -except Exception: - DeathForm = sys.exc_info()[1] - -# for pickle test and subclass tests -try: - class Name(StrEnum): - BDFL = 'Guido van Rossum' - FLUFL = 'Barry Warsaw' -except Exception: - Name = sys.exc_info()[1] - -try: - Question = Enum('Question', 'who what when where why', module=__name__) -except Exception: - Question = sys.exc_info()[1] - -try: - Answer = Enum('Answer', 'him this then there because') -except Exception: - Answer = sys.exc_info()[1] - -try: - class WhatsIt(NamedTuple): - def what(self): - return self[0] - class ThatsIt(WhatsIt): - blah = 0 - bleh = 1 -except Exception: - ThatsIt = sys.exc_info()[1] - -# for doctests -try: - class Fruit(Enum): - tomato = 1 - banana = 2 - cherry = 3 -except Exception: - pass - -def test_pickle_dump_load(assertion, source, target=None, protocol=(0, HIGHEST_PROTOCOL)): - start, stop = protocol - failures = [] - for protocol in range(start, stop+1): - try: - if target is None: - assertion(loads(dumps(source, protocol=protocol)), source) - else: - assertion(loads(dumps(source, protocol=protocol)), target) - except Exception: - exc, tb = sys.exc_info()[1:] - failures.append('%2d: %s' %(protocol, exc)) - if failures: - raise ValueError('Failed with protocols: %s' % ', '.join(failures)) - -def test_pickle_exception(assertion, exception, obj, - protocol=(0, HIGHEST_PROTOCOL)): - start, stop = protocol - failures = [] - for protocol in range(start, stop+1): - try: - assertion(exception, dumps, obj, protocol=protocol) - except Exception: - exc = sys.exc_info()[1] - failures.append('%d: %s %s' % (protocol, exc.__class__.__name__, exc)) - if failures: - raise ValueError('Failed with protocols: %s' % ', '.join(failures)) - -if PY3: - from aenum.test_v3 import TestEnumV3, TestOrderV3, TestNamedTupleV3, TestStackoverflowAnswersV3, TestIssuesV3, TestExtendEnumV3 - from aenum import test_v3 - test_v3.IntStooges = IntStooges - test_v3.test_pickle_exception = test_pickle_exception - test_v3.test_pickle_dump_load = test_pickle_dump_load - -# for subclassing tests - -class classproperty(object): - - def __init__(self, fget=None, fset=None, fdel=None, doc=None): - self.fget = fget - self.fset = fset - self.fdel = fdel - if doc is None and fget is not None: - doc = fget.__doc__ - self.__doc__ = doc - - def __get__(self, instance, ownerclass): - return self.fget(ownerclass) - - -# tests -class TestOrder(TestCase): - """ - Test _order_ extra/missing members. - """ - - def test_same_members(self): - class Color(Enum): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 3 - - def test_same_members_with_aliases(self): - class Color(Enum): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 3 - verde = green - - def test_order_has_extra_members(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Enum): - _order_ = 'red green blue purple' - red = 1 - green = 2 - blue = 3 - - def test_order_has_extra_members_with_aliases(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Enum): - _order_ = 'red green blue purple' - red = 1 - green = 2 - blue = 3 - verde = green - - def test_enum_has_extra_members(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Enum): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 3 - purple = 4 - - def test_enum_has_extra_members_with_aliases(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Enum): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 3 - purple = 4 - verde = green - - def test_same_members_flag(self): - class Color(Flag): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 4 - - def test_same_members_with_aliases_flag(self): - class Color(Flag): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 4 - verde = green - - def test_order_has_extra_members_flag(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Flag): - _order_ = 'red green blue purple' - red = 1 - green = 2 - blue = 4 - - def test_order_has_extra_members_with_aliases_flag(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Flag): - _order_ = 'red green blue purple' - red = 1 - green = 2 - blue = 4 - verde = green - - def test_enum_has_extra_members_flag(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Flag): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 4 - purple = 8 - - def test_enum_has_extra_members_with_aliases_flag(self): - with self.assertRaisesRegex(TypeError, r'member order does not match _order_'): - class Color(Flag): - _order_ = 'red green blue' - red = 1 - green = 2 - blue = 4 - purple = 8 - verde = green - - -class TestAutoValue(TestCase): - - def test_bare(self): - # - class BareEnum(Enum): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(BareEnum.THREE.value, 3) - # - class BareIntEnum(IntEnum): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(BareIntEnum.THREE, 3) - # - class BareFlag(Flag): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(BareFlag.THREE.value, 4) - # - class BareIntFlag(IntFlag): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(BareIntFlag.THREE, 4) - - def test_init_only_final(self): - # - class InitEnumValue(Enum): - _init_ = 'value description' - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitEnumValue.THREE.value, 3) - self.assertEqual(InitEnumValue.THREE.description, 'a triangle') - # - class InitEnum(Enum): - _init_ = 'value description' - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitEnum.THREE.value, 3) - self.assertEqual(InitEnum.THREE.description, 'a triangle') - # - class InitIntEnum(IntEnum): - _init_ = 'value description' - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitIntEnum.THREE, 3) - self.assertEqual(InitIntEnum.THREE.description, 'a triangle') - # - class InitFlag(Flag): - _init_ = 'value description' - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitFlag.THREE.value, 4) - self.assertEqual(InitFlag.THREE.description, 'a triangle') - # - class InitIntFlag(IntFlag): - _init_ = 'value description' - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitIntFlag.THREE, 4) - self.assertEqual(InitIntFlag.THREE.description, 'a triangle') - - def test_init_only_inherit(self): - # - class InitInheritEnum(Enum): - _init_ = 'value description' - # - class InitEnum(InitInheritEnum): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitEnum.THREE.value, 3) - self.assertEqual(InitEnum.THREE.description, 'a triangle') - # - # - class InitInheritValueEnum(Enum): - _init_ = 'value description' - # - class InitEnum(InitInheritValueEnum): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitEnum.THREE.value, 3) - self.assertEqual(InitEnum.THREE.description, 'a triangle') - # - class InitIntEnum(int, InitInheritValueEnum): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitIntEnum.THREE, 3) - self.assertEqual(InitIntEnum.THREE.description, 'a triangle') - # - class InitInheritValueFlag(Flag): - _init_ = 'value description' - # - class InitFlag(InitInheritValueFlag): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitFlag.THREE.value, 4) - self.assertEqual(InitFlag.THREE.description, 'a triangle') - # - class InitIntFlag(int, InitInheritValueFlag): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitIntFlag.THREE, 4) - self.assertEqual(InitIntFlag.THREE.description, 'a triangle') - - def test_new_only_final(self): - # - class NewFinalEnum(Enum): - _order_ = 'ONE TWO THREE' - def __new__(cls, value): - member = object.__new__(cls) - member._value_ = value - member.proof = 'NFE1' - return member - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalEnum.THREE.value, 3) - self.assertEqual(NewFinalEnum.TWO.proof, 'NFE1') - # - class NewFinalIntEnum(IntEnum): - _order_ = 'ONE TWO THREE' - def __new__(cls, value): - member = int.__new__(cls, value) - member._value_ = value - member.proof = 'NFE2' - return member - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalIntEnum.THREE, 3) - self.assertEqual(NewFinalIntEnum.TWO.proof, 'NFE2') - # - class NewFinalFlag(Flag): - _order_ = 'ONE TWO THREE' - def __new__(cls, value): - member = object.__new__(cls) - member._value_ = value - member.proof = 'NFE3' - return member - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalFlag.THREE.value, 4) - self.assertEqual(NewFinalFlag.TWO.proof, 'NFE3') - # - class NewFinalIntFlag(IntFlag): - _order_ = 'ONE TWO THREE' - def __new__(cls, value): - member = int.__new__(cls, value) - member._value_ = value - member.proof = 'NFE4' - return member - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalIntFlag.THREE, 4) - self.assertEqual(NewFinalIntFlag.TWO.proof, 'NFE4') - # - class NewFinalStrEnum(str, Enum): - # - _order_ = "AllReset Bright FG_Cyan BG_Black" - # - def __new__(cls, value, code, description): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - obj.description = description - return obj - # - __str__ = str.__str__ - # - AllReset = '0', 'reset all (colors and brightness)' - Bright = '1', 'bright lights!' - FG_Cyan = '36', 'cyan' - BG_Black = '40', 'black' - self.assertEqual(NewFinalStrEnum.FG_Cyan.value, 3) - self.assertEqual(NewFinalStrEnum.BG_Black.value, 4) - self.assertEqual(NewFinalStrEnum.AllReset.code, '0') - self.assertEqual(NewFinalStrEnum.Bright.description, 'bright lights!') - # - class NewFinalStrFlag(str, Flag): - # - _order_ = "AllReset Bright FG_Cyan BG_Black" - # - def __new__(cls, value, code, description): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - obj.description = description - return obj - # - __str__ = str.__str__ - # - AllReset = '0', 'reset all (colors and brightness)' - Bright = '1', 'bright lights!' - FG_Cyan = '36', 'cyan' - BG_Black = '40', 'black' - self.assertEqual(NewFinalStrFlag.FG_Cyan.value, 4) - self.assertEqual(NewFinalStrFlag.BG_Black.value, 8) - self.assertEqual(NewFinalStrFlag.AllReset.code, '0') - self.assertEqual(NewFinalStrFlag.Bright.description, 'bright lights!') - - def test_new_only_inherited(self): - # - class NewInheritEnum(Enum): - def __new__(cls, value): - if cls._member_type_ is int: - member = int.__new__(cls, value*2) - else: - member = object.__new__(cls) - member._value_ = value * 2 - member.proof = 'NIE' - return member - # - class NewFinalEnum(NewInheritEnum): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalEnum.THREE.value, 6) - self.assertEqual(NewFinalEnum.TWO.proof, 'NIE') - # - class NewFinalIntEnum(int, NewInheritEnum): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalIntEnum.THREE, 6) - self.assertEqual(NewFinalIntEnum.TWO.proof, 'NIE') - # - class NewInheritFlag(Flag): - def __new__(cls, value): - if cls._member_type_ is int: - member = int.__new__(cls, value*2) - else: - member = object.__new__(cls) - member._value_ = value * 2 - member.proof = 'NIE' - return member - # - class NewFinalFlag(NewInheritFlag): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalFlag.THREE.value, 8) - self.assertEqual(NewFinalFlag.TWO.proof, 'NIE') - # - class NewFinalIntFlag(int, NewInheritFlag): - _order_ = 'ONE TWO THREE' - ONE = auto() - TWO = auto() - THREE = auto() - self.assertEqual(NewFinalIntFlag.THREE, 8) - self.assertEqual(NewFinalIntFlag.TWO.proof, 'NIE') - - def test_init_new_only(self): - # - class InitNewEnum(Enum): - _init_ = "value description" - _order_ = 'ONE TWO THREE' - def __new__(cls, value, *args): - member = object.__new__(cls) - member._value_ = value - member.proof = 'INE1' - return member - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewEnum.THREE.value, 3) - self.assertEqual(InitNewEnum.THREE.description, 'a triangle') - self.assertEqual(InitNewEnum.TWO.proof, 'INE1') - # - class InitNewIntEnum(IntEnum): - _init_ = "value description" - _order_ = 'ONE TWO THREE' - def __new__(cls, value, *args): - member = int.__new__(cls, value) - member._value_ = value - member.proof = 'INE2' - return member - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewIntEnum.THREE, 3) - self.assertEqual(InitNewIntEnum.THREE.description, 'a triangle') - self.assertEqual(InitNewIntEnum.TWO.proof, 'INE2') - # - class InitNewFlag(Flag): - _init_ = "value description" - _order_ = 'ONE TWO THREE' - def __new__(cls, value, *args): - member = object.__new__(cls) - member._value_ = value - member.proof = 'INE3' - return member - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewFlag.THREE.value, 4) - self.assertEqual(InitNewFlag.THREE.description, 'a triangle') - self.assertEqual(InitNewFlag.TWO.proof, 'INE3') - # - class InitNewIntFlag(IntFlag): - _init_ = "value description" - _order_ = 'ONE TWO THREE' - def __new__(cls, value, *args): - member = int.__new__(cls, value) - member._value_ = value - member.proof = 'INE4' - return member - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewIntFlag.THREE, 4) - self.assertEqual(InitNewIntFlag.THREE.description, 'a triangle') - self.assertEqual(InitNewIntFlag.TWO.proof, 'INE4') - - def test_init_new_inherit(self): - # - class InitNew(Enum): - _init_ = "value description" - def __new__(cls, value, *args): - member = object.__new__(cls) - member._value_ = value - member.proof = 'IN' - return member - # - class InitNewEnum(InitNew): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewEnum.THREE.value, 3) - self.assertEqual(InitNewEnum.THREE.description, 'a triangle') - self.assertEqual(InitNewEnum.TWO.proof, 'IN') - # - class InitNewInt(Enum): - _init_ = "value description" - def __new__(cls, value, *args): - member = int.__new__(cls, value) - member._value_ = value - member.proof = 'IN' - return member - # - class InitNewIntEnum(int, InitNewInt): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewIntEnum.THREE, 3) - self.assertEqual(InitNewIntEnum.THREE.description, 'a triangle') - self.assertEqual(InitNewIntEnum.TWO.proof, 'IN') - # - class InitNewFlagBase(Flag): - _init_ = "value description" - def __new__(cls, value, *args): - member = object.__new__(cls) - member._value_ = value - member.proof = 'IN' - return member - # - class InitNewFlag(InitNewFlagBase): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewFlag.THREE.value, 4) - self.assertEqual(InitNewFlag.THREE.description, 'a triangle') - self.assertEqual(InitNewFlag.TWO.proof, 'IN') - # - class InitNewIntFlagBase(int, Flag): - _init_ = "value description" - def __new__(cls, value, *args): - member = int.__new__(cls, value) - member._value_ = value - member.proof = 'IN' - return member - # - class InitNewIntFlag(InitNewIntFlagBase): - _order_ = 'ONE TWO THREE' - ONE = 'the loneliest number' - TWO = 'the number with you' - THREE = 'a triangle' - self.assertEqual(InitNewIntFlag.THREE, 4) - self.assertEqual(InitNewIntFlag.THREE.description, 'a triangle') - self.assertEqual(InitNewIntFlag.TWO.proof, 'IN') - - -class TestHelpers(TestCase): - # _is_descriptor, _is_sunder, _is_dunder - - def test_is_descriptor(self): - class foo: - pass - for attr in ('__get__','__set__','__delete__'): - obj = foo() - self.assertFalse(aenum._is_descriptor(obj)) - setattr(obj, attr, 1) - self.assertTrue(aenum._is_descriptor(obj)) - - def test_is_sunder(self): - for s in ('_a_', '_aa_'): - self.assertTrue(aenum._is_sunder(s)) - - for s in ('a', 'a_', '_a', '__a', 'a__', '__a__', '_a__', '__a_', '_', - '__', '___', '____', '_____',): - self.assertFalse(aenum._is_sunder(s)) - - def test_is_dunder(self): - for s in ('__a__', '__aa__'): - self.assertTrue(aenum._is_dunder(s)) - for s in ('a', 'a_', '_a', '__a', 'a__', '_a_', '_a__', '__a_', '_', - '__', '___', '____', '_____',): - self.assertFalse(aenum._is_dunder(s)) - - def test_auto(self): - def tester(first, op, final, second=None): - if second is None: - left = auto() - value = op(left) - left.value = first - self.assertEqual(value.value, final, - "%s %r -> %r != %r" % (op.__name__, first, value, final)) - else: - left = first - right = auto() - value = op(left, right) - right.value = second - self.assertEqual(value.value, final, - "forward: %r %s %r -> %r != %r" % (first, op.__name__, second, value.value, final)) - left = auto() - right = second - value = op(left, right) - left.value = first - self.assertEqual(value.value, final, - "reversed: %r %s %r -> %r != %r" % (second, op.__name__, first, value.value, final)) - for args in ( - (1, _abs_, abs(1)), - (-3, _abs_, abs(-3)), - (1, _add_, 1+2, 2), - (25, _floordiv_, 25 // 5, 5), - (49, _truediv_, 49 / 9, 9), - (6, _mod_, 6 % 9, 9), - (5, _lshift_, 5 << 2, 2), - (5, _rshift_, 5 >> 2, 2), - (3, _mul_, 3 * 6, 6), - (5, _neg_, -5), - (-4, _pos_, +(-4)), - (2, _pow_, 2**5, 5), - (7, _sub_, 7 - 10, 10), - (1, _or_, 1 | 2, 2), - (3, _xor_, 3 ^ 6, 6), - (3, _and_, 3 & 6, 6), - (7, _inv_, ~7), - ('a', _add_, 'a'+'b', 'b'), - ('a', _mul_, 'a' * 3, 3), - ): - tester(*args) - # operator.div is gone in 3 - if PY2: - tester(12, _div_, 12 // 5, 5) - # strings are a pain - left = auto() - right = 'eggs' - value = _mod_(left, right) - left.value = 'I see 17 %s!' - self.assertEqual(value.value, 'I see 17 %s!' % 'eggs') - - def test_constant(self): - errors = [] - def tester(first, op, final, second=None): - if second is None: - primary = constant(first) - secondary = constant(op(primary)) - if secondary.value != final: - errors.append( - "%s %r -> %r != %r" % (op.__name__, first, secondary.value, final), - ) - else: - left = constant(first) - right = second - value = op(left, right) - if value != final: - errors.append( - "forward: %r %s %r -> %r != %r" % (first, op.__name__, second, value, final), - ) - left = first - right = constant(second) - value = op(left, right) - if value != final: - errors.append( - "reversed: %r %s %r -> %r != %r" % (second, op.__name__, first, value, final), - ) - for args in ( - (1, _abs_, abs(1)), - (-3, _abs_, abs(-3)), - (1, _add_, 1+2, 2), - (25, _floordiv_, 25 // 5, 5), - (49, _truediv_, 49 / 9, 9), - (6, _mod_, 6 % 9, 9), - (5, _lshift_, 5 << 2, 2), - (5, _rshift_, 5 >> 2, 2), - (3, _mul_, 3 * 6, 6), - (5, _neg_, -5), - (-4, _pos_, +(-4)), - (2, _pow_, 2**5, 5), - (7, _sub_, 7 - 10, 10), - (1, _or_, 1 | 2, 2), - (3, _xor_, 3 ^ 6, 6), - (3, _and_, 3 & 6, 6), - (7, _inv_, ~7), - ('a', _add_, 'a'+'b', 'b'), - ('a', _mul_, 'a' * 3, 3), - ): - tester(*args) - # operator.div is gone in 3 - if PY2: - tester(12, _div_, 12 // 5, 5) - # strings are a pain - left = constant('I see 17 %s!') - right = 'eggs' - value = _mod_(left, right) - if value != 'I see 17 %s!' % 'eggs': - errors.append("'I see 17 eggs!' != %r" % value) - if errors: - print() - for error in errors: - print(error) - self.assertTrue(False) - - -class TestEnumType(TestCase): - - def test_immutability(self): - class Hah(object): - @classproperty - def all_values(cls): - return [m.value for m in cls] - class Huh(Hah, Enum): - one = 1 - two = 2 - self.assertRaisesRegex(AttributeError, 'cannot rebind property', setattr, Huh, 'value', 'boom') - self.assertRaisesRegex(AttributeError, 'cannot delete property', delattr, Huh, 'value') - self.assertRaisesRegex(AttributeError, 'cannot set attribute', setattr, Huh.one, 'value', 'boom') - self.assertRaisesRegex(AttributeError, 'cannot delete attribute', delattr, Huh.two, 'value') - self.assertEqual(Huh.one.value, 1) - self.assertEqual(Huh.two.value, 2) - self.assertEqual(Huh.all_values, [1, 2]) - setattr(Huh, 'all_values', 99) - self.assertEqual(Huh.all_values, 99) - - def test_enum_shadow_base(self): - class hohum(object): - def cyan(self): - "cyanize a color" - return self.value * 'cyan' - @property - def azure(self): - return 'azure ' + self.name - class Color(hohum, Enum): - red = 1 - green = 2 - blue = 3 - cyan = 4 - azure = 5 - self.assertEqual(len(Color), 5) - self.assertEqual(list(Color), [Color.red, Color.green, Color.blue, Color.cyan, Color.azure]) - self.assertRaisesRegex(AttributeError, 'no attribute .cyan.', lambda: Color.blue.cyan) - self.assertEqual(Color.red.azure, 'azure red') - - -class TestEnum(TestCase): - - def setUp(self): - class Season(Enum): - SPRING = 1 - SUMMER = 2 - AUTUMN = 3 - WINTER = 4 - self.Season = Season - - class Konstants(float, Enum): - E = 2.7182818 - PI = 3.1415926 - TAU = 2 * PI - self.Konstants = Konstants - - class Grades(IntEnum): - A = 5 - B = 4 - C = 3 - D = 2 - F = 0 - self.Grades = Grades - - class Directional(str, Enum): - EAST = 'east' - WEST = 'west' - NORTH = 'north' - SOUTH = 'south' - self.Directional = Directional - - from datetime import date - class Holiday(date, Enum): - NEW_YEAR = 2013, 1, 1 - IDES_OF_MARCH = 2013, 3, 15 - self.Holiday = Holiday - - def test_set_name(self): - class Descriptor(object): - name = None - def __get__(self, instance, owner_class=None): - if instance is None: - return self - else: - return instance.__dict__[self.name] - def __set__(self, instance, value): - instance.__dict__[self.name] = value - def __set_name__(self, owner, name): - self.name = name - # - class AnEnum(Enum): - ONE = 'one' - two = Descriptor() - # - self.assertEqual(list(AnEnum), [AnEnum.ONE]) - self.assertEqual(AnEnum.two.name, 'two') - AnEnum.ONE.two = 'three' - self.assertEqual(AnEnum.ONE.two, 'three') - self.assertEqual(AnEnum.ONE.__dict__['two'], 'three') - - def test_private_names(self): - class Private(Enum): - __corporal = 'Radar' - __major_ = 'Hoolihan' - self.assertEqual(len(Private), 0) - self.assertEqual(Private._Private__corporal, 'Radar') - self.assertFalse(isinstance(Private._Private__corporal, Enum)) - self.assertEqual(Private._Private__major_, 'Hoolihan') - self.assertFalse(isinstance(Private._Private__major_, Enum)) - - def test_new_with_keywords(self): - class Huh(IntEnum): - __order__ = 'PLAIN BOLD_ITALIC HIGHLIGHT' - def __new__(cls, docstring, open=None, close=None): - value = len(cls.__members__) - member = int.__new__(cls, value) - if open and close is None: - close = open - member.open = open - member.close = close - member.__doc__ = docstring - member._value_ = value - return member - PLAIN = 'normal' - BOLD_ITALIC = '***really super important***', '***' - HIGHLIGHT = 'please ==take notice==', '==', '==' - p = Huh.PLAIN - self.assertTrue(type(p) is Huh, type(p)) - self.assertEqual( - (p.value, p.__doc__, p.open, p.close), - (0, 'normal', None, None), - ) - bi = Huh.BOLD_ITALIC - self.assertEqual( - (bi.value, bi.__doc__, bi.open, bi.close), - (1, '***really super important***', '***', '***'), - ) - h = Huh.HIGHLIGHT - self.assertEqual( - (h.value, h.__doc__, h.open, h.close), - (2, 'please ==take notice==', '==', '=='), - ) - - def test_members_is_ordereddict_if_ordered(self): - class Ordered(Enum): - __order__ = 'first second third' - first = 'bippity' - second = 'boppity' - third = 'boo' - self.assertTrue(type(Ordered.__members__) is OrderedDict) - - def test_members_is_ordereddict_if_not_ordered(self): - class Unordered(Enum): - this = 'that' - these = 'those' - self.assertTrue(type(Unordered.__members__) is OrderedDict) - - def test_enum_in_enum_out(self): - Season = self.Season - self.assertTrue(Season(Season.WINTER) is Season.WINTER) - - def test_enum_value(self): - Season = self.Season - self.assertEqual(Season.SPRING.value, 1) - - def test_intenum_value(self): - self.assertEqual(IntStooges.CURLY.value, 2) - - def test_enum(self): - Season = self.Season - lst = list(Season) - self.assertEqual(len(lst), len(Season)) - self.assertEqual(len(Season), 4, Season) - self.assertEqual( - [Season.SPRING, Season.SUMMER, Season.AUTUMN, Season.WINTER], lst) - - for i, season in enumerate('SPRING SUMMER AUTUMN WINTER'.split()): - i += 1 - e = Season(i) - self.assertEqual(e, getattr(Season, season)) - self.assertEqual(e.value, i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, season) - self.assertTrue(e in Season) - self.assertTrue(type(e) is Season) - self.assertTrue(isinstance(e, Season)) - self.assertEqual(str(e), 'Season.' + season) - self.assertEqual( - repr(e), - '<Season.%s: %s>' % (season, i), - ) - def test_enum_helper(self): - e1 = enum(1, 2, three=9) - e2 = enum(1, 2, three=9) - e3 = enum(1, 2, 9) - self.assertTrue(e1 is not e2) - self.assertEqual(e1, e2) - self.assertNotEqual(e1, e3) - self.assertNotEqual(e2, e3) - - def test_enum_in_enum(self): - # - class Level(Enum): - _order_ = 'DATA_CHECK DESIGN_CHECK ALERT' - # - def __new__(cls, *args, **kwds): - member = object.__new__(cls) - member._value_ = len(cls) + 1 # members are 1-based - return member - # - def __init__(self, prereq=None, dependent=None): - # create priority level lists - self.lower_priority_levels = list(self.__class__._member_map_.values()) - self.greater_priority_levels = [] - # update previous members' greater priority list - for member in self.lower_priority_levels: - member.greater_priority_levels.append(self) - # and save prereq and dependent - self.prerequisite = prereq and self.__class__[prereq.name] or None - self.dependent = dependent and self.__class__[dependent.name] or None - # - DATA_CHECK = enum() - DESIGN_CHECK = enum(DATA_CHECK) - ALERT = enum(None, DATA_CHECK) - # - self.assertEqual(Level.DATA_CHECK.value, 1) - self.assertEqual(Level.DATA_CHECK.prerequisite, None) - self.assertEqual(Level.DATA_CHECK.dependent, None) - self.assertEqual(Level.DESIGN_CHECK.prerequisite, Level.DATA_CHECK) - self.assertEqual(Level.DESIGN_CHECK.dependent, None) - self.assertEqual(Level.ALERT.prerequisite, None) - self.assertEqual(Level.ALERT.dependent, Level.DATA_CHECK) - - def test_value_name(self): - Season = self.Season - self.assertEqual(Season.SPRING.name, 'SPRING') - self.assertEqual(Season.SPRING.value, 1) - def set_name(obj, new_value): - obj.name = new_value - def set_value(obj, new_value): - obj.value = new_value - self.assertRaises(AttributeError, set_name, Season.SPRING, 'invierno', ) - self.assertRaises(AttributeError, set_value, Season.SPRING, 2) - - def test_attribute_deletion(self): - class Season(Enum): - SPRING = 1 - SUMMER = 2 - AUTUMN = 3 - WINTER = 4 - - def spam(cls): - pass - - self.assertTrue(hasattr(Season, 'spam')) - del Season.spam - self.assertFalse(hasattr(Season, 'spam')) - - self.assertRaises(AttributeError, delattr, Season, 'SPRING') - self.assertRaises(AttributeError, delattr, Season, 'DRY') - self.assertRaises(AttributeError, delattr, Season.SPRING, 'name') - - def test_bool_of_class(self): - class Empty(Enum): - pass - self.assertTrue(bool(Empty)) - - def test_bool_of_member(self): - class Count(Enum): - zero = 0 - one = 1 - two = 2 - for member in Count: - self.assertTrue(bool(member)) - - def test_invalid_names(self): - def create_bad_class_1(): - class Wrong(Enum): - mro = 9 - def create_bad_class_2(): - class Wrong(Enum): - _reserved_ = 3 - self.assertRaises(ValueError, create_bad_class_1) - self.assertRaises(ValueError, create_bad_class_2) - - def test_bool(self): - class Logic(Enum): - true = True - false = False - def __bool__(self): - return bool(self.value) - __nonzero__ = __bool__ - self.assertTrue(Logic.true) - self.assertFalse(Logic.false) - - def test_contains(self): - Season = self.Season - self.assertRaises(TypeError, lambda: 'AUTUMN' in Season) - self.assertTrue(Season.AUTUMN in Season) - self.assertRaises(TypeError, lambda: 3 not in Season) - val = Season(3) - self.assertTrue(val in Season) - # - class OtherEnum(Enum): - one = 1; two = 2 - self.assertTrue(OtherEnum.two not in Season) - # - class Wierd(Enum): - this = [1, 2, 3] - that = (1, 2, 3) - those = {1: 1, 2: 2, 3: 3} - self.assertTrue(Wierd.this in Wierd) - self.assertRaises(TypeError, lambda: [1, 2, 3] in Wierd) - self.assertRaises(TypeError, lambda: {1: 1, 2: 2, 3: 3} in Wierd) - - def test_member_contains(self): - self.assertRaises(TypeError, lambda: 'test' in self.Season.AUTUMN) - - if pyver >= PY2_6: # when `format` came into being - - def test_format_enum(self): - Season = self.Season - self.assertEqual('{0}'.format(Season.SPRING), - '{0}'.format(str(Season.SPRING))) - self.assertEqual( '{0:}'.format(Season.SPRING), - '{0:}'.format(str(Season.SPRING))) - self.assertEqual('{0:20}'.format(Season.SPRING), - '{0:20}'.format(str(Season.SPRING))) - self.assertEqual('{0:^20}'.format(Season.SPRING), - '{0:^20}'.format(str(Season.SPRING))) - self.assertEqual('{0:>20}'.format(Season.SPRING), - '{0:>20}'.format(str(Season.SPRING))) - self.assertEqual('{0:<20}'.format(Season.SPRING), - '{0:<20}'.format(str(Season.SPRING))) - - def test_custom_format(self): - class TestFloat(float, Enum): - one = 1.0 - two = 2.0 - def __format__(self, spec): - return 'TestFloat success!' - self.assertEqual(str(TestFloat.one), 'TestFloat.one') - self.assertEqual('{0}'.format(TestFloat.one), 'TestFloat success!') - - def test_format_with_custom_str(self): - class TestInt(int, Enum): - one = 1 - two = 2 - def __str__(self): - return self.name * 3 - self.assertEqual(str(TestInt.two), 'twotwotwo') - self.assertEqual('{0}'.format(TestInt.two), 'twotwotwo') - - def assertFormatIsValue(self, spec, member): - self.assertEqual(spec.format(member), spec.format(member.value)) - - def test_format_enum_date(self): - Holiday = self.Holiday - self.assertFormatIsValue('{0}', Holiday.IDES_OF_MARCH) - self.assertFormatIsValue('{0:}', Holiday.IDES_OF_MARCH) - self.assertFormatIsValue('{0:20}', Holiday.IDES_OF_MARCH) - self.assertFormatIsValue('{0:^20}', Holiday.IDES_OF_MARCH) - self.assertFormatIsValue('{0:>20}', Holiday.IDES_OF_MARCH) - self.assertFormatIsValue('{0:<20}', Holiday.IDES_OF_MARCH) - self.assertFormatIsValue('{0:%Y %m}', Holiday.IDES_OF_MARCH) - self.assertFormatIsValue('{0:%Y %m %M:00}', Holiday.IDES_OF_MARCH) - - def test_format_enum_float(self): - Konstants = self.Konstants - self.assertFormatIsValue('{0}', Konstants.TAU) - self.assertFormatIsValue('{0:}', Konstants.TAU) - self.assertFormatIsValue('{0:20}', Konstants.TAU) - self.assertFormatIsValue('{0:^20}', Konstants.TAU) - self.assertFormatIsValue('{0:>20}', Konstants.TAU) - self.assertFormatIsValue('{0:<20}', Konstants.TAU) - self.assertFormatIsValue('{0:n}', Konstants.TAU) - self.assertFormatIsValue('{0:5.2}', Konstants.TAU) - self.assertFormatIsValue('{0:f}', Konstants.TAU) - - def test_format_enum_int(self): - Grades = self.Grades - self.assertFormatIsValue('{0}', Grades.C) - self.assertFormatIsValue('{0:}', Grades.C) - self.assertFormatIsValue('{0:20}', Grades.C) - self.assertFormatIsValue('{0:^20}', Grades.C) - self.assertFormatIsValue('{0:>20}', Grades.C) - self.assertFormatIsValue('{0:<20}', Grades.C) - self.assertFormatIsValue('{0:+}', Grades.C) - self.assertFormatIsValue('{0:08X}', Grades.C) - self.assertFormatIsValue('{0:b}', Grades.C) - - def test_format_enum_str(self): - Directional = self.Directional - self.assertFormatIsValue('{0}', Directional.WEST) - self.assertFormatIsValue('{0:}', Directional.WEST) - self.assertFormatIsValue('{0:20}', Directional.WEST) - self.assertFormatIsValue('{0:^20}', Directional.WEST) - self.assertFormatIsValue('{0:>20}', Directional.WEST) - self.assertFormatIsValue('{0:<20}', Directional.WEST) - - def test_hash(self): - Season = self.Season - dates = {} - dates[Season.WINTER] = '1225' - dates[Season.SPRING] = '0315' - dates[Season.SUMMER] = '0704' - dates[Season.AUTUMN] = '1031' - self.assertEqual(dates[Season.AUTUMN], '1031') - - def test_enum_duplicates(self): - class Season(Enum): - __order__ = "SPRING SUMMER AUTUMN WINTER" - SPRING = 1 - SUMMER = 2 - AUTUMN = FALL = 3 - WINTER = 4 - ANOTHER_SPRING = 1 - lst = list(Season) - self.assertEqual( - lst, - [Season.SPRING, Season.SUMMER, - Season.AUTUMN, Season.WINTER, - ]) - self.assertTrue(Season.FALL is Season.AUTUMN) - self.assertEqual(Season.FALL.value, 3) - self.assertEqual(Season.AUTUMN.value, 3) - self.assertTrue(Season(3) is Season.AUTUMN) - self.assertTrue(Season(1) is Season.SPRING) - self.assertEqual(Season.FALL.name, 'AUTUMN') - self.assertEqual( - set([k for k,v in Season.__members__.items() if v.name != k]), - set(['FALL', 'ANOTHER_SPRING']), - ) - - def test_enum_with_value_name(self): - class Huh(Enum): - _order_ = 'name value' - name = 1 - value = 2 - self.assertEqual( - list(Huh), - [Huh.name, Huh.value], - ) - self.assertTrue(type(Huh.name) is Huh) - self.assertEqual(Huh.name.name, 'name') - self.assertEqual(Huh.name.value, 1) - - def test_intenum_from_scratch(self): - class phy(int, Enum): - pi = 3 - tau = 2 * pi - self.assertTrue(phy.pi < phy.tau) - - def test_intenum_inherited(self): - class IntEnum(int, Enum): - pass - class phy(IntEnum): - pi = 3 - tau = 2 * pi - self.assertTrue(phy.pi < phy.tau) - - def test_floatenum_from_scratch(self): - class phy(float, Enum): - pi = 3.1415926 - tau = 2 * pi - self.assertTrue(phy.pi < phy.tau) - - def test_floatenum_inherited(self): - class FloatEnum(float, Enum): - pass - class phy(FloatEnum): - pi = 3.1415926 - tau = 2 * pi - self.assertTrue(phy.pi < phy.tau) - - def test_strenum_from_scratch(self): - class phy(str, Enum): - pi = 'Pi' - tau = 'Tau' - self.assertTrue(phy.pi < phy.tau) - - def test_intenum(self): - class WeekDay(IntEnum): - SUNDAY = 1 - MONDAY = 2 - TUESDAY = 3 - WEDNESDAY = 4 - THURSDAY = 5 - FRIDAY = 6 - SATURDAY = 7 - - self.assertEqual(['a', 'b', 'c'][WeekDay.MONDAY], 'c') - self.assertEqual([i for i in range(WeekDay.TUESDAY)], [0, 1, 2]) - - lst = list(WeekDay) - self.assertEqual(len(lst), len(WeekDay)) - self.assertEqual(len(WeekDay), 7) - target = 'SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY' - target = target.split() - for i, weekday in enumerate(target): - i += 1 - e = WeekDay(i) - self.assertEqual(e, i) - self.assertEqual(int(e), i) - self.assertEqual(e.name, weekday) - self.assertTrue(e in WeekDay) - self.assertEqual(lst.index(e)+1, i) - self.assertTrue(0 < e < 8) - self.assertTrue(type(e) is WeekDay) - self.assertTrue(isinstance(e, int)) - self.assertTrue(isinstance(e, Enum)) - - def test_intenum_duplicates(self): - class WeekDay(IntEnum): - __order__ = 'SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY' - SUNDAY = 1 - MONDAY = 2 - TUESDAY = TEUSDAY = 3 - WEDNESDAY = 4 - THURSDAY = 5 - FRIDAY = 6 - SATURDAY = 7 - self.assertTrue(WeekDay.TEUSDAY is WeekDay.TUESDAY) - self.assertEqual(WeekDay(3).name, 'TUESDAY') - self.assertEqual([k for k,v in WeekDay.__members__.items() - if v.name != k], ['TEUSDAY', ]) - - def test_floatenum_fromhex(self): - h = float.hex(FloatStooges.MOE.value) - self.assertIs(FloatStooges.fromhex(h), FloatStooges.MOE) - h = float.hex(FloatStooges.MOE.value + 0.01) - with self.assertRaises(ValueError): - FloatStooges.fromhex(h) - - def test_pickle_enum(self): - if isinstance(Stooges, Exception): - raise Stooges - test_pickle_dump_load(self.assertTrue, Stooges.CURLY) - test_pickle_dump_load(self.assertTrue, Stooges) - - def test_pickle_int(self): - if isinstance(IntStooges, Exception): - raise IntStooges - test_pickle_dump_load(self.assertTrue, IntStooges.CURLY) - test_pickle_dump_load(self.assertTrue, IntStooges) - - def test_pickle_float(self): - if isinstance(FloatStooges, Exception): - raise FloatStooges - test_pickle_dump_load(self.assertTrue, FloatStooges.CURLY) - test_pickle_dump_load(self.assertTrue, FloatStooges) - - def test_pickle_enum_function(self): - if isinstance(Answer, Exception): - raise Answer - test_pickle_dump_load(self.assertTrue, Answer.him) - test_pickle_dump_load(self.assertTrue, Answer) - - def test_pickle_enum_function_with_module(self): - if isinstance(Question, Exception): - raise Question - test_pickle_dump_load(self.assertTrue, Question.who) - test_pickle_dump_load(self.assertTrue, Question) - - def test_pickle_by_name(self): - class ReplaceGlobalInt(IntEnum): - ONE = 1 - TWO = 2 - ReplaceGlobalInt.__reduce_ex__ = _reduce_ex_by_name - for proto in range(HIGHEST_PROTOCOL): - self.assertEqual(ReplaceGlobalInt.TWO.__reduce_ex__(proto), 'TWO') - - def test_exploding_pickle(self): - BadPickle = Enum('BadPickle', 'dill sweet bread-n-butter') - aenum._make_class_unpicklable(BadPickle) - globals()['BadPickle'] = BadPickle - test_pickle_exception(self.assertRaises, TypeError, BadPickle.dill) - test_pickle_exception(self.assertRaises, PicklingError, BadPickle) - - def test_string_enum(self): - class SkillLevel(str, Enum): - master = 'what is the sound of one hand clapping?' - journeyman = 'why did the chicken cross the road?' - apprentice = 'knock, knock!' - self.assertEqual(SkillLevel.apprentice, 'knock, knock!') - - def test_getattr_getitem(self): - class Period(Enum): - morning = 1 - noon = 2 - evening = 3 - night = 4 - self.assertTrue(Period(2) is Period.noon) - self.assertTrue(getattr(Period, 'night') is Period.night) - self.assertTrue(Period['morning'] is Period.morning) - - def test_getattr_dunder(self): - Season = self.Season - self.assertTrue(getattr(Season, '__hash__')) - - def test_iteration_order(self): - class Season(Enum): - __order__ = 'SUMMER WINTER AUTUMN SPRING' - SUMMER = 2 - WINTER = 4 - AUTUMN = 3 - SPRING = 1 - self.assertEqual( - list(Season), - [Season.SUMMER, Season.WINTER, Season.AUTUMN, Season.SPRING], - ) - - def test_iteration_order_reversed(self): - self.assertEqual( - list(reversed(self.Season)), - [self.Season.WINTER, self.Season.AUTUMN, self.Season.SUMMER, - self.Season.SPRING] - ) - - def test_iteration_order_with_unorderable_values(self): - class Complex(Enum): - a = complex(7, 9) - b = complex(3.14, 2) - c = complex(1, -1) - d = complex(-77, 32) - self.assertEqual( - list(Complex), - [Complex.a, Complex.b, Complex.c, Complex.d], - ) - - def test_programatic_function_string(self): - SummerMonth = Enum('SummerMonth', 'june july august') - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_string_with_start(self): - SummerMonth = Enum('SummerMonth', 'june july august', start=10) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split(), 10): - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_string_list(self): - SummerMonth = Enum('SummerMonth', ['june', 'july', 'august']) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_string_list_with_start(self): - SummerMonth = Enum('SummerMonth', ['june', 'july', 'august'], start=20) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split(), 20): - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_iterable(self): - SummerMonth = Enum( - 'SummerMonth', - (('june', 1), ('july', 2), ('august', 3)) - ) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_from_dict(self): - SummerMonth = Enum( - 'SummerMonth', - dict((('june', 1), ('july', 2), ('august', 3))) - ) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - if PY2: - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_type(self): - SummerMonth = Enum('SummerMonth', 'june july august', type=int) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_type_with_start(self): - SummerMonth = Enum('SummerMonth', 'june july august', type=int, start=30) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split(), 30): - e = SummerMonth(i) - self.assertEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_type_from_subclass(self): - SummerMonth = IntEnum('SummerMonth', 'june july august') - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_type_from_subclass_with_start(self): - SummerMonth = IntEnum('SummerMonth', 'june july august', start=40) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate('june july august'.split(), 40): - e = SummerMonth(i) - self.assertEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_unicode(self): - SummerMonth = Enum('SummerMonth', unicode('june july august')) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate(unicode('june july august').split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_unicode_list(self): - SummerMonth = Enum('SummerMonth', [unicode('june'), unicode('july'), unicode('august')]) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate(unicode('june july august').split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_unicode_iterable(self): - SummerMonth = Enum( - 'SummerMonth', - ((unicode('june'), 1), (unicode('july'), 2), (unicode('august'), 3)) - ) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate(unicode('june july august').split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_from_unicode_dict(self): - SummerMonth = Enum( - 'SummerMonth', - dict(((unicode('june'), 1), (unicode('july'), 2), (unicode('august'), 3))) - ) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - if PY2: - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate(unicode('june july august').split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(int(e.value), i) - self.assertNotEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_unicode_type(self): - SummerMonth = Enum('SummerMonth', unicode('june july august'), type=int) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate(unicode('june july august').split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programatic_function_unicode_type_from_subclass(self): - SummerMonth = IntEnum('SummerMonth', unicode('june july august')) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate(unicode('june july august').split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(e, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_programmatic_function_unicode_class(self): - if PY2: - class_names = unicode('SummerMonth'), 'S\xfcmm\xe9rM\xf6nth'.decode('latin1') - else: - class_names = 'SummerMonth', 'S\xfcmm\xe9rM\xf6nth' - for i, class_name in enumerate(class_names): - if PY2 and i == 1: - self.assertRaises(TypeError, Enum, class_name, unicode('june july august')) - else: - SummerMonth = Enum(class_name, unicode('june july august')) - lst = list(SummerMonth) - self.assertEqual(len(lst), len(SummerMonth)) - self.assertEqual(len(SummerMonth), 3, SummerMonth) - self.assertEqual( - [SummerMonth.june, SummerMonth.july, SummerMonth.august], - lst, - ) - for i, month in enumerate(unicode('june july august').split()): - i += 1 - e = SummerMonth(i) - self.assertEqual(e.value, i) - self.assertEqual(e.name, month) - self.assertTrue(e in SummerMonth) - self.assertTrue(type(e) is SummerMonth) - - def test_subclassing(self): - if isinstance(Name, Exception): - raise Name - self.assertEqual(Name.BDFL, 'Guido van Rossum') - self.assertTrue(Name.BDFL, Name('Guido van Rossum')) - self.assertTrue(Name.BDFL is getattr(Name, 'BDFL')) - test_pickle_dump_load(self.assertTrue, Name.BDFL) - - def test_extending(self): - def bad_extension(): - class Color(Enum): - red = 1 - green = 2 - blue = 3 - class MoreColor(Color): - cyan = 4 - magenta = 5 - yellow = 6 - self.assertRaises(TypeError, bad_extension) - - def test_exclude_methods(self): - class whatever(Enum): - this = 'that' - these = 'those' - def really(self): - return 'no, not %s' % self.value - self.assertFalse(type(whatever.really) is whatever) - self.assertEqual(whatever.this.really(), 'no, not that') - - def test_wrong_inheritance_order(self): - def wrong_inherit(): - class Wrong(Enum, str): - NotHere = 'error before this point' - self.assertRaises(TypeError, wrong_inherit) - - def test_intenum_transitivity(self): - class number(IntEnum): - one = 1 - two = 2 - three = 3 - class numero(IntEnum): - uno = 1 - dos = 2 - tres = 3 - self.assertEqual(number.one, numero.uno) - self.assertEqual(number.two, numero.dos) - self.assertEqual(number.three, numero.tres) - - def test_introspection(self): - class Number(IntEnum): - one = 100 - two = 200 - self.assertTrue(Number.one._member_type_ is int) - self.assertTrue(Number._member_type_ is int) - class String(str, Enum): - yarn = 'soft' - rope = 'rough' - wire = 'hard' - self.assertTrue(String.yarn._member_type_ is str) - self.assertTrue(String._member_type_ is str) - class Plain(Enum): - vanilla = 'white' - one = 1 - self.assertTrue(Plain.vanilla._member_type_ is object) - self.assertTrue(Plain._member_type_ is object) - - def test_wrong_enum_in_call(self): - class Monochrome(Enum): - black = 0 - white = 1 - class Gender(Enum): - male = 0 - female = 1 - self.assertRaises(ValueError, Monochrome, Gender.male) - - def test_wrong_enum_in_mixed_call(self): - class Monochrome(IntEnum): - black = 0 - white = 1 - class Gender(Enum): - male = 0 - female = 1 - self.assertRaises(ValueError, Monochrome, Gender.male) - - def test_mixed_enum_in_call_1(self): - class Monochrome(IntEnum): - black = 0 - white = 1 - class Gender(IntEnum): - male = 0 - female = 1 - self.assertTrue(Monochrome(Gender.female) is Monochrome.white) - - def test_mixed_enum_in_call_2(self): - class Monochrome(Enum): - black = 0 - white = 1 - class Gender(IntEnum): - male = 0 - female = 1 - self.assertTrue(Monochrome(Gender.male) is Monochrome.black) - - def test_flufl_enum(self): - class Fluflnum(Enum): - def __int__(self): - return int(self.value) - class MailManOptions(Fluflnum): - option1 = 1 - option2 = 2 - option3 = 3 - self.assertEqual(int(MailManOptions.option1), 1) - - def test_no_such_enum_member(self): - class Color(Enum): - red = 1 - green = 2 - blue = 3 - self.assertRaises(ValueError, Color, 4) - self.assertRaises(KeyError, Color.__getitem__, 'chartreuse') - - def test_new_repr(self): - class Color(Enum): - red = 1 - green = 2 - blue = 3 - def __repr__(self): - return "don't you just love shades of %s?" % self.name - self.assertEqual( - repr(Color.blue), - "don't you just love shades of blue?", - ) - - def test_inherited_repr(self): - class MyEnum(Enum): - def __repr__(self): - return "My name is %s." % self.name - class MyIntEnum(int, MyEnum): - this = 1 - that = 2 - theother = 3 - self.assertEqual(repr(MyIntEnum.that), "My name is that.") - - def test_multiple_mixin_mro(self): - class auto_enum(EnumMeta): - def __new__(metacls, cls, bases, classdict): - original_dict = classdict - temp_dict = metacls.__prepare__(cls, bases, {}) - if hasattr(original_dict, '_member_names'): - for k in original_dict._member_names: - temp_dict[k] = original_dict[k] - sunders = [k for k in original_dict.keys() if aenum._is_sunder(k)] - else: - sunders = [] - for k, v in original_dict.items(): - if aenum._is_sunder(k): - sunders.append(k) - temp_dict[k] = v - classdict = metacls.__prepare__(cls, bases, {}) - i = 0 - for k in sunders: - classdict[k] = original_dict[k] - for k in temp_dict._member_names: - v = original_dict[k] - if v == (): - v = i - else: - i = v - i += 1 - classdict[k] = v - for k, v in original_dict.items(): - if k not in temp_dict._member_names and k not in sunders: - classdict[k] = v - return super(auto_enum, metacls).__new__( - metacls, cls, bases, classdict) - - AutoNumberedEnum = auto_enum('AutoNumberedEnum', (Enum,), {}) - - AutoIntEnum = auto_enum('AutoIntEnum', (IntEnum,), {}) - - # class TestAutoNumber(AutoNumberedEnum): - # a = () - # b = 3 - # c = () - # self.assertEqual(TestAutoNumber.b.value, 3) - # - # if pyver >= 3.0: - # self.assertEqual( - # [TestAutoNumber.a.value, TestAutoNumber.b.value, TestAutoNumber.c.value], - # [0, 3, 4], - # ) - # - # class TestAutoInt(AutoIntEnum): - # a = () - # b = 3 - # c = () - # self.assertEqual(TestAutoInt.b, 3) - # - # if pyver >= 3.0: - # self.assertEqual( - # [TestAutoInt.a.value, TestAutoInt.b.value, TestAutoInt.c.value], - # [0, 3, 4], - # ) - - def test_meta_reconfigure(self): - - def identity(*args): - if len(args) == 1: - return args[0] - return args - - JSONEnum = None - - class JSONEnumMeta(EnumMeta): - - @classmethod - def __prepare__(metacls, cls, bases, init=None, start=None, settings=()): - return {} - - def __init__(cls, *args , **kwds): - super(JSONEnumMeta, cls).__init__(*args) - - def __new__(metacls, cls, bases, clsdict, init=None, start=None, settings=()): - import json - members = [] - if JSONEnum is not None: - if '_file' not in clsdict: - raise TypeError('_file is required') - if '_name' not in clsdict: - raise TypeError('_name is required') - if '_value' not in clsdict: - raise TypeError('_value is required') - name_spec = clsdict.pop('_name') - if not isinstance(name_spec, (tuple, list)): - name_spec = (name_spec, ) - value_spec = clsdict.pop('_value') - file = clsdict.pop('_file') - with open(file) as f: - json_data = json.load(f) - for data in json_data: - values = [] - name = data[name_spec[0]] - for piece in name_spec[1:]: - name = name[piece] - for order, (value_path, func) in sorted(value_spec.items()): - if not isinstance(value_path, (list, tuple)): - value_path = (value_path, ) - value = data[value_path[0]] - for piece in value_path[1:]: - value = value[piece] - if func is not None: - value = func(value) - values.append(value) - values = tuple(values) - members.append( - (name, identity(*values)) - ) - # get the real EnumDict - enum_dict = super(JSONEnumMeta, metacls).__prepare__(cls, bases, init, start, settings) - # transfer the original dict content, _items first - items = list(clsdict.items()) - items.sort(key=lambda p: (0 if p[0][0] == '_' else 1, p)) - for name, value in items: - enum_dict[name] = value - # add the members - for name, value in members: - enum_dict[name] = value - return super(JSONEnumMeta, metacls).__new__(metacls, cls, bases, enum_dict, init, start, settings) - - # for use with both Python 2/3 - JSONEnum = JSONEnumMeta('JsonEnum', (Enum, ), {}) - - test_file = os.path.join(tempdir, 'test_json.json') - with open(test_file, 'w') as f: - f.write( - '[{"name":"Afghanistan","alpha-2":"AF","country-code":"004","notes":{"description":"pretty"}},' - '{"name":"Ã…land Islands","alpha-2":"AX","country-code":"248","notes":{"description":"serene"}},' - '{"name":"Albania","alpha-2":"AL","country-code":"008","notes":{"description":"exciting"}},' - '{"name":"Algeria","alpha-2":"DZ","country-code":"012","notes":{"description":"scarce"}}]') - - class Country(JSONEnum): - _init_ = 'abbr code country_name description' - _file = test_file - _name = 'alpha-2' - _value = { - 1: ('alpha-2', None), - 2: ('country-code', lambda c: int(c)), - 3: ('name', None), - 4: (('notes','description'), lambda s: s.title()), - } - - self.assertEqual([Country.AF, Country.AX, Country.AL, Country.DZ], list(Country)) - self.assertEqual(Country.AF.abbr, 'AF') - self.assertEqual(Country.AX.code, 248) - self.assertEqual(Country.AL.country_name, 'Albania') - self.assertEqual(Country.DZ.description, 'Scarce') - - - def test_subclasses_with_getnewargs(self): - class NamedInt(int): - __qualname__ = 'NamedInt' # needed for pickle protocol 4 - def __new__(cls, *args): - _args = args - if len(args) < 1: - raise TypeError("name and value must be specified") - name, args = args[0], args[1:] - self = int.__new__(cls, *args) - self._intname = name - self._args = _args - return self - def __getnewargs__(self): - return self._args - @property - def __name__(self): - return self._intname - def __repr__(self): - # repr() is updated to include the name and type info - return "%s(%r, %s)" % (type(self).__name__, - self.__name__, - int.__repr__(self)) - def __str__(self): - # str() is unchanged, even if it relies on the repr() fallback - base = int - base_str = base.__str__ - if base_str.__objclass__ is object: - return base.__repr__(self) - return base_str(self) - # for simplicity, we only define one operator that - # propagates expressions - def __add__(self, other): - temp = int(self) + int( other) - if isinstance(self, NamedInt) and isinstance(other, NamedInt): - return NamedInt( - '(%s + %s)' % (self.__name__, other.__name__), - temp ) - else: - return temp - - class NEI(NamedInt, Enum): - __qualname__ = 'NEI' # needed for pickle protocol 4 - x = ('the-x', 1) - y = ('the-y', 2) - - self.assertTrue(NEI.__new__ is Enum.__new__) - self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)") - globals()['NamedInt'] = NamedInt - globals()['NEI'] = NEI - NI5 = NamedInt('test', 5) - self.assertEqual(NI5, 5) - test_pickle_dump_load(self.assertTrue, NI5, 5) - self.assertEqual(NEI.y.value, 2) - test_pickle_dump_load(self.assertTrue, NEI.y) - - def test_subclasses_with_reduce(self): - class NamedInt(int): - __qualname__ = 'NamedInt' # needed for pickle protocol 4 - def __new__(cls, *args): - _args = args - if len(args) < 1: - raise TypeError("name and value must be specified") - name, args = args[0], args[1:] - self = int.__new__(cls, *args) - self._intname = name - self._args = _args - return self - def __reduce__(self): - return self.__class__, self._args - @property - def __name__(self): - return self._intname - def __repr__(self): - # repr() is updated to include the name and type info - return "%s(%r, %s)" % (type(self).__name__, - self.__name__, - int.__repr__(self)) - def __str__(self): - # str() is unchanged, even if it relies on the repr() fallback - base = int - base_str = base.__str__ - if base_str.__objclass__ is object: - return base.__repr__(self) - return base_str(self) - # for simplicity, we only define one operator that - # propagates expressions - def __add__(self, other): - temp = int(self) + int( other) - if isinstance(self, NamedInt) and isinstance(other, NamedInt): - return NamedInt( - '(%s + %s)' % (self.__name__, other.__name__), - temp ) - else: - return temp - - class NEI(NamedInt, Enum): - __qualname__ = 'NEI' # needed for pickle protocol 4 - x = ('the-x', 1) - y = ('the-y', 2) - - - self.assertTrue(NEI.__new__ is Enum.__new__) - self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)") - globals()['NamedInt'] = NamedInt - globals()['NEI'] = NEI - NI5 = NamedInt('test', 5) - self.assertEqual(NI5, 5) - test_pickle_dump_load(self.assertEqual, NI5, 5) - self.assertEqual(NEI.y.value, 2) - test_pickle_dump_load(self.assertTrue, NEI.y) - - def test_subclasses_with_reduce_ex(self): - class NamedInt(int): - __qualname__ = 'NamedInt' # needed for pickle protocol 4 - def __new__(cls, *args): - _args = args - if len(args) < 1: - raise TypeError("name and value must be specified") - name, args = args[0], args[1:] - self = int.__new__(cls, *args) - self._intname = name - self._args = _args - return self - def __reduce_ex__(self, proto): - return self.__class__, self._args - @property - def __name__(self): - return self._intname - def __repr__(self): - # repr() is updated to include the name and type info - return "%s(%r, %s)" % (type(self).__name__, - self.__name__, - int.__repr__(self)) - def __str__(self): - # str() is unchanged, even if it relies on the repr() fallback - base = int - base_str = base.__str__ - if base_str.__objclass__ is object: - return base.__repr__(self) - return base_str(self) - # for simplicity, we only define one operator that - # propagates expressions - def __add__(self, other): - temp = int(self) + int( other) - if isinstance(self, NamedInt) and isinstance(other, NamedInt): - return NamedInt( - '(%s + %s)' % (self.__name__, other.__name__), - temp ) - else: - return temp - - class NEI(NamedInt, Enum): - __qualname__ = 'NEI' # needed for pickle protocol 4 - x = ('the-x', 1) - y = ('the-y', 2) - - - self.assertTrue(NEI.__new__ is Enum.__new__) - self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)") - globals()['NamedInt'] = NamedInt - globals()['NEI'] = NEI - NI5 = NamedInt('test', 5) - self.assertEqual(NI5, 5) - test_pickle_dump_load(self.assertEqual, NI5, 5) - self.assertEqual(NEI.y.value, 2) - test_pickle_dump_load(self.assertTrue, NEI.y) - - def test_subclasses_without_direct_pickle_support(self): - class NamedInt(int): - __qualname__ = 'NamedInt' - def __new__(cls, *args): - _args = args - name, args = args[0], args[1:] - if len(args) == 0: - raise TypeError("name and value must be specified") - self = int.__new__(cls, *args) - self._intname = name - self._args = _args - return self - @property - def __name__(self): - return self._intname - def __repr__(self): - # repr() is updated to include the name and type info - return "%s(%r, %s)" % (type(self).__name__, - self.__name__, - int.__repr__(self)) - def __str__(self): - # str() is unchanged, even if it relies on the repr() fallback - base = int - base_str = base.__str__ - if base_str.__objclass__ is object: - return base.__repr__(self) - return base_str(self) - # for simplicity, we only define one operator that - # propagates expressions - def __add__(self, other): - temp = int(self) + int( other) - if isinstance(self, NamedInt) and isinstance(other, NamedInt): - return NamedInt( - '(%s + %s)' % (self.__name__, other.__name__), - temp ) - else: - return temp - - class NEI(NamedInt, Enum): - __qualname__ = 'NEI' - x = ('the-x', 1) - y = ('the-y', 2) - - self.assertTrue(NEI.__new__ is Enum.__new__) - self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)") - globals()['NamedInt'] = NamedInt - globals()['NEI'] = NEI - NI5 = NamedInt('test', 5) - self.assertEqual(NI5, 5) - self.assertEqual(NEI.y.value, 2) - test_pickle_exception(self.assertRaises, TypeError, NEI.x) - test_pickle_exception(self.assertRaises, PicklingError, NEI) - - def test_subclasses_without_direct_pickle_support_using_name(self): - class NamedInt(int): - __qualname__ = 'NamedInt' - def __new__(cls, *args): - _args = args - name, args = args[0], args[1:] - if len(args) == 0: - raise TypeError("name and value must be specified") - self = int.__new__(cls, *args) - self._intname = name - self._args = _args - return self - @property - def __name__(self): - return self._intname - def __repr__(self): - # repr() is updated to include the name and type info - return "%s(%r, %s)" % (type(self).__name__, - self.__name__, - int.__repr__(self)) - def __str__(self): - # str() is unchanged, even if it relies on the repr() fallback - base = int - base_str = base.__str__ - if base_str.__objclass__ is object: - return base.__repr__(self) - return base_str(self) - # for simplicity, we only define one operator that - # propagates expressions - def __add__(self, other): - temp = int(self) + int( other) - if isinstance(self, NamedInt) and isinstance(other, NamedInt): - return NamedInt( - '(%s + %s)' % (self.__name__, other.__name__), - temp ) - else: - return temp - - class NEI(NamedInt, Enum): - __qualname__ = 'NEI' - x = ('the-x', 1) - y = ('the-y', 2) - def __reduce_ex__(self, proto): - return getattr, (self.__class__, self._name_) - - self.assertTrue(NEI.__new__ is Enum.__new__) - self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)") - globals()['NamedInt'] = NamedInt - globals()['NEI'] = NEI - NI5 = NamedInt('test', 5) - self.assertEqual(NI5, 5) - self.assertEqual(NEI.y.value, 2) - test_pickle_dump_load(self.assertTrue, NEI.y) - test_pickle_dump_load(self.assertTrue, NEI) - - def test_tuple_subclass(self): - class SomeTuple(tuple, Enum): - __qualname__ = 'SomeTuple' - first = (1, 'for the money') - second = (2, 'for the show') - third = (3, 'for the music') - self.assertTrue(type(SomeTuple.first) is SomeTuple) - self.assertTrue(isinstance(SomeTuple.second, tuple)) - self.assertEqual(SomeTuple.third, (3, 'for the music')) - globals()['SomeTuple'] = SomeTuple - test_pickle_dump_load(self.assertTrue, SomeTuple.first) - - # def test_duplicate_values_give_unique_enum_items(self): - # class NumericEnum(AutoNumberEnum): - # __order__ = 'enum_m enum_d enum_y' - # enum_m = () - # enum_d = () - # enum_y = () - # def __int__(self): - # return int(self._value_) - # self.assertEqual(int(NumericEnum.enum_d), 2) - # self.assertEqual(NumericEnum.enum_y.value, 3) - # self.assertTrue(NumericEnum(1) is NumericEnum.enum_m) - # self.assertEqual( - # list(NumericEnum), - # [NumericEnum.enum_m, NumericEnum.enum_d, NumericEnum.enum_y], - # ) - - def test_inherited_new_from_enhanced_enum(self): - class AutoNumber2(Enum): - def __new__(cls): - value = len(cls.__members__) + 1 - obj = object.__new__(cls) - obj._value_ = value - return obj - def __int__(self): - return int(self._value_) - class Color(AutoNumber2): - __order__ = 'red green blue' - red = () - green = () - blue = () - self.assertEqual(len(Color), 3, "wrong number of elements: %d (should be %d)" % (len(Color), 3)) - self.assertEqual(list(Color), [Color.red, Color.green, Color.blue]) - if PY3: - self.assertEqual(list(map(int, Color)), [1, 2, 3]) - - def test_inherited_new_from_mixed_enum(self): - class AutoNumber3(IntEnum): - def __new__(cls): - value = len(cls.__members__) + 11 - obj = int.__new__(cls, value) - obj._value_ = value - return obj - class Color(AutoNumber3): - __order__ = 'red green blue' - red = () - green = () - blue = () - self.assertEqual(len(Color), 3, "wrong number of elements: %d (should be %d)" % (len(Color), 3)) - Color.red - Color.green - Color.blue - self.assertEqual(Color.blue, 13) - - def test_equality(self): - class AlwaysEqual: - def __eq__(self, other): - return True - class OrdinaryEnum(Enum): - a = 1 - self.assertEqual(AlwaysEqual(), OrdinaryEnum.a) - self.assertEqual(OrdinaryEnum.a, AlwaysEqual()) - - def test_ordered_mixin(self): - class Grade(OrderedEnum): - __order__ = 'A B C D F' - A = 5 - B = 4 - C = 3 - D = 2 - F = 1 - self.assertEqual(list(Grade), [Grade.A, Grade.B, Grade.C, Grade.D, Grade.F]) - self.assertTrue(Grade.A > Grade.B) - self.assertTrue(Grade.F <= Grade.C) - self.assertTrue(Grade.D < Grade.A) - self.assertTrue(Grade.B >= Grade.B) - - def test_missing_deprecated(self): - class Label(Enum): - AnyApple = 0 - RedApple = 1 - GreenApple = 2 - @classmethod - def _missing_(cls, name): - return cls.AnyApple - - self.assertEqual(Label.AnyApple, Label(4)) - with self.assertRaises(AttributeError): - Label.redapple - with self.assertRaises(KeyError): - Label['redapple'] - - def test_missing(self): - class Label(Enum): - AnyApple = 0 - RedApple = 1 - GreenApple = 2 - @classmethod - def _missing_value_(cls, value): - return cls.AnyApple - - self.assertEqual(Label.AnyApple, Label(4)) - with self.assertRaises(AttributeError): - Label.redapple - with self.assertRaises(KeyError): - Label['redapple'] - - def test_missing_name(self): - class Label(Enum): - RedApple = 1 - GreenApple = 2 - @classmethod - def _missing_name_(cls, name): - for member in cls: - if member.name.lower() == name.lower(): - return member - - Label['redapple'] - with self.assertRaises(AttributeError): - Label.redapple - with self.assertRaises(ValueError): - Label('redapple') - - def test_missing_value_bad_input(self): - class Label(Enum): - AnyApple = 0 - RedApple = 1 - GreenApple = 2 - @classmethod - def _missing_value_(cls, value): - return cls.AnyApple - - self.assertEqual(Label.AnyApple, Label(4)) - with self.assertRaises(KeyError): - Label[True] - - def test_missing_name_bad_return(self): - class Label(Enum): - RedApple = 1 - GreenApple = 2 - @classmethod - def _missing_name_(cls, name): - return None - - with self.assertRaises(AttributeError): - Label.redapple - with self.assertRaises(ValueError): - Label('redapple') - with self.assertRaises(KeyError): - Label['redapple'] - - def test_extending2(self): - def bad_extension(): - class Shade(Enum): - def shade(self): - print(self.name) - class Color(Shade): - red = 1 - green = 2 - blue = 3 - class MoreColor(Color): - cyan = 4 - magenta = 5 - yellow = 6 - self.assertRaises(TypeError, bad_extension) - - def test_extending3(self): - class Shade(Enum): - def shade(self): - return self.name - class Color(Shade): - def hex(self): - return '%s hexlified!' % self.value - class MoreColor(Color): - cyan = 4 - magenta = 5 - yellow = 6 - self.assertEqual(MoreColor.magenta.hex(), '5 hexlified!') - - def test_extending5(self): - class Color(Enum): - _order_ = 'red green blue value' - red = 1 - green = 2 - blue = 3 - value = 4 - self.assertEqual(list(Color), [Color.red, Color.green, Color.blue, Color.value]) - self.assertEqual(Color.value.name, 'value') - self.assertEqual(Color.value.value, 4) - self.assertTrue(Color.value in Color) - self.assertEqual(Color(4), Color.value) - self.assertEqual(Color['value'], Color.value) - self.assertEqual(Color.red.value, 1) - - CONTINUE = 100, 'Continue', 'Request received, please continue' - SWITCHING_PROTOCOLS = (101, 'Switching Protocols', - 'Switching to new protocol; obey Upgrade header') - PROCESSING = 102, 'Processing' - - def test_no_duplicates(self): - def bad_duplicates(): - class Color1(UniqueEnum): - red = 1 - green = 2 - blue = 3 - class Color2(UniqueEnum): - red = 1 - green = 2 - blue = 3 - grene = 2 - self.assertRaises(ValueError, bad_duplicates) - - def test_no_duplicates_kinda(self): - class Silly(UniqueEnum): - one = 1 - two = 'dos' - name = 3 - class Sillier(IntEnum, UniqueEnum): - single = 1 - name = 2 - triple = 3 - value = 4 - - def test_init(self): - class Planet(Enum): - MERCURY = (3.303e+23, 2.4397e6) - VENUS = (4.869e+24, 6.0518e6) - EARTH = (5.976e+24, 6.37814e6) - MARS = (6.421e+23, 3.3972e6) - JUPITER = (1.9e+27, 7.1492e7) - SATURN = (5.688e+26, 6.0268e7) - URANUS = (8.686e+25, 2.5559e7) - NEPTUNE = (1.024e+26, 2.4746e7) - def __init__(self, mass, radius): - self.mass = mass # in kilograms - self.radius = radius # in meters - @property - def surface_gravity(self): - # universal gravitational constant (m3 kg-1 s-2) - G = 6.67300E-11 - return G * self.mass / (self.radius * self.radius) - self.assertEqual(round(Planet.EARTH.surface_gravity, 2), 9.80) - self.assertEqual(Planet.EARTH.value, (5.976e+24, 6.37814e6)) - - def test_init_and_shadowing_attribute(self): - class SelectionEnum(str, Enum): - _init_ = 'db user' - def __new__(cls, *args, **kwds): - count = len(cls.__members__) - obj = str.__new__(cls, args[0]) - obj._count = count - obj._value_ = args - return obj - @staticmethod - def _generate_next_value_(name, start, count, values, *args, **kwds): - return (name, ) + args - class DeviceTypeSource(SelectionEnum): - _order_ = 'user system' - user = "User controlled" - system = "System controlled" - self.assertEqual(DeviceTypeSource.system.db, 'system') - self.assertEqual(DeviceTypeSource.system.user, 'System controlled') - self.assertEqual(DeviceTypeSource.user.db, 'user') - self.assertEqual(DeviceTypeSource.user.user, 'User controlled') - - def test_nonhash_value(self): - class AutoNumberInAList(Enum): - def __new__(cls): - value = [len(cls.__members__) + 1] - obj = object.__new__(cls) - obj._value_ = value - return obj - class ColorInAList(AutoNumberInAList): - __order__ = 'red green blue' - red = () - green = () - blue = () - self.assertEqual(list(ColorInAList), [ColorInAList.red, ColorInAList.green, ColorInAList.blue]) - self.assertEqual(ColorInAList.red.value, [1]) - self.assertEqual(ColorInAList([1]), ColorInAList.red) - - def test_number_reset_and_order_cleanup(self): - class Confused(Enum): - _order_ = 'ONE TWO THREE UNO DOS TRES FOUR' - ONE = auto() - TWO = auto() - THREE = auto() - UNO = 1 - DOS = auto() - TRES = auto() - FOUR = auto() - self.assertEqual(list(Confused), [Confused.ONE, Confused.TWO, Confused.THREE, Confused.FOUR]) - self.assertIs(Confused.TWO, Confused.DOS) - self.assertEqual(Confused.DOS._value_, 2) - self.assertEqual(Confused.TRES._value_, 3) - self.assertEqual(Confused.FOUR._value_, 4) - - def test_conflicting_types_resolved_in_new(self): - class LabelledIntEnum(int, Enum): - def __new__(cls, *args): - value, label = args - obj = int.__new__(cls, value) - obj.label = label - obj._value_ = value - return obj - - class LabelledList(LabelledIntEnum): - unprocessed = (1, "Unprocessed") - payment_complete = (2, "Payment Complete") - - self.assertEqual(LabelledList.unprocessed, 1) - self.assertEqual(LabelledList(1), LabelledList.unprocessed) - self.assertEqual(list(LabelledList), [LabelledList.unprocessed, LabelledList.payment_complete]) - - def test_auto_number(self): - class Color(Enum): - _order_ = 'red blue green' - red = auto() - blue = auto() - green = auto() - - self.assertEqual(list(Color), [Color.red, Color.blue, Color.green]) - self.assertEqual(Color.red.value, 1) - self.assertEqual(Color.blue.value, 2) - self.assertEqual(Color.green.value, 3) - - def test_auto_name(self): - class Color(Enum): - _order_ = 'red blue green' - def _generate_next_value_(name, start, count, last): - return name - red = auto() - blue = auto() - green = auto() - - self.assertEqual(list(Color), [Color.red, Color.blue, Color.green]) - self.assertEqual(Color.red.value, 'red') - self.assertEqual(Color.blue.value, 'blue') - self.assertEqual(Color.green.value, 'green') - - def test_auto_name_inherit(self): - class AutoNameEnum(Enum): - def _generate_next_value_(name, start, count, last): - return name - class Color(AutoNameEnum): - _order_ = 'red blue green' - red = auto() - blue = auto() - green = auto() - - self.assertEqual(list(Color), [Color.red, Color.blue, Color.green]) - self.assertEqual(Color.red.value, 'red') - self.assertEqual(Color.blue.value, 'blue') - self.assertEqual(Color.green.value, 'green') - - def test_auto_garbage(self): - class Color(Enum): - _order_ = 'red blue' - red = 'red' - blue = auto() - self.assertEqual(Color.blue.value, 1) - - def test_auto_garbage_corrected(self): - class Color(Enum): - _order_ = 'red blue green' - red = 'red' - blue = 2 - green = auto() - - self.assertEqual(list(Color), [Color.red, Color.blue, Color.green]) - self.assertEqual(Color.red.value, 'red') - self.assertEqual(Color.blue.value, 2) - self.assertEqual(Color.green.value, 3) - - def test_duplicate_auto(self): - # - class MoreDupes(Enum): - _order_ = 'A B C' - A = auto() - B = A, - C = auto() - self.assertEqual(list(MoreDupes), [MoreDupes.A, MoreDupes.B, MoreDupes.C]) - self.assertEqual([m.value for m in MoreDupes], [1, (1, ), 2]) - # - class Dupes(Enum): - _order_ = 'first second third' - first = primero = auto() - second = auto() - third = auto() - self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes)) - - def test_auto_value_with_auto(self): - - class SelectionEnum(Enum): - _init_ = 'db user' - def __new__(cls, *args, **kwds): - count = len(cls.__members__) - obj = object.__new__(cls) - obj._count = count - obj._value_ = args - obj.db, obj.user = args - return obj - @staticmethod - def _generate_next_value_(name, start, count, values, *args, **kwds): - return (name, ) + args - - class Test(SelectionEnum): - _order_ = 'this that' - this = auto('these') - that = auto('those') - - self.assertEqual(list(Test), [Test.this, Test.that]) - self.assertEqual(Test.this.name, 'this') - self.assertEqual(Test.this.value, ('this', 'these')) - self.assertEqual(Test.this.db, 'this') - self.assertEqual(Test.this.user, 'these') - self.assertEqual(Test.that.name, 'that') - self.assertEqual(Test.that.value, ('that', 'those')) - self.assertEqual(Test.that.db, 'that') - self.assertEqual(Test.that.user, 'those') - - def test_auto_value_with_autovalue(self): - - class SelectionEnum(Enum): - _init_ = 'db user' - def __new__(cls, *args, **kwds): - count = len(cls.__members__) - obj = object.__new__(cls) - obj._count = count - obj._value_ = args - return obj - @staticmethod - def _generate_next_value_(name, start, count, values, *args, **kwds): - return (name, ) + args - - class Test(SelectionEnum): - _order_ = 'this that' - this = 'these' - that = 'those' - - self.assertEqual(list(Test), [Test.this, Test.that]) - self.assertEqual(Test.this.name, 'this') - self.assertEqual(Test.this.value, ('this', 'these')) - self.assertEqual(Test.this.db, 'this') - self.assertEqual(Test.this.user, 'these') - self.assertEqual(Test.that.name, 'that') - self.assertEqual(Test.that.value, ('that', 'those')) - self.assertEqual(Test.that.db, 'that') - self.assertEqual(Test.that.user, 'those') - - def test_auto_and_kwds(self): - class Item(Enum): - _order_ = 'A B' - A = auto(size=100, req={'red': True}) - B = auto(size=200, req={'red': False}) - # - def __new__(cls, value, size, req): - obj = object.__new__(cls) - obj._value_ = value - obj.size = size - obj.req= req - return obj - self.assertEqual((Item.A.value, Item.A.size, Item.A.req), (1, 100, {'red': True})) - self.assertEqual((Item.B.value, Item.B.size, Item.B.req), (2, 200, {'red': False})) - - def test_empty_with_functional_api(self): - empty = aenum.IntEnum('Foo', {}) - self.assertEqual(len(empty), 0) - - def test_auto_init(self): - class Planet(Enum): - _init_ = 'mass radius' - MERCURY = (3.303e+23, 2.4397e6) - VENUS = (4.869e+24, 6.0518e6) - EARTH = (5.976e+24, 6.37814e6) - MARS = (6.421e+23, 3.3972e6) - JUPITER = (1.9e+27, 7.1492e7) - SATURN = (5.688e+26, 6.0268e7) - URANUS = (8.686e+25, 2.5559e7) - NEPTUNE = (1.024e+26, 2.4746e7) - @property - def surface_gravity(self): - # universal gravitational constant (m3 kg-1 s-2) - G = 6.67300E-11 - return G * self.mass / (self.radius * self.radius) - self.assertEqual(round(Planet.EARTH.surface_gravity, 2), 9.80) - self.assertEqual(Planet.EARTH.value, (5.976e+24, 6.37814e6)) - - def test_auto_init_with_value(self): - class Color(Enum): - _init_='value, rgb' - RED = 1, (1, 0, 0) - BLUE = 2, (0, 1, 0) - GREEN = 3, (0, 0, 1) - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.BLUE.value, 2) - self.assertEqual(Color.GREEN.value, 3) - self.assertEqual(Color.RED.rgb, (1, 0, 0)) - self.assertEqual(Color.BLUE.rgb, (0, 1, 0)) - self.assertEqual(Color.GREEN.rgb, (0, 0, 1)) - - def test_noalias(self): - class Settings(Enum): - _settings_ = NoAlias - red = 1 - rojo = 1 - self.assertFalse(Settings.red is Settings.rojo) - self.assertRaises(TypeError, Settings, 1) - - def test_auto_and_init(self): - class Field(int, Enum): - _order_ = 'TYPE START' - _init_ = 'value __doc__' - TYPE = "Char, Date, Logical, etc." - START = "Field offset in record" - self.assertEqual(Field.TYPE, 1) - self.assertEqual(Field.START, 2) - self.assertEqual(Field.TYPE.__doc__, 'Char, Date, Logical, etc.') - self.assertEqual(Field.START.__doc__, 'Field offset in record') - - def test_auto_and_start(self): - class Field(IntEnum): - _order_ = 'TYPE START' - _start_ = 0 - _init_ = 'value __doc__' - TYPE = "Char, Date, Logical, etc." - START = "Field offset in record" - self.assertEqual(Field.TYPE, 0) - self.assertEqual(Field.START, 1) - self.assertEqual(Field.TYPE.__doc__, 'Char, Date, Logical, etc.') - self.assertEqual(Field.START.__doc__, 'Field offset in record') - - def test_auto_and_init_and_some_values(self): - class Field(int, Enum): - _order_ = 'TYPE START BLAH BELCH' - _init_ = 'value __doc__' - TYPE = "Char, Date, Logical, etc." - START = "Field offset in record" - BLAH = 5, "test blah" - BELCH = 'test belch' - self.assertEqual(Field.TYPE, 1) - self.assertEqual(Field.START, 2) - self.assertEqual(Field.BLAH, 5) - self.assertEqual(Field.BELCH, 6) - self.assertEqual(Field.TYPE.__doc__, 'Char, Date, Logical, etc.') - self.assertEqual(Field.START.__doc__, 'Field offset in record') - self.assertEqual(Field.BLAH.__doc__, 'test blah') - self.assertEqual(Field.BELCH.__doc__, 'test belch') - - def test_auto_and_init_w_value_and_too_many_values(self): - with self.assertRaisesRegex(TypeError, r'Field\.BLAH: number of fields provided do not match init'): - class Field(int, Enum): - _order_ = 'TYPE START BLAH BELCH' - _init_ = 'value __doc__' - TYPE = 1, "Char, Date, Logical, etc." - START = 2, "Field offset in record" - BLAH = 5, 6, "test blah" - BELCH = 7, 'test belch' - - def test_auto_and_init_and_some_complex_values(self): - class Field(int, Enum): - _order_ = 'TYPE START BLAH BELCH' - _init_ = 'value __doc__ help' - TYPE = "Char, Date, Logical, etc.", "fields composed of character data" - START = "Field offset in record", "where the data starts in the record" - BLAH = 5, "test blah", "some help" - BELCH = 'test belch', "some more help" - self.assertEqual(Field.TYPE, 1) - self.assertEqual(Field.START, 2) - self.assertEqual(Field.BLAH, 5) - self.assertEqual(Field.BELCH, 6) - self.assertEqual(Field.TYPE.__doc__, 'Char, Date, Logical, etc.') - self.assertEqual(Field.START.__doc__, 'Field offset in record') - self.assertEqual(Field.BLAH.__doc__, 'test blah') - self.assertEqual(Field.BELCH.__doc__, 'test belch') - self.assertEqual(Field.TYPE.help, "fields composed of character data") - self.assertEqual(Field.START.help, "where the data starts in the record") - self.assertEqual(Field.BLAH.help, "some help") - self.assertEqual(Field.BELCH.help, "some more help") - - def test_auto_and_init_inherited(self): - class AutoEnum(IntEnum): - _start_ = 0 - _init_ = 'value __doc__' - class Field(AutoEnum): - _order_ = 'TYPE START BLAH BELCH' - TYPE = "Char, Date, Logical, etc." - START = "Field offset in record" - BLAH = 5, "test blah" - BELCH = 'test belch' - self.assertEqual(Field.TYPE, 0) - self.assertEqual(Field.START, 1) - self.assertEqual(Field.BLAH, 5) - self.assertEqual(Field.BELCH, 6) - self.assertEqual(Field.TYPE.__doc__, 'Char, Date, Logical, etc.') - self.assertEqual(Field.START.__doc__, 'Field offset in record') - self.assertEqual(Field.BLAH.__doc__, 'test blah') - self.assertEqual(Field.BELCH.__doc__, 'test belch') - - def test_missing_value_error(self): - with self.assertRaisesRegex(TypeError, r"_value_ not set in __new__"): - class Combined(str, Enum): - # - _init_ = 'value sequence' - _order_ = lambda m: m.sequence - # - def __new__(cls, value, *args): - enum = str.__new__(cls, value) - if '(' in value: - fis_name, segment = value.split('(', 1) - segment = segment.strip(' )') - else: - fis_name = value - segment = None - enum.fis_name = fis_name - enum.segment = segment - return enum - # - def __repr__(self): - return "<%s.%s>" % (self.__class__.__name__, self._name_) - # - key_type = 'An$(1,2)', 0 - company_id = 'An$(3,2)', 1 - code = 'An$(5,1)', 2 - description = 'Bn$', 3 - - - def test_auto_and_enum(self): - class Foo(aenum.Flag): - _order_ = 'a b c' - a = aenum.auto() - b = a | aenum.auto() - c = 2 - - self.assertEqual([Foo.a, Foo.c], list(Foo)) - self.assertEqual(Foo.a.value, 1) - self.assertEqual(Foo.b.value, 3) - - def test_multiple_arg_auto(self): - class AutoName(Enum): - def _generate_next_value_(name, start, count, last, *args, **kwds): - return (name, ) + args - # - class Planet(AutoName): - _init_ = 'value mass radius' - MERCURY = auto(3.303e+23, 2.4397e6) - VENUS = auto(4.869e+24, 6.0518e6) - self.assertEqual(Planet.MERCURY.value, 'MERCURY') - - def test_auto_w_multiple_arg(self): - class AutoName(Enum): - def _generate_next_value_(name, start, count, last, *args, **kwds): - return (name, ) + args - # - class Planet(AutoName): - _init_ = 'value mass radius' - MERCURY = auto(), 3.303e+23, 2.4397e6 # doesn't work - VENUS = auto(), 4.869e+24, 6.0518e6 # doesn't work - self.assertEqual(Planet.MERCURY.value, 'MERCURY') - - def test_auto_gnv_and_init(self): - class AutoName(Enum): - def _generate_next_value_(name, start, count, last, *args, **kwds): - return (name, ) + args - # - class Planet(AutoName): - _init_ = 'value mass radius' - MERCURY = 3.303e+23, 2.4397e6 # doesn't work - VENUS = 4.869e+24, 6.0518e6 # doesn't work - self.assertEqual(Planet.MERCURY.value, 'MERCURY') - - # def test_AutoNumberEnum_and_property(self): - # class Color(aenum.AutoNumberEnum): - # red = () - # green = () - # blue = () - # @property - # def cap_name(self): - # return self.name.title() - # self.assertEqual(Color.blue.cap_name, 'Blue') - - # def test_AutoNumberEnum(self): - # class Color(aenum.AutoNumberEnum): - # _order_ = 'red green blue' - # red = () - # green = () - # blue = () - # self.assertEqual(list(Color), [Color.red, Color.green, Color.blue]) - # self.assertEqual(Color.red.value, 1) - # self.assertEqual(Color.green.value, 2) - # self.assertEqual(Color.blue.value, 3) - - def test_MultiValue_with_init_wo_value(self): - class Color(Enum): - _init_ = 'color r g b' - _order_ = 'red green blue' - _settings_ = MultiValue - red = 'red', 1, 2, 3 - green = 'green', 4, 5, 6 - blue = 'blue', 7, 8, 9 - self.assertEqual(Color.red.value, 'red') - self.assertEqual(Color.red.color, 'red') - self.assertEqual(Color.red.r, 1) - self.assertEqual(Color.red.g, 2) - self.assertEqual(Color.red.b, 3) - self.assertEqual(Color.green.value, 'green') - self.assertEqual(Color.green.color, 'green') - self.assertEqual(Color.green.r, 4) - self.assertEqual(Color.green.g, 5) - self.assertEqual(Color.green.b, 6) - self.assertEqual(Color.blue.value, 'blue') - self.assertEqual(Color.blue.color, 'blue') - self.assertEqual(Color.blue.r, 7) - self.assertEqual(Color.blue.g, 8) - self.assertEqual(Color.blue.b, 9) - self.assertIs(Color('red'), Color.red) - self.assertIs(Color(1), Color.red) - self.assertIs(Color(2), Color.red) - self.assertIs(Color(3), Color.red) - self.assertIs(Color('green'), Color.green) - self.assertIs(Color(4), Color.green) - self.assertIs(Color(5), Color.green) - self.assertIs(Color(6), Color.green) - self.assertIs(Color('blue'), Color.blue) - self.assertIs(Color(7), Color.blue) - self.assertIs(Color(8), Color.blue) - self.assertIs(Color(9), Color.blue) - - def test_MultiValue_with_init_w_value(self): - class Color(Enum): - _init_ = 'value r g b' - _order_ = 'red green blue' - _settings_ = MultiValue - red = 'red', 1, 2, 3 - green = 'green', 4, 5, 6 - blue = 'blue', 7, 8, 9 - self.assertEqual(Color.red.value, 'red') - self.assertEqual(Color.red.r, 1) - self.assertEqual(Color.red.g, 2) - self.assertEqual(Color.red.b, 3) - self.assertEqual(Color.green.value, 'green') - self.assertEqual(Color.green.r, 4) - self.assertEqual(Color.green.g, 5) - self.assertEqual(Color.green.b, 6) - self.assertEqual(Color.blue.value, 'blue') - self.assertEqual(Color.blue.r, 7) - self.assertEqual(Color.blue.g, 8) - self.assertEqual(Color.blue.b, 9) - self.assertIs(Color('red'), Color.red) - self.assertIs(Color(1), Color.red) - self.assertIs(Color(2), Color.red) - self.assertIs(Color(3), Color.red) - self.assertIs(Color('green'), Color.green) - self.assertIs(Color(4), Color.green) - self.assertIs(Color(5), Color.green) - self.assertIs(Color(6), Color.green) - self.assertIs(Color('blue'), Color.blue) - self.assertIs(Color(7), Color.blue) - self.assertIs(Color(8), Color.blue) - self.assertIs(Color(9), Color.blue) - - def test_MultiValue_with_init_wo_value_w_autonumber(self): - class Color(AutoNumberEnum): - _init_ = 'color r g b' - _order_ = 'red green blue' - _settings_ = MultiValue - red = 'red', 10, 20, 30 - green = 'green', 40, 50, 60 - blue = 'blue', 70, 80, 90 - self.assertEqual(Color.red.value, 1) - self.assertEqual(Color.red.color, 'red') - self.assertEqual(Color.red.r, 10) - self.assertEqual(Color.red.g, 20) - self.assertEqual(Color.red.b, 30) - self.assertEqual(Color.green.value, 2) - self.assertEqual(Color.green.color, 'green') - self.assertEqual(Color.green.r, 40) - self.assertEqual(Color.green.g, 50) - self.assertEqual(Color.green.b, 60) - self.assertEqual(Color.blue.value, 3) - self.assertEqual(Color.blue.color, 'blue') - self.assertEqual(Color.blue.r, 70) - self.assertEqual(Color.blue.g, 80) - self.assertEqual(Color.blue.b, 90) - self.assertIs(Color(1), Color.red) - self.assertIs(Color('red'), Color.red) - self.assertIs(Color(10), Color.red) - self.assertIs(Color(20), Color.red) - self.assertIs(Color(30), Color.red) - self.assertIs(Color(2), Color.green) - self.assertIs(Color('green'), Color.green) - self.assertIs(Color(40), Color.green) - self.assertIs(Color(50), Color.green) - self.assertIs(Color(60), Color.green) - self.assertIs(Color(3), Color.blue) - self.assertIs(Color('blue'), Color.blue) - self.assertIs(Color(70), Color.blue) - self.assertIs(Color(80), Color.blue) - self.assertIs(Color(90), Color.blue) - - def test_multivalue_and_autonumber_wo_init_wo_value(self): - class Day(Enum): - _settings_ = MultiValue, AddValue - _order_ = 'one two three' - _start_ = 7 - one = "21", "one" - two = "22", "two" - three = "23", "three" - self.assertEqual(Day.one.value, 7) - self.assertEqual(Day.two.value, 8) - self.assertEqual(Day.three.value, 9) - self.assertEqual(Day('21'), Day.one) - self.assertEqual(Day('one'), Day.one) - - def test_multivalue_and_autonumber_wo_init_w_some_value(self): - class Color(Enum): - _settings_ = MultiValue, Unique - _order_ = 'BLACK RED BLUE YELLOW GREEN MAGENTA' - _init_ = "value description" - BLACK = -1, "Text0" - RED = -50, "Text1" - BLUE = auto(), "Text2" - YELLOW = auto(), "Text3" - GREEN = -70, "Text4" - MAGENTA = auto(), "Text5" - self.assertEqual(Color.BLACK.value, -1) - self.assertEqual(Color.RED.value, -50) - self.assertEqual(Color.BLUE.value, -49) - self.assertEqual(Color.YELLOW.value, -48) - self.assertEqual(Color.GREEN.value, -70) - self.assertEqual(Color.MAGENTA.value, -69) - self.assertEqual(Color(-1), Color.BLACK) - self.assertEqual(Color('Text2'), Color.BLUE) - - def test_combine_new_settings_with_old_settings(self): - class Auto(Enum): - _settings_ = Unique - with self.assertRaises(ValueError): - class AutoUnique(Auto): - BLAH = auto() - BLUH = auto() - ICK = 1 - - def test_timedelta(self): - class Period(timedelta, Enum): - ''' - different lengths of time - ''' - _init_ = 'value period' - _settings_ = NoAlias - _ignore_ = 'Period i' - Period = vars() - for i in range(31): - Period['day_%d' % i] = i, 'day' - for i in range(15): - Period['week_%d' % i] = i*7, 'week' - for i in range(12): - Period['month_%d' % i] = i*30, 'month' - OneDay = day_1 - OneWeek = week_1 - self.assertFalse(hasattr(Period, '_ignore_')) - self.assertFalse(hasattr(Period, 'Period')) - self.assertFalse(hasattr(Period, 'i')) - self.assertTrue(isinstance(Period.day_1, timedelta)) - - def test_skip(self): - class enumA(Enum): - @skip - class enumB(Enum): - elementA = 'a' - elementB = 'b' - @skip - class enumC(Enum): - elementC = 'c' - elementD = 'd' - self.assertIs(enumA.enumB, enumA.__dict__['enumB']) - - def test_nonmember(self): - class enumA(Enum): - @nonmember - class enumB(Enum): - elementA = 'a' - elementB = 'b' - @nonmember - class enumC(Enum): - elementC = 'c' - elementD = 'd' - self.assertIs(enumA.enumB, enumA.__dict__['enumB']) - - def test_member_with_external_functions(self): - class Func(Enum): - _order_ = 'an_int a_str' - an_int = member(int) - a_str = member(str) - @classproperty - def types(cls): - return [m.value for m in list(cls)] - def __repr__(self): - return "<%s.%s>" % (self.__class__.__name__, self.name, ) - def __call__(self, *args, **kwds): - return self.value(*args, **kwds) - # - self.assertEqual([Func.an_int, Func.a_str], list(Func)) - self.assertEqual([int, str], Func.types) - self.assertEqual(Func.an_int(7), 7) - self.assertEqual(Func.a_str('BlahBlah'), 'BlahBlah') - - def test_member_with_internal_functions(self): - class Func(Enum): - _order_ = 'haha hehe' - @member - def haha(): - return 'haha' - @member - def hehe(name): - return 'hehe -- what a name! %s!' % name - @classproperty - def types(cls): - return [m.value for m in list(cls)] - def __repr__(self): - return "<%s.%s>" % (self.__class__.__name__, self.name, ) - def __call__(self, *args, **kwds): - return self.value(*args, **kwds) - # - self.assertEqual([Func.haha, Func.hehe], list(Func)) - self.assertEqual([Func.haha.value, Func.hehe.value], Func.types) - self.assertEqual(Func.haha(), 'haha') - self.assertEqual(Func.hehe('BlahBlah'), 'hehe -- what a name! BlahBlah!') - - def test_constantness_of_constants(self): - class Universe(Enum): - PI = constant(3.141596) - G = constant(6.67300E-11) - self.assertEqual(Universe.PI, 3.141596) - self.assertRaisesRegex(AttributeError, r'cannot rebind constant', setattr, Universe, 'PI', 9) - self.assertRaisesRegex(AttributeError, r'cannot delete constant', delattr, Universe, 'PI') - - def test_math_and_stuff_with_constants(self): - class Universe(Enum): - PI = constant(3.141596) - TAU = constant(2 * PI) - self.assertEqual(Universe.PI, 3.141596) - self.assertEqual(Universe.TAU, 2 * Universe.PI) - - def test_constant_with_auto_is_updated(self): - class Fruit(Flag): - _order_ = 'apple banana lemon orange' - apple = auto() - banana = auto() - lemon = auto() - orange = auto() - CitrusTypes = constant(lemon | orange) - self.assertEqual(list(Fruit), [Fruit.apple, Fruit.banana, Fruit.lemon, Fruit.orange]) - self.assertEqual(list(Fruit.CitrusTypes), [Fruit.lemon, Fruit.orange]) - self.assertTrue(Fruit.orange in Fruit.CitrusTypes) - - - def test_order_as_function(self): - # first with _init_ - class TestSequence(Enum): - _init_ = 'value, sequence' - _order_ = lambda member: member.sequence - item_id = 'An$(1,6)', 0 # Item Code - company_id = 'An$(7,2)', 1 # Company Code - warehouse_no = 'An$(9,4)', 2 # Warehouse Number - company = 'Hn$(13,6)', 3 # 4 SPACES + COMPANY - key_type = 'Cn$(19,3)', 4 # Key Type = '1**' - available = 'Zn$(1,1)', 5 # Available? - contract_item = 'Bn(2,1)', 6 # Contract Item? - sales_category = 'Fn', 7 # Sales Category - gl_category = 'Rn$(5,1)', 8 # G/L Category - warehouse_category = 'Sn$(6,1)', 9 # Warehouse Category - inv_units = 'Qn$(7,2)', 10 # Inv Units - for i, member in enumerate(TestSequence): - self.assertEqual(i, member.sequence) - ts = TestSequence - self.assertEqual(ts.item_id.name, 'item_id') - self.assertEqual(ts.item_id.value, 'An$(1,6)') - self.assertEqual(ts.item_id.sequence, 0) - self.assertEqual(ts.company_id.name, 'company_id') - self.assertEqual(ts.company_id.value, 'An$(7,2)') - self.assertEqual(ts.company_id.sequence, 1) - self.assertEqual(ts.warehouse_no.name, 'warehouse_no') - self.assertEqual(ts.warehouse_no.value, 'An$(9,4)') - self.assertEqual(ts.warehouse_no.sequence, 2) - self.assertEqual(ts.company.name, 'company') - self.assertEqual(ts.company.value, 'Hn$(13,6)') - self.assertEqual(ts.company.sequence, 3) - self.assertEqual(ts.key_type.name, 'key_type') - self.assertEqual(ts.key_type.value, 'Cn$(19,3)') - self.assertEqual(ts.key_type.sequence, 4) - self.assertEqual(ts.available.name, 'available') - self.assertEqual(ts.available.value, 'Zn$(1,1)') - self.assertEqual(ts.available.sequence, 5) - self.assertEqual(ts.contract_item.name, 'contract_item') - self.assertEqual(ts.contract_item.value, 'Bn(2,1)') - self.assertEqual(ts.contract_item.sequence, 6) - self.assertEqual(ts.sales_category.name, 'sales_category') - self.assertEqual(ts.sales_category.value, 'Fn') - self.assertEqual(ts.sales_category.sequence, 7) - self.assertEqual(ts.gl_category.name, 'gl_category') - self.assertEqual(ts.gl_category.value, 'Rn$(5,1)') - self.assertEqual(ts.gl_category.sequence, 8) - self.assertEqual(ts.warehouse_category.name, 'warehouse_category') - self.assertEqual(ts.warehouse_category.value, 'Sn$(6,1)') - self.assertEqual(ts.warehouse_category.sequence, 9) - self.assertEqual(ts.inv_units.name, 'inv_units') - self.assertEqual(ts.inv_units.value, 'Qn$(7,2)') - self.assertEqual(ts.inv_units.sequence, 10) - # and then without - class TestSequence(Enum): - _order_ = lambda member: member.value[1] - item_id = 'An$(1,6)', 0 # Item Code - company_id = 'An$(7,2)', 1 # Company Code - warehouse_no = 'An$(9,4)', 2 # Warehouse Number - company = 'Hn$(13,6)', 3 # 4 SPACES + COMPANY - key_type = 'Cn$(19,3)', 4 # Key Type = '1**' - available = 'Zn$(1,1)', 5 # Available? - contract_item = 'Bn(2,1)', 6 # Contract Item? - sales_category = 'Fn', 7 # Sales Category - gl_category = 'Rn$(5,1)', 8 # G/L Category - warehouse_category = 'Sn$(6,1)', 9 # Warehouse Category - inv_units = 'Qn$(7,2)', 10 # Inv Units - for i, member in enumerate(TestSequence): - self.assertEqual(i, member.value[1]) - ts = TestSequence - self.assertEqual(ts.item_id.name, 'item_id') - self.assertEqual(ts.item_id.value, ('An$(1,6)', 0)) - self.assertEqual(ts.company_id.name, 'company_id') - self.assertEqual(ts.company_id.value, ('An$(7,2)', 1)) - self.assertEqual(ts.warehouse_no.name, 'warehouse_no') - self.assertEqual(ts.warehouse_no.value, ('An$(9,4)', 2)) - self.assertEqual(ts.company.name, 'company') - self.assertEqual(ts.company.value, ('Hn$(13,6)', 3)) - self.assertEqual(ts.key_type.name, 'key_type') - self.assertEqual(ts.key_type.value, ('Cn$(19,3)', 4)) - self.assertEqual(ts.available.name, 'available') - self.assertEqual(ts.available.value, ('Zn$(1,1)', 5)) - self.assertEqual(ts.contract_item.name, 'contract_item') - self.assertEqual(ts.contract_item.value, ('Bn(2,1)', 6)) - self.assertEqual(ts.sales_category.name, 'sales_category') - self.assertEqual(ts.sales_category.value, ('Fn', 7)) - self.assertEqual(ts.gl_category.name, 'gl_category') - self.assertEqual(ts.gl_category.value, ('Rn$(5,1)', 8)) - self.assertEqual(ts.warehouse_category.name, 'warehouse_category') - self.assertEqual(ts.warehouse_category.value, ('Sn$(6,1)', 9)) - self.assertEqual(ts.inv_units.name, 'inv_units') - self.assertEqual(ts.inv_units.value, ('Qn$(7,2)', 10)) - # then with _init_ but without value - with self.assertRaises(TypeError): - class TestSequence(Enum): - _init_ = 'sequence' - _order_ = lambda member: member.sequence - item_id = 'An$(1,6)', 0 # Item Code - company_id = 'An$(7,2)', 1 # Company Code - warehouse_no = 'An$(9,4)', 2 # Warehouse Number - company = 'Hn$(13,6)', 3 # 4 SPACES + COMPANY - key_type = 'Cn$(19,3)', 4 # Key Type = '1**' - available = 'Zn$(1,1)', 5 # Available? - contract_item = 'Bn(2,1)', 6 # Contract Item? - sales_category = 'Fn', 7 # Sales Category - gl_category = 'Rn$(5,1)', 8 # G/L Category - warehouse_category = 'Sn$(6,1)', 9 # Warehouse Category - inv_units = 'Qn$(7,2)', 10 # Inv Units - # finally, out of order so Python 3 barfs - with self.assertRaises(TypeError): - class TestSequence(Enum): - _init_ = 'sequence' - _order_ = lambda member: member.sequence - item_id = 'An$(1,6)', 0 # Item Code - warehouse_no = 'An$(9,4)', 2 # Warehouse Number - company = 'Hn$(13,6)', 3 # 4 SPACES + COMPANY - company_id = 'An$(7,2)', 1 # Company Code - inv_units = 'Qn$(7,2)', 10 # Inv Units - available = 'Zn$(1,1)', 5 # Available? - contract_item = 'Bn(2,1)', 6 # Contract Item? - sales_category = 'Fn', 7 # Sales Category - key_type = 'Cn$(19,3)', 4 # Key Type = '1**' - gl_category = 'Rn$(5,1)', 8 # G/L Category - warehouse_category = 'Sn$(6,1)', 9 # Warehouse Category - - def test_order_as_function_in_subclass(self): - # - class Parent(Enum): - _init_ = 'value sequence' - _order_ = lambda m: m.sequence - # - class Child(Parent): - item_id = 'An$(1,6)', 0 # Item Code - company_id = 'An$(7,2)', 1 # Company Code - warehouse_no = 'An$(9,4)', 2 # Warehouse Number - company = 'Hn$(13,6)', 3 # 4 SPACES + COMPANY - key_type = 'Cn$(19,3)', 4 # Key Type = '1**' - available = 'Zn$(1,1)', 5 # Available? - contract_item = 'Bn(2,1)', 6 # Contract Item? - sales_category = 'Fn', 7 # Sales Category - gl_category = 'Rn$(5,1)', 8 # G/L Category - warehouse_category = 'Sn$(6,1)', 9 # Warehouse Category - inv_units = 'Qn$(7,2)', 10 # Inv Units - # - for i, member in enumerate(Child): - self.assertEqual(i, member.sequence) - # - ts = Child - self.assertEqual(ts.item_id.name, 'item_id') - self.assertEqual(ts.item_id.value, 'An$(1,6)') - self.assertEqual(ts.item_id.sequence, 0) - self.assertEqual(ts.company_id.name, 'company_id') - self.assertEqual(ts.company_id.value, 'An$(7,2)') - self.assertEqual(ts.company_id.sequence, 1) - self.assertEqual(ts.warehouse_no.name, 'warehouse_no') - self.assertEqual(ts.warehouse_no.value, 'An$(9,4)') - self.assertEqual(ts.warehouse_no.sequence, 2) - self.assertEqual(ts.company.name, 'company') - self.assertEqual(ts.company.value, 'Hn$(13,6)') - self.assertEqual(ts.company.sequence, 3) - self.assertEqual(ts.key_type.name, 'key_type') - self.assertEqual(ts.key_type.value, 'Cn$(19,3)') - self.assertEqual(ts.key_type.sequence, 4) - self.assertEqual(ts.available.name, 'available') - self.assertEqual(ts.available.value, 'Zn$(1,1)') - self.assertEqual(ts.available.sequence, 5) - self.assertEqual(ts.contract_item.name, 'contract_item') - self.assertEqual(ts.contract_item.value, 'Bn(2,1)') - self.assertEqual(ts.contract_item.sequence, 6) - self.assertEqual(ts.sales_category.name, 'sales_category') - self.assertEqual(ts.sales_category.value, 'Fn') - self.assertEqual(ts.sales_category.sequence, 7) - self.assertEqual(ts.gl_category.name, 'gl_category') - self.assertEqual(ts.gl_category.value, 'Rn$(5,1)') - self.assertEqual(ts.gl_category.sequence, 8) - self.assertEqual(ts.warehouse_category.name, 'warehouse_category') - self.assertEqual(ts.warehouse_category.value, 'Sn$(6,1)') - self.assertEqual(ts.warehouse_category.sequence, 9) - self.assertEqual(ts.inv_units.name, 'inv_units') - self.assertEqual(ts.inv_units.value, 'Qn$(7,2)') - self.assertEqual(ts.inv_units.sequence, 10) - - pass - - def test_multiple_mixin(self): - class MaxMixin(object): - @classproperty - def MAX(cls): - max = len(cls) - cls.MAX = max - return max - class StrMixin(object): - def __str__(self): - return self._name_.lower() - class SomeEnum(Enum): - def behavior(self): - return 'booyah' - class AnotherEnum(Enum): - def behavior(self): - return 'nuhuh!' - def social(self): - return "what's up?" - class Color(MaxMixin, Enum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 3) - self.assertEqual(Color.MAX, 3) - self.assertEqual(str(Color.BLUE), 'Color.BLUE') - class Color(MaxMixin, StrMixin, Enum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 3) - self.assertEqual(Color.MAX, 3) - self.assertEqual(str(Color.BLUE), 'blue', '%r is not %r' % (str(Color.BLUE), 'blue')) - class Color(StrMixin, MaxMixin, Enum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 3) - self.assertEqual(Color.MAX, 3) - self.assertEqual(str(Color.BLUE), 'blue', '%r is not %r' % (str(Color.BLUE), 'blue')) - class CoolColor(StrMixin, SomeEnum, Enum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(CoolColor.RED.value, 1) - self.assertEqual(CoolColor.GREEN.value, 2) - self.assertEqual(CoolColor.BLUE.value, 3) - self.assertEqual(str(CoolColor.BLUE), 'blue', '%r is not %r' % (str(Color.BLUE), 'blue')) - self.assertEqual(CoolColor.RED.behavior(), 'booyah') - class CoolerColor(StrMixin, AnotherEnum, Enum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(CoolerColor.RED.value, 1) - self.assertEqual(CoolerColor.GREEN.value, 2) - self.assertEqual(CoolerColor.BLUE.value, 3) - self.assertEqual(str(CoolerColor.BLUE), 'blue', '%r is not %r' % (str(Color.BLUE), 'blue')) - self.assertEqual(CoolerColor.RED.behavior(), 'nuhuh!') - self.assertEqual(CoolerColor.RED.social(), "what's up?") - class CoolestColor(StrMixin, SomeEnum, AnotherEnum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(CoolestColor.RED.value, 1) - self.assertEqual(CoolestColor.GREEN.value, 2) - self.assertEqual(CoolestColor.BLUE.value, 3) - self.assertEqual(str(CoolestColor.BLUE), 'blue', '%r is not %r' % (str(Color.BLUE), 'blue')) - self.assertEqual(CoolestColor.RED.behavior(), 'booyah') - self.assertEqual(CoolestColor.RED.social(), "what's up?") - class ConfusedColor(StrMixin, AnotherEnum, SomeEnum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(ConfusedColor.RED.value, 1) - self.assertEqual(ConfusedColor.GREEN.value, 2) - self.assertEqual(ConfusedColor.BLUE.value, 3) - self.assertEqual(str(ConfusedColor.BLUE), 'blue', '%r is not %r' % (str(Color.BLUE), 'blue')) - self.assertEqual(ConfusedColor.RED.behavior(), 'nuhuh!') - self.assertEqual(ConfusedColor.RED.social(), "what's up?") - class ReformedColor(StrMixin, IntEnum, SomeEnum, AnotherEnum): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(ReformedColor.RED.value, 1) - self.assertEqual(ReformedColor.GREEN.value, 2) - self.assertEqual(ReformedColor.BLUE.value, 3) - self.assertEqual(str(ReformedColor.BLUE), 'blue', '%r is not %r' % (str(Color.BLUE), 'blue')) - self.assertEqual(ReformedColor.RED.behavior(), 'booyah') - self.assertEqual(ConfusedColor.RED.social(), "what's up?") - self.assertTrue(issubclass(ReformedColor, int)) - - def test_multiple_inherited_mixin(self): - @unique - class Decision1(StrEnum): - REVERT = "REVERT" - REVERT_ALL = "REVERT_ALL" - RETRY = "RETRY" - class MyEnum(StrEnum): - pass - @unique - class Decision2(MyEnum): - REVERT = "REVERT" - REVERT_ALL = "REVERT_ALL" - RETRY = "RETRY" - - def test_value_auto_assign(self): - class Some(Enum): - def __new__(cls, val): - return object.__new__(cls) - x = 1 - y = 2 - self.assertEqual(Some.x.value, 1) - self.assertEqual(Some.y.value, 2) - - def test_enum_of_types(self): - """Support using Enum to refer to types deliberately.""" - class MyTypes(Enum): - i = int - f = float - s = str - self.assertEqual(MyTypes.i.value, int) - self.assertEqual(MyTypes.f.value, float) - self.assertEqual(MyTypes.s.value, str) - class Foo: - pass - class Bar: - pass - class MyTypes2(Enum): - a = Foo - b = Bar - self.assertEqual(MyTypes2.a.value, Foo) - self.assertEqual(MyTypes2.b.value, Bar) - class SpamEnumNotInner: - pass - class SpamEnum(Enum): - spam = SpamEnumNotInner - self.assertEqual(SpamEnum.spam.value, SpamEnumNotInner) - - if PY2: - def test_nested_classes_in_enum_do_become_members(self): - # manually set __qualname__ to remove testing framework noise - class Outer(Enum): - _order_ = 'a b Inner' - __qualname__ = "Outer" - a = 1 - b = 2 - class Inner(Enum): - __qualname__ = "Outer.Inner" - foo = 10 - bar = 11 - self.assertTrue(isinstance(Outer.Inner, Outer)) - self.assertEqual(Outer.a.value, 1) - self.assertEqual(Outer.Inner.value.foo.value, 10) - self.assertEqual( - list(Outer.Inner.value), - [Outer.Inner.value.foo, Outer.Inner.value.bar], - ) - self.assertEqual( - list(Outer), - [Outer.a, Outer.b, Outer.Inner], - ) - - def test_really_nested_classes_in_enum_do_become_members(self): - class Outer(Enum): - _order_ = 'a b Inner' - a = 1 - b = 2 - class Inner(Enum): - foo = 10 - bar = 11 - self.assertTrue(isinstance(Outer.Inner, Outer)) - self.assertEqual(Outer.a.value, 1) - self.assertEqual(Outer.Inner.value.foo.value, 10) - self.assertEqual( - list(Outer.Inner.value), - [Outer.Inner.value.foo, Outer.Inner.value.bar], - ) - self.assertEqual( - list(Outer), - [Outer.a, Outer.b, Outer.Inner], - ) - - def test_nested_classes_in_enum_are_skipped_with_skip(self): - """Support locally-defined nested classes using @skip""" - # manually set __qualname__ to remove testing framework noise - class Outer(Enum): - __qualname__ = "Outer" - a = 1 - b = 2 - @skip - class Inner(Enum): - __qualname__ = "Outer.Inner" - foo = 10 - bar = 11 - self.assertTrue(isinstance(Outer.Inner, type)) - self.assertEqual(Outer.a.value, 1) - self.assertEqual(Outer.Inner.foo.value, 10) - self.assertEqual( - list(Outer.Inner), - [Outer.Inner.foo, Outer.Inner.bar], - ) - self.assertEqual( - list(Outer), - [Outer.a, Outer.b], - ) - - def test_really_nested_classes_in_enum_are_skipped_with_skip(self): - """Support locally-defined nested classes using @skip""" - class Outer(Enum): - a = 1 - b = 2 - @skip - class Inner(Enum): - foo = 10 - bar = 11 - self.assertTrue(isinstance(Outer.Inner, type)) - self.assertEqual(Outer.a.value, 1) - self.assertEqual(Outer.Inner.foo.value, 10) - self.assertEqual( - list(Outer.Inner), - [Outer.Inner.foo, Outer.Inner.bar], - ) - self.assertEqual( - list(Outer), - [Outer.a, Outer.b], - ) - - def test_enum_call_without_arg(self): - class Color(Enum): - black = 0 - red = 1 - green = 2 - blue = 3 - # - @classmethod - def _missing_value_(cls, value): - if value is no_arg: - return cls.black - self.assertTrue(Color.red is Color(1)) - self.assertTrue(Color.black is Color()) - - def test_init_subclass(self): - class MyEnum(Enum): - def __init_subclass__(cls, **kwds): - super(MyEnum, cls).__init_subclass__(**kwds) - self.assertFalse(cls.__dict__.get('_test', False)) - cls._test1 = 'MyEnum' - # - class TheirEnum(MyEnum): - def __init_subclass__(cls, **kwds): - super(TheirEnum, cls).__init_subclass__(**kwds) - cls._test2 = 'TheirEnum' - class WhoseEnum(TheirEnum): - def __init_subclass__(cls, **kwds): - pass - class NoEnum(WhoseEnum): - ONE = 1 - self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum') - self.assertFalse(NoEnum.__dict__.get('_test1', False)) - self.assertFalse(NoEnum.__dict__.get('_test2', False)) - # - class OurEnum(MyEnum): - def __init_subclass__(cls, **kwds): - cls._test2 = 'OurEnum' - class WhereEnum(OurEnum): - def __init_subclass__(cls, **kwds): - pass - class NeverEnum(WhereEnum): - ONE = 'one' - self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum') - self.assertFalse(WhereEnum.__dict__.get('_test1', False)) - self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum') - self.assertFalse(NeverEnum.__dict__.get('_test1', False)) - self.assertFalse(NeverEnum.__dict__.get('_test2', False)) - - -class TestStrEnum(TestCase): - - def test_set_name(self): - class Descriptor(object): - name = None - def __get__(self, instance, owner_class=None): - if instance is None: - return self - else: - return instance.__dict__[self.name] - def __set__(self, instance, value): - instance.__dict__[self.name] = value - def __set_name__(self, owner, name): - self.name = name - # - class AnEnum(Enum): - ONE = 'one' - two = Descriptor() - # - self.assertEqual(list(AnEnum), [AnEnum.ONE]) - self.assertEqual(AnEnum.two.name, 'two') - AnEnum.ONE.two = 'three' - self.assertEqual(AnEnum.ONE.two, 'three') - self.assertEqual(AnEnum.ONE.__dict__['two'], 'three') - - def test_private_names(self): - class Private(Enum): - __corporal = 'Radar' - __major_ = 'Hoolihan' - self.assertEqual(len(Private), 0) - self.assertEqual(Private._Private__corporal, 'Radar') - self.assertFalse(isinstance(Private._Private__corporal, Enum)) - self.assertEqual(Private._Private__major_, 'Hoolihan') - self.assertFalse(isinstance(Private._Private__major_, Enum)) - - def test_strenum_inherited_methods(self): - class phy(StrEnum): - pi = 'Pi' - tau = 'Tau' - self.assertTrue(phy.pi < phy.tau) - self.assertEqual(phy.pi.upper(), 'PI') - self.assertEqual(phy.tau.count('a'), 1) - - def test_strict_strenum(self): - for uhoh in (object, object(), [], Enum, 9): - with self.assertRaisesRegex(TypeError, r'values must be str'): - class Huh(StrEnum): - huh = uhoh - class Either(StrEnum): - _order_ = 'this that Those lower upper' - this = auto() - that = 'That' - Those = auto() - lower = 'lower' - upper = 'UPPER' - self.assertEqual([m.value for m in Either], ['this', 'That', 'those', 'lower', 'UPPER']) - # - with self.assertRaisesRegex(ValueError, r' is not lower-case'): - class Huh(LowerStrEnum): - huh = 'What' - # - class Lower(LowerStrEnum): - _order_ = 'this that Those lower upper' - this = auto() - that = 'that' - Those = auto() - lower = 'lower' - upper = 'upper' - self.assertEqual([m.value for m in Lower], ['this', 'that', 'those', 'lower', 'upper']) - # - with self.assertRaisesRegex(ValueError, r' is not upper-case'): - class Huh(UpperStrEnum): - huh = 'What' - # - class Upper(UpperStrEnum): - _order_ = 'this that Those lower upper' - this = auto() - that = 'THAT' - Those = auto() - lower = 'LOWER' - upper = 'UPPER' - self.assertEqual([m.value for m in Upper], ['THIS', 'THAT', 'THOSE', 'LOWER', 'UPPER']) - - def test_init_subclass(self): - class MyEnum(StrEnum): - def __init_subclass__(cls, **kwds): - super(MyEnum, cls).__init_subclass__(**kwds) - self.assertFalse(cls.__dict__.get('_test', False)) - cls._test1 = 'MyEnum' - # - class TheirEnum(MyEnum): - def __init_subclass__(cls, **kwds): - super(TheirEnum, cls).__init_subclass__(**kwds) - cls._test2 = 'TheirEnum' - class WhoseEnum(TheirEnum): - def __init_subclass__(cls, **kwds): - pass - class NoEnum(WhoseEnum): - ONE = 'one' - self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum') - self.assertFalse(NoEnum.__dict__.get('_test1', False)) - self.assertFalse(NoEnum.__dict__.get('_test2', False)) - # - class OurEnum(MyEnum): - def __init_subclass__(cls, **kwds): - cls._test2 = 'OurEnum' - class WhereEnum(OurEnum): - def __init_subclass__(cls, **kwds): - pass - class NeverEnum(WhereEnum): - ONE = 'one' - self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum') - self.assertFalse(WhereEnum.__dict__.get('_test1', False)) - self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum') - self.assertFalse(NeverEnum.__dict__.get('_test1', False)) - self.assertFalse(NeverEnum.__dict__.get('_test2', False)) - - -class TestFlag(TestCase): - """Tests of the Flags.""" - - def setUp(self): - class Perm(Flag): - _order_ = 'R W X' - R, W, X = 4, 2, 1 - self.Perm = Perm - # - class Color(Flag): - BLACK = 0 - RED = 1 - ROJO = 1 - GREEN = 2 - BLUE = 4 - PURPLE = RED|BLUE - WHITE = RED|GREEN|BLUE - BLANCO = RED|GREEN|BLUE - self.Color = Color - # - class Fun(Flag): - _order_ = 'ONE TWO FOUR EIGHT' - ONE = auto() - TWO = auto() - THREE = ONE | TWO - FOUR = auto() - FIVE = FOUR | ONE - SIX = FOUR | TWO - SEVEN = FOUR | TWO | ONE - EIGHT = auto() - self.Fun = Fun - # - class TermColor(str, Flag): - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - # - @classmethod - def _create_pseudo_member_values_(cls, members, *values): - code = ';'.join(m.code for m in members) - return values + (code, ) - # - AllReset = '0' # ESC [ 0 m # reset all (colors and brightness) - Bright = '1' # ESC [ 1 m # bright - Dim = '2' # ESC [ 2 m # dim (looks same as normal brightness) - Underline = '4' - Normal = '22' # ESC [ 22 m # normal brightness - # - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Yellow = '33' # ESC [ 33 m # yellow - FG_Blue = '34' # ESC [ 34 m # blue - FG_Magenta = '35' # ESC [ 35 m # magenta - FG_Cyan = '36' # ESC [ 36 m # cyan - FG_White = '37' # ESC [ 37 m # white - FG_Reset = '39' # ESC [ 39 m # reset - # - BG_Black = '40' # ESC [ 30 m # black - BG_Red = '41' # ESC [ 31 m # red - BG_Green = '42' # ESC [ 32 m # green - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Blue = '44' # ESC [ 34 m # blue - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - BG_Reset = '49' # ESC [ 39 m # reset - # - __str__ = str.__str__ - # - def __repr__(self): - if self._name_ is not None: - return '<%s.%s>' % (self.__class__.__name__, self._name_) - else: - return '<%s: %s>' % (self.__class__.__name__, '|'.join([m.name for m in Flag.__iter__(self)])) - # - def __enter__(self): - print(self.AllReset, end='', verbose=0) - return self - # - def __exit__(self, *args): - print(self.AllReset, end='', verbose=0) - self.TermColor = TermColor - # - class Open(Flag): - RO = 0 - WO = 1 - RW = 2 - AC = 3 - CE = 1<<19 - self.Open = Open - - def test_set_name(self): - class Descriptor(object): - name = None - def __get__(self, instance, owner_class=None): - if instance is None: - return self - else: - return instance.__dict__[self.name] - def __set__(self, instance, value): - instance.__dict__[self.name] = value - def __set_name__(self, owner, name): - self.name = name - # - class AnEnum(Enum): - ONE = 1 - two = Descriptor() - # - self.assertEqual(list(AnEnum), [AnEnum.ONE]) - self.assertEqual(AnEnum.two.name, 'two') - AnEnum.ONE.two = 'three' - self.assertEqual(AnEnum.ONE.two, 'three') - self.assertEqual(AnEnum.ONE.__dict__['two'], 'three') - - def test_new_with_keywords(self): - class Huh(IntFlag): - __order__ = 'PLAIN BOLD_ITALIC HIGHLIGHT' - def __new__(cls, docstring, open=None, close=None): - if cls.__members__: - value = 2 ** (len(cls.__members__)-1) - else: - value = 0 - member = int.__new__(cls, value) - if open and close is None: - close = open - member.open = open - member.close = close - member.__doc__ = docstring - member._value_ = value - return member - PLAIN = 'normal' - BOLD_ITALIC = '***really super important***', '***' - HIGHLIGHT = 'please ==take notice==', '==', '==' - p = Huh.PLAIN - self.assertTrue(type(p) is Huh, type(p)) - self.assertEqual( - (p.value, p.__doc__, p.open, p.close), - (0, 'normal', None, None), - ) - bi = Huh.BOLD_ITALIC - self.assertEqual( - (bi.value, bi.__doc__, bi.open, bi.close), - (1, '***really super important***', '***', '***'), - ) - h = Huh.HIGHLIGHT - self.assertEqual( - (h.value, h.__doc__, h.open, h.close), - (2, 'please ==take notice==', '==', '=='), - ) - - def test_private_names(self): - class Private(Enum): - __corporal = 'Radar' - __major_ = 'Hoolihan' - self.assertEqual(len(Private), 0) - self.assertEqual(Private._Private__corporal, 'Radar') - self.assertFalse(isinstance(Private._Private__corporal, Enum)) - self.assertEqual(Private._Private__major_, 'Hoolihan') - self.assertFalse(isinstance(Private._Private__major_, Enum)) - - def test_auto_alias(self): - Fun = self.Fun - self.assertEqual( - list(Fun), - [Fun.ONE, Fun.TWO, Fun.FOUR, Fun.EIGHT], - ) - self.assertEqual(Fun.THREE._value_, 3) - self.assertEqual(repr(Fun.SEVEN), '<Fun.SEVEN: 7>') - self.assertEqual(list(Fun.SEVEN), [Fun.ONE, Fun.TWO, Fun.FOUR]) - - def test_str_is_str_str(self): - red, white = self.TermColor.FG_Red, self.TermColor.BG_White - barber = red | white - self.assertEqual(barber, '\x1b[31;47m') - self.assertEqual(barber.value, red.value | white.value) - self.assertEqual(barber.code, ';'.join([red.code, white.code])) - self.assertEqual(repr(barber), '<TermColor.FG_Red|BG_White>') - self.assertEqual(str(barber), '\x1b[31;47m') - - def test_membership(self): - Color = self.Color - Open = self.Open - self.assertRaises(TypeError, lambda: 'BLACK' in Color) - self.assertRaises(TypeError, lambda: 'RO' in Open) - self.assertTrue(Color.BLACK in Color) - self.assertTrue(Open.RO in Open) - self.assertFalse(Color.BLACK in Open) - self.assertFalse(Open.RO in Color) - self.assertRaises(TypeError, lambda: 0 in Color) - self.assertRaises(TypeError, lambda: 0 in Open) - - def test_member_contains(self): - Color = self.Color - self.assertRaises(TypeError, lambda: 'test' in Color.BLUE) - self.assertRaises(TypeError, lambda: 2 in Color.BLUE) - self.assertTrue(Color.BLUE in Color.BLUE) - self.assertTrue(Color.BLUE in Color['RED|GREEN|BLUE']) - - def test_member_length(self): - self.assertEqual(self.Color.__len__(self.Color.BLACK), 0) - self.assertEqual(self.Color.__len__(self.Color.GREEN), 1) - self.assertEqual(self.Color.__len__(self.Color.PURPLE), 2) - self.assertEqual(self.Color.__len__(self.Color.BLANCO), 3) - - def test_number_reset_and_order_cleanup(self): - class Confused(Flag): - _order_ = 'ONE TWO FOUR DOS EIGHT SIXTEEN' - ONE = auto() - TWO = auto() - FOUR = auto() - DOS = 2 - EIGHT = auto() - SIXTEEN = auto() - self.assertEqual( - list(Confused), - [Confused.ONE, Confused.TWO, Confused.FOUR, Confused.EIGHT, Confused.SIXTEEN]) - self.assertIs(Confused.TWO, Confused.DOS) - self.assertEqual(Confused.DOS._value_, 2) - self.assertEqual(Confused.EIGHT._value_, 8) - self.assertEqual(Confused.SIXTEEN._value_, 16) - - def test_str(self): - Perm = self.Perm - self.assertEqual(str(Perm.R), 'Perm.R') - self.assertEqual(str(Perm.W), 'Perm.W') - self.assertEqual(str(Perm.X), 'Perm.X') - self.assertEqual(str(Perm.R | Perm.W), 'Perm.R|W') - self.assertEqual(str(Perm.R | Perm.W | Perm.X), 'Perm.R|W|X') - self.assertEqual(str(Perm(0)), 'Perm(0)') - self.assertEqual(str(~Perm.R), 'Perm.W|X') - self.assertEqual(str(~Perm.W), 'Perm.R|X') - self.assertEqual(str(~Perm.X), 'Perm.R|W') - self.assertEqual(str(~(Perm.R | Perm.W)), 'Perm.X') - self.assertEqual(str(~(Perm.R | Perm.W | Perm.X)), 'Perm(0)') - self.assertEqual(str(Perm(-1)), 'Perm.R|W|X') - self.assertEqual(str(Perm(~0)), 'Perm.R|W|X') - - Open = self.Open - self.assertEqual(str(Open.RO), 'Open.RO') - self.assertEqual(str(Open.WO), 'Open.WO') - self.assertEqual(str(Open.AC), 'Open.AC') - self.assertEqual(str(Open.RO | Open.CE), 'Open.CE') - self.assertEqual(str(Open.WO | Open.CE), 'Open.WO|CE') - self.assertEqual(str(~Open.RO), 'Open.WO|RW|CE') - self.assertEqual(str(~Open.WO), 'Open.RW|CE') - self.assertEqual(str(~Open.AC), 'Open.CE') - self.assertEqual(str(~(Open.RO | Open.CE)), 'Open.AC') - self.assertEqual(str(~(Open.WO | Open.CE)), 'Open.RW') - - def test_repr(self): - Perm = self.Perm - self.assertEqual(repr(Perm.R), '<Perm.R: 4>') - self.assertEqual(repr(Perm.W), '<Perm.W: 2>') - self.assertEqual(repr(Perm.X), '<Perm.X: 1>') - self.assertEqual(repr(Perm.R | Perm.W), '<Perm.R|W: 6>') - self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '<Perm.R|W|X: 7>') - self.assertEqual(repr(Perm(0)), '<Perm: 0>') - self.assertEqual(repr(~Perm.R), '<Perm.W|X: 3>') - self.assertEqual(repr(~Perm.W), '<Perm.R|X: 5>') - self.assertEqual(repr(~Perm.X), '<Perm.R|W: 6>') - self.assertEqual(repr(~(Perm.R | Perm.W)), '<Perm.X: 1>') - self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm: 0>') - self.assertEqual(repr(Perm(~0)), '<Perm.R|W|X: 7>') - - Open = self.Open - self.assertEqual(repr(Open.RO), '<Open.RO: 0>') - self.assertEqual(repr(Open.WO), '<Open.WO: 1>') - self.assertEqual(repr(Open.AC), '<Open.AC: 3>') - self.assertEqual(repr(Open.RO | Open.CE), '<Open.CE: 524288>') - self.assertEqual(repr(Open.WO | Open.CE), '<Open.WO|CE: 524289>') - self.assertEqual(repr(~Open.RO), '<Open.WO|RW|CE: 524291>') - self.assertEqual(repr(~Open.WO), '<Open.RW|CE: 524290>') - self.assertEqual(repr(~Open.AC), '<Open.CE: 524288>') - self.assertEqual(repr(~(Open.RO | Open.CE)), '<Open.AC: 3>') - self.assertEqual(repr(~(Open.WO | Open.CE)), '<Open.RW: 2>') - - def test_name_lookup(self): - Color = self.Color - self.assertTrue(Color.RED is Color['RED']) - self.assertTrue(Color.RED|Color.GREEN is Color['RED|GREEN']) - self.assertTrue(Color.PURPLE is Color['RED|BLUE']) - - def test_or(self): - Perm = self.Perm - for i in Perm: - for j in Perm: - self.assertEqual((i | j), Perm(i.value | j.value)) - self.assertEqual((i | j).value, i.value | j.value) - self.assertIs(type(i | j), Perm) - for i in Perm: - self.assertIs(i | i, i) - Open = self.Open - self.assertIs(Open.RO | Open.CE, Open.CE) - - def test_and(self): - Perm = self.Perm - RW = Perm.R | Perm.W - RX = Perm.R | Perm.X - WX = Perm.W | Perm.X - RWX = Perm.R | Perm.W | Perm.X - values = list(Perm) + [RW, RX, WX, RWX, Perm(0)] - for i in values: - for j in values: - self.assertEqual((i & j).value, i.value & j.value) - self.assertIs(type(i & j), Perm) - for i in Perm: - self.assertIs(i & i, i) - self.assertIs(i & RWX, i) - self.assertIs(RWX & i, i) - Open = self.Open - self.assertIs(Open.RO & Open.CE, Open.RO) - - def test_xor(self): - Perm = self.Perm - for i in Perm: - for j in Perm: - self.assertEqual((i ^ j).value, i.value ^ j.value) - self.assertIs(type(i ^ j), Perm) - for i in Perm: - self.assertIs(i ^ Perm(0), i) - self.assertIs(Perm(0) ^ i, i) - Open = self.Open - self.assertIs(Open.RO ^ Open.CE, Open.CE) - self.assertIs(Open.CE ^ Open.CE, Open.RO) - - def test_invert(self): - Perm = self.Perm - RW = Perm.R | Perm.W - RX = Perm.R | Perm.X - WX = Perm.W | Perm.X - RWX = Perm.R | Perm.W | Perm.X - values = list(Perm) + [RW, RX, WX, RWX, Perm(0)] - for i in values: - self.assertIs(type(~i), Perm) - self.assertEqual(~~i, i) - for i in Perm: - self.assertIs(~~i, i) - Open = self.Open - self.assertIs(Open.WO & ~Open.WO, Open.RO) - self.assertIs((Open.WO|Open.CE) & ~Open.WO, Open.CE) - - def test_bool(self): - Perm = self.Perm - for f in Perm: - self.assertTrue(f) - Open = self.Open - for f in Open: - self.assertEqual(bool(f.value), bool(f)) - - def test_doc_flag(self): - class DocFlag(Flag): - _init_ = 'value __doc__' - _start_ = 0 - # def __new__(cls, value, doc=None): - # # if doc is None and isinstance(value, basestring): - # # value, doc = doc, value - # # if value is None: - # # if not len(cls): - # # value = 0 - # # else: - # # value = 2 ** (len(cls) -1) - # # if not isinstance(value, baseinteger): - # # raise TypeError("%r is not a valid %s value" % (value, cls.__name__)) - # obj = object.__new__(cls) - # # if doc is None, don't mess with the value - # if doc: - # value = value >> 1 - # obj._value_ = value - # obj.__doc__ = doc - # return obj - # - class AddressSegment(DocFlag): - _order_ = 'UNKNOWN PO PO_TYPE NUMBER PREORD NAME STREET POSTORD SECONDARY_TYPE SECONDARY_NUMBER AND' - UNKNOWN = "unable to determine address element type" - PO = "post office delivery" - PO_TYPE = "box or drawer" - NUMBER = "main unit designator" - PREORD = "N S E W etc" - NAME = "street name" - STREET = "st ave blvd etc" - POSTORD = "N S E W etc" - SECONDARY_TYPE = "apt bldg floor etc" - SECONDARY_NUMBER = "secondary unit designator" - AND = "& indicates a corner address" - AS = AddressSegment - self.assertEqual(AS.NAME._value_, 16) - self.assertEqual(AS.STREET._value_, 32) - self.assertEqual(AS.SECONDARY_TYPE._value_, 128) - self.assertEqual((AS.NAME | AS.STREET)._value_, 48, "%r is not 48" % (AS.NAME | AS.STREET)) - - def test_iteration(self): - C = self.Color - self.assertEqual(list(C), [C.RED, C.GREEN, C.BLUE]) - self.assertEqual(list(C.PURPLE), [C.RED, C.BLUE]) - - def test_member_iteration(self): - C = self.Color - self.assertEqual(list(C.BLACK), []) - self.assertEqual(list(C.RED), [C.RED]) - self.assertEqual(list(C.PURPLE), [C.RED, C.BLUE]) - - def test_programatic_function_string(self): - Perm = Flag('Perm', 'R W X') - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<i - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_string_with_start(self): - Perm = Flag('Perm', 'R W X', start=8) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 8<<i - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_string_list(self): - Perm = Flag('Perm', ['R', 'W', 'X']) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<i - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_iterable(self): - Perm = Flag('Perm', (('R', 2), ('W', 8), ('X', 32))) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<(2*i+1) - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_from_dict(self): - Perm = Flag('Perm', OrderedDict((('R', 2), ('W', 8), ('X', 32)))) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<(2*i+1) - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_empty_list(self): - Perm = IntFlag('Perm', []) - self.assertEqual(len(list(Perm)), len(Perm)) - self.assertEqual(len(Perm), 0) - Thing = Enum('Thing', []) - self.assertEqual(len(list(Thing)), len(Thing)) - self.assertEqual(len(Thing), 0) - - def test_programatic_function_empty_tuple(self): - Perm = IntFlag('Perm', ()) - self.assertEqual(len(list(Perm)), len(Perm)) - self.assertEqual(len(Perm), 0) - Thing = Enum('Thing', ()) - self.assertEqual(len(list(Thing)), len(Thing)) - self.assertEqual(len(Thing), 0) - - def test_pickle(self): - if isinstance(FlagStooges, Exception): - raise FlagStooges - test_pickle_dump_load(self.assertIs, FlagStooges.CURLY|FlagStooges.MOE) - test_pickle_dump_load(self.assertIs, FlagStooges) - - def test_containment(self): - Perm = self.Perm - R, W, X = Perm - RW = R | W - RX = R | X - WX = W | X - RWX = R | W | X - self.assertTrue(R in RW) - self.assertTrue(R in RX) - self.assertTrue(R in RWX) - self.assertTrue(W in RW) - self.assertTrue(W in WX) - self.assertTrue(W in RWX) - self.assertTrue(X in RX) - self.assertTrue(X in WX) - self.assertTrue(X in RWX) - self.assertFalse(R in WX) - self.assertFalse(W in RX) - self.assertFalse(X in RW) - - def test_auto_number(self): - class Color(Flag): - _order_ = 'red blue green' - red = auto() - blue = auto() - green = auto() - - self.assertEqual(list(Color), [Color.red, Color.blue, Color.green]) - self.assertEqual(Color.red.value, 1) - self.assertEqual(Color.blue.value, 2) - self.assertEqual(Color.green.value, 4) - - def test_auto_number_garbage(self): - with self.assertRaisesRegex(TypeError, r'invalid Flag value: .not an int.'): - class Color(Flag): - _order_ = 'red blue' - red = 'not an int' - blue = auto() - - def test_auto_w_pending(self): - class Required(Flag): - _order_ = 'TO_S FROM_S' - NONE = 0 - TO_S = auto() - FROM_S = auto() - BOTH = TO_S | FROM_S - self.assertEqual(Required.TO_S.value, 1) - self.assertEqual(Required.FROM_S.value, 2) - self.assertEqual(Required.BOTH.value, 3) - - def test_duplicate_auto(self): - class Dupes(Enum): - _order_ = 'first second third' - first = primero = auto() - second = auto() - third = auto() - self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes)) - - def test_bizarre(self): - with self.assertRaisesRegex(TypeError, r"invalid Flag 'Bizarre' -- missing values: 1, 2"): - class Bizarre(Flag): - b = 3 - c = 4 - d = 6 - - def test_multiple_mixin(self): - class AllMixin(object): - @classproperty - def ALL(cls): - members = list(cls) - all_value = None - if members: - all_value = members[0] - for member in members[1:]: - all_value |= member - cls.ALL = all_value - return all_value - class StrMixin(object): - def __str__(self): - return self._name_.lower() - class Color(AllMixin, Flag): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 4) - self.assertEqual(Color.ALL.value, 7) - self.assertEqual(str(Color.BLUE), 'Color.BLUE') - class Color(AllMixin, StrMixin, Flag): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 4) - self.assertEqual(Color.ALL.value, 7) - self.assertEqual(str(Color.BLUE), 'blue') - class Color(StrMixin, AllMixin, Flag): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 4) - self.assertEqual(Color.ALL.value, 7) - self.assertEqual(str(Color.BLUE), 'blue') - - @unittest.skipUnless(threading, 'Threading required for this test.') - def test_unique_composite(self): - # override __eq__ to be identity only - class TestFlag(Flag): - _order_ = 'one two three four five six seven eight' - one = auto() - two = auto() - three = auto() - four = auto() - five = auto() - six = auto() - seven = auto() - eight = auto() - def __eq__(self, other): - return self is other - def __hash__(self): - return hash(self._value_) - # have multiple threads competing to complete the composite members - seen = set() - failed = [False] - def cycle_enum(): - # nonlocal failed - try: - for i in range(256): - seen.add(TestFlag(i)) - except Exception: - failed[0] = True - threads = [ - threading.Thread(target=cycle_enum) - for _ in range(8) - ] - for t in threads: - t.start() - for t in threads: - t.join() - # check that only 248 members were created (8 were created originally) - self.assertFalse( - failed[0], - 'at least one thread failed while creating composite members') - self.assertEqual(256, len(seen), 'too many composite members created') - - def test_init_with_autovalue_and_generate_next_value(self): - class Color(Flag): - _init_ = 'value code' - def _generate_next_value_(name, start, count, last_values, *args, **kwds): - if not count: - return ((1, start)[start is not None], ) + args - error = False - for last_value in reversed(last_values): - try: - high_bit = aenum._high_bit(last_value) - break - except Exception: - error = True - break - if error: - raise TypeError('Invalid Flag value: %r' % (last_value, )) - return (2 ** (high_bit+1), ) + args - # TODO: actually test _create_pseudo_member - @classmethod - def _create_pseudo_member_(cls, value): - members = list(cls._iter_member_(value)) - pseudo_member = super(Color, cls)._create_pseudo_member_(value) - pseudo_member.code = ';'.join(m.code for m in members) - return pseudo_member - AllReset = '0' # ESC [ 0 m # reset all (colors and brightness) - Bright = '1' # ESC [ 1 m # bright - Dim = '2' # ESC [ 2 m # dim (looks same as normal brightness) - Underline = '4' - Normal = '22' # ESC [ 22 m # normal brightness - # if we got here, we're good - - def test_autovalue_and_generate_next_value(self): - class Color(str, Flag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - @staticmethod - def _generate_next_value_(name, start, count, values, *args, **kwds): - return (2 ** count, ) + args - # TODO: actually test _create_pseudo_member - @classmethod - def _create_pseudo_member_(cls, value): - # calculate the code - members = list(cls._iter_member_(value)) - code = ';'.join(m.code for m in members) - pseudo_member = super(Color, cls)._create_pseudo_member_(value, code) - return pseudo_member - # - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Blue = '34' # ESC [ 34 m # blue - # - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - # if we got here, we're good - - def test_subclass(self): - class Color(str, Flag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - @staticmethod - def _generate_next_value_(name, start, count, values, *args, **kwds): - return (2 ** count, ) + args - @classmethod - def _create_pseudo_member_(cls, value): - # calculate the code - members = list(cls._iter_member_(value)) - code = ';'.join(m.code for m in members) - pseudo_member = super(Color, cls)._create_pseudo_member_(value, code) - return pseudo_member - # - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Blue = '34' # ESC [ 34 m # blue - # - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - self.assertTrue(isinstance(Color.FG_Black, Color)) - self.assertTrue(isinstance(Color.FG_Black, str)) - self.assertEqual(Color.FG_Black, '\x1b[30m') - self.assertEqual(Color.FG_Black.code, '30') - - def test_sub_subclass_1(self): - class StrFlag(str, Flag): - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - @classmethod - def _create_pseudo_member_(cls, value): - # calculate the code - members = list(cls._iter_member_(value)) - code = ';'.join(m.code for m in members) - pseudo_member = super(Color, cls)._create_pseudo_member_(value, code) - return pseudo_member - class Color(StrFlag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Blue = '34' # ESC [ 34 m # blue - # - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - self.assertTrue(isinstance(Color.FG_Black, Color)) - self.assertTrue(isinstance(Color.FG_Black, str)) - self.assertEqual(Color.FG_Black, '\x1b[30m') - self.assertEqual(Color.FG_Black.code, '30') - - def test_sub_subclass_2(self): - class StrFlag(str, Flag): - @staticmethod - def _generate_next_value_(name, start, count, values, *args, **kwds): - return (2 ** count, ) + args - @classmethod - def _create_pseudo_member_(cls, value): - # calculate the code - members = list(cls._iter_member_(value)) - code = ';'.join(m.code for m in members) - pseudo_member = super(Color, cls)._create_pseudo_member_(value, code) - return pseudo_member - # - class Color(StrFlag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Blue = '34' # ESC [ 34 m # blue - # - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - self.assertTrue(isinstance(Color.FG_Black, Color)) - self.assertTrue(isinstance(Color.FG_Black, str)) - self.assertEqual(Color.FG_Black, '\x1b[30m') - self.assertEqual(Color.FG_Black.code, '30') - - def test_sub_subclass_3(self): - class StrFlag(str, Flag): - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - @classmethod - def _create_pseudo_member_(cls, value): - # calculate the code - members = list(cls._iter_member_(value)) - code = ';'.join(m.code for m in members) - pseudo_member = super(Color, cls)._create_pseudo_member_(value, code) - return pseudo_member - # - class Color(StrFlag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Blue = '34' # ESC [ 34 m # blue - # - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - self.assertTrue(isinstance(Color.FG_Black, Color)) - self.assertTrue(isinstance(Color.FG_Black, str)) - self.assertEqual(Color.FG_Black, '\x1b[30m') - self.assertEqual(Color.FG_Black.code, '30') - - def test_sub_subclass_4(self): - class StrFlag(str, Flag): - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - @classmethod - def _create_pseudo_member_values_(cls, members, *values): - code = ';'.join(m.code for m in members) - return values + (code, ) - # - class Color(StrFlag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Blue = '34' # ESC [ 34 m # blue - # - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - # - def __repr__(self): - return '<%s.%s>' % (self.__class__.__name__, self._name_) - self.assertTrue(isinstance(Color.FG_Black, Color)) - self.assertTrue(isinstance(Color.FG_Black, str)) - self.assertEqual(Color.FG_Black, '\x1b[30m') - self.assertEqual(Color.FG_Black.code, '30') - colors = Color.BG_Magenta | Color.FG_Black - self.assertTrue(isinstance(colors, Color)) - self.assertTrue(isinstance(colors, str)) - self.assertEqual(colors, '\x1b[30;45m') - self.assertEqual(colors.code, '30;45') - self.assertEqual(repr(colors), '<Color.FG_Black|BG_Magenta>') - - def test_sub_subclass_with_new_new(self): - class StrFlag(str, Flag): - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - @classmethod - def _create_pseudo_member_(cls, value): - # calculate the code - members = list(cls._iter_member_(value)) - code = ';'.join(m.code for m in members) - pseudo_member = super(StrFlag, cls)._create_pseudo_member_(value, code) - return pseudo_member - # - class Color(StrFlag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - def __new__(cls, value, string, abbr): - str_value = (abbr or '').title() - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = string - obj.abbr = abbr - return obj - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30', 'blk' # ESC [ 30 m # black - FG_Red = '31', 'red' # ESC [ 31 m # red - FG_Green = '32', 'grn' # ESC [ 32 m # green - FG_Blue = '34', 'blu' # ESC [ 34 m # blue - # - BG_Yellow = '43', 'ylw' # ESC [ 33 m # yellow - BG_Magenta = '45', 'mag' # ESC [ 35 m # magenta - BG_Cyan = '46', 'cyn' # ESC [ 36 m # cyan - BG_White = '47', 'wht' # ESC [ 37 m # white - # - def __repr__(self): - if self._name_ is not None: - return '<%s.%s>' % (self.__class__.__name__, self._name_) - else: - return '<%s: %s>' % (self.__class__.__name__, '|'.join([m.name for m in self])) - self.assertTrue(isinstance(Color.FG_Black, Color)) - self.assertTrue(isinstance(Color.FG_Black, str)) - self.assertEqual(Color.FG_Black, 'Blk', str.__repr__(Color.FG_Black)) - self.assertEqual(Color.FG_Black.abbr, 'blk') - - def test_subclass_with_default_new(self): - class MyFlag(str, Flag): - _order_ = 'this these theother' - this = 'that' - these = 'those' - theother = 'thingimibobs' - self.assertEqual(MyFlag.this, 'that') - self.assertEqual(MyFlag.this.value, 1) - self.assertEqual(MyFlag.these, 'those') - self.assertEqual(MyFlag.these.value, 2) - self.assertEqual(MyFlag.theother, 'thingimibobs') - self.assertEqual(MyFlag.theother.value, 4) - - def test_subclass_a_bunch(self): - class Color(str, Flag): - _order_ = 'FG_Black FG_Red FG_Green FG_Blue BG_Yellow BG_Magenta BG_Cyan BG_White' - def __new__(cls, value, code): - str_value = '\x1b[%sm' % code - obj = str.__new__(cls, str_value) - obj._value_ = value - obj.code = code - return obj - @staticmethod - def _generate_next_value_(name, start, count, values, *args, **kwds): - return (2 ** count, ) + args - @classmethod - def _create_pseudo_member_(cls, value): - # calculate the code - members = list(cls._iter_member_(value)) - code = ';'.join(m.code for m in members) - pseudo_member = super(Color, cls)._create_pseudo_member_(value, code) - return pseudo_member - # - # # FOREGROUND - 30s BACKGROUND - 40s: - FG_Black = '30' # ESC [ 30 m # black - FG_Red = '31' # ESC [ 31 m # red - FG_Green = '32' # ESC [ 32 m # green - FG_Blue = '34' # ESC [ 34 m # blue - # - BG_Yellow = '43' # ESC [ 33 m # yellow - BG_Magenta = '45' # ESC [ 35 m # magenta - BG_Cyan = '46' # ESC [ 36 m # cyan - BG_White = '47' # ESC [ 37 m # white - # - def __repr__(self): - if self._name_ is not None: - return '<%s.%s>' % (self.__class__.__name__, self._name_) - else: - return '<%s: %s>' % (self.__class__.__name__, '|'.join([m.name for m in self])) - # - Purple = Color.BG_Magenta | Color.FG_Blue - self.assertTrue(isinstance(Purple, Color)) - self.assertTrue(isinstance(Purple, str)) - self.assertIs(Purple, Color.BG_Magenta | Color.FG_Blue) - self.assertEqual(Purple, '\x1b[34;45m') - self.assertEqual(Purple.code, '34;45') - self.assertEqual(Purple.name, 'FG_Blue|BG_Magenta') - - def test_init_subclass(self): - class MyEnum(Flag): - def __init_subclass__(cls, **kwds): - super(MyEnum, cls).__init_subclass__(**kwds) - self.assertFalse(cls.__dict__.get('_test', False)) - cls._test1 = 'MyEnum' - # - class TheirEnum(MyEnum): - def __init_subclass__(cls, **kwds): - super(TheirEnum, cls).__init_subclass__(**kwds) - cls._test2 = 'TheirEnum' - class WhoseEnum(TheirEnum): - def __init_subclass__(cls, **kwds): - pass - class NoEnum(WhoseEnum): - ONE = 1 - self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum') - self.assertFalse(NoEnum.__dict__.get('_test1', False)) - self.assertFalse(NoEnum.__dict__.get('_test2', False)) - # - class OurEnum(MyEnum): - def __init_subclass__(cls, **kwds): - cls._test2 = 'OurEnum' - class WhereEnum(OurEnum): - def __init_subclass__(cls, **kwds): - pass - class NeverEnum(WhereEnum): - ONE = 1 - self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum') - self.assertFalse(WhereEnum.__dict__.get('_test1', False)) - self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum') - self.assertFalse(NeverEnum.__dict__.get('_test1', False)) - self.assertFalse(NeverEnum.__dict__.get('_test2', False)) - - def test_int_long_conversion(self): - class Perm(Flag): - EXEC = 1 << 0 - WRITE = 1 << 1 - READ = 1 << 2 - MSB32 = 1 << 31 - MSB64 = 1 << 63 - - # 32-bit system test - self.assertEqual(Perm.MSB32, Perm(0x80000000)) - self.assertEqual(Perm.WRITE|Perm.MSB32, Perm(0x80000002)) - - # 64-bit system test - self.assertEqual(Perm.MSB64, Perm(0x8000000000000000)) - self.assertEqual(Perm.MSB64|Perm.WRITE, Perm(0x8000000000000002)) - - -class TestIntFlag(TestCase): - """Tests of the IntFlags.""" - - def setUp(self): - # - class Perm(IntFlag): - _order_ = 'R W X' - R = 1 << 2 - W = 1 << 1 - X = 1 << 0 - # - class Color(IntFlag): - BLACK = 0 - RED = 1 - GREEN = 2 - BLUE = 4 - PURPLE = RED|BLUE - # - class Open(IntFlag): - "not a good flag candidate" - RO = 0 - WO = 1 - RW = 2 - AC = 3 - CE = 1<<19 - # - self.Perm = Perm - self.Color = Color - self.Open = Open - - def test_set_name(self): - class Descriptor(object): - name = None - def __get__(self, instance, owner_class=None): - if instance is None: - return self - else: - return instance.__dict__[self.name] - def __set__(self, instance, value): - instance.__dict__[self.name] = value - def __set_name__(self, owner, name): - self.name = name - # - class AnEnum(Enum): - ONE = 1 - two = Descriptor() - # - self.assertEqual(list(AnEnum), [AnEnum.ONE]) - self.assertEqual(AnEnum.two.name, 'two') - AnEnum.ONE.two = 'three' - self.assertEqual(AnEnum.ONE.two, 'three') - self.assertEqual(AnEnum.ONE.__dict__['two'], 'three') - - def test_private_names(self): - class Private(Enum): - __corporal = 'Radar' - __major_ = 'Hoolihan' - self.assertEqual(len(Private), 0) - self.assertEqual(Private._Private__corporal, 'Radar') - self.assertFalse(isinstance(Private._Private__corporal, Enum)) - self.assertEqual(Private._Private__major_, 'Hoolihan') - self.assertFalse(isinstance(Private._Private__major_, Enum)) - - def test_membership(self): - Color = self.Color - Open = self.Open - self.assertRaises(TypeError, lambda: 'GREEN' in Color) - self.assertRaises(TypeError, lambda: 'RW' in Open) - self.assertTrue(Color.GREEN in Color) - self.assertTrue(Open.RW in Open) - self.assertFalse(Color.GREEN in Open) - self.assertFalse(Open.RW in Color) - self.assertRaises(TypeError, lambda: 2 in Color) - self.assertRaises(TypeError, lambda: 2 in Open) - - def test_member_contains(self): - Color = self.Color - self.assertRaises(TypeError, lambda: 'test' in Color.RED) - self.assertRaises(TypeError, lambda: 1 in Color.RED) - self.assertTrue(Color.RED in Color.RED) - self.assertTrue(Color.RED in Color.PURPLE) - - def test_name_lookup(self): - Color = self.Color - self.assertTrue(Color.RED is Color['RED']) - self.assertTrue(Color.RED|Color.GREEN is Color['RED|GREEN']) - self.assertTrue(Color.PURPLE is Color['RED|BLUE']) - - def test_type(self): - Perm = self.Perm - Open = self.Open - for f in Perm: - self.assertTrue(isinstance(f, Perm)) - self.assertEqual(f, f.value) - self.assertTrue(isinstance(Perm.W | Perm.X, Perm)) - self.assertEqual(Perm.W | Perm.X, 3) - for f in Open: - self.assertTrue(isinstance(f, Open)) - self.assertEqual(f, f.value) - self.assertTrue(isinstance(Open.WO | Open.RW, Open)) - self.assertEqual(Open.WO | Open.RW, 3) - - - def test_str(self): - Perm = self.Perm - self.assertEqual(str(Perm.R), '4') - self.assertEqual(str(Perm.W), '2') - self.assertEqual(str(Perm.X), '1') - self.assertEqual(str(Perm.R | Perm.W), '6') - self.assertEqual(str(Perm.R | Perm.W | Perm.X), '7') - self.assertEqual(str(Perm(0)), '0') - self.assertEqual(str(~Perm.R), '3') - self.assertEqual(str(~Perm.W), '5') - self.assertEqual(str(~Perm.X), '6') - self.assertEqual(str(~(Perm.R | Perm.W)), '1') - self.assertEqual(str(~(Perm.R | Perm.W | Perm.X)), '0') - self.assertEqual(str(Perm(~0)), '7') - - Open = self.Open - self.assertEqual(str(Open.RO), '0') - self.assertEqual(str(Open.WO), '1') - self.assertEqual(str(Open.AC), '3') - self.assertEqual(str(Open.RO | Open.CE), '524288') - self.assertEqual(str(Open.WO | Open.CE), '524289') - self.assertEqual(str(~Open.RO), '524291') - self.assertEqual(str(~Open.WO), '524290') - self.assertEqual(str(~Open.AC), '524288') - self.assertEqual(str(~(Open.RO | Open.CE)), '3') - self.assertEqual(str(~(Open.WO | Open.CE)), '2') - - def test_repr_strict(self): - class Perm(IntFlag): - _order_ = 'R W X' - R = 1 << 2 - W = 1 << 1 - X = 1 << 0 - Perm._boundary_ = aenum.STRICT - self.assertEqual(repr(Perm.R), '<Perm.R: 4>') - self.assertEqual(repr(Perm.W), '<Perm.W: 2>') - self.assertEqual(repr(Perm.X), '<Perm.X: 1>') - self.assertEqual(repr(Perm.R | Perm.W), '<Perm.R|W: 6>') - self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '<Perm.R|W|X: 7>') - self.assertEqual(repr(Perm(0)), '<Perm: 0>') - self.assertEqual(repr(~Perm.R), '<Perm.W|X: 3>') - self.assertEqual(repr(~Perm.W), '<Perm.R|X: 5>') - self.assertEqual(repr(~Perm.X), '<Perm.R|W: 6>') - self.assertEqual(repr(~(Perm.R | Perm.W)), '<Perm.X: 1>') - self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm: 0>') - # - with self.assertRaisesRegex(ValueError, r'invalid value: 12'): - repr(Perm.R | 8) - with self.assertRaisesRegex(ValueError, r'invalid value: 12'): - repr(~(Perm.R | 8)) - with self.assertRaisesRegex(ValueError, r'invalid value: -9'): - repr(Perm(~8)) - - def test_repr_conform(self): - class Perm(IntFlag): - _order_ = 'R W X' - R = 1 << 2 - W = 1 << 1 - X = 1 << 0 - Perm._boundary_ = aenum.CONFORM - self.assertEqual(repr(Perm.R), '<Perm.R: 4>') - self.assertEqual(repr(Perm.W), '<Perm.W: 2>') - self.assertEqual(repr(Perm.X), '<Perm.X: 1>') - self.assertEqual(repr(Perm.R | Perm.W), '<Perm.R|W: 6>') - self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '<Perm.R|W|X: 7>') - self.assertEqual(repr(Perm(0)), '<Perm: 0>') - self.assertEqual(repr(~Perm.R), '<Perm.W|X: 3>') - self.assertEqual(repr(~Perm.W), '<Perm.R|X: 5>') - self.assertEqual(repr(~Perm.X), '<Perm.R|W: 6>') - self.assertEqual(repr(~(Perm.R | Perm.W)), '<Perm.X: 1>') - self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm: 0>') - self.assertEqual(repr(Perm.R | 8), '<Perm.R: 4>') - self.assertEqual(repr(Perm(8)), '<Perm: 0>') - self.assertEqual(repr(~(Perm.R | 8)), '<Perm.W|X: 3>') - self.assertEqual(repr(Perm(~8)), '<Perm.R|W|X: 7>') - - def test_repr_eject(self): - class Perm(IntFlag): - _order_ = 'R W X' - _boundary_ = EJECT - R = 1 << 2 - W = 1 << 1 - X = 1 << 0 - self.assertEqual(repr(Perm.R), '<Perm.R: 4>') - self.assertEqual(repr(Perm.W), '<Perm.W: 2>') - self.assertEqual(repr(Perm.X), '<Perm.X: 1>') - self.assertEqual(repr(Perm.R | Perm.W), '<Perm.R|W: 6>') - self.assertEqual(repr(Perm.R | Perm.W | Perm.X), '<Perm.R|W|X: 7>') - self.assertEqual(repr(Perm(0)), '<Perm: 0>') - self.assertEqual(repr(~Perm.R), '<Perm.W|X: 3>') - self.assertEqual(repr(~Perm.W), '<Perm.R|X: 5>') - self.assertEqual(repr(~Perm.X), '<Perm.R|W: 6>') - self.assertEqual(repr(~(Perm.R | Perm.W)), '<Perm.X: 1>') - self.assertEqual(repr(~(Perm.R | Perm.W | Perm.X)), '<Perm: 0>') - self.assertEqual(repr(Perm.R | 8), '12') - self.assertEqual(repr(Perm(8)), '8') - self.assertEqual(repr(~(Perm.R | 8)), '-13') - self.assertEqual(repr(Perm(~8)), '-9') - - def test_repr_open(self): - class Open(IntFlag): - "not a good flag candidate" - RO = 0 - WO = 1 - RW = 2 - AC = 3 - CE = 1<<19 - Open._boundary_ = aenum.STRICT - self.assertEqual(repr(Open.RO), '<Open.RO: 0>') - self.assertEqual(repr(Open.WO), '<Open.WO: 1>') - self.assertEqual(repr(Open.AC), '<Open.AC: 3>') - self.assertEqual(repr(Open.RO | Open.CE), '<Open.CE: 524288>') - self.assertEqual(repr(Open.WO | Open.CE), '<Open.WO|CE: 524289>') - self.assertEqual(repr(~Open.RO), '<Open.WO|RW|CE: 524291>') - self.assertEqual(repr(~Open.WO), '<Open.RW|CE: 524290>') - self.assertEqual(repr(~Open.AC), '<Open.CE: 524288>') - self.assertEqual(repr(~(Open.RO | Open.CE)), '<Open.AC: 3>') - self.assertEqual(repr(~(Open.WO | Open.CE)), '<Open.RW: 2>') - with self.assertRaisesRegex(ValueError, r'invalid value: -5'): - repr(Open(~4)) - with self.assertRaisesRegex(ValueError, r'invalid value: 4'): - repr(Open(4)) - # - class Open(IntFlag): - "not a good flag candidate" - RO = 0 - WO = 1 - RW = 2 - AC = 3 - CE = 1<<19 - Open._boundary_ = aenum.CONFORM - self.assertEqual(repr(Open.RO), '<Open.RO: 0>') - self.assertEqual(repr(Open.WO), '<Open.WO: 1>') - self.assertEqual(repr(Open.AC), '<Open.AC: 3>') - self.assertEqual(repr(Open.RO | Open.CE), '<Open.CE: 524288>') - self.assertEqual(repr(Open.WO | Open.CE), '<Open.WO|CE: 524289>') - self.assertEqual(repr(~Open.RO), '<Open.WO|RW|CE: 524291>') - self.assertEqual(repr(~Open.WO), '<Open.RW|CE: 524290>') - self.assertEqual(repr(~Open.AC), '<Open.CE: 524288>') - self.assertEqual(repr(~(Open.RO | Open.CE)), '<Open.AC: 3>') - self.assertEqual(repr(~(Open.WO | Open.CE)), '<Open.RW: 2>') - self.assertEqual(repr(Open(~4)), '<Open.WO|RW|CE: 524291>') - self.assertEqual(repr(Open(4)), '<Open.RO: 0>') - # - class Open(IntFlag): - "not a good flag candidate" - RO = 0 - WO = 1 - RW = 2 - AC = 3 - CE = 1<<19 - Open._boundary_ = aenum.EJECT - self.assertEqual(repr(Open.RO), '<Open.RO: 0>') - self.assertEqual(repr(Open.WO), '<Open.WO: 1>') - self.assertEqual(repr(Open.AC), '<Open.AC: 3>') - self.assertEqual(repr(Open.RO | Open.CE), '<Open.CE: 524288>') - self.assertEqual(repr(Open.WO | Open.CE), '<Open.WO|CE: 524289>') - self.assertEqual(repr(~Open.RO), '<Open.WO|RW|CE: 524291>') - self.assertEqual(repr(~Open.WO), '<Open.RW|CE: 524290>') - self.assertEqual(repr(~Open.AC), '<Open.CE: 524288>') - self.assertEqual(repr(~(Open.RO | Open.CE)), '<Open.AC: 3>') - self.assertEqual(repr(~(Open.WO | Open.CE)), '<Open.RW: 2>') - self.assertEqual(repr(Open(~4)), '-5') - self.assertEqual(repr(Open(4)), '4') - - def test_or(self): - Perm = self.Perm - for i in Perm: - for j in Perm: - self.assertEqual(i | j, i.value | j.value) - self.assertEqual((i | j).value, i.value | j.value) - self.assertIs(type(i | j), Perm) - for j in range(8): - self.assertEqual(i | j, i.value | j) - self.assertEqual((i | j).value, i.value | j) - self.assertIs(type(i | j), Perm) - self.assertEqual(j | i, j | i.value) - self.assertEqual((j | i).value, j | i.value) - self.assertIs(type(j | i), Perm) - for i in Perm: - self.assertIs(i | i, i) - self.assertIs(i | 0, i) - self.assertIs(0 | i, i) - Open = self.Open - self.assertIs(Open.RO | Open.CE, Open.CE) - - def test_and(self): - Perm = self.Perm - RW = Perm.R | Perm.W - RX = Perm.R | Perm.X - WX = Perm.W | Perm.X - RWX = Perm.R | Perm.W | Perm.X - values = list(Perm) + [RW, RX, WX, RWX, Perm(0)] - for i in values: - for j in values: - self.assertEqual(i & j, i.value & j.value, 'i is %r, j is %r' % (i, j)) - self.assertEqual((i & j).value, i.value & j.value, 'i is %r, j is %r' % (i, j)) - self.assertIs(type(i & j), Perm, 'i is %r, j is %r' % (i, j)) - for j in range(8): - self.assertEqual(i & j, i.value & j) - self.assertEqual((i & j).value, i.value & j) - self.assertIs(type(i & j), Perm) - self.assertEqual(j & i, j & i.value) - self.assertEqual((j & i).value, j & i.value) - self.assertIs(type(j & i), Perm) - for i in Perm: - self.assertIs(i & i, i) - self.assertIs(i & 7, i) - self.assertIs(7 & i, i) - Open = self.Open - self.assertIs(Open.RO & Open.CE, Open.RO) - - def test_xor(self): - Perm = self.Perm - for i in Perm: - for j in Perm: - self.assertEqual(i ^ j, i.value ^ j.value) - self.assertEqual((i ^ j).value, i.value ^ j.value) - self.assertIs(type(i ^ j), Perm) - for j in range(8): - self.assertEqual(i ^ j, i.value ^ j) - self.assertEqual((i ^ j).value, i.value ^ j) - self.assertIs(type(i ^ j), Perm) - self.assertEqual(j ^ i, j ^ i.value) - self.assertEqual((j ^ i).value, j ^ i.value) - self.assertIs(type(j ^ i), Perm) - for i in Perm: - self.assertIs(i ^ 0, i) - self.assertIs(0 ^ i, i) - Open = self.Open - self.assertIs(Open.RO ^ Open.CE, Open.CE) - self.assertIs(Open.CE ^ Open.CE, Open.RO) - - def test_invert(self): - Perm = self.Perm - RW = Perm.R | Perm.W - RX = Perm.R | Perm.X - WX = Perm.W | Perm.X - RWX = Perm.R | Perm.W | Perm.X - values = list(Perm) + [RW, RX, WX, RWX, Perm(0)] - for i in values: - self.assertEqual(~i, (~i).value) - self.assertIs(type(~i), Perm) - self.assertEqual(~~i, i) - for i in Perm: - self.assertIs(~~i, i) - Open = self.Open - self.assertIs(Open.WO & ~Open.WO, Open.RO) - self.assertIs((Open.WO|Open.CE) & ~Open.WO, Open.CE) - - def test_iter(self): - Perm = self.Perm - NoPerm = Perm.R ^ Perm.R - RWX = Perm.R | Perm.W | Perm.X - self.assertEqual(list(NoPerm), []) - self.assertEqual(list(Perm.R), [Perm.R]) - self.assertEqual(list(RWX), [Perm.R, Perm.W, Perm.X]) - - def test_programatic_function_string(self): - Perm = IntFlag('Perm', 'R W X') - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<i - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e, v) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_string_with_start(self): - Perm = IntFlag('Perm', 'R W X', start=8) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 8<<i - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e, v) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_string_list(self): - Perm = IntFlag('Perm', ['R', 'W', 'X']) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<i - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e, v) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_iterable(self): - Perm = IntFlag('Perm', (('R', 2), ('W', 8), ('X', 32))) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<(2*i+1) - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e, v) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_programatic_function_from_dict(self): - Perm = IntFlag('Perm', OrderedDict((('R', 2), ('W', 8), ('X', 32)))) - lst = list(Perm) - self.assertEqual(len(lst), len(Perm)) - self.assertEqual(len(Perm), 3, Perm) - self.assertEqual(lst, [Perm.R, Perm.W, Perm.X]) - for i, n in enumerate('R W X'.split()): - v = 1<<(2*i+1) - e = Perm(v) - self.assertEqual(e.value, v) - self.assertEqual(type(e.value), int) - self.assertEqual(e, v) - self.assertEqual(e.name, n) - self.assertIn(e, Perm) - self.assertIs(type(e), Perm) - - def test_containment(self): - Perm = self.Perm - R, W, X = Perm - RW = R | W - RX = R | X - WX = W | X - RWX = R | W | X - self.assertTrue(R in RW) - self.assertTrue(R in RX) - self.assertTrue(R in RWX) - self.assertTrue(W in RW) - self.assertTrue(W in WX) - self.assertTrue(W in RWX) - self.assertTrue(X in RX) - self.assertTrue(X in WX) - self.assertTrue(X in RWX) - self.assertFalse(R in WX) - self.assertFalse(W in RX) - self.assertFalse(X in RW) - - def test_bool(self): - Perm = self.Perm - for f in Perm: - self.assertTrue(f) - Open = self.Open - for f in Open: - self.assertEqual(bool(f.value), bool(f)) - - def test_multiple_mixin(self): - class AllMixin(object): - @classproperty - def ALL(cls): - members = list(cls) - all_value = None - if members: - all_value = members[0] - for member in members[1:]: - all_value |= member - cls.ALL = all_value - return all_value - class StrMixin(object): - def __str__(self): - return self._name_.lower() - class Color(AllMixin, IntFlag): - _order_ = 'RED GREEN BLUE' - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 4) - self.assertEqual(Color.ALL.value, 7) - self.assertEqual(str(Color.BLUE), '4') - class Color(AllMixin, StrMixin, IntFlag): - _order_ = 'RED GREEN BLUE' - __str__ = StrMixin.__str__ - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 4) - self.assertEqual(Color.ALL.value, 7) - self.assertEqual(str(Color.BLUE), 'blue') - class Color(StrMixin, AllMixin, IntFlag): - _order_ = 'RED GREEN BLUE' - __str__ = StrMixin.__str__ - RED = auto() - GREEN = auto() - BLUE = auto() - self.assertEqual(Color.RED.value, 1) - self.assertEqual(Color.GREEN.value, 2) - self.assertEqual(Color.BLUE.value, 4) - self.assertEqual(Color.ALL.value, 7) - self.assertEqual(str(Color.BLUE), 'blue') - - @unittest.skipUnless(threading, 'Threading required for this test.') - def test_unique_composite(self): - # override __eq__ to be identity only - class TestFlag(IntFlag): - _order_ = 'one two three four five six seven eight' - one = auto() - two = auto() - three = auto() - four = auto() - five = auto() - six = auto() - seven = auto() - eight = auto() - def __eq__(self, other): - return self is other - def __hash__(self): - return hash(self._value_) - # have multiple threads competing to complete the composite members - seen = set() - failed = [False] - def cycle_enum(): - # nonlocal failed - try: - for i in range(256): - seen.add(TestFlag(i)) - except Exception: - failed[0] = True - threads = [ - threading.Thread(target=cycle_enum) - for _ in range(8) - ] - for t in threads: - t.start() - for t in threads: - t.join() - # check that only 248 members were created (8 were created originally) - self.assertFalse( - failed[0], - 'at least one thread failed while creating composite members') - self.assertEqual(256, len(seen), 'too many composite members created') - - def test_init_subclass(self): - class MyEnum(IntEnum): - def __init_subclass__(cls, **kwds): - super(MyEnum, cls).__init_subclass__(**kwds) - self.assertFalse(cls.__dict__.get('_test', False)) - cls._test1 = 'MyEnum' - # - class TheirEnum(MyEnum): - def __init_subclass__(cls, **kwds): - super(TheirEnum, cls).__init_subclass__(**kwds) - cls._test2 = 'TheirEnum' - class WhoseEnum(TheirEnum): - def __init_subclass__(cls, **kwds): - pass - class NoEnum(WhoseEnum): - ONE = 1 - self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum') - self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum') - self.assertFalse(NoEnum.__dict__.get('_test1', False)) - self.assertFalse(NoEnum.__dict__.get('_test2', False)) - # - class OurEnum(MyEnum): - def __init_subclass__(cls, **kwds): - cls._test2 = 'OurEnum' - class WhereEnum(OurEnum): - def __init_subclass__(cls, **kwds): - pass - class NeverEnum(WhereEnum): - ONE = 1 - self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum') - self.assertFalse(WhereEnum.__dict__.get('_test1', False)) - self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum') - self.assertFalse(NeverEnum.__dict__.get('_test1', False)) - self.assertFalse(NeverEnum.__dict__.get('_test2', False)) - - - -class TestEmptyAndNonLatinStrings(unittest.TestCase): - - def test_empty_string(self): - with self.assertRaises(ValueError): - empty_abc = Enum('empty_abc', ('', 'B', 'C')) - - def test_non_latin_character_string(self): - greek_abc = Enum('greek_abc', ('\u03B1', 'B', 'C')) - item = getattr(greek_abc, '\u03B1') - self.assertEqual(item.value, 1) - - def test_non_latin_number_string(self): - hebrew_123 = Enum('hebrew_123', ('\u05D0', '2', '3')) - item = getattr(hebrew_123, '\u05D0') - self.assertEqual(item.value, 1) - - -class TestUnique(TestCase): - """2.4 doesn't allow class decorators, use function syntax.""" - - def test_unique_clean(self): - class Clean(Enum): - one = 1 - two = 'dos' - tres = 4.0 - unique(Clean) - class Cleaner(IntEnum): - single = 1 - double = 2 - triple = 3 - unique(Cleaner) - - def test_unique_dirty(self): - try: - class Dirty(Enum): - __order__ = 'one two' - one = 1 - two = 'dos' - tres = 1 - unique(Dirty) - except ValueError: - exc = sys.exc_info()[1] - message = exc.args[0] - self.assertTrue('tres -> one' in message) - - try: - class Dirtier(IntEnum): - __order__ = 'single triple' - single = 1 - double = 1 - triple = 3 - turkey = 3 - unique(Dirtier) - except ValueError: - exc = sys.exc_info()[1] - message = exc.args[0] - self.assertTrue('double -> single' in message) - self.assertTrue('turkey -> triple' in message) - - def test_unique_with_name(self): - @unique - class Silly(Enum): - one = 1 - two = 'dos' - name = 3 - @unique - class Sillier(IntEnum): - single = 1 - name = 2 - triple = 3 - value = 4 - - -class TestNamedTuple(TestCase): - - def test_explicit_indexing(self): - class Person(NamedTuple): - age = 0 - first = 1 - last = 2 - p1 = Person(17, 'John', 'Doe') - p2 = Person(21, 'Jane', 'Doe') - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p2[0], 21) - self.assertEqual(p2[1], 'Jane') - self.assertEqual(p2[2], 'Doe') - self.assertEqual(p1.age, 17) - self.assertEqual(p1.first, 'John') - self.assertEqual(p1.last, 'Doe') - self.assertEqual(p2.age, 21) - self.assertEqual(p2.first, 'Jane') - self.assertEqual(p2.last, 'Doe') - - def test_implicit_indexing(self): - class Person(NamedTuple): - __order__ = "age first last" - age = "person's age" - first = "person's first name" - last = "person's last name" - p1 = Person(17, 'John', 'Doe') - p2 = Person(21, 'Jane', 'Doe') - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p2[0], 21) - self.assertEqual(p2[1], 'Jane') - self.assertEqual(p2[2], 'Doe') - self.assertEqual(p1.age, 17) - self.assertEqual(p1.first, 'John') - self.assertEqual(p1.last, 'Doe') - self.assertEqual(p2.age, 21) - self.assertEqual(p2.first, 'Jane') - self.assertEqual(p2.last, 'Doe') - - def test_mixed_indexing(self): - class Person(NamedTuple): - __order__ = "age last cars" - age = "person's age" - last = 2, "person's last name" - cars = "person's cars" - p1 = Person(17, 'John', 'Doe', 3) - p2 = Person(21, 'Jane', 'Doe', 9) - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p1[3], 3) - self.assertEqual(p2[0], 21) - self.assertEqual(p2[1], 'Jane') - self.assertEqual(p2[2], 'Doe') - self.assertEqual(p2[3], 9) - self.assertEqual(p1.age, 17) - self.assertEqual(p1.last, 'Doe') - self.assertEqual(p1.cars, 3) - self.assertEqual(p2.age, 21) - self.assertEqual(p2.last, 'Doe') - self.assertEqual(p2.cars, 9) - - def test_issubclass(self): - class Person(NamedTuple): - age = 0 - first = 1 - last = 2 - self.assertTrue(issubclass(Person, NamedTuple)) - self.assertTrue(issubclass(Person, tuple)) - - def test_isinstance(self): - class Person(NamedTuple): - age = 0 - first = 1 - last = 2 - p1 = Person(17, 'John', 'Doe') - self.assertTrue(isinstance(p1, Person)) - self.assertTrue(isinstance(p1, NamedTuple)) - self.assertTrue(isinstance(p1, tuple)) - - def test_explicit_indexing_after_functional_api(self): - Person = NamedTuple('Person', (('age', 0), ('first', 1), ('last', 2))) - p1 = Person(17, 'John', 'Doe') - p2 = Person(21, 'Jane', 'Doe') - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p2[0], 21) - self.assertEqual(p2[1], 'Jane') - self.assertEqual(p2[2], 'Doe') - self.assertEqual(p1.age, 17) - self.assertEqual(p1.first, 'John') - self.assertEqual(p1.last, 'Doe') - self.assertEqual(p2.age, 21) - self.assertEqual(p2.first, 'Jane') - self.assertEqual(p2.last, 'Doe') - - def test_implicit_indexing_after_functional_api(self): - Person = NamedTuple('Person', 'age first last') - p1 = Person(17, 'John', 'Doe') - p2 = Person(21, 'Jane', 'Doe') - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p2[0], 21) - self.assertEqual(p2[1], 'Jane') - self.assertEqual(p2[2], 'Doe') - self.assertEqual(p1.age, 17) - self.assertEqual(p1.first, 'John') - self.assertEqual(p1.last, 'Doe') - self.assertEqual(p2.age, 21) - self.assertEqual(p2.first, 'Jane') - self.assertEqual(p2.last, 'Doe') - - def test_mixed_indexing_after_functional_api(self): - Person = NamedTuple('Person', (('age', 0), ('last', 2), ('cars', 3))) - p1 = Person(17, 'John', 'Doe', 3) - p2 = Person(21, 'Jane', 'Doe', 9) - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p1[3], 3) - self.assertEqual(p2[0], 21) - self.assertEqual(p2[1], 'Jane') - self.assertEqual(p2[2], 'Doe') - self.assertEqual(p2[3], 9) - self.assertEqual(p1.age, 17) - self.assertEqual(p1.last, 'Doe') - self.assertEqual(p1.cars, 3) - self.assertEqual(p2.age, 21) - self.assertEqual(p2.last, 'Doe') - self.assertEqual(p2.cars, 9) - - def test_issubclass_after_functional_api(self): - Person = NamedTuple('Person', 'age first last') - self.assertTrue(issubclass(Person, NamedTuple)) - self.assertTrue(issubclass(Person, tuple)) - - def test_isinstance_after_functional_api(self): - Person = NamedTuple('Person', 'age first last') - p1 = Person(17, 'John', 'Doe') - self.assertTrue(isinstance(p1, Person)) - self.assertTrue(isinstance(p1, NamedTuple)) - self.assertTrue(isinstance(p1, tuple)) - - def test_creation_with_all_keywords(self): - Person = NamedTuple('Person', 'age first last') - p1 = Person(age=17, first='John', last='Doe') - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p1.age, 17) - self.assertEqual(p1.first, 'John') - self.assertEqual(p1.last, 'Doe') - - def test_creation_with_some_keywords(self): - Person = NamedTuple('Person', 'age first last') - p1 = Person(17, first='John', last='Doe') - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p1.age, 17) - self.assertEqual(p1.first, 'John') - self.assertEqual(p1.last, 'Doe') - p1 = Person(17, last='Doe', first='John') - self.assertEqual(p1[0], 17) - self.assertEqual(p1[1], 'John') - self.assertEqual(p1[2], 'Doe') - self.assertEqual(p1.age, 17) - self.assertEqual(p1.first, 'John') - self.assertEqual(p1.last, 'Doe') - - def test_custom_new(self): - class Book(NamedTuple): - title = 0 - author = 1 - genre = 2 - def __new__(cls, string): - args = [s.strip() for s in string.split(';')] - return super(Book, cls).__new__(cls, *tuple(args)) - b1 = Book('The Last Mohican; John Doe; Historical') - self.assertEqual(b1.title, 'The Last Mohican') - self.assertEqual(b1.author, 'John Doe') - self.assertEqual(b1.genre, 'Historical') - - def test_defaults_in_class(self): - class Character(NamedTuple): - name = 0 - gender = 1, None, 'male' - klass = 2, None, 'fighter' - for char in ( - {'name':'John Doe'}, - {'name':'William Pickney', 'klass':'scholar'}, - {'name':'Sarah Doughtery', 'gender':'female'}, - {'name':'Sissy Moonbeam', 'gender':'female', 'klass':'sorceress'}, - ): - c = Character(**char) - for name, value in (('name', None), ('gender','male'), ('klass','fighter')): - if name in char: - value = char[name] - self.assertEqual(getattr(c, name), value) - - def test_defaults_in_class_that_are_falsey(self): - class Point(NamedTuple): - x = 0, 'horizondal coordinate', 0 - y = 1, 'vertical coordinate', 0 - p = Point() - self.assertEqual(p.x, 0) - self.assertEqual(p.y, 0) - - def test_pickle_namedtuple_with_module(self): - if isinstance(LifeForm, Exception): - raise LifeForm - lf = LifeForm('this', 'that', 'theother') - test_pickle_dump_load(self.assertEqual, lf) - - def test_pickle_namedtuple_without_module(self): - if isinstance(DeathForm, Exception): - raise DeathForm - df = DeathForm('sickly green', '2x4', 'foul') - test_pickle_dump_load(self.assertEqual, df) - - def test_subclassing(self): - if isinstance(ThatsIt, Exception): - raise ThatsIt - ti = ThatsIt('Henry', 'Weinhardt') - self.assertEqual(ti.blah, 'Henry') - self.assertTrue(ti.what(), 'Henry') - test_pickle_dump_load(self.assertEqual, ti) - - def test_contains(self): - Book = NamedTuple('Book', 'title author genre') - b = Book('Teckla', 'Steven Brust', 'fantasy') - self.assertTrue('Teckla' in b) - self.assertTrue('Steven Brust' in b) - self.assertTrue('fantasy' in b) - - def test_fixed_size(self): - class Book(NamedTuple): - _size_ = TupleSize.fixed - title = 0 - author = 1 - genre = 2 - b = Book('Teckla', 'Steven Brust', 'fantasy') - self.assertTrue('Teckla' in b) - self.assertTrue('Steven Brust' in b) - self.assertTrue('fantasy' in b) - self.assertEqual(b.title, 'Teckla') - self.assertEqual(b.author, 'Steven Brust') - self.assertRaises(TypeError, Book, 'Teckla', 'Steven Brust') - self.assertRaises(TypeError, Book, 'Teckla') - - def test_minimum_size(self): - class Book(NamedTuple): - _size_ = TupleSize.minimum - title = 0 - author = 1 - b = Book('Teckla', 'Steven Brust', 'fantasy') - self.assertTrue('Teckla' in b) - self.assertTrue('Steven Brust' in b) - self.assertTrue('fantasy' in b) - self.assertEqual(b.title, 'Teckla') - self.assertEqual(b.author, 'Steven Brust') - b = Book('Teckla', 'Steven Brust') - self.assertTrue('Teckla' in b) - self.assertTrue('Steven Brust' in b) - self.assertEqual(b.title, 'Teckla') - self.assertEqual(b.author, 'Steven Brust') - self.assertRaises(TypeError, Book, 'Teckla') - - def test_variable_size(self): - class Book(NamedTuple): - _size_ = TupleSize.variable - title = 0 - author = 1 - genre = 2 - b = Book('Teckla', 'Steven Brust', 'fantasy') - self.assertTrue('Teckla' in b) - self.assertTrue('Steven Brust' in b) - self.assertTrue('fantasy' in b) - self.assertEqual(b.title, 'Teckla') - self.assertEqual(b.author, 'Steven Brust') - self.assertEqual(b.genre, 'fantasy') - b = Book('Teckla', 'Steven Brust') - self.assertTrue('Teckla' in b) - self.assertTrue('Steven Brust' in b) - self.assertEqual(b.title, 'Teckla') - self.assertEqual(b.author, 'Steven Brust') - self.assertRaises(AttributeError, getattr, b, 'genre') - self.assertRaises(TypeError, Book, title='Teckla', genre='fantasy') - self.assertRaises(TypeError, Book, author='Steven Brust') - - def test_combining_namedtuples(self): - class Point(NamedTuple): - x = 0, 'horizontal coordinate', 1 - y = 1, 'vertical coordinate', -1 - class Color(NamedTuple): - r = 0, 'red component', 11 - g = 1, 'green component', 29 - b = 2, 'blue component', 37 - Pixel1 = NamedTuple('Pixel', Point+Color, module=__name__) - class Pixel2(Point, Color): - "a colored dot" - class Pixel3(Point): - r = 2, 'red component', 11 - g = 3, 'green component', 29 - b = 4, 'blue component', 37 - self.assertEqual(Pixel1._fields_, 'x y r g b'.split()) - self.assertEqual(Pixel1.x.__doc__, 'horizontal coordinate') - self.assertEqual(Pixel1.x.default, 1) - self.assertEqual(Pixel1.y.__doc__, 'vertical coordinate') - self.assertEqual(Pixel1.y.default, -1) - self.assertEqual(Pixel1.r.__doc__, 'red component') - self.assertEqual(Pixel1.r.default, 11) - self.assertEqual(Pixel1.g.__doc__, 'green component') - self.assertEqual(Pixel1.g.default, 29) - self.assertEqual(Pixel1.b.__doc__, 'blue component') - self.assertEqual(Pixel1.b.default, 37) - self.assertEqual(Pixel2._fields_, 'x y r g b'.split()) - self.assertEqual(Pixel2.x.__doc__, 'horizontal coordinate') - self.assertEqual(Pixel2.x.default, 1) - self.assertEqual(Pixel2.y.__doc__, 'vertical coordinate') - self.assertEqual(Pixel2.y.default, -1) - self.assertEqual(Pixel2.r.__doc__, 'red component') - self.assertEqual(Pixel2.r.default, 11) - self.assertEqual(Pixel2.g.__doc__, 'green component') - self.assertEqual(Pixel2.g.default, 29) - self.assertEqual(Pixel2.b.__doc__, 'blue component') - self.assertEqual(Pixel2.b.default, 37) - self.assertEqual(Pixel3._fields_, 'x y r g b'.split()) - self.assertEqual(Pixel3.x.__doc__, 'horizontal coordinate') - self.assertEqual(Pixel3.x.default, 1) - self.assertEqual(Pixel3.y.__doc__, 'vertical coordinate') - self.assertEqual(Pixel3.y.default, -1) - self.assertEqual(Pixel3.r.__doc__, 'red component') - self.assertEqual(Pixel3.r.default, 11) - self.assertEqual(Pixel3.g.__doc__, 'green component') - self.assertEqual(Pixel3.g.default, 29) - self.assertEqual(Pixel3.b.__doc__, 'blue component') - self.assertEqual(Pixel3.b.default, 37) - - def test_function_api_type(self): - class Tester(NamedTuple): - def howdy(self): - return 'backwards', list(reversed(self)) - Testee = NamedTuple('Testee', 'a c e', type=Tester) - t = Testee(1, 2, 3) - self.assertEqual(t.howdy(), ('backwards', [3, 2, 1])) - - def test_asdict(self): - class Point(NamedTuple): - x = 0, 'horizontal coordinate', 1 - y = 1, 'vertical coordinate', -1 - class Color(NamedTuple): - r = 0, 'red component', 11 - g = 1, 'green component', 29 - b = 2, 'blue component', 37 - Pixel = NamedTuple('Pixel', Point+Color, module=__name__) - pixel = Pixel(99, -101, 255, 128, 0) - self.assertEqual(pixel._asdict(), {'x':99, 'y':-101, 'r':255, 'g':128, 'b':0}) - - def test_make(self): - class Point(NamedTuple): - x = 0, 'horizontal coordinate', 1 - y = 1, 'vertical coordinate', -1 - self.assertEqual(Point(4, 5), (4, 5)) - self.assertEqual(Point._make((4, 5)), (4, 5)) - - def test_replace(self): - class Color(NamedTuple): - r = 0, 'red component', 11 - g = 1, 'green component', 29 - b = 2, 'blue component', 37 - purple = Color(127, 0, 127) - mid_gray = purple._replace(g=127) - self.assertEqual(mid_gray, (127, 127, 127)) - - -class TestNamedConstant(TestCase): - - def test_constantness(self): - class K(NamedConstant): - PI = 3.141596 - TAU = 2 * PI - self.assertEqual(K.PI, 3.141596) - self.assertEqual(K.TAU, 2 * K.PI) - with self.assertRaisesRegex(AttributeError, r'cannot rebind constant'): - K.PI = 9 - with self.assertRaisesRegex(AttributeError, r'cannot delete constant'): - del K.PI - with self.assertRaisesRegex(AttributeError, r'cannot rebind constant'): - K('PI', 3) - self.assertTrue(K.PI in K) - self.assertTrue(K.TAU in K) - - def test_duplicates(self): - class CardNumber(NamedConstant): - ACE = 11 - TWO = 2 - THREE = 3 - FOUR = 4 - FIVE = 5 - SIX = 6 - SEVEN = 7 - EIGHT = 8 - NINE = 9 - TEN = 10 - JACK = 10 - QUEEN = 10 - KING = 10 - self.assertFalse(CardNumber.TEN is CardNumber.JACK) - self.assertEqual(CardNumber.TEN, CardNumber.JACK) - self.assertEqual(CardNumber.TEN, 10) - - def test_extend_constants(self): - class CardSuit(NamedConstant): - HEARTS = 1 - SPADES = 2 - DIAMONTS = 3 - CLUBS = 4 - self.assertEqual(CardSuit.HEARTS, 1) - stars = CardSuit('STARS', 5) - self.assertIs(stars, CardSuit.STARS) - self.assertEqual(CardSuit.STARS, 5) - self.assertTrue(CardSuit.STARS in CardSuit) - - def test_constant_with_docstring(self): - class Stuff(NamedConstant): - Artifact = constant(7, "lucky number!") - Bowling = 11 - HillWomp = constant(29, 'blah blah') - self.assertEqual(Stuff.Artifact, 7) - self.assertEqual(Stuff.Artifact.__doc__, 'lucky number!') - self.assertEqual(Stuff.Bowling, 11) - self.assertEqual(Stuff.Bowling.__doc__, None) - self.assertEqual(Stuff.HillWomp, 29) - self.assertEqual(Stuff.HillWomp.__doc__, 'blah blah') - - def test_deep_copy(self): - import copy - class APITypes(aenum.Constant): - STRING = "string" - INT = "int" - APITypes('string') - d = {"first": APITypes.STRING} - copy.deepcopy(d) - self.assertTrue(d['first'] is APITypes.STRING) - - def test_subclass_w_same_value(self): - class Foo(aenum.Constant): - BLA = 'bla1' - ABA = 'aba1' - class Bar(aenum.Constant): - BLA = Foo.BLA - ABA = 'aba2' - self.assertEqual(Foo.BLA, Bar.BLA) - self.assertFalse(Foo.BLA is Bar.BLA) - - -class TestStarImport(TestCase): - - def test_all_exports_names(self): - scope = {} - exec('from aenum import *', scope, scope) - self.assertIn('Enum', scope) - -class TestStackoverflowAnswers(TestCase): - - def test_self_referential_directions(self): - # https://stackoverflow.com/a/64000706/208880 - class Directions(Enum): - _order_ = 'NORTH WEST SOUTH EAST' - # - NORTH = 1, 0 - WEST = 0, 1 - SOUTH = -1, 0 - EAST = 0, -1 - # - def __init__(self, x, y): - self.x = x - self.y = y - if len(self.__class__): - # make links - all = list(self.__class__) - left, right = all[0], all[-1] - self.left = left - self.right = right - left.right = self - right.left = self - # - D = Directions - self.assertEqual(D.NORTH.value, (1, 0)) - self.assertTrue(D.NORTH.left is D.WEST) - self.assertTrue(D.SOUTH.right is D.WEST) - - def test_self_referential_rock_paper_scissors(self): - # https://stackoverflow.com/a/57085357/208880 - class RPS(Enum): - _order_ = 'Rock, Paper, Scissors' - # - Rock = "rock" - Paper = "paper" - Scissors = "scissors" - # - def __init__(self, value): - if len(self.__class__): - # make links - all = list(self.__class__) - first, previous = all[0], all[-1] - first.beats = self - self.beats = previous - # - self.assertTrue(RPS.Rock.beats is RPS.Scissors) - self.assertTrue(RPS.Scissors.beats is RPS.Paper) - self.assertTrue(RPS.Paper.beats is RPS.Rock) - - def test_arduino_headers(self): - # https://stackoverflow.com/q/65048495/208880 - class CHeader(Enum): - def __init_subclass__(cls, **kwds): - # write Enums to C header file - cls_name = cls.__name__ - header_path = getattr(cls, '_%s__header' % cls_name) - with open(header_path, 'w') as fh: - fh.write('initial header stuff here\n') - for enum in cls: - fh.write('#define %s %r\n' % (enum.name, enum.value)) - class Arduino(CHeader): - _order_ = 'ONE TWO' - __header = os.path.join(tempdir, 'arduino.h') - ONE = 1 - TWO = 2 - with open(os.path.join(tempdir, 'arduino.h')) as fh: - data = fh.read() - self.assertEqual(textwrap.dedent("""\ - initial header stuff here - #define ONE 1 - #define TWO 2 - """), - data, - ) - - def test_lowercase_compare(self): - # https://stackoverflow.com/q/65139026/208880 - class CompareLowerCase(Enum): - def __init_subclass__(cls, **kwds): - super(CompareLowerCase, cls).__init_subclass__(**kwds) - cls.lowered_names = set([m.name.lower() for m in cls]) - @classmethod - def has_name(cls, name): - return name.lower() in cls.lowered_names - # - class LabelEnum(CompareLowerCase, StrEnum): - ENUM_ONE = "Enum One" - ENUM_TWO = "Enum Two" - ENUM_THREE = "Enum Three" - FOUR = "FOUR" - FIVE = "FIVE" - SIX = "SIX" - # - self.assertTrue(LabelEnum.has_name('Enum_Three')) - - -class TestExtendEnum(TestCase): - - def test_extend_enum_plain(self): - class Color(Enum): - red = 1 - green = 2 - blue = 3 - self.assertRaisesRegex(TypeError, 'already in use as', extend_enum, Color, 'blue', 5) - # - extend_enum(Color, 'brown', 4) - self.assertEqual(Color.brown.name, 'brown') - self.assertEqual(Color.brown.value, 4) - self.assertTrue(Color.brown in Color) - self.assertEqual(Color(4), Color.brown) - self.assertEqual(Color['brown'], Color.brown) - self.assertEqual(len(Color), 4) - # - extend_enum(Color, 'mauve') - self.assertEqual(Color.mauve.name, 'mauve') - self.assertEqual(Color.mauve.value, 5) - self.assertTrue(Color.mauve in Color) - self.assertEqual(Color(5), Color.mauve) - self.assertEqual(Color['mauve'], Color.mauve) - self.assertEqual(len(Color), 5) - - def test_extend_enum_alias(self): - class Color(Enum): - red = 1 - green = 2 - blue = 3 - extend_enum(Color, 'rojo', 1) - self.assertEqual(Color.rojo.name, 'red') - self.assertEqual(Color.rojo.value, 1) - self.assertTrue(Color.rojo in Color) - self.assertEqual(Color(1), Color.rojo) - self.assertEqual(Color['rojo'], Color.red) - self.assertEqual(len(Color), 3) - - def test_extend_enum_unique(self): - class Color(UniqueEnum): - red = 1 - green = 2 - blue = 3 - self.assertRaisesRegex(ValueError, r'<Color.rojo: 1> is a duplicate of <Color.red: 1>', extend_enum, Color, 'rojo', 1) - # - self.assertEqual(Color.red.name, 'red') - self.assertEqual(Color.red.value, 1) - self.assertTrue(Color.red in Color) - self.assertEqual(Color(1), Color.red) - self.assertEqual(Color['red'], Color.red) - self.assertEqual(Color.green.name, 'green') - self.assertEqual(Color.green.value, 2) - self.assertTrue(Color.green in Color) - self.assertEqual(Color(2), Color.green) - self.assertEqual(Color['blue'], Color.blue) - self.assertEqual(Color.blue.name, 'blue') - self.assertEqual(Color.blue.value, 3) - self.assertTrue(Color.blue in Color) - self.assertEqual(Color(3), Color.blue) - self.assertEqual(len(Color), 3) - # - extend_enum(Color, 'brown', 4) - self.assertEqual(Color.brown.name, 'brown') - self.assertEqual(Color.brown.value, 4) - self.assertTrue(Color.brown in Color) - self.assertEqual(Color(4), Color.brown) - self.assertEqual(Color['brown'], Color.brown) - self.assertEqual(len(Color), 4) - # - self.assertRaisesRegex(ValueError, '', extend_enum, Color, 'verde', 2) - # - extend_enum(Color, 'mauve') - self.assertEqual(Color.mauve.name, 'mauve') - self.assertEqual(Color.mauve.value, 5) - self.assertTrue(Color.mauve in Color) - self.assertEqual(Color(5), Color.mauve) - self.assertEqual(Color['mauve'], Color.mauve) - self.assertEqual(len(Color), 5) - - - def test_extend_enum_shadow_property(self): - class Color(Enum): - red = 1 - green = 2 - blue = 3 - extend_enum(Color, 'value', 4) - self.assertEqual(Color.value.name, 'value') - self.assertEqual(Color.value.value, 4) - self.assertTrue(Color.value in Color) - self.assertEqual(Color(4), Color.value) - self.assertEqual(Color['value'], Color.value) - self.assertEqual(len(Color), 4) - self.assertEqual(Color.red.value, 1) - - def test_extend_enum_shadow_base(self): - class hohum(object): - def cyan(self): - "cyanize a color" - return self.value - class Color(hohum, Enum): - red = 1 - green = 2 - blue = 3 - self.assertRaisesRegex(TypeError, r'already in use in superclass', extend_enum, Color, 'cyan', 4) - self.assertEqual(len(Color), 3) - self.assertEqual(list(Color), [Color.red, Color.green, Color.blue]) - - def test_extend_enum_multivalue(self): - class Color(MultiValueEnum): - red = 1, 4, 7 - green = 2, 5, 8 - blue = 3, 6, 9 - extend_enum(Color, 'brown', 10, 20) - self.assertEqual(Color.brown.name, 'brown') - self.assertEqual(Color.brown.value, 10) - self.assertTrue(Color.brown in Color) - self.assertEqual(Color(10), Color.brown) - self.assertEqual(Color(20), Color.brown) - self.assertEqual(Color['brown'], Color.brown) - self.assertEqual(len(Color), 4) - # - self.assertRaisesRegex(ValueError, 'no values specified for MultiValue enum', extend_enum, Color, 'mauve') - - def test_extend_enum_multivalue_alias(self): - class Color(MultiValueEnum): - red = 1, 4, 7 - green = 2, 5, 8 - blue = 3, 6, 9 - self.assertRaisesRegex(ValueError, r'<Color.rojo: 7> is a duplicate of <Color.red: 1>', extend_enum, Color, 'rojo', 7) - self.assertEqual(Color.red.name, 'red') - self.assertEqual(Color.red.value, 1) - self.assertTrue(Color.red in Color) - self.assertEqual(Color(1), Color.red) - self.assertEqual(Color(4), Color.red) - self.assertEqual(Color(7), Color.red) - self.assertEqual(Color['red'], Color.red) - self.assertEqual(Color.green.name, 'green') - self.assertEqual(Color.green.value, 2) - self.assertTrue(Color.green in Color) - self.assertEqual(Color(2), Color.green) - self.assertEqual(Color(5), Color.green) - self.assertEqual(Color(8), Color.green) - self.assertEqual(Color['blue'], Color.blue) - self.assertEqual(Color.blue.name, 'blue') - self.assertEqual(Color.blue.value, 3) - self.assertTrue(Color.blue in Color) - self.assertEqual(Color(3), Color.blue) - self.assertEqual(Color(6), Color.blue) - self.assertEqual(Color(9), Color.blue) - self.assertEqual(len(Color), 3) - - def test_extend_enum_multivalue_str(self): - class M(str, MultiValueEnum): - VALUE_1 = 'value_1', 'VALUE_1' - VALUE_2 = 'value_2', 'VALUE_2' - VALUE_3 = 'value_3', 'VALUE_3' - self.assertTrue(M._member_type_ is str) - extend_enum(M, 'VALUE_4', 'value_4', 'VALUE_4') - self.assertEqual(list(M), [M.VALUE_1, M.VALUE_2, M.VALUE_3, M.VALUE_4]) - self.assertTrue(M('value_4') is M.VALUE_4) - self.assertTrue(M('VALUE_4') is M.VALUE_4) - self.assertTrue(M.VALUE_4.name == 'VALUE_4') - self.assertTrue(M.VALUE_4.value == 'value_4') - - def test_extend_intenum(self): - class Index(IntEnum): - DeviceType = 0x1000 - ErrorRegister = 0x1001 - - for name, value in ( - ('ControlWord', 0x6040), - ('StatusWord', 0x6041), - ('OperationMode', 0x6060), - ): - extend_enum(Index, name, value) - - self.assertEqual(len(Index), 5) - self.assertEqual(list(Index), [Index.DeviceType, Index.ErrorRegister, Index.ControlWord, Index.StatusWord, Index.OperationMode]) - self.assertEqual(Index.DeviceType.value, 0x1000) - self.assertEqual(Index.StatusWord.value, 0x6041) - - def test_extend_multi_init(self): - try: - from http import HTTPStatus - length = len(HTTPStatus) - except ImportError: - class HTTPStatus(IntEnum): - def __new__(cls, value, phrase, description): - obj = int.__new__(cls, value) - obj._value_ = value - - obj.phrase = phrase - obj.description = description - return obj - CONTINUE = 100, 'Continue', 'Request received, please continue' - SWITCHING_PROTOCOLS = 101, 'Switching Protocols', 'Switching to new protocol; obey Upgrade header' - PROCESSING = 102, 'Processing', '' - length = 3 - extend_enum(HTTPStatus, 'BAD_SPAM', 513, 'Too greasy', 'for a train') - extend_enum(HTTPStatus, 'BAD_EGGS', 514, 'Too green', '') - self.assertEqual(len(HTTPStatus), length+2) - self.assertEqual( - list(HTTPStatus)[-2:], - [HTTPStatus.BAD_SPAM, HTTPStatus.BAD_EGGS], - ) - self.assertEqual(HTTPStatus.BAD_SPAM.value, 513) - self.assertEqual(HTTPStatus.BAD_SPAM.name, 'BAD_SPAM') - self.assertEqual(HTTPStatus.BAD_SPAM.phrase, 'Too greasy') - self.assertEqual(HTTPStatus.BAD_SPAM.description, 'for a train') - self.assertEqual(HTTPStatus.BAD_EGGS.value, 514) - self.assertEqual(HTTPStatus.BAD_EGGS.name, 'BAD_EGGS') - self.assertEqual(HTTPStatus.BAD_EGGS.phrase, 'Too green') - self.assertEqual(HTTPStatus.BAD_EGGS.description, '') - - def test_extend_flag(self): - class Color(Flag): - BLACK = 0 - RED = 1 - GREEN = 2 - BLUE = 4 - extend_enum(Color, 'MAGENTA') - self.assertTrue(Color(8) is Color.MAGENTA) - self.assertTrue(isinstance(Color.MAGENTA, Color)) - self.assertEqual(Color.MAGENTA.value, 8) - extend_enum(Color, 'PURPLE', 11) - self.assertTrue(Color(11) is Color.PURPLE) - self.assertTrue(isinstance(Color.PURPLE, Color)) - self.assertEqual(Color.PURPLE.value, 11) - self.assertTrue(issubclass(Color, Flag)) - - def test_extend_flag_backwards(self): - class Color(Flag): - BLACK = 0 - RED = 1 - GREEN = 2 - BLUE = 4 - extend_enum(Color, 'PURPLE', 11) - self.assertTrue(Color(11) is Color.PURPLE) - self.assertTrue(isinstance(Color.PURPLE, Color)) - self.assertEqual(Color.PURPLE.value, 11) - self.assertTrue(issubclass(Color, Flag)) - # - extend_enum(Color, 'MAGENTA') - self.assertTrue(Color(8) is Color.MAGENTA) - self.assertTrue(isinstance(Color.MAGENTA, Color)) - self.assertEqual(Color.MAGENTA.value, 8) - # - extend_enum(Color, 'mauve') - self.assertEqual(Color.mauve.name, 'mauve') - self.assertEqual(Color.mauve.value, 16) - self.assertTrue(Color.mauve in Color) - self.assertEqual(Color(16), Color.mauve) - self.assertEqual(Color['mauve'], Color.mauve) - self.assertEqual(len(Color), 5) - - def test_extend_intflag(self): - class Color(IntFlag): - BLACK = 0 - RED = 1 - GREEN = 2 - BLUE = 4 - extend_enum(Color, 'MAGENTA') - self.assertTrue(Color(8) is Color.MAGENTA) - self.assertTrue(isinstance(Color.MAGENTA, Color)) - self.assertEqual(Color.MAGENTA.value, 8) - extend_enum(Color, 'PURPLE', 11) - self.assertTrue(Color(11) is Color.PURPLE) - self.assertTrue(isinstance(Color.PURPLE, Color)) - self.assertEqual(Color.PURPLE.value, 11) - self.assertTrue(issubclass(Color, Flag)) - # - extend_enum(Color, 'mauve') - self.assertEqual(Color.mauve.name, 'mauve') - self.assertEqual(Color.mauve.value, 16) - self.assertTrue(Color.mauve in Color) - self.assertEqual(Color(16), Color.mauve) - self.assertEqual(Color['mauve'], Color.mauve) - self.assertEqual(len(Color), 5) - - def test_extend_intflag_backwards(self): - class Color(IntFlag): - BLACK = 0 - RED = 1 - GREEN = 2 - BLUE = 4 - extend_enum(Color, 'PURPLE', 11) - self.assertTrue(Color(11) is Color.PURPLE) - self.assertTrue(isinstance(Color.PURPLE, Color)) - self.assertEqual(Color.PURPLE.value, 11) - self.assertTrue(issubclass(Color, Flag)) - # - extend_enum(Color, 'MAGENTA') - self.assertTrue(Color(8) is Color.MAGENTA) - self.assertTrue(isinstance(Color.MAGENTA, Color)) - self.assertEqual(Color.MAGENTA.value, 8) - # - extend_enum(Color, 'mauve') - self.assertEqual(Color.mauve.name, 'mauve') - self.assertEqual(Color.mauve.value, 16) - self.assertTrue(Color.mauve in Color) - self.assertEqual(Color(16), Color.mauve) - self.assertEqual(Color['mauve'], Color.mauve) - self.assertEqual(len(Color), 5) - - def test_extend_strenum(self): - class Color(StrEnum): - RED = auto() - GREEN = auto() - BLUE = auto() - extend_enum(Color, 'BLACK') - self.assertEqual(Color.BLACK.name, 'BLACK') - self.assertEqual(Color.BLACK.value, 'black') - self.assertEqual(len(Color), 4) - - -class TestIssues(TestCase): - - def test_auto_multi_int(self): - class Measurement(int, MultiValueEnum, AddValueEnum): - _order_ = 'one two three' - _start_ = 0 - one = "20110721" - two = "20120911" - three = "20110518" - self.assertEqual([m.value for m in Measurement], [0, 1, 2]) - self.assertEqual([m.name for m in Measurement], ['one', 'two', 'three']) - self.assertIs(Measurement('20110721'), Measurement.one) - self.assertIs(Measurement(0), Measurement.one) - self.assertIs(Measurement('20120911'), Measurement.two) - self.assertIs(Measurement(1), Measurement.two) - self.assertIs(Measurement('20110518'), Measurement.three) - self.assertIs(Measurement(2), Measurement.three) - - def test_auto_kwds(self): - class Item(Enum): - _order_ = 'A B' - A = auto(size=100, requirements={}) - B = auto(size=200, requirements={A: 1}) - # - def __new__(cls, value, size, requirements): - obj = object.__new__(cls) - obj._value_ = value - obj.size = size - # fix requirements - new_requirements = {} - for k, v in requirements.items(): - if isinstance(k, auto): - k = k.enum_member - new_requirements[k] = v - obj.requirements = new_requirements - return obj - self.assertEqual((Item.A.value, Item.A.size, Item.A.requirements), (1, 100, {})) - self.assertEqual((Item.B.value, Item.B.size, Item.B.requirements), (2, 200, {Item.A: 1})) - - def test_extend_flag(self): - class FlagTest(Flag): # Or IntFlag - NONE = 0 - LOW = 1 - MID = 2 - extend_enum(FlagTest, 'HIGH', 4) - self.assertEqual(FlagTest.LOW | FlagTest.HIGH, FlagTest(5)) - self.assertEqual((FlagTest.LOW | FlagTest.HIGH).value, 5) - - def test_extend_unhashable(self): - class TestEnum(Enum): - ABC = { - 'id': 0, - 'value': 'abc' - } - DEF = { - 'id': 1, - 'value': 'def' - } - rand = uuid.uuid4().hex - new_value = { - 'id': 99, - 'value': 'new', - } - extend_enum(TestEnum, rand, new_value) - - - -# Test conversion of global constants -# These are unordered here on purpose to ensure that declaration order -# makes no difference. -CONVERT_TEST_NAME_D = 5 -CONVERT_TEST_NAME_C = 5 -CONVERT_TEST_NAME_B = 5 -CONVERT_TEST_NAME_A = 5 # This one should sort first. -CONVERT_TEST_NAME_E = 5 -CONVERT_TEST_NAME_F = 5 -CONVERT_TEST_SIGABRT = 4 # and this one -CONVERT_TEST_SIGIOT = 4 -CONVERT_TEST_EIO = 7 -CONVERT_TEST_EBUS = 7 # and this one - -CONVERT_STRING_TEST_NAME_D = 5 -CONVERT_STRING_TEST_NAME_C = 5 -CONVERT_STRING_TEST_NAME_B = 5 -CONVERT_STRING_TEST_NAME_A = 5 # This one should sort first. -CONVERT_STRING_TEST_NAME_E = 5 -CONVERT_STRING_TEST_NAME_F = 5 - -# global names for StrEnum._convert_ test -CONVERT_STR_TEST_2 = 'goodbye' -CONVERT_STR_TEST_1 = 'hello' - -# We also need values that cannot be compared: -UNCOMPARABLE_A = 5 -UNCOMPARABLE_C = (9, 1) # naming order is broken on purpose -UNCOMPARABLE_B = 'value' - -COMPLEX_C = 1j -COMPLEX_A = 2j -COMPLEX_B = 3j - - -class TestConvert(TestCase): - - def tearDown(self): - # Reset the module-level test variables to their original integer - # values, otherwise the already created enum values get converted - # instead. - g = globals() - for suffix in ['A', 'B', 'C', 'D', 'E', 'F']: - g['CONVERT_TEST_NAME_%s' % suffix] = 5 - g['CONVERT_STRING_TEST_NAME_%s' % suffix] = 5 - for suffix, value in (('A', 5), ('B', (9, 1)), ('C', 'value')): - g['UNCOMPARABLE_%s' % suffix] = value - for suffix, value in (('A', 2j), ('B', 3j), ('C', 1j)): - g['COMPLEX_%s' % suffix] = value - for suffix, value in (('1', 'hello'), ('2', 'goodbye')): - g['CONVERT_STR_TEST_%s' % suffix] = value - g['CONVERT_TEST_SIGABRT'] = 4 - g['CONVERT_TEST_SIGIOT'] = 4 - g['CONVERT_TEST_EIO'] = 7 - g['CONVERT_TEST_EBUS'] = 7 - - def test_convert_value_lookup_priority(self): - test_type = IntEnum._convert_( - 'UnittestConvert', - MODULE, - filter=lambda x: x.startswith('CONVERT_TEST_')) - # We don't want the reverse lookup value to vary when there are - # multiple possible names for a given value. It should always - # report the first lexigraphical name in that case. - self.assertEqual(test_type(5).name, 'CONVERT_TEST_NAME_A') - self.assertEqual(test_type(4).name, 'CONVERT_TEST_SIGABRT') - self.assertEqual(test_type(7).name, 'CONVERT_TEST_EBUS') - self.assertEqual( - list(test_type), - [ - test_type.CONVERT_TEST_SIGABRT, - test_type.CONVERT_TEST_NAME_A, - test_type.CONVERT_TEST_EBUS, - ], - ) - - def test_convert_int(self): - test_type = IntEnum._convert_( - 'UnittestConvert', - MODULE, - filter=lambda x: x.startswith('CONVERT_TEST_')) - # Ensure that test_type has all of the desired names and values. - self.assertEqual(test_type.CONVERT_TEST_NAME_F, - test_type.CONVERT_TEST_NAME_A) - self.assertEqual(test_type.CONVERT_TEST_NAME_B, 5) - self.assertEqual(test_type.CONVERT_TEST_NAME_C, 5) - self.assertEqual(test_type.CONVERT_TEST_NAME_D, 5) - self.assertEqual(test_type.CONVERT_TEST_NAME_E, 5) - # Ensure that test_type only picked up names matching the filter. - int_dir = dir(int) + [ - 'CONVERT_TEST_NAME_A', 'CONVERT_TEST_NAME_B', 'CONVERT_TEST_NAME_C', - 'CONVERT_TEST_NAME_D', 'CONVERT_TEST_NAME_E', 'CONVERT_TEST_NAME_F', - 'CONVERT_TEST_SIGABRT', 'CONVERT_TEST_SIGIOT', - 'CONVERT_TEST_EIO', 'CONVERT_TEST_EBUS', - ] - extra = [name for name in dir(test_type) if name not in enum_dir(test_type)] - missing = [name for name in enum_dir(test_type) if name not in dir(test_type)] - self.assertEqual( - extra + missing, - [], - msg='extra names: %r; missing names: %r' % (extra, missing), - ) - - @unittest.skipUnless(PY3, 'everything is comparable on Python 2') - def test_convert_uncomparable(self): - uncomp = Enum._convert_( - 'Uncomparable', - MODULE, - filter=lambda x: x.startswith('UNCOMPARABLE_')) - # Should be ordered by `name` only: - self.assertEqual( - list(uncomp), - [uncomp.UNCOMPARABLE_A, uncomp.UNCOMPARABLE_B, uncomp.UNCOMPARABLE_C], - list(uncomp), - ) - - @unittest.skipUnless(PY3, 'everything is comparable on Python 2') - def test_convert_complex(self): - uncomp = Enum._convert_( - 'Uncomparable', - MODULE, - filter=lambda x: x.startswith('COMPLEX_')) - # Should be ordered by `name` only: - self.assertEqual( - list(uncomp), - [uncomp.COMPLEX_A, uncomp.COMPLEX_B, uncomp.COMPLEX_C], - ) - - def test_convert_str(self): - test_type = StrEnum._convert_( - 'UnittestConvert', - MODULE, - filter=lambda x: x.startswith('CONVERT_STR_'), - as_global=True) - # Ensure that test_type has all of the desired names and values. - self.assertEqual(test_type.CONVERT_STR_TEST_1, 'hello') - self.assertEqual(test_type.CONVERT_STR_TEST_2, 'goodbye') - # Ensure that test_type only picked up names matching the filter. - extra = [name for name in dir(test_type) if name not in enum_dir(test_type)] - missing = [name for name in enum_dir(test_type) if name not in dir(test_type)] - self.assertEqual( - extra + missing, - [], - msg='extra names: %r; missing names: %r' % (extra, missing), - ) - self.assertEqual(repr(test_type.CONVERT_STR_TEST_1), '%s.CONVERT_STR_TEST_1' % SHORT_MODULE) - self.assertEqual(str(test_type.CONVERT_STR_TEST_2), 'goodbye') - self.assertEqual(format(test_type.CONVERT_STR_TEST_1), 'hello') - - def test_convert_repr_and_str(self): - test_type = IntEnum._convert_( - 'UnittestConvert', - MODULE, - filter=lambda x: x.startswith('CONVERT_STRING_TEST_'), - as_global=True) - self.assertEqual(repr(test_type.CONVERT_STRING_TEST_NAME_A), '%s.CONVERT_STRING_TEST_NAME_A' % SHORT_MODULE) - self.assertEqual(str(test_type.CONVERT_STRING_TEST_NAME_A), '5') - self.assertEqual(format(test_type.CONVERT_STRING_TEST_NAME_A), '5') - -# helpers - -def enum_dir(cls): - interesting = set(cls._member_names_ + [ - '__class__', '__contains__', '__doc__', '__getitem__', - '__iter__', '__len__', '__members__', '__module__', - '__name__', - ]) - if cls._new_member_ is not object.__new__: - interesting.add('__new__') - if cls.__init_subclass__ is not Enum.__init_subclass__: - interesting.add('__init_subclass__') - if hasattr(object, '__qualname__'): - interesting.add('__qualname__') - for method in ('__init__', '__format__', '__repr__', '__str__'): - if getattr(cls, method) not in (getattr(Enum, method), getattr(Flag, method)): - interesting.add(method) - if cls._member_type_ is object: - return sorted(interesting) - else: - # return whatever mixed-in data type has - return sorted(set(dir(cls._member_type_)) | interesting) - -def member_dir(member): - if member.__class__._member_type_ is object: - allowed = set(['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'value']) - else: - allowed = set(dir(member)) - for cls in member.__class__.mro(): - for name, obj in cls.__dict__.items(): - if name[0] == '_': - continue - if isinstance(obj, enum.property): - if obj.fget is not None or name not in member._member_map_: - allowed.add(name) - else: - allowed.discard(name) - else: - allowed.add(name) - return sorted(allowed) - - - -if __name__ == '__main__': - tempdir = tempfile.mkdtemp() - test = None - try: - if PY3: - test_v3.tempdir = tempdir - test = unittest.main(exit=False) - sys.stdout.flush() - for name, reason in test.result.skipped: - print("%s: %s" % (name, reason)) - finally: - shutil.rmtree(tempdir, True) - if test: - sys.exit(len(test.result.errors or test.result.failures) and 1 or 0) - |