AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
SpellProcEquipmentTest.cpp File Reference

Unit tests for equipment requirement validation in proc system. More...

#include "ProcChanceTestHelper.h"
#include "ProcEventInfoHelper.h"
#include "gtest/gtest.h"

Go to the source code of this file.

Classes

class  SpellProcEquipmentTest
 

Functions

 TEST_F (SpellProcEquipmentTest, NoEquipRequirement_AllowsProc)
 
 TEST_F (SpellProcEquipmentTest, NonPassiveAura_SkipsCheck)
 
 TEST_F (SpellProcEquipmentTest, NonPlayerTarget_SkipsCheck)
 
 TEST_F (SpellProcEquipmentTest, WeaponRequired_WithWeapon_AllowsProc)
 
 TEST_F (SpellProcEquipmentTest, WeaponRequired_NoWeapon_BlocksProc)
 
 TEST_F (SpellProcEquipmentTest, WeaponRequired_BrokenWeapon_BlocksProc)
 
 TEST_F (SpellProcEquipmentTest, WeaponRequired_WrongSubclass_BlocksProc)
 
 TEST_F (SpellProcEquipmentTest, ArmorRequired_WithArmor_AllowsProc)
 
 TEST_F (SpellProcEquipmentTest, ArmorRequired_NoArmor_BlocksProc)
 
 TEST_F (SpellProcEquipmentTest, ArmorRequired_BrokenArmor_BlocksProc)
 
 TEST_F (SpellProcEquipmentTest, FeralForm_WeaponProc_BlocksProc)
 
 TEST_F (SpellProcEquipmentTest, FeralForm_ArmorProc_AllowsProc)
 
 TEST_F (SpellProcEquipmentTest, NotInFeralForm_WeaponProc_AllowsProc)
 
 TEST_F (SpellProcEquipmentTest, NoEquipRequirementAttr_BypassesMissingItem)
 
 TEST_F (SpellProcEquipmentTest, NoEquipRequirementAttr_BypassesBrokenItem)
 
 TEST_F (SpellProcEquipmentTest, NoEquipRequirementAttr_BypassesFeralForm)
 
 TEST_F (SpellProcEquipmentTest, SlotMapping_BaseAttack_MainHand)
 
 TEST_F (SpellProcEquipmentTest, SlotMapping_OffAttack_OffHand)
 
 TEST_F (SpellProcEquipmentTest, SlotMapping_RangedAttack_Ranged)
 
 TEST_F (SpellProcEquipmentTest, SlotMapping_InvalidAttack_DefaultsToMainHand)
 
 TEST_F (SpellProcEquipmentTest, Scenario_WeaponEnchant_Fiery)
 
 TEST_F (SpellProcEquipmentTest, Scenario_WeaponEnchant_FieryOffhand)
 
 TEST_F (SpellProcEquipmentTest, Scenario_Hunter_RangedProc)
 
 TEST_F (SpellProcEquipmentTest, Scenario_FeralDruid_WeaponEnchant)
 
 TEST_F (SpellProcEquipmentTest, Scenario_BrokenWeapon_CombatUse)
 
 TEST_F (SpellProcEquipmentTest, Scenario_WrongWeaponType)
 
 TEST_F (SpellProcEquipmentTest, EdgeCase_AllConditionsMet)
 
 TEST_F (SpellProcEquipmentTest, EdgeCase_AllBlockingConditions)
 
 TEST_F (SpellProcEquipmentTest, EdgeCase_BypassOverridesAll)
 

Detailed Description

Unit tests for equipment requirement validation in proc system.

Tests the logic from SpellAuras.cpp:2260-2298:

  • Weapon class requirement validation
  • Armor class requirement validation
  • Attack type to slot mapping
  • Feral form blocking weapon procs
  • Broken item blocking procs
  • SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT bypass
  • Item subclass mask validation

TEST DESIGN: Configuration-Based Testing

These tests use EquipmentConfig structs to simulate different equipment scenarios without requiring actual game objects. Each test configures:

  • isPassive: Whether the aura is passive (equipment check only applies to passive)
  • isPlayer: Whether the target is a player (NPCs skip equipment checks)
  • equippedItemClass: ITEM_CLASS_WEAPON, ITEM_CLASS_ARMOR, or ITEM_CLASS_ANY
  • hasEquippedItem: Whether the required item slot has an item
  • itemIsBroken: Whether the equipped item is broken (0 durability)
  • itemFitsRequirements: Whether the item matches subclass mask requirements
  • isInFeralForm: Whether a druid is in cat/bear form (blocks weapon procs)
  • hasNoEquipRequirementAttr: SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT bypass

