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

Tests for smart proc trigger target resolution. More...

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

Go to the source code of this file.

Classes

class  SpellProcTargetResolutionTest
 

Functions

static UnitResolveProcTriggerTarget (Unit *triggerCaster, ProcEventInfo &eventInfo)
 Applies the smart targeting expression from SpellAuraEffects.cpp.
 
 TEST_F (SpellProcTargetResolutionTest, ActorSide_HitPhase_TargetsEnemy)
 
 TEST_F (SpellProcTargetResolutionTest, ActorSide_FinishPhase_ReturnsNullptr)
 
 TEST_F (SpellProcTargetResolutionTest, ActorSide_CastPhase_TargetsEnemy)
 
 TEST_F (SpellProcTargetResolutionTest, VictimSide_HitPhase_TargetsAttacker)
 
 TEST_F (SpellProcTargetResolutionTest, ActorSide_NullActionTarget_ReturnsNullptr)
 
 TEST_F (SpellProcTargetResolutionTest, VictimSide_NullActionTarget_StillReturnsActor)
 
 TEST_F (SpellProcTargetResolutionTest, SelfProc_ActorIsActionTarget)
 

Detailed Description

Tests for smart proc trigger target resolution.

Verifies the targeting expression used in HandleProcTriggerSpellAuraProc and HandleProcTriggerSpellWithValueAuraProc:

triggerTarget = (triggerCaster == actor) ? actionTarget : actor

This expression correctly resolves targets for all proc scenarios:

  • Actor-side HIT phase: triggerCaster==actor, returns enemy (actionTarget)
  • Actor-side FINISH phase: triggerCaster==actor, returns nullptr (actionTarget is nullptr because FINISH phase passes no victim)
  • Victim-side HIT phase: triggerCaster!=actor, returns attacker (actor)

Definition in file SpellProcTargetResolutionTest.cpp.

Function Documentation

◆ ResolveProcTriggerTarget()

static Unit * ResolveProcTriggerTarget ( Unit triggerCaster,
ProcEventInfo eventInfo 
)
static

Applies the smart targeting expression from SpellAuraEffects.cpp.

This mirrors the logic in HandleProcTriggerSpellAuraProc: Unit* triggerCaster = aurApp->GetTarget(); // the aura owner Unit* triggerTarget = triggerCaster == eventInfo.GetActor() ? eventInfo.GetActionTarget() : eventInfo.GetActor();

56{
57 return triggerCaster == eventInfo.GetActor()
58 ? eventInfo.GetActionTarget()
59 : eventInfo.GetActor();
60}
Unit * GetActionTarget() const
Definition Unit.h:460
Unit * GetActor()
Definition Unit.h:459

References ProcEventInfo::GetActionTarget(), and ProcEventInfo::GetActor().

Referenced by TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), and TEST_F().

◆ TEST_F() [1/7]

TEST_F ( SpellProcTargetResolutionTest  ,
ActorSide_CastPhase_TargetsEnemy   
)
109{
110 // Scenario: Actor-side CAST phase proc (e.g., Nature's Grace).
111 // actor=Rogue, actionTarget=Enemy
112 // triggerCaster == actor, returns actionTarget
113 auto eventInfo = ProcEventInfoBuilder()
114 .WithActor(FAKE_ROGUE)
115 .WithActionTarget(FAKE_ENEMY)
118 .Build();
119
120 Unit* triggerCaster = FAKE_ROGUE;
121 Unit* result = ResolveProcTriggerTarget(triggerCaster, eventInfo);
122
123 EXPECT_EQ(result, FAKE_ENEMY);
124}
@ PROC_SPELL_PHASE_CAST
Definition SpellMgr.h:248
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG
Definition SpellMgr.h:134
static Unit * ResolveProcTriggerTarget(Unit *triggerCaster, ProcEventInfo &eventInfo)
Applies the smart targeting expression from SpellAuraEffects.cpp.
Definition SpellProcTargetResolutionTest.cpp:55
Builder class for creating ProcEventInfo test instances.
Definition ProcEventInfoHelper.h:31
ProcEventInfoBuilder & WithActionTarget(Unit *target)
Definition ProcEventInfoHelper.h:45
ProcEventInfoBuilder & WithSpellPhaseMask(uint32 spellPhaseMask)
Definition ProcEventInfoHelper.h:69
ProcEventInfoBuilder & WithActor(Unit *actor)
Definition ProcEventInfoHelper.h:39
ProcEventInfoBuilder & WithTypeMask(uint32 typeMask)
Definition ProcEventInfoHelper.h:57
ProcEventInfo Build()
Definition ProcEventInfoHelper.h:111
Definition Unit.h:664

