139 lines
4.2 KiB
C++
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");
|
|
}
|
|
|
|
} |