python (3.12.0)

(root)/
lib/
python3.12/
test/
test_dictviews.py
       1  import collections.abc
       2  import copy
       3  import pickle
       4  import sys
       5  import unittest
       6  from test.support import C_RECURSION_LIMIT
       7  
       8  class ESC[4;38;5;81mDictSetTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
       9  
      10      def test_constructors_not_callable(self):
      11          kt = type({}.keys())
      12          self.assertRaises(TypeError, kt, {})
      13          self.assertRaises(TypeError, kt)
      14          it = type({}.items())
      15          self.assertRaises(TypeError, it, {})
      16          self.assertRaises(TypeError, it)
      17          vt = type({}.values())
      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.keys()
      24          self.assertEqual(len(keys), 2)
      25          self.assertEqual(set(keys), {1, "a"})
      26          self.assertEqual(keys, {1, "a"})
      27          self.assertNotEqual(keys, {1, "a", "b"})
      28          self.assertNotEqual(keys, {1, "b"})
      29          self.assertNotEqual(keys, {1})
      30          self.assertNotEqual(keys, 42)
      31          self.assertIn(1, keys)
      32          self.assertIn("a", keys)
      33          self.assertNotIn(10, keys)
      34          self.assertNotIn("Z", keys)
      35          self.assertEqual(d.keys(), d.keys())
      36          e = {1: 11, "a": "def"}
      37          self.assertEqual(d.keys(), e.keys())
      38          del e["a"]
      39          self.assertNotEqual(d.keys(), e.keys())
      40  
      41      def test_dict_items(self):
      42          d = {1: 10, "a": "ABC"}
      43          items = d.items()
      44          self.assertEqual(len(items), 2)
      45          self.assertEqual(set(items), {(1, 10), ("a", "ABC")})
      46          self.assertEqual(items, {(1, 10), ("a", "ABC")})
      47          self.assertNotEqual(items, {(1, 10), ("a", "ABC"), "junk"})
      48          self.assertNotEqual(items, {(1, 10), ("a", "def")})
      49          self.assertNotEqual(items, {(1, 10)})
      50          self.assertNotEqual(items, 42)
      51          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)
      58          self.assertEqual(d.items(), d.items())
      59          e = d.copy()
      60          self.assertEqual(d.items(), e.items())
      61          e["a"] = "def"
      62          self.assertNotEqual(d.items(), e.items())
      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.keys(), e.items())
      68          self.assertNotEqual(d.items(), e.keys())
      69  
      70      def test_dict_values(self):
      71          d = {1: 10, "a": "ABC"}
      72          values = d.values()
      73          self.assertEqual(set(values), {10, "ABC"})
      74          self.assertEqual(len(values), 2)
      75  
      76      def test_dict_repr(self):
      77          d = {1: 10, "a": "ABC"}
      78          self.assertIsInstance(repr(d), str)
      79          r = repr(d.items())
      80          self.assertIsInstance(r, str)
      81          self.assertTrue(r == "dict_items([('a', 'ABC'), (1, 10)])" or
      82                          r == "dict_items([(1, 10), ('a', 'ABC')])")
      83          r = repr(d.keys())
      84          self.assertIsInstance(r, str)
      85          self.assertTrue(r == "dict_keys(['a', 1])" or
      86                          r == "dict_keys([1, 'a'])")
      87          r = repr(d.values())
      88          self.assertIsInstance(r, str)
      89          self.assertTrue(r == "dict_values(['ABC', 10])" or
      90                          r == "dict_values([10, 'ABC'])")
      91  
      92      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          d4 = {'d': 4}
      97  
      98          class ESC[4;38;5;81mCustomSet(ESC[4;38;5;149mset):
      99              def intersection(self, other):
     100                  return CustomSet(super().intersection(other))
     101  
     102          self.assertEqual(d1.keys() & d1.keys(), {'a', 'b'})
     103          self.assertEqual(d1.keys() & d2.keys(), {'b'})
     104          self.assertEqual(d1.keys() & d3.keys(), set())
     105          self.assertEqual(d1.keys() & set(d1.keys()), {'a', 'b'})
     106          self.assertEqual(d1.keys() & set(d2.keys()), {'b'})
     107          self.assertEqual(d1.keys() & set(d3.keys()), set())
     108          self.assertEqual(d1.keys() & tuple(d1.keys()), {'a', 'b'})
     109          self.assertEqual(d3.keys() & d4.keys(), {'d'})
     110          self.assertEqual(d4.keys() & d3.keys(), {'d'})
     111          self.assertEqual(d4.keys() & set(d3.keys()), {'d'})
     112          self.assertIsInstance(d4.keys() & frozenset(d3.keys()), set)
     113          self.assertIsInstance(frozenset(d3.keys()) & d4.keys(), set)
     114          self.assertIs(type(d4.keys() & CustomSet(d3.keys())), set)
     115          self.assertIs(type(d1.keys() & []), set)
     116          self.assertIs(type([] & d1.keys()), set)
     117  
     118          self.assertEqual(d1.keys() | d1.keys(), {'a', 'b'})
     119          self.assertEqual(d1.keys() | d2.keys(), {'a', 'b', 'c'})
     120          self.assertEqual(d1.keys() | d3.keys(), {'a', 'b', 'd', 'e'})
     121          self.assertEqual(d1.keys() | set(d1.keys()), {'a', 'b'})
     122          self.assertEqual(d1.keys() | set(d2.keys()), {'a', 'b', 'c'})
     123          self.assertEqual(d1.keys() | set(d3.keys()),
     124                           {'a', 'b', 'd', 'e'})
     125          self.assertEqual(d1.keys() | (1, 2), {'a', 'b', 1, 2})
     126  
     127          self.assertEqual(d1.keys() ^ d1.keys(), set())
     128          self.assertEqual(d1.keys() ^ d2.keys(), {'a', 'c'})
     129          self.assertEqual(d1.keys() ^ d3.keys(), {'a', 'b', 'd', 'e'})
     130          self.assertEqual(d1.keys() ^ set(d1.keys()), set())
     131          self.assertEqual(d1.keys() ^ set(d2.keys()), {'a', 'c'})
     132          self.assertEqual(d1.keys() ^ set(d3.keys()),
     133                           {'a', 'b', 'd', 'e'})
     134          self.assertEqual(d1.keys() ^ tuple(d2.keys()), {'a', 'c'})
     135  
     136          self.assertEqual(d1.keys() - d1.keys(), set())
     137          self.assertEqual(d1.keys() - d2.keys(), {'a'})
     138          self.assertEqual(d1.keys() - d3.keys(), {'a', 'b'})
     139          self.assertEqual(d1.keys() - set(d1.keys()), set())
     140          self.assertEqual(d1.keys() - set(d2.keys()), {'a'})
     141          self.assertEqual(d1.keys() - set(d3.keys()), {'a', 'b'})
     142          self.assertEqual(d1.keys() - (0, 1), {'a', 'b'})
     143  
     144          self.assertFalse(d1.keys().isdisjoint(d1.keys()))
     145          self.assertFalse(d1.keys().isdisjoint(d2.keys()))
     146          self.assertFalse(d1.keys().isdisjoint(list(d2.keys())))
     147          self.assertFalse(d1.keys().isdisjoint(set(d2.keys())))
     148          self.assertTrue(d1.keys().isdisjoint({'x', 'y', 'z'}))
     149          self.assertTrue(d1.keys().isdisjoint(['x', 'y', 'z']))
     150          self.assertTrue(d1.keys().isdisjoint(set(['x', 'y', 'z'])))
     151          self.assertTrue(d1.keys().isdisjoint(set(['x', 'y'])))
     152          self.assertTrue(d1.keys().isdisjoint(['x', 'y']))
     153          self.assertTrue(d1.keys().isdisjoint({}))
     154          self.assertTrue(d1.keys().isdisjoint(d3.keys()))
     155  
     156          de = {}
     157          self.assertTrue(de.keys().isdisjoint(set()))
     158          self.assertTrue(de.keys().isdisjoint([]))
     159          self.assertTrue(de.keys().isdisjoint(de.keys()))
     160          self.assertTrue(de.keys().isdisjoint([1]))
     161  
     162      def test_items_set_operations(self):
     163          d1 = {'a': 1, 'b': 2}
     164          d2 = {'a': 2, 'b': 2}
     165          d3 = {'d': 4, 'e': 5}
     166          self.assertEqual(
     167              d1.items() & d1.items(), {('a', 1), ('b', 2)})
     168          self.assertEqual(d1.items() & d2.items(), {('b', 2)})
     169          self.assertEqual(d1.items() & d3.items(), set())
     170          self.assertEqual(d1.items() & set(d1.items()),
     171                           {('a', 1), ('b', 2)})
     172          self.assertEqual(d1.items() & set(d2.items()), {('b', 2)})
     173          self.assertEqual(d1.items() & set(d3.items()), set())
     174          self.assertEqual(d1.items() & (("a", 1), ("b", 2)),
     175                           {('a', 1), ('b', 2)})
     176          self.assertEqual(d1.items() & (("a", 2), ("b", 2)), {('b', 2)})
     177          self.assertEqual(d1.items() & (("d", 4), ("e", 5)), set())
     178  
     179          self.assertEqual(d1.items() | d1.items(),
     180                           {('a', 1), ('b', 2)})
     181          self.assertEqual(d1.items() | d2.items(),
     182                           {('a', 1), ('a', 2), ('b', 2)})
     183          self.assertEqual(d1.items() | d3.items(),
     184                           {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
     185          self.assertEqual(d1.items() | set(d1.items()),
     186                           {('a', 1), ('b', 2)})
     187          self.assertEqual(d1.items() | set(d2.items()),
     188                           {('a', 1), ('a', 2), ('b', 2)})
     189          self.assertEqual(d1.items() | set(d3.items()),
     190                           {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
     191          self.assertEqual(d1.items() | (('a', 1), ('b', 2)),
     192                           {('a', 1), ('b', 2)})
     193          self.assertEqual(d1.items() | (('a', 2), ('b', 2)),
     194                           {('a', 1), ('a', 2), ('b', 2)})
     195          self.assertEqual(d1.items() | (('d', 4), ('e', 5)),
     196                           {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
     197  
     198          self.assertEqual(d1.items() ^ d1.items(), set())
     199          self.assertEqual(d1.items() ^ d2.items(),
     200                           {('a', 1), ('a', 2)})
     201          self.assertEqual(d1.items() ^ d3.items(),
     202                           {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
     203          self.assertEqual(d1.items() ^ (('a', 1), ('b', 2)), set())
     204          self.assertEqual(d1.items() ^ (("a", 2), ("b", 2)),
     205                           {('a', 1), ('a', 2)})
     206          self.assertEqual(d1.items() ^ (("d", 4), ("e", 5)),
     207                           {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
     208  
     209          self.assertEqual(d1.items() - d1.items(), set())
     210          self.assertEqual(d1.items() - d2.items(), {('a', 1)})
     211          self.assertEqual(d1.items() - d3.items(), {('a', 1), ('b', 2)})
     212          self.assertEqual(d1.items() - set(d1.items()), set())
     213          self.assertEqual(d1.items() - set(d2.items()), {('a', 1)})
     214          self.assertEqual(d1.items() - set(d3.items()), {('a', 1), ('b', 2)})
     215          self.assertEqual(d1.items() - (('a', 1), ('b', 2)), set())
     216          self.assertEqual(d1.items() - (("a", 2), ("b", 2)), {('a', 1)})
     217          self.assertEqual(d1.items() - (("d", 4), ("e", 5)), {('a', 1), ('b', 2)})
     218  
     219          self.assertFalse(d1.items().isdisjoint(d1.items()))
     220          self.assertFalse(d1.items().isdisjoint(d2.items()))
     221          self.assertFalse(d1.items().isdisjoint(list(d2.items())))
     222          self.assertFalse(d1.items().isdisjoint(set(d2.items())))
     223          self.assertTrue(d1.items().isdisjoint({'x', 'y', 'z'}))
     224          self.assertTrue(d1.items().isdisjoint(['x', 'y', 'z']))
     225          self.assertTrue(d1.items().isdisjoint(set(['x', 'y', 'z'])))
     226          self.assertTrue(d1.items().isdisjoint(set(['x', 'y'])))
     227          self.assertTrue(d1.items().isdisjoint({}))
     228          self.assertTrue(d1.items().isdisjoint(d3.items()))
     229  
     230          de = {}
     231          self.assertTrue(de.items().isdisjoint(set()))
     232          self.assertTrue(de.items().isdisjoint([]))
     233          self.assertTrue(de.items().isdisjoint(de.items()))
     234          self.assertTrue(de.items().isdisjoint([1]))
     235  
     236      def test_set_operations_with_iterator(self):
     237          origin = {1: 2, 3: 4}
     238          self.assertEqual(origin.keys() & iter([1, 2]), {1})
     239          self.assertEqual(origin.keys() | iter([1, 2]), {1, 2, 3})
     240          self.assertEqual(origin.keys() ^ iter([1, 2]), {2, 3})
     241          self.assertEqual(origin.keys() - iter([1, 2]), {3})
     242  
     243          items = origin.items()
     244          self.assertEqual(items & iter([(1, 2)]), {(1, 2)})
     245          self.assertEqual(items ^ iter([(1, 2)]), {(3, 4)})
     246          self.assertEqual(items | iter([(1, 2)]), {(1, 2), (3, 4)})
     247          self.assertEqual(items - iter([(1, 2)]), {(3, 4)})
     248  
     249      def test_set_operations_with_noniterable(self):
     250          with self.assertRaises(TypeError):
     251              {}.keys() & 1
     252          with self.assertRaises(TypeError):
     253              {}.keys() | 1
     254          with self.assertRaises(TypeError):
     255              {}.keys() ^ 1
     256          with self.assertRaises(TypeError):
     257              {}.keys() - 1
     258  
     259          with self.assertRaises(TypeError):
     260              {}.items() & 1
     261          with self.assertRaises(TypeError):
     262              {}.items() | 1
     263          with self.assertRaises(TypeError):
     264              {}.items() ^ 1
     265          with self.assertRaises(TypeError):
     266              {}.items() - 1
     267  
     268      def test_recursive_repr(self):
     269          d = {}
     270          d[42] = d.values()
     271          r = repr(d)
     272          # Cannot perform a stronger test, as the contents of the repr
     273          # are implementation-dependent.  All we can say is that we
     274          # want a str result, not an exception of any sort.
     275          self.assertIsInstance(r, str)
     276          d[42] = d.items()
     277          r = repr(d)
     278          # Again.
     279          self.assertIsInstance(r, str)
     280  
     281      def test_deeply_nested_repr(self):
     282          d = {}
     283          for i in range(C_RECURSION_LIMIT//2 + 100):
     284              d = {42: d.values()}
     285          self.assertRaises(RecursionError, repr, d)
     286  
     287      def test_copy(self):
     288          d = {1: 10, "a": "ABC"}
     289          self.assertRaises(TypeError, copy.copy, d.keys())
     290          self.assertRaises(TypeError, copy.copy, d.values())
     291          self.assertRaises(TypeError, copy.copy, d.items())
     292  
     293      def test_compare_error(self):
     294          class ESC[4;38;5;81mExc(ESC[4;38;5;149mException):
     295              pass
     296  
     297          class ESC[4;38;5;81mBadEq:
     298              def __hash__(self):
     299                  return 7
     300              def __eq__(self, other):
     301                  raise Exc
     302  
     303          k1, k2 = BadEq(), BadEq()
     304          v1, v2 = BadEq(), BadEq()
     305          d = {k1: v1}
     306  
     307          self.assertIn(k1, d)
     308          self.assertIn(k1, d.keys())
     309          self.assertIn(v1, d.values())
     310          self.assertIn((k1, v1), d.items())
     311  
     312          self.assertRaises(Exc, d.__contains__, k2)
     313          self.assertRaises(Exc, d.keys().__contains__, k2)
     314          self.assertRaises(Exc, d.items().__contains__, (k2, v1))
     315          self.assertRaises(Exc, d.items().__contains__, (k1, v2))
     316          with self.assertRaises(Exc):
     317              v2 in d.values()
     318  
     319      def test_pickle(self):
     320          d = {1: 10, "a": "ABC"}
     321          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     322              self.assertRaises((TypeError, pickle.PicklingError),
     323                  pickle.dumps, d.keys(), proto)
     324              self.assertRaises((TypeError, pickle.PicklingError),
     325                  pickle.dumps, d.values(), proto)
     326              self.assertRaises((TypeError, pickle.PicklingError),
     327                  pickle.dumps, d.items(), proto)
     328  
     329      def test_abc_registry(self):
     330          d = dict(a=1)
     331  
     332          self.assertIsInstance(d.keys(), collections.abc.KeysView)
     333          self.assertIsInstance(d.keys(), collections.abc.MappingView)
     334          self.assertIsInstance(d.keys(), collections.abc.Set)
     335          self.assertIsInstance(d.keys(), collections.abc.Sized)
     336          self.assertIsInstance(d.keys(), collections.abc.Iterable)
     337          self.assertIsInstance(d.keys(), collections.abc.Container)
     338  
     339          self.assertIsInstance(d.values(), collections.abc.ValuesView)
     340          self.assertIsInstance(d.values(), collections.abc.MappingView)
     341          self.assertIsInstance(d.values(), collections.abc.Sized)
     342          self.assertIsInstance(d.values(), collections.abc.Collection)
     343          self.assertIsInstance(d.values(), collections.abc.Iterable)
     344          self.assertIsInstance(d.values(), collections.abc.Container)
     345  
     346          self.assertIsInstance(d.items(), collections.abc.ItemsView)
     347          self.assertIsInstance(d.items(), collections.abc.MappingView)
     348          self.assertIsInstance(d.items(), collections.abc.Set)
     349          self.assertIsInstance(d.items(), collections.abc.Sized)
     350          self.assertIsInstance(d.items(), collections.abc.Iterable)
     351          self.assertIsInstance(d.items(), collections.abc.Container)
     352  
     353  
     354  if __name__ == "__main__":
     355      unittest.main()