blob: 1edeec55d0779110bfa167d4aa048150a0aadeff [file] [log] [blame]
Serhiy Storchaka76e6cc12015-11-12 11:36:42 +02001import copy
2import pickle
bennorthc20c97f2018-02-26 22:35:03 +00003import sys
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00004import unittest
Raymond Hettinger1a7c3572015-05-26 01:35:54 -07005import collections
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00006from test import test_support
7
8class DictSetTest(unittest.TestCase):
9
10 def test_constructors_not_callable(self):
11 kt = type({}.viewkeys())
12 self.assertRaises(TypeError, kt, {})
13 self.assertRaises(TypeError, kt)
14 it = type({}.viewitems())
15 self.assertRaises(TypeError, it, {})
16 self.assertRaises(TypeError, it)
17 vt = type({}.viewvalues())
18 self.assertRaises(TypeError, vt, {})
19 self.assertRaises(TypeError, vt)
20
21 def test_dict_keys(self):
22 d = {1: 10, "a": "ABC"}
23 keys = d.viewkeys()
24 self.assertEqual(len(keys), 2)
25 self.assertEqual(set(keys), set([1, "a"]))
26 self.assertEqual(keys, set([1, "a"]))
27 self.assertNotEqual(keys, set([1, "a", "b"]))
28 self.assertNotEqual(keys, set([1, "b"]))
29 self.assertNotEqual(keys, set([1]))
30 self.assertNotEqual(keys, 42)
Ezio Melottiaa980582010-01-23 23:04:36 +000031 self.assertIn(1, keys)
32 self.assertIn("a", keys)
33 self.assertNotIn(10, keys)
34 self.assertNotIn("Z", keys)
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +000035 self.assertEqual(d.viewkeys(), d.viewkeys())
36 e = {1: 11, "a": "def"}
37 self.assertEqual(d.viewkeys(), e.viewkeys())
38 del e["a"]
39 self.assertNotEqual(d.viewkeys(), e.viewkeys())
40
41 def test_dict_items(self):
42 d = {1: 10, "a": "ABC"}
43 items = d.viewitems()
44 self.assertEqual(len(items), 2)
45 self.assertEqual(set(items), set([(1, 10), ("a", "ABC")]))
46 self.assertEqual(items, set([(1, 10), ("a", "ABC")]))
47 self.assertNotEqual(items, set([(1, 10), ("a", "ABC"), "junk"]))
48 self.assertNotEqual(items, set([(1, 10), ("a", "def")]))
49 self.assertNotEqual(items, set([(1, 10)]))
50 self.assertNotEqual(items, 42)
Ezio Melottiaa980582010-01-23 23:04:36 +000051 self.assertIn((1, 10), items)
52 self.assertIn(("a", "ABC"), items)
53 self.assertNotIn((1, 11), items)
54 self.assertNotIn(1, items)
55 self.assertNotIn((), items)
56 self.assertNotIn((1,), items)
57 self.assertNotIn((1, 2, 3), items)
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +000058 self.assertEqual(d.viewitems(), d.viewitems())
59 e = d.copy()
60 self.assertEqual(d.viewitems(), e.viewitems())
61 e["a"] = "def"
62 self.assertNotEqual(d.viewitems(), e.viewitems())
63
64 def test_dict_mixed_keys_items(self):
65 d = {(1, 1): 11, (2, 2): 22}
66 e = {1: 1, 2: 2}
67 self.assertEqual(d.viewkeys(), e.viewitems())
68 self.assertNotEqual(d.viewitems(), e.viewkeys())
69
70 def test_dict_values(self):
71 d = {1: 10, "a": "ABC"}
72 values = d.viewvalues()
73 self.assertEqual(set(values), set([10, "ABC"]))
74 self.assertEqual(len(values), 2)
75
76 def test_dict_repr(self):
77 d = {1: 10, "a": "ABC"}
Ezio Melottib0f5adc2010-01-24 16:58:36 +000078 self.assertIsInstance(repr(d), str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000079 r = repr(d.viewitems())
Ezio Melottib0f5adc2010-01-24 16:58:36 +000080 self.assertIsInstance(r, str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000081 self.assertTrue(r == "dict_items([('a', 'ABC'), (1, 10)])" or
82 r == "dict_items([(1, 10), ('a', 'ABC')])")
83 r = repr(d.viewkeys())
Ezio Melottib0f5adc2010-01-24 16:58:36 +000084 self.assertIsInstance(r, str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000085 self.assertTrue(r == "dict_keys(['a', 1])" or
86 r == "dict_keys([1, 'a'])")
87 r = repr(d.viewvalues())
Ezio Melottib0f5adc2010-01-24 16:58:36 +000088 self.assertIsInstance(r, str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000089 self.assertTrue(r == "dict_values(['ABC', 10])" or
90 r == "dict_values([10, 'ABC'])")
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +000091
Alexandre Vassalotti268e4872010-05-04 03:21:51 +000092 def test_keys_set_operations(self):
93 d1 = {'a': 1, 'b': 2}
94 d2 = {'b': 3, 'c': 2}
95 d3 = {'d': 4, 'e': 5}
96 self.assertEqual(d1.viewkeys() & d1.viewkeys(), {'a', 'b'})
97 self.assertEqual(d1.viewkeys() & d2.viewkeys(), {'b'})
98 self.assertEqual(d1.viewkeys() & d3.viewkeys(), set())
99 self.assertEqual(d1.viewkeys() & set(d1.viewkeys()), {'a', 'b'})
100 self.assertEqual(d1.viewkeys() & set(d2.viewkeys()), {'b'})
101 self.assertEqual(d1.viewkeys() & set(d3.viewkeys()), set())
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800102 self.assertEqual(d1.viewkeys() & tuple(d1.viewkeys()), {'a', 'b'})
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000103
104 self.assertEqual(d1.viewkeys() | d1.viewkeys(), {'a', 'b'})
105 self.assertEqual(d1.viewkeys() | d2.viewkeys(), {'a', 'b', 'c'})
106 self.assertEqual(d1.viewkeys() | d3.viewkeys(), {'a', 'b', 'd', 'e'})
107 self.assertEqual(d1.viewkeys() | set(d1.viewkeys()), {'a', 'b'})
108 self.assertEqual(d1.viewkeys() | set(d2.viewkeys()), {'a', 'b', 'c'})
109 self.assertEqual(d1.viewkeys() | set(d3.viewkeys()),
110 {'a', 'b', 'd', 'e'})
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800111 self.assertEqual(d1.viewkeys() | (1, 2), {'a', 'b', 1, 2})
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000112
113 self.assertEqual(d1.viewkeys() ^ d1.viewkeys(), set())
114 self.assertEqual(d1.viewkeys() ^ d2.viewkeys(), {'a', 'c'})
115 self.assertEqual(d1.viewkeys() ^ d3.viewkeys(), {'a', 'b', 'd', 'e'})
116 self.assertEqual(d1.viewkeys() ^ set(d1.viewkeys()), set())
117 self.assertEqual(d1.viewkeys() ^ set(d2.viewkeys()), {'a', 'c'})
118 self.assertEqual(d1.viewkeys() ^ set(d3.viewkeys()),
119 {'a', 'b', 'd', 'e'})
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800120 self.assertEqual(d1.viewkeys() ^ tuple(d2.keys()), {'a', 'c'})
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000121
Ezio Melotti7921b302013-08-08 20:09:19 +0300122 self.assertEqual(d1.viewkeys() - d1.viewkeys(), set())
123 self.assertEqual(d1.viewkeys() - d2.viewkeys(), {'a'})
124 self.assertEqual(d1.viewkeys() - d3.viewkeys(), {'a', 'b'})
125 self.assertEqual(d1.viewkeys() - set(d1.viewkeys()), set())
126 self.assertEqual(d1.viewkeys() - set(d2.viewkeys()), {'a'})
127 self.assertEqual(d1.viewkeys() - set(d3.viewkeys()), {'a', 'b'})
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800128 self.assertEqual(d1.viewkeys() - (0, 1), {'a', 'b'})
Ezio Melotti7921b302013-08-08 20:09:19 +0300129
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000130 def test_items_set_operations(self):
131 d1 = {'a': 1, 'b': 2}
132 d2 = {'a': 2, 'b': 2}
133 d3 = {'d': 4, 'e': 5}
134 self.assertEqual(
135 d1.viewitems() & d1.viewitems(), {('a', 1), ('b', 2)})
136 self.assertEqual(d1.viewitems() & d2.viewitems(), {('b', 2)})
137 self.assertEqual(d1.viewitems() & d3.viewitems(), set())
138 self.assertEqual(d1.viewitems() & set(d1.viewitems()),
139 {('a', 1), ('b', 2)})
140 self.assertEqual(d1.viewitems() & set(d2.viewitems()), {('b', 2)})
141 self.assertEqual(d1.viewitems() & set(d3.viewitems()), set())
142
143 self.assertEqual(d1.viewitems() | d1.viewitems(),
144 {('a', 1), ('b', 2)})
145 self.assertEqual(d1.viewitems() | d2.viewitems(),
146 {('a', 1), ('a', 2), ('b', 2)})
147 self.assertEqual(d1.viewitems() | d3.viewitems(),
148 {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
149 self.assertEqual(d1.viewitems() | set(d1.viewitems()),
150 {('a', 1), ('b', 2)})
151 self.assertEqual(d1.viewitems() | set(d2.viewitems()),
152 {('a', 1), ('a', 2), ('b', 2)})
153 self.assertEqual(d1.viewitems() | set(d3.viewitems()),
154 {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
155
156 self.assertEqual(d1.viewitems() ^ d1.viewitems(), set())
157 self.assertEqual(d1.viewitems() ^ d2.viewitems(),
158 {('a', 1), ('a', 2)})
159 self.assertEqual(d1.viewitems() ^ d3.viewitems(),
160 {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
161
Ezio Melotti7921b302013-08-08 20:09:19 +0300162 self.assertEqual(d1.viewitems() - d1.viewitems(), set())
163 self.assertEqual(d1.viewitems() - d2.viewitems(), {('a', 1)})
164 self.assertEqual(d1.viewitems() - d3.viewitems(), {('a', 1), ('b', 2)})
165 self.assertEqual(d1.viewitems() - set(d1.viewitems()), set())
166 self.assertEqual(d1.viewitems() - set(d2.viewitems()), {('a', 1)})
167 self.assertEqual(d1.viewitems() - set(d3.viewitems()),
168 {('a', 1), ('b', 2)})
169
Benjamin Petersonb91ef002013-05-19 19:38:12 -0700170 def test_recursive_repr(self):
171 d = {}
172 d[42] = d.viewvalues()
bennorthc20c97f2018-02-26 22:35:03 +0000173 r = repr(d)
174 # Cannot perform a stronger test, as the contents of the repr
175 # are implementation-dependent. All we can say is that we
176 # want a str result, not an exception of any sort.
177 self.assertIsInstance(r, str)
178 d[42] = d.viewitems()
179 r = repr(d)
180 # Again.
181 self.assertIsInstance(r, str)
182
183 def test_deeply_nested_repr(self):
184 d = {}
185 for i in range(sys.getrecursionlimit() + 100):
186 d = {42: d.viewvalues()}
Benjamin Petersonb91ef002013-05-19 19:38:12 -0700187 self.assertRaises(RuntimeError, repr, d)
188
Raymond Hettinger1a7c3572015-05-26 01:35:54 -0700189 def test_abc_registry(self):
190 d = dict(a=1)
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000191
Raymond Hettinger1a7c3572015-05-26 01:35:54 -0700192 self.assertIsInstance(d.viewkeys(), collections.KeysView)
193 self.assertIsInstance(d.viewkeys(), collections.MappingView)
194 self.assertIsInstance(d.viewkeys(), collections.Set)
195 self.assertIsInstance(d.viewkeys(), collections.Sized)
196 self.assertIsInstance(d.viewkeys(), collections.Iterable)
197 self.assertIsInstance(d.viewkeys(), collections.Container)
198
199 self.assertIsInstance(d.viewvalues(), collections.ValuesView)
200 self.assertIsInstance(d.viewvalues(), collections.MappingView)
201 self.assertIsInstance(d.viewvalues(), collections.Sized)
202
203 self.assertIsInstance(d.viewitems(), collections.ItemsView)
204 self.assertIsInstance(d.viewitems(), collections.MappingView)
205 self.assertIsInstance(d.viewitems(), collections.Set)
206 self.assertIsInstance(d.viewitems(), collections.Sized)
207 self.assertIsInstance(d.viewitems(), collections.Iterable)
208 self.assertIsInstance(d.viewitems(), collections.Container)
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000209
Serhiy Storchaka76e6cc12015-11-12 11:36:42 +0200210 def test_copy(self):
211 d = {1: 10, "a": "ABC"}
212 self.assertRaises(TypeError, copy.copy, d.viewkeys())
213 self.assertRaises(TypeError, copy.copy, d.viewvalues())
214 self.assertRaises(TypeError, copy.copy, d.viewitems())
215
216 def test_pickle(self):
217 d = {1: 10, "a": "ABC"}
218 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
219 self.assertRaises((TypeError, pickle.PicklingError),
220 pickle.dumps, d.viewkeys(), proto)
221 self.assertRaises((TypeError, pickle.PicklingError),
222 pickle.dumps, d.viewvalues(), proto)
223 self.assertRaises((TypeError, pickle.PicklingError),
224 pickle.dumps, d.viewitems(), proto)
225
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +0000226
227def test_main():
228 test_support.run_unittest(DictSetTest)
229
230if __name__ == "__main__":
231 test_main()