921 lines
21 KiB
C++
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
|