Newer
Older
c-interpreter / modules / libkcpp / src / kcpp_assert.cpp
////////////////////////////////////////////////////////////////////////////////
//
// 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);
        }

    }

}