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

Unit tests for proc charge and stack consumption. More...

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

Go to the source code of this file.

Classes

class  SpellProcChargeTest
 

Functions

 TEST_F (SpellProcChargeTest, ChargeDecrement_SingleCharge)
 
 TEST_F (SpellProcChargeTest, ChargeDecrement_MultipleCharges)
 
 TEST_F (SpellProcChargeTest, NoCharges_NoConsumption)
 
 TEST_F (SpellProcChargeTest, UseStacksForCharges_SingleStack)
 
 TEST_F (SpellProcChargeTest, UseStacksForCharges_MultipleStacks)
 
 TEST_F (SpellProcChargeTest, UseStacksForCharges_IgnoresCharges)
 
 TEST_F (SpellProcChargeTest, Scenario_HotStreak_3Charges)
 
 TEST_F (SpellProcChargeTest, Scenario_BladeBarrier_5Stacks)
 
 TEST_F (SpellProcChargeTest, Scenario_Maelstrom_5Stacks)
 
 TEST_F (SpellProcChargeTest, NullAura_SafeHandling)
 
 TEST_F (SpellProcChargeTest, ZeroStacks_WithUseStacksAttribute)
 
 TEST_F (SpellProcChargeTest, HighChargeCount)
 
 TEST_F (SpellProcChargeTest, ProcTestScenario_ChargeConsumption)
 
 TEST_F (SpellProcChargeTest, ProcTestScenario_StackConsumption)
 
 TEST_F (SpellProcChargeTest, ProcTestScenario_ChargesWithCooldown)
 

Detailed Description

Unit tests for proc charge and stack consumption.

Tests ConsumeProcCharges() behavior including:

  • Charge decrement on proc
  • Aura removal when charges exhausted
  • PROC_ATTR_USE_STACKS_FOR_CHARGES stack decrement
  • Multiple charge consumption scenarios

Definition in file SpellProcChargeTest.cpp.

Function Documentation

◆ TEST_F() [1/15]

TEST_F ( SpellProcChargeTest  ,
ChargeDecrement_MultipleCharges   
)
66{
67 auto aura = AuraStubBuilder()
68 .WithId(12345)
69 .WithCharges(5)
70 .Build();
71
72 auto procEntry = SpellProcEntryBuilder()
73 .WithChance(100.0f)
74 .Build();
75
76 // First consumption
77 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
78 EXPECT_EQ(aura->GetCharges(), 4);
79 EXPECT_FALSE(removed);
80 EXPECT_FALSE(aura->IsRemoved());
81
82 // Second consumption
83 removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
84 EXPECT_EQ(aura->GetCharges(), 3);
85 EXPECT_FALSE(removed);
86
87 // Third consumption
88 removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
89 EXPECT_EQ(aura->GetCharges(), 2);
90 EXPECT_FALSE(removed);
91
92 // Fourth consumption
93 removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
94 EXPECT_EQ(aura->GetCharges(), 1);
95 EXPECT_FALSE(removed);
96
97 // Final consumption - should remove aura
98 removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
99 EXPECT_EQ(aura->GetCharges(), 0);
100 EXPECT_TRUE(removed);
101 EXPECT_TRUE(aura->IsRemoved());
102}
Builder for creating AuraStub instances with fluent API.
Definition AuraStub.h:290
AuraStubBuilder & WithCharges(uint8_t charges)
Definition AuraStub.h:306
std::unique_ptr< AuraStub > Build()
Definition AuraStub.h:353
AuraStubBuilder & WithId(uint32_t id)
Definition AuraStub.h:294
static bool SimulateConsumeProcCharges(AuraStub *aura, SpellProcEntry const &procEntry)
Simulate charge consumption from ConsumeProcCharges()
Definition ProcChanceTestHelper.h:121
Builder class for creating SpellProcEntry test instances.
Definition ProcEventInfoHelper.h:141
SpellProcEntry Build() const
Definition ProcEventInfoHelper.h:226
SpellProcEntryBuilder & WithChance(float chance)
Definition ProcEventInfoHelper.h:208

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithCharges(), and AuraStubBuilder::WithId().

◆ TEST_F() [2/15]

TEST_F ( SpellProcChargeTest  ,
ChargeDecrement_SingleCharge   
)
47{
48 auto aura = AuraStubBuilder()
49 .WithId(12345)
50 .WithCharges(1)
51 .Build();
52
53 auto procEntry = SpellProcEntryBuilder()
54 .WithChance(100.0f)
55 .Build();
56
57 // Consume the single charge
58 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
59
60 EXPECT_EQ(aura->GetCharges(), 0);
61 EXPECT_TRUE(removed);
62 EXPECT_TRUE(aura->IsRemoved());
63}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithCharges(), and AuraStubBuilder::WithId().

