terminal/src/host/ft_host/API_CursorTests.cpp

160 lines
6.3 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "precomp.h"
// This class is intended to test:
// GetConsoleCursorInfo
// SetConsoleCursorInfo
// SetConsoleCursorPosition
class CursorTests
{
BEGIN_TEST_CLASS(CursorTests)
END_TEST_CLASS()
TEST_METHOD_SETUP(TestSetup);
TEST_METHOD_CLEANUP(TestCleanup);
BEGIN_TEST_METHOD(TestGetSetConsoleCursorInfo)
// 0, max, boundaries, and a value in the middle
TEST_METHOD_PROPERTY(L"Data:dwSize", L"{0, 1, 50, 100, 101, 0xFFFFFFFF}")
// Both possible values
TEST_METHOD_PROPERTY(L"Data:bVisible", L"{TRUE, FALSE}")
END_TEST_METHOD()
BEGIN_TEST_METHOD(TestSetConsoleCursorPosition)
TEST_METHOD_PROPERTY(L"HostDestructive", L"True")
END_TEST_METHOD()
};
bool CursorTests::TestSetup()
{
return Common::TestBufferSetup();
}
bool CursorTests::TestCleanup()
{
return Common::TestBufferCleanup();
}
void CursorTests::TestGetSetConsoleCursorInfo()
{
using namespace WEX::TestExecution;
DWORD dwSize;
bool bVisible;
VERIFY_SUCCEEDED_RETURN(TestData::TryGetValue(L"dwSize", dwSize), L"Get size parameter");
VERIFY_SUCCEEDED_RETURN(TestData::TryGetValue(L"bVisible", bVisible), L"Get visibility parameter");
// Get initial state of the cursor
CONSOLE_CURSOR_INFO cciInitial = { 0 };
BOOL bResult = GetConsoleCursorInfo(Common::_hConsole, &cciInitial);
VERIFY_WIN32_BOOL_SUCCEEDED(bResult, L"Retrieve initial cursor state.");
// Fill a structure with the value under test
CONSOLE_CURSOR_INFO cciTest = { 0 };
cciTest.bVisible = bVisible;
cciTest.dwSize = dwSize;
// If the cursor size is out of range, we expect a failure on set
BOOL fExpectedResult = TRUE;
if (cciTest.dwSize < 1 || cciTest.dwSize > 100)
{
fExpectedResult = FALSE;
}
// Attempt to set and verify that we get the expected result
bResult = SetConsoleCursorInfo(Common::_hConsole, &cciTest);
VERIFY_ARE_EQUAL(bResult, fExpectedResult, L"Ensure that return matches success/failure state we were expecting.");
// Get the state of the cursor again
CONSOLE_CURSOR_INFO cciReturned = { 0 };
bResult = GetConsoleCursorInfo(Common::_hConsole, &cciReturned);
VERIFY_WIN32_BOOL_SUCCEEDED(bResult, L"GET back the cursor information we just set.");
if (fExpectedResult)
{
// If we expected the set to be successful, the returned structure should match the test one
VERIFY_ARE_EQUAL(cciReturned, cciTest, L"If we expected SET success, the values we set should match what we retrieved.");
}
else
{
// If we expected the set to fail, the returned structure should match the initial one
VERIFY_ARE_EQUAL(cciReturned, cciInitial, L"If we expected SET failure, the initial values before the SET should match what we retrieved.");
}
}
void TestSetConsoleCursorPositionImpl(WORD wCursorX, WORD wCursorY, BOOL bExpectedResult)
{
COORD coordCursor;
coordCursor.X = wCursorX;
coordCursor.Y = wCursorY;
// Get initial position data
CONSOLE_SCREEN_BUFFER_INFOEX sbiInitial = { 0 };
sbiInitial.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
BOOL bResult = GetConsoleScreenBufferInfoEx(Common::_hConsole, &sbiInitial);
VERIFY_WIN32_BOOL_SUCCEEDED(bResult, L"Get the initial buffer data.");
// Attempt to set cursor into valid area
bResult = SetConsoleCursorPosition(Common::_hConsole, coordCursor);
VERIFY_ARE_EQUAL(bResult, bExpectedResult, L"Ensure that return from SET matches success/failure state we were expecting.");
CONSOLE_SCREEN_BUFFER_INFOEX sbiTest = { 0 };
sbiTest.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
bResult = GetConsoleScreenBufferInfoEx(Common::_hConsole, &sbiTest);
VERIFY_WIN32_BOOL_SUCCEEDED(bResult, L"GET the values back to ensure they were set properly.");
// Cursor is where it was set to if we were supposed to be successful
if (bExpectedResult)
{
VERIFY_ARE_EQUAL(coordCursor, sbiTest.dwCursorPosition, L"If SET was TRUE, we expect the cursor to be where we SET it.");
}
else
{
// otherwise, it's at where it was before
VERIFY_ARE_EQUAL(sbiInitial.dwCursorPosition, sbiTest.dwCursorPosition, L"If SET was FALSE, we expect the cursor to not have moved.");
}
// Verify the viewport.
bool fViewportMoveExpected = false;
// If we expected the cursor to be set successfully, the viewport might have moved.
if (bExpectedResult)
{
// If the position we set was outside the initial rectangle, then the viewport should have moved.
if (coordCursor.X > sbiInitial.srWindow.Right ||
coordCursor.X < sbiInitial.srWindow.Left ||
coordCursor.Y > sbiInitial.srWindow.Bottom ||
coordCursor.Y < sbiInitial.srWindow.Top)
{
fViewportMoveExpected = true;
}
}
if (fViewportMoveExpected)
{
// Something had to have changed in the viewport
VERIFY_ARE_NOT_EQUAL(sbiInitial.srWindow, sbiTest.srWindow, L"The viewports must have changed if we set the cursor outside the current area.");
}
else
{
VERIFY_ARE_EQUAL(sbiInitial.srWindow, sbiTest.srWindow, L"The viewports must remain the same if the cursor was set inside the existing one.");
}
}
void CursorTests::TestSetConsoleCursorPosition()
{
// Get initial buffer value for boundaries
CONSOLE_SCREEN_BUFFER_INFOEX sbiInitial = { 0 };
sbiInitial.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
BOOL bResult = GetConsoleScreenBufferInfoEx(Common::_hConsole, &sbiInitial);
VERIFY_WIN32_BOOL_SUCCEEDED(bResult, L"Retrieve the initial buffer information to calculate the boundaries for testing.");
// Try several cases
TestSetConsoleCursorPositionImpl(0, 0, TRUE); // Top left corner of buffer
TestSetConsoleCursorPositionImpl(sbiInitial.dwSize.X - 1, sbiInitial.dwSize.Y - 1, TRUE); // Bottom right corner of buffer
TestSetConsoleCursorPositionImpl(sbiInitial.dwSize.X, sbiInitial.dwSize.Y, FALSE); // 1 beyond bottom right corner (the size is 1 larger than the array indices)
TestSetConsoleCursorPositionImpl(MAXWORD, MAXWORD, FALSE); // Max values
}