1+ import contextlib
12import unittest
23from collections import OrderedDict , UserDict
34from types import MappingProxyType
@@ -258,6 +259,12 @@ def test_dict_contains_string(self):
258259 # CRASHES contains({}, NULL)
259260 # CRASHES contains(NULL, b'a')
260261
262+ @contextlib .contextmanager
263+ def frozendict_does_not_support (self , what ):
264+ errmsg = f'frozendict object does not support item { what } '
265+ with self .assertRaisesRegex (TypeError , errmsg ):
266+ yield
267+
261268 def test_dict_setitem (self ):
262269 # Test PyDict_SetItem()
263270 setitem = _testlimitedcapi .dict_setitem
@@ -269,7 +276,10 @@ def test_dict_setitem(self):
269276 self .assertEqual (dct , {'a' : 5 , '\U0001f40d ' : 8 })
270277
271278 self .assertRaises (TypeError , setitem , {}, [], 5 ) # unhashable
272- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
279+ for test_type in FROZENDICT_TYPES :
280+ with self .frozendict_does_not_support ('assignment' ):
281+ setitem (test_type (), 'a' , 5 )
282+ for test_type in MAPPING_TYPES + OTHER_TYPES :
273283 self .assertRaises (SystemError , setitem , test_type (), 'a' , 5 )
274284 # CRASHES setitem({}, NULL, 5)
275285 # CRASHES setitem({}, 'a', NULL)
@@ -286,7 +296,10 @@ def test_dict_setitemstring(self):
286296 self .assertEqual (dct , {'a' : 5 , '\U0001f40d ' : 8 })
287297
288298 self .assertRaises (UnicodeDecodeError , setitemstring , {}, INVALID_UTF8 , 5 )
289- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
299+ for test_type in FROZENDICT_TYPES :
300+ with self .frozendict_does_not_support ('assignment' ):
301+ setitemstring (test_type (), b'a' , 5 )
302+ for test_type in MAPPING_TYPES + OTHER_TYPES :
290303 self .assertRaises (SystemError , setitemstring , test_type (), b'a' , 5 )
291304 # CRASHES setitemstring({}, NULL, 5)
292305 # CRASHES setitemstring({}, b'a', NULL)
@@ -304,7 +317,10 @@ def test_dict_delitem(self):
304317 self .assertEqual (dct , {'c' : 2 })
305318
306319 self .assertRaises (TypeError , delitem , {}, []) # unhashable
307- for test_type in NOT_DICT_TYPES :
320+ for test_type in FROZENDICT_TYPES :
321+ with self .frozendict_does_not_support ('deletion' ):
322+ delitem (test_type ({'a' : 1 }), 'a' )
323+ for test_type in MAPPING_TYPES :
308324 self .assertRaises (SystemError , delitem , test_type ({'a' : 1 }), 'a' )
309325 for test_type in OTHER_TYPES :
310326 self .assertRaises (SystemError , delitem , test_type (), 'a' )
@@ -323,7 +339,10 @@ def test_dict_delitemstring(self):
323339 self .assertEqual (dct , {'c' : 2 })
324340
325341 self .assertRaises (UnicodeDecodeError , delitemstring , {}, INVALID_UTF8 )
326- for test_type in NOT_DICT_TYPES :
342+ for test_type in FROZENDICT_TYPES :
343+ with self .frozendict_does_not_support ('deletion' ):
344+ delitemstring (test_type ({'a' : 1 }), b'a' )
345+ for test_type in MAPPING_TYPES :
327346 self .assertRaises (SystemError , delitemstring , test_type ({'a' : 1 }), b'a' )
328347 for test_type in OTHER_TYPES :
329348 self .assertRaises (SystemError , delitemstring , test_type (), b'a' )
@@ -341,7 +360,10 @@ def test_dict_setdefault(self):
341360 self .assertEqual (dct , {'a' : 5 })
342361
343362 self .assertRaises (TypeError , setdefault , {}, [], 5 ) # unhashable
344- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
363+ for test_type in FROZENDICT_TYPES :
364+ with self .frozendict_does_not_support ('assignment' ):
365+ setdefault (test_type (), 'a' , 5 )
366+ for test_type in MAPPING_TYPES + OTHER_TYPES :
345367 self .assertRaises (SystemError , setdefault , test_type (), 'a' , 5 )
346368 # CRASHES setdefault({}, NULL, 5)
347369 # CRASHES setdefault({}, 'a', NULL)
@@ -358,7 +380,10 @@ def test_dict_setdefaultref(self):
358380 self .assertEqual (dct , {'a' : 5 })
359381
360382 self .assertRaises (TypeError , setdefault , {}, [], 5 ) # unhashable
361- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
383+ for test_type in FROZENDICT_TYPES :
384+ with self .frozendict_does_not_support ('assignment' ):
385+ setdefault (test_type (), 'a' , 5 )
386+ for test_type in MAPPING_TYPES + OTHER_TYPES :
362387 self .assertRaises (SystemError , setdefault , test_type (), 'a' , 5 )
363388 # CRASHES setdefault({}, NULL, 5)
364389 # CRASHES setdefault({}, 'a', NULL)
@@ -424,7 +449,10 @@ def test_dict_update(self):
424449
425450 self .assertRaises (AttributeError , update , {}, [])
426451 self .assertRaises (AttributeError , update , {}, 42 )
427- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
452+ for test_type in FROZENDICT_TYPES :
453+ with self .frozendict_does_not_support ('assignment' ):
454+ update (test_type (), {})
455+ for test_type in MAPPING_TYPES + OTHER_TYPES :
428456 self .assertRaises (SystemError , update , test_type (), {})
429457 self .assertRaises (SystemError , update , {}, NULL )
430458 self .assertRaises (SystemError , update , NULL , {})
@@ -443,7 +471,10 @@ def test_dict_merge(self):
443471
444472 self .assertRaises (AttributeError , merge , {}, [], 0 )
445473 self .assertRaises (AttributeError , merge , {}, 42 , 0 )
446- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
474+ for test_type in FROZENDICT_TYPES :
475+ with self .frozendict_does_not_support ('assignment' ):
476+ merge (test_type (), {}, 0 )
477+ for test_type in MAPPING_TYPES + OTHER_TYPES :
447478 self .assertRaises (SystemError , merge , test_type (), {}, 0 )
448479 self .assertRaises (SystemError , merge , {}, NULL , 0 )
449480 self .assertRaises (SystemError , merge , NULL , {}, 0 )
@@ -464,7 +495,10 @@ def test_dict_mergefromseq2(self):
464495 self .assertRaises (ValueError , mergefromseq2 , {}, [(1 , 2 , 3 )], 0 )
465496 self .assertRaises (TypeError , mergefromseq2 , {}, [1 ], 0 )
466497 self .assertRaises (TypeError , mergefromseq2 , {}, 42 , 0 )
467- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
498+ for test_type in FROZENDICT_TYPES :
499+ with self .frozendict_does_not_support ('assignment' ):
500+ mergefromseq2 (test_type (), [], 0 )
501+ for test_type in MAPPING_TYPES + OTHER_TYPES :
468502 self .assertRaises (SystemError , mergefromseq2 , test_type (), [], 0 )
469503 # CRASHES mergefromseq2({}, NULL, 0)
470504 # CRASHES mergefromseq2(NULL, {}, 0)
@@ -511,7 +545,10 @@ def test_dict_pop(self):
511545 dict_pop (mydict , not_hashable_key )
512546
513547 # wrong dict type
514- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
548+ for test_type in FROZENDICT_TYPES :
549+ with self .frozendict_does_not_support ('deletion' ):
550+ dict_pop (test_type (), "key" )
551+ for test_type in MAPPING_TYPES + OTHER_TYPES :
515552 not_dict = test_type ()
516553 self .assertRaises (SystemError , dict_pop , not_dict , "key" )
517554 self .assertRaises (SystemError , dict_pop_null , not_dict , "key" )
@@ -560,7 +597,10 @@ def test_dict_popstring(self):
560597 self .assertRaises (UnicodeDecodeError , dict_popstring_null , mydict , INVALID_UTF8 )
561598
562599 # wrong dict type
563- for test_type in NOT_DICT_TYPES + OTHER_TYPES :
600+ for test_type in FROZENDICT_TYPES :
601+ with self .frozendict_does_not_support ('deletion' ):
602+ dict_popstring (test_type (), "key" )
603+ for test_type in MAPPING_TYPES + OTHER_TYPES :
564604 not_dict = test_type ()
565605 self .assertRaises (SystemError , dict_popstring , not_dict , "key" )
566606 self .assertRaises (SystemError , dict_popstring_null , not_dict , "key" )
0 commit comments