Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aaa48ff

Browse files
committed
Extend the weakref test suite to cover the complete mapping interface for
both weakref.Weak*Dictionary classes. This closes SF bug #416480.
1 parent 791c351 commit aaa48ff

1 file changed

Lines changed: 61 additions & 4 deletions

File tree

Lib/test/test_weakref.py

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -292,19 +292,25 @@ def check_iters(self, dict):
292292
items = dict.items()
293293
for item in dict.iteritems():
294294
items.remove(item)
295-
self.assert_(len(items) == 0, "iterator did not touch all items")
295+
self.assert_(len(items) == 0, "iteritems() did not touch all items")
296296

297-
# key iterator:
297+
# key iterator, via __iter__():
298298
keys = dict.keys()
299299
for k in dict:
300300
keys.remove(k)
301-
self.assert_(len(keys) == 0, "iterator did not touch all keys")
301+
self.assert_(len(keys) == 0, "__iter__() did not touch all keys")
302+
303+
# key iterator, via iterkeys():
304+
keys = dict.keys()
305+
for k in dict.iterkeys():
306+
keys.remove(k)
307+
self.assert_(len(keys) == 0, "iterkeys() did not touch all keys")
302308

303309
# value iterator:
304310
values = dict.values()
305311
for v in dict.itervalues():
306312
values.remove(v)
307-
self.assert_(len(values) == 0, "iterator did not touch all values")
313+
self.assert_(len(values) == 0, "itervalues() did not touch all values")
308314

309315
def make_weak_keyed_dict(self):
310316
dict = weakref.WeakKeyDictionary()
@@ -320,6 +326,57 @@ def make_weak_valued_dict(self):
320326
dict[o.arg] = o
321327
return dict, objects
322328

329+
def check_popitem(self, klass, key1, value1, key2, value2):
330+
weakdict = klass()
331+
weakdict[key1] = value1
332+
weakdict[key2] = value2
333+
self.assert_(len(weakdict) == 2)
334+
k, v = weakdict.popitem()
335+
self.assert_(len(weakdict) == 1)
336+
if k is key1:
337+
self.assert_(v is value1)
338+
else:
339+
self.assert_(v is value2)
340+
k, v = weakdict.popitem()
341+
self.assert_(len(weakdict) == 0)
342+
if k is key1:
343+
self.assert_(v is value1)
344+
else:
345+
self.assert_(v is value2)
346+
347+
def test_weak_valued_dict_popitem(self):
348+
self.check_popitem(weakref.WeakValueDictionary,
349+
"key1", C(), "key2", C())
350+
351+
def test_weak_keyed_dict_popitem(self):
352+
self.check_popitem(weakref.WeakKeyDictionary,
353+
C(), "value 1", C(), "value 2")
354+
355+
def check_setdefault(self, klass, key, value1, value2):
356+
self.assert_(value1 is not value2,
357+
"invalid test"
358+
" -- value parameters must be distinct objects")
359+
weakdict = klass()
360+
o = weakdict.setdefault(key, value1)
361+
self.assert_(o is value1)
362+
self.assert_(weakdict.has_key(key))
363+
self.assert_(weakdict.get(key) is value1)
364+
self.assert_(weakdict[key] is value1)
365+
366+
o = weakdict.setdefault(key, value2)
367+
self.assert_(o is value1)
368+
self.assert_(weakdict.has_key(key))
369+
self.assert_(weakdict.get(key) is value1)
370+
self.assert_(weakdict[key] is value1)
371+
372+
def test_weak_valued_dict_setdefault(self):
373+
self.check_setdefault(weakref.WeakValueDictionary,
374+
"key", C(), C())
375+
376+
def test_weak_keyed_dict_setdefault(self):
377+
self.check_setdefault(weakref.WeakKeyDictionary,
378+
C(), "value 1", "value 2")
379+
323380
def check_update(self, klass, dict):
324381
#
325382
# This exercises d.update(), len(d), d.keys(), d.has_key(),

0 commit comments

Comments
 (0)