Skip to content

Commit

Permalink
Update cursor adapter tests to account for the column offset being re…
Browse files Browse the repository at this point in the history
…lative to the buffer and not the viewport.
  • Loading branch information
j4james committed Dec 22, 2019
1 parent 9cf7a9b commit 49887a3
Showing 1 changed file with 34 additions and 31 deletions.
65 changes: 34 additions & 31 deletions src/terminal/adapter/ut_adapter/adapterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -741,16 +741,16 @@ class TestGetSet final : public ConGetSet
switch (xact)
{
case CursorX::LEFT:
Log::Comment(L"Cursor set to left edge of viewport.");
_cursorPos.X = _viewport.Left;
Log::Comment(L"Cursor set to left edge of buffer.");
_cursorPos.X = 0;
break;
case CursorX::RIGHT:
Log::Comment(L"Cursor set to right edge of viewport.");
_cursorPos.X = _viewport.Right - 1;
Log::Comment(L"Cursor set to right edge of buffer.");
_cursorPos.X = _bufferSize.X - 1;
break;
case CursorX::XCENTER:
Log::Comment(L"Cursor set to centered X of viewport.");
_cursorPos.X = _viewport.Left + ((_viewport.Right - _viewport.Left) / 2);
Log::Comment(L"Cursor set to centered X of buffer.");
_cursorPos.X = _bufferSize.X / 2;
break;
}

Expand Down Expand Up @@ -1044,7 +1044,7 @@ class AdapterTest

if (fDoTest1b)
{
_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left;
_testGetSet->_expectedCursorPos.X = 0;
VERIFY_IS_TRUE((_pDispatch.get()->*(moveFunc))(1));
}
else
Expand Down Expand Up @@ -1072,11 +1072,11 @@ class AdapterTest
break;
case CursorDirection::NEXTLINE:
_testGetSet->_expectedCursorPos.Y++;
_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left;
_testGetSet->_expectedCursorPos.X = 0;
break;
case CursorDirection::PREVLINE:
_testGetSet->_expectedCursorPos.Y--;
_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left;
_testGetSet->_expectedCursorPos.X = 0;
break;
}

Expand All @@ -1097,17 +1097,17 @@ class AdapterTest
_testGetSet->_expectedCursorPos.Y = _testGetSet->_viewport.Bottom - 1;
break;
case CursorDirection::RIGHT:
_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Right - 1;
_testGetSet->_expectedCursorPos.X = _testGetSet->_bufferSize.X - 1;
break;
case CursorDirection::LEFT:
_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left;
_testGetSet->_expectedCursorPos.X = 0;
break;
case CursorDirection::NEXTLINE:
_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left;
_testGetSet->_expectedCursorPos.X = 0;
_testGetSet->_expectedCursorPos.Y = _testGetSet->_viewport.Bottom - 1;
break;
case CursorDirection::PREVLINE:
_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left;
_testGetSet->_expectedCursorPos.X = 0;
_testGetSet->_expectedCursorPos.Y = _testGetSet->_viewport.Top;
break;
}
Expand Down Expand Up @@ -1184,26 +1184,28 @@ class AdapterTest
short sCol = (_testGetSet->_viewport.Right - _testGetSet->_viewport.Left) / 2;
short sRow = (_testGetSet->_viewport.Bottom - _testGetSet->_viewport.Top) / 2;

_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left + (sCol - 1);
// The X coordinate is unaffected by the viewport.
_testGetSet->_expectedCursorPos.X = sCol - 1;
_testGetSet->_expectedCursorPos.Y = _testGetSet->_viewport.Top + (sRow - 1);

VERIFY_IS_TRUE(_pDispatch.get()->CursorPosition(sRow, sCol));

Log::Comment(L"Test 2: Move to 0, 0 (which is 1,1 in VT speak)");
_testGetSet->PrepData(CursorX::RIGHT, CursorY::BOTTOM);

_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Left;
// The X coordinate is unaffected by the viewport.
_testGetSet->_expectedCursorPos.X = 0;
_testGetSet->_expectedCursorPos.Y = _testGetSet->_viewport.Top;

VERIFY_IS_TRUE(_pDispatch.get()->CursorPosition(1, 1));

Log::Comment(L"Test 3: Move beyond rectangle (down/right too far). Should be bounded back in.");
_testGetSet->PrepData(CursorX::LEFT, CursorY::TOP);

sCol = (_testGetSet->_viewport.Right - _testGetSet->_viewport.Left) * 2;
sCol = (_testGetSet->_bufferSize.X) * 2;
sRow = (_testGetSet->_viewport.Bottom - _testGetSet->_viewport.Top) * 2;

_testGetSet->_expectedCursorPos.X = _testGetSet->_viewport.Right - 1;
_testGetSet->_expectedCursorPos.X = _testGetSet->_bufferSize.X - 1;
_testGetSet->_expectedCursorPos.Y = _testGetSet->_viewport.Bottom - 1;

