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

Unit tests for proc internal cooldown system. More...

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

Go to the source code of this file.

Classes

class  SpellProcCooldownTest
 

Functions

 TEST_F (SpellProcCooldownTest, NotOnCooldown_Initially)
 
 TEST_F (SpellProcCooldownTest, OnCooldown_AfterProc)
 
 TEST_F (SpellProcCooldownTest, NotOnCooldown_AfterExpiry)
 
 TEST_F (SpellProcCooldownTest, ExactCooldownBoundary)
 
 TEST_F (SpellProcCooldownTest, ZeroCooldown_NeverBlocks)
 
 TEST_F (SpellProcCooldownTest, CooldownCanBeReset)
 
 TEST_F (SpellProcCooldownTest, CooldownCanBeExtended)
 
 TEST_F (SpellProcCooldownTest, Scenario_LeaderOfThePack_6SecCooldown)
 
 TEST_F (SpellProcCooldownTest, Scenario_WanderingPlague_1SecCooldown)
 
 TEST_F (SpellProcCooldownTest, Scenario_MultipleProcsWithCooldown)
 
 TEST_F (SpellProcCooldownTest, ProcTestScenario_CooldownBlocking)
 

Detailed Description

Unit tests for proc internal cooldown system.

Definition in file SpellProcCooldownTest.cpp.

Function Documentation

◆ TEST_F() [1/11]

TEST_F ( SpellProcCooldownTest  ,
CooldownCanBeExtended   
)
118{
119 auto aura = AuraStubBuilder().WithId(12345).Build();
120
121 // Apply 1 second cooldown
122 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 1000);
123
124 // Extend to 5 seconds
125 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 5000);
126
127 // Should still be on cooldown after 2 seconds
128 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 2000ms));
129}
Builder for creating AuraStub instances with fluent API.
Definition AuraStub.h:290
std::unique_ptr< AuraStub > Build()
Definition AuraStub.h:353
AuraStubBuilder & WithId(uint32_t id)
Definition AuraStub.h:294
static void ApplyProcCooldown(AuraStub *aura, std::chrono::steady_clock::time_point now, uint32 cooldownMs)
Apply proc cooldown to aura.
Definition ProcChanceTestHelper.h:163
static bool IsProcOnCooldown(AuraStub const *aura, std::chrono::steady_clock::time_point now)
Check if proc is on cooldown.
Definition ProcChanceTestHelper.h:149

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [2/11]

TEST_F ( SpellProcCooldownTest  ,
CooldownCanBeReset   
)
107{
108 auto aura = AuraStubBuilder().WithId(12345).Build();
109
110 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 5000);
111 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now));
112
113 aura->ResetProcCooldown();
114 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now));
115}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [3/11]

TEST_F ( SpellProcCooldownTest  ,
ExactCooldownBoundary   
)
77{
78 auto aura = AuraStubBuilder().WithId(12345).Build();
79
80 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 1000);
81
82 // At exactly cooldown time, should still be on cooldown (< not <=)
83 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 999ms));
84 // One millisecond after should be off cooldown
85 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 1000ms));
86}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [4/11]

TEST_F ( SpellProcCooldownTest  ,
NotOnCooldown_AfterExpiry   
)
66{
67 auto aura = AuraStubBuilder().WithId(12345).Build();
68
69 // Apply 1 second cooldown
70 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 1000);
71
72 // Should not be on cooldown after 1 second
73 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 1001ms));
74}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [5/11]

TEST_F ( SpellProcCooldownTest  ,
NotOnCooldown_Initially   
)

◆ TEST_F() [6/11]

TEST_F ( SpellProcCooldownTest  ,
OnCooldown_AfterProc   
)
54{
55 auto aura = AuraStubBuilder().WithId(12345).Build();
56
57 // Apply 1 second cooldown
58 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 1000);
59
60 // Should be on cooldown immediately after
61 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now));
62 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 500ms));
63}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [7/11]

TEST_F ( SpellProcCooldownTest  ,
ProcTestScenario_CooldownBlocking   
)
199{
200 ProcTestScenario scenario;
201 scenario.WithAura(12345);
202
203 auto procEntry = SpellProcEntryBuilder()
204 .WithChance(100.0f)
205 .WithCooldown(1000ms)
206 .Build();
207
208 // First proc should succeed
209 EXPECT_TRUE(scenario.SimulateProc(procEntry));
210
211 // Second proc immediately after should fail (on cooldown)
212 EXPECT_FALSE(scenario.SimulateProc(procEntry));
213
214 // Advance time past cooldown
215 scenario.AdvanceTime(1100ms);
216
217 // Third proc should succeed
218 EXPECT_TRUE(scenario.SimulateProc(procEntry));
219}
Test context for proc simulation scenarios.
Definition ProcChanceTestHelper.h:613
void AdvanceTime(std::chrono::milliseconds duration)
Definition ProcChanceTestHelper.h:618
ProcTestScenario & WithAura(uint32_t spellId, uint8_t charges=0, uint8_t stacks=1)
Definition ProcChanceTestHelper.h:644
bool SimulateProc(SpellProcEntry const &procEntry, float rollResult=0.0f)
Definition ProcChanceTestHelper.h:654
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
SpellProcEntryBuilder & WithCooldown(Milliseconds cooldown)
Definition ProcEventInfoHelper.h:214

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

◆ TEST_F() [8/11]

TEST_F ( SpellProcCooldownTest  ,
Scenario_LeaderOfThePack_6SecCooldown   
)
136{
137 // Leader of the Pack has a 6 second internal cooldown
138 auto aura = AuraStubBuilder().WithId(24932).Build();
139
140 // First proc
141 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 6000);
142
143 // Blocked at 3 seconds
144 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 3000ms));
145
146 // Blocked at 5.9 seconds
147 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 5999ms));
148
149 // Allowed at 6 seconds
150 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 6000ms));
151}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [9/11]

TEST_F ( SpellProcCooldownTest  ,
Scenario_MultipleProcsWithCooldown   
)
168{
169 auto aura = AuraStubBuilder().WithId(12345).Build();
170 auto time = _now;
171
172 // First proc at t=0
173 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), time));
174 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), time, 1000);
175
176 // Second attempt at t=0.5 (blocked)
177 time += 500ms;
178 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), time));
179
180 // Third attempt at t=1.0 (allowed)
181 time += 500ms;
182 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), time));
183 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), time, 1000);
184
185 // Fourth attempt at t=1.5 (blocked)
186 time += 500ms;
187 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), time));
188
189 // Fifth attempt at t=2.0 (allowed)
190 time += 500ms;
191 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), time));
192}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [10/11]

TEST_F ( SpellProcCooldownTest  ,
Scenario_WanderingPlague_1SecCooldown   
)
154{
155 // Wandering Plague has a 1 second internal cooldown
156 auto aura = AuraStubBuilder().WithId(49217).Build();
157
158 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 1000);
159
160 // Blocked at 0.5 seconds
161 EXPECT_TRUE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 500ms));
162
163 // Allowed at 1 second
164 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now + 1000ms));
165}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().

◆ TEST_F() [11/11]

TEST_F ( SpellProcCooldownTest  ,
ZeroCooldown_NeverBlocks   
)
93{
94 auto aura = AuraStubBuilder().WithId(12345).Build();
95
96 // Zero cooldown should not apply any cooldown
97 ProcChanceTestHelper::ApplyProcCooldown(aura.get(), _now, 0);
98
99 EXPECT_FALSE(ProcChanceTestHelper::IsProcOnCooldown(aura.get(), _now));
100}

References ProcChanceTestHelper::ApplyProcCooldown(), AuraStubBuilder::Build(), ProcChanceTestHelper::IsProcOnCooldown(), and AuraStubBuilder::WithId().