2626
2727class CodecTest (IronPythonTestCase ):
2828 def test_escape_decode (self ):
29- #sanity checks
29+ # escape_decode decodes bytes to bytes, but when given a string it encodes it first with UTF-8
30+ self .assertEqual (codecs .escape_decode ("abc€ghi🐍xyz" ), codecs .escape_decode (b'abc\xe2 \x82 \xac ghi\xf0 \x9f \x90 \x8d xyz' ))
3031
3132 value , length = codecs .escape_decode ("ab\a \b \t \n \r \f \v ba" )
3233 self .assertEqual (value , b'ab\x07 \x08 \t \n \r \x0c \x0b ba' )
@@ -36,22 +37,64 @@ def test_escape_decode(self):
3637 self .assertEqual (value , b'\x07 ' )
3738 self .assertEqual (length , 2 )
3839
39- value , length = codecs .escape_decode ("ab\a \b \t \n \r \f \v baab \\ a\\ b\\ t\\ n\\ r\\ f\\ vbaab \\ \a \\ \b \\ \t \\ \n \\ \r \\ \f \\ \v ba" )
40- self .assertEqual (value , b'ab\x07 \x08 \t \n \r \x0c \x0b baab \ x07\x08 \t \n \r \x0c \x0b baab \\ \x07 \\ \x08 \\ \t \\ \r \\ \x0c \\ \x0b ba' )
41- self .assertEqual (length , 47 )
40+ value , length = codecs .escape_decode ("ab\a \b \t \n \r \f \v \' \" baab \\ a\\ b\\ t\\ n\\ r\\ f\\ v \\ ' \\ \" baab \\ \a \\ \b \\ \t \\ \n \\ \r \\ \f \\ \v ba" )
41+ self .assertEqual (value , b'ab\x07 \x08 \t \n \r \x0c \x0b \' \" baab \ x07\x08 \t \n \r \x0c \x0b \' \" baab \\ \x07 \\ \x08 \\ \t \\ \r \\ \x0c \\ \x0b ba' )
42+ self .assertEqual (length , 53 )
4243
4344 value , length = codecs .escape_decode ("\\ \a " )
4445 self .assertEqual (value , b'\\ \x07 ' )
4546 self .assertEqual (length , 2 )
4647
47- self .assertEqual (b"abc" , codecs .escape_decode ("abc" , None )[0 ])
48+ value , length = codecs .escape_decode ("\\ 07" )
49+ self .assertEqual (value , b'\x07 ' )
50+ self .assertEqual (length , 3 )
51+
52+ value , length = codecs .escape_decode ("\\ 047" )
53+ self .assertEqual (value , b"'" )
54+ self .assertEqual (length , 4 )
55+
56+ self .assertEquals (codecs .escape_decode (b"ab\n c" ), (b"ab\n c" , 4 ))
57+ self .assertEquals (codecs .escape_decode (b"ab\r c" ), (b"ab\r c" , 4 ))
58+ self .assertEquals (codecs .escape_decode (b"ab\r \n c" ), (b"ab\r \n c" , 5 ))
59+
60+ self .assertEquals (codecs .escape_decode (b"ab\\ \n c" ), (b"abc" , 5 ))
61+ self .assertEquals (codecs .escape_decode (b"ab\\ \r c" ), (b"ab\\ \r c" , 5 ))
62+ self .assertEquals (codecs .escape_decode (b"ab\\ \r \\ \n c" ), (b"ab\\ \r c" , 7 ))
63+
64+ def test_escape_decode_errors (self ):
65+ self .assertEqual (codecs .escape_decode ("abc" , None ), (b"abc" , 3 ))
66+
4867 self .assertEqual (b"?" , codecs .escape_decode ("\\ x" , 'replace' )[0 ])
4968 self .assertEqual (b"?" , codecs .escape_decode ("\\ x2" , 'replace' )[0 ])
5069 self .assertEqual (b"?I" , codecs .escape_decode ("\\ xI" , 'replace' )[0 ])
5170 self .assertEqual (b"?II" , codecs .escape_decode ("\\ xII" , 'replace' )[0 ])
5271 self .assertEqual (b"?I" , codecs .escape_decode ("\\ x1I" , 'replace' )[0 ])
5372 self .assertEqual (b"?I1" , codecs .escape_decode ("\\ xI1" , 'replace' )[0 ])
5473
74+ self .assertEqual (b"abc" , codecs .escape_decode ("abc\\ x" , 'ignore' )[0 ])
75+ self .assertEqual (b"abc" , codecs .escape_decode ("abc\\ x2" , 'ignore' )[0 ])
76+ self .assertEqual (b"abcI" , codecs .escape_decode ("abc\\ xI" , 'ignore' )[0 ])
77+ self .assertEqual (b"abcII" , codecs .escape_decode ("abc\\ xII" , 'ignore' )[0 ])
78+ self .assertEqual (b"abcI" , codecs .escape_decode ("abc\\ x1I" , 'ignore' )[0 ])
79+ self .assertEqual (b"abcI1" , codecs .escape_decode ("abc\\ xI1" , 'ignore' )[0 ])
80+
81+ self .assertRaisesRegex (ValueError , r"Trailing \\ in string" , codecs .escape_decode , b"\\ " , None )
82+ self .assertRaisesRegex (ValueError , r"Trailing \\ in string" , codecs .escape_decode , b"\\ " , 'strict' )
83+ self .assertRaisesRegex (ValueError , r"Trailing \\ in string" , codecs .escape_decode , b"\\ " , 'replace' )
84+ self .assertRaisesRegex (ValueError , r"Trailing \\ in string" , codecs .escape_decode , b"\\ " , 'ignore' )
85+ self .assertRaisesRegex (ValueError , r"Trailing \\ in string" , codecs .escape_decode , b"\\ " , 'non-existent' )
86+
87+ self .assertRaisesRegex (ValueError , r"invalid \\x escape at position 3" , codecs .escape_decode , b"abc\\ xii" )
88+ self .assertRaisesRegex (ValueError , r"invalid \\x escape at position 3" , codecs .escape_decode , b"abc\\ x1i" )
89+ self .assertRaisesRegex (ValueError , r"invalid \\x escape at position 3" , codecs .escape_decode , b"abc\\ xii" , 'strict' )
90+ self .assertRaisesRegex (ValueError , r"invalid \\x escape at position 3" , codecs .escape_decode , b"abc\\ x1i" , 'strict' )
91+ self .assertRaisesRegex (ValueError , r"invalid \\x escape at position 3" , codecs .escape_decode , b"abc\\ xii" , None )
92+ self .assertRaisesRegex (ValueError , r"invalid \\x escape at position 3" , codecs .escape_decode , b"abc\\ x1i" , None )
93+
94+ for errors in ['backslashreplace' , 'xmlcharrefreplace' , 'namereplace' , 'surrogateescape' , 'surrogatepass' , 'non-existent' , '' ]:
95+ self .assertRaisesRegex (ValueError , "decoding error; unknown error handling code: " + errors , codecs .escape_decode , b"abc\\ xii" , errors )
96+ self .assertRaisesRegex (ValueError , "decoding error; unknown error handling code: " + errors , codecs .escape_decode , b"abc\\ x1i" , errors )
97+
5598 def test_escape_encode (self ):
5699 #sanity checks
57100 value , length = codecs .escape_encode (b"abba" )
0 commit comments