From b7048dfdec305c13815606a361bfa7ff714650b3 Mon Sep 17 00:00:00 2001 From: Fredrik Forsmo Date: Thu, 22 Jan 2026 13:21:18 +0100 Subject: [PATCH] fix: add timeprovider fallback --- Personnummer.Tests/CoordinationNumberTests.cs | 2 -- Personnummer.Tests/PersonnummerTests.cs | 4 ---- Personnummer.Tests/TestTimeProvider.cs | 16 +++++++------- Personnummer/Personnummer.cs | 12 ++++++----- Personnummer/TimeProvider.cs | 21 +++++++++++++++++++ 5 files changed, 35 insertions(+), 20 deletions(-) create mode 100644 Personnummer/TimeProvider.cs diff --git a/Personnummer.Tests/CoordinationNumberTests.cs b/Personnummer.Tests/CoordinationNumberTests.cs index 929fac1..9566735 100644 --- a/Personnummer.Tests/CoordinationNumberTests.cs +++ b/Personnummer.Tests/CoordinationNumberTests.cs @@ -122,7 +122,6 @@ public void TestParseInvalidCn(PersonnummerData ssn) })); } -#if NET8_0_OR_GREATER [Theory] [ClassData(typeof(ValidCnDataProvider))] public void TestAgeCn(PersonnummerData ssn) @@ -146,7 +145,6 @@ public void TestAgeCn(PersonnummerData ssn) // Du to age not being possible to fetch from >100 year short format without separator, we aught to check this here. Assert.Equal(years > 99 ? years - 100 : years, Personnummer.Parse(ssn.ShortFormat, new Personnummer.Options { AllowCoordinationNumber = true, TimeProvider = timeProvider }).Age); } -#endif [Theory] [ClassData(typeof(ValidCnDataProvider))] diff --git a/Personnummer.Tests/PersonnummerTests.cs b/Personnummer.Tests/PersonnummerTests.cs index 6a4de8e..de5bde3 100644 --- a/Personnummer.Tests/PersonnummerTests.cs +++ b/Personnummer.Tests/PersonnummerTests.cs @@ -75,8 +75,6 @@ public void TestParseInvalid(PersonnummerData ssn) })); } - -#if NET8_0_OR_GREATER // Requires TimeProvider. [Theory] [ClassData(typeof(ValidSsnDataProvider))] public void TestAge(PersonnummerData ssn) @@ -111,8 +109,6 @@ public void TestEdgeCasesAroundBirthday() Assert.Equal(9, new Personnummer("20800110-8516", new Personnummer.Options() {TimeProvider = timeProvider} ).Age); // Upcoming Birthday tomorrow } -#endif - [Theory] [ClassData(typeof(ValidSsnDataProvider))] public void TestFormat(PersonnummerData ssn) diff --git a/Personnummer.Tests/TestTimeProvider.cs b/Personnummer.Tests/TestTimeProvider.cs index e2b67e3..e003612 100644 --- a/Personnummer.Tests/TestTimeProvider.cs +++ b/Personnummer.Tests/TestTimeProvider.cs @@ -1,8 +1,12 @@ using System; -namespace Personnummer.Tests; - #if NET8_0_OR_GREATER +using TimeProvider = System.TimeProvider; +#else +using TimeProvider = Personnummer.TimeProvider; +#endif + +namespace Personnummer.Tests; /// /// TimeProvider which always returns the same date: 2025 01 01 00:00:01 with UTC timezone on local time. @@ -16,11 +20,5 @@ public class TestTimeProvider : TimeProvider ); public override DateTimeOffset GetUtcNow() - { - return Now; - } - - public override TimeZoneInfo LocalTimeZone { get; } = TimeZoneInfo.Utc; + => Now; } - -#endif diff --git a/Personnummer/Personnummer.cs b/Personnummer/Personnummer.cs index 4cf7ce9..8855e99 100644 --- a/Personnummer/Personnummer.cs +++ b/Personnummer/Personnummer.cs @@ -3,6 +3,12 @@ using System.Text.RegularExpressions; using Personnummer.Exceptions; +#if NET8_0_OR_GREATER +using TimeProvider = System.TimeProvider; +#else +using TimeProvider = Personnummer.TimeProvider; +#endif + namespace Personnummer { public class Personnummer @@ -25,7 +31,6 @@ public Options() /// public bool AllowInterimNumber { get; set; } = false; -#if (NET8_0_OR_GREATER) /// /// TimeProvider to use in calculations which are time dependent.
/// Uses `GetLocalNow` method. @@ -33,12 +38,9 @@ public Options() /// Defaults to System provider. /// ///
- public TimeProvider TimeProvider { private get; init; } = TimeProvider.System; + public TimeProvider TimeProvider { private get; set; } = TimeProvider.System; internal DateTimeOffset DateTimeNow => TimeProvider.GetLocalNow(); -#else - internal DateTimeOffset DateTimeNow => DateTimeOffset.Now; -#endif } #region Fields and Properties diff --git a/Personnummer/TimeProvider.cs b/Personnummer/TimeProvider.cs new file mode 100644 index 0000000..f11bc32 --- /dev/null +++ b/Personnummer/TimeProvider.cs @@ -0,0 +1,21 @@ +using System; + +namespace Personnummer; + +#if (!NET8_0_OR_GREATER) +public abstract class TimeProvider +{ + public virtual DateTimeOffset GetLocalNow() => GetUtcNow().ToLocalTime(); + + public static TimeProvider System { get; } + = new FallbackTimeProvider(); + + public abstract DateTimeOffset GetUtcNow(); + + private sealed class FallbackTimeProvider : TimeProvider + { + public override DateTimeOffset GetUtcNow() + => DateTimeOffset.UtcNow; + } +} +#endif \ No newline at end of file