equipment_registry_test.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "render/equipment/equipment_registry.h"
  2. #include "render/equipment/i_equipment_renderer.h"
  3. #include <gtest/gtest.h>
  4. #include <memory>
  5. using namespace Render::GL;
  6. namespace {
  7. // Mock equipment renderer for testing
  8. class MockEquipmentRenderer : public IEquipmentRenderer {
  9. public:
  10. explicit MockEquipmentRenderer(std::string name) : m_name(std::move(name)) {}
  11. void render(const DrawContext & /*ctx*/, const BodyFrames & /*frames*/,
  12. const HumanoidPalette & /*palette*/,
  13. const HumanoidAnimationContext & /*anim*/,
  14. ISubmitter & /*submitter*/) override {
  15. // Mock implementation - does nothing
  16. }
  17. auto getName() const -> const std::string & { return m_name; }
  18. private:
  19. std::string m_name;
  20. };
  21. } // namespace
  22. class EquipmentRegistryTest : public ::testing::Test {
  23. protected:
  24. void SetUp() override {
  25. // Get fresh registry instance for each test
  26. registry = &EquipmentRegistry::instance();
  27. }
  28. EquipmentRegistry *registry = nullptr;
  29. };
  30. TEST_F(EquipmentRegistryTest, SingletonInstance) {
  31. auto &instance1 = EquipmentRegistry::instance();
  32. auto &instance2 = EquipmentRegistry::instance();
  33. // Verify same instance is returned
  34. EXPECT_EQ(&instance1, &instance2);
  35. }
  36. TEST_F(EquipmentRegistryTest, RegisterAndGetHelmet) {
  37. auto helmet = std::make_shared<MockEquipmentRenderer>("test_helmet");
  38. registry->register_equipment(EquipmentCategory::Helmet, "iron_helmet",
  39. helmet);
  40. auto retrieved = registry->get(EquipmentCategory::Helmet, "iron_helmet");
  41. ASSERT_NE(retrieved, nullptr);
  42. EXPECT_EQ(retrieved, helmet);
  43. }
  44. TEST_F(EquipmentRegistryTest, RegisterAndGetArmor) {
  45. auto armor = std::make_shared<MockEquipmentRenderer>("test_armor");
  46. registry->register_equipment(EquipmentCategory::Armor, "chainmail", armor);
  47. auto retrieved = registry->get(EquipmentCategory::Armor, "chainmail");
  48. ASSERT_NE(retrieved, nullptr);
  49. EXPECT_EQ(retrieved, armor);
  50. }
  51. TEST_F(EquipmentRegistryTest, RegisterAndGetWeapon) {
  52. auto weapon = std::make_shared<MockEquipmentRenderer>("test_weapon");
  53. registry->register_equipment(EquipmentCategory::Weapon, "longsword", weapon);
  54. auto retrieved = registry->get(EquipmentCategory::Weapon, "longsword");
  55. ASSERT_NE(retrieved, nullptr);
  56. EXPECT_EQ(retrieved, weapon);
  57. }
  58. TEST_F(EquipmentRegistryTest, GetNonExistentEquipment) {
  59. auto retrieved =
  60. registry->get(EquipmentCategory::Helmet, "non_existent_helmet");
  61. EXPECT_EQ(retrieved, nullptr);
  62. }
  63. TEST_F(EquipmentRegistryTest, HasEquipment) {
  64. auto helmet = std::make_shared<MockEquipmentRenderer>("test_helmet");
  65. registry->register_equipment(EquipmentCategory::Helmet, "steel_helmet",
  66. helmet);
  67. EXPECT_TRUE(registry->has(EquipmentCategory::Helmet, "steel_helmet"));
  68. EXPECT_FALSE(registry->has(EquipmentCategory::Helmet, "bronze_helmet"));
  69. EXPECT_FALSE(registry->has(EquipmentCategory::Armor, "steel_helmet"));
  70. }
  71. TEST_F(EquipmentRegistryTest, RegisterMultipleInSameCategory) {
  72. auto helmet1 = std::make_shared<MockEquipmentRenderer>("helmet_1");
  73. auto helmet2 = std::make_shared<MockEquipmentRenderer>("helmet_2");
  74. registry->register_equipment(EquipmentCategory::Helmet, "helmet_1", helmet1);
  75. registry->register_equipment(EquipmentCategory::Helmet, "helmet_2", helmet2);
  76. auto retrieved1 = registry->get(EquipmentCategory::Helmet, "helmet_1");
  77. auto retrieved2 = registry->get(EquipmentCategory::Helmet, "helmet_2");
  78. ASSERT_NE(retrieved1, nullptr);
  79. ASSERT_NE(retrieved2, nullptr);
  80. EXPECT_EQ(retrieved1, helmet1);
  81. EXPECT_EQ(retrieved2, helmet2);
  82. }
  83. TEST_F(EquipmentRegistryTest, RegisterAcrossDifferentCategories) {
  84. auto helmet = std::make_shared<MockEquipmentRenderer>("helmet");
  85. auto armor = std::make_shared<MockEquipmentRenderer>("armor");
  86. auto weapon = std::make_shared<MockEquipmentRenderer>("weapon");
  87. registry->register_equipment(EquipmentCategory::Helmet, "item_1", helmet);
  88. registry->register_equipment(EquipmentCategory::Armor, "item_2", armor);
  89. registry->register_equipment(EquipmentCategory::Weapon, "item_3", weapon);
  90. EXPECT_TRUE(registry->has(EquipmentCategory::Helmet, "item_1"));
  91. EXPECT_TRUE(registry->has(EquipmentCategory::Armor, "item_2"));
  92. EXPECT_TRUE(registry->has(EquipmentCategory::Weapon, "item_3"));
  93. EXPECT_FALSE(registry->has(EquipmentCategory::Helmet, "item_2"));
  94. EXPECT_FALSE(registry->has(EquipmentCategory::Armor, "item_1"));
  95. }
  96. TEST_F(EquipmentRegistryTest, RegisterNullRenderer) {
  97. registry->register_equipment(EquipmentCategory::Helmet, "null_helmet",
  98. nullptr);
  99. auto retrieved = registry->get(EquipmentCategory::Helmet, "null_helmet");
  100. EXPECT_EQ(retrieved, nullptr);
  101. EXPECT_FALSE(registry->has(EquipmentCategory::Helmet, "null_helmet"));
  102. }
  103. TEST_F(EquipmentRegistryTest, OverwriteExistingEquipment) {
  104. auto helmet1 = std::make_shared<MockEquipmentRenderer>("helmet_v1");
  105. auto helmet2 = std::make_shared<MockEquipmentRenderer>("helmet_v2");
  106. registry->register_equipment(EquipmentCategory::Helmet, "helmet", helmet1);
  107. registry->register_equipment(EquipmentCategory::Helmet, "helmet", helmet2);
  108. auto retrieved = registry->get(EquipmentCategory::Helmet, "helmet");
  109. ASSERT_NE(retrieved, nullptr);
  110. EXPECT_EQ(retrieved, helmet2); // Should get the second one
  111. }
  112. TEST_F(EquipmentRegistryTest, NationSpecificWeapons) {
  113. auto sword_carthage =
  114. std::make_shared<MockEquipmentRenderer>("sword_carthage");
  115. auto sword_roman = std::make_shared<MockEquipmentRenderer>("sword_roman");
  116. registry->register_equipment(EquipmentCategory::Weapon, "sword_carthage",
  117. sword_carthage);
  118. registry->register_equipment(EquipmentCategory::Weapon, "sword_roman",
  119. sword_roman);
  120. EXPECT_TRUE(registry->has(EquipmentCategory::Weapon, "sword_carthage"));
  121. EXPECT_TRUE(registry->has(EquipmentCategory::Weapon, "sword_roman"));
  122. auto retrieved_carthage =
  123. registry->get(EquipmentCategory::Weapon, "sword_carthage");
  124. auto retrieved_roman =
  125. registry->get(EquipmentCategory::Weapon, "sword_roman");
  126. ASSERT_NE(retrieved_carthage, nullptr);
  127. ASSERT_NE(retrieved_roman, nullptr);
  128. EXPECT_EQ(retrieved_carthage, sword_carthage);
  129. EXPECT_EQ(retrieved_roman, sword_roman);
  130. }