diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-05-12 07:39:32 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-05-12 07:39:32 (GMT) |
commit | 1f364438adf1bcdc89a51af9af526ed9d7b7996d (patch) | |
tree | 2d620f18e63ff8703f4da17d98d0467a40a3c507 /Lib | |
parent | 5787ef621a76dfe225308f0001d60e5e46e9a55f (diff) | |
parent | ea36c941a1b2ad6582a35bc42aa70da9600d2841 (diff) | |
download | cpython-1f364438adf1bcdc89a51af9af526ed9d7b7996d.zip cpython-1f364438adf1bcdc89a51af9af526ed9d7b7996d.tar.gz cpython-1f364438adf1bcdc89a51af9af526ed9d7b7996d.tar.bz2 |
Issue #23640: int.from_bytes() no longer bypasses constructors for subclasses.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_bool.py | 4 | ||||
-rw-r--r-- | Lib/test/test_enum.py | 12 | ||||
-rw-r--r-- | Lib/test/test_float.py | 18 | ||||
-rw-r--r-- | Lib/test/test_long.py | 17 |
4 files changed, 51 insertions, 0 deletions
diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py index 2507439..d30a3b9 100644 --- a/Lib/test/test_bool.py +++ b/Lib/test/test_bool.py @@ -314,6 +314,10 @@ class BoolTest(unittest.TestCase): return -1 self.assertRaises(ValueError, bool, Eggs()) + def test_from_bytes(self): + self.assertIs(bool.from_bytes(b'\x00'*8, 'big'), False) + self.assertIs(bool.from_bytes(b'abcd', 'little'), True) + def test_sane_len(self): # this test just tests our assumptions about __len__ # this will start failing if __len__ changes assertions diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 29cd3cf..b6cb00f 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -564,6 +564,18 @@ class TestEnum(unittest.TestCase): self.assertEqual([k for k,v in WeekDay.__members__.items() if v.name != k], ['TEUSDAY', ]) + def test_intenum_from_bytes(self): + self.assertIs(IntStooges.from_bytes(b'\x00\x03', 'big'), IntStooges.MOE) + with self.assertRaises(ValueError): + IntStooges.from_bytes(b'\x00\x05', 'big') + + def test_floatenum_fromhex(self): + h = float.hex(FloatStooges.MOE.value) + self.assertIs(FloatStooges.fromhex(h), FloatStooges.MOE) + h = float.hex(FloatStooges.MOE.value + 0.01) + with self.assertRaises(ValueError): + FloatStooges.fromhex(h) + def test_pickle_enum(self): if isinstance(Stooges, Exception): raise Stooges diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 2e187ac..427f044 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -1354,6 +1354,24 @@ class HexFloatTestCase(unittest.TestCase): else: self.identical(x, fromHex(toHex(x))) + def test_subclass(self): + class F(float): + def __new__(cls, value): + return float.__new__(cls, value + 1) + + f = F.fromhex((1.5).hex()) + self.assertIs(type(f), F) + self.assertEqual(f, 2.5) + + class F2(float): + def __init__(self, value): + self.foo = 'bar' + + f = F2.fromhex((1.5).hex()) + self.assertIs(type(f), F2) + self.assertEqual(f, 1.5) + self.assertEqual(getattr(f, 'foo', 'none'), 'bar') + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 5b8b4dc..f0dd074 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -1236,6 +1236,23 @@ class LongTest(unittest.TestCase): self.assertRaises(TypeError, myint.from_bytes, 0, 'big') self.assertRaises(TypeError, int.from_bytes, 0, 'big', True) + class myint2(int): + def __new__(cls, value): + return int.__new__(cls, value + 1) + + i = myint2.from_bytes(b'\x01', 'big') + self.assertIs(type(i), myint2) + self.assertEqual(i, 2) + + class myint3(int): + def __init__(self, value): + self.foo = 'bar' + + i = myint3.from_bytes(b'\x01', 'big') + self.assertIs(type(i), myint3) + self.assertEqual(i, 1) + self.assertEqual(getattr(i, 'foo', 'none'), 'bar') + def test_access_to_nonexistent_digit_0(self): # http://bugs.python.org/issue14630: A bug in _PyLong_Copy meant that # ob_digit[0] was being incorrectly accessed for instances of a |