// 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 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(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 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(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 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(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 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(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 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(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 si(test.x); SafeInt 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 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(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 si(test.x); SafeInt 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 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(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 si(test.x); SafeInt 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 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(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 si(test.x); SafeInt 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 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(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 si(test.y); SafeInt 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 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(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 si(test.y); SafeInt 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 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(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 si(test.x); SafeInt 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 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(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 si(test.y); SafeInt 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