Skip to content

Commit b7c6baf

Browse files
committed
feat: add ActiveTimers property
1 parent 67c5f47 commit b7c6baf

File tree

6 files changed

+63
-6
lines changed

6 files changed

+63
-6
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ All notable changes to TimeProviderExtensions will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.0.0-rc.2]
9+
10+
- Added `ActiveTimers` property to `ManualTimeProvider`. The property will display the number of currently active timers that have a callback scheduled to be called in the future.
11+
812
## [1.0.0-rc.1]
913

1014
- Updated Microsoft.Bcl.TimeProvider package dependency to rc.1 version.

docs/TimeProviderExtensions.ManualTimeProvider.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ Optional local time zone to use during testing. Defaults to [System.TimeZoneInfo
7878
The provider is set to not automatically advance time each time it is read.
7979
### Properties
8080

81+
<a name='TimeProviderExtensions.ManualTimeProvider.ActiveTimers'></a>
82+
83+
## ManualTimeProvider.ActiveTimers Property
84+
85+
Gets the number of active [TimeProviderExtensions.ManualTimeProvider.ManualTimer](https://docs.microsoft.com/en-us/dotnet/api/TimeProviderExtensions.ManualTimeProvider.ManualTimer 'TimeProviderExtensions.ManualTimeProvider.ManualTimer'), that have callbacks that are scheduled to be triggered at some point in the future.
86+
87+
```csharp
88+
public int ActiveTimers { get; }
89+
```
90+
91+
#### Property Value
92+
[System.Int32](https://docs.microsoft.com/en-us/dotnet/api/System.Int32 'System.Int32')
93+
8194
<a name='TimeProviderExtensions.ManualTimeProvider.AutoAdvanceAmount'></a>
8295

8396
## ManualTimeProvider.AutoAdvanceAmount Property

src/TimeProviderExtensions/ManualTimeProvider.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace TimeProviderExtensions;
99
/// <remarks>
1010
/// Learn more at <see href="https://github.com/egil/TimeProviderExtensions"/>.
1111
/// </remarks>
12-
[DebuggerDisplay("UtcNow: {ToString(),nq}. Scheduled timer callbacks: {callbacks.Count}. Auto advance amount: {autoAdvanceAmount,nq}.")]
12+
[DebuggerDisplay("UtcNow: {ToString(),nq}. Active timers: {ActiveTimers}. Auto advance amount: {AutoAdvanceAmount,nq}.")]
1313
public partial class ManualTimeProvider : TimeProvider
1414
{
1515
internal const uint MaxSupportedTimeout = 0xfffffffe;
@@ -22,9 +22,9 @@ public partial class ManualTimeProvider : TimeProvider
2222
private TimeSpan autoAdvanceAmount = TimeSpan.Zero;
2323

2424
/// <summary>
25-
/// Gets the number of callbacks that are scheduled to be triggered in the future.
25+
/// Gets the number of active <see cref="ManualTimer"/>, that have callbacks that are scheduled to be triggered at some point in the future.
2626
/// </summary>
27-
internal int ScheduledCallbacks => callbacks.Count;
27+
public int ActiveTimers => callbacks.Count;
2828

2929
/// <summary>
3030
/// Gets the starting date and time for this provider.

test/TimeProviderExtensions.Tests/ManualTimeProviderTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,43 @@ public void Timer_callback_GetUtcNow_AutoAdvance()
159159

160160
timeProvider.GetUtcNow().Should().Be(timeProvider.Start + oneSecond);
161161
}
162+
163+
[Fact]
164+
public void ActiveTimers_with_no_timers()
165+
{
166+
var sut = new ManualTimeProvider();
167+
168+
sut.ActiveTimers.Should().Be(0);
169+
}
170+
171+
[Fact]
172+
public void ActiveTimers_with_active_timers()
173+
{
174+
var sut = new ManualTimeProvider();
175+
176+
var timer = sut.CreateTimer(_ => { }, null, 1.Seconds(), Timeout.InfiniteTimeSpan);
177+
178+
sut.ActiveTimers.Should().Be(1);
179+
}
180+
181+
[Fact]
182+
public void ActiveTimers_with_inactive_timers()
183+
{
184+
var sut = new ManualTimeProvider();
185+
186+
var timer = sut.CreateTimer(_ => { }, null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
187+
188+
sut.ActiveTimers.Should().Be(0);
189+
}
190+
191+
[Fact]
192+
public void ActiveTimers_with_after_timer_state_change()
193+
{
194+
var sut = new ManualTimeProvider();
195+
196+
var timer = sut.CreateTimer(_ => { }, null, 1.Seconds(), Timeout.InfiniteTimeSpan);
197+
sut.Advance(1.Seconds());
198+
199+
sut.ActiveTimers.Should().Be(0);
200+
}
162201
}

test/TimeProviderExtensions.Tests/Microsoft.Extensions.Time.Testing.Test/TimerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,20 +210,20 @@ public void WaiterRemovedAfterDispose()
210210
var timer2Counter = 0;
211211

212212
var timeProvider = new FakeTimeProvider();
213-
var waitersCountStart = timeProvider.ScheduledCallbacks;
213+
var waitersCountStart = timeProvider.ActiveTimers;
214214

215215
var timer1 = timeProvider.CreateTimer(_ => timer1Counter++, null, TimeSpan.FromMilliseconds(1), TimeSpan.FromMilliseconds(1));
216216
var timer2 = timeProvider.CreateTimer(_ => timer2Counter++, null, TimeSpan.FromMilliseconds(1), TimeSpan.FromMilliseconds(1));
217217

218-
var waitersCountDuring = timeProvider.ScheduledCallbacks;
218+
var waitersCountDuring = timeProvider.ActiveTimers;
219219

220220
timeProvider.Advance(TimeSpan.FromMilliseconds(1));
221221

222222
timer1.Dispose();
223223

224224
timeProvider.Advance(TimeSpan.FromMilliseconds(1));
225225

226-
var waitersCountAfter = timeProvider.ScheduledCallbacks;
226+
var waitersCountAfter = timeProvider.ActiveTimers;
227227

228228
Assert.Equal(0, waitersCountStart);
229229
Assert.Equal(2, waitersCountDuring);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
global using System;
22
global using System.Threading;
33
global using FluentAssertions;
4+
global using FluentAssertions.Extensions;
45
global using Xunit;

0 commit comments

Comments
 (0)