Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

139 lines
4.2 KiB
C++

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include "TestMain.h"
#include "TestCase.h"
template <typename T, typename U>
void AddVerifyBase(const char* types)
{
TestVector< T, U, OpType::Add > tests;
TestCase< T, U, OpType::Add > test = tests.GetNext();
while (!tests.Done())
{
T ret;
if (SafeAdd(test.x, test.y, ret) != test.fExpected)
{
std::string msg = std::string("Error in case ") + types + ": ";
err_msg(msg.c_str(), test.x, test.y, test.fExpected);
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<T> si(test.x);
si += test.y;
}
catch (...)
{
fSuccess = false;
}
if (fSuccess != test.fExpected)
{
std::string msg = std::string("Error in case ") + types + " throw (1): ";
err_msg(msg.c_str(), test.x, test.y, test.fExpected);
}
// Also need to test the version that assigns back out
// to a plain int, as it has different logic
fSuccess = true;
try
{
T x(test.x);
x += SafeInt<U>(test.y);
}
catch (...)
{
fSuccess = false;
}
if (fSuccess != test.fExpected)
{
std::string msg = std::string("Error in case ") + types + " throw (2): ";
err_msg(msg.c_str(), test.x, test.y, test.fExpected);
}
test = tests.GetNext();
}
}
namespace add_verify
{
void AddVerify()
{
std::cout << "Verifying Addition:" << std::endl;
// Unsigned int64, unsigned cases
AddVerifyBase<std::uint64_t, std::uint64_t>("uint64_uint64");
AddVerifyBase<std::uint64_t, std::uint32_t>("uint64_uint32");
AddVerifyBase<std::uint64_t, std::uint16_t>("uint64_uint16");
AddVerifyBase<std::uint64_t, std::uint8_t>("uint64_uint8");
// Unsigned int64, signed cases
AddVerifyBase<std::uint64_t, std::int64_t>("uint64_int64");
AddVerifyBase<std::uint64_t, std::int32_t>("uint64_int32");
AddVerifyBase<std::uint64_t, std::int16_t>("uint64_int16");
AddVerifyBase<std::uint64_t, std::int8_t>("uint64_int8");
// Signed int64, unsigned cases
AddVerifyBase<std::int64_t, std::uint64_t>("int64_uint64");
AddVerifyBase<std::int64_t, std::uint32_t>("int64_uint32");
AddVerifyBase<std::int64_t, std::uint16_t>("int64_uint16");
AddVerifyBase<std::int64_t, std::uint16_t>("int64_uint8");
// Signed int64, signed cases
AddVerifyBase<std::int64_t, std::int64_t>("int64_int64");
AddVerifyBase<std::int64_t, std::int32_t>("int64_int32");
AddVerifyBase<std::int64_t, std::int16_t>("int64_int16");
AddVerifyBase<std::int64_t, std::int8_t>("int64_int8");
// Unsigned int32, unsigned cases
AddVerifyBase<std::uint32_t, std::uint64_t>("uint32_uint64");
AddVerifyBase<std::uint32_t, std::uint32_t>("uint32_uint32");
// TBD - 16, 8-bit
// Unsigned int32, signed cases
AddVerifyBase<std::uint32_t, std::int64_t>("uint32_int64");
AddVerifyBase<std::uint32_t, std::int32_t>("uint32_int32");
// TBD - 16, 8-bit
// Signed int32, unsigned cases
AddVerifyBase<std::int32_t, std::uint64_t>("int32_uint64");
AddVerifyBase<std::int32_t, std::uint32_t>("int32_uint32");
// TBD - 16, 8-bit
// Signed int32, signed cases
AddVerifyBase<std::int32_t, std::int64_t>("int32_int64");
AddVerifyBase<std::int32_t, std::int32_t>("int32_int32");
// TBD - 16, 8-bit
// Unsigned int8, unsigned cases
AddVerifyBase<std::uint8_t, std::uint64_t>("uint8_t_uint64");
AddVerifyBase<std::uint8_t, std::uint32_t>("uint8_t_uint32");
AddVerifyBase<std::uint8_t, std::uint16_t>("uint8_t_uint16");
AddVerifyBase<std::uint8_t, std::uint8_t>("uint8_t_uint8");
// Unsigned int8, signed cases
AddVerifyBase<std::uint8_t, std::int64_t>("uint8_t_int64");
AddVerifyBase<std::uint8_t, std::int32_t>("uint8_t_int32");
AddVerifyBase<std::uint8_t, std::int16_t>("uint8_t_int16");
AddVerifyBase<std::uint8_t, std::int8_t>("uint8_t_int8");
// Signed int8, unsigned cases
AddVerifyBase<std::int8_t, std::uint64_t>("int8_t_uint64");
AddVerifyBase<std::int8_t, std::uint32_t>("int8_t_uint32");
AddVerifyBase<std::int8_t, std::uint16_t>("int8_t_uint16");
AddVerifyBase<std::int8_t, std::uint8_t>("int8_t_uint8");
// Signed int8, signed cases
AddVerifyBase<std::int8_t, std::int64_t>("int8_t_int64");
AddVerifyBase<std::int8_t, std::int32_t>("int8_t_int32");
AddVerifyBase<std::int8_t, std::int16_t>("int8_t_int16");
AddVerifyBase<std::int8_t, std::int8_t>("int8_t_int8");
}
}