WindyCliffs.Clock
0.5.0
dotnet add package WindyCliffs.Clock --version 0.5.0
NuGet\Install-Package WindyCliffs.Clock -Version 0.5.0
<PackageReference Include="WindyCliffs.Clock" Version="0.5.0" />
<PackageVersion Include="WindyCliffs.Clock" Version="0.5.0" />
<PackageReference Include="WindyCliffs.Clock" />
paket add WindyCliffs.Clock --version 0.5.0
#r "nuget: WindyCliffs.Clock, 0.5.0"
#:package WindyCliffs.Clock@0.5.0
#addin nuget:?package=WindyCliffs.Clock&version=0.5.0
#tool nuget:?package=WindyCliffs.Clock&version=0.5.0
WindyCliffs.Clock
A small .NET library for testable time. It abstracts the clock behind a single
IClock interface so code that reads the current time, sleeps, or delays can be
driven deterministically in tests instead of depending on the wall clock.
SystemClock— the production implementation, bound to the operating-system clock.MockClock— a fully code-controlled clock for deterministic tests; you advance time yourself.
Targets netstandard2.0, so it runs on .NET Framework and modern .NET alike.
Install
dotnet add package WindyCliffs.Clock
Quick start
Depend on IClock instead of calling DateTimeOffset.UtcNow, Thread.Sleep,
or Task.Delay directly:
using WindyCliffs.Clock;
public sealed class Session
{
private readonly IClock clock;
public Session(IClock clock) => this.clock = clock;
public bool HasExpired(DateTimeOffset expiresAt) => this.clock.UtcNow >= expiresAt;
}
In production, register the singleton operating-system clock:
services.AddSingleton<IClock>(SystemClock.Instance);
In tests, use MockClock and advance time yourself — no real waiting:
var clock = new MockClock();
var session = new Session(clock);
clock.AdvanceBy(TimeSpan.FromMinutes(5));
Assert.True(session.HasExpired(clock.UtcNow));
What IClock offers
| Member | Description |
|---|---|
UtcNow |
The current time (UTC). Replacement for DateTimeOffset.UtcNow. |
Sleep(timeout) |
Blocks the caller. Replacement for Thread.Sleep. |
TaskDelay(timeout, cancellationToken) |
Awaitable, cancellable delay. Replacement for Task.Delay. |
CancelAfter(source, timeout) |
Cancels a CancellationTokenSource after the timeout. Replacement for CancellationTokenSource.CancelAfter. |
StartTimer(state, dueTime, interval, callback) |
Starts a one-shot or periodic timer. Replacement for the System.Threading.Timer constructor. |
With MockClock, Sleep, TaskDelay, CancelAfter, and StartTimer are all
driven by advancing the clock (AdvanceBy/AdvanceTo) rather than by real
elapsed time, so time-dependent code — including async code — stays
deterministic:
var clock = new MockClock();
Task delay = clock.TaskDelay(TimeSpan.FromSeconds(30));
clock.AdvanceBy(TimeSpan.FromSeconds(30)); // releases the pending delay
await delay;
Documentation
Full guides live in the GitHub repository:
- Usage — detailed API guide.
- Architecture — how the abstraction and
MockClocktime-advancement are designed.
The source lives at github.com/windycliffs/clock.
License
MIT — see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.