From b96f16bac595dedca94ac02fefa9d83ea7839964 Mon Sep 17 00:00:00 2001 From: Casey Brooks Date: Thu, 25 Dec 2025 21:14:23 +0000 Subject: [PATCH] fix(capture): preserve carriage returns in capfd --- src/_pytest/capture.py | 1 + testing/test_capture_capfd_cr.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 testing/test_capture_capfd_cr.py diff --git a/src/_pytest/capture.py b/src/_pytest/capture.py index 3f9c60fb9a0..f538b67eceb 100644 --- a/src/_pytest/capture.py +++ b/src/_pytest/capture.py @@ -388,6 +388,7 @@ def __init__(self, targetfd: int) -> None: TemporaryFile(buffering=0), # type: ignore[arg-type] encoding="utf-8", errors="replace", + newline="", write_through=True, ) if targetfd in patchsysdict: diff --git a/testing/test_capture_capfd_cr.py b/testing/test_capture_capfd_cr.py new file mode 100644 index 00000000000..d922079fb91 --- /dev/null +++ b/testing/test_capture_capfd_cr.py @@ -0,0 +1,19 @@ +import sys + + +def test_capfd_includes_carriage_return(capfd): + print("Greetings from DOS", end="\r") + out, err = capfd.readouterr() + assert out.endswith("\r") + + +def test_capfd_preserves_crlf(capfd): + print("X\r\nY", end="", flush=True) + out, err = capfd.readouterr() + assert "\r\n" in out + + +def test_capfd_stderr_includes_carriage_return(capfd): + print("Greetings from stderr", end="\r", file=sys.stderr) + out, err = capfd.readouterr() + assert err.endswith("\r")