Newer
Older
snipet / project / trunk / include / sc / scpp_unittest.hpp
/* =============================================================================
 *  scpp_exception.hpp
 *  Copyright (c) 2003 - 2013  Nomura Kei
 * =============================================================================
 */
#ifndef SCPP_UNITTEST_HPP
#define SCPP_UNITTEST_HPP
#ifdef __cplusplus

#ifndef SCPP_ASSERT_HPP
#include <scpp_assert.hpp>
#endif

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


namespace scpp
{


/**
 * テストケース.
 * 各テストクラスは, 本クラスを継承して作成してください.
 *
 * 以下に実装例を示します.
 *
 * @code
 * #include <scpp_unittest.hpp>
 *
 * using namespace scpp;
 * class SampleTest : public TestCase
 * {
 *     public:
 *        SampleTest() {}
 *        ~SampleTest() {}
 *        void setUp()
 *        {
 *          // 各テストケース実行前に実施する内容を記述する
 *        }
 *        void tearDown()
 *        {
 *          // 各テストケース実行後に実施する内容を記述する
 *        }
 *        void testSampe1()
 *        {
 *          // テスト内容を記述する
 *          std::sring tmp("ABC");
 *          Assertion::assertEquals("ABC", tmp);
 *        }
 *        void testSample2()
 *        {
 *           // 何らかのテスト
 *        }
 *        void suite()
 *        {
 *          RUN_TEST(testSample1);
 *          RUN_TEST(testSample2);
 *        }
 * };
 *
 *
 * @endcode
 */
class TestCase
{
	public:
		TestCase();
		virtual ~TestCase();
		virtual void setUp();
		virtual void tearDown();
		virtual void suite() = 0;

};


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

};

extern UnittestManager utManager;


}	// namespace scpp

#endif	/* __cplusplus			*/
#endif	/* SCPP_UNITTEST_HPP	*/