No GTEST_SKIP() is used in this file - all tests run with their configured

scenarios, testing both positive and negative cases explicitly.

Definition in file SpellProcEquipmentTest.cpp.

Function Documentation

◆ TEST_F() [1/29]

TEST_F ( SpellProcEquipmentTest  ,
ArmorRequired_BrokenArmor_BlocksProc   
)
189{
190 auto config = CreateArmorProcConfig();
191 config.itemIsBroken = true;
192
194 << "Broken armor should block proc";
195}
static bool ShouldBlockDueToEquipment(EquipmentConfig const &config)
Simulate equipment requirement check Returns true if proc should be blocked due to equipment requirem...
Definition ProcChanceTestHelper.h:445

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [2/29]

TEST_F ( SpellProcEquipmentTest  ,
ArmorRequired_NoArmor_BlocksProc   
)
180{
181 auto config = CreateArmorProcConfig();
182 config.hasEquippedItem = false;
183
185 << "Missing armor should block proc";
186}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [3/29]

TEST_F ( SpellProcEquipmentTest  ,
ArmorRequired_WithArmor_AllowsProc   
)
172{
173 auto config = CreateArmorProcConfig();
174
176 << "Armor requirement met should allow proc";
177}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [4/29]

TEST_F ( SpellProcEquipmentTest  ,
EdgeCase_AllBlockingConditions   
)
379{
380 auto config = CreateWeaponProcConfig();
381 // Multiple blocking conditions
382 config.hasEquippedItem = false;
383 config.itemIsBroken = true;
384 config.itemFitsRequirements = false;
385 config.isInFeralForm = true;
386
387 // Should be blocked (first check that fails)
389 << "Multiple blocking conditions should still block";
390}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [5/29]

TEST_F ( SpellProcEquipmentTest  ,
EdgeCase_AllConditionsMet   
)
363{
364 auto config = CreateWeaponProcConfig();
365 // All requirements met
366 config.isPassive = true;
367 config.isPlayer = true;
368 config.hasEquippedItem = true;
369 config.itemIsBroken = false;
370 config.itemFitsRequirements = true;
371 config.isInFeralForm = false;
372 config.hasNoEquipRequirementAttr = false;
373
375 << "All conditions met should allow proc";
376}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [6/29]

TEST_F ( SpellProcEquipmentTest  ,
EdgeCase_BypassOverridesAll   
)
393{
394 auto config = CreateWeaponProcConfig();
395 // Multiple blocking conditions BUT bypass is set
396 config.hasEquippedItem = false;
397 config.itemIsBroken = true;
398 config.itemFitsRequirements = false;
399 config.isInFeralForm = true;
400 config.hasNoEquipRequirementAttr = true; // Bypass
401
403 << "Bypass attribute should override all blocking conditions";
404}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [7/29]

TEST_F ( SpellProcEquipmentTest  ,
FeralForm_ArmorProc_AllowsProc   
)
211{
212 auto config = CreateArmorProcConfig();
213 config.isInFeralForm = true; // Druid in cat/bear form
214
216 << "Feral form should NOT block armor procs";
217}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [8/29]

TEST_F ( SpellProcEquipmentTest  ,
FeralForm_WeaponProc_BlocksProc   
)
202{
203 auto config = CreateWeaponProcConfig();
204 config.isInFeralForm = true; // Druid in cat/bear form
205
207 << "Feral form should block weapon procs";
208}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [9/29]

TEST_F ( SpellProcEquipmentTest  ,
NoEquipRequirement_AllowsProc   
)
94{
96 config.isPassive = true;
97 config.isPlayer = true;
99
101 << "No equipment requirement should allow proc";
102}
static constexpr int32 ITEM_CLASS_ANY
Definition ProcChanceTestHelper.h:412
Configuration for simulating equipment requirements.
Definition ProcChanceTestHelper.h:425
bool isPlayer
Definition ProcChanceTestHelper.h:427
int32 equippedItemClass
Definition ProcChanceTestHelper.h:428
bool isPassive
Definition ProcChanceTestHelper.h:426

