mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Fix Unicode StringIO overwrites and cache character positions (#9150)
Assisted-by: Codex:gpt-6
This commit is contained in:
1 parent
8e5709e797
commit
dcad0988e7
2 files changed
+141
-60
No files matched your search
@@ -3,6 +3,39 @@ from io import BufferedReader, BytesIO, FileIO, RawIOBase, StringIO, TextIOWrapp
|
||||
|
||||
from testutils import assert_raises
|
||||
|
||||
# Overwriting replaces characters, even when their encoded widths differ.
|
||||
for initial, replacement in (
|
||||
("abc", "é"),
|
||||
("ébc", "a"),
|
||||
("а😀в", "XY"),
|
||||
("a\ud800c", "\udfffé"),
|
||||
):
|
||||
stream = StringIO("prefix:" + initial)
|
||||
stream.seek(7)
|
||||
assert stream.write(replacement) == len(replacement)
|
||||
assert stream.getvalue() == "prefix:" + replacement + initial[len(replacement) :]
|
||||
assert stream.tell() == 7 + len(replacement)
|
||||
assert stream.read() == initial[len(replacement) :]
|
||||
assert stream.tell() == 7 + len(initial)
|
||||
|
||||
# Truncation keeps the character position, then pads in characters on writing.
|
||||
stream = StringIO("é😀abc")
|
||||
stream.seek(4)
|
||||
stream.truncate(1)
|
||||
assert stream.tell() == 4
|
||||
assert stream.read() == ""
|
||||
assert stream.tell() == 4
|
||||
assert stream.write("") == 0
|
||||
assert stream.getvalue() == "é"
|
||||
state = stream.__getstate__()
|
||||
stream = StringIO()
|
||||
stream.__setstate__(state)
|
||||
assert stream.tell() == 4
|
||||
stream.write("Ж")
|
||||
assert stream.getvalue() == "é\0\0\0Ж"
|
||||
assert stream.tell() == 5
|
||||
|
||||
|
||||
fi = FileIO("README.md")
|
||||
assert fi.seekable()
|
||||
bb = BufferedReader(fi)
|
||||
|
||||
Reference in new issue
Block a user