@@ -1312,6 +1312,31 @@ def test_reversed(self):
13121312 self .assertEqual (list (r ), list ('dcba' ))
13131313 self .assertRaises (StopIteration , next , r )
13141314
1315+ def test_reverse_iterator_for_empty_dict (self ):
1316+ # bpo-38525: revered iterator should work properly
1317+
1318+ # empty dict is directly used for reference count test
1319+ self .assertEqual (list (reversed ({})), [])
1320+ self .assertEqual (list (reversed ({}.items ())), [])
1321+ self .assertEqual (list (reversed ({}.values ())), [])
1322+ self .assertEqual (list (reversed ({}.keys ())), [])
1323+
1324+ # dict() and {} don't trigger the same code path
1325+ self .assertEqual (list (reversed (dict ())), [])
1326+ self .assertEqual (list (reversed (dict ().items ())), [])
1327+ self .assertEqual (list (reversed (dict ().values ())), [])
1328+ self .assertEqual (list (reversed (dict ().keys ())), [])
1329+
1330+ def test_reverse_iterator_for_shared_shared_dicts (self ):
1331+ class A :
1332+ def __init__ (self , x , y ):
1333+ if x : self .x = x
1334+ if y : self .y = y
1335+
1336+ self .assertEqual (list (reversed (A (1 , 2 ).__dict__ )), ['y' , 'x' ])
1337+ self .assertEqual (list (reversed (A (1 , 0 ).__dict__ )), ['x' ])
1338+ self .assertEqual (list (reversed (A (0 , 1 ).__dict__ )), ['y' ])
1339+
13151340 def test_dict_copy_order (self ):
13161341 # bpo-34320
13171342 od = collections .OrderedDict ([('a' , 1 ), ('b' , 2 )])
0 commit comments