diff options
author | RĂ©mi Lapeyre <remi.lapeyre@henki.fr> | 2018-11-06 00:38:54 (GMT) |
---|---|---|
committer | INADA Naoki <methane@users.noreply.github.com> | 2018-11-06 00:38:54 (GMT) |
commit | 6531bf6309c8fda1954060a0fb5ea930b1efb656 (patch) | |
tree | 64debbc908a8d0dbd043d3114a536a750bb70339 /Lib/test | |
parent | 16c8a53490a22bd4fcde2efaf4694dd06ded882b (diff) | |
download | cpython-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.py | 25 | ||||
-rw-r--r-- | Lib/test/test_dict.py | 69 | ||||
-rw-r--r-- | Lib/test/test_enumerate.py | 4 |
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) |