Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Source/Testably.Abstractions.Interface/ITimeSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ public interface ITimeSystem
/// </summary>
IDateTime DateTime { get; }

/// <summary>
/// Abstractions for <see cref="System.DateTimeOffset" />.
/// </summary>
IDateTimeOffset DateTimeOffset { get; }

#if FEATURE_PERIODIC_TIMER
/// <summary>
/// Abstractions for <see cref="System.Threading.PeriodicTimer" />.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;

namespace Testably.Abstractions.TimeSystem;

/// <summary>
/// Abstractions for <see cref="DateTimeOffset" />.
/// </summary>
public interface IDateTimeOffset : ITimeSystemEntity
{
/// <inheritdoc cref="DateTimeOffset.MaxValue" />
DateTimeOffset MaxValue { get; }

/// <inheritdoc cref="DateTimeOffset.MinValue" />
DateTimeOffset MinValue { get; }

#pragma warning disable MA0202 // Branches differ only in XML doc comments
#if NETSTANDARD2_0
/// <summary>
/// The value of this constant is equivalent to 00:00:00.0000000 UTC, January 1, 1970, in the Gregorian calendar.
/// <see cref="UnixEpoch" /> defines the point in time when Unix time is equal to 0.
/// </summary>
DateTimeOffset UnixEpoch { get; }
#else
/// <inheritdoc cref="DateTimeOffset.UnixEpoch" />
DateTimeOffset UnixEpoch { get; }
#endif
#pragma warning restore MA0202

/// <inheritdoc cref="DateTimeOffset.Now" />
DateTimeOffset Now { get; }

/// <inheritdoc cref="DateTimeOffset.UtcNow" />
DateTimeOffset UtcNow { get; }
}
4 changes: 4 additions & 0 deletions Source/Testably.Abstractions/RealTimeSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public sealed class RealTimeSystem : ITimeSystem
public RealTimeSystem()
{
DateTime = new DateTimeWrapper(this);
DateTimeOffset = new DateTimeOffsetWrapper(this);
#if FEATURE_PERIODIC_TIMER
PeriodicTimer = new PeriodicTimerFactory(this);
#endif
Expand All @@ -31,6 +32,9 @@ public RealTimeSystem()
/// <inheritdoc cref="ITimeSystem.DateTime" />
public IDateTime DateTime { get; }

/// <inheritdoc cref="ITimeSystem.DateTimeOffset" />
public IDateTimeOffset DateTimeOffset { get; }

#if FEATURE_PERIODIC_TIMER
/// <inheritdoc cref="ITimeSystem.PeriodicTimer" />
public IPeriodicTimerFactory PeriodicTimer { get; }
Expand Down
44 changes: 44 additions & 0 deletions Source/Testably.Abstractions/TimeSystem/DateTimeOffsetWrapper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System;

namespace Testably.Abstractions.TimeSystem;

internal sealed class DateTimeOffsetWrapper : IDateTimeOffset
{
internal DateTimeOffsetWrapper(RealTimeSystem timeSystem)
{
TimeSystem = timeSystem;
}

#region IDateTimeOffset Members

/// <inheritdoc cref="IDateTimeOffset.MaxValue" />
public DateTimeOffset MaxValue
=> DateTimeOffset.MaxValue;

/// <inheritdoc cref="IDateTimeOffset.MinValue" />
public DateTimeOffset MinValue
=> DateTimeOffset.MinValue;

#if NETSTANDARD2_0
/// <inheritdoc cref="IDateTimeOffset.UnixEpoch" />
public DateTimeOffset UnixEpoch
=> new(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
#else
/// <inheritdoc cref="IDateTimeOffset.UnixEpoch" />
public DateTimeOffset UnixEpoch
=> DateTimeOffset.UnixEpoch;
#endif

/// <inheritdoc cref="IDateTimeOffset.Now" />
public DateTimeOffset Now
=> DateTimeOffset.Now;

/// <inheritdoc cref="IDateTimeOffset.UtcNow" />
public DateTimeOffset UtcNow
=> DateTimeOffset.UtcNow;

/// <inheritdoc cref="ITimeSystemEntity.TimeSystem" />
public ITimeSystem TimeSystem { get; }

#endregion
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace Testably.Abstractions
{
public RealTimeSystem() { }
public Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
public Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
public Testably.Abstractions.TimeSystem.IPeriodicTimerFactory PeriodicTimer { get; }
public Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
public Testably.Abstractions.TimeSystem.ITask Task { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace Testably.Abstractions
{
public RealTimeSystem() { }
public Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
public Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
public Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
public Testably.Abstractions.TimeSystem.ITask Task { get; }
public Testably.Abstractions.TimeSystem.IThread Thread { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace Testably.Abstractions
{
public RealTimeSystem() { }
public Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
public Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
public Testably.Abstractions.TimeSystem.IPeriodicTimerFactory PeriodicTimer { get; }
public Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
public Testably.Abstractions.TimeSystem.ITask Task { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace Testably.Abstractions
{
public RealTimeSystem() { }
public Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
public Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
public Testably.Abstractions.TimeSystem.IPeriodicTimerFactory PeriodicTimer { get; }
public Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
public Testably.Abstractions.TimeSystem.ITask Task { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace Testably.Abstractions
{
public RealTimeSystem() { }
public Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
public Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
public Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
public Testably.Abstractions.TimeSystem.ITask Task { get; }
public Testably.Abstractions.TimeSystem.IThread Thread { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace Testably.Abstractions
{
public RealTimeSystem() { }
public Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
public Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
public Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
public Testably.Abstractions.TimeSystem.ITask Task { get; }
public Testably.Abstractions.TimeSystem.IThread Thread { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ namespace Testably.Abstractions
public interface ITimeSystem
{
Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
Testably.Abstractions.TimeSystem.IPeriodicTimerFactory PeriodicTimer { get; }
Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
Testably.Abstractions.TimeSystem.ITask Task { get; }
Expand Down Expand Up @@ -143,6 +144,14 @@ namespace Testably.Abstractions.TimeSystem
System.DateTime UnixEpoch { get; }
System.DateTime UtcNow { get; }
}
public interface IDateTimeOffset : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.DateTimeOffset MaxValue { get; }
System.DateTimeOffset MinValue { get; }
System.DateTimeOffset Now { get; }
System.DateTimeOffset UnixEpoch { get; }
System.DateTimeOffset UtcNow { get; }
}
public interface IPeriodicTimer : System.IDisposable, Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.TimeSpan Period { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ namespace Testably.Abstractions
public interface ITimeSystem
{
Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
Testably.Abstractions.TimeSystem.ITask Task { get; }
Testably.Abstractions.TimeSystem.IThread Thread { get; }
Expand Down Expand Up @@ -106,6 +107,14 @@ namespace Testably.Abstractions.TimeSystem
System.DateTime UnixEpoch { get; }
System.DateTime UtcNow { get; }
}
public interface IDateTimeOffset : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.DateTimeOffset MaxValue { get; }
System.DateTimeOffset MinValue { get; }
System.DateTimeOffset Now { get; }
System.DateTimeOffset UnixEpoch { get; }
System.DateTimeOffset UtcNow { get; }
}
public interface IStopwatch : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.TimeSpan Elapsed { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ namespace Testably.Abstractions
public interface ITimeSystem
{
Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
Testably.Abstractions.TimeSystem.IPeriodicTimerFactory PeriodicTimer { get; }
Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
Testably.Abstractions.TimeSystem.ITask Task { get; }
Expand Down Expand Up @@ -125,6 +126,14 @@ namespace Testably.Abstractions.TimeSystem
System.DateTime UnixEpoch { get; }
System.DateTime UtcNow { get; }
}
public interface IDateTimeOffset : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.DateTimeOffset MaxValue { get; }
System.DateTimeOffset MinValue { get; }
System.DateTimeOffset Now { get; }
System.DateTimeOffset UnixEpoch { get; }
System.DateTimeOffset UtcNow { get; }
}
public interface IPeriodicTimer : System.IDisposable, Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.TimeSpan Period { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ namespace Testably.Abstractions
public interface ITimeSystem
{
Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
Testably.Abstractions.TimeSystem.IPeriodicTimerFactory PeriodicTimer { get; }
Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
Testably.Abstractions.TimeSystem.ITask Task { get; }
Expand Down Expand Up @@ -129,6 +130,14 @@ namespace Testably.Abstractions.TimeSystem
System.DateTime UnixEpoch { get; }
System.DateTime UtcNow { get; }
}
public interface IDateTimeOffset : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.DateTimeOffset MaxValue { get; }
System.DateTimeOffset MinValue { get; }
System.DateTimeOffset Now { get; }
System.DateTimeOffset UnixEpoch { get; }
System.DateTimeOffset UtcNow { get; }
}
public interface IPeriodicTimer : System.IDisposable, Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.TimeSpan Period { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ namespace Testably.Abstractions
public interface ITimeSystem
{
Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
Testably.Abstractions.TimeSystem.ITask Task { get; }
Testably.Abstractions.TimeSystem.IThread Thread { get; }
Expand Down Expand Up @@ -80,6 +81,14 @@ namespace Testably.Abstractions.TimeSystem
System.DateTime UnixEpoch { get; }
System.DateTime UtcNow { get; }
}
public interface IDateTimeOffset : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.DateTimeOffset MaxValue { get; }
System.DateTimeOffset MinValue { get; }
System.DateTimeOffset Now { get; }
System.DateTimeOffset UnixEpoch { get; }
System.DateTimeOffset UtcNow { get; }
}
public interface IStopwatch : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.TimeSpan Elapsed { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ namespace Testably.Abstractions
public interface ITimeSystem
{
Testably.Abstractions.TimeSystem.IDateTime DateTime { get; }
Testably.Abstractions.TimeSystem.IDateTimeOffset DateTimeOffset { get; }
Testably.Abstractions.TimeSystem.IStopwatchFactory Stopwatch { get; }
Testably.Abstractions.TimeSystem.ITask Task { get; }
Testably.Abstractions.TimeSystem.IThread Thread { get; }
Expand Down Expand Up @@ -98,6 +99,14 @@ namespace Testably.Abstractions.TimeSystem
System.DateTime UnixEpoch { get; }
System.DateTime UtcNow { get; }
}
public interface IDateTimeOffset : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.DateTimeOffset MaxValue { get; }
System.DateTimeOffset MinValue { get; }
System.DateTimeOffset Now { get; }
System.DateTimeOffset UnixEpoch { get; }
System.DateTimeOffset UtcNow { get; }
}
public interface IStopwatch : Testably.Abstractions.TimeSystem.ITimeSystemEntity
{
System.TimeSpan Elapsed { get; }
Expand Down
20 changes: 20 additions & 0 deletions Tests/Testably.Abstractions.Parity.Tests/ParityTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,26 @@ public abstract class ParityTests(
{
public TestHelpers.Parity Parity { get; } = parity;

[Test]
public async Task IDateTime_EnsureParityWith_DateTime()
{
List<string> parityErrors = Parity.DateTime
.GetErrorsToStaticType<IDateTime>(
typeof(DateTime));

await That(parityErrors).IsEmpty();
}

[Test]
public async Task IDateTimeOffset_EnsureParityWith_DateTimeOffset()
{
List<string> parityErrors = Parity.DateTimeOffset
.GetErrorsToStaticType<IDateTimeOffset>(
typeof(DateTimeOffset));

await That(parityErrors).IsEmpty();
}

[Test]
public async Task IDirectory_EnsureParityWith_Directory()
{
Expand Down
31 changes: 31 additions & 0 deletions Tests/Testably.Abstractions.Parity.Tests/TestHelpers/Parity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
using System.Threading;

namespace Testably.Abstractions.Parity.Tests.TestHelpers;
Expand All @@ -18,6 +19,36 @@ public class Parity
},
});

public ParityCheck DateTime { get; } = new(excludeMethods:
[
typeof(DateTime).GetMethod(nameof(System.DateTime.Compare)),
typeof(DateTime).GetMethod(nameof(System.DateTime.DaysInMonth)),
typeof(DateTime).GetMethod(nameof(System.DateTime.Equals), BindingFlags.Static | BindingFlags.Public),
typeof(DateTime).GetMethod(nameof(System.DateTime.FromBinary)),
typeof(DateTime).GetMethod(nameof(System.DateTime.FromFileTime)),
typeof(DateTime).GetMethod(nameof(System.DateTime.FromFileTimeUtc)),
typeof(DateTime).GetMethod(nameof(System.DateTime.FromOADate)),
typeof(DateTime).GetMethod(nameof(System.DateTime.IsLeapYear)),
typeof(DateTime).GetMethod(nameof(System.DateTime.SpecifyKind)),
..typeof(DateTime).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTime.Parse), StringComparison.Ordinal)),
..typeof(DateTime).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTime.ParseExact), StringComparison.Ordinal)),
..typeof(DateTime).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTime.TryParse), StringComparison.Ordinal)),
..typeof(DateTime).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTime.TryParseExact), StringComparison.Ordinal)),
]);

public ParityCheck DateTimeOffset { get; } = new(excludeMethods:
[
typeof(DateTimeOffset).GetMethod(nameof(System.DateTimeOffset.Compare)),
typeof(DateTimeOffset).GetMethod(nameof(System.DateTimeOffset.Equals), BindingFlags.Static | BindingFlags.Public),
typeof(DateTimeOffset).GetMethod(nameof(System.DateTimeOffset.FromFileTime)),
typeof(DateTimeOffset).GetMethod(nameof(System.DateTimeOffset.FromUnixTimeMilliseconds)),
typeof(DateTimeOffset).GetMethod(nameof(System.DateTimeOffset.FromUnixTimeSeconds)),
..typeof(DateTimeOffset).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTimeOffset.Parse), StringComparison.Ordinal)),
..typeof(DateTimeOffset).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTimeOffset.ParseExact), StringComparison.Ordinal)),
..typeof(DateTimeOffset).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTimeOffset.TryParse), StringComparison.Ordinal)),
..typeof(DateTimeOffset).GetMethods().Where(x => string.Equals(x.Name, nameof(System.DateTimeOffset.TryParseExact), StringComparison.Ordinal)),
]);

public ParityCheck Directory { get; } = new();

public ParityCheck DirectoryInfo { get; } = new(excludeMethods: new[]
Expand Down
Loading