#include "stdafx.h" #include "EtUIXML.h" #include "DNAuthManager.h" #include "DNUserSession.h" #include "DNGameDataManager.h" #include "DnCostumeRandomMixDataMgr.h" #if !defined( _FINAL_BUILD ) && !defined (__COVERITY__) #if defined( PRE_ADD_COSRANDMIX ) extern CEtUIXML* g_pUIXML; #ifdef PRE_ADD_EXCEPTIONAL_MAKESTRING extern CEtExceptionalUIXML* g_pExceptionalUIXML; #endif class CostumeRandomMix_unittest:public testing::Test { #define MAX_TEST_CLASS_KIND 5 #define RANDOM_TEST_COUNT 100 #define PROBABILITY_TEST_RANK_COUNT 5 #define PROBABILITY_TEST_COUNT 10000 protected: static void SetUpTestCase() { g_pUIXML = new CEtUIXML; CStream *pStream = CEtResourceMng::GetInstance().GetStream( "uistring.xml" ); g_pUIXML->Initialize( pStream, CEtUIXML::idCategory1 ); SAFE_DELETE( pStream ); g_pAuthManager = new CDNAuthManager; g_pAuthManager->Init(); #ifdef PRE_ADD_EXCEPTIONAL_MAKESTRING g_pExceptionalUIXML = new CEtExceptionalUIXML; if( g_pExceptionalUIXML ) g_pExceptionalUIXML->LoadXML( "uistring_exception.xml" ); #endif // PRE_ADD_EXCEPTIONAL_MAKESTRING g_pDataManager = new CDNGameDataManager(); g_pDataManager->LoadItemData(); g_pDataManager->LoadPartData(); } static void TearDownTestCase() { SAFE_DELETE( g_pDataManager ); SAFE_DELETE( g_pUIXML ); SAFE_DELETE( g_pAuthManager ); } virtual void SetUp() { m_Random.srand(timeGetTime()); m_pSession = new CDNUserSession; m_pMgr = const_cast(&g_pDataManager->GetCosRandomMixDataMgr()); EXPECT_TRUE(g_pDataManager->LoadCostumeRandomMixData()); } virtual void TearDown() { SAFE_DELETE(m_pSession); } CDNUserSession* m_pSession; CMtRandom m_Random; CDnCostumeRandomMixDataMgr* m_pMgr; }; TEST_F( CostumeRandomMix_unittest, RANDOMTEST ) { std::vector enableList[CASHEQUIPMAX]; typedef std::map MIXENABLELIST; MIXENABLELIST& enableListAll = m_pMgr->m_CosRandomMixEnableList; MIXENABLELIST::const_iterator iter = enableListAll.begin(); for (; iter != enableListAll.end(); ++iter) { int stuffItemId = (*iter).first; const TPartData* pData = g_pDataManager->GetPartData(stuffItemId); if (pData == NULL) { EXPECT_FALSE(true) << "There is no stuffItemId:" << stuffItemId; } else { EXPECT_TRUE(pData->nParts >= CASHEQUIPMIN && pData->nParts < CASHEQUIPMAX); EXPECT_FALSE(std::find(enableList[pData->nParts].begin(), enableList[pData->nParts].end(), stuffItemId) != enableList[pData->nParts].end()); enableList[pData->nParts].push_back(stuffItemId); } } FILE* pStream = NULL; struct tm* now=NULL; time_t systemTime; time(&systemTime); now=localtime(&systemTime); wchar_t szTail[MAX_PATH] = {0,}; wsprintfW(szTail, L"CostumeRandomMixTest_EnableItemList_%02d%02d%02d_%02d%02d%02d.txt", 1900+now->tm_year, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); EXPECT_FALSE(_wfopen_s(&pStream, szTail, L"wb") != 0); if (pStream) { fseek(pStream, 0L, SEEK_SET); WORD mark = 0xFEFF; fwrite(&mark, sizeof(WORD), 1, pStream); } const wchar_t* pCashPartsName[CASHEQUIP_FOOT + 1] = { L"HELMET", L"BODY", L"LEG", L"HAND", L"FOOT" }; EXPECT_FALSE(pStream == NULL); fwprintf(pStream, L"===================== Enable Item List =====================\n"); int i = 0; for (; i <= CASHEQUIP_FOOT; ++i) { fwprintf(pStream, L"\nPARTS - %s\n\n", pCashPartsName[i]); int j = 0; for (; j < (int)enableList[i].size(); ++j) { const int& itemId = enableList[i][j]; const TItemData* pData = g_pDataManager->GetItemData(itemId); if (pData == NULL) { fwprintf(pStream, L"(%d) No ItemData!!\n", itemId); } fwprintf(pStream, L"(%d) %s\n", itemId, pData->wszItemName); } fwprintf(pStream, L"\n"); } fclose(pStream); pStream = NULL; wsprintfW(szTail, L"CostumeRandomMixTest_MixResultList_%02d%02d%02d_%02d%02d%02d.txt", 1900+now->tm_year, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); EXPECT_FALSE(_wfopen_s(&pStream, szTail, L"wb") != 0); int classID = 1; fwprintf(pStream, L"CLASSID SPECIFICATION : 1(Warrior) 2(Archer) 3(Sorceress) 4(Cleric) 5(Academic) 6(kali)\n"); for (; classID <= MAX_TEST_CLASS_KIND; ++classID) { fwprintf(pStream, L"\nCLASSID : (%d)\n", classID); int i = CASHEQUIPMIN; for (; i <= CASHEQUIP_FOOT; ++i) { std::vector& curEnableList = enableList[i]; if (curEnableList.size() <= 0) { EXPECT_FALSE(true) << "There is NO Equip List eCashEquipType: " << i; return; } std::vector::const_iterator iter = curEnableList.begin(); int j = 0, noCount = 0; for (; j <= RANDOM_TEST_COUNT;) { std::vector stuffs; int k = 0; bool bTestOK = true; for (; k < MAX_COSTUME_RANDOMMIX_STUFF; ++k) { int curStuffIndex = m_Random.rand(0, (int)curEnableList.size() - 1); int itemId = curEnableList[curStuffIndex]; if (bTestOK && g_pDataManager->IsItemNeedJob(itemId, classID) == false) bTestOK = false; TItem stuffItem; if (CDNUserItem::MakeItemStruct(curEnableList[curStuffIndex], stuffItem) == false) { EXPECT_FALSE(true); return; } stuffs.push_back(stuffItem); } if (bTestOK) { bool bEnableMix = m_pMgr->IsEnableCostumeRandomMixStuff(stuffs, classID); EXPECT_TRUE(bEnableMix); if (bEnableMix == false) continue; } else { EXPECT_FALSE(m_pMgr->IsEnableCostumeRandomMixStuff(stuffs, classID)); noCount++; continue; } eError lastEror; int resultItemId = m_pMgr->DoRandomMix(stuffs, classID, *(m_pSession->GetItem()), 0, lastEror); EXPECT_TRUE(resultItemId); if (resultItemId != 0) { std::wstring resultItemName; const TItemData* pData = g_pDataManager->GetItemData(resultItemId); if (pData == NULL) resultItemName = L"Result NO ItemData!"; else resultItemName = pData->wszItemName; int rank = m_pMgr->GetRandomMixStuffItemRank(stuffs[0].nItemID); const TItemData* pStuffData = g_pDataManager->GetItemData(stuffs[0].nItemID); if (pStuffData) fwprintf(pStream, L"(%02d:%10d)%s + ", rank, stuffs[0].nItemID, pStuffData->wszItemName); else fwprintf(pStream, L"(%02d:%10d) + ", rank, stuffs[0].nItemID); for (k = 1; k < MAX_COSTUME_RANDOMMIX_STUFF - 1; ++k) { int rank = m_pMgr->GetRandomMixStuffItemRank(stuffs[k].nItemID); const TItemData* pStuffData = g_pDataManager->GetItemData(stuffs[k].nItemID); if (pStuffData) fwprintf(pStream, L"(%02d:%10d)%s + ", rank, stuffs[k].nItemID, pStuffData->wszItemName); else fwprintf(pStream, L"(%02d:%10d) + ", rank, stuffs[k].nItemID); } rank = m_pMgr->GetRandomMixStuffItemRank(stuffs[MAX_COSTUME_RANDOMMIX_STUFF - 1].nItemID); pStuffData = g_pDataManager->GetItemData(stuffs[MAX_COSTUME_RANDOMMIX_STUFF - 1].nItemID); if (pStuffData) fwprintf(pStream, L"(%02d:%10d)%s", rank, stuffs[MAX_COSTUME_RANDOMMIX_STUFF - 1].nItemID, pStuffData->wszItemName); else fwprintf(pStream, L"(%02d:%10d)", rank, stuffs[MAX_COSTUME_RANDOMMIX_STUFF - 1].nItemID); rank = m_pMgr->GetRandomMixResultItemRank(resultItemId); if (pData == NULL) fwprintf(pStream, L" = (%02d:%10d)\n", rank, resultItemId); else fwprintf(pStream, L" = (%02d:%10d) %s\n", rank, resultItemId, pData->wszItemName); ++j; } } } } fclose(pStream); } TEST_F( CostumeRandomMix_unittest, PROBABILITY_TEST ) { std::vector enableList[MAX_TEST_CLASS_KIND + 1][CASHEQUIPMAX][PROBABILITY_TEST_RANK_COUNT]; typedef std::map MIXENABLELIST; MIXENABLELIST& enableListAll = m_pMgr->m_CosRandomMixEnableList; MIXENABLELIST::const_iterator iter = enableListAll.begin(); for (; iter != enableListAll.end(); ++iter) { int stuffItemId = (*iter).first; const CDnCostumeRandomMixDataMgr::SRandomMixEnableData& rddata = (*iter).second; const TPartData* pData = g_pDataManager->GetPartData(stuffItemId); if (pData == NULL) { EXPECT_FALSE(true) << "There is no stuffItemId:" << stuffItemId; } else { bool bIsValidRank = (rddata.nRank >= 0 && rddata.nRank < PROBABILITY_TEST_RANK_COUNT); EXPECT_TRUE(bIsValidRank); int i = 1; for (; i <= MAX_TEST_CLASS_KIND; ++i) { if (g_pDataManager->IsItemNeedJob(stuffItemId, i) && bIsValidRank) enableList[i][pData->nParts][rddata.nRank].push_back(stuffItemId); } } } FILE* pStream = NULL; struct tm* now=NULL; time_t systemTime; time(&systemTime); now=localtime(&systemTime); wchar_t szTail[MAX_PATH] = {0,}; wsprintfW(szTail, L"CostumeRandomMixTest_ProbabilityTest_%02d%02d%02d_%02d%02d%02d.txt", 1900+now->tm_year, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); EXPECT_FALSE(_wfopen_s(&pStream, szTail, L"wb") != 0); if (pStream) { fseek(pStream, 0L, SEEK_SET); WORD mark = 0xFEFF; fwrite(&mark, sizeof(WORD), 1, pStream); } const wchar_t* pCashPartsName[CASHEQUIP_FOOT + 1] = { L"HELMET", L"BODY", L"LEG", L"HAND", L"FOOT" }; EXPECT_FALSE(pStream == NULL); int classID = 1; fwprintf(pStream, L"CLASSID SPECIFICATION : 1(Warrior) 2(Archer) 3(Sorceress) 4(Cleric) 5(Academic) 6(kali)\n"); for (; classID <= MAX_TEST_CLASS_KIND; ++classID) { fwprintf(pStream, L"\nCLASSID : (%d)\n", classID); int i = CASHEQUIPMIN; for (; i <= CASHEQUIP_FOOT; ++i) { fwprintf(pStream, L"PARTS - %s\n", pCashPartsName[i]); int j = 0; for (; j < PROBABILITY_TEST_RANK_COUNT; ++j) { fwprintf(pStream, L"RANK(%d) x RANK(%d)\n", j, j); const std::vector& curEnableList = enableList[classID][i][j]; if (curEnableList.size() <= 0) { fwprintf(pStream, L"No ITEMS\n\n"); //EXPECT_FALSE(true) << "There is no stuffs[class:%d][equip:%d][rank:%d]" << classID << i << j; continue; } int k = 0; std::vector stuffs; int rankCount[PROBABILITY_TEST_RANK_COUNT] = {0,}; for (; k < PROBABILITY_TEST_COUNT; ++k) { stuffs.clear(); for (int l = 0; l < MAX_COSTUME_RANDOMMIX_STUFF; ++l) { int curIdx = m_Random.rand(0, (int)curEnableList.size() - 1); const int& stuffItemId = curEnableList[curIdx]; TItem stuffItem; if (CDNUserItem::MakeItemStruct(stuffItemId, stuffItem) == false) { EXPECT_FALSE(true); continue; } stuffs.push_back(stuffItem); } if (stuffs.size() != MAX_COSTUME_RANDOMMIX_STUFF) { EXPECT_FALSE(true) << "There is no stuffs[class:%d][equip:%d][rank:%d]" << classID << i << j; continue; } if (m_pMgr->IsEnableCostumeRandomMixStuff(stuffs, classID) == false) { //EXPECT_FALSE(true) << "There is no ENABLE stuffs[class:%d][equip:%d][rank:%d]" << classID << i << j; continue; } eError lastEror; int resultItemId = m_pMgr->DoRandomMix(stuffs, classID, *(m_pSession->GetItem()), 0, lastEror); int resultRank = m_pMgr->GetRandomMixResultItemRank(resultItemId); if (resultRank >= 0 && resultRank < PROBABILITY_TEST_RANK_COUNT) rankCount[resultRank]++; else EXPECT_FALSE(true) << "Result Rank Error resultItemId:%d [class:%d][equip:%d][rank:%d]" << resultItemId << classID << i << j; } fwprintf(pStream, L"RESULT in %d count\n", PROBABILITY_TEST_COUNT); for (int m = 0; m < PROBABILITY_TEST_RANK_COUNT; ++m) { fwprintf(pStream, L"rank_%d : %d ", m, rankCount[m]); } fwprintf(pStream, L"\n\n"); } } } fclose(pStream); } TEST_F( CostumeRandomMix_unittest, PROBABILITY_TEST2 ) { std::vector enableList[MAX_TEST_CLASS_KIND + 1][CASHEQUIPMAX][PROBABILITY_TEST_RANK_COUNT]; typedef std::map MIXENABLELIST; MIXENABLELIST& enableListAll = m_pMgr->m_CosRandomMixEnableList; MIXENABLELIST::const_iterator iter = enableListAll.begin(); for (; iter != enableListAll.end(); ++iter) { int stuffItemId = (*iter).first; const CDnCostumeRandomMixDataMgr::SRandomMixEnableData& rddata = (*iter).second; const TPartData* pData = g_pDataManager->GetPartData(stuffItemId); if (pData == NULL) { EXPECT_FALSE(true) << "There is no stuffItemId:" << stuffItemId; } else { bool bIsValidRank = (rddata.nRank >= 0 && rddata.nRank < PROBABILITY_TEST_RANK_COUNT); EXPECT_TRUE(bIsValidRank); int i = 1; for (; i <= MAX_TEST_CLASS_KIND; ++i) { if (g_pDataManager->IsItemNeedJob(stuffItemId, i) && bIsValidRank) enableList[i][pData->nParts][rddata.nRank].push_back(stuffItemId); } } } FILE* pStream = NULL; struct tm* now=NULL; time_t systemTime; time(&systemTime); now=localtime(&systemTime); wchar_t szTail[MAX_PATH] = {0,}; wsprintfW(szTail, L"CostumeRandomMixTest_ProbabilityTest2_%02d%02d%02d_%02d%02d%02d.txt", 1900+now->tm_year, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); EXPECT_FALSE(_wfopen_s(&pStream, szTail, L"wb") != 0); if (pStream) { fseek(pStream, 0L, SEEK_SET); WORD mark = 0xFEFF; fwrite(&mark, sizeof(WORD), 1, pStream); } const wchar_t* pCashPartsName[CASHEQUIP_FOOT + 1] = { L"HELMET", L"BODY", L"LEG", L"HAND", L"FOOT" }; EXPECT_FALSE(pStream == NULL); int classID = 1; fwprintf(pStream, L"CLASSID SPECIFICATION : 1(Warrior) 2(Archer) 3(Sorceress) 4(Cleric) 5(Academic) 6(kali)\n"); for (; classID <= MAX_TEST_CLASS_KIND; ++classID) { fwprintf(pStream, L"\nCLASSID : (%d)\n", classID); int i = CASHEQUIPMIN; for (; i <= CASHEQUIP_FOOT; ++i) { fwprintf(pStream, L"PARTS - %s\n", pCashPartsName[i]); // todo by kalliste } } fclose(pStream); } TEST_F(CostumeRandomMix_unittest, PROBABILITY_TEST3) { int classID = 1; int stuffItemId[2] = {0,}; stuffItemId[0] = 1073765120; stuffItemId[1] = 1073765121; std::vector stuffs; for (int l = 0; l < 2; ++l) { TItem stuffItem; if (CDNUserItem::MakeItemStruct(stuffItemId[l], stuffItem) == false) { EXPECT_FALSE(true); continue; } stuffs.push_back(stuffItem); } FILE* pStream = NULL; struct tm* now=NULL; time_t systemTime; eError lastEror; time(&systemTime); now=localtime(&systemTime); wchar_t szTail[MAX_PATH] = {0,}; wsprintfW(szTail, L"CostumeRandomMixTest_ProbabilityTest3_%02d%02d%02d_%02d%02d%02d.txt", 1900+now->tm_year, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); EXPECT_FALSE(_wfopen_s(&pStream, szTail, L"wb") != 0); int ranks[10] = {0,}; for (int m = 0; m < 1000000; ++m) { int resultItemId = m_pMgr->DoRandomMix(stuffs, classID, *(m_pSession->GetItem()), 0, lastEror); int resultRank = m_pMgr->GetRandomMixResultItemRank(resultItemId); EXPECT_FALSE(resultRank < 0 || resultRank >= 10); ranks[resultRank]++; } for (int n = 0; n < 10; ++n) { fwprintf(pStream, L"\nRank%d: (%d)\n", n, ranks[n]); } } #endif // #if defined( PRE_ADD_COSRANDMIX ) #endif // #if !defined( _FINAL_BUILD )