@@ -37,8 +37,140 @@ bytes_resize(PyObject *Py_UNUSED(module), PyObject *args)
37
37
}
38
38
39
39
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
+
40
168
static PyMethodDef test_methods [] = {
41
169
{"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 },
42
174
{NULL },
43
175
};
44
176
0 commit comments