Branch data Line data Source code
1 : : #define PY_SSIZE_T_CLEAN
2 : :
3 : : #include "parts.h"
4 : :
5 : :
6 : : // Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8()
7 : : static PyObject *
8 : 0 : test_float_pack(PyObject *self, PyObject *args)
9 : : {
10 : : int size;
11 : : double d;
12 : : int le;
13 [ # # ]: 0 : if (!PyArg_ParseTuple(args, "idi", &size, &d, &le)) {
14 : 0 : return NULL;
15 : : }
16 [ # # # # ]: 0 : switch (size)
17 : : {
18 : 0 : case 2:
19 : : {
20 : : char data[2];
21 [ # # ]: 0 : if (PyFloat_Pack2(d, data, le) < 0) {
22 : 0 : return NULL;
23 : : }
24 : 0 : return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
25 : : }
26 : 0 : case 4:
27 : : {
28 : : char data[4];
29 [ # # ]: 0 : if (PyFloat_Pack4(d, data, le) < 0) {
30 : 0 : return NULL;
31 : : }
32 : 0 : return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
33 : : }
34 : 0 : case 8:
35 : : {
36 : : char data[8];
37 [ # # ]: 0 : if (PyFloat_Pack8(d, data, le) < 0) {
38 : 0 : return NULL;
39 : : }
40 : 0 : return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
41 : : }
42 : 0 : default: break;
43 : : }
44 : :
45 : 0 : PyErr_SetString(PyExc_ValueError, "size must 2, 4 or 8");
46 : 0 : return NULL;
47 : : }
48 : :
49 : :
50 : : // Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8()
51 : : static PyObject *
52 : 0 : test_float_unpack(PyObject *self, PyObject *args)
53 : : {
54 [ # # ]: 0 : assert(!PyErr_Occurred());
55 : : const char *data;
56 : : Py_ssize_t size;
57 : : int le;
58 [ # # ]: 0 : if (!PyArg_ParseTuple(args, "y#i", &data, &size, &le)) {
59 : 0 : return NULL;
60 : : }
61 : : double d;
62 [ # # # # ]: 0 : switch (size)
63 : : {
64 : 0 : case 2:
65 : 0 : d = PyFloat_Unpack2(data, le);
66 : 0 : break;
67 : 0 : case 4:
68 : 0 : d = PyFloat_Unpack4(data, le);
69 : 0 : break;
70 : 0 : case 8:
71 : 0 : d = PyFloat_Unpack8(data, le);
72 : 0 : break;
73 : 0 : default:
74 : 0 : PyErr_SetString(PyExc_ValueError, "data length must 2, 4 or 8 bytes");
75 : 0 : return NULL;
76 : : }
77 : :
78 [ # # # # ]: 0 : if (d == -1.0 && PyErr_Occurred()) {
79 : 0 : return NULL;
80 : : }
81 : 0 : return PyFloat_FromDouble(d);
82 : : }
83 : :
84 : : static PyMethodDef test_methods[] = {
85 : : {"float_pack", test_float_pack, METH_VARARGS, NULL},
86 : : {"float_unpack", test_float_unpack, METH_VARARGS, NULL},
87 : : {NULL},
88 : : };
89 : :
90 : : int
91 : 2 : _PyTestCapi_Init_Float(PyObject *mod)
92 : : {
93 [ - + ]: 2 : if (PyModule_AddFunctions(mod, test_methods) < 0) {
94 : 0 : return -1;
95 : : }
96 : :
97 : 2 : return 0;
98 : : }
|