// TestFW.cpp: implementation of the CTestFW class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "TestFW.h" /* #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif */ template CTestFW::CTestFW() { } template CTestFW::~CTestFW() { } template void CTestFW::InitTestItems() { m_cTestItems = 0; ZeroMemory(m_TestItems, sizeof(m_TestItems)); m_cFuncName = 0; ZeroMemory(m_FuncName, sizeof(m_FuncName)); m_nCurrentItemNumber = 0; } template void CTestFW::AddFuncName(TCHAR* pName, TEST_FUNC func) { ASSERT(m_cFuncName BOOL CTestFW::RunTest() { BOOL bAllTested = FALSE; int i; MSG_TEST_NOTE((_T("\r\nThere are %d tests.\r\n"),m_cTestItems)); ShowDuplicatedTest(); if (!CheckWhetherAllTestFunctionNameAreRegistered()) { MSG_TEST_NOTE((_T("\r\nTesting is aborted.\r\n"))); return FALSE; } while (!bAllTested) { bAllTested = TRUE; for (i=0; i BOOL CTestFW::IsRequiredTestTested(int testIdx) { // TRUE·Î ÇØ ³õ°í, Å×½ºÆ® OK µÇÁö ¾ÊÀº ÇÔ¼ö°¡ ÀÖÀ¸¸é FALSE ·Î ÇÑ´Ù. BOOL bIsAllRequiredTestsTestedOk = TRUE; // ¸ÕÀú ¼öÇàµÇ¾î¾ß ÇÒ ÇÔ¼öµéÀ» ã´Â´Ù. for (int j=0; j void CTestFW::DoMainTest(int testIdx) { int i; BOOL bSetupSucceeded = TRUE; TEST_FUNC fn = NULL; TCHAR* pFuncName = NULL; //// // set up //// for (i=0; i*fn)() ) { // Intentionally blank for positive logic. } else { bSetupSucceeded = FALSE; TCHAR* pFuncName1 = NULL; TCHAR* pFuncName2 = NULL; GetFunctionName(fn, &pFuncName1); GetFunctionName(m_TestItems[testIdx].fnMain[0], &pFuncName2); MSG_TEST_FAILED((_T("T[%03d] %s: setup function [%s] failed.\r\n"),testIdx,pFuncName2,pFuncName1)); // mainÇÔ¼ö¸¦ ½ÌÇàÇÑ °Ç ¾Æ´ÏÁö¸¸, setup¿¡ ÇÊ¿äÇÑ ÀÛ¾÷ÀÌ ½ÇÆÐÇßÀ¸¹Ç·Î ÀÌ ÇÔ¼öµµ ½ÇÆÐÇß´Ù°í º»´Ù. m_TestItems[testIdx].fTestStatus = TS_TEST_FAILED; break; } } } //// // main //// if (bSetupSucceeded) { fn = m_TestItems[testIdx].fnMain[0]; if ( (p->*fn)() ) { m_TestItems[testIdx].fTestStatus = TS_TEST_OK; } else { m_TestItems[testIdx].fTestStatus = TS_TEST_FAILED; } } //// // tear down //// for (i=0; i*fn)(); } } //// // show test result //// pFuncName = NULL; GetFunctionName(fn, &pFuncName); if (m_TestItems[testIdx].fTestStatus==TS_TEST_OK) { MSG_TEST_OK((_T("T[%03d] %s OK\r\n"),testIdx,pFuncName)); } if (m_TestItems[testIdx].fTestStatus==TS_TEST_FAILED) { MSG_TEST_FAILED((_T("T[%03d] %s Failed\r\n"),testIdx,pFuncName)); } } template BOOL CTestFW::AddTestItem(int dummy, ...) { union { TEST_FUNC m; TEST_MARKER p; } mark; va_list marker; TEST_ITEM testItem = {0,}; // mainÀ» »©°í var arg¸¦ Èȴ´Ù. int idxRequired = 0; int idxSetup = 0; int idxTearDown = 0; int idxMain = 0; int* pIdx = NULL; TEST_FUNC* pFunc = NULL; BOOL bExcluded; va_start( marker, dummy ); mark.p = TM_MAIN; bExcluded = FALSE; while(mark.p != TM_END) { mark.m = va_arg( marker, TEST_FUNC); switch(mark.p) { case TM_MAIN: pIdx = &idxMain; pFunc = &testItem.fnMain[0]; break; case TM_REQUIRED: pIdx = &idxRequired; pFunc = &testItem.fnRequired[0]; break; case TM_SETUP: pIdx = &idxSetup; pFunc = &testItem.fnSetUp[0]; break; case TM_TEARDOWN: pIdx = &idxTearDown; pFunc = &testItem.fnTearDown[0]; break; case TM_EXCLUDE: bExcluded = TRUE; break; case TM_END: break; default: if (mark.p!=TM_END) { pFunc[*pIdx] = mark.m; (*pIdx)++; } break; } } va_end( marker ); if (bExcluded) { m_nCurrentItemNumber++; return TRUE; } // var arg Áß¿¡¼­ main¸¸ ã´Â´Ù. // ¹Ýµå½Ã mainÀÌ ÀÖ¾î¾ß ÇÑ´Ù°í °¡Á¤ÇÑ´Ù. mainÀÌ ¾øÀ¸¸é, ÇÁ·Î±×·¥ ¿À·ù°¡ ¹ß»ýÇÑ´Ù. ZeroMemory(testItem.fnMain, sizeof(testItem.fnMain)); va_start( marker, dummy ); mark.p = TM_MAIN; while(mark.p != TM_END) { mark.m = va_arg( marker, TEST_FUNC); if (mark.p==TM_MAIN) { break; } } ASSERT(mark.p==TM_MAIN); while(mark.p != TM_END) { mark.m = va_arg( marker, TEST_FUNC); if (mark.p==TM_MAIN||mark.p==TM_REQUIRED||mark.p==TM_SETUP||mark.p==TM_TEARDOWN||mark.p==TM_EXCLUDE||mark.p==TM_END) { break; } testItem.fnMain[0] = mark.m; testItem.nItemNumber = m_nCurrentItemNumber; AddTestItem(&testItem); } va_end( marker ); m_nCurrentItemNumber++; return TRUE; } template BOOL CTestFW::AddTestItem(TEST_ITEM* pItem) { ASSERT(m_cTestItems BOOL CTestFW::GetFunctionName(TEST_FUNC fn, TCHAR** ppFuncName) { *ppFuncName = NULL; for (int k=0; k void CTestFW::ShowDuplicatedTest() { TEST_FUNC fn1, fn2; for (int i=0; i BOOL CTestFW::CheckWhetherAllTestFunctionNameAreRegistered() { #define IS_NAME_EXIST(fieldName, field) \ if (field) {\ if (!GetFunctionName(field, &pFuncName)) {\ MSG_TEST_NOTE((_T("Test item [%d] [%s] contains function which has not registered its function name.\r\n"),m_TestItems[i].nItemNumber,fieldName));\ rs = FALSE;\ }\ } TCHAR* pFuncName = NULL; BOOL rs = TRUE; for (int i=0; i