| 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() |