mirror of https://github.com/jab/bidict.git
87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
![]() |
"""
|
||
|
Equality and hashing tests.
|
||
|
"""
|
||
|
|
||
|
from collections import Counter, Hashable, OrderedDict, Mapping, defaultdict
|
||
|
from itertools import product
|
||
|
|
||
|
import pytest
|
||
|
from bidict import FrozenBidict, FrozenOrderedBidict, OrderedBidict, bidict, namedbidict
|
||
|
from bidict.compat import iteritems
|
||
|
|
||
|
|
||
|
# pylint: disable=C0111
|
||
|
class DictSubcls(dict):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class OrderedBidictSubcls(OrderedBidict):
|
||
|
pass
|
||
|
|
||
|
|
||
|
# pylint: disable=C0103
|
||
|
items = [('a', 1), ('b', 2)] # use int values so makes sense with Counter
|
||
|
itemsreversed = list(reversed(items))
|
||
|
|
||
|
bidict_of_items = bidict(items)
|
||
|
frozenbidict_of_items = FrozenBidict(items)
|
||
|
namedbidict_of_items = namedbidict('named', 'keys', 'vals')(items)
|
||
|
orderedbidict_of_items = OrderedBidict(items)
|
||
|
orderedbidict_of_itemsreversed = OrderedBidict(itemsreversed)
|
||
|
orderedbidictsubcls_of_items = OrderedBidictSubcls(items)
|
||
|
orderedbidictsubcls_of_itemsreversed = OrderedBidictSubcls(itemsreversed)
|
||
|
frozenorderedbidict_of_items = FrozenOrderedBidict(items)
|
||
|
frozenorderedbidict_of_itemsreversed = FrozenOrderedBidict(itemsreversed)
|
||
|
bidicts = (
|
||
|
bidict_of_items,
|
||
|
frozenbidict_of_items,
|
||
|
namedbidict_of_items,
|
||
|
orderedbidict_of_items,
|
||
|
orderedbidict_of_itemsreversed,
|
||
|
orderedbidictsubcls_of_items,
|
||
|
orderedbidictsubcls_of_itemsreversed,
|
||
|
frozenorderedbidict_of_items,
|
||
|
frozenorderedbidict_of_itemsreversed,
|
||
|
)
|
||
|
|
||
|
dict_of_itemsreversed = dict(itemsreversed)
|
||
|
counter_of_itemsreversed = Counter(dict_of_itemsreversed)
|
||
|
defaultdict_of_itemsreversed = defaultdict(lambda x: None, itemsreversed)
|
||
|
dictsubcls_of_itemsreversed = DictSubcls(itemsreversed)
|
||
|
ordereddict_of_items = OrderedDict(items)
|
||
|
ordereddict_of_itemsreversed = OrderedDict(itemsreversed)
|
||
|
empty_dict = {}
|
||
|
not_a_mapping = 42
|
||
|
not_bidicts = (
|
||
|
dict_of_itemsreversed,
|
||
|
counter_of_itemsreversed,
|
||
|
defaultdict_of_itemsreversed,
|
||
|
dictsubcls_of_itemsreversed,
|
||
|
ordereddict_of_items,
|
||
|
ordereddict_of_itemsreversed,
|
||
|
empty_dict,
|
||
|
not_a_mapping,
|
||
|
)
|
||
|
|
||
|
|
||
|
def _infer_compare_ordered(mapping):
|
||
|
if hasattr(mapping, 'should_compare_ordered'):
|
||
|
return mapping.should_compare_ordered()
|
||
|
return bool(getattr(mapping, '__reversed__', False)) and mapping.__class__ is not dict
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize('b, other', product(bidicts, bidicts + not_bidicts))
|
||
|
def test_eq_and_hash(b, other):
|
||
|
if not isinstance(other, Mapping):
|
||
|
assert b != other
|
||
|
elif len(b) != len(other):
|
||
|
assert b != other
|
||
|
else:
|
||
|
should_compare_ordered = _infer_compare_ordered(b) and _infer_compare_ordered(other)
|
||
|
delegate = OrderedDict if should_compare_ordered else dict
|
||
|
should_be_equal = delegate(iteritems(b)) == delegate(iteritems(other))
|
||
|
are_equal = b == other
|
||
|
assert should_be_equal == are_equal
|
||
|
if should_be_equal and isinstance(b, Hashable) and isinstance(other, Hashable):
|
||
|
assert hash(b) == hash(other)
|