References ProcChanceTestHelper::EquipmentConfig::equippedItemClass, ProcChanceTestHelper::EquipmentConfig::isPassive, ProcChanceTestHelper::EquipmentConfig::isPlayer, ProcChanceTestHelper::ITEM_CLASS_ANY, and ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [10/29]

TEST_F ( SpellProcEquipmentTest  ,
NoEquipRequirementAttr_BypassesBrokenItem   
)
243{
244 auto config = CreateWeaponProcConfig();
245 config.itemIsBroken = true; // Would normally block
246 config.hasNoEquipRequirementAttr = true;
247
249 << "NO_PROC_EQUIP_REQUIREMENT should bypass broken item check";
250}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [11/29]

TEST_F ( SpellProcEquipmentTest  ,
NoEquipRequirementAttr_BypassesFeralForm   
)
253{
254 auto config = CreateWeaponProcConfig();
255 config.isInFeralForm = true; // Would normally block
256 config.hasNoEquipRequirementAttr = true;
257
259 << "NO_PROC_EQUIP_REQUIREMENT should bypass feral form check";
260}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [12/29]

TEST_F ( SpellProcEquipmentTest  ,
NoEquipRequirementAttr_BypassesMissingItem   
)
233{
234 auto config = CreateWeaponProcConfig();
235 config.hasEquippedItem = false; // Would normally block
236 config.hasNoEquipRequirementAttr = true;
237
239 << "NO_PROC_EQUIP_REQUIREMENT should bypass missing item check";
240}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [13/29]

TEST_F ( SpellProcEquipmentTest  ,
NonPassiveAura_SkipsCheck   
)
105{
107 config.isPassive = false; // Not a passive aura
108 config.isPlayer = true;
110 config.hasEquippedItem = false; // Would normally block
111
113 << "Non-passive aura should skip equipment check";
114}
static constexpr int32 ITEM_CLASS_WEAPON
Item classes for equipment requirement checking.
Definition ProcChanceTestHelper.h:410
bool hasEquippedItem
Definition ProcChanceTestHelper.h:433

References ProcChanceTestHelper::EquipmentConfig::equippedItemClass, ProcChanceTestHelper::EquipmentConfig::hasEquippedItem, ProcChanceTestHelper::EquipmentConfig::isPassive, ProcChanceTestHelper::EquipmentConfig::isPlayer, ProcChanceTestHelper::ITEM_CLASS_WEAPON, and ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [14/29]

◆ TEST_F() [15/29]

TEST_F ( SpellProcEquipmentTest  ,
NotInFeralForm_WeaponProc_AllowsProc   
)
220{
221 auto config = CreateWeaponProcConfig();
222 config.isInFeralForm = false;
223
225 << "Non-feral form should allow weapon procs";
226}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [16/29]

TEST_F ( SpellProcEquipmentTest  ,
Scenario_BrokenWeapon_CombatUse   
)
339{
340 // Player's weapon breaks during combat
341 auto config = CreateWeaponProcConfig();
342 config.itemIsBroken = true;
343
345 << "Broken weapon procs should be blocked";
346}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [17/29]

TEST_F ( SpellProcEquipmentTest  ,
Scenario_FeralDruid_WeaponEnchant   
)
329{
330 // Druid with weapon enchant enters cat form
331 auto config = CreateWeaponProcConfig();
332 config.isInFeralForm = true;
333
335 << "Feral druid weapon enchant should be blocked";
336}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [18/29]

TEST_F ( SpellProcEquipmentTest  ,
Scenario_Hunter_RangedProc   
)
319{
320 // Hunter ranged weapon proc
321 auto config = CreateWeaponProcConfig();
322 config.attackType = ProcChanceTestHelper::RANGED_ATTACK;
323
325 << "Ranged proc with ranged weapon should work";
326}
static constexpr uint8 RANGED_ATTACK
Definition ProcChanceTestHelper.h:419

References ProcChanceTestHelper::RANGED_ATTACK, and ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [19/29]

TEST_F ( SpellProcEquipmentTest  ,
Scenario_WeaponEnchant_Fiery   
)
299{
300 // Fiery Weapon enchant - requires melee weapon
301 auto config = CreateWeaponProcConfig();
302 config.attackType = ProcChanceTestHelper::BASE_ATTACK;
303
305 << "Fiery Weapon with main hand should proc";
306}
static constexpr uint8 BASE_ATTACK
Attack types for weapon slot mapping.
Definition ProcChanceTestHelper.h:417

References ProcChanceTestHelper::BASE_ATTACK, and ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [20/29]

TEST_F ( SpellProcEquipmentTest  ,
Scenario_WeaponEnchant_FieryOffhand   
)
309{
310 // Fiery Weapon on off-hand
311 auto config = CreateWeaponProcConfig();
312 config.attackType = ProcChanceTestHelper::OFF_ATTACK;
313
315 << "Fiery Weapon with off hand should proc";
316}
static constexpr uint8 OFF_ATTACK
Definition ProcChanceTestHelper.h:418

References ProcChanceTestHelper::OFF_ATTACK, and ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [21/29]

TEST_F ( SpellProcEquipmentTest  ,
Scenario_WrongWeaponType   
)
349{
350 // Enchant requires sword but player has mace
351 auto config = CreateWeaponProcConfig();
352 config.itemFitsRequirements = false;
353
355 << "Wrong weapon type should block proc";
356}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [22/29]

TEST_F ( SpellProcEquipmentTest  ,
SlotMapping_BaseAttack_MainHand   
)
267{
269 EXPECT_EQ(slot, 15) // EQUIPMENT_SLOT_MAINHAND
270 << "BASE_ATTACK should map to main hand slot";
271}
std::uint8_t uint8
Definition Define.h:109
static uint8 GetWeaponSlotForAttackType(uint8 attackType)
Get equipment slot for attack type.
Definition ProcChanceTestHelper.h:480

References ProcChanceTestHelper::BASE_ATTACK, and ProcChanceTestHelper::GetWeaponSlotForAttackType().

◆ TEST_F() [23/29]

TEST_F ( SpellProcEquipmentTest  ,
SlotMapping_InvalidAttack_DefaultsToMainHand   
)
288{
290 EXPECT_EQ(slot, 15) // EQUIPMENT_SLOT_MAINHAND
291 << "Invalid attack type should default to main hand";
292}

References ProcChanceTestHelper::GetWeaponSlotForAttackType().

◆ TEST_F() [24/29]

TEST_F ( SpellProcEquipmentTest  ,
SlotMapping_OffAttack_OffHand   
)
274{
276 EXPECT_EQ(slot, 16) // EQUIPMENT_SLOT_OFFHAND
277 << "OFF_ATTACK should map to off hand slot";
278}

References ProcChanceTestHelper::GetWeaponSlotForAttackType(), and ProcChanceTestHelper::OFF_ATTACK.

◆ TEST_F() [25/29]

TEST_F ( SpellProcEquipmentTest  ,
SlotMapping_RangedAttack_Ranged   
)
281{
283 EXPECT_EQ(slot, 17) // EQUIPMENT_SLOT_RANGED
284 << "RANGED_ATTACK should map to ranged slot";
285}

References ProcChanceTestHelper::GetWeaponSlotForAttackType(), and ProcChanceTestHelper::RANGED_ATTACK.

◆ TEST_F() [26/29]

TEST_F ( SpellProcEquipmentTest  ,
WeaponRequired_BrokenWeapon_BlocksProc   
)
150{
151 auto config = CreateWeaponProcConfig();
152 config.itemIsBroken = true; // Weapon is broken
153
155 << "Broken weapon should block proc";
156}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [27/29]

TEST_F ( SpellProcEquipmentTest  ,
WeaponRequired_NoWeapon_BlocksProc   
)
141{
142 auto config = CreateWeaponProcConfig();
143 config.hasEquippedItem = false; // No weapon equipped
144
146 << "Missing weapon should block proc";
147}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [28/29]

TEST_F ( SpellProcEquipmentTest  ,
WeaponRequired_WithWeapon_AllowsProc   
)
133{
134 auto config = CreateWeaponProcConfig();
135
137 << "Weapon requirement met should allow proc";
138}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().

◆ TEST_F() [29/29]

TEST_F ( SpellProcEquipmentTest  ,
WeaponRequired_WrongSubclass_BlocksProc   
)
159{
160 auto config = CreateWeaponProcConfig();
161 config.itemFitsRequirements = false; // Wrong weapon type
162
164 << "Wrong weapon subclass should block proc";
165}

References ProcChanceTestHelper::ShouldBlockDueToEquipment().