◆ TEST_F() [3/15]

TEST_F ( SpellProcChargeTest  ,
HighChargeCount   
)
316{
317 auto aura = AuraStubBuilder()
318 .WithId(12345)
319 .WithCharges(255) // Max uint8
320 .Build();
321
322 auto procEntry = SpellProcEntryBuilder()
323 .WithChance(100.0f)
324 .Build();
325
326 // Consume one charge from max
327 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
328 EXPECT_EQ(aura->GetCharges(), 254);
329 EXPECT_FALSE(removed);
330}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithCharges(), and AuraStubBuilder::WithId().

◆ TEST_F() [4/15]

TEST_F ( SpellProcChargeTest  ,
NoCharges_NoConsumption   
)
105{
106 auto aura = AuraStubBuilder()
107 .WithId(12345)
108 .WithCharges(0)
109 .Build();
110
111 aura->SetUsingCharges(false);
112
113 auto procEntry = SpellProcEntryBuilder()
114 .WithChance(100.0f)
115 .Build();
116
117 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
118
119 EXPECT_EQ(aura->GetCharges(), 0);
120 EXPECT_FALSE(removed);
121 EXPECT_FALSE(aura->IsRemoved());
122}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithCharges(), and AuraStubBuilder::WithId().

◆ TEST_F() [5/15]

TEST_F ( SpellProcChargeTest  ,
NullAura_SafeHandling   
)
287{
288 auto procEntry = SpellProcEntryBuilder()
289 .WithChance(100.0f)
290 .Build();
291
292 // Should not crash
293 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(nullptr, procEntry);
294 EXPECT_FALSE(removed);
295}

References SpellProcEntryBuilder::Build(), ProcChanceTestHelper::SimulateConsumeProcCharges(), and SpellProcEntryBuilder::WithChance().

◆ TEST_F() [6/15]

TEST_F ( SpellProcChargeTest  ,
ProcTestScenario_ChargeConsumption   
)
337{
338 ProcTestScenario scenario;
339 scenario.WithAura(12345, 3); // 3 charges
340
341 auto procEntry = SpellProcEntryBuilder()
342 .WithChance(100.0f)
343 .Build();
344
345 // First proc - consumes charge
346 EXPECT_TRUE(scenario.SimulateProc(procEntry));
347 EXPECT_EQ(scenario.GetAura()->GetCharges(), 2);
348
349 // Second proc - consumes charge
350 EXPECT_TRUE(scenario.SimulateProc(procEntry));
351 EXPECT_EQ(scenario.GetAura()->GetCharges(), 1);
352
353 // Third proc - consumes last charge and removes aura
354 EXPECT_TRUE(scenario.SimulateProc(procEntry));
355 EXPECT_EQ(scenario.GetAura()->GetCharges(), 0);
356 EXPECT_TRUE(scenario.GetAura()->IsRemoved());
357}
Test context for proc simulation scenarios.
Definition ProcChanceTestHelper.h:613
ProcTestScenario & WithAura(uint32_t spellId, uint8_t charges=0, uint8_t stacks=1)
Definition ProcChanceTestHelper.h:644
std::unique_ptr< AuraStub > & GetAura()
Definition ProcChanceTestHelper.h:642
bool SimulateProc(SpellProcEntry const &procEntry, float rollResult=0.0f)
Definition ProcChanceTestHelper.h:654

References SpellProcEntryBuilder::Build(), ProcTestScenario::GetAura(), ProcTestScenario::SimulateProc(), ProcTestScenario::WithAura(), and SpellProcEntryBuilder::WithChance().

◆ TEST_F() [7/15]

TEST_F ( SpellProcChargeTest  ,
ProcTestScenario_ChargesWithCooldown   
)
384{
385 using namespace std::chrono_literals;
386
387 ProcTestScenario scenario;
388 scenario.WithAura(12345, 3); // 3 charges
389
390 auto procEntry = SpellProcEntryBuilder()
391 .WithChance(100.0f)
392 .WithCooldown(1000ms) // 1 second cooldown
393 .Build();
394
395 // First proc at t=0 - should work
396 EXPECT_TRUE(scenario.SimulateProc(procEntry));
397 EXPECT_EQ(scenario.GetAura()->GetCharges(), 2);
398
399 // Immediate second proc - blocked by cooldown
400 EXPECT_FALSE(scenario.SimulateProc(procEntry));
401 EXPECT_EQ(scenario.GetAura()->GetCharges(), 2); // No charge consumed
402
403 // Wait for cooldown
404 scenario.AdvanceTime(1100ms);
405
406 // Third proc - should work
407 EXPECT_TRUE(scenario.SimulateProc(procEntry));
408 EXPECT_EQ(scenario.GetAura()->GetCharges(), 1);
409}
void AdvanceTime(std::chrono::milliseconds duration)
Definition ProcChanceTestHelper.h:618
SpellProcEntryBuilder & WithCooldown(Milliseconds cooldown)
Definition ProcEventInfoHelper.h:214

