@@ -37,8 +37,140 @@ bytes_resize(PyObject *Py_UNUSED(module), PyObject *args)
3737}
3838
3939
40+ static int
41+ bytes_equal (PyObject * obj , const char * str )
42+ {
43+ return (PyBytes_Size (obj ) == (Py_ssize_t )strlen (str )
44+ && strcmp (PyBytes_AsString (obj ), str ) == 0 );
45+ }
46+
47+
48+ /* Test PyBytesWriter API */
49+ static PyObject *
50+ test_byteswriter (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
51+ {
52+ char * str ;
53+ PyBytesWriter * writer = PyBytesWriter_Create (3 , & str );
54+ if (writer == NULL ) {
55+ return NULL ;
56+ }
57+
58+ if (PyBytesWriter_WriteBytes (writer , & str , "abc" , 3 ) < 0 ) {
59+ goto error ;
60+ }
61+
62+ // write empty string
63+ if (PyBytesWriter_WriteBytes (writer , & str , "" , 0 ) < 0 ) {
64+ goto error ;
65+ }
66+
67+ PyObject * obj = PyBytesWriter_Finish (writer , str );
68+ if (obj == NULL ) {
69+ return NULL ;
70+ }
71+
72+ assert (bytes_equal (obj , "abc" ));
73+ Py_DECREF (obj );
74+
75+ Py_RETURN_NONE ;
76+
77+ error :
78+ PyBytesWriter_Discard (writer );
79+ return NULL ;
80+ }
81+
82+
83+ /* Test PyBytesWriter_Discard() */
84+ static PyObject *
85+ test_byteswriter_discard (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
86+ {
87+ char * str ;
88+ PyBytesWriter * writer = PyBytesWriter_Create (3 , & str );
89+ if (writer == NULL ) {
90+ return NULL ;
91+ }
92+ assert (PyBytesWriter_WriteBytes (writer , & str , "abc" , 3 ) == 0 );
93+
94+ PyBytesWriter_Discard (writer );
95+ Py_RETURN_NONE ;
96+ }
97+
98+
99+ /* Test PyBytesWriter_WriteBytes() */
100+ static PyObject *
101+ test_byteswriter_writebytes (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
102+ {
103+ char * str ;
104+ PyBytesWriter * writer = PyBytesWriter_Create (0 , & str );
105+ if (writer == NULL ) {
106+ return NULL ;
107+ }
108+
109+ if (PyBytesWriter_WriteBytes (writer , & str , "abc" , 3 ) < 0 ) {
110+ goto error ;
111+ }
112+ if (PyBytesWriter_WriteBytes (writer , & str , "def" , 3 ) < 0 ) {
113+ goto error ;
114+ }
115+
116+ PyObject * obj = PyBytesWriter_Finish (writer , str );
117+ if (obj == NULL ) {
118+ return NULL ;
119+ }
120+
121+ assert (bytes_equal (obj , "abcdef" ));
122+ Py_DECREF (obj );
123+
124+ Py_RETURN_NONE ;
125+
126+ error :
127+ PyBytesWriter_Discard (writer );
128+ return NULL ;
129+ }
130+
131+
132+ /* Test PyBytesWriter_Prepare() */
133+ static PyObject *
134+ test_byteswriter_prepare (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
135+ {
136+ char * str ;
137+ PyBytesWriter * writer = PyBytesWriter_Create (0 , & str );
138+ if (writer == NULL ) {
139+ return NULL ;
140+ }
141+
142+ // test error on purpose (negative size)
143+ assert (PyBytesWriter_Prepare (writer , & str , -3 ) < 0 );
144+ assert (PyErr_ExceptionMatches (PyExc_ValueError ));
145+ PyErr_Clear ();
146+
147+ if (PyBytesWriter_Prepare (writer , & str , 3 ) < 0 ) {
148+ PyBytesWriter_Discard (writer );
149+ return NULL ;
150+ }
151+
152+ // Write "abc"
153+ memcpy (str , "abc" , 3 );
154+ str += 3 ;
155+
156+ PyObject * obj = PyBytesWriter_Finish (writer , str );
157+ if (obj == NULL ) {
158+ return NULL ;
159+ }
160+
161+ assert (bytes_equal (obj , "abc" ));
162+ Py_DECREF (obj );
163+
164+ Py_RETURN_NONE ;
165+ }
166+
167+
40168static PyMethodDef test_methods [] = {
41169 {"bytes_resize" , bytes_resize , METH_VARARGS },
170+ {"test_byteswriter" , test_byteswriter , METH_NOARGS },
171+ {"test_byteswriter_discard" , test_byteswriter_discard , METH_NOARGS },
172+ {"test_byteswriter_writebytes" , test_byteswriter_writebytes , METH_NOARGS },
173+ {"test_byteswriter_prepare" , test_byteswriter_prepare , METH_NOARGS },
42174 {NULL },
43175};
44176
0 commit comments