References ProcEventInfoBuilder::Build(), PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG, PROC_SPELL_PHASE_CAST, ResolveProcTriggerTarget(), ProcEventInfoBuilder::WithActionTarget(), ProcEventInfoBuilder::WithActor(), ProcEventInfoBuilder::WithSpellPhaseMask(), and ProcEventInfoBuilder::WithTypeMask().

◆ TEST_F() [2/7]

TEST_F ( SpellProcTargetResolutionTest  ,
ActorSide_FinishPhase_ReturnsNullptr   
)
89{
90 // Scenario: Rogue has Ruthlessness aura, finishes Eviscerate.
91 // FINISH phase: actor=Rogue, actionTarget=nullptr (no victim passed)
92 // triggerCaster is the aura owner (Rogue), which == actor
93 // Result: returns nullptr (CastSpell handles this via implicit targeting)
94 auto eventInfo = ProcEventInfoBuilder()
95 .WithActor(FAKE_ROGUE)
96 .WithActionTarget(nullptr)
100 .Build();
101
102 Unit* triggerCaster = FAKE_ROGUE; // aura owner
103 Unit* result = ResolveProcTriggerTarget(triggerCaster, eventInfo);
104
105 EXPECT_EQ(result, nullptr);
106}
@ PROC_HIT_NORMAL
Definition SpellMgr.h:257
@ PROC_SPELL_PHASE_FINISH
Definition SpellMgr.h:250
@ PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS
Definition SpellMgr.h:116
ProcEventInfoBuilder & WithHitMask(uint32 hitMask)
Definition ProcEventInfoHelper.h:75

References ProcEventInfoBuilder::Build(), PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS, PROC_HIT_NORMAL, PROC_SPELL_PHASE_FINISH, ResolveProcTriggerTarget(), ProcEventInfoBuilder::WithActionTarget(), ProcEventInfoBuilder::WithActor(), ProcEventInfoBuilder::WithHitMask(), ProcEventInfoBuilder::WithSpellPhaseMask(), and ProcEventInfoBuilder::WithTypeMask().

◆ TEST_F() [3/7]

TEST_F ( SpellProcTargetResolutionTest  ,
ActorSide_HitPhase_TargetsEnemy   
)
69{
70 // Scenario: Rogue has Ruthlessness aura, casts Eviscerate on enemy.
71 // HIT phase: actor=Rogue, actionTarget=Enemy
72 // triggerCaster is the aura owner (Rogue), which == actor
73 // Result: returns actionTarget (Enemy)
74 auto eventInfo = ProcEventInfoBuilder()
75 .WithActor(FAKE_ROGUE)
76 .WithActionTarget(FAKE_ENEMY)
80 .Build();
81
82 Unit* triggerCaster = FAKE_ROGUE; // aura owner
83 Unit* result = ResolveProcTriggerTarget(triggerCaster, eventInfo);
84
85 EXPECT_EQ(result, FAKE_ENEMY);
86}
@ PROC_SPELL_PHASE_HIT
Definition SpellMgr.h:249

References ProcEventInfoBuilder::Build(), PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS, PROC_HIT_NORMAL, PROC_SPELL_PHASE_HIT, ResolveProcTriggerTarget(), ProcEventInfoBuilder::WithActionTarget(), ProcEventInfoBuilder::WithActor(), ProcEventInfoBuilder::WithHitMask(), ProcEventInfoBuilder::WithSpellPhaseMask(), and ProcEventInfoBuilder::WithTypeMask().

◆ TEST_F() [4/7]

TEST_F ( SpellProcTargetResolutionTest  ,
ActorSide_NullActionTarget_ReturnsNullptr   
)
155{
156 // Generic test: when actor-side proc has nullptr actionTarget,
157 // result is nullptr regardless of phase
158 auto eventInfo = ProcEventInfoBuilder()
159 .WithActor(FAKE_ROGUE)
160 .WithActionTarget(nullptr)
163 .Build();
164
165 Unit* triggerCaster = FAKE_ROGUE;
166 Unit* result = ResolveProcTriggerTarget(triggerCaster, eventInfo);
167
168 EXPECT_EQ(result, nullptr);
169}
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition SpellMgr.h:113

