From c6ef3299d07d9a87966cd28f58fb1c4e13584e46 Mon Sep 17 00:00:00 2001 From: KWSys Upstream Date: Tue, 28 May 2024 08:33:22 -0400 Subject: [PATCH] KWSys 2024-05-28 (0d6eac1f) Code extracted from: https://gitlab.kitware.com/utils/kwsys.git at commit 0d6eac1feb8615fe59e8f972d41d1eaa8bc9baf8 (master). Upstream Shortlog ----------------- Brad King (1): beaf1ca1 ConsoleBuf: Fix test case when running under Windows Terminal --- testConsoleBuf.cxx | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/testConsoleBuf.cxx b/testConsoleBuf.cxx index f9b826d215..64c61e2ff1 100644 --- a/testConsoleBuf.cxx +++ b/testConsoleBuf.cxx @@ -476,6 +476,22 @@ static int testFile() # define _WIN32_WINNT_VISTA 0x0600 # endif +static bool consoleIsConhost() +{ + wchar_t consoleClassNameBuf[64]; + int const consoleClassNameLen = GetClassNameW( + GetConsoleWindow(), &consoleClassNameBuf[0], sizeof(consoleClassNameBuf)); + // Windows Console Host: ConsoleWindowClass + // Windows Terminal / ConPTY: PseudoConsoleWindow (undocumented) + return (consoleClassNameLen > 0 && + wcscmp(consoleClassNameBuf, L"ConsoleWindowClass") == 0); +} + +static bool charIsNUL(wchar_t c) +{ + return c == 0; +} + static int testConsole() { int didFail = 1; @@ -691,7 +707,15 @@ static int testConsole() throw std::runtime_error("ReadConsoleOutputCharacter failed!"); } std::wstring wideTestString = kwsys::Encoding::ToWide(encodedTestString); - std::replace(wideTestString.begin(), wideTestString.end(), '\0', ' '); + if (consoleIsConhost()) { + // Windows Console Host converts NUL bytes to spaces. + std::replace(wideTestString.begin(), wideTestString.end(), '\0', ' '); + } else { + // Windows Terminal / ConPTY removes NUL bytes. + wideTestString.erase(std::remove_if(wideTestString.begin(), + wideTestString.end(), charIsNUL), + wideTestString.end()); + } std::wstring wideInputTestString = kwsys::Encoding::ToWide(encodedInputTestString); if (memcmp(outputBuffer, wideTestString.c_str(),