Newer
Older
c-interpreter / modules / libkcpp / src / kcpp_assert.cpp
Nomura Kei on 9 Aug 2023 4 KB UPDATE
////////////////////////////////////////////////////////////////////////////////
//
// Assert
//

#include <sstream>

#include <kcpp_assert.hpp>

#undef assertEquals
#undef assertTrue
#undef assertFalse
#undef assertNull
#undef assertNotNull
#undef fail

namespace kcpp
{

    AssertError::AssertError() noexcept : Error(), errorFile(""), errorFunc(""), errorLine(0)
    {
        // NOP
    }

    AssertError::AssertError(const AssertError& t) noexcept : Error(t), errorFile(t.errorFile), errorFunc(t.errorFunc), errorLine(t.errorLine)
    {
        // NOP
    }

    AssertError::AssertError(const std::string& msg) noexcept : Error(msg), errorFile(""), errorFunc(""), errorLine(0)
    {
        // NOP
    }

    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
    }

    const std::string& AssertError::getFile() const noexcept
    {
        return errorFile;
    }

    const std::string& AssertError::getFunc() const noexcept
    {
        return errorFunc;
    }

    int AssertError::getLine() const noexcept
    {
        return errorLine;
    }


    namespace Assert
    {
        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);
            }
        }

        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);
            }
        }

        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);
            }
        }

        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);
            }
        }

        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);
            }
        }

        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);
            }
        }

        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);
        }

        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);
        }

        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);
        }

        void assertTrue(bool condition, const char* file, const char* func, int line)
        {
			assertEquals(true, condition, file, func, line);
        }

        void assertFalse(bool condition, const char* file, const char* func, int line)
        {
			assertEquals(false, condition, file, func, 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);
			}
        }

        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);
			}
        }

        void fail(const char* file, const char* func, int line)
        {
			throw AssertError("fail()", file, func, line);
        }

    }

}