#include <sc_unittest.h>
#include <sc_error.h>


static void UT_SC_setAssertOutput(void);
static void UT_SC_setAssertOutput_change(void);
static void UT_SC_setAssertOutput_noChange(void);
static void UT_SC_clearAssertOutput(void);
static void UT_SC_assertAtExit(void);
static void UT_SC_assertAtExit_over(void);
static void UT_SC_assertAtExitClear(void);

void UT_regist_sc_assert(void)
{
	SC_Unittest_add("SC_setAssertOutput"         , UT_SC_setAssertOutput);
	SC_Unittest_add("SC_setAssertOutput_change"  , UT_SC_setAssertOutput_change);
	SC_Unittest_add("SC_setAssertOutput_noChange", UT_SC_setAssertOutput_noChange);
	SC_Unittest_add("SC_clearAssertOutput"       , UT_SC_clearAssertOutput);
	SC_Unittest_add("SC_assertAtExit"            , UT_SC_assertAtExit);
	SC_Unittest_add("SC_assertAtExit_over"       , UT_SC_assertAtExit_over);
	SC_Unittest_add("SC_assertAtExitClear"       , UT_SC_assertAtExitClear);

}


static
void UT_SC_setAssertOutput(void)
{
	SC_clearAssertOutput();
	SC_setAssertOutput(stdout);
}

static
void UT_SC_setAssertOutput_change(void)
{
	SC_setAssertOutput(stdout);
	SC_setAssertOutput(stderr);
}

static
void UT_SC_setAssertOutput_noChange(void)
{
	SC_clearAssertOutput();
	SC_setAssertOutput(NULL);
}

static
void UT_SC_clearAssertOutput(void)
{
	SC_clearAssertOutput();
}

static void UT_SC_assertDummy(void) {}

static
void UT_SC_assertAtExit(void)
{
	SC_assertAtExit(UT_SC_assertDummy);
}

static
void UT_SC_assertAtExit_over(void)
{
	int  i;
	bool ret = true;
	for (i = 0; i < 4096; i++)
	{
		ret = SC_assertAtExit(UT_SC_assertDummy);
		if (!ret)
		{
			break;
		}
	}
	SC_assert(i < 4096);
}

static
void UT_SC_assertAtExitClear(void)
{
	/* クリアすると単体テストの終了時表示まで
	 * 消えてしまうのでコメントアウト
	SC_assertAtExitClear();
	*/
}


