mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-10-10 09:28:06 +00:00
243 lines
6.7 KiB
C++
243 lines
6.7 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include "CharacterComponent.h"
|
|
#include "Entity.h"
|
|
#include "BitStream.h"
|
|
#include "GameDependencies.h"
|
|
#include "Character.h"
|
|
#include "User.h"
|
|
#include "eGameActivity.h"
|
|
#include "eGameMasterLevel.h"
|
|
#include "eLootSourceType.h"
|
|
#include "MessageType/Game.h"
|
|
|
|
class CharacterComponentTest : public GameDependenciesTest {
|
|
protected:
|
|
void SetUp() override {
|
|
SetUpDependencies();
|
|
|
|
// Create a mock user and character
|
|
m_User = std::make_unique<User>(UNASSIGNED_SYSTEM_ADDRESS, "TestUser", "TestPassword");
|
|
|
|
m_Character = std::make_unique<Character>(1, m_User.get());
|
|
m_Character->SetCoins(1000, eLootSourceType::NONE);
|
|
|
|
// Set character appearance
|
|
m_Character->SetHairColor(5);
|
|
m_Character->SetHairStyle(10);
|
|
m_Character->SetShirtColor(15);
|
|
m_Character->SetPantsColor(20);
|
|
m_Character->SetShirtStyle(25);
|
|
m_Character->SetEyebrows(30);
|
|
m_Character->SetEyes(35);
|
|
m_Character->SetMouth(40);
|
|
}
|
|
|
|
void TearDown() override {
|
|
TearDownDependencies();
|
|
}
|
|
|
|
std::unique_ptr<User> m_User;
|
|
std::unique_ptr<Character> m_Character;
|
|
};
|
|
|
|
TEST_F(CharacterComponentTest, SerializeInitialUpdate) {
|
|
Entity testEntity(15, info);
|
|
CharacterComponent characterComponent(&testEntity, m_Character.get(), UNASSIGNED_SYSTEM_ADDRESS);
|
|
|
|
RakNet::BitStream bitStream;
|
|
characterComponent.Serialize(bitStream, true);
|
|
|
|
// Read the data manually to validate serialization format
|
|
bitStream.ResetReadPointer();
|
|
|
|
// Claim codes (4 codes)
|
|
for (int i = 0; i < 4; i++) {
|
|
bool hasClaimCode;
|
|
ASSERT_TRUE(bitStream.Read(hasClaimCode));
|
|
EXPECT_FALSE(hasClaimCode); // Default state
|
|
}
|
|
|
|
// Character appearance
|
|
uint32_t hairColor;
|
|
ASSERT_TRUE(bitStream.Read(hairColor));
|
|
EXPECT_EQ(hairColor, 5);
|
|
|
|
uint32_t hairStyle;
|
|
ASSERT_TRUE(bitStream.Read(hairStyle));
|
|
EXPECT_EQ(hairStyle, 10);
|
|
|
|
uint32_t head;
|
|
ASSERT_TRUE(bitStream.Read(head));
|
|
EXPECT_EQ(head, 0); // Default
|
|
|
|
uint32_t shirtColor;
|
|
ASSERT_TRUE(bitStream.Read(shirtColor));
|
|
EXPECT_EQ(shirtColor, 15);
|
|
|
|
uint32_t pantsColor;
|
|
ASSERT_TRUE(bitStream.Read(pantsColor));
|
|
EXPECT_EQ(pantsColor, 20);
|
|
|
|
uint32_t shirtStyle;
|
|
ASSERT_TRUE(bitStream.Read(shirtStyle));
|
|
EXPECT_EQ(shirtStyle, 25);
|
|
|
|
uint32_t headColor;
|
|
ASSERT_TRUE(bitStream.Read(headColor));
|
|
EXPECT_EQ(headColor, 0); // Default
|
|
|
|
uint32_t eyebrows;
|
|
ASSERT_TRUE(bitStream.Read(eyebrows));
|
|
EXPECT_EQ(eyebrows, 30);
|
|
|
|
uint32_t eyes;
|
|
ASSERT_TRUE(bitStream.Read(eyes));
|
|
EXPECT_EQ(eyes, 35);
|
|
|
|
uint32_t mouth;
|
|
ASSERT_TRUE(bitStream.Read(mouth));
|
|
EXPECT_EQ(mouth, 40);
|
|
|
|
uint64_t accountID;
|
|
ASSERT_TRUE(bitStream.Read(accountID));
|
|
EXPECT_EQ(accountID, 0); // Default since we can't set it directly
|
|
|
|
uint64_t lastLogin;
|
|
ASSERT_TRUE(bitStream.Read(lastLogin));
|
|
EXPECT_EQ(lastLogin, 0); // Default since we can't set it directly
|
|
|
|
uint64_t propModLastDisplayTime;
|
|
ASSERT_TRUE(bitStream.Read(propModLastDisplayTime));
|
|
EXPECT_EQ(propModLastDisplayTime, 0);
|
|
|
|
uint64_t uscore;
|
|
ASSERT_TRUE(bitStream.Read(uscore));
|
|
EXPECT_EQ(uscore, 0); // Default
|
|
|
|
bool freeToPlay;
|
|
ASSERT_TRUE(bitStream.Read(freeToPlay));
|
|
EXPECT_FALSE(freeToPlay); // Disabled in DLU
|
|
|
|
// Stats (23 total statistics)
|
|
for (int i = 0; i < 23; i++) {
|
|
uint64_t stat;
|
|
ASSERT_TRUE(bitStream.Read(stat));
|
|
EXPECT_EQ(stat, 0); // All default to 0
|
|
}
|
|
|
|
bool hasUnknownFlag;
|
|
ASSERT_TRUE(bitStream.Read(hasUnknownFlag));
|
|
EXPECT_FALSE(hasUnknownFlag); // Always writes 0
|
|
|
|
bool isLanding;
|
|
ASSERT_TRUE(bitStream.Read(isLanding));
|
|
EXPECT_FALSE(isLanding); // Default state
|
|
}
|
|
|
|
TEST_F(CharacterComponentTest, SerializeRegularUpdate) {
|
|
Entity testEntity(15, info);
|
|
CharacterComponent characterComponent(&testEntity, m_Character.get(), UNASSIGNED_SYSTEM_ADDRESS);
|
|
|
|
RakNet::BitStream bitStream;
|
|
characterComponent.Serialize(bitStream, false);
|
|
|
|
bitStream.ResetReadPointer();
|
|
|
|
// Should only have the dirty flags
|
|
bool dirtyGMInfo;
|
|
ASSERT_TRUE(bitStream.Read(dirtyGMInfo));
|
|
EXPECT_FALSE(dirtyGMInfo); // Default state
|
|
|
|
bool dirtyCurrentActivity;
|
|
ASSERT_TRUE(bitStream.Read(dirtyCurrentActivity));
|
|
EXPECT_FALSE(dirtyCurrentActivity); // Default state
|
|
|
|
bool dirtySocialInfo;
|
|
ASSERT_TRUE(bitStream.Read(dirtySocialInfo));
|
|
EXPECT_FALSE(dirtySocialInfo); // Default state
|
|
}
|
|
|
|
TEST_F(CharacterComponentTest, SerializeWithDirtyGMInfo) {
|
|
Entity testEntity(15, info);
|
|
CharacterComponent characterComponent(&testEntity, m_Character.get(), UNASSIGNED_SYSTEM_ADDRESS);
|
|
|
|
// Make GM info dirty
|
|
characterComponent.SetPvpEnabled(true);
|
|
characterComponent.SetGMLevel(eGameMasterLevel::JUNIOR_MODERATOR);
|
|
|
|
RakNet::BitStream bitStream;
|
|
characterComponent.Serialize(bitStream, false);
|
|
|
|
bitStream.ResetReadPointer();
|
|
|
|
bool dirtyGMInfo;
|
|
ASSERT_TRUE(bitStream.Read(dirtyGMInfo));
|
|
EXPECT_TRUE(dirtyGMInfo);
|
|
|
|
bool pvpEnabled;
|
|
ASSERT_TRUE(bitStream.Read(pvpEnabled));
|
|
EXPECT_TRUE(pvpEnabled);
|
|
|
|
bool isGM;
|
|
ASSERT_TRUE(bitStream.Read(isGM));
|
|
EXPECT_TRUE(isGM);
|
|
|
|
eGameMasterLevel gmLevel;
|
|
ASSERT_TRUE(bitStream.Read(gmLevel));
|
|
EXPECT_EQ(gmLevel, eGameMasterLevel::JUNIOR_MODERATOR);
|
|
|
|
bool editorEnabled;
|
|
ASSERT_TRUE(bitStream.Read(editorEnabled));
|
|
EXPECT_FALSE(editorEnabled); // Default
|
|
|
|
eGameMasterLevel editorLevel;
|
|
ASSERT_TRUE(bitStream.Read(editorLevel));
|
|
EXPECT_EQ(editorLevel, eGameMasterLevel::JUNIOR_MODERATOR); // Same as GM level
|
|
}
|
|
|
|
TEST_F(CharacterComponentTest, SerializeWithDirtyCurrentActivity) {
|
|
Entity testEntity(15, info);
|
|
CharacterComponent characterComponent(&testEntity, m_Character.get(), UNASSIGNED_SYSTEM_ADDRESS);
|
|
|
|
// Set current activity
|
|
characterComponent.SetCurrentActivity(eGameActivity::QUICKBUILDING);
|
|
|
|
RakNet::BitStream bitStream;
|
|
characterComponent.Serialize(bitStream, false);
|
|
|
|
bitStream.ResetReadPointer();
|
|
|
|
bool dirtyGMInfo;
|
|
ASSERT_TRUE(bitStream.Read(dirtyGMInfo));
|
|
EXPECT_FALSE(dirtyGMInfo);
|
|
|
|
bool dirtyCurrentActivity;
|
|
ASSERT_TRUE(bitStream.Read(dirtyCurrentActivity));
|
|
EXPECT_TRUE(dirtyCurrentActivity);
|
|
|
|
eGameActivity currentActivity;
|
|
ASSERT_TRUE(bitStream.Read(currentActivity));
|
|
EXPECT_EQ(currentActivity, eGameActivity::QUICKBUILDING);
|
|
}
|
|
|
|
TEST_F(CharacterComponentTest, SerializeWithClaimCodes) {
|
|
Entity testEntity(15, info);
|
|
CharacterComponent characterComponent(&testEntity, m_Character.get(), UNASSIGNED_SYSTEM_ADDRESS);
|
|
|
|
// Set some claim codes via character (need to access private members through Character class)
|
|
// This is more of a conceptual test since claim codes are loaded from XML
|
|
|
|
RakNet::BitStream bitStream;
|
|
characterComponent.Serialize(bitStream, true);
|
|
|
|
bitStream.ResetReadPointer();
|
|
|
|
// Verify claim codes are properly handled (even if they're default values)
|
|
for (int i = 0; i < 4; i++) {
|
|
bool hasClaimCode;
|
|
ASSERT_TRUE(bitStream.Read(hasClaimCode));
|
|
// In default state, all claim codes should be 0/false
|
|
EXPECT_FALSE(hasClaimCode);
|
|
}
|
|
} |