@@ -454,6 +454,48 @@ def test_latin_1_encode(self):
454454 for x in ['iso-8859-1' , 'iso8859-1' , '8859' , 'cp819' , 'latin' , 'latin1' , 'L1' ]:
455455 self .assertEqual ('abc' .encode (x ), b'abc' )
456456
457+ def test_error_handlers (self ):
458+ ude = UnicodeDecodeError ('dummy' , b"abcdefgh" , 3 , 5 , "decoding testing purposes" )
459+ uee = UnicodeEncodeError ('dummy' , "abcdefgh" , 2 , 6 , "encoding testing purposes" )
460+ unicode_data = "ab\xff \u20ac \U0001f40d "
461+ uee_unicode = UnicodeEncodeError ('dummy' , unicode_data , 2 , len (unicode_data ), "encoding testing purposes" )
462+
463+ strict = codecs .lookup_error ('strict' )
464+ self .assertEqual (strict , codecs .strict_errors )
465+ with self .assertRaises (UnicodeDecodeError ) as cm :
466+ strict (ude )
467+ self .assertEqual (cm .exception , ude )
468+ with self .assertRaises (UnicodeEncodeError ) as cm :
469+ strict (uee )
470+ self .assertEqual (cm .exception , uee )
471+ self .assertRaisesRegex (TypeError , "codec must pass exception instance" , strict , None )
472+ self .assertRaisesRegex (TypeError , "\w+\(\) takes exactly (one|1) argument \(0 given\)" , strict )
473+ self .assertRaisesRegex (TypeError , "\w+\(\) takes exactly (one|1) argument \(2 given\)" , strict , ude , uee )
474+ self .assertRaises (LookupError , codecs .lookup_error , "STRICT" )
475+
476+ return # TODO: Implement remaining error handlers
477+
478+ ignore = codecs .lookup_error ('ignore' )
479+ self .assertEqual (ignore , codecs .ignore_errors )
480+ self .assertEqual (ignore (ude ), ("" , 5 ))
481+ self .assertEqual (ignore (uee ), ("" , 6 ))
482+
483+ replace = codecs .lookup_error ('replace' )
484+ self .assertEqual (replace , codecs .replace_errors )
485+ self .assertEqual (replace (ude ), ("�" , 5 ))
486+ self .assertEqual (replace (uee ), ("????" , 6 ))
487+
488+ backslashreplace = codecs .lookup_error ('backslashreplace' )
489+ self .assertEqual (backslashreplace , codecs .backslashreplace_errors )
490+ self .assertRaisesRegex (TypeError , "don't know how to handle UnicodeDecodeError in error callback" , backslashreplace , ude )
491+ self .assertEqual (backslashreplace (uee ), (r"\x63\x64\x65\x66" , 6 ))
492+ self .assertEqual (backslashreplace (uee_unicode ), (r"\xff\u20ac\U0001f40d" , uee_unicode .end ))
493+
494+ xmlcharrefreplace = codecs .lookup_error ('xmlcharrefreplace' )
495+ self .assertEqual (xmlcharrefreplace , codecs .xmlcharrefreplace_errors )
496+ self .assertRaisesRegex (TypeError , "don't know how to handle UnicodeDecodeError in error callback" , xmlcharrefreplace , ude )
497+ self .assertEqual (xmlcharrefreplace (uee ), ("cdef" , 6 ))
498+
457499 #TODO: @skip("multiple_execute")
458500 def test_lookup_error (self ):
459501 #sanity
0 commit comments