// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #include "TestMain.h" #include "TestCase.h" template 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 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(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("uint64_uint64"); AddVerifyBase("uint64_uint32"); AddVerifyBase("uint64_uint16"); AddVerifyBase("uint64_uint8"); // Unsigned int64, signed cases AddVerifyBase("uint64_int64"); AddVerifyBase("uint64_int32"); AddVerifyBase("uint64_int16"); AddVerifyBase("uint64_int8"); // Signed int64, unsigned cases AddVerifyBase("int64_uint64"); AddVerifyBase("int64_uint32"); AddVerifyBase("int64_uint16"); AddVerifyBase("int64_uint8"); // Signed int64, signed cases AddVerifyBase("int64_int64"); AddVerifyBase("int64_int32"); AddVerifyBase("int64_int16"); AddVerifyBase("int64_int8"); // Unsigned int32, unsigned cases AddVerifyBase("uint32_uint64"); AddVerifyBase("uint32_uint32"); // TBD - 16, 8-bit // Unsigned int32, signed cases AddVerifyBase("uint32_int64"); AddVerifyBase("uint32_int32"); // TBD - 16, 8-bit // Signed int32, unsigned cases AddVerifyBase("int32_uint64"); AddVerifyBase("int32_uint32"); // TBD - 16, 8-bit // Signed int32, signed cases AddVerifyBase("int32_int64"); AddVerifyBase("int32_int32"); // TBD - 16, 8-bit // Unsigned int8, unsigned cases AddVerifyBase("uint8_t_uint64"); AddVerifyBase("uint8_t_uint32"); AddVerifyBase("uint8_t_uint16"); AddVerifyBase("uint8_t_uint8"); // Unsigned int8, signed cases AddVerifyBase("uint8_t_int64"); AddVerifyBase("uint8_t_int32"); AddVerifyBase("uint8_t_int16"); AddVerifyBase("uint8_t_int8"); // Signed int8, unsigned cases AddVerifyBase("int8_t_uint64"); AddVerifyBase("int8_t_uint32"); AddVerifyBase("int8_t_uint16"); AddVerifyBase("int8_t_uint8"); // Signed int8, signed cases AddVerifyBase("int8_t_int64"); AddVerifyBase("int8_t_int32"); AddVerifyBase("int8_t_int16"); AddVerifyBase("int8_t_int8"); } }