VERIFY_IS_TRUE(_pDispatch.get()->CursorPosition(sRow, sCol));
Expand Down Expand Up @@ -1252,35 +1254,36 @@ class AdapterTest
//// Used to switch between the various function options.
typedef bool (AdaptDispatch::*CursorMoveFunc)(size_t);
CursorMoveFunc moveFunc = nullptr;
SHORT* psViewportEnd = nullptr;
SHORT* psViewportStart = nullptr;
SHORT sRangeEnd = 0;
SHORT sRangeStart = 0;
SHORT* psCursorExpected = nullptr;

// Modify variables based on directionality of this test
AbsolutePosition direction;
size_t dir;
VERIFY_SUCCEEDED_RETURN(TestData::TryGetValue(L"uiDirection", dir));
direction = (AbsolutePosition)dir;
_testGetSet->PrepData();

switch (direction)
{
case AbsolutePosition::CursorHorizontal:
Log::Comment(L"Testing cursor horizontal movement.");
psViewportEnd = &_testGetSet->_viewport.Right;
psViewportStart = &_testGetSet->_viewport.Left;
sRangeEnd = _testGetSet->_bufferSize.X;
sRangeStart = 0;
psCursorExpected = &_testGetSet->_expectedCursorPos.X;
moveFunc = &AdaptDispatch::CursorHorizontalPositionAbsolute;
break;
case AbsolutePosition::VerticalLine:
Log::Comment(L"Testing vertical line movement.");
psViewportEnd = &_testGetSet->_viewport.Bottom;
psViewportStart = &_testGetSet->_viewport.Top;
sRangeEnd = _testGetSet->_viewport.Bottom;
sRangeStart = _testGetSet->_viewport.Top;
psCursorExpected = &_testGetSet->_expectedCursorPos.Y;
moveFunc = &AdaptDispatch::VerticalLinePositionAbsolute;
break;
}

if (moveFunc == nullptr || psViewportEnd == nullptr || psViewportStart == nullptr || psCursorExpected == nullptr)
if (moveFunc == nullptr || psCursorExpected == nullptr)
{
VERIFY_FAIL();
return;
Expand All @@ -1289,26 +1292,26 @@ class AdapterTest
Log::Comment(L"Test 1: Place cursor within the viewport. Start from top left, move to middle.");
_testGetSet->PrepData(CursorX::LEFT, CursorY::TOP);

short sVal = (*psViewportEnd - *psViewportStart) / 2;
short sVal = (sRangeEnd - sRangeStart) / 2;

*psCursorExpected = *psViewportStart + (sVal - 1);
*psCursorExpected = sRangeStart + (sVal - 1);

VERIFY_IS_TRUE((_pDispatch.get()->*(moveFunc))(sVal));

Log::Comment(L"Test 2: Move to 0 (which is 1 in VT speak)");
_testGetSet->PrepData(CursorX::RIGHT, CursorY::BOTTOM);

*psCursorExpected = *psViewportStart;
*psCursorExpected = sRangeStart;
sVal = 1;

VERIFY_IS_TRUE((_pDispatch.get()->*(moveFunc))(sVal));

Log::Comment(L"Test 3: Move beyond rectangle (down/right too far). Should be bounded back in.");
_testGetSet->PrepData(CursorX::LEFT, CursorY::TOP);

sVal = (*psViewportEnd - *psViewportStart) * 2;
sVal = (sRangeEnd - sRangeStart) * 2;

*psCursorExpected = *psViewportEnd - 1;
*psCursorExpected = sRangeEnd - 1;

VERIFY_IS_TRUE((_pDispatch.get()->*(moveFunc))(sVal));

Expand Down Expand Up @@ -1876,8 +1879,7 @@ class AdapterTest
// start with the cursor position in the buffer.
COORD coordCursorExpected = _testGetSet->_cursorPos;

// to get to VT, we have to adjust it to its position relative to the viewport.
coordCursorExpected.X -= _testGetSet->_viewport.Left;
// to get to VT, we have to adjust it to its position relative to the viewport top.
coordCursorExpected.Y -= _testGetSet->_viewport.Top;

// Then note that VT is 1,1 based for the top left, so add 1. (The rest of the console uses 0,0 for array index bases.)
Expand Down Expand Up @@ -1975,6 +1977,7 @@ class AdapterTest
Log::Comment(L"Starting test...");

SMALL_RECT srTestMargins = { 0 };
_testGetSet->_bufferSize = { 100, 600 };
_testGetSet->_viewport.Right = 8;
_testGetSet->_viewport.Bottom = 8;
_testGetSet->_getConsoleScreenBufferInfoExResult = TRUE;
Expand Down

0 comments on commit 49887a3

Please sign in to comment.