#include "stdafx.h" #include "./boost/scoped_ptr.hpp" #include "MAAiScript.h" #include "TDnPlayerWarrior.h" #include "DnPlayerActor.h" #include "DNGameRoom.h" #include "DnSkill.h" #if !defined( _FINAL_BUILD ) && !defined (__COVERITY__) // °ü·Ã À̽´ : ¾øÀ½ // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.10.20 // ¼³¸í : ¸ó½ºÅÍAI ¿¡¼­ »ç¿ëµÇ´Â *.lua ÆÄÀÏ ·Îµù Å×½ºÆ® #define PRE_TEST_15800 class MonsterAI_unittest:public testing::Test { protected: virtual void SetUp() { // ¹æ »ý¼º MAGAReqRoomID Packet; memset( &Packet, 0, sizeof(Packet) ); m_pRoom = new CDNGameRoom( NULL, 0, &Packet ); // ¾×ÅÍ »ý¼º m_hActor = (new TDnPlayerWarrior( m_pRoom, 0 ) )->GetMySmartPtr(); } virtual void TearDown() { delete m_hActor.GetPointer(); delete m_pRoom; } static void SetUpTestCase() { m_pResMng = new CEtResourceMng( false, true ); EXPECT_TRUE( m_pResMng->AddResourcePath( "r:\\gameres\\resource\\script\\monsterai" ) ); EXPECT_TRUE( m_pResMng->AddResourcePath( "r:\\gameres\\resource\\ext" ) ); // CDnTableDB °´Ã¼ »ý¼º m_pTableDB = new CDnTableDB(); EXPECT_TRUE( m_pTableDB->Initialize() ); // *.lua ·Îµå m_ScriptLoader = new AiScriptLoader(); std::vector FileList; #if defined( PRE_TEST_15800 ) FindFileListInDirectory( m_pResMng->GetFullPath( "MonsterAI" ).c_str(), "AiOrc_Black_Boss_Easy.lua", FileList ); #else FindFileListInDirectory( m_pResMng->GetFullPath( "MonsterAI" ).c_str(), "*.lua", FileList ); #endif // #if defined( PRE_TEST_15800 ) for( UINT i = 0 ; iLoadScript( FileList[i].c_str() ) ) << FileList[i]; } } static void TearDownTestCase() { delete m_pResMng; delete m_pTableDB; delete m_ScriptLoader; } static CEtResourceMng* m_pResMng; static AiScriptLoader* m_ScriptLoader; static CDnTableDB* m_pTableDB; CDNGameRoom* m_pRoom; DnActorHandle m_hActor; }; CEtResourceMng* MonsterAI_unittest::m_pResMng = NULL; AiScriptLoader* MonsterAI_unittest::m_ScriptLoader = NULL; CDnTableDB* MonsterAI_unittest::m_pTableDB = NULL; // °ü·Ã À̽´ : ¾øÀ½ // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.10.20 // ¼³¸í : ¸ó½ºÅÍAI ¿¡¼­ »ç¿ëµÇ´Â *.lua À¯´Ö Å×½ºÆ® // 1. À߸øµÈ ½ºÅ³À妽º °Ë»ç // 2. Target °ü·Ã ¼³Á¤ ¿À·ù °Ë»ç // 3. UsedSkillIndex ¿À·ù °Ë»ç // 4. NotUsedSkillIndex ¿À·ù °Ë»ç // 5. Turn °ü·Ã ¾×¼Ç Loop °ª °Ë»ç TEST_F( MonsterAI_unittest, VerifyLua ) { DNTableFileFormat* pSkillSox = m_pTableDB->GetTable( CDnTableDB::TSKILL ); EXPECT_TRUE( pSkillSox != NULL ); for( std::map::iterator itor=m_ScriptLoader->m_ScriptMap.begin() ; itor!=m_ScriptLoader->m_ScriptMap.end() ; ++itor ) { // 1.À߸øµÈ ½ºÅ³À妽º °Ë»ç #if defined(PRE_ADD_64990) for (int nIndex = 0; nIndex < 2; ++nIndex) { for( UINT i=0 ; i<(*itor).second.m_SkillTable[nIndex].size() ; ++i ) { EXPECT_TRUE( pSkillSox->IsExistItem( (*itor).second.m_SkillTable[nIndex][i].nSkillIndex ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << (*itor).second.m_SkillTable[nIndex][i].nSkillIndex; for( UINT j=0 ; j<(*itor).second.m_SkillTable[nIndex][i].pMAAiCheckerManager->m_vActorChecker.size() ; ++j ) { // 3. UsedSkillIndex ¿À·ù °Ë»ç CMAAiActorUsedSkillChecker* pChecker = dynamic_cast((*itor).second.m_SkillTable[nIndex][i].pMAAiCheckerManager->m_vActorChecker[j]); if( pChecker ) { for( UINT k=0 ; km_vSkillTableID.size() ; ++k ) EXPECT_TRUE( pSkillSox->IsExistItem( pChecker->m_vSkillTableID[k] ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << pChecker->m_vSkillTableID[k]; } // 4. NotUsedSkillIndex ¿À·ù °Ë»ç CMAAiActorNotUsedSkillChecker* pChecker2 = dynamic_cast((*itor).second.m_SkillTable[nIndex][i].pMAAiCheckerManager->m_vActorChecker[j]); if( pChecker2 ) { for( UINT k=0 ; km_vSkillTableID.size() ; ++k ) EXPECT_TRUE( pSkillSox->IsExistItem( pChecker2->m_vSkillTableID[k] ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << pChecker2->m_vSkillTableID[k]; } } } } #else for( UINT i=0 ; i<(*itor).second.m_SkillTable.size() ; ++i ) { EXPECT_TRUE( pSkillSox->IsExistItem( (*itor).second.m_SkillTable[i].nSkillIndex ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << (*itor).second.m_SkillTable[i].nSkillIndex; for( UINT j=0 ; j<(*itor).second.m_SkillTable[i].pMAAiCheckerManager->m_vActorChecker.size() ; ++j ) { // 3. UsedSkillIndex ¿À·ù °Ë»ç CMAAiActorUsedSkillChecker* pChecker = dynamic_cast((*itor).second.m_SkillTable[i].pMAAiCheckerManager->m_vActorChecker[j]); if( pChecker ) { for( UINT k=0 ; km_vSkillTableID.size() ; ++k ) EXPECT_TRUE( pSkillSox->IsExistItem( pChecker->m_vSkillTableID[k] ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << pChecker->m_vSkillTableID[k]; } // 4. NotUsedSkillIndex ¿À·ù °Ë»ç CMAAiActorNotUsedSkillChecker* pChecker2 = dynamic_cast((*itor).second.m_SkillTable[i].pMAAiCheckerManager->m_vActorChecker[j]); if( pChecker2 ) { for( UINT k=0 ; km_vSkillTableID.size() ; ++k ) EXPECT_TRUE( pSkillSox->IsExistItem( pChecker2->m_vSkillTableID[k] ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << pChecker2->m_vSkillTableID[k]; } } } #endif // PRE_ADD_64990 // 2. Target °ü·Ã ¼³Á¤ ¿À·ù °Ë»ç for( UINT i=0 ; i<(*itor).second.m_AITable.size() ; ++i ) { for( UINT j=0 ; j<(*itor).second.m_AITable[i].VecActionTable.size() ; ++j ) { ActionTable& AT = (*itor).second.m_AITable[i].VecActionTable[j]; #if defined (PRE_MOD_AIMULTITARGET) EXPECT_TRUE( !(AT.fRandomTarget != 0.f && AT.nMultipleTarget > 0) ) << (*itor).first; #else EXPECT_TRUE( !(AT.fRandomTarget != 0.f && AT.bMultipleTarget == true) ) << (*itor).first; #endif for( UINT k=0 ; km_vActorChecker.size() ; ++k ) { // 3. UsedSkillIndex ¿À·ù °Ë»ç CMAAiActorUsedSkillChecker* pChecker = dynamic_cast(AT.pMAAiCheckerManager->m_vActorChecker[k]); if( pChecker ) { for( UINT x=0 ; xm_vSkillTableID.size() ; ++x ) EXPECT_TRUE( pSkillSox->IsExistItem( pChecker->m_vSkillTableID[x] ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << pChecker->m_vSkillTableID[x]; } // 4. NotUsedSkillIndex ¿À·ù °Ë»ç CMAAiActorNotUsedSkillChecker* pChecker2 = dynamic_cast(AT.pMAAiCheckerManager->m_vActorChecker[k]); if( pChecker2 ) { for( UINT x=0 ; xm_vSkillTableID.size() ; ++x ) EXPECT_TRUE( pSkillSox->IsExistItem( pChecker2->m_vSkillTableID[x] ) ) << "FileName:"<< (*itor).first << " SkillIndex:" << pChecker2->m_vSkillTableID[x]; } } // 5. Turn °ü·Ã ¾×¼Ç Loop °ª °Ë»ç if( strstr( AT.szActionName.c_str(), "Turn" ) ) { EXPECT_TRUE( AT.nLoop == -1 ) << "FileName:"<< (*itor).first << " Turn ¾×¼ÇÀº Loop °¡ -1 À̾î¾ßÇÕ´Ï´Ù."; } } } } } // °ü·Ã À̽´ : ¾øÀ½ // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.10.20 // ¼³¸í : ¸ó½ºÅÍAI ¿¡¼­ »ç¿ëµÇ´Â SelfHPPercentRange( HP >= Min && HP <= Max ) üũ Çϴ Ŭ·¡½º À¯´ÖÅ×½ºÆ® TEST_F( MonsterAI_unittest, CMAAiActorHPPercentCheckerRange ) { boost::scoped_ptr pChecker( new CMAAiActorHPPercentCheckerRange( 3, 50 ) ); m_hActor->SetMaxHP( 100 ); m_hActor->SetHP( 10 ); EXPECT_TRUE( pChecker->bIsCheck( m_hActor,0 ) ); m_hActor->SetHP( 51 ); EXPECT_FALSE( pChecker->bIsCheck( m_hActor,0 ) ); } // °ü·Ã À̽´ : ¾øÀ½ // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.10.21 // ¼³¸í : ¸ó½ºÅÍAI ¿¡¼­ »ç¿ëµÇ´Â SelfHPPercent( CheckHP >= HP ) üũ Çϴ Ŭ·¡½º À¯´ÖÅ×½ºÆ® TEST_F( MonsterAI_unittest, CMAAiActorHPPercentChecker ) { boost::scoped_ptr pChecker( new CMAAiActorHPPercentChecker( 30 ) ); boost::scoped_ptr pChecker2( new CMAAiActorHPPercentChecker( 5 ) ); m_hActor->SetMaxHP( 100 ); m_hActor->SetHP( 10 ); EXPECT_TRUE( pChecker->bIsCheck( m_hActor,0 ) ); // 30>=10 EXPECT_FALSE( pChecker2->bIsCheck( m_hActor,0 ) ); // 5>=10 } // °ü·Ã À̽´ : ¾øÀ½ // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.10.27 // ¼³¸í : ¸ó½ºÅÍAI ¿¡¼­ »ç¿ëµÇ´Â »ç¿ëÁßÀÎ ½ºÅ³ üũ Çϴ Ŭ·¡½º À¯´ÖÅ×½ºÆ® TEST_F( MonsterAI_unittest, CMAAiActorUsedSkillChecker ) { std::vector vSkill; vSkill.push_back( 1 ); vSkill.push_back( 2 ); vSkill.push_back( 3 ); boost::scoped_ptr pChecker( new CMAAiActorUsedSkillChecker( vSkill ) ); m_hActor->SetHP( 100 ); for( UINT i=0 ; ibIsCheck( m_hActor,0 ) ); EXPECT_TRUE( m_hActor->CDnActor::CmdAddStateEffect( &sSkillInfo, static_cast(vSkill[i]), 0, "" ) != -1 ); } EXPECT_TRUE( pChecker->bIsCheck( m_hActor,0 ) ); } // °ü·Ã À̽´ : ¾øÀ½ // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.10.28 // ¼³¸í : ¸ó½ºÅÍAI ¿¡¼­ »ç¿ëµÇ´Â »ç¿ëÁßÀÌÁö ¾ÊÀº ½ºÅ³ üũ Çϴ Ŭ·¡½º À¯´ÖÅ×½ºÆ® TEST_F( MonsterAI_unittest, CMAAiActorNotUsedSkillChecker ) { std::vector vSkill; vSkill.push_back( 1 ); vSkill.push_back( 2 ); vSkill.push_back( 3 ); boost::scoped_ptr pChecker( new CMAAiActorNotUsedSkillChecker( vSkill ) ); m_hActor->SetHP( 100 ); EXPECT_TRUE( pChecker->bIsCheck( m_hActor,0 ) ); for( UINT i=0 ; iCDnActor::CmdAddStateEffect( &sSkillInfo, static_cast(vSkill[i]), 0, "" ) != -1 ); EXPECT_FALSE( pChecker->bIsCheck( m_hActor,0 ) ); } } // °ü·Ã À̽´ : ¾øÀ½ // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.10.27 // ¼³¸í : ¸ó½ºÅÍAI ¿¡¼­ »ç¿ëµÇ´Â SP üũ Çϴ Ŭ·¡½º À¯´ÖÅ×½ºÆ® TEST_F( MonsterAI_unittest, CMAAiActorSPChecker ) { boost::scoped_ptr pChecker( new CMAAiActorSPChecker(5) ); m_hActor->SetSP( 10 ); EXPECT_TRUE( pChecker->bIsCheck( m_hActor,0 ) ); m_hActor->SetSP( 5 ); EXPECT_TRUE( pChecker->bIsCheck( m_hActor,0 ) ); m_hActor->SetSP( 3 ); EXPECT_FALSE( pChecker->bIsCheck( m_hActor,0 ) ); } // °ü·Ã À̽´ : #15800 // ÀÛ¼ºÀÚ : ±è¹ä // ÀÛ¼ºÀÏ : 2009.06.09 // ¼³¸í : SetUpTestCase ¿¡¼­¸¸ unittest ÁøÇàµÇ°í ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â TC TEST_F( MonsterAI_unittest, NullTC ) { } #endif // #if !defined( _FINAL_BUILD )