@@ -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