Newer
Older
c-interpreter / include / kcpp_unittest.hpp
Nomura Kei on 9 Aug 2023 3 KB UPDATE
////////////////////////////////////////////////////////////////////////////////
//
// KCPP UNITTEST Header File
//
#ifndef KCPP_UNITTEST_HPP
#define KCPP_UNITTEST_HPP

#include <vector>

#include <kcpp_assert.hpp>


namespace kcpp
{

	/**
	 * テストケース。
	 * 各テストクラスは、本クラスを継承して作成ください。
	 *
	 * 以下実装例
	 *
	 * @code
	 * #include <kcpp_unittest.hpp>
	 *
	 * using namespace kcpp;
	 * class SampleTest : public TestCase
	 * {
	 *    public:
	 *       SampleTest() {}
	 *       ~SampleTest() {}
	 *       void setUp()
	 *       {  // 各テストケース実行前に実施する内容を記載する。
	 *       }
	 *       void tearDown()
	 *       {  // 各テストケース実行後に実施する内容を記載する。
	 *       } 
	 *       void testSample1()
	 *       {	// テスト内容を記述する。
	 *          std::string tmp("ABC");
	 *          Asssert::assertEquals("ABC", tmp);
	 *       }
	 *       void testSample2()
	 *       {  // テスト内容を記述する。
	 *       }
	 *       void run()
	 *       {
	 *			RUN_TEST(testSample1, "sample1 test");
	 *			RUN_TEST(testSample2, "sample2 test");
	 *       }
	 * };
	 * @endcode
	 */
	class TestCase
	{
		public:
			TestCase();
			virtual ~TestCase();
			virtual void setUp();
			virtual void tearDown();
			virtual void run() = 0;
	};



	/**
	 * 単体試験を管理するクラス。
	 * 本クラスは、単体テストにて使用されます。
	 * 通常、本クラスのインスタンスを生成する必要はありません。
	 */
	class UnittestManager
	{
		public:
			UnittestManager();
			virtual ~UnittestManager();
			void addResult(const char* msg, const char* funcName,
				const char* file, int line, bool result, const AssertError* e = nullptr) noexcept;
			void printResult();
		private:
			int okCount;
			int ngCount;
	};


	// UnittestManager
	extern UnittestManager utManager;


	#define RUN_TEST(func, msg) {										            \
		setUp();                                                                    \
		try                                                                         \
		{                                                                           \
			func();                                                                 \
			kcpp::utManager.addResult(msg, #func, __FILE__, __LINE__, true);        \
		}                                                                           \
		catch (kcpp::AssertError& e)                                                \
		{                                                                           \
			kcpp::utManager.addResult(msg, #func, __FILE__, __LINE__, false, &e);   \
		}                                                                           \
		catch (...)                                                                 \
		{                                                                           \
			kcpp::utManager.addResult(msg, #func, __FILE__, __LINE__, false);       \
		}                                                                           \
		tearDown();                                                                 \
	}

}


#endif	// KCPP_UNITTEST_HPP