1import unittest
2from test import test_support
3
4class DictSetTest(unittest.TestCase):
5
6    def test_constructors_not_callable(self):
7        kt = type({}.viewkeys())
8        self.assertRaises(TypeError, kt, {})
9        self.assertRaises(TypeError, kt)
10        it = type({}.viewitems())
11        self.assertRaises(TypeError, it, {})
12        self.assertRaises(TypeError, it)
13        vt = type({}.viewvalues())
14        self.assertRaises(TypeError, vt, {})
15        self.assertRaises(TypeError, vt)
16
17    def test_dict_keys(self):
18        d = {1: 10, "a": "ABC"}
19        keys = d.viewkeys()
20        self.assertEqual(len(keys), 2)
21        self.assertEqual(set(keys), set([1, "a"]))
22        self.assertEqual(keys, set([1, "a"]))
23        self.assertNotEqual(keys, set([1, "a", "b"]))
24        self.assertNotEqual(keys, set([1, "b"]))
25        self.assertNotEqual(keys, set([1]))
26        self.assertNotEqual(keys, 42)
27        self.assertIn(1, keys)
28        self.assertIn("a", keys)
29        self.assertNotIn(10, keys)
30        self.assertNotIn("Z", keys)
31        self.assertEqual(d.viewkeys(), d.viewkeys())
32        e = {1: 11, "a": "def"}
33        self.assertEqual(d.viewkeys(), e.viewkeys())
34        del e["a"]
35        self.assertNotEqual(d.viewkeys(), e.viewkeys())
36
37    def test_dict_items(self):
38        d = {1: 10, "a": "ABC"}
39        items = d.viewitems()
40        self.assertEqual(len(items), 2)
41        self.assertEqual(set(items), set([(1, 10), ("a", "ABC")]))
42        self.assertEqual(items, set([(1, 10), ("a", "ABC")]))
43        self.assertNotEqual(items, set([(1, 10), ("a", "ABC"), "junk"]))
44        self.assertNotEqual(items, set([(1, 10), ("a", "def")]))
45        self.assertNotEqual(items, set([(1, 10)]))
46        self.assertNotEqual(items, 42)
47        self.assertIn((1, 10), items)
48        self.assertIn(("a", "ABC"), items)
49        self.assertNotIn((1, 11), items)
50        self.assertNotIn(1, items)
51        self.assertNotIn((), items)
52        self.assertNotIn((1,), items)
53        self.assertNotIn((1, 2, 3), items)
54        self.assertEqual(d.viewitems(), d.viewitems())
55        e = d.copy()
56        self.assertEqual(d.viewitems(), e.viewitems())
57        e["a"] = "def"
58        self.assertNotEqual(d.viewitems(), e.viewitems())
59
60    def test_dict_mixed_keys_items(self):
61        d = {(1, 1): 11, (2, 2): 22}
62        e = {1: 1, 2: 2}
63        self.assertEqual(d.viewkeys(), e.viewitems())
64        self.assertNotEqual(d.viewitems(), e.viewkeys())
65
66    def test_dict_values(self):
67        d = {1: 10, "a": "ABC"}
68        values = d.viewvalues()
69        self.assertEqual(set(values), set([10, "ABC"]))
70        self.assertEqual(len(values), 2)
71
72    def test_dict_repr(self):
73        d = {1: 10, "a": "ABC"}
74        self.assertIsInstance(repr(d), str)
75        r = repr(d.viewitems())
76        self.assertIsInstance(r, str)
77        self.assertTrue(r == "dict_items([('a', 'ABC'), (1, 10)])" or
78                        r == "dict_items([(1, 10), ('a', 'ABC')])")
79        r = repr(d.viewkeys())
80        self.assertIsInstance(r, str)
81        self.assertTrue(r == "dict_keys(['a', 1])" or
82                        r == "dict_keys([1, 'a'])")
83        r = repr(d.viewvalues())
84        self.assertIsInstance(r, str)
85        self.assertTrue(r == "dict_values(['ABC', 10])" or
86                        r == "dict_values([10, 'ABC'])")
87
88    def test_keys_set_operations(self):
89        d1 = {'a': 1, 'b': 2}
90        d2 = {'b': 3, 'c': 2}
91        d3 = {'d': 4, 'e': 5}
92        self.assertEqual(d1.viewkeys() & d1.viewkeys(), {'a', 'b'})
93        self.assertEqual(d1.viewkeys() & d2.viewkeys(), {'b'})
94        self.assertEqual(d1.viewkeys() & d3.viewkeys(), set())
95        self.assertEqual(d1.viewkeys() & set(d1.viewkeys()), {'a', 'b'})
96        self.assertEqual(d1.viewkeys() & set(d2.viewkeys()), {'b'})
97        self.assertEqual(d1.viewkeys() & set(d3.viewkeys()), set())
98
99        self.assertEqual(d1.viewkeys() | d1.viewkeys(), {'a', 'b'})
100        self.assertEqual(d1.viewkeys() | d2.viewkeys(), {'a', 'b', 'c'})
101        self.assertEqual(d1.viewkeys() | d3.viewkeys(), {'a', 'b', 'd', 'e'})
102        self.assertEqual(d1.viewkeys() | set(d1.viewkeys()), {'a', 'b'})
103        self.assertEqual(d1.viewkeys() | set(d2.viewkeys()), {'a', 'b', 'c'})
104        self.assertEqual(d1.viewkeys() | set(d3.viewkeys()),
105                         {'a', 'b', 'd', 'e'})
106
107        self.assertEqual(d1.viewkeys() ^ d1.viewkeys(), set())
108        self.assertEqual(d1.viewkeys() ^ d2.viewkeys(), {'a', 'c'})
109        self.assertEqual(d1.viewkeys() ^ d3.viewkeys(), {'a', 'b', 'd', 'e'})
110        self.assertEqual(d1.viewkeys() ^ set(d1.viewkeys()), set())
111        self.assertEqual(d1.viewkeys() ^ set(d2.viewkeys()), {'a', 'c'})
112        self.assertEqual(d1.viewkeys() ^ set(d3.viewkeys()),
113                         {'a', 'b', 'd', 'e'})
114
115    def test_items_set_operations(self):
116        d1 = {'a': 1, 'b': 2}
117        d2 = {'a': 2, 'b': 2}
118        d3 = {'d': 4, 'e': 5}
119        self.assertEqual(
120            d1.viewitems() & d1.viewitems(), {('a', 1), ('b', 2)})
121        self.assertEqual(d1.viewitems() & d2.viewitems(), {('b', 2)})
122        self.assertEqual(d1.viewitems() & d3.viewitems(), set())
123        self.assertEqual(d1.viewitems() & set(d1.viewitems()),
124                         {('a', 1), ('b', 2)})
125        self.assertEqual(d1.viewitems() & set(d2.viewitems()), {('b', 2)})
126        self.assertEqual(d1.viewitems() & set(d3.viewitems()), set())
127
128        self.assertEqual(d1.viewitems() | d1.viewitems(),
129                         {('a', 1), ('b', 2)})
130        self.assertEqual(d1.viewitems() | d2.viewitems(),
131                         {('a', 1), ('a', 2), ('b', 2)})
132        self.assertEqual(d1.viewitems() | d3.viewitems(),
133                         {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
134        self.assertEqual(d1.viewitems() | set(d1.viewitems()),
135                         {('a', 1), ('b', 2)})
136        self.assertEqual(d1.viewitems() | set(d2.viewitems()),
137                         {('a', 1), ('a', 2), ('b', 2)})
138        self.assertEqual(d1.viewitems() | set(d3.viewitems()),
139                         {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
140
141        self.assertEqual(d1.viewitems() ^ d1.viewitems(), set())
142        self.assertEqual(d1.viewitems() ^ d2.viewitems(),
143                         {('a', 1), ('a', 2)})
144        self.assertEqual(d1.viewitems() ^ d3.viewitems(),
145                         {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
146
147
148
149
150def test_main():
151    test_support.run_unittest(DictSetTest)
152
153if __name__ == "__main__":
154    test_main()
155