def test_dict_grow_cleanup(self): DICT = self._get_str_dict() ll_d = rordereddict.ll_newdict(DICT) lls = llstr("a") for i in range(40): rordereddict.ll_dict_setitem(ll_d, lls, i) rordereddict.ll_dict_delitem(ll_d, lls) assert ll_d.num_ever_used_items <= 10
def test_dict_del_not_lastitem(self): DICT = self._get_str_dict() ll_d = rordereddict.ll_newdict(DICT) rordereddict.ll_dict_setitem(ll_d, llstr("abc"), 13) rordereddict.ll_dict_setitem(ll_d, llstr("def"), 15) rordereddict.ll_dict_delitem(ll_d, llstr("abc")) assert count_items(ll_d, rordereddict.FREE) == rordereddict.DICT_INITSIZE - 2 assert count_items(ll_d, rordereddict.DELETED) == 1
def test_bug_remove_deleted_items(self): DICT = self._get_str_dict() ll_d = rordereddict.ll_newdict(DICT) for i in range(15): rordereddict.ll_dict_setitem(ll_d, llstr(chr(i)), 5) for i in range(15): rordereddict.ll_dict_delitem(ll_d, llstr(chr(i))) rordereddict.ll_prepare_dict_update(ll_d, 7)
def test_direct_enter_and_del(self): DICT = self._get_int_dict() ll_d = rordereddict.ll_newdict(DICT) numbers = [i * rordereddict.DICT_INITSIZE + 1 for i in range(8)] for num in numbers: rordereddict.ll_dict_setitem(ll_d, num, 1) rordereddict.ll_dict_delitem(ll_d, num) for k in foreach_index(ll_d): assert k < rordereddict.VALID_OFFSET
def test_dict_del_lastitem(self): DICT = self._get_str_dict() ll_d = rordereddict.ll_newdict(DICT) py.test.raises(KeyError, rordereddict.ll_dict_delitem, ll_d, llstr("abc")) rordereddict.ll_dict_setitem(ll_d, llstr("abc"), 13) py.test.raises(KeyError, rordereddict.ll_dict_delitem, ll_d, llstr("def")) rordereddict.ll_dict_delitem(ll_d, llstr("abc")) assert count_items(ll_d, rordereddict.FREE) == rordereddict.DICT_INITSIZE - 1 assert count_items(ll_d, rordereddict.DELETED) == 1 py.test.raises(KeyError, rordereddict.ll_dict_getitem, ll_d, llstr("abc"))
def test_dict_store_get_del(self): DICT = self._get_str_dict() ll_d = rordereddict.ll_newdict(DICT) for i in range(20): for j in range(0, i, 2): assert rordereddict.ll_dict_getitem(ll_d, llstr(str(j))) == j rordereddict.ll_dict_setitem(ll_d, llstr(str(i)), i) if i % 2 != 0: rordereddict.ll_dict_delitem(ll_d, llstr(str(i))) assert ll_d.num_live_items == 10 for i in range(0, 20, 2): assert rordereddict.ll_dict_getitem(ll_d, llstr(str(i))) == i
def test_direct_enter_and_del(self): def eq(a, b): return a == b DICT = rordereddict.get_ll_dict(lltype.Signed, lltype.Signed, ll_fasthash_function=intmask, ll_hash_function=intmask, ll_eq_function=eq) ll_d = rordereddict.ll_newdict(DICT) numbers = [i * rordereddict.DICT_INITSIZE + 1 for i in range(8)] for num in numbers: rordereddict.ll_dict_setitem(ll_d, num, 1) rordereddict.ll_dict_delitem(ll_d, num) for k in foreach_index(ll_d): assert k < rordereddict.VALID_OFFSET
def test_popitem_first_bug(self): DICT = self._get_str_dict() ll_d = rordereddict.ll_newdict(DICT) rordereddict.ll_dict_setitem(ll_d, llstr("k"), 1) rordereddict.ll_dict_setitem(ll_d, llstr("j"), 1) rordereddict.ll_dict_delitem(ll_d, llstr("k")) ITER = rordereddict.get_ll_dictiter(lltype.Ptr(DICT)) ll_iter = rordereddict.ll_dictiter(ITER, ll_d) num = rordereddict._ll_dictnext(ll_iter) ll_key = ll_d.entries[num].key assert hlstr(ll_key) == "j" assert ll_d.lookup_function_no == 4 # 1 free item found at the start rordereddict.ll_dict_delitem(ll_d, llstr("j")) assert ll_d.num_ever_used_items == 0 assert ll_d.lookup_function_no == 0 # reset
def test_popitem_first(self): DICT = self._get_str_dict() ll_d = rordereddict.ll_newdict(DICT) rordereddict.ll_dict_setitem(ll_d, llstr("k"), 1) rordereddict.ll_dict_setitem(ll_d, llstr("j"), 2) rordereddict.ll_dict_setitem(ll_d, llstr("m"), 3) ITER = rordereddict.get_ll_dictiter(lltype.Ptr(DICT)) for expected in ["k", "j", "m"]: ll_iter = rordereddict.ll_dictiter(ITER, ll_d) num = rordereddict._ll_dictnext(ll_iter) ll_key = ll_d.entries[num].key assert hlstr(ll_key) == expected rordereddict.ll_dict_delitem(ll_d, ll_key) ll_iter = rordereddict.ll_dictiter(ITER, ll_d) py.test.raises(StopIteration, rordereddict._ll_dictnext, ll_iter)
def test_bug_resize_counter(self): DICT = self._get_int_dict() ll_d = rordereddict.ll_newdict(DICT) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_delitem(ll_d, 0) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_delitem(ll_d, 0) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_delitem(ll_d, 0) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_delitem(ll_d, 0) rordereddict.ll_dict_setitem(ll_d, 1, 0) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_setitem(ll_d, 2, 0) rordereddict.ll_dict_delitem(ll_d, 1) rordereddict.ll_dict_delitem(ll_d, 0) rordereddict.ll_dict_delitem(ll_d, 2) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_delitem(ll_d, 0) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_delitem(ll_d, 0) rordereddict.ll_dict_setitem(ll_d, 0, 0) rordereddict.ll_dict_setitem(ll_d, 1, 0) d = ll_d idx = d.indexes._obj.container num_nonfrees = 0 for i in range(idx.getlength()): got = idx.getitem(i) # 0: unused; 1: deleted num_nonfrees += (got > 0) assert d.resize_counter <= idx.getlength() * 2 - num_nonfrees * 3