summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorRĂ©mi Lapeyre <remi.lapeyre@henki.fr>2018-11-06 00:38:54 (GMT)
committerINADA Naoki <methane@users.noreply.github.com>2018-11-06 00:38:54 (GMT)
commit6531bf6309c8fda1954060a0fb5ea930b1efb656 (patch)
tree64debbc908a8d0dbd043d3114a536a750bb70339 /Lib/test
parent16c8a53490a22bd4fcde2efaf4694dd06ded882b (diff)
downloadcpython-6531bf6309c8fda1954060a0fb5ea930b1efb656.zip
cpython-6531bf6309c8fda1954060a0fb5ea930b1efb656.tar.gz
cpython-6531bf6309c8fda1954060a0fb5ea930b1efb656.tar.bz2
bpo-33462: Add __reversed__ to dict and dict views (GH-6827)
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_collections.py25
-rw-r--r--Lib/test/test_dict.py69
-rw-r--r--Lib/test/test_enumerate.py4
3 files changed, 80 insertions, 18 deletions
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index 0b7cb58..200e027 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -796,22 +796,21 @@ class TestOneTrickPonyABCs(ABCTestCase):
def test_Reversible(self):
# Check some non-reversibles
- non_samples = [None, 42, 3.14, 1j, dict(), set(), frozenset()]
+ non_samples = [None, 42, 3.14, 1j, set(), frozenset()]
for x in non_samples:
self.assertNotIsInstance(x, Reversible)
self.assertFalse(issubclass(type(x), Reversible), repr(type(x)))
# Check some non-reversible iterables
- non_reversibles = [dict().keys(), dict().items(), dict().values(),
- Counter(), Counter().keys(), Counter().items(),
- Counter().values(), _test_gen(),
- (x for x in []), iter([]), reversed([])]
+ non_reversibles = [_test_gen(), (x for x in []), iter([]), reversed([])]
for x in non_reversibles:
self.assertNotIsInstance(x, Reversible)
self.assertFalse(issubclass(type(x), Reversible), repr(type(x)))
# Check some reversible iterables
samples = [bytes(), str(), tuple(), list(), OrderedDict(),
OrderedDict().keys(), OrderedDict().items(),
- OrderedDict().values()]
+ OrderedDict().values(), Counter(), Counter().keys(),
+ Counter().items(), Counter().values(), dict(),
+ dict().keys(), dict().items(), dict().values()]
for x in samples:
self.assertIsInstance(x, Reversible)
self.assertTrue(issubclass(type(x), Reversible), repr(type(x)))
@@ -1612,7 +1611,7 @@ class TestCollectionABCs(ABCTestCase):
self.assertIsInstance(z, set)
list(z)
mymap['blue'] = 7 # Shouldn't affect 'z'
- self.assertEqual(sorted(z), [('orange', 3), ('red', 5)])
+ self.assertEqual(z, {('orange', 3), ('red', 5)})
def test_Sequence(self):
for sample in [tuple, list, bytes, str]:
@@ -1767,10 +1766,10 @@ class TestCounter(unittest.TestCase):
self.assertTrue(issubclass(Counter, Mapping))
self.assertEqual(len(c), 3)
self.assertEqual(sum(c.values()), 6)
- self.assertEqual(sorted(c.values()), [1, 2, 3])
- self.assertEqual(sorted(c.keys()), ['a', 'b', 'c'])
- self.assertEqual(sorted(c), ['a', 'b', 'c'])
- self.assertEqual(sorted(c.items()),
+ self.assertEqual(list(c.values()), [3, 2, 1])
+ self.assertEqual(list(c.keys()), ['a', 'b', 'c'])
+ self.assertEqual(list(c), ['a', 'b', 'c'])
+ self.assertEqual(list(c.items()),
[('a', 3), ('b', 2), ('c', 1)])
self.assertEqual(c['b'], 2)
self.assertEqual(c['z'], 0)
@@ -1784,7 +1783,7 @@ class TestCounter(unittest.TestCase):
for i in range(5):
self.assertEqual(c.most_common(i),
[('a', 3), ('b', 2), ('c', 1)][:i])
- self.assertEqual(''.join(sorted(c.elements())), 'aaabbc')
+ self.assertEqual(''.join(c.elements()), 'aaabbc')
c['a'] += 1 # increment an existing value
c['b'] -= 2 # sub existing value to zero
del c['c'] # remove an entry
@@ -1793,7 +1792,7 @@ class TestCounter(unittest.TestCase):
c['e'] = -5 # directly assign a missing value
c['f'] += 4 # add to a missing value
self.assertEqual(c, dict(a=4, b=0, d=-2, e=-5, f=4))
- self.assertEqual(''.join(sorted(c.elements())), 'aaaaffff')
+ self.assertEqual(''.join(c.elements()), 'aaaaffff')
self.assertEqual(c.pop('f'), 4)
self.assertNotIn('f', c)
for i in range(3):
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index 90c0a31..71fffe3 100644
--- a/Lib/test/test_dict.py
+++ b/Lib/test/test_dict.py
@@ -1021,7 +1021,7 @@ class DictTest(unittest.TestCase):
it = iter(data)
d = pickle.dumps(it, proto)
it = pickle.loads(d)
- self.assertEqual(sorted(it), sorted(data))
+ self.assertEqual(list(it), list(data))
it = pickle.loads(d)
try:
@@ -1031,7 +1031,7 @@ class DictTest(unittest.TestCase):
d = pickle.dumps(it, proto)
it = pickle.loads(d)
del data[drop]
- self.assertEqual(sorted(it), sorted(data))
+ self.assertEqual(list(it), list(data))
def test_itemiterator_pickling(self):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
@@ -1062,7 +1062,7 @@ class DictTest(unittest.TestCase):
it = iter(data.values())
d = pickle.dumps(it, proto)
it = pickle.loads(d)
- self.assertEqual(sorted(list(it)), sorted(list(data.values())))
+ self.assertEqual(list(it), list(data.values()))
it = pickle.loads(d)
drop = next(it)
@@ -1071,6 +1071,62 @@ class DictTest(unittest.TestCase):
values = list(it) + [drop]
self.assertEqual(sorted(values), sorted(list(data.values())))
+ def test_reverseiterator_pickling(self):
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ data = {1:"a", 2:"b", 3:"c"}
+ it = reversed(data)
+ d = pickle.dumps(it, proto)
+ it = pickle.loads(d)
+ self.assertEqual(list(it), list(reversed(data)))
+
+ it = pickle.loads(d)
+ try:
+ drop = next(it)
+ except StopIteration:
+ continue
+ d = pickle.dumps(it, proto)
+ it = pickle.loads(d)
+ del data[drop]
+ self.assertEqual(list(it), list(reversed(data)))
+
+ def test_reverseitemiterator_pickling(self):
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ data = {1:"a", 2:"b", 3:"c"}
+ # dictviews aren't picklable, only their iterators
+ itorg = reversed(data.items())
+ d = pickle.dumps(itorg, proto)
+ it = pickle.loads(d)
+ # note that the type of the unpickled iterator
+ # is not necessarily the same as the original. It is
+ # merely an object supporting the iterator protocol, yielding
+ # the same objects as the original one.
+ # self.assertEqual(type(itorg), type(it))
+ self.assertIsInstance(it, collections.abc.Iterator)
+ self.assertEqual(dict(it), data)
+
+ it = pickle.loads(d)
+ drop = next(it)
+ d = pickle.dumps(it, proto)
+ it = pickle.loads(d)
+ del data[drop[0]]
+ self.assertEqual(dict(it), data)
+
+ def test_reversevaluesiterator_pickling(self):
+ for proto in range(pickle.HIGHEST_PROTOCOL):
+ data = {1:"a", 2:"b", 3:"c"}
+ # data.values() isn't picklable, only its iterator
+ it = reversed(data.values())
+ d = pickle.dumps(it, proto)
+ it = pickle.loads(d)
+ self.assertEqual(list(it), list(reversed(data.values())))
+
+ it = pickle.loads(d)
+ drop = next(it)
+ d = pickle.dumps(it, proto)
+ it = pickle.loads(d)
+ values = list(it) + [drop]
+ self.assertEqual(sorted(values), sorted(data.values()))
+
def test_instance_dict_getattr_str_subclass(self):
class Foo:
def __init__(self, msg):
@@ -1222,6 +1278,13 @@ class DictTest(unittest.TestCase):
self.assertRaises(RuntimeError, iter_and_mutate)
+ def test_reversed(self):
+ d = {"a": 1, "b": 2, "foo": 0, "c": 3, "d": 4}
+ del d["foo"]
+ r = reversed(d)
+ self.assertEqual(list(r), list('dcba'))
+ self.assertRaises(StopIteration, next, r)
+
def test_dict_copy_order(self):
# bpo-34320
od = collections.OrderedDict([('a', 1), ('b', 2)])
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py
index e455ade..5785cb4 100644
--- a/Lib/test/test_enumerate.py
+++ b/Lib/test/test_enumerate.py
@@ -160,9 +160,9 @@ class TestReversed(unittest.TestCase, PickleTest):
raise StopIteration
def __len__(self):
return 5
- for data in 'abc', range(5), tuple(enumerate('abc')), A(), range(1,17,5):
+ for data in ('abc', range(5), tuple(enumerate('abc')), A(),
+ range(1,17,5), dict.fromkeys('abcde')):
self.assertEqual(list(data)[::-1], list(reversed(data)))
- self.assertRaises(TypeError, reversed, {})
# don't allow keyword arguments
self.assertRaises(TypeError, reversed, [], a=1)