@@ -39,6 +39,10 @@ def test_nullcoding(self):
3939 self .assertEqual (str (b'' , enc ), '' )
4040 self .assertEqual ('' .encode (enc ), b'' )
4141
42+ def test_hz_tilde_at_buffer_boundary (self ):
43+ text = 'a' + '中a' * 6 + '~'
44+ self .assertEqual (text .encode ('hz' ).decode ('hz' ), text )
45+
4246 def test_str_decode (self ):
4347 for enc in ALL_CJKENCODINGS :
4448 self .assertEqual ('abcd' .encode (enc ), b'abcd' )
@@ -91,6 +95,12 @@ def test_decode_unicode(self):
9195
9296class Test_IncrementalEncoder (unittest .TestCase ):
9397
98+ def test_iso2022_kr_reset (self ):
99+ encoder = codecs .getincrementalencoder ('iso2022_kr' )()
100+ encoder .encode ('가' )
101+ encoder .reset ()
102+ self .assertEqual (encoder .encode ('가' , final = True ), '가' .encode ('iso2022_kr' ))
103+
94104 def test_stateless (self ):
95105 # cp949 encoder isn't stateful at all.
96106 encoder = codecs .getincrementalencoder ('cp949' )()
@@ -242,6 +252,19 @@ def test_subinterp(self):
242252
243253class Test_IncrementalDecoder (unittest .TestCase ):
244254
255+ def test_iso2022_split_escape (self ):
256+ raw = b'\x1b $0000000B'
257+ decoder = codecs .getincrementaldecoder ('iso2022_jp' )('replace' )
258+ decoded = decoder .decode (raw [:- 1 ]) + decoder .decode (raw [- 1 :], final = True )
259+ self .assertEqual (decoded , raw .decode ('iso2022_jp' , 'replace' ))
260+
261+ def test_iso2022_reset (self ):
262+ decoder = codecs .getincrementaldecoder ('iso2022_jp' )()
263+ decoder .decode (b'\x1b %' )
264+ decoder .reset ()
265+ with self .assertRaises (UnicodeDecodeError ):
266+ decoder .decode (b'\xff ' , final = True )
267+
245268 def test_dbcs (self ):
246269 # cp949 decoder is simple with only 1 or 2 bytes sequences.
247270 decoder = codecs .getincrementaldecoder ('cp949' )()
@@ -325,7 +348,7 @@ def test_setstate_validates_input(self):
325348 self .assertRaises (TypeError , decoder .setstate , 123 )
326349 self .assertRaises (TypeError , decoder .setstate , ("invalid" , 0 ))
327350 self .assertRaises (TypeError , decoder .setstate , (b"1234" , "invalid" ))
328- self .assertRaises (UnicodeDecodeError , decoder .setstate , (b"123456789" , 0 ))
351+ self .assertRaises (UnicodeDecodeError , decoder .setstate , (b"0" * 17 , 0 ))
329352
330353 def test_setstate_invalid_designation (self ):
331354 # gh-153603: an unknown charset designation in the state must not crash
@@ -438,6 +461,42 @@ def test_incrementalencoder_final(self):
438461 self .assertEqual (output , self .expected_reset )
439462 self .assertEqual (encoder .encode ('' , final = True ), b'' )
440463
464+ def test_streamwriter_reset (self ):
465+ stream = io .BytesIO ()
466+ writer = codecs .getwriter (self .encoding )(stream )
467+ writer .reset ()
468+ self .assertEqual (stream .getvalue (), b'' )
469+ writer .write (self .text )
470+ self .assertEqual (stream .getvalue (), self .expected )
471+ writer .reset ()
472+ self .assertEqual (stream .getvalue (), self .expected_reset )
473+ writer .reset ()
474+ self .assertEqual (stream .getvalue (), self .expected_reset )
475+ writer .write (self .text )
476+ writer .reset ()
477+ self .assertEqual (stream .getvalue (), self .expected_reset * 2 )
478+
479+ def test_streamwriter_seek0 (self ):
480+ # The reset sequence is written before the stream is rewound.
481+ info = codecs .lookup (self .encoding )
482+ for wrap in (
483+ info .streamwriter ,
484+ lambda stream : codecs .StreamReaderWriter (
485+ stream , info .streamreader , info .streamwriter ),
486+ lambda stream : codecs .EncodedFile (stream , 'utf-8' , self .encoding ),
487+ ):
488+ stream = io .BytesIO ()
489+ writer = wrap (stream )
490+ text = self .text
491+ if isinstance (writer , codecs .StreamRecoder ):
492+ text = text .encode ()
493+ writer .write (text )
494+ writer .seek (0 )
495+ self .assertEqual (stream .tell (), 0 )
496+ self .assertEqual (stream .getvalue (), self .expected_reset )
497+ writer .write (text )
498+ self .assertEqual (stream .getvalue (), self .expected_reset )
499+
441500 def test_incrementalencoder_error (self ):
442501 # The output of a failed encode() is lost, so the shift state
443502 # must not be changed.
0 commit comments