PageRenderTime 27ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/cpyext/test/test_longobject.py

https://bitbucket.org/pypy/pypy/
Python | 277 lines | 264 code | 13 blank | 0 comment | 1 complexity | 9b2bedc49990f55531adf5c07244b832 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. import sys, py
  2. from rpython.rtyper.lltypesystem import rffi, lltype
  3. from pypy.objspace.std.intobject import W_IntObject
  4. from pypy.objspace.std.longobject import W_LongObject
  5. from pypy.module.cpyext.test.test_api import BaseApiTest
  6. from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
  7. class TestLongObject(BaseApiTest):
  8. def test_FromLong(self, space, api):
  9. value = api.PyLong_FromLong(3)
  10. assert isinstance(value, W_LongObject)
  11. assert space.unwrap(value) == 3
  12. value = api.PyLong_FromLong(sys.maxint)
  13. assert isinstance(value, W_LongObject)
  14. assert space.unwrap(value) == sys.maxint
  15. def test_aslong(self, space, api):
  16. w_value = api.PyLong_FromLong((sys.maxint - 1) / 2)
  17. w_value = space.mul(w_value, space.wrap(2))
  18. value = api.PyLong_AsLong(w_value)
  19. assert value == (sys.maxint - 1)
  20. w_value = space.mul(w_value, space.wrap(2))
  21. value = api.PyLong_AsLong(w_value)
  22. assert value == -1 and api.PyErr_Occurred() is space.w_OverflowError
  23. api.PyErr_Clear()
  24. value = api.PyLong_AsUnsignedLong(w_value)
  25. assert value == (sys.maxint - 1) * 2
  26. self.raises(space, api, OverflowError, api.PyLong_AsUnsignedLong, space.wrap(-1))
  27. def test_as_ssize_t(self, space, api):
  28. w_value = space.newlong(2)
  29. value = api.PyLong_AsSsize_t(w_value)
  30. assert value == 2
  31. assert space.eq_w(w_value, api.PyLong_FromSsize_t(2))
  32. def test_fromdouble(self, space, api):
  33. w_value = api.PyLong_FromDouble(-12.74)
  34. assert space.unwrap(w_value) == -12
  35. assert api.PyLong_AsDouble(w_value) == -12
  36. def test_type_check(self, space, api):
  37. w_l = space.wrap(sys.maxint + 1)
  38. assert api.PyLong_Check(w_l)
  39. assert api.PyLong_CheckExact(w_l)
  40. w_i = space.wrap(sys.maxint)
  41. assert not api.PyLong_Check(w_i)
  42. assert not api.PyLong_CheckExact(w_i)
  43. L = space.appexec([], """():
  44. class L(long):
  45. pass
  46. return L
  47. """)
  48. l = space.call_function(L)
  49. assert api.PyLong_Check(l)
  50. assert not api.PyLong_CheckExact(l)
  51. def test_as_longlong(self, space, api):
  52. assert api.PyLong_AsLongLong(space.wrap(1<<62)) == 1<<62
  53. assert api.PyLong_AsLongLong(space.wrap(1<<63)) == -1
  54. api.PyErr_Clear()
  55. assert api.PyLong_AsUnsignedLongLong(space.wrap(1<<63)) == 1<<63
  56. assert api.PyLong_AsUnsignedLongLong(space.wrap(1<<64)) == (1<<64) - 1
  57. assert api.PyErr_Occurred()
  58. api.PyErr_Clear()
  59. assert api.PyLong_AsUnsignedLongLongMask(
  60. space.wrap(1<<64)) == 0
  61. self.raises(space, api, OverflowError, api.PyLong_AsUnsignedLongLong, space.wrap(-1))
  62. def test_as_long_and_overflow(self, space, api):
  63. overflow = lltype.malloc(rffi.CArrayPtr(rffi.INT_real).TO, 1, flavor='raw')
  64. assert api.PyLong_AsLongAndOverflow(
  65. space.wrap(sys.maxint), overflow) == sys.maxint
  66. assert api.PyLong_AsLongAndOverflow(
  67. space.wrap(-sys.maxint - 2), overflow) == -1
  68. assert not api.PyErr_Occurred()
  69. assert overflow[0] == -1
  70. lltype.free(overflow, flavor='raw')
  71. def test_as_longlong_and_overflow(self, space, api):
  72. overflow = lltype.malloc(rffi.CArrayPtr(rffi.INT_real).TO, 1, flavor='raw')
  73. assert api.PyLong_AsLongLongAndOverflow(
  74. space.wrap(1<<62), overflow) == 1<<62
  75. assert api.PyLong_AsLongLongAndOverflow(
  76. space.wrap(1<<63), overflow) == -1
  77. assert not api.PyErr_Occurred()
  78. assert overflow[0] == 1
  79. assert api.PyLong_AsLongLongAndOverflow(
  80. space.wrap(-1<<64), overflow) == -1
  81. assert not api.PyErr_Occurred()
  82. assert overflow[0] == -1
  83. lltype.free(overflow, flavor='raw')
  84. def test_as_voidptr(self, space, api):
  85. w_l = api.PyLong_FromVoidPtr(lltype.nullptr(rffi.VOIDP.TO))
  86. assert space.unwrap(w_l) == 0L
  87. assert api.PyLong_AsVoidPtr(w_l) == lltype.nullptr(rffi.VOIDP.TO)
  88. def test_sign_and_bits(self, space, api):
  89. if space.is_true(space.lt(space.sys.get('version_info'),
  90. space.wrap((2, 7)))):
  91. py.test.skip("unsupported before Python 2.7")
  92. assert api._PyLong_Sign(space.wraplong(0L)) == 0
  93. assert api._PyLong_Sign(space.wraplong(2L)) == 1
  94. assert api._PyLong_Sign(space.wraplong(-2L)) == -1
  95. assert api._PyLong_NumBits(space.wrap(0)) == 0
  96. assert api._PyLong_NumBits(space.wrap(1)) == 1
  97. assert api._PyLong_NumBits(space.wrap(-1)) == 1
  98. assert api._PyLong_NumBits(space.wrap(2)) == 2
  99. assert api._PyLong_NumBits(space.wrap(-2)) == 2
  100. assert api._PyLong_NumBits(space.wrap(3)) == 2
  101. assert api._PyLong_NumBits(space.wrap(-3)) == 2
  102. class AppTestLongObject(AppTestCpythonExtensionBase):
  103. def test_fromunsignedlong(self):
  104. module = self.import_extension('foo', [
  105. ("from_unsignedlong", "METH_NOARGS",
  106. """
  107. return PyLong_FromUnsignedLong((unsigned long)-1);
  108. """)])
  109. import sys
  110. assert module.from_unsignedlong() == 2 * sys.maxint + 1
  111. def test_fromlonglong(self):
  112. module = self.import_extension('foo', [
  113. ("from_longlong", "METH_NOARGS",
  114. """
  115. return PyLong_FromLongLong((long long)-1);
  116. """),
  117. ("from_unsignedlonglong", "METH_NOARGS",
  118. """
  119. return PyLong_FromUnsignedLongLong((unsigned long long)-1);
  120. """)])
  121. assert module.from_longlong() == -1
  122. assert module.from_unsignedlonglong() == (1<<64) - 1
  123. def test_from_size_t(self):
  124. module = self.import_extension('foo', [
  125. ("from_unsignedlong", "METH_NOARGS",
  126. """
  127. return PyLong_FromSize_t((size_t)-1);
  128. """)])
  129. import sys
  130. assert module.from_unsignedlong() == 2 * sys.maxint + 1
  131. def test_fromstring(self):
  132. module = self.import_extension('foo', [
  133. ("from_string", "METH_NOARGS",
  134. """
  135. return PyLong_FromString("0x1234", NULL, 0);
  136. """),
  137. ])
  138. assert module.from_string() == 0x1234
  139. def test_frombytearray(self):
  140. module = self.import_extension('foo', [
  141. ("from_bytearray", "METH_VARARGS",
  142. """
  143. int little_endian, is_signed;
  144. if (!PyArg_ParseTuple(args, "ii", &little_endian, &is_signed))
  145. return NULL;
  146. return _PyLong_FromByteArray((unsigned char*)"\x9A\xBC", 2,
  147. little_endian, is_signed);
  148. """),
  149. ])
  150. assert module.from_bytearray(True, False) == 0xBC9A
  151. assert module.from_bytearray(True, True) == -0x4366
  152. assert module.from_bytearray(False, False) == 0x9ABC
  153. assert module.from_bytearray(False, True) == -0x6544
  154. def test_frombytearray_2(self):
  155. module = self.import_extension('foo', [
  156. ("from_bytearray", "METH_VARARGS",
  157. """
  158. int little_endian, is_signed;
  159. if (!PyArg_ParseTuple(args, "ii", &little_endian, &is_signed))
  160. return NULL;
  161. return _PyLong_FromByteArray((unsigned char*)"\x9A\xBC\x41", 3,
  162. little_endian, is_signed);
  163. """),
  164. ])
  165. assert module.from_bytearray(True, False) == 0x41BC9A
  166. assert module.from_bytearray(True, True) == 0x41BC9A
  167. assert module.from_bytearray(False, False) == 0x9ABC41
  168. assert module.from_bytearray(False, True) == -0x6543BF
  169. def test_fromunicode(self):
  170. module = self.import_extension('foo', [
  171. ("from_unicode", "METH_O",
  172. """
  173. Py_UNICODE* u = PyUnicode_AsUnicode(args);
  174. return Py_BuildValue("NN",
  175. PyLong_FromUnicode(u, 6, 10),
  176. PyLong_FromUnicode(u, 6, 16));
  177. """),
  178. ])
  179. # A string with arabic digits. 'BAD' is after the 6th character.
  180. assert module.from_unicode(u' 1\u0662\u0663\u0664BAD') == (1234, 4660)
  181. def test_strtol(self):
  182. module = self.import_extension('foo', [
  183. ("from_str", "METH_NOARGS",
  184. """
  185. const char *str =" 400";
  186. char * end;
  187. if (400 != PyOS_strtoul(str, &end, 10))
  188. return PyLong_FromLong(1);
  189. if (str + strlen(str) != end)
  190. return PyLong_FromLong(2);
  191. if (400 != PyOS_strtol(str, &end, 10))
  192. return PyLong_FromLong(3);
  193. if (str + strlen(str) != end)
  194. return PyLong_FromLong(4);
  195. return PyLong_FromLong(0);
  196. """)])
  197. assert module.from_str() == 0
  198. def test_slots(self):
  199. module = self.import_extension('foo', [
  200. ("has_sub", "METH_NOARGS",
  201. """
  202. PyObject *ret, *obj = PyLong_FromLong(42);
  203. if (obj->ob_type->tp_as_number->nb_subtract)
  204. ret = obj->ob_type->tp_as_number->nb_subtract(obj, obj);
  205. else
  206. ret = PyLong_FromLong(-1);
  207. Py_DECREF(obj);
  208. return ret;
  209. """),
  210. ("has_pow", "METH_NOARGS",
  211. """
  212. PyObject *ret, *obj = PyLong_FromLong(42);
  213. PyObject *one = PyLong_FromLong(1);
  214. if (obj->ob_type->tp_as_number->nb_power)
  215. ret = obj->ob_type->tp_as_number->nb_power(obj, one, one);
  216. else
  217. ret = PyLong_FromLong(-1);
  218. Py_DECREF(obj);
  219. return ret;
  220. """),
  221. ("has_hex", "METH_NOARGS",
  222. """
  223. PyObject *ret, *obj = PyLong_FromLong(42);
  224. if (obj->ob_type->tp_as_number->nb_hex)
  225. ret = obj->ob_type->tp_as_number->nb_hex(obj);
  226. else
  227. ret = PyLong_FromLong(-1);
  228. Py_DECREF(obj);
  229. return ret;
  230. """),
  231. ("has_oct", "METH_NOARGS",
  232. """
  233. PyObject *ret, *obj = PyLong_FromLong(42);
  234. if (obj->ob_type->tp_as_number->nb_oct)
  235. ret = obj->ob_type->tp_as_number->nb_oct(obj);
  236. else
  237. ret = PyLong_FromLong(-1);
  238. Py_DECREF(obj);
  239. return ret;
  240. """)])
  241. assert module.has_sub() == 0
  242. assert module.has_pow() == 0
  243. assert module.has_hex() == '0x2aL'
  244. assert module.has_oct() == '052L'