]> granicus.if.org Git - python/commitdiff
Clean up and enhance frozen dataclass tests. (GH-6380)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 5 Apr 2018 11:12:31 +0000 (04:12 -0700)
committerGitHub <noreply@github.com>
Thu, 5 Apr 2018 11:12:31 +0000 (04:12 -0700)
* Add a test for frozen with unhashable field value.
* Improve a comment.
(cherry picked from commit 74940913d26d9f94b8572eca794369841fa6d9b6)

Co-authored-by: Eric V. Smith <ericvsmith@users.noreply.github.com>
Lib/test/test_dataclasses.py

index 26bfc4e75a001e04ad6d87f2d2b5dc0418dbe8f2..2c890a2cbe9206d17bc5da1868b60615e8cda9ed 100755 (executable)
@@ -2191,33 +2191,6 @@ class TestRepr(unittest.TestCase):
         self.assertEqual(repr(C(0)), 'x')
 
 
-class TestFrozen(unittest.TestCase):
-    def test_overwriting_frozen(self):
-        # frozen uses __setattr__ and __delattr__.
-        with self.assertRaisesRegex(TypeError,
-                                    'Cannot overwrite attribute __setattr__'):
-            @dataclass(frozen=True)
-            class C:
-                x: int
-                def __setattr__(self):
-                    pass
-
-        with self.assertRaisesRegex(TypeError,
-                                    'Cannot overwrite attribute __delattr__'):
-            @dataclass(frozen=True)
-            class C:
-                x: int
-                def __delattr__(self):
-                    pass
-
-        @dataclass(frozen=False)
-        class C:
-            x: int
-            def __setattr__(self, name, value):
-                self.__dict__['x'] = value * 2
-        self.assertEqual(C(10).x, 20)
-
-
 class TestEq(unittest.TestCase):
     def test_no_eq(self):
         # Test a class with no __eq__ and eq=False.
@@ -2672,6 +2645,44 @@ class TestFrozen(unittest.TestCase):
         self.assertEqual(s.y, 10)
         self.assertEqual(s.cached, True)
 
+    def test_overwriting_frozen(self):
+        # frozen uses __setattr__ and __delattr__.
+        with self.assertRaisesRegex(TypeError,
+                                    'Cannot overwrite attribute __setattr__'):
+            @dataclass(frozen=True)
+            class C:
+                x: int
+                def __setattr__(self):
+                    pass
+
+        with self.assertRaisesRegex(TypeError,
+                                    'Cannot overwrite attribute __delattr__'):
+            @dataclass(frozen=True)
+            class C:
+                x: int
+                def __delattr__(self):
+                    pass
+
+        @dataclass(frozen=False)
+        class C:
+            x: int
+            def __setattr__(self, name, value):
+                self.__dict__['x'] = value * 2
+        self.assertEqual(C(10).x, 20)
+
+    def test_frozen_hash(self):
+        @dataclass(frozen=True)
+        class C:
+            x: Any
+
+        # If x is immutable, we can compute the hash.  No exception is
+        # raised.
+        hash(C(3))
+
+        # If x is mutable, computing the hash is an error.
+        with self.assertRaisesRegex(TypeError, 'unhashable type'):
+            hash(C({}))
+
 
 class TestSlots(unittest.TestCase):
     def test_simple(self):