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

Tests for spell immunity mechanics. More...

#include "gtest/gtest.h"
#include <array>
#include <cstdint>
#include "Unit.h"

Go to the source code of this file.

Functions

 TEST (SpellImmunityTest, HasOnlyDamageEffects_TrueForPureDamage)
 
 TEST (SpellImmunityTest, HasOnlyDamageEffects_FalseForDamagePlusAura)
 
 TEST (SpellImmunityTest, SpellImmunity_BlocksAllSpells)
 
 TEST (SpellImmunityTest, DamageImmunity_BlocksDamageOnlySpell)
 
 TEST (SpellImmunityTest, SelfInvulnerability_BlocksMeleeDamage)
 
 TEST (SpellImmunityTest, DamageImmunity_DoesNotMissMixedSpell)
 
 TEST (SpellImmunityTest, HandOfFreedomStyle_MovementImmunity_AllowsDamageBlocksSlow)
 
 TEST (SpellImmunityTest, NoMovementImmunity_FrostboltStyle_AppliesDamageAndSlow)
 
 TEST (SpellImmunityTest, CycloneLikeSpell_DivineShieldStyle_Immune)
 
 TEST (SpellImmunityTest, SpellImmunity_BlocksSlowOnlySpell)
 
 TEST (SpellImmunityTest, DamageImmunity_DoesNotBlockSlowOnlySpell)
 
 TEST (SpellImmunityTest, ImmunityMask_PartialOverlapDoesNotCount)
 
 TEST (SpellImmunityTest, ImmunityMask_FullCoverageAccepted)
 
 TEST (SpellImmunityTest, ImmunityMask_SupersetMatches)
 
 TEST (SpellImmunityTest, Bladestorm_ImmuneToStun)
 
 TEST (SpellImmunityTest, StunImmunity_DoesNotFullyBlockMixedSpell)
 

Detailed Description

Tests for spell immunity mechanics.

Definition in file SpellImmunityTest.cpp.

Function Documentation

◆ TEST() [1/16]

TEST ( SpellImmunityTest  ,
Bladestorm_ImmuneToStun   
)
346{
347 SpellDesc stunSpell;
348 stunSpell.effects[0] = {EFFECT_APPLY_AURA, AURA_MOD_STUN};
349
350 // without any special immunity the stun should land
351 EXPECT_EQ(ComputeSpellHitResult(false, false, stunSpell), SPELL_MISS_NONE);
352
353 // with a bladestorm‑style stun immunity it is blocked
354 EXPECT_EQ(ComputeSpellHitResult(false, false, stunSpell, true), SPELL_MISS_IMMUNE);
355}
@ SPELL_MISS_IMMUNE
Definition SharedDefines.h:1532
@ SPELL_MISS_NONE
Definition SharedDefines.h:1525

References SPELL_MISS_IMMUNE, and SPELL_MISS_NONE.

◆ TEST() [2/16]

TEST ( SpellImmunityTest  ,
CycloneLikeSpell_DivineShieldStyle_Immune   
)
286{
287 SpellDesc cycloneLike = MakeCycloneLikeSpell();
288
289 EXPECT_EQ(ComputeSpellHitResult(true, false, cycloneLike), SPELL_MISS_IMMUNE);
290}

References SPELL_MISS_IMMUNE.

◆ TEST() [3/16]

TEST ( SpellImmunityTest  ,
DamageImmunity_BlocksDamageOnlySpell   
)
237{
238 SpellDesc damageOnly = MakeDamageOnlySpell();
239
240 EXPECT_EQ(ComputeSpellHitResult(false, true, damageOnly), SPELL_MISS_IMMUNE);
241}

References SPELL_MISS_IMMUNE.

◆ TEST() [4/16]

TEST ( SpellImmunityTest  ,
DamageImmunity_DoesNotBlockSlowOnlySpell   
)
307{
308 SpellDesc slowOnly = MakeSlowOnlySpell();
309 EXPECT_EQ(ComputeSpellHitResult(false, true, slowOnly), SPELL_MISS_NONE);
310}

References SPELL_MISS_NONE.

◆ TEST() [5/16]

TEST ( SpellImmunityTest  ,
DamageImmunity_DoesNotMissMixedSpell   
)
257{
258 // This is the key fix: damage immunity must not force SPELL_MISS_IMMUNE
259 // for mixed spells that include non-damage effects.
260 SpellDesc frostboltLike = MakeFrostboltLikeSpell();
261
262 EXPECT_EQ(ComputeSpellHitResult(false, true, frostboltLike), SPELL_MISS_NONE);
263}

References SPELL_MISS_NONE.

◆ TEST() [6/16]

TEST ( SpellImmunityTest  ,
HandOfFreedomStyle_MovementImmunity_AllowsDamageBlocksSlow   
)
266{
267 SpellDesc frostboltLike = MakeFrostboltLikeSpell();
268
269 EffectApplyResult result = ApplyEffectsWithMovementImmunity(frostboltLike, true);
270
271 EXPECT_TRUE(result.damageApplied);
272 EXPECT_FALSE(result.slowApplied);
273}

◆ TEST() [7/16]

TEST ( SpellImmunityTest  ,
HasOnlyDamageEffects_FalseForDamagePlusAura   
)
222{
223 SpellDesc spell = MakeFrostboltLikeSpell();
224 EXPECT_FALSE(HasOnlyDamageEffects(spell));
225}

◆ TEST() [8/16]

TEST ( SpellImmunityTest  ,
HasOnlyDamageEffects_TrueForPureDamage   
)
216{
217 SpellDesc spell = MakeDamageOnlySpell();
218 EXPECT_TRUE(HasOnlyDamageEffects(spell));
219}

◆ TEST() [9/16]

TEST ( SpellImmunityTest  ,
ImmunityMask_FullCoverageAccepted   
)
324{
325 SpellSchoolMask immune = SPELL_SCHOOL_MASK_MAGIC; // holy+spell
328
329 EXPECT_TRUE(Unit::IsImmuneMaskFully(immune, checkMagic));
330 EXPECT_TRUE(Unit::IsImmuneMaskFully(immune, checkSpell));
331}
SpellSchoolMask
Definition SharedDefines.h:283
@ SPELL_SCHOOL_MASK_MAGIC
Definition SharedDefines.h:300
@ SPELL_SCHOOL_MASK_SPELL
Definition SharedDefines.h:296
static bool IsImmuneMaskFully(SpellSchoolMask immuneMask, SpellSchoolMask schoolMask)
Definition Unit.h:1645

References Unit::IsImmuneMaskFully(), SPELL_SCHOOL_MASK_MAGIC, and SPELL_SCHOOL_MASK_SPELL.

◆ TEST() [10/16]

TEST ( SpellImmunityTest  ,
ImmunityMask_PartialOverlapDoesNotCount   
)
315{
318
319 // a frost-only immunity should *not* make you immune to all damage
320 EXPECT_FALSE(Unit::IsImmuneMaskFully(immune, checkAll));
321}
@ SPELL_SCHOOL_MASK_ALL
Definition SharedDefines.h:303
@ SPELL_SCHOOL_MASK_FROST
Definition SharedDefines.h:289

References Unit::IsImmuneMaskFully(), SPELL_SCHOOL_MASK_ALL, and SPELL_SCHOOL_MASK_FROST.

◆ TEST() [11/16]

TEST ( SpellImmunityTest  ,
ImmunityMask_SupersetMatches   
)
334{
337
338 EXPECT_TRUE(Unit::IsImmuneMaskFully(immune, checkMagic));
339}

References Unit::IsImmuneMaskFully(), SPELL_SCHOOL_MASK_ALL, and SPELL_SCHOOL_MASK_MAGIC.

◆ TEST() [12/16]

TEST ( SpellImmunityTest  ,
NoMovementImmunity_FrostboltStyle_AppliesDamageAndSlow   
)
276{
277 SpellDesc frostboltLike = MakeFrostboltLikeSpell();
278
279 EffectApplyResult result = ApplyEffectsWithMovementImmunity(frostboltLike, false);
280
281 EXPECT_TRUE(result.damageApplied);
282 EXPECT_TRUE(result.slowApplied);
283}

◆ TEST() [13/16]

TEST ( SpellImmunityTest  ,
SelfInvulnerability_BlocksMeleeDamage   
)
249{
250 SpellDesc meleeAttack = MakeDamageOnlySpell();
251 // simulate physical damage coming from a rogue melee ability
252
253 EXPECT_EQ(ComputeSpellHitResult(false, true, meleeAttack), SPELL_MISS_IMMUNE);
254}

References SPELL_MISS_IMMUNE.

◆ TEST() [14/16]

TEST ( SpellImmunityTest  ,
SpellImmunity_BlocksAllSpells   
)
228{
229 SpellDesc damageOnly = MakeDamageOnlySpell();
230 SpellDesc cycloneLike = MakeCycloneLikeSpell();
231
232 EXPECT_EQ(ComputeSpellHitResult(true, false, damageOnly), SPELL_MISS_IMMUNE);
233 EXPECT_EQ(ComputeSpellHitResult(true, false, cycloneLike), SPELL_MISS_IMMUNE);
234}

References SPELL_MISS_IMMUNE.

◆ TEST() [15/16]

TEST ( SpellImmunityTest  ,
SpellImmunity_BlocksSlowOnlySpell   
)
298{
299 SpellDesc slowOnly = MakeSlowOnlySpell();
300 EXPECT_EQ(ComputeSpellHitResult(true, false, slowOnly), SPELL_MISS_IMMUNE);
301}

References SPELL_MISS_IMMUNE.

◆ TEST() [16/16]

TEST ( SpellImmunityTest  ,
StunImmunity_DoesNotFullyBlockMixedSpell   
)
358{
359 SpellDesc mixedSpell;
360 mixedSpell.effects[0] = { EFFECT_SCHOOL_DAMAGE, AURA_NONE };
361 mixedSpell.effects[1] = { EFFECT_APPLY_AURA, AURA_MOD_STUN };
362
363 // This models partial immunity: stun effect is blocked, damage still hits.
364 EXPECT_TRUE(IsStunSpell(mixedSpell));
365 EXPECT_EQ(ComputeSpellHitResult(false, false, mixedSpell, true), SPELL_MISS_NONE);
366}

References SPELL_MISS_NONE.