References ProcTestScenario::AdvanceTime(), SpellProcEntryBuilder::Build(), ProcTestScenario::GetAura(), ProcTestScenario::SimulateProc(), ProcTestScenario::WithAura(), SpellProcEntryBuilder::WithChance(), and SpellProcEntryBuilder::WithCooldown().

◆ TEST_F() [8/15]

TEST_F ( SpellProcChargeTest  ,
ProcTestScenario_StackConsumption   
)
360{
361 ProcTestScenario scenario;
362 scenario.WithAura(12345, 0, 3); // 3 stacks
363
364 auto procEntry = SpellProcEntryBuilder()
365 .WithChance(100.0f)
367 .Build();
368
369 // First proc - consumes stack
370 EXPECT_TRUE(scenario.SimulateProc(procEntry));
371 EXPECT_EQ(scenario.GetAura()->GetStackAmount(), 2);
372
373 // Second proc - consumes stack
374 EXPECT_TRUE(scenario.SimulateProc(procEntry));
375 EXPECT_EQ(scenario.GetAura()->GetStackAmount(), 1);
376
377 // Third proc - consumes last stack and removes aura
378 EXPECT_TRUE(scenario.SimulateProc(procEntry));
379 EXPECT_EQ(scenario.GetAura()->GetStackAmount(), 0);
380 EXPECT_TRUE(scenario.GetAura()->IsRemoved());
381}
@ PROC_ATTR_USE_STACKS_FOR_CHARGES
Definition SpellMgr.h:280
SpellProcEntryBuilder & WithAttributesMask(uint32 attributesMask)
Definition ProcEventInfoHelper.h:190

References SpellProcEntryBuilder::Build(), ProcTestScenario::GetAura(), PROC_ATTR_USE_STACKS_FOR_CHARGES, ProcTestScenario::SimulateProc(), SpellProcEntryBuilder::WithAttributesMask(), ProcTestScenario::WithAura(), and SpellProcEntryBuilder::WithChance().

◆ TEST_F() [9/15]

TEST_F ( SpellProcChargeTest  ,
Scenario_BladeBarrier_5Stacks   
)
233{
234 // Blade Barrier (Death Knight) - 5 stacks, consumed over time
235 auto aura = AuraStubBuilder()
236 .WithId(55226) // Blade Barrier
238 .Build();
239
240 auto procEntry = SpellProcEntryBuilder()
241 .WithChance(100.0f)
243 .Build();
244
245 // Simulate stacks being consumed
246 for (int i = 5; i > 1; --i)
247 {
248 EXPECT_EQ(aura->GetStackAmount(), i);
249 EXPECT_FALSE(ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry));
250 }
251
252 // Last stack removal
253 EXPECT_EQ(aura->GetStackAmount(), 1);
254 EXPECT_TRUE(ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry));
255 EXPECT_TRUE(aura->IsRemoved());
256}
AuraStubBuilder & WithStackAmount(uint8_t amount)
Definition AuraStub.h:320

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), PROC_ATTR_USE_STACKS_FOR_CHARGES, ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithAttributesMask(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithId(), and AuraStubBuilder::WithStackAmount().

◆ TEST_F() [10/15]

TEST_F ( SpellProcChargeTest  ,
Scenario_HotStreak_3Charges   
)
207{
208 // Hot Streak (Fire Mage) - 3 charges, consumed on each instant Pyroblast
209 auto aura = AuraStubBuilder()
210 .WithId(48108) // Hot Streak
211 .WithCharges(3)
212 .Build();
213
214 auto procEntry = SpellProcEntryBuilder()
215 .WithChance(100.0f)
216 .Build();
217
218 // First Pyroblast
219 EXPECT_FALSE(ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry));
220 EXPECT_EQ(aura->GetCharges(), 2);
221
222 // Second Pyroblast
223 EXPECT_FALSE(ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry));
224 EXPECT_EQ(aura->GetCharges(), 1);
225
226 // Third Pyroblast - aura removed
227 EXPECT_TRUE(ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry));
228 EXPECT_EQ(aura->GetCharges(), 0);
229 EXPECT_TRUE(aura->IsRemoved());
230}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithCharges(), and AuraStubBuilder::WithId().

◆ TEST_F() [11/15]

