forked from hiero-ledger/hiero-sdk-python
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathstatus_enum_hashability_test.py
More file actions
57 lines (43 loc) · 1.94 KB
/
Copy pathstatus_enum_hashability_test.py
File metadata and controls
57 lines (43 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
"""
Hashability tests for status enums that define a custom __eq__.
Defining __eq__ in a class body sets __hash__ = None unless __hash__ is
also defined — which had silently made these Enum members unhashable:
natural user code like `status in {TokenFreezeStatus.FROZEN}` raised
TypeError. These tests pin that every such enum is hashable and that its
hash is consistent with its int-accepting __eq__ (equal objects must hash
equally, so hash(MEMBER) == hash(MEMBER.value)).
"""
from __future__ import annotations
import pytest
from hiero_sdk_python.system.freeze_type import FreezeType
from hiero_sdk_python.tokens.token_freeze_status import TokenFreezeStatus
from hiero_sdk_python.tokens.token_key_validation import TokenKeyValidation
from hiero_sdk_python.tokens.token_kyc_status import TokenKycStatus
from hiero_sdk_python.tokens.token_pause_status import TokenPauseStatus
pytestmark = pytest.mark.unit
STATUS_ENUMS = [
TokenFreezeStatus,
TokenKycStatus,
TokenPauseStatus,
FreezeType,
TokenKeyValidation,
]
_IDS = [cls.__name__ for cls in STATUS_ENUMS]
@pytest.mark.parametrize("enum_cls", STATUS_ENUMS, ids=_IDS)
def test_members_are_hashable(enum_cls):
"""Every member must be hashable — usable in sets and as dict keys."""
members = list(enum_cls)
assert set(members) == set(members)
assert members[0] in set(members)
lookup = {member: member.name for member in members}
assert lookup[members[0]] == members[0].name
@pytest.mark.parametrize("enum_cls", STATUS_ENUMS, ids=_IDS)
def test_hash_is_consistent_with_int_equality(enum_cls):
"""__eq__ equates members with their int value, so their hashes must
match too — otherwise `member.value in {member}` would be False while
`member.value == member` is True."""
for member in enum_cls:
assert member == member.value
assert hash(member) == hash(member.value)
assert member.value in {member}
assert member in {member.value}