in src/host/ut_host/TextBufferTests.cpp [2345:2591]
void TextBufferTests::GetText()
{
// GetText() is used by...
// - Copying text to the clipboard regularly
// - Copying text to the clipboard, with shift held (collapse to one line)
// - Extracting text from a UiaTextRange
BEGIN_TEST_METHOD_PROPERTIES()
TEST_METHOD_PROPERTY(L"Data:wrappedText", L"{false, true}")
TEST_METHOD_PROPERTY(L"Data:blockSelection", L"{false, true}")
TEST_METHOD_PROPERTY(L"Data:includeCRLF", L"{false, true}")
TEST_METHOD_PROPERTY(L"Data:trimTrailingWhitespace", L"{false, true}")
END_TEST_METHOD_PROPERTIES();
bool wrappedText;
bool blockSelection;
bool includeCRLF;
bool trimTrailingWhitespace;
VERIFY_SUCCEEDED(TestData::TryGetValue(L"wrappedText", wrappedText), L"Get 'wrappedText' variant");
VERIFY_SUCCEEDED(TestData::TryGetValue(L"blockSelection", blockSelection), L"Get 'blockSelection' variant");
VERIFY_SUCCEEDED(TestData::TryGetValue(L"includeCRLF", includeCRLF), L"Get 'includeCRLF' variant");
VERIFY_SUCCEEDED(TestData::TryGetValue(L"trimTrailingWhitespace", trimTrailingWhitespace), L"Get 'trimTrailingWhitespace' variant");
if (!wrappedText)
{
COORD bufferSize{ 10, 20 };
UINT cursorSize = 12;
TextAttribute attr{ 0x7f };
auto _buffer = std::make_unique<TextBuffer>(bufferSize, attr, cursorSize, _renderTarget);
// Setup: Write lines of text to the buffer
const std::vector<std::wstring> bufferText = { L"12345",
L" 345",
L"123 ",
L" 3 " };
WriteLinesToBuffer(bufferText, *_buffer);
// simulate a selection from origin to {4,4}
const auto textRects = _buffer->GetTextRects({ 0, 0 }, { 4, 4 }, blockSelection, false);
std::wstring result = L"";
const auto textData = _buffer->GetText(includeCRLF, trimTrailingWhitespace, textRects).text;
for (auto& text : textData)
{
result += text;
}
std::wstring expectedText = L"";
if (includeCRLF)
{
if (trimTrailingWhitespace)
{
Log::Comment(L"Standard Copy to Clipboard");
expectedText += L"12345\r\n";
expectedText += L" 345\r\n";
expectedText += L"123\r\n";
expectedText += L" 3\r\n";
}
else
{
Log::Comment(L"UI Automation");
if (blockSelection)
{
expectedText += L"12345\r\n";
expectedText += L" 345\r\n";
expectedText += L"123 \r\n";
expectedText += L" 3 \r\n";
expectedText += L" ";
}
else
{
expectedText += L"12345 \r\n";
expectedText += L" 345 \r\n";
expectedText += L"123 \r\n";
expectedText += L" 3 \r\n";
expectedText += L" ";
}
}
}
else
{
if (trimTrailingWhitespace)
{
Log::Comment(L"UNDEFINED");
expectedText += L"12345";
expectedText += L" 345";
expectedText += L"123";
expectedText += L" 3";
}
else
{
Log::Comment(L"Shift+Copy to Clipboard");
if (blockSelection)
{
expectedText += L"12345";
expectedText += L" 345";
expectedText += L"123 ";
expectedText += L" 3 ";
expectedText += L" ";
}
else
{
expectedText += L"12345 ";
expectedText += L" 345 ";
expectedText += L"123 ";
expectedText += L" 3 ";
expectedText += L" ";
}
}
}
// Verify expected output and actual output are the same
VERIFY_ARE_EQUAL(expectedText, result);
}
else
{
// Case 2: Wrapped Text
COORD bufferSize{ 5, 20 };
UINT cursorSize = 12;
TextAttribute attr{ 0x7f };
auto _buffer = std::make_unique<TextBuffer>(bufferSize, attr, cursorSize, _renderTarget);
// Setup: Write lines of text to the buffer
const std::vector<std::wstring> bufferText = { L"1234567",
L"",
L" 345",
L"123 ",
L"" };
WriteLinesToBuffer(bufferText, *_buffer);
// buffer should look like this:
// ______
// |12345| <-- wrapped
// |67 |
// | 345|
// |123 | <-- wrapped
// | |
// |_____|
// simulate a selection from origin to {4,5}
const auto textRects = _buffer->GetTextRects({ 0, 0 }, { 4, 5 }, blockSelection, false);
std::wstring result = L"";
const auto formatWrappedRows = blockSelection;
const auto textData = _buffer->GetText(includeCRLF, trimTrailingWhitespace, textRects, nullptr, formatWrappedRows).text;
for (auto& text : textData)
{
result += text;
}
std::wstring expectedText = L"";
if (formatWrappedRows)
{
if (includeCRLF)
{
if (trimTrailingWhitespace)
{
Log::Comment(L"UNDEFINED");
expectedText += L"12345\r\n";
expectedText += L"67\r\n";
expectedText += L" 345\r\n";
expectedText += L"123\r\n";
expectedText += L"\r\n";
}
else
{
Log::Comment(L"Copy block selection to Clipboard");
expectedText += L"12345\r\n";
expectedText += L"67 \r\n";
expectedText += L" 345\r\n";
expectedText += L"123 \r\n";
expectedText += L" \r\n";
expectedText += L" ";
}
}
else
{
if (trimTrailingWhitespace)
{
Log::Comment(L"UNDEFINED");
expectedText += L"12345";
expectedText += L"67";
expectedText += L" 345";
expectedText += L"123";
}
else
{
Log::Comment(L"UNDEFINED");
expectedText += L"12345";
expectedText += L"67 ";
expectedText += L" 345";
expectedText += L"123 ";
expectedText += L" ";
expectedText += L" ";
}
}
}
else
{
if (includeCRLF)
{
if (trimTrailingWhitespace)
{
Log::Comment(L"Standard Copy to Clipboard");
expectedText += L"12345";
expectedText += L"67\r\n";
expectedText += L" 345\r\n";
expectedText += L"123 \r\n";
}
else
{
Log::Comment(L"UI Automation");
expectedText += L"12345";
expectedText += L"67 \r\n";
expectedText += L" 345\r\n";
expectedText += L"123 ";
expectedText += L" \r\n";
expectedText += L" ";
}
}
else
{
if (trimTrailingWhitespace)
{
Log::Comment(L"UNDEFINED");
expectedText += L"12345";
expectedText += L"67";
expectedText += L" 345";
expectedText += L"123 ";
}
else
{
Log::Comment(L"Shift+Copy to Clipboard");
expectedText += L"12345";
expectedText += L"67 ";
expectedText += L" 345";
expectedText += L"123 ";
expectedText += L" ";
expectedText += L" ";
}
}
}
// Verify expected output and actual output are the same
VERIFY_ARE_EQUAL(expectedText, result);
}
}