@@ -39,6 +39,21 @@ def test_ascii_non_printable_encode(self):
3939 self .assertEqual (self .dumps (u , ensure_ascii = False ),
4040 '"\\ b\\ t\\ n\\ f\\ r\\ u0000\\ u001f\x7f "' )
4141
42+ def test_ascii_non_printable_decode (self ):
43+ self .assertEqual (self .loads ('"\\ b\\ t\\ n\\ f\\ r"' ),
44+ '\b \t \n \f \r ' )
45+ s = '' .join (map (chr , range (32 )))
46+ for c in s :
47+ self .assertRaises (self .JSONDecodeError , self .loads , f'"{ c } "' )
48+ self .assertEqual (self .loads (f'"{ s } "' , strict = False ), s )
49+ self .assertEqual (self .loads ('"\x7f "' ), '\x7f ' )
50+
51+ def test_escaped_decode (self ):
52+ self .assertEqual (self .loads ('"\\ b\\ t\\ n\\ f\\ r"' ), '\b \t \n \f \r ' )
53+ self .assertEqual (self .loads ('"\\ "\\ \\ \\ /"' ), '"\\ /' )
54+ for c in set (map (chr , range (0x100 ))) - set ('"\\ /bfnrt' ):
55+ self .assertRaises (self .JSONDecodeError , self .loads , f'"\\ { c } "' )
56+
4257 def test_big_unicode_encode (self ):
4358 u = '\U0001d120 '
4459 self .assertEqual (self .dumps (u ), '"\\ ud834\\ udd20"' )
@@ -55,6 +70,18 @@ def test_unicode_decode(self):
5570 s = f'"\\ u{ i :04x} "'
5671 self .assertEqual (self .loads (s ), u )
5772
73+ def test_single_surrogate_encode (self ):
74+ self .assertEqual (self .dumps ('\uD0FF ' ), '"\\ ud0ff"' )
75+ self .assertEqual (self .dumps ('\uD0FF ' , ensure_ascii = False ), '"\ud0ff "' )
76+ self .assertEqual (self .dumps ('\uDEAD ' ), '"\\ udead"' )
77+ self .assertEqual (self .dumps ('\uDEAD ' , ensure_ascii = False ), '"\udead "' )
78+
79+ def test_single_surrogate_decode (self ):
80+ self .assertEqual (self .loads ('"\uD0FF "' ), '\ud0ff ' )
81+ self .assertEqual (self .loads ('"\\ uD0FF"' ), '\ud0ff ' )
82+ self .assertEqual (self .loads ('"\uDEAD "' ), '\udead ' )
83+ self .assertEqual (self .loads ('"\\ uDEAD"' ), '\udead ' )
84+
5885 def test_unicode_preservation (self ):
5986 self .assertEqual (type (self .loads ('""' )), str )
6087 self .assertEqual (type (self .loads ('"a"' )), str )
0 commit comments