mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
Clean up and enhance frozen dataclass tests. (GH-6380)
* Add a test for frozen with unhashable field value. * Improve a comment.
This commit is contained in:
parent
0876505bd3
commit
74940913d2
1 changed files with 38 additions and 27 deletions
|
@ -2191,33 +2191,6 @@ class TestRepr(unittest.TestCase):
|
||||||
self.assertEqual(repr(C(0)), 'x')
|
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):
|
class TestEq(unittest.TestCase):
|
||||||
def test_no_eq(self):
|
def test_no_eq(self):
|
||||||
# Test a class with no __eq__ and eq=False.
|
# 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.y, 10)
|
||||||
self.assertEqual(s.cached, True)
|
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):
|
class TestSlots(unittest.TestCase):
|
||||||
def test_simple(self):
|
def test_simple(self):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue