/* =============================================================================
 *  scpp_unittest.hpp
 *  Copyright (c)  2003 - 2011  Nomura Kei
 *  LICENSE :
 *  LGPL (GNU Lesser General General Public License - Version 3,29 June 2007)
 *  http://www.gnu.org/copyleft/lesser.html
 * =============================================================================
 *
 * 単体試験用モジュール.
 *
 */
#ifndef SCPP_UNITTEST_HPP
#define SCPP_UNITTEST_HPP

#include <vector>

#include <scpp_assert.hpp>


#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) throw();
		void printResult();
	private:
		int okCount;
		int ngCount;

};

extern UnittestManager utManager;


}	// namespace scpp

#endif	// SCPP_UNITTEST_HPP

