cpython/Lib/test/test_capi/test_long.py

70 lines
2.2 KiB
Python
Raw Normal View History

import unittest
import sys
from test.support import import_helper
# Skip this test if the _testcapi module isn't available.
_testcapi = import_helper.import_module('_testcapi')
class LongTests(unittest.TestCase):
def test_compact(self):
for n in {
# Edge cases
*(2**n for n in range(66)),
*(-2**n for n in range(66)),
*(2**n - 1 for n in range(66)),
*(-2**n + 1 for n in range(66)),
# Essentially random
*(37**n for n in range(14)),
*(-37**n for n in range(14)),
}:
with self.subTest(n=n):
is_compact, value = _testcapi.call_long_compact_api(n)
if is_compact:
self.assertEqual(n, value)
def test_compact_known(self):
# Sanity-check some implementation details (we don't guarantee
# that these are/aren't compact)
self.assertEqual(_testcapi.call_long_compact_api(-1), (True, -1))
self.assertEqual(_testcapi.call_long_compact_api(0), (True, 0))
self.assertEqual(_testcapi.call_long_compact_api(256), (True, 256))
self.assertEqual(_testcapi.call_long_compact_api(sys.maxsize),
(False, -1))
def test_long_asint(self):
PyLong_AsInt = _testcapi.PyLong_AsInt
INT_MIN = _testcapi.INT_MIN
INT_MAX = _testcapi.INT_MAX
# round trip (object -> int -> object)
for value in (INT_MIN, INT_MAX, -1, 0, 1, 123):
with self.subTest(value=value):
self.assertEqual(PyLong_AsInt(value), value)
# use __index__(), not __int__()
class MyIndex:
def __index__(self):
return 10
def __int__(self):
return 22
self.assertEqual(PyLong_AsInt(MyIndex()), 10)
# bound checking
with self.assertRaises(OverflowError):
PyLong_AsInt(INT_MIN - 1)
with self.assertRaises(OverflowError):
PyLong_AsInt(INT_MAX + 1)
# invalid type
for value in (1.0, b'2', '3'):
with self.subTest(value=value):
with self.assertRaises(TypeError):
PyLong_AsInt(value)
if __name__ == "__main__":
unittest.main()