TEST_F ( SpellProcChargeTest  ,
Scenario_Maelstrom_5Stacks   
)
259{
260 // Maelstrom Weapon (Enhancement Shaman) - 5 stacks
261 auto aura = AuraStubBuilder()
262 .WithId(53817) // Maelstrom Weapon
264 .Build();
265
266 auto procEntry = SpellProcEntryBuilder()
267 .WithChance(100.0f)
269 .Build();
270
271 // At 5 stacks, cast instant Lightning Bolt consumes all stacks
272 // Simulate consuming all 5 stacks at once
273 for (int i = 0; i < 5; ++i)
274 {
276 }
277
278 EXPECT_EQ(aura->GetStackAmount(), 0);
279 EXPECT_TRUE(aura->IsRemoved());
280}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), PROC_ATTR_USE_STACKS_FOR_CHARGES, ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithAttributesMask(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithId(), and AuraStubBuilder::WithStackAmount().

◆ TEST_F() [12/15]

TEST_F ( SpellProcChargeTest  ,
UseStacksForCharges_IgnoresCharges   
)
182{
183 auto aura = AuraStubBuilder()
184 .WithId(12345)
185 .WithCharges(10) // Has charges
187 .Build();
188
189 auto procEntry = SpellProcEntryBuilder()
190 .WithChance(100.0f)
192 .Build();
193
194 // Should decrement stacks, not charges
195 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
196
197 EXPECT_EQ(aura->GetStackAmount(), 1);
198 EXPECT_EQ(aura->GetCharges(), 10); // Charges unchanged
199 EXPECT_FALSE(removed);
200}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), PROC_ATTR_USE_STACKS_FOR_CHARGES, ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithAttributesMask(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithCharges(), AuraStubBuilder::WithId(), and AuraStubBuilder::WithStackAmount().

◆ TEST_F() [13/15]

TEST_F ( SpellProcChargeTest  ,
UseStacksForCharges_MultipleStacks   
)
148{
149 auto aura = AuraStubBuilder()
150 .WithId(12345)
152 .Build();
153
154 auto procEntry = SpellProcEntryBuilder()
155 .WithChance(100.0f)
157 .Build();
158
159 // First consumption - 5 -> 4
160 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
161 EXPECT_EQ(aura->GetStackAmount(), 4);
162 EXPECT_FALSE(removed);
163 EXPECT_FALSE(aura->IsRemoved());
164
165 // Second consumption - 4 -> 3
166 removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
167 EXPECT_EQ(aura->GetStackAmount(), 3);
168 EXPECT_FALSE(removed);
169
170 // Consume remaining stacks
171 ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry); // 3 -> 2
172 ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry); // 2 -> 1
173
174 // Final consumption - should remove aura
175 removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
176 EXPECT_EQ(aura->GetStackAmount(), 0);
177 EXPECT_TRUE(removed);
178 EXPECT_TRUE(aura->IsRemoved());
179}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), PROC_ATTR_USE_STACKS_FOR_CHARGES, ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithAttributesMask(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithId(), and AuraStubBuilder::WithStackAmount().

◆ TEST_F() [14/15]

TEST_F ( SpellProcChargeTest  ,
UseStacksForCharges_SingleStack   
)
129{
130 auto aura = AuraStubBuilder()
131 .WithId(12345)
133 .Build();
134
135 auto procEntry = SpellProcEntryBuilder()
136 .WithChance(100.0f)
138 .Build();
139
140 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
141
142 EXPECT_EQ(aura->GetStackAmount(), 0);
143 EXPECT_TRUE(removed);
144 EXPECT_TRUE(aura->IsRemoved());
145}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), PROC_ATTR_USE_STACKS_FOR_CHARGES, ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithAttributesMask(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithId(), and AuraStubBuilder::WithStackAmount().

◆ TEST_F() [15/15]

TEST_F ( SpellProcChargeTest  ,
ZeroStacks_WithUseStacksAttribute   
)
298{
299 auto aura = AuraStubBuilder()
300 .WithId(12345)
302 .Build();
303
304 auto procEntry = SpellProcEntryBuilder()
305 .WithChance(100.0f)
307 .Build();
308
309 // Should handle gracefully and remove aura
310 bool removed = ProcChanceTestHelper::SimulateConsumeProcCharges(aura.get(), procEntry);
311 EXPECT_TRUE(removed);
312 EXPECT_TRUE(aura->IsRemoved());
313}

References AuraStubBuilder::Build(), SpellProcEntryBuilder::Build(), PROC_ATTR_USE_STACKS_FOR_CHARGES, ProcChanceTestHelper::SimulateConsumeProcCharges(), SpellProcEntryBuilder::WithAttributesMask(), SpellProcEntryBuilder::WithChance(), AuraStubBuilder::WithId(), and AuraStubBuilder::WithStackAmount().