terminal/src/host/ut_host/UtilsTests.cpp

161 lines
4.9 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "precomp.h"
#include "WexTestClass.h"
#include "../../inc/consoletaeftemplates.hpp"
#include "CommonState.hpp"
#include "globals.h"
#include <ctime>
#include "utils.hpp"
#include "../interactivity/inc/ServiceLocator.hpp"
using namespace WEX::Common;
using namespace WEX::Logging;
using namespace WEX::TestExecution;
class UtilsTests
{
TEST_CLASS(UtilsTests);
CommonState* m_state;
TEST_CLASS_SETUP(ClassSetup)
{
m_state = new CommonState();
m_state->PrepareGlobalFont();
m_state->PrepareGlobalScreenBuffer();
UINT const seed = (UINT)time(nullptr);
Log::Comment(String().Format(L"Setting random seed to : %d", seed));
srand(seed);
return true;
}
TEST_CLASS_CLEANUP(ClassCleanup)
{
m_state->CleanupGlobalScreenBuffer();
m_state->CleanupGlobalFont();
delete m_state;
return true;
}
SHORT RandomShort()
{
SHORT s;
do
{
s = (SHORT)rand() % SHORT_MAX;
} while (s == 0i16);
return s;
}
void FillBothCoordsSameRandom(COORD* pcoordA, COORD* pcoordB)
{
pcoordA->X = pcoordB->X = RandomShort();
pcoordA->Y = pcoordB->Y = RandomShort();
}
void LogCoordinates(const COORD coordA, const COORD coordB)
{
Log::Comment(String().Format(L"Coordinates - A: (%d, %d) B: (%d, %d)", coordA.X, coordA.Y, coordB.X, coordB.Y));
}
void SubtractRandom(short& psValue)
{
SHORT const sRand = RandomShort();
psValue -= gsl::narrow<SHORT>(std::max(sRand % psValue, 1));
}
TEST_METHOD(TestCompareCoords)
{
int result = 5; // not 1, 0, or -1
COORD coordA;
COORD coordB;
// Set the buffer size to be able to accommodate large values.
COORD coordMaxBuffer;
coordMaxBuffer.X = SHORT_MAX;
coordMaxBuffer.Y = SHORT_MAX;
Log::Comment(L"#1: 0 case. Coords equal");
FillBothCoordsSameRandom(&coordA, &coordB);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_ARE_EQUAL(result, 0);
Log::Comment(L"#2: -1 case. A comes before B");
Log::Comment(L"A. A left of B, same line");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordA.X);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_LESS_THAN(result, 0);
Log::Comment(L"B. A above B, same column");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordA.Y);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_LESS_THAN(result, 0);
Log::Comment(L"C. A up and to the left of B.");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordA.Y);
SubtractRandom(coordA.X);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_LESS_THAN(result, 0);
Log::Comment(L"D. A up and to the right of B.");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordA.Y);
SubtractRandom(coordB.X);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_LESS_THAN(result, 0);
Log::Comment(L"#3: 1 case. A comes after B");
Log::Comment(L"A. A right of B, same line");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordB.X);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_GREATER_THAN(result, 0);
Log::Comment(L"B. A below B, same column");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordB.Y);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_GREATER_THAN(result, 0);
Log::Comment(L"C. A down and to the left of B");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordB.Y);
SubtractRandom(coordA.X);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_GREATER_THAN(result, 0);
Log::Comment(L"D. A down and to the right of B");
FillBothCoordsSameRandom(&coordA, &coordB);
SubtractRandom(coordB.Y);
SubtractRandom(coordB.X);
LogCoordinates(coordA, coordB);
result = Utils::s_CompareCoords(coordMaxBuffer, coordA, coordB);
VERIFY_IS_GREATER_THAN(result, 0);
}
};