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

921 lines
21 KiB
C++

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include "TestMain.h"
#include "TestCase.h"
void DivVerifyUint64Uint64()
{
TestVector< std::uint64_t, std::uint64_t, OpType::Div > tests;
TestCase< std::uint64_t, std::uint64_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_uint64: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint64 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::uint64_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint64 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Uint32()
{
TestVector< std::uint64_t, std::uint32_t, OpType::Div > tests;
TestCase< std::uint64_t, std::uint32_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_uint32: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint32 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::uint32_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint32 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Uint16()
{
TestVector< std::uint64_t, std::uint16_t, OpType::Div > tests;
TestCase< std::uint64_t, std::uint16_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_uint16: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint16 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::uint16_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint16 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Uint8()
{
TestVector< std::uint64_t, std::uint8_t, OpType::Div > tests;
TestCase< std::uint64_t, std::uint8_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_uint8: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint8 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::uint8_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_uint8 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int64()
{
TestVector< std::uint64_t, std::int64_t, OpType::Div > tests;
TestCase< std::uint64_t, std::int64_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_int64: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int64 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::int64_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int64 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int64_2()
{
TestVector< std::int64_t, std::uint64_t, OpType::Div2 > tests;
TestCase< std::int64_t, std::uint64_t, OpType::Div2 > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int64_t> si(test.x);
SafeInt<std::int64_t> si2;
si2 = test.y / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_uint64_2 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int32()
{
TestVector< std::uint64_t, std::int32_t, OpType::Div > tests;
TestCase< std::uint64_t, std::int32_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_int64: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int32 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::int64_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int64 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int32_2()
{
TestVector< std::int32_t, std::uint64_t, OpType::Div2 > tests;
TestCase< std::int32_t, std::uint64_t, OpType::Div2 > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int32_t> si(test.x);
SafeInt<std::int32_t> si2;
si2 = test.y / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int32_uint64_2 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int16()
{
TestVector< std::uint64_t, std::int16_t, OpType::Div > tests;
TestCase< std::uint64_t, std::int16_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_int64: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int32 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::int64_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int16 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int16_2()
{
TestVector< std::int16_t, std::uint64_t, OpType::Div2 > tests;
TestCase< std::int16_t, std::uint64_t, OpType::Div2 > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int32_t> si(test.x);
SafeInt<std::int32_t> si2;
si2 = test.y / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int16_uint64_2 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int8()
{
TestVector< std::uint64_t, std::int8_t, OpType::Div > tests;
TestCase< std::uint64_t, std::int8_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::uint64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case uint64_int64: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int32 throw: ", 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
{
std::uint64_t x(test.x);
x /= SafeInt<std::int64_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case uint64_int8 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyUint64Int8_2()
{
TestVector< std::int8_t, std::uint64_t, OpType::Div2 > tests;
TestCase< std::int8_t, std::uint64_t, OpType::Div2 > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int32_t> si(test.x);
SafeInt<std::int32_t> si2;
si2 = test.y / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int8_uint64_2 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyInt64Int64()
{
TestVector< std::int64_t, std::int64_t, OpType::Div > tests;
TestCase< std::int64_t, std::int64_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::int64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case int64_int64: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_int64 throw: ", 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
{
std::int64_t x(test.x);
x /= SafeInt<std::int64_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_int64 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyInt64Int64_2()
{
TestVector< std::int64_t, std::int64_t, OpType::Div > tests;
TestCase< std::int64_t, std::int64_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int64_t> si(test.y);
SafeInt<std::int64_t> si2;
si2 = test.x / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_int64 throw: ", test.x, test.y, test.fExpected );
}
tests.GetNext();
}
}
void DivVerifyInt64Int32()
{
TestVector< std::int64_t, std::int32_t, OpType::Div > tests;
TestCase< std::int64_t, std::int32_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::int64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case int64_int32: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_int32 throw: ", 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
{
std::int64_t x(test.x);
x /= SafeInt<std::int32_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_int32 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyInt64Int32_2()
{
TestVector< std::int64_t, std::int32_t, OpType::Div2 > tests;
TestCase< std::int64_t, std::int32_t, OpType::Div2 > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int32_t> si(test.y);
SafeInt<std::int32_t> si2;
si2 = test.x / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_int32_2 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyInt64Uint64()
{
TestVector< std::int64_t, std::uint64_t, OpType::Div > tests;
TestCase< std::int64_t, std::uint64_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::int64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case int64_uint64: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_uint64 throw: ", 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
{
std::int64_t x(test.x);
x /= SafeInt<std::uint64_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_uint64 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyInt64Uint64_2()
{
TestVector< std::uint64_t, std::int64_t, OpType::Div2 > tests;
TestCase< std::uint64_t, std::int64_t, OpType::Div2 > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint64_t> si(test.x);
SafeInt<std::uint64_t> si2;
si2 = test.y / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_uint64_3 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyInt64Uint32()
{
TestVector< std::int64_t, std::uint32_t, OpType::Div > tests;
TestCase< std::int64_t, std::uint32_t, OpType::Div > test = tests.GetNext();
while (!tests.Done())
{
std::int64_t ret;
if( SafeDivide(test.x, test.y, ret) != test.fExpected )
{
//assert(false);
err_msg( "Error in case int64_uint32: ", test.x, test.y, test.fExpected );
}
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::int64_t> si(test.x);
si /= test.y;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_uint32 throw: ", 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
{
std::int64_t x(test.x);
x /= SafeInt<std::uint32_t>(test.y);
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_uint32 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
void DivVerifyInt64Uint32_2()
{
TestVector< std::int64_t, std::uint32_t, OpType::Div2 > tests;
TestCase< std::int64_t, std::uint32_t, OpType::Div2 > test = tests.GetNext();
while (!tests.Done())
{
// Now test throwing version
bool fSuccess = true;
try
{
SafeInt<std::uint32_t> si(test.y);
SafeInt<std::uint32_t> si2;
si2 = test.x / si;
}
catch(...)
{
fSuccess = false;
}
if( fSuccess != test.fExpected )
{
err_msg( "Error in case int64_uint32_2 throw: ", test.x, test.y, test.fExpected );
}
test = tests.GetNext();
}
}
namespace div_verify
{
void DivVerify()
{
std::cout << "Verifying Division:" << std::endl;
// Unsigned int64, unsigned cases
DivVerifyUint64Uint64();
DivVerifyUint64Uint32();
DivVerifyUint64Uint16();
DivVerifyUint64Uint8();
// Unsigned int64, signed cases
DivVerifyUint64Int64();
DivVerifyUint64Int64_2();
DivVerifyUint64Int32();
DivVerifyUint64Int32_2();
DivVerifyUint64Int16();
DivVerifyUint64Int16_2();
DivVerifyUint64Int8();
DivVerifyUint64Int8_2();
// int64, signed
DivVerifyInt64Int64();
DivVerifyInt64Int64_2();
DivVerifyInt64Int32();
DivVerifyInt64Int32_2();
// 16 and 8-bit cases do not go down
// any individual paths
// int64, unsigned
DivVerifyInt64Uint64();
DivVerifyInt64Uint64_2();
DivVerifyInt64Uint32();
DivVerifyInt64Uint32_2();
}
} //end namespace