References ProcEventInfoBuilder::Build(), PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_HIT_NORMAL, ResolveProcTriggerTarget(), ProcEventInfoBuilder::WithActionTarget(), ProcEventInfoBuilder::WithActor(), ProcEventInfoBuilder::WithHitMask(), and ProcEventInfoBuilder::WithTypeMask().

◆ TEST_F() [5/7]

TEST_F ( SpellProcTargetResolutionTest  ,
SelfProc_ActorIsActionTarget   
)
189{
190 // Edge case: actor == actionTarget (self-damage/self-heal)
191 // triggerCaster == actor, returns actionTarget (which is also actor)
192 auto eventInfo = ProcEventInfoBuilder()
193 .WithActor(FAKE_ROGUE)
194 .WithActionTarget(FAKE_ROGUE)
198 .Build();
199
200 Unit* triggerCaster = FAKE_ROGUE;
201 Unit* result = ResolveProcTriggerTarget(triggerCaster, eventInfo);
202
203 EXPECT_EQ(result, FAKE_ROGUE);
204}
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition SpellMgr.h:131

References ProcEventInfoBuilder::Build(), PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_HIT_NORMAL, PROC_SPELL_PHASE_HIT, ResolveProcTriggerTarget(), ProcEventInfoBuilder::WithActionTarget(), ProcEventInfoBuilder::WithActor(), ProcEventInfoBuilder::WithHitMask(), ProcEventInfoBuilder::WithSpellPhaseMask(), and ProcEventInfoBuilder::WithTypeMask().

◆ TEST_F() [6/7]

TEST_F ( SpellProcTargetResolutionTest  ,
VictimSide_HitPhase_TargetsAttacker   
)
131{
132 // Scenario: Enemy has a "when hit" proc aura. Rogue hits Enemy.
133 // HIT phase: actor=Rogue (attacker), actionTarget=Enemy (victim)
134 // triggerCaster is the aura owner (Enemy), which != actor (Rogue)
135 // Result: returns actor (Rogue) — the attacker
136 auto eventInfo = ProcEventInfoBuilder()
137 .WithActor(FAKE_ROGUE)
138 .WithActionTarget(FAKE_ENEMY)
142 .Build();
143
144 Unit* triggerCaster = FAKE_ENEMY; // aura owner (victim)
145 Unit* result = ResolveProcTriggerTarget(triggerCaster, eventInfo);
146
147 EXPECT_EQ(result, FAKE_ROGUE);
148}
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition SpellMgr.h:114

References ProcEventInfoBuilder::Build(), PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, PROC_HIT_NORMAL, PROC_SPELL_PHASE_HIT, ResolveProcTriggerTarget(), ProcEventInfoBuilder::WithActionTarget(), ProcEventInfoBuilder::WithActor(), ProcEventInfoBuilder::WithHitMask(), ProcEventInfoBuilder::WithSpellPhaseMask(), and ProcEventInfoBuilder::WithTypeMask().

◆ TEST_F() [7/7]

TEST_F ( SpellProcTargetResolutionTest  ,
VictimSide_NullActionTarget_StillReturnsActor   
)
172{
173 // When victim-side proc has nullptr actionTarget, the expression
174 // still returns actor (the attacker) since triggerCaster != actor
175 auto eventInfo = ProcEventInfoBuilder()
176 .WithActor(FAKE_ROGUE)
177 .WithActionTarget(nullptr)
180 .Build();
181
182 Unit* triggerCaster = FAKE_ENEMY; // aura owner (victim), != actor
183 Unit* result = ResolveProcTriggerTarget(triggerCaster, eventInfo);
184
185 EXPECT_EQ(result, FAKE_ROGUE);
186}

References ProcEventInfoBuilder::Build(), PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, PROC_HIT_NORMAL, ResolveProcTriggerTarget(), ProcEventInfoBuilder::WithActionTarget(), ProcEventInfoBuilder::WithActor(), ProcEventInfoBuilder::WithHitMask(), and ProcEventInfoBuilder::WithTypeMask().