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

Unit tests for Missile Barrage (44404-44408) proc behavior. More...

#include "gtest/gtest.h"
#include "SpellInfo.h"
#include "SpellMgr.h"
#include "SharedDefines.h"

Go to the source code of this file.

Classes

class  MissileBarrageTest
 

Namespaces

namespace  MageSpellFlags
 Get the SpellFamilyFlags[0] for common Mage spells.
 

Functions

bool SimulateMissileBarrageCheckProc (uint32 spellFamilyFlags0, int rollResult)
 Simulates the CheckProc logic from spell_mage_missile_barrage.
 
 TEST_F (MissileBarrageTest, ArcaneBlast_AlwaysProcs_RegardlessOfRoll)
 
 TEST_F (MissileBarrageTest, ArcaneBlast_Returns100PercentRate)
 
 TEST_F (MissileBarrageTest, Fireball_ProcsOnLowRoll)
 
 TEST_F (MissileBarrageTest, Fireball_FailsOnHighRoll)
 
 TEST_F (MissileBarrageTest, Fireball_Returns50PercentRate)
 
 TEST_F (MissileBarrageTest, ArcaneMissiles_Returns50PercentRate)
 
 TEST_F (MissileBarrageTest, OtherSpells_Returns50PercentRate)
 
float CalculateEffectiveProcRate (float dbcChance, float checkProcRate)
 Calculate the effective proc rate combining DBC chance and CheckProc.
 
 TEST_F (MissileBarrageTest, EffectiveRate_ArcaneBlast_Rank5)
 
 TEST_F (MissileBarrageTest, EffectiveRate_Fireball_Rank5)
 
 TEST_F (MissileBarrageTest, EffectiveRate_ArcaneBlast_Rank1)
 
 TEST_F (MissileBarrageTest, EffectiveRate_Fireball_Rank1)
 
 TEST_F (MissileBarrageTest, DBCProcChances_MatchExpectedValues)
 
 TEST_F (MissileBarrageTest, BoundaryRoll_49_Succeeds)
 
 TEST_F (MissileBarrageTest, BoundaryRoll_50_Fails)
 
 TEST_F (MissileBarrageTest, ArcaneBlastFlag_ExactMatch)
 

Variables

constexpr uint32 MageSpellFlags::ARCANE_BLAST = 0x20000000
 
constexpr uint32 MageSpellFlags::ARCANE_MISSILES = 0x00000020
 
constexpr uint32 MageSpellFlags::FIREBALL = 0x00000001
 
constexpr uint32 MageSpellFlags::FROSTFIRE_BOLT = 0x00000000
 
constexpr uint32 MageSpellFlags::ARCANE_BARRAGE = 0x00000000
 

Detailed Description

Unit tests for Missile Barrage (44404-44408) proc behavior.

Missile Barrage talent should proc:

  • 100% chance when casting Arcane Blast (SpellFamilyFlags[0] & 0x20000000)
  • 50% reduced chance when casting other spells (Arcane Barrage, Frostfire Bolt, etc.)

DBC Base proc chances by rank:

  • Rank 1 (44404): 4%
  • Rank 2 (44405): 8%
  • Rank 3 (44406): 12%
  • Rank 4 (44407): 16%
  • Rank 5 (44408): 20%

Effective proc rates:

  • Arcane Blast: Full DBC chance (4-20%)
  • Other spells: 50% of DBC chance (2-10%)

Definition in file SpellScriptMissileBarrageTest.cpp.

Function Documentation

◆ CalculateEffectiveProcRate()

float CalculateEffectiveProcRate ( float  dbcChance,
float  checkProcRate 
)

Calculate the effective proc rate combining DBC chance and CheckProc.

Parameters
dbcChanceBase proc chance from DBC (e.g., 20 for rank 5)
checkProcRateCheckProc pass rate (100 for Arcane Blast, 50 for others)
Returns
Effective proc rate as percentage
185{
186 return dbcChance * (checkProcRate / 100.0f);
187}

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

◆ SimulateMissileBarrageCheckProc()

bool SimulateMissileBarrageCheckProc ( uint32  spellFamilyFlags0,
int  rollResult 
)

Simulates the CheckProc logic from spell_mage_missile_barrage.

This mirrors the actual script at: src/server/scripts/Spells/spell_mage.cpp:1325-1338

Parameters
spellFamilyFlags0The SpellFamilyFlags[0] of the triggering spell
rollResultThe result of roll_chance_i(50) - pass 0-49 to succeed, 50-99 to fail
Returns
true if the proc check passes
58{
59 // Arcane Blast - full proc chance (100%)
60 // Arcane Blast spell family flags: 0x20000000
61 if (spellFamilyFlags0 & 0x20000000)
62 return true;
63
64 // Other spells - 50% proc chance
65 // Simulates: return roll_chance_i(50);
66 return rollResult < 50;
67}

Referenced by MissileBarrageTest::RunStatisticalTest(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), and TEST_F().

◆ TEST_F() [1/15]

TEST_F ( MissileBarrageTest  ,
ArcaneBlast_AlwaysProcs_RegardlessOfRoll   
)
116{
117 // Arcane Blast should always pass CheckProc, regardless of the roll result
118 for (int roll = 0; roll < 100; roll++)
119 {
121 << "Arcane Blast should always proc, but failed with roll=" << roll;
122 }
123}
bool SimulateMissileBarrageCheckProc(uint32 spellFamilyFlags0, int rollResult)
Simulates the CheckProc logic from spell_mage_missile_barrage.
Definition SpellScriptMissileBarrageTest.cpp:57
constexpr uint32 ARCANE_BLAST
Definition SpellScriptMissileBarrageTest.cpp:74

References MageSpellFlags::ARCANE_BLAST, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [2/15]

TEST_F ( MissileBarrageTest  ,
ArcaneBlast_Returns100PercentRate   
)
126{
127 float rate = RunStatisticalTest(MageSpellFlags::ARCANE_BLAST);
128 EXPECT_NEAR(rate, 100.0f, 0.01f) << "Arcane Blast should have 100% CheckProc pass rate";
129}

References MageSpellFlags::ARCANE_BLAST.

◆ TEST_F() [3/15]

TEST_F ( MissileBarrageTest  ,
ArcaneBlastFlag_ExactMatch   
)
266{
267 // Test that exactly the Arcane Blast flag triggers 100% rate
268 EXPECT_TRUE(SimulateMissileBarrageCheckProc(0x20000000, 99));
269
270 // Combined flags should also work if Arcane Blast is present
271 EXPECT_TRUE(SimulateMissileBarrageCheckProc(0x20000001, 99));
272 EXPECT_TRUE(SimulateMissileBarrageCheckProc(0x20000020, 99));
273 EXPECT_TRUE(SimulateMissileBarrageCheckProc(0xFFFFFFFF, 99));
274}

References SimulateMissileBarrageCheckProc().

◆ TEST_F() [4/15]

TEST_F ( MissileBarrageTest  ,
ArcaneMissiles_Returns50PercentRate   
)
162{
163 float rate = RunStatisticalTest(MageSpellFlags::ARCANE_MISSILES);
164 EXPECT_NEAR(rate, 50.0f, 0.01f) << "Arcane Missiles should have 50% CheckProc pass rate";
165}
constexpr uint32 ARCANE_MISSILES
Definition SpellScriptMissileBarrageTest.cpp:75

References MageSpellFlags::ARCANE_MISSILES.

◆ TEST_F() [5/15]

TEST_F ( MissileBarrageTest  ,
BoundaryRoll_49_Succeeds   
)
254{
255 // Roll of 49 should succeed (< 50)
257}
constexpr uint32 FIREBALL
Definition SpellScriptMissileBarrageTest.cpp:76

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [6/15]

TEST_F ( MissileBarrageTest  ,
BoundaryRoll_50_Fails   
)
260{
261 // Roll of 50 should fail (>= 50)
263}

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [7/15]

TEST_F ( MissileBarrageTest  ,
DBCProcChances_MatchExpectedValues   
)
222{
223 // Expected DBC proc chances for each rank
224 // Note: These should match the actual DBC values
225 struct RankData
226 {
227 uint32 spellId;
228 int expectedChance;
229 };
230
231 std::vector<RankData> ranks = {
232 { 44404, 4 }, // Rank 1: 4% (actually 8% in some versions)
233 { 44405, 8 }, // Rank 2
234 { 44406, 12 }, // Rank 3
235 { 44407, 16 }, // Rank 4
236 { 44408, 20 }, // Rank 5
237 };
238
239 // This documents the expected values - actual verification would require SpellMgr
240 for (auto const& rank : ranks)
241 {
242 SCOPED_TRACE("Spell ID: " + std::to_string(rank.spellId));
243 // The actual DBC lookup would be:
244 // SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(rank.spellId);
245 // EXPECT_EQ(spellInfo->ProcChance, rank.expectedChance);
246 }
247}
std::uint32_t uint32
Definition Define.h:107

◆ TEST_F() [8/15]

TEST_F ( MissileBarrageTest  ,
EffectiveRate_ArcaneBlast_Rank1   
)
204{
205 // Rank 1: 4% base chance * 100% CheckProc = 4% effective
206 float effective = CalculateEffectiveProcRate(4.0f, 100.0f);
207 EXPECT_NEAR(effective, 4.0f, 0.01f);
208}
float CalculateEffectiveProcRate(float dbcChance, float checkProcRate)
Calculate the effective proc rate combining DBC chance and CheckProc.
Definition SpellScriptMissileBarrageTest.cpp:184

References CalculateEffectiveProcRate().

◆ TEST_F() [9/15]

TEST_F ( MissileBarrageTest  ,
EffectiveRate_ArcaneBlast_Rank5   
)
190{
191 // Rank 5: 20% base chance * 100% CheckProc = 20% effective
192 float effective = CalculateEffectiveProcRate(20.0f, 100.0f);
193 EXPECT_NEAR(effective, 20.0f, 0.01f);
194}

References CalculateEffectiveProcRate().

◆ TEST_F() [10/15]

TEST_F ( MissileBarrageTest  ,
EffectiveRate_Fireball_Rank1   
)
211{
212 // Rank 1: 4% base chance * 50% CheckProc = 2% effective
213 float effective = CalculateEffectiveProcRate(4.0f, 50.0f);
214 EXPECT_NEAR(effective, 2.0f, 0.01f);
215}

References CalculateEffectiveProcRate().

◆ TEST_F() [11/15]

TEST_F ( MissileBarrageTest  ,
EffectiveRate_Fireball_Rank5   
)
197{
198 // Rank 5: 20% base chance * 50% CheckProc = 10% effective
199 float effective = CalculateEffectiveProcRate(20.0f, 50.0f);
200 EXPECT_NEAR(effective, 10.0f, 0.01f);
201}

References CalculateEffectiveProcRate().

◆ TEST_F() [12/15]

TEST_F ( MissileBarrageTest  ,
Fireball_FailsOnHighRoll   
)
146{
147 // Rolls 50-99 should fail
148 for (int roll = 50; roll < 100; roll++)
149 {
151 << "Fireball should NOT proc with roll=" << roll << " (>= 50)";
152 }
153}

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [13/15]

TEST_F ( MissileBarrageTest  ,
Fireball_ProcsOnLowRoll   
)
136{
137 // Rolls 0-49 should succeed
138 for (int roll = 0; roll < 50; roll++)
139 {
141 << "Fireball should proc with roll=" << roll << " (< 50)";
142 }
143}

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [14/15]

TEST_F ( MissileBarrageTest  ,
Fireball_Returns50PercentRate   
)
156{
157 float rate = RunStatisticalTest(MageSpellFlags::FIREBALL);
158 EXPECT_NEAR(rate, 50.0f, 0.01f) << "Fireball should have 50% CheckProc pass rate";
159}

References MageSpellFlags::FIREBALL.

◆ TEST_F() [15/15]

TEST_F ( MissileBarrageTest  ,
OtherSpells_Returns50PercentRate   
)
168{
169 // Any spell that doesn't have the Arcane Blast flag should get 50% rate
170 float rate = RunStatisticalTest(0x00000000);
171 EXPECT_NEAR(rate, 50.0f, 0.01f) << "Other spells should have 50% CheckProc pass rate";
172}