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

Unit tests for SPELLMOD_PROC_PER_MINUTE modifier application. More...

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

Go to the source code of this file.

Classes

class  SpellProcPPMModifierTest
 

Functions

 TEST_F (SpellProcPPMModifierTest, BasePPM_NoModifiers)
 
 TEST_F (SpellProcPPMModifierTest, BasePPM_DifferentWeaponSpeeds)
 
 TEST_F (SpellProcPPMModifierTest, BasePPM_ZeroPPM)
 
 TEST_F (SpellProcPPMModifierTest, BasePPM_NegativePPM)
 
 TEST_F (SpellProcPPMModifierTest, FlatModifier_IncreasesPPM)
 
 TEST_F (SpellProcPPMModifierTest, FlatModifier_DecreasesPPM)
 
 TEST_F (SpellProcPPMModifierTest, FlatModifier_ReducesToZero)
 
 TEST_F (SpellProcPPMModifierTest, PercentModifier_50PercentIncrease)
 
 TEST_F (SpellProcPPMModifierTest, PercentModifier_50PercentDecrease)
 
 TEST_F (SpellProcPPMModifierTest, PercentModifier_DoublesPPM)
 
 TEST_F (SpellProcPPMModifierTest, CombinedModifiers_FlatThenPercent)
 
 TEST_F (SpellProcPPMModifierTest, CombinedModifiers_BothIncrease)
 
 TEST_F (SpellProcPPMModifierTest, NoSpellModOwner_ModifiersIgnored)
 
 TEST_F (SpellProcPPMModifierTest, NoSpellProto_ModifiersIgnored)
 
 TEST_F (SpellProcPPMModifierTest, Scenario_OmenOfClarity_BasePPM)
 
 TEST_F (SpellProcPPMModifierTest, Scenario_OmenOfClarity_WithTalent)
 
 TEST_F (SpellProcPPMModifierTest, Scenario_WindfuryWeapon_FastWeapon)
 
 TEST_F (SpellProcPPMModifierTest, Scenario_WindfuryWeapon_SlowWeapon)
 
 TEST_F (SpellProcPPMModifierTest, Scenario_JudgementOfLight_HighPPM)
 
 TEST_F (SpellProcPPMModifierTest, EdgeCase_VeryFastWeapon)
 
 TEST_F (SpellProcPPMModifierTest, EdgeCase_VerySlowWeapon)
 
 TEST_F (SpellProcPPMModifierTest, EdgeCase_VeryHighPPM)
 
 TEST_F (SpellProcPPMModifierTest, EdgeCase_ZeroWeaponSpeed)
 

Detailed Description

Unit tests for SPELLMOD_PROC_PER_MINUTE modifier application.

Tests the logic from Unit.cpp:10378-10390:

  • Base PPM calculation without modifiers
  • Flat PPM modifier application
  • Percent PPM modifier application
  • GetSpellModOwner() null handling
  • SpellProto null handling

Definition in file SpellProcPPMModifierTest.cpp.

Function Documentation

◆ TEST_F() [1/23]

TEST_F ( SpellProcPPMModifierTest  ,
BasePPM_DifferentWeaponSpeeds   
)
67{
69 float basePPM = 6.0f;
70
71 // Fast dagger: (1400 * 6) / 600 = 14%
73 DAGGER_SPEED, basePPM, config);
74 EXPECT_NEAR(daggerChance, 14.0f, 0.01f);
75
76 // Slow 2H: (3300 * 6) / 600 = 33%
78 TWO_HANDED_SPEED, basePPM, config);
79 EXPECT_NEAR(twoHandChance, 33.0f, 0.01f);
80}
static float CalculatePPMChanceWithModifiers(uint32 weaponSpeed, float basePPM, PPMModifierConfig const &modConfig)
Calculate PPM chance with spell modifiers Simulates GetPPMProcChance() with SPELLMOD_PROC_PER_MINUTE.
Definition ProcChanceTestHelper.h:381
PPM modifier configuration for testing SPELLMOD_PROC_PER_MINUTE.
Definition ProcChanceTestHelper.h:370

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [2/23]

TEST_F ( SpellProcPPMModifierTest  ,
BasePPM_NegativePPM   
)
94{
96
98 SWORD_SPEED, -5.0f, config);
99
100 EXPECT_EQ(chance, 0.0f)
101 << "Negative PPM should return 0% chance";
102}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [3/23]

TEST_F ( SpellProcPPMModifierTest  ,
BasePPM_NoModifiers   
)
52{
54 // Default config: no modifiers, has spell mod owner and spell proto
55
56 float basePPM = 6.0f;
57
58 // With 2500ms weapon: (2500 * 6) / 600 = 25%
60 SWORD_SPEED, basePPM, config);
61
62 EXPECT_NEAR(chance, 25.0f, 0.01f)
63 << "Base PPM 6.0 with 2.5s weapon should give 25% chance";
64}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [4/23]

TEST_F ( SpellProcPPMModifierTest  ,
BasePPM_ZeroPPM   
)
83{
85
87 SWORD_SPEED, 0.0f, config);
88
89 EXPECT_EQ(chance, 0.0f)
90 << "Zero PPM should return 0% chance";
91}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [5/23]

TEST_F ( SpellProcPPMModifierTest  ,
CombinedModifiers_BothIncrease   
)
227{
229 config.flatModifier = 4.0f; // +4 PPM
230 config.pctModifier = 1.25f; // 25% increase
231
232 float basePPM = 6.0f;
233 // Flat first: 6 + 4 = 10
234 // Percent: 10 * 1.25 = 12.5
235 // Chance: (2500 * 12.5) / 600 = 52.08%
237 SWORD_SPEED, basePPM, config);
238
239 EXPECT_NEAR(chance, 52.08f, 0.1f);
240}
float flatModifier
Definition ProcChanceTestHelper.h:371
float pctModifier
Definition ProcChanceTestHelper.h:372

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), ProcChanceTestHelper::PPMModifierConfig::flatModifier, and ProcChanceTestHelper::PPMModifierConfig::pctModifier.

◆ TEST_F() [6/23]

TEST_F ( SpellProcPPMModifierTest  ,
CombinedModifiers_FlatThenPercent   
)
210{
212 config.flatModifier = 2.0f; // +2 PPM first
213 config.pctModifier = 1.5f; // Then 50% increase
214
215 float basePPM = 6.0f;
216 // Flat first: 6 + 2 = 8
217 // Percent: 8 * 1.5 = 12
218 // Chance: (2500 * 12) / 600 = 50%
220 SWORD_SPEED, basePPM, config);
221
222 EXPECT_NEAR(chance, 50.0f, 0.1f)
223 << "Flat +2 then 50% increase should result in 50% chance";
224}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), ProcChanceTestHelper::PPMModifierConfig::flatModifier, and ProcChanceTestHelper::PPMModifierConfig::pctModifier.

◆ TEST_F() [7/23]

TEST_F ( SpellProcPPMModifierTest  ,
EdgeCase_VeryFastWeapon   
)
357{
359
360 // 1.0s weapon (very fast): (1000 * 6) / 600 = 10%
362 1000, 6.0f, config);
363
364 EXPECT_NEAR(chance, 10.0f, 0.1f);
365}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [8/23]

TEST_F ( SpellProcPPMModifierTest  ,
EdgeCase_VeryHighPPM   
)
379{
381
382 // 60 PPM: (2500 * 60) / 600 = 250% (over 100%, can happen)
384 SWORD_SPEED, 60.0f, config);
385
386 EXPECT_NEAR(chance, 250.0f, 0.1f)
387 << "Very high PPM can exceed 100% chance";
388}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [9/23]

TEST_F ( SpellProcPPMModifierTest  ,
EdgeCase_VerySlowWeapon   
)
368{
370
371 // 4.0s weapon (very slow): (4000 * 6) / 600 = 40%
373 4000, 6.0f, config);
374
375 EXPECT_NEAR(chance, 40.0f, 0.1f);
376}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [10/23]

TEST_F ( SpellProcPPMModifierTest  ,
EdgeCase_ZeroWeaponSpeed   
)
391{
393
394 // Zero weapon speed should result in 0%
396 0, 6.0f, config);
397
398 EXPECT_EQ(chance, 0.0f);
399}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [11/23]

TEST_F ( SpellProcPPMModifierTest  ,
FlatModifier_DecreasesPPM   
)
124{
126 config.flatModifier = -3.0f; // -3 PPM
127
128 float basePPM = 6.0f;
129 // Modified PPM: 6 - 3 = 3
130 // Chance: (2500 * 3) / 600 = 12.5%
132 SWORD_SPEED, basePPM, config);
133
134 EXPECT_NEAR(chance, 12.5f, 0.1f)
135 << "Flat -3 PPM modifier should decrease chance from 25% to 12.5%";
136}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), and ProcChanceTestHelper::PPMModifierConfig::flatModifier.

◆ TEST_F() [12/23]

TEST_F ( SpellProcPPMModifierTest  ,
FlatModifier_IncreasesPPM   
)
109{
111 config.flatModifier = 2.0f; // +2 PPM
112
113 float basePPM = 6.0f;
114 // Modified PPM: 6 + 2 = 8
115 // Chance: (2500 * 8) / 600 = 33.33%
117 SWORD_SPEED, basePPM, config);
118
119 EXPECT_NEAR(chance, 33.33f, 0.1f)
120 << "Flat +2 PPM modifier should increase chance from 25% to 33.33%";
121}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), and ProcChanceTestHelper::PPMModifierConfig::flatModifier.

◆ TEST_F() [13/23]

TEST_F ( SpellProcPPMModifierTest  ,
FlatModifier_ReducesToZero   
)
139{
141 config.flatModifier = -10.0f; // Would reduce to -4 PPM
142
143 float basePPM = 6.0f;
144 // Modified PPM: 6 - 10 = -4 (negative)
145 // Formula still applies: (2500 * -4) / 600 = negative
146 // But the check at start for PPM <= 0 happens before modifiers
148 SWORD_SPEED, basePPM, config);
149
150 // Note: In the real code, negative results are possible after modifiers
151 // The helper doesn't clamp the final result
152 EXPECT_LT(chance, 0.0f)
153 << "Extreme negative modifier can produce negative chance";
154}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), and ProcChanceTestHelper::PPMModifierConfig::flatModifier.

◆ TEST_F() [14/23]

TEST_F ( SpellProcPPMModifierTest  ,
NoSpellModOwner_ModifiersIgnored   
)
247{
249 config.hasSpellModOwner = false; // GetSpellModOwner() returns null
250 config.flatModifier = 10.0f; // Would significantly change result
251 config.pctModifier = 2.0f;
252
253 float basePPM = 6.0f;
254 // Without spell mod owner, modifiers are NOT applied
255 // Chance: (2500 * 6) / 600 = 25%
257 SWORD_SPEED, basePPM, config);
258
259 EXPECT_NEAR(chance, 25.0f, 0.1f)
260 << "Without spell mod owner, modifiers should be ignored";
261}
bool hasSpellModOwner
Definition ProcChanceTestHelper.h:373

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), ProcChanceTestHelper::PPMModifierConfig::flatModifier, ProcChanceTestHelper::PPMModifierConfig::hasSpellModOwner, and ProcChanceTestHelper::PPMModifierConfig::pctModifier.

◆ TEST_F() [15/23]

TEST_F ( SpellProcPPMModifierTest  ,
NoSpellProto_ModifiersIgnored   
)
268{
270 config.hasSpellProto = false; // spellProto is null
271 config.flatModifier = 10.0f;
272 config.pctModifier = 2.0f;
273
274 float basePPM = 6.0f;
275 // Without spell proto, modifiers are NOT applied
276 // Chance: (2500 * 6) / 600 = 25%
278 SWORD_SPEED, basePPM, config);
279
280 EXPECT_NEAR(chance, 25.0f, 0.1f)
281 << "Without spell proto, modifiers should be ignored";
282}
bool hasSpellProto
Definition ProcChanceTestHelper.h:374

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), ProcChanceTestHelper::PPMModifierConfig::flatModifier, ProcChanceTestHelper::PPMModifierConfig::hasSpellProto, and ProcChanceTestHelper::PPMModifierConfig::pctModifier.

◆ TEST_F() [16/23]

TEST_F ( SpellProcPPMModifierTest  ,
PercentModifier_50PercentDecrease   
)
176{
178 config.pctModifier = 0.5f; // 50% = 50% decrease
179
180 float basePPM = 6.0f;
181 // Modified PPM: 6 * 0.5 = 3
182 // Chance: (2500 * 3) / 600 = 12.5%
184 SWORD_SPEED, basePPM, config);
185
186 EXPECT_NEAR(chance, 12.5f, 0.1f)
187 << "50% PPM decrease should lower chance from 25% to 12.5%";
188}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), and ProcChanceTestHelper::PPMModifierConfig::pctModifier.

◆ TEST_F() [17/23]

TEST_F ( SpellProcPPMModifierTest  ,
PercentModifier_50PercentIncrease   
)
161{
163 config.pctModifier = 1.5f; // 150% = 50% increase
164
165 float basePPM = 6.0f;
166 // Modified PPM: 6 * 1.5 = 9
167 // Chance: (2500 * 9) / 600 = 37.5%
169 SWORD_SPEED, basePPM, config);
170
171 EXPECT_NEAR(chance, 37.5f, 0.1f)
172 << "50% PPM increase should raise chance from 25% to 37.5%";
173}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), and ProcChanceTestHelper::PPMModifierConfig::pctModifier.

◆ TEST_F() [18/23]

TEST_F ( SpellProcPPMModifierTest  ,
PercentModifier_DoublesPPM   
)
191{
193 config.pctModifier = 2.0f; // 200%
194
195 float basePPM = 6.0f;
196 // Modified PPM: 6 * 2 = 12
197 // Chance: (2500 * 12) / 600 = 50%
199 SWORD_SPEED, basePPM, config);
200
201 EXPECT_NEAR(chance, 50.0f, 0.1f)
202 << "100% PPM increase should double chance to 50%";
203}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), and ProcChanceTestHelper::PPMModifierConfig::pctModifier.

◆ TEST_F() [19/23]

TEST_F ( SpellProcPPMModifierTest  ,
Scenario_JudgementOfLight_HighPPM   
)
340{
341 // Judgement of Light: 15 PPM (very high)
343
345 SWORD_SPEED, 15.0f, config);
346
347 // (2500 * 15) / 600 = 62.5%
348 EXPECT_NEAR(chance, 62.5f, 0.1f)
349 << "Judgement of Light with 2.5s weapon";
350}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [20/23]

TEST_F ( SpellProcPPMModifierTest  ,
Scenario_OmenOfClarity_BasePPM   
)
289{
290 // Omen of Clarity: 6 PPM
292
294 SWORD_SPEED, 6.0f, config);
295
296 EXPECT_NEAR(chance, 25.0f, 0.1f)
297 << "Omen of Clarity base chance with 2.5s weapon";
298}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [21/23]

TEST_F ( SpellProcPPMModifierTest  ,
Scenario_OmenOfClarity_WithTalent   
)
301{
302 // Hypothetical talent that increases Omen of Clarity PPM by 2
304 config.flatModifier = 2.0f;
305
307 SWORD_SPEED, 6.0f, config);
308
309 EXPECT_NEAR(chance, 33.33f, 0.1f)
310 << "Omen of Clarity with +2 PPM talent";
311}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers(), and ProcChanceTestHelper::PPMModifierConfig::flatModifier.

◆ TEST_F() [22/23]

TEST_F ( SpellProcPPMModifierTest  ,
Scenario_WindfuryWeapon_FastWeapon   
)
314{
315 // Windfury Weapon: 2 PPM with fast weapon
317
318 // Fast 1.5s weapon: (1500 * 2) / 600 = 5%
320 1500, 2.0f, config);
321
322 EXPECT_NEAR(chance, 5.0f, 0.1f)
323 << "Windfury with 1.5s weapon";
324}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().

◆ TEST_F() [23/23]

TEST_F ( SpellProcPPMModifierTest  ,
Scenario_WindfuryWeapon_SlowWeapon   
)
327{
328 // Windfury Weapon: 2 PPM with slow weapon
330
331 // Slow 3.6s weapon: (3600 * 2) / 600 = 12%
333 3600, 2.0f, config);
334
335 EXPECT_NEAR(chance, 12.0f, 0.1f)
336 << "Windfury with 3.6s weapon";
337}

References ProcChanceTestHelper::CalculatePPMChanceWithModifiers().