@@ -994,57 +994,32 @@ def test_decode_all_defaults(self):
994
994
def test_unicode_decode_error_handler (self ):
995
995
enc = encode ({"keystr" : "foobar" })
996
996
997
- # Test handling of bad key value.
997
+ # Test handling of bad key value, bad string value, and both .
998
998
invalid_key = enc [:7 ] + b'\xe9 ' + enc [8 :]
999
- replaced_key = b'ke\xe9 str' .decode ('utf-8' , 'replace' )
1000
- ignored_key = b'ke\xe9 str' .decode ('utf-8' , 'ignore' )
1001
-
1002
- dec = decode (invalid_key ,
1003
- CodecOptions (unicode_decode_error_handler = "replace" ))
1004
- self .assertEqual (dec , {replaced_key : "foobar" })
1005
-
1006
- dec = decode (invalid_key ,
1007
- CodecOptions (unicode_decode_error_handler = "ignore" ))
1008
- self .assertEqual (dec , {ignored_key : "foobar" })
1009
-
1010
- self .assertRaises (InvalidBSON , decode , invalid_key , CodecOptions (
1011
- unicode_decode_error_handler = "strict" ))
1012
- self .assertRaises (InvalidBSON , decode , invalid_key , CodecOptions ())
1013
- self .assertRaises (InvalidBSON , decode , invalid_key )
1014
-
1015
- # Test handing of bad string value.
1016
- invalid_val = BSON (enc [:18 ] + b'\xe9 ' + enc [19 :])
1017
- replaced_val = b'fo\xe9 bar' .decode ('utf-8' , 'replace' )
1018
- ignored_val = b'fo\xe9 bar' .decode ('utf-8' , 'ignore' )
1019
-
1020
- dec = decode (invalid_val ,
1021
- CodecOptions (unicode_decode_error_handler = "replace" ))
1022
- self .assertEqual (dec , {"keystr" : replaced_val })
1023
-
1024
- dec = decode (invalid_val ,
1025
- CodecOptions (unicode_decode_error_handler = "ignore" ))
1026
- self .assertEqual (dec , {"keystr" : ignored_val })
1027
-
1028
- self .assertRaises (InvalidBSON , decode , invalid_val , CodecOptions (
1029
- unicode_decode_error_handler = "strict" ))
1030
- self .assertRaises (InvalidBSON , decode , invalid_val , CodecOptions ())
1031
- self .assertRaises (InvalidBSON , decode , invalid_val )
1032
-
1033
- # Test handing bad key + bad value.
999
+ invalid_val = enc [:18 ] + b'\xe9 ' + enc [19 :]
1034
1000
invalid_both = enc [:7 ] + b'\xe9 ' + enc [8 :18 ] + b'\xe9 ' + enc [19 :]
1035
1001
1036
- dec = decode (invalid_both ,
1037
- CodecOptions (unicode_decode_error_handler = "replace" ))
1038
- self .assertEqual (dec , {replaced_key : replaced_val })
1039
-
1040
- dec = decode (invalid_both ,
1041
- CodecOptions (unicode_decode_error_handler = "ignore" ))
1042
- self .assertEqual (dec , {ignored_key : ignored_val })
1043
-
1044
- self .assertRaises (InvalidBSON , decode , invalid_both , CodecOptions (
1045
- unicode_decode_error_handler = "strict" ))
1046
- self .assertRaises (InvalidBSON , decode , invalid_both , CodecOptions ())
1047
- self .assertRaises (InvalidBSON , decode , invalid_both )
1002
+ # Ensure that strict mode raises an error.
1003
+ for invalid in [invalid_key , invalid_val , invalid_both ]:
1004
+ self .assertRaises (InvalidBSON , decode , invalid , CodecOptions (
1005
+ unicode_decode_error_handler = "strict" ))
1006
+ self .assertRaises (InvalidBSON , decode , invalid , CodecOptions ())
1007
+ self .assertRaises (InvalidBSON , decode , invalid )
1008
+
1009
+ # Test all other error handlers.
1010
+ for handler in ['replace' , 'backslashreplace' , 'surrogateescape' ,
1011
+ 'ignore' ]:
1012
+ expected_key = b'ke\xe9 str' .decode ('utf-8' , handler )
1013
+ expected_val = b'fo\xe9 bar' .decode ('utf-8' , handler )
1014
+ doc = decode (invalid_key ,
1015
+ CodecOptions (unicode_decode_error_handler = handler ))
1016
+ self .assertEqual (doc , {expected_key : "foobar" })
1017
+ doc = decode (invalid_val ,
1018
+ CodecOptions (unicode_decode_error_handler = handler ))
1019
+ self .assertEqual (doc , {"keystr" : expected_val })
1020
+ doc = decode (invalid_both ,
1021
+ CodecOptions (unicode_decode_error_handler = handler ))
1022
+ self .assertEqual (doc , {expected_key : expected_val })
1048
1023
1049
1024
# Test handling bad error mode.
1050
1025
dec = decode (enc ,
0 commit comments