blob: b585bdd90203eac8357ce3a561752aa863395ab1 [file] [log] [blame]
Serhiy Storchaka76e6cc12015-11-12 11:36:42 +02001import copy
2import pickle
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00003import unittest
Raymond Hettinger1a7c3572015-05-26 01:35:54 -07004import collections
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +00005from test import test_support
6
7class DictSetTest(unittest.TestCase):
8
9 def test_constructors_not_callable(self):
10 kt = type({}.viewkeys())
11 self.assertRaises(TypeError, kt, {})
12 self.assertRaises(TypeError, kt)
13 it = type({}.viewitems())
14 self.assertRaises(TypeError, it, {})
15 self.assertRaises(TypeError, it)
16 vt = type({}.viewvalues())
17 self.assertRaises(TypeError, vt, {})
18 self.assertRaises(TypeError, vt)
19
20 def test_dict_keys(self):
21 d = {1: 10, "a": "ABC"}
22 keys = d.viewkeys()
23 self.assertEqual(len(keys), 2)
24 self.assertEqual(set(keys), set([1, "a"]))
25 self.assertEqual(keys, set([1, "a"]))
26 self.assertNotEqual(keys, set([1, "a", "b"]))
27 self.assertNotEqual(keys, set([1, "b"]))
28 self.assertNotEqual(keys, set([1]))
29 self.assertNotEqual(keys, 42)
Ezio Melottiaa980582010-01-23 23:04:36 +000030 self.assertIn(1, keys)
31 self.assertIn("a", keys)
32 self.assertNotIn(10, keys)
33 self.assertNotIn("Z", keys)
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +000034 self.assertEqual(d.viewkeys(), d.viewkeys())
35 e = {1: 11, "a": "def"}
36 self.assertEqual(d.viewkeys(), e.viewkeys())
37 del e["a"]
38 self.assertNotEqual(d.viewkeys(), e.viewkeys())
39
40 def test_dict_items(self):
41 d = {1: 10, "a": "ABC"}
42 items = d.viewitems()
43 self.assertEqual(len(items), 2)
44 self.assertEqual(set(items), set([(1, 10), ("a", "ABC")]))
45 self.assertEqual(items, set([(1, 10), ("a", "ABC")]))
46 self.assertNotEqual(items, set([(1, 10), ("a", "ABC"), "junk"]))
47 self.assertNotEqual(items, set([(1, 10), ("a", "def")]))
48 self.assertNotEqual(items, set([(1, 10)]))
49 self.assertNotEqual(items, 42)
Ezio Melottiaa980582010-01-23 23:04:36 +000050 self.assertIn((1, 10), items)
51 self.assertIn(("a", "ABC"), items)
52 self.assertNotIn((1, 11), items)
53 self.assertNotIn(1, items)
54 self.assertNotIn((), items)
55 self.assertNotIn((1,), items)
56 self.assertNotIn((1, 2, 3), items)
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +000057 self.assertEqual(d.viewitems(), d.viewitems())
58 e = d.copy()
59 self.assertEqual(d.viewitems(), e.viewitems())
60 e["a"] = "def"
61 self.assertNotEqual(d.viewitems(), e.viewitems())
62
63 def test_dict_mixed_keys_items(self):
64 d = {(1, 1): 11, (2, 2): 22}
65 e = {1: 1, 2: 2}
66 self.assertEqual(d.viewkeys(), e.viewitems())
67 self.assertNotEqual(d.viewitems(), e.viewkeys())
68
69 def test_dict_values(self):
70 d = {1: 10, "a": "ABC"}
71 values = d.viewvalues()
72 self.assertEqual(set(values), set([10, "ABC"]))
73 self.assertEqual(len(values), 2)
74
75 def test_dict_repr(self):
76 d = {1: 10, "a": "ABC"}
Ezio Melottib0f5adc2010-01-24 16:58:36 +000077 self.assertIsInstance(repr(d), str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000078 r = repr(d.viewitems())
Ezio Melottib0f5adc2010-01-24 16:58:36 +000079 self.assertIsInstance(r, str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000080 self.assertTrue(r == "dict_items([('a', 'ABC'), (1, 10)])" or
81 r == "dict_items([(1, 10), ('a', 'ABC')])")
82 r = repr(d.viewkeys())
Ezio Melottib0f5adc2010-01-24 16:58:36 +000083 self.assertIsInstance(r, str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000084 self.assertTrue(r == "dict_keys(['a', 1])" or
85 r == "dict_keys([1, 'a'])")
86 r = repr(d.viewvalues())
Ezio Melottib0f5adc2010-01-24 16:58:36 +000087 self.assertIsInstance(r, str)
Alexandre Vassalotti58a96ef2010-01-12 01:34:43 +000088 self.assertTrue(r == "dict_values(['ABC', 10])" or
89 r == "dict_values([10, 'ABC'])")
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +000090
Alexandre Vassalotti268e4872010-05-04 03:21:51 +000091 def test_keys_set_operations(self):
92 d1 = {'a': 1, 'b': 2}
93 d2 = {'b': 3, 'c': 2}
94 d3 = {'d': 4, 'e': 5}
95 self.assertEqual(d1.viewkeys() & d1.viewkeys(), {'a', 'b'})
96 self.assertEqual(d1.viewkeys() & d2.viewkeys(), {'b'})
97 self.assertEqual(d1.viewkeys() & d3.viewkeys(), set())
98 self.assertEqual(d1.viewkeys() & set(d1.viewkeys()), {'a', 'b'})
99 self.assertEqual(d1.viewkeys() & set(d2.viewkeys()), {'b'})
100 self.assertEqual(d1.viewkeys() & set(d3.viewkeys()), set())
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800101 self.assertEqual(d1.viewkeys() & tuple(d1.viewkeys()), {'a', 'b'})
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000102
103 self.assertEqual(d1.viewkeys() | d1.viewkeys(), {'a', 'b'})
104 self.assertEqual(d1.viewkeys() | d2.viewkeys(), {'a', 'b', 'c'})
105 self.assertEqual(d1.viewkeys() | d3.viewkeys(), {'a', 'b', 'd', 'e'})
106 self.assertEqual(d1.viewkeys() | set(d1.viewkeys()), {'a', 'b'})
107 self.assertEqual(d1.viewkeys() | set(d2.viewkeys()), {'a', 'b', 'c'})
108 self.assertEqual(d1.viewkeys() | set(d3.viewkeys()),
109 {'a', 'b', 'd', 'e'})
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800110 self.assertEqual(d1.viewkeys() | (1, 2), {'a', 'b', 1, 2})
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000111
112 self.assertEqual(d1.viewkeys() ^ d1.viewkeys(), set())
113 self.assertEqual(d1.viewkeys() ^ d2.viewkeys(), {'a', 'c'})
114 self.assertEqual(d1.viewkeys() ^ d3.viewkeys(), {'a', 'b', 'd', 'e'})
115 self.assertEqual(d1.viewkeys() ^ set(d1.viewkeys()), set())
116 self.assertEqual(d1.viewkeys() ^ set(d2.viewkeys()), {'a', 'c'})
117 self.assertEqual(d1.viewkeys() ^ set(d3.viewkeys()),
118 {'a', 'b', 'd', 'e'})
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800119 self.assertEqual(d1.viewkeys() ^ tuple(d2.keys()), {'a', 'c'})
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000120
Ezio Melotti7921b302013-08-08 20:09:19 +0300121 self.assertEqual(d1.viewkeys() - d1.viewkeys(), set())
122 self.assertEqual(d1.viewkeys() - d2.viewkeys(), {'a'})
123 self.assertEqual(d1.viewkeys() - d3.viewkeys(), {'a', 'b'})
124 self.assertEqual(d1.viewkeys() - set(d1.viewkeys()), set())
125 self.assertEqual(d1.viewkeys() - set(d2.viewkeys()), {'a'})
126 self.assertEqual(d1.viewkeys() - set(d3.viewkeys()), {'a', 'b'})
Benjamin Peterson4ddb44a2016-03-03 22:05:36 -0800127 self.assertEqual(d1.viewkeys() - (0, 1), {'a', 'b'})
Ezio Melotti7921b302013-08-08 20:09:19 +0300128
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000129 def test_items_set_operations(self):
130 d1 = {'a': 1, 'b': 2}
131 d2 = {'a': 2, 'b': 2}
132 d3 = {'d': 4, 'e': 5}
133 self.assertEqual(
134 d1.viewitems() & d1.viewitems(), {('a', 1), ('b', 2)})
135 self.assertEqual(d1.viewitems() & d2.viewitems(), {('b', 2)})
136 self.assertEqual(d1.viewitems() & d3.viewitems(), set())
137 self.assertEqual(d1.viewitems() & set(d1.viewitems()),
138 {('a', 1), ('b', 2)})
139 self.assertEqual(d1.viewitems() & set(d2.viewitems()), {('b', 2)})
140 self.assertEqual(d1.viewitems() & set(d3.viewitems()), set())
141
142 self.assertEqual(d1.viewitems() | d1.viewitems(),
143 {('a', 1), ('b', 2)})
144 self.assertEqual(d1.viewitems() | d2.viewitems(),
145 {('a', 1), ('a', 2), ('b', 2)})
146 self.assertEqual(d1.viewitems() | d3.viewitems(),
147 {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
148 self.assertEqual(d1.viewitems() | set(d1.viewitems()),
149 {('a', 1), ('b', 2)})
150 self.assertEqual(d1.viewitems() | set(d2.viewitems()),
151 {('a', 1), ('a', 2), ('b', 2)})
152 self.assertEqual(d1.viewitems() | set(d3.viewitems()),
153 {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
154
155 self.assertEqual(d1.viewitems() ^ d1.viewitems(), set())
156 self.assertEqual(d1.viewitems() ^ d2.viewitems(),
157 {('a', 1), ('a', 2)})
158 self.assertEqual(d1.viewitems() ^ d3.viewitems(),
159 {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
160
Ezio Melotti7921b302013-08-08 20:09:19 +0300161 self.assertEqual(d1.viewitems() - d1.viewitems(), set())
162 self.assertEqual(d1.viewitems() - d2.viewitems(), {('a', 1)})
163 self.assertEqual(d1.viewitems() - d3.viewitems(), {('a', 1), ('b', 2)})
164 self.assertEqual(d1.viewitems() - set(d1.viewitems()), set())
165 self.assertEqual(d1.viewitems() - set(d2.viewitems()), {('a', 1)})
166 self.assertEqual(d1.viewitems() - set(d3.viewitems()),
167 {('a', 1), ('b', 2)})
168
Benjamin Petersonb91ef002013-05-19 19:38:12 -0700169 def test_recursive_repr(self):
170 d = {}
171 d[42] = d.viewvalues()
172 self.assertRaises(RuntimeError, repr, d)
173
Raymond Hettinger1a7c3572015-05-26 01:35:54 -0700174 def test_abc_registry(self):
175 d = dict(a=1)
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000176
Raymond Hettinger1a7c3572015-05-26 01:35:54 -0700177 self.assertIsInstance(d.viewkeys(), collections.KeysView)
178 self.assertIsInstance(d.viewkeys(), collections.MappingView)
179 self.assertIsInstance(d.viewkeys(), collections.Set)
180 self.assertIsInstance(d.viewkeys(), collections.Sized)
181 self.assertIsInstance(d.viewkeys(), collections.Iterable)
182 self.assertIsInstance(d.viewkeys(), collections.Container)
183
184 self.assertIsInstance(d.viewvalues(), collections.ValuesView)
185 self.assertIsInstance(d.viewvalues(), collections.MappingView)
186 self.assertIsInstance(d.viewvalues(), collections.Sized)
187
188 self.assertIsInstance(d.viewitems(), collections.ItemsView)
189 self.assertIsInstance(d.viewitems(), collections.MappingView)
190 self.assertIsInstance(d.viewitems(), collections.Set)
191 self.assertIsInstance(d.viewitems(), collections.Sized)
192 self.assertIsInstance(d.viewitems(), collections.Iterable)
193 self.assertIsInstance(d.viewitems(), collections.Container)
Alexandre Vassalotti268e4872010-05-04 03:21:51 +0000194
Serhiy Storchaka76e6cc12015-11-12 11:36:42 +0200195 def test_copy(self):
196 d = {1: 10, "a": "ABC"}
197 self.assertRaises(TypeError, copy.copy, d.viewkeys())
198 self.assertRaises(TypeError, copy.copy, d.viewvalues())
199 self.assertRaises(TypeError, copy.copy, d.viewitems())
200
201 def test_pickle(self):
202 d = {1: 10, "a": "ABC"}
203 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
204 self.assertRaises((TypeError, pickle.PicklingError),
205 pickle.dumps, d.viewkeys(), proto)
206 self.assertRaises((TypeError, pickle.PicklingError),
207 pickle.dumps, d.viewvalues(), proto)
208 self.assertRaises((TypeError, pickle.PicklingError),
209 pickle.dumps, d.viewitems(), proto)
210
Alexandre Vassalotti69eb5162010-01-11 23:17:10 +0000211
212def test_main():
213 test_support.run_unittest(DictSetTest)
214
215if __name__ == "__main__":
216 test_main()