def test_none_collisions(self):
        collisions = [NoneCollision('a', level) for level in range(7)]
        indices = [map_mask(none_hash, shift) for shift in range(0, 32, 5)]

        for i, c in enumerate(collisions[:-1], 1):
            self.assertNotEqual(c, None)
            c_hash = map_hash(c)
            self.assertNotEqual(c_hash, none_hash)
            for j, idx in enumerate(indices[:i]):
                self.assertEqual(map_mask(c_hash, j * 5), idx)
            for j, idx in enumerate(indices[i:], i):
                self.assertNotEqual(map_mask(c_hash, j * 5), idx)

        c = collisions[-1]
        self.assertNotEqual(c, None)
        c_hash = map_hash(c)
        self.assertEqual(c_hash, none_hash)
        for i, idx in enumerate(indices):
            self.assertEqual(map_mask(c_hash, i * 5), idx)
import unittest

from immutables.map import map_hash, map_mask, Map as PyMap
from immutables._testutils import HashKey

none_hash = map_hash(None)
assert (none_hash != 1)
assert ((none_hash >> 32) == 0)

not_collision = 0xffffffff & (~none_hash)

mask = 0x7ffffffff
none_collisions = [
    none_hash & (mask >> shift) for shift in reversed(range(0, 32, 5))
]
assert (len(none_collisions) == 7)
none_collisions = [
    h | (not_collision & (mask << shift))
    for shift, h in zip(range(5, 37, 5), none_collisions)
]


class NoneCollision(HashKey):
    def __init__(self, name, level):
        if name is None:
            raise ValueError("Can't have a NoneCollision with a None value")
        super().__init__(none_collisions[level], name)

    def __eq__(self, other):
        if other is None:
            return False