DragonNest/GameCommon/UnitTest/SkillTreeSystem_unittest.cpp
2024-12-20 16:56:44 +08:00

298 lines
22 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "DNUserSession.h"
#include "DnSkillTreeSystem.h"
#if !defined( _FINAL_BUILD ) && !defined (__COVERITY__)
extern TVillageConfig g_Config;
class SkillTreeSystem_unittest:public testing::Test
{
public:
static CDnSkillTreeSystem* s_pSkillTreeSystem;
protected:
virtual void SetUp()
{
}
virtual void TearDown()
{
}
static void SetUpTestCase( void )
{
s_pSkillTreeSystem = new CDnSkillTreeSystem;
s_pSkillTreeSystem->InitializeTable();
}
static void TearDownTestCase( void )
{
delete s_pSkillTreeSystem;
}
};
CDnSkillTreeSystem* SkillTreeSystem_unittest::s_pSkillTreeSystem = NULL;
// NOTE: 추후에 실제 스킬트리 데이터가 들어갔을 때 해당 값으로 바꿔줍니다~
// 잘못된 스킬북 아이템 ID 일 때 언락 테스트.
TEST_F( SkillTreeSystem_unittest, TRY_ACQUIRE_INVALID_SKILLBOOK_ITEMID )
{
//vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
//CDnSkillTreeSystem::S_TRY_UNLOCK CurrentSkillInfo( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_TRY_UNLOCK CurrentSkillInfo;
CDnSkillTreeSystem::S_OUTPUT Output;
CurrentSkillInfo.iCurrentCharLevel = 99;
CurrentSkillInfo.iTryUnlockSkillID = 3;
CurrentSkillInfo.iSkillBookItemID = 100;
CurrentSkillInfo.iJobID = 1;
//// 선행 부모스킬 2개 추가.
//vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, false ) );
//vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 2, 2, false ) );
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryUnLockSkill( CurrentSkillInfo, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_INVALID_SKILLBOOK_ITEMID );
}
// 제대로 된 조건일 때 스킬 언락 테스트.
TEST_F( SkillTreeSystem_unittest, UNLOCK_SKILL )
{
//vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
//CDnSkillTreeSystem::S_TRY_UNLOCK CurrentSkillInfo( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_TRY_UNLOCK CurrentSkillInfo;
CDnSkillTreeSystem::S_OUTPUT Output;
CurrentSkillInfo.iCurrentCharLevel = 99;
CurrentSkillInfo.iTryUnlockSkillID = 3;
CurrentSkillInfo.iSkillBookItemID = 300;
CurrentSkillInfo.iJobID = 1;
//// 선행 부모스킬 2개 추가.
//vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, false ) );
//vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 2, 2, false ) );
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryUnLockSkill( CurrentSkillInfo, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_SUCCESS );
}
// 없는 스킬(잘못된 스킬 ID) 언락 테스트.
// 직업이 잘못된 경우도 해당됨.
TEST_F( SkillTreeSystem_unittest, TRY_ACQUIRE_INVALID_SKILLID )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = 99;
TryAcquire.iTryAcquireSkillID = 999;
TryAcquire.iHasSkillPoint = 100;
TryAcquire.iJobID = 1;
// 선행 부모스킬 2개 추가.
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, false ) );
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 2, 2, false ) );
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_CANT_FIND_SKILLNODE );
}
// 필요한 부모 스킬이 없을 때 언락 테스트.
TEST_F( SkillTreeSystem_unittest, TRY_ACQUIRE_DONT_HAVE_PARENTSKILL )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = 99;
TryAcquire.iTryAcquireSkillID = 3;
TryAcquire.iHasSkillPoint = 100;
TryAcquire.iJobID = 1;
// 선행 부모스킬 1개만 추가.
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, false ) );
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL );
}
// 필요한 부모 스킬의 락이 풀리지 않았을 때 언락 테스트.
TEST_F( SkillTreeSystem_unittest, TRY_ACQUIRE_UNLOCKED_PARENTSKILL )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = 99;
TryAcquire.iTryAcquireSkillID = 3;
TryAcquire.iHasSkillPoint = 100;
TryAcquire.iJobID = 1;
// 선행 부모스킬 2개 추가.
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, true ) ); // 락걸린 상태로 넘겨준다.
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 2, 2, false ) );
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_LOCKED_PARENTSKILL );
}
// 부모 스킬이 있되 부모 스킬 레벨이 모자랄 때 획득 테스트.
TEST_F( SkillTreeSystem_unittest, TRY_ACQUIRE_NOT_ENOUGH_PARENTSKILL_LEVEL )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = 99;
TryAcquire.iTryAcquireSkillID = 3;
TryAcquire.iHasSkillPoint = 100;
TryAcquire.iJobID = 1;
// 선행 부모스킬 2개 추가.
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, false ) );
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 2, 1, false ) ); // 부모스킬 레벨이 모자라.
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL );
}
// 캐릭터 레벨 모자랄 때 획득 테스트.
TEST_F( SkillTreeSystem_unittest, TRY_ACQUIRE_NOT_ENOUGH_CHAR_LEVEL )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = 1;
TryAcquire.iTryAcquireSkillID = 3;
TryAcquire.iHasSkillPoint = 100;
TryAcquire.iJobID = 1;
// 선행 부모스킬 2개 추가.
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, false ) );
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 2, 2, false ) );
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_NOT_ENOUGH_CHAR_LEVEL );
}
// 모든 조건 갖춰졌을 때 스킬 언락 테스트.
TEST_F( SkillTreeSystem_unittest, TRY_UNLOCK )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = 99;
TryAcquire.iTryAcquireSkillID = 3;
TryAcquire.iHasSkillPoint = 100;
TryAcquire.iJobID = 1;
// 선행 부모스킬 2개 추가.
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 1, 3, false ) );
vlPossessedSkillInfo.push_back( CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO( 2, 2, false ) );
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_SUCCESS );
}
// 부모 스킬이 없는 스킬 언락 테스트
TEST_F( SkillTreeSystem_unittest, TRY_DONT_HAVE_PARENT_SKILL_UNLOCK )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO> vlPossessedSkillInfo;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( vlPossessedSkillInfo );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = 99;
TryAcquire.iTryAcquireSkillID = 4;
TryAcquire.iHasSkillPoint = 100;
TryAcquire.iJobID = 1;
SkillTreeSystem_unittest::s_pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
EXPECT_EQ( Output.eErrorCode, CDnSkillTreeSystem::E_NONE );
EXPECT_EQ( Output.eResult, CDnSkillTreeSystem::R_SUCCESS );
}
// 스킬 트리 테이블에 정의된 대로 트리가 제대로 렌더링 되도록 정보를 돌려주는지 테스트.
TEST_F( SkillTreeSystem_unittest, RENDER_TREE )
{
int iJobID = 1;
int iNodeCount = SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeCount( iJobID );
EXPECT_EQ( iNodeCount, 4 );
int iSlotCount = SkillTreeSystem_unittest::s_pSkillTreeSystem->GetSlotCount( iJobID );
EXPECT_EQ( iSlotCount, 32 );
// 잘못된 잡 아이디 넘겨줬을 때,
CDnSkillTreeSystem::S_NODE_RENDER_INFO NodeRenderInfo;
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 0, 2, &NodeRenderInfo );
EXPECT_EQ( NodeRenderInfo.iSkillID, 0 );
// 순차적으로 제대로 된 값이 넘어오는지 확인.
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 0, iJobID, &NodeRenderInfo );
EXPECT_NE( NodeRenderInfo.iSkillID, 0 );
EXPECT_EQ( NodeRenderInfo.iSlotIndex, 0 );
EXPECT_EQ( NodeRenderInfo.vlChildSlotIndexInJob.front(), 4 );
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 1, iJobID, &NodeRenderInfo );
EXPECT_NE( NodeRenderInfo.iSkillID, 0 );
EXPECT_EQ( NodeRenderInfo.iSlotIndex, 1 );
EXPECT_EQ( NodeRenderInfo.vlChildSlotIndexInJob.front(), 4 );
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 2, iJobID, &NodeRenderInfo );
EXPECT_EQ( NodeRenderInfo.iSkillID, 0 );
EXPECT_EQ( NodeRenderInfo.iSlotIndex, 0 );
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 3, iJobID, &NodeRenderInfo );
EXPECT_EQ( NodeRenderInfo.iSkillID, 0 );
EXPECT_EQ( NodeRenderInfo.iSlotIndex, 0 );
// 2개의 부모가 있는 스킬.
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 4, iJobID, &NodeRenderInfo );
EXPECT_EQ( NodeRenderInfo.iSkillID, 3 );
EXPECT_EQ( NodeRenderInfo.iSlotIndex, 4 );
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 5, iJobID, &NodeRenderInfo );
EXPECT_EQ( NodeRenderInfo.iSkillID, 0 );
EXPECT_EQ( NodeRenderInfo.iSlotIndex, 0 );
SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 6, iJobID, &NodeRenderInfo );
EXPECT_EQ( NodeRenderInfo.iSkillID, 4 );
EXPECT_EQ( NodeRenderInfo.iSlotIndex, 6 );
//SkillTreeSystem_unittest::s_pSkillTreeSystem->GetNodeRenderInfo( 7, iJobID, &NodeRenderInfo );
//EXPECT_NE( NodeRenderInfo.iSkillID, 0 );
//EXPECT_EQ( NodeRenderInfo.iSlotIndex, 7 );
}
TEST_F( SkillTreeSystem_unittest, FIND_SKILL_BY_SKILLBOOK )
{
int iSkillID = SkillTreeSystem_unittest::s_pSkillTreeSystem->FindSkillBySkillBook( 300 );
EXPECT_EQ( iSkillID, 3 );
}
// 스킬 리셋 테스트. SP 모두 반환되며 락 정보는 DB에 유지 됨.
// 전직시에 스킬 리셋됨.
TEST_F( SkillTreeSystem_unittest, RESET )
{
}
#endif // #if !defined( _FINAL_BUILD )