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
 

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
183{
184 return dbcChance * (checkProcRate / 100.0f);
185}

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   
)
114{
115 // Arcane Blast should always pass CheckProc, regardless of the roll result
116 for (int roll = 0; roll < 100; roll++)
117 {
119 << "Arcane Blast should always proc, but failed with roll=" << roll;
120 }
121}
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   
)
124{
125 float rate = RunStatisticalTest(MageSpellFlags::ARCANE_BLAST);
126 EXPECT_NEAR(rate, 100.0f, 0.01f) << "Arcane Blast should have 100% CheckProc pass rate";
127}

References MageSpellFlags::ARCANE_BLAST.

◆ TEST_F() [3/15]

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

References SimulateMissileBarrageCheckProc().

◆ TEST_F() [4/15]

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

References MageSpellFlags::ARCANE_MISSILES.

◆ TEST_F() [5/15]

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

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [6/15]

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

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [7/15]

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

◆ TEST_F() [8/15]

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

References CalculateEffectiveProcRate().

◆ TEST_F() [9/15]

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

References CalculateEffectiveProcRate().

◆ TEST_F() [10/15]

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

References CalculateEffectiveProcRate().

◆ TEST_F() [11/15]

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

References CalculateEffectiveProcRate().

◆ TEST_F() [12/15]

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

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [13/15]

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

References MageSpellFlags::FIREBALL, and SimulateMissileBarrageCheckProc().

◆ TEST_F() [14/15]

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

References MageSpellFlags::FIREBALL.

◆ TEST_F() [15/15]

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