38
38
# SOFTWARE.
39
39
40
40
import sys
41
+ import re
41
42
42
43
from . import CPyExtTestCase , CPyExtFunction , unhandled_error_compare , GRAALPYTHON
43
44
@@ -154,6 +155,29 @@ class Dummy():
154
155
pass
155
156
156
157
158
+ class Displayable :
159
+ def __str__ (self ):
160
+ return 'str: 文字列'
161
+
162
+ def __repr__ (self ):
163
+ return 'repr: 文字列'
164
+
165
+
166
+ class BrokenDisplayable :
167
+ def __str__ (self ):
168
+ raise NotImplementedError
169
+
170
+ def __repr__ (self ):
171
+ raise NotImplementedError
172
+
173
+
174
+ def compare_ptr_string (x , y ):
175
+ if isinstance (x , str ) and isinstance (y , str ):
176
+ x = re .sub (r'0x[0-9a-fA-F]+' , '0xPLACEHOLDER' , x )
177
+ y = re .sub (r'0x[0-9a-fA-F]+' , '0xPLACEHOLDER' , y )
178
+ return unhandled_error_compare (x , y )
179
+
180
+
157
181
def gen_intern_args ():
158
182
args = (
159
183
("some text" ,),
@@ -199,9 +223,11 @@ def compile_module(self, name):
199
223
)
200
224
201
225
test_PyUnicode_FromFormat0 = CPyExtFunction (
202
- _reference_fromformat ,
226
+ lambda args : args [ 0 ]. replace ( '%%' , '%' ) ,
203
227
lambda : (
204
228
("hello, world!" ,),
229
+ ("<%%>" ,),
230
+ ("<%6>" ,),
205
231
),
206
232
code = """PyObject* wrap_PyUnicode_FromFormat0(char* fmt) {
207
233
return PyUnicode_FromFormat(fmt);
@@ -227,6 +253,91 @@ def compile_module(self, name):
227
253
cmpfunc = unhandled_error_compare
228
254
)
229
255
256
+ test_PyUnicode_FromFormat_U = CPyExtFunction (
257
+ lambda args : f'obj({ args [1 ]} )' ,
258
+ lambda : (
259
+ ("obj(%U)" , "str" ),
260
+ ),
261
+ resultspec = "O" ,
262
+ argspec = 'sO' ,
263
+ arguments = ["char* fmt" , "PyObject* obj" ],
264
+ callfunction = "PyUnicode_FromFormat" ,
265
+ cmpfunc = unhandled_error_compare
266
+ )
267
+
268
+ test_PyUnicode_FromFormat_V = CPyExtFunction (
269
+ lambda args : f'obj({ args [1 ] or args [2 ]} )' ,
270
+ lambda : (
271
+ ("obj(%V)" , "str" , "fallback" ),
272
+ ("obj(%V)" , None , "fallback" ),
273
+ ),
274
+ code = """PyObject* wrap_PyUnicode_FromFormat_V(char* fmt, PyObject* obj, char* fallback) {
275
+ if (obj == Py_None)
276
+ obj = NULL;
277
+ return PyUnicode_FromFormat(fmt, obj, fallback);
278
+ }
279
+ """ ,
280
+ resultspec = "O" ,
281
+ argspec = 'sOs' ,
282
+ arguments = ["char* fmt" , "PyObject* obj" , "char* fallback" ],
283
+ callfunction = "wrap_PyUnicode_FromFormat_V" ,
284
+ cmpfunc = unhandled_error_compare
285
+ )
286
+
287
+ test_PyUnicode_FromFormat_S = CPyExtFunction (
288
+ lambda args : f'obj({ args [1 ]} )' ,
289
+ lambda : (
290
+ ("obj(%S)" , "str" ),
291
+ ("obj(%S)" , Displayable ()),
292
+ ("obj(%S)" , BrokenDisplayable ()),
293
+ ),
294
+ resultspec = "O" ,
295
+ argspec = 'sO' ,
296
+ arguments = ["char* fmt" , "PyObject* obj" ],
297
+ callfunction = "PyUnicode_FromFormat" ,
298
+ cmpfunc = unhandled_error_compare
299
+ )
300
+
301
+ test_PyUnicode_FromFormat_R = CPyExtFunction (
302
+ lambda args : f'obj({ args [1 ]!r} )' ,
303
+ lambda : (
304
+ ("obj(%R)" , "str" ),
305
+ ("obj(%R)" , Displayable ()),
306
+ ("obj(%R)" , BrokenDisplayable ()),
307
+ ),
308
+ resultspec = "O" ,
309
+ argspec = 'sO' ,
310
+ arguments = ["char* fmt" , "PyObject* obj" ],
311
+ callfunction = "PyUnicode_FromFormat" ,
312
+ cmpfunc = unhandled_error_compare
313
+ )
314
+
315
+ test_PyUnicode_FromFormat_A = CPyExtFunction (
316
+ lambda args : f'obj({ args [1 ]!a} )' ,
317
+ lambda : (
318
+ ("obj(%A)" , "str" ),
319
+ ("obj(%A)" , Displayable ()),
320
+ ("obj(%A)" , BrokenDisplayable ()),
321
+ ),
322
+ resultspec = "O" ,
323
+ argspec = 'sO' ,
324
+ arguments = ["char* fmt" , "PyObject* obj" ],
325
+ callfunction = "PyUnicode_FromFormat" ,
326
+ cmpfunc = unhandled_error_compare
327
+ )
328
+
329
+ test_PyUnicode_FromFormat_p = CPyExtFunction (
330
+ lambda args : "ptr(0xdeadbeef)" ,
331
+ lambda : (
332
+ ("ptr(%p)" , object ()),
333
+ ),
334
+ resultspec = "O" ,
335
+ argspec = 'sO' ,
336
+ arguments = ["char* fmt" , "PyObject* obj" ],
337
+ callfunction = "PyUnicode_FromFormat" ,
338
+ cmpfunc = compare_ptr_string
339
+ )
340
+
230
341
test_PyUnicode_FromFormat4 = CPyExtFunction (
231
342
_reference_fromformat ,
232
343
lambda : (
0 commit comments