//////////////////////////////////////////////////////////////////////////////// // // Assert // #include <sstream> #include <kcpp_assert.hpp> #undef assertEquals #undef assertTrue #undef assertFalse #undef assertNull #undef assertNotNull #undef fail namespace kcpp { /** * 最後に発生したエラーメッセージを持つ AssertError を構築します。 * エラーメッセージを取得できない場合、空文字がメッセージに設定されます。 */ AssertError::AssertError() noexcept : Error(), errorFile(""), errorFunc(""), errorLine(0) { // NOP } /** * コピーコンストラクタ。 * * @param t コピー元 */ AssertError::AssertError(const AssertError& t) noexcept : Error(t), errorFile(t.errorFile), errorFunc(t.errorFunc), errorLine(t.errorLine) { // NOP } /** * 指定されたメッセージを持つ AssertError を構築します。 * * @param msg メッセージ */ AssertError::AssertError(const std::string& msg) noexcept : Error(msg), errorFile(""), errorFunc(""), errorLine(0) { // NOP } /** * 指定されたメッセージを持つ AssertError を構築します。 * * @param msg メッセージ * @param file エラー発生ファイル名 * @param func エラー発生関数名 * @param line エラー発生行番号 */ AssertError::AssertError(const std::string& msg, const char* file, const char* func, int line) noexcept : Error(msg), errorFile(file), errorFunc(func), errorLine(line) { // NOP } /** * デストラクタ。 */ AssertError::~AssertError() noexcept { // NOP } /** * エラー発生ファイル名を返します。 * * @return エラー発生ファイル名 */ const std::string& AssertError::getFile() const noexcept { return errorFile; } /** * エラー発生関数名を返します。 * * @return エラー発生関数名 */ const std::string& AssertError::getFunc() const noexcept { return errorFunc; } /** * エラー発生行番号を返します。 * * @return エラー発生行番号 */ int AssertError::getLine() const noexcept { return errorLine; } namespace Assert { /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(bool expected, bool actual, const char* file, const char* func, int line) { if (expected != actual) { const char* msg = (expected) ? "expected:<true> but was:<false>" : "expected:<false> but was:<true>"; throw AssertError(msg, file, func, line); } } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(char expected, char actual, const char* file, const char* func, int line) { if (expected != actual) { std::ostringstream msg; msg << "expected:<" << expected << "> but was:<" << actual << ">"; throw AssertError(msg.str(), file, func, line); } } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(int expected, int actual, const char* file, const char* func, int line) { if (expected != actual) { std::ostringstream msg; msg << "expected:<" << expected << "> but was:<" << actual << ">"; throw AssertError(msg.str(), file, func, line); } } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(long expected, long actual, const char* file, const char* func, int line) { if (expected != actual) { std::ostringstream msg; msg << "expected:<" << expected << "> but was:<" << actual << ">"; throw AssertError(msg.str(), file, func, line); } } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(double expected, double actual, const char* file, const char* func, int line) { if (expected != actual) { std::ostringstream msg; msg << "expected:<" << expected << "> but was:<" << actual << ">"; throw AssertError(msg.str(), file, func, line); } } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(const std::string& expected, const std::string& actual, const char* file, const char* func, int line) { if (expected != actual) { std::ostringstream msg; msg << "expected:<" << expected << "> but was:<" << actual << ">"; throw AssertError(msg.str(), file, func, line); } } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(const char* expected, const std::string& actual, const char* file, const char* func, int line) { std::string expectedStr = expected; assertEquals(expectedStr, actual, file, func, line); } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(const std::string& expected, const char* actual, const char* file, const char* func, int line) { std::string actualStr = actual; assertEquals(expected, actualStr, file, func, line); } /** * 値を比較します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param expected 期待する値 * @param actual 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertEquals(const char* expected, const char* actual, const char* file, const char* func, int line) { std::string expectedStr = expected; std::string actualStr = actual; assertEquals(expectedStr, actualStr, file, func, line); } /** * 指定された condition が、true でない場合、AssertError を throw します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param condition 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertTrue(bool condition, const char* file, const char* func, int line) { assertEquals(true, condition, file, func, line); } /** * 指定された condition が、false でない場合、AssertError を throw します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param condition 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertFalse(bool condition, const char* file, const char* func, int line) { assertEquals(false, condition, file, func, line); } /** * 指定された obj が、nullptr でない場合、AssertError を throw します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param condition 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertNull(void* obj, const char* file, const char* func, int line) { if (obj != nullptr) { throw AssertError("expected:<null> but was:<not null>", file, func, line); } } /** * 指定された obj が、nullptr の場合、AssertError を throw します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param condition 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void assertNotNull(void* obj, const char* file, const char* func, int line) { if (obj == nullptr) { throw AssertError("expected:<not null> but was:<not>", file, func, line); } } /** * 常に、AssertError を throw します。 * 通常、本メソッドを直接使用せず、assertEquals(expected, actual) マクロを使用してください。 * 指定された expected と actual が不一致の場合、AssertError を throw します。 * * @param condition 比較する値 * @param file ファイル名 * @param func 関数名 * @param line 行番号 */ void fail(const char* file, const char* func, int line) { throw AssertError("fail()", file, func, line); } } }