@@ -265,6 +265,43 @@ def test_mapping_getitemstring(self):
265
265
self .assertRaises (TypeError , getitemstring , [], b'a' )
266
266
self .assertRaises (SystemError , getitemstring , NULL , b'a' )
267
267
268
+ def test_mapping_getoptionalitem (self ):
269
+ getitem = _testcapi .mapping_getoptionalitem
270
+ dct = {'a' : 1 , '\U0001f40d ' : 2 }
271
+ self .assertEqual (getitem (dct , 'a' ), 1 )
272
+ self .assertEqual (getitem (dct , 'b' ), KeyError )
273
+ self .assertEqual (getitem (dct , '\U0001f40d ' ), 2 )
274
+
275
+ dct2 = ProxyGetItem (dct )
276
+ self .assertEqual (getitem (dct2 , 'a' ), 1 )
277
+ self .assertEqual (getitem (dct2 , 'b' ), KeyError )
278
+
279
+ self .assertEqual (getitem (['a' , 'b' , 'c' ], 1 ), 'b' )
280
+
281
+ self .assertRaises (TypeError , getitem , 42 , 'a' )
282
+ self .assertRaises (TypeError , getitem , {}, []) # unhashable
283
+ self .assertRaises (IndexError , getitem , [], 1 )
284
+ self .assertRaises (TypeError , getitem , [], 'a' )
285
+ # CRASHES getitem({}, NULL)
286
+ # CRASHES getitem(NULL, 'a')
287
+
288
+ def test_mapping_getoptionalitemstring (self ):
289
+ getitemstring = _testcapi .mapping_getoptionalitemstring
290
+ dct = {'a' : 1 , '\U0001f40d ' : 2 }
291
+ self .assertEqual (getitemstring (dct , b'a' ), 1 )
292
+ self .assertEqual (getitemstring (dct , b'b' ), KeyError )
293
+ self .assertEqual (getitemstring (dct , '\U0001f40d ' .encode ()), 2 )
294
+
295
+ dct2 = ProxyGetItem (dct )
296
+ self .assertEqual (getitemstring (dct2 , b'a' ), 1 )
297
+ self .assertEqual (getitemstring (dct2 , b'b' ), KeyError )
298
+
299
+ self .assertRaises (TypeError , getitemstring , 42 , b'a' )
300
+ self .assertRaises (UnicodeDecodeError , getitemstring , {}, b'\xff ' )
301
+ self .assertRaises (SystemError , getitemstring , {}, NULL )
302
+ self .assertRaises (TypeError , getitemstring , [], b'a' )
303
+ # CRASHES getitemstring(NULL, b'a')
304
+
268
305
def test_mapping_haskey (self ):
269
306
haskey = _testcapi .mapping_haskey
270
307
dct = {'a' : 1 , '\U0001f40d ' : 2 }
0 commit comments