diff options
author | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-02-04 01:04:35 (GMT) |
---|---|---|
committer | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-02-04 01:04:35 (GMT) |
commit | a26cf9b7609fc1c08fd1a69ddf5e44dc98a70dce (patch) | |
tree | 6950856bc7823c7907e4546d4920a59724424062 /Lib/test/test_builtin.py | |
parent | 72a6576279b81213c426d1022ddc97f30a698636 (diff) | |
download | cpython-a26cf9b7609fc1c08fd1a69ddf5e44dc98a70dce.zip cpython-a26cf9b7609fc1c08fd1a69ddf5e44dc98a70dce.tar.gz cpython-a26cf9b7609fc1c08fd1a69ddf5e44dc98a70dce.tar.bz2 |
Make int() and long() fall back to __trunc__(). See issue 2002.
Diffstat (limited to 'Lib/test/test_builtin.py')
-rw-r--r-- | Lib/test/test_builtin.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index cfc9003..9612a4b 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -934,6 +934,14 @@ class BuiltinTest(unittest.TestCase): def test_intconversion(self): # Test __int__() + class ClassicMissingMethods: + pass + self.assertRaises(AttributeError, int, ClassicMissingMethods()) + + class MissingMethods(object): + pass + self.assertRaises(TypeError, int, MissingMethods()) + class Foo0: def __int__(self): return 42 @@ -965,6 +973,49 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(int(Foo4()), 42L) self.assertRaises(TypeError, int, Foo5()) + class Classic: + pass + for base in (object, Classic): + class IntOverridesTrunc(base): + def __int__(self): + return 42 + def __trunc__(self): + return -12 + self.assertEqual(int(IntOverridesTrunc()), 42) + + class JustTrunc(base): + def __trunc__(self): + return 42 + self.assertEqual(int(JustTrunc()), 42) + + for trunc_result_base in (object, Classic): + class Integral(trunc_result_base): + def __int__(self): + return 42 + + class TruncReturnsNonInt(base): + def __trunc__(self): + return Integral() + self.assertEqual(int(TruncReturnsNonInt()), 42) + + class NonIntegral(trunc_result_base): + def __trunc__(self): + # Check that we avoid infinite recursion. + return NonIntegral() + + class TruncReturnsNonIntegral(base): + def __trunc__(self): + return NonIntegral() + try: + int(TruncReturnsNonIntegral()) + except TypeError as e: + self.assertEquals(str(e), + "__trunc__ returned non-Integral" + " (type NonIntegral)") + else: + self.fail("Failed to raise TypeError with %s" % + ((base, trunc_result_base),)) + def test_intern(self): self.assertRaises(TypeError, intern) s = "never interned before" @@ -1207,6 +1258,14 @@ class BuiltinTest(unittest.TestCase): def test_longconversion(self): # Test __long__() + class ClassicMissingMethods: + pass + self.assertRaises(AttributeError, long, ClassicMissingMethods()) + + class MissingMethods(object): + pass + self.assertRaises(TypeError, long, MissingMethods()) + class Foo0: def __long__(self): return 42L @@ -1238,6 +1297,49 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(long(Foo4()), 42) self.assertRaises(TypeError, long, Foo5()) + class Classic: + pass + for base in (object, Classic): + class LongOverridesTrunc(base): + def __long__(self): + return 42 + def __trunc__(self): + return -12 + self.assertEqual(long(LongOverridesTrunc()), 42) + + class JustTrunc(base): + def __trunc__(self): + return 42 + self.assertEqual(long(JustTrunc()), 42) + + for trunc_result_base in (object, Classic): + class Integral(trunc_result_base): + def __int__(self): + return 42 + + class TruncReturnsNonLong(base): + def __trunc__(self): + return Integral() + self.assertEqual(long(TruncReturnsNonLong()), 42) + + class NonIntegral(trunc_result_base): + def __trunc__(self): + # Check that we avoid infinite recursion. + return NonIntegral() + + class TruncReturnsNonIntegral(base): + def __trunc__(self): + return NonIntegral() + try: + long(TruncReturnsNonIntegral()) + except TypeError as e: + self.assertEquals(str(e), + "__trunc__ returned non-Integral" + " (type NonIntegral)") + else: + self.fail("Failed to raise TypeError with %s" % + ((base, trunc_result_base),)) + def test_map(self): self.assertEqual( map(None, 'hello world'), |