From cdb5851cb39b4ecb905e89ab1054ee1644e0c76e Mon Sep 17 00:00:00 2001 From: Fredrik Forsmo Date: Thu, 15 Jan 2026 09:38:47 +0100 Subject: [PATCH] chore: remove net8 dependency and target netstandard2.1 --- Personnummer.Tests/CoordinationNumberTests.cs | 14 +++++----- Personnummer.Tests/PersonnummerTests.cs | 23 +++++++--------- Personnummer.Tests/TestClock.cs | 16 ++++++++++++ Personnummer.Tests/TestTimeProvider.cs | 26 ------------------- Personnummer/Personnummer.cs | 15 +++-------- Personnummer/Personnummer.csproj | 2 +- 6 files changed, 37 insertions(+), 59 deletions(-) create mode 100644 Personnummer.Tests/TestClock.cs delete mode 100644 Personnummer.Tests/TestTimeProvider.cs diff --git a/Personnummer.Tests/CoordinationNumberTests.cs b/Personnummer.Tests/CoordinationNumberTests.cs index 929fac1..a76a8f2 100644 --- a/Personnummer.Tests/CoordinationNumberTests.cs +++ b/Personnummer.Tests/CoordinationNumberTests.cs @@ -122,13 +122,12 @@ public void TestParseInvalidCn(PersonnummerData ssn) })); } -#if NET8_0_OR_GREATER [Theory] [ClassData(typeof(ValidCnDataProvider))] public void TestAgeCn(PersonnummerData ssn) { - var timeProvider = new TestTimeProvider(); - var localNow = timeProvider.GetLocalNow(); + var clock = new TestClock(); + var localNow = clock.GetNow(); int day = int.Parse(ssn.LongFormat.Substring(ssn.LongFormat.Length - 6, 2)) - 60; string strDay = day < 10 ? $"0{day}" : day.ToString(); @@ -140,13 +139,12 @@ public void TestAgeCn(PersonnummerData ssn) years--; } - Assert.Equal(years, Personnummer.Parse(ssn.SeparatedLong, new Personnummer.Options { AllowCoordinationNumber = true, TimeProvider = timeProvider }).Age); - Assert.Equal(years, Personnummer.Parse(ssn.SeparatedFormat, new Personnummer.Options { AllowCoordinationNumber = true, TimeProvider = timeProvider }).Age); - Assert.Equal(years, Personnummer.Parse(ssn.LongFormat, new Personnummer.Options { AllowCoordinationNumber = true, TimeProvider = timeProvider }).Age); + Assert.Equal(years, Personnummer.Parse(ssn.SeparatedLong, new Personnummer.Options { AllowCoordinationNumber = true, Now = clock.GetNow }).Age); + Assert.Equal(years, Personnummer.Parse(ssn.SeparatedFormat, new Personnummer.Options { AllowCoordinationNumber = true, Now = clock.GetNow }).Age); + Assert.Equal(years, Personnummer.Parse(ssn.LongFormat, new Personnummer.Options { AllowCoordinationNumber = true, Now = clock.GetNow }).Age); // 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); + Assert.Equal(years > 99 ? years - 100 : years, Personnummer.Parse(ssn.ShortFormat, new Personnummer.Options { AllowCoordinationNumber = true, Now = clock.GetNow }).Age); } -#endif [Theory] [ClassData(typeof(ValidCnDataProvider))] diff --git a/Personnummer.Tests/PersonnummerTests.cs b/Personnummer.Tests/PersonnummerTests.cs index 6a4de8e..49801b8 100644 --- a/Personnummer.Tests/PersonnummerTests.cs +++ b/Personnummer.Tests/PersonnummerTests.cs @@ -76,13 +76,12 @@ public void TestParseInvalid(PersonnummerData ssn) } -#if NET8_0_OR_GREATER // Requires TimeProvider. [Theory] [ClassData(typeof(ValidSsnDataProvider))] public void TestAge(PersonnummerData ssn) { - var timeProvider = new TestTimeProvider(); - var localNow = timeProvider.GetLocalNow(); + var clock = new TestClock(); + var localNow = clock.GetNow(); DateTime dt = DateTime.ParseExact(ssn.LongFormat.Substring(0, ssn.LongFormat.Length - 4), "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); var years = localNow.Year - dt.Year; @@ -91,28 +90,26 @@ public void TestAge(PersonnummerData ssn) years--; } - Assert.Equal(years, Personnummer.Parse(ssn.SeparatedLong, new Personnummer.Options { AllowCoordinationNumber = false, TimeProvider = timeProvider }).Age); - Assert.Equal(years, Personnummer.Parse(ssn.SeparatedFormat, new Personnummer.Options { AllowCoordinationNumber = false, TimeProvider = timeProvider }).Age); - Assert.Equal(years, Personnummer.Parse(ssn.LongFormat, new Personnummer.Options { AllowCoordinationNumber = false, TimeProvider = timeProvider }).Age); + Assert.Equal(years, Personnummer.Parse(ssn.SeparatedLong, new Personnummer.Options { AllowCoordinationNumber = false, Now = clock.GetNow }).Age); + Assert.Equal(years, Personnummer.Parse(ssn.SeparatedFormat, new Personnummer.Options { AllowCoordinationNumber = false, Now = clock.GetNow }).Age); + Assert.Equal(years, Personnummer.Parse(ssn.LongFormat, new Personnummer.Options { AllowCoordinationNumber = false, Now = clock.GetNow }).Age); // 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 = false, TimeProvider = timeProvider }).Age); + Assert.Equal(years > 99 ? years - 100 : years, Personnummer.Parse(ssn.ShortFormat, new Personnummer.Options { AllowCoordinationNumber = false, Now = clock.GetNow }).Age); } [Fact] public void TestEdgeCasesAroundBirthday() { - var timeProvider = new TestTimeProvider + var clock = new TestClock { Now = DateTimeOffset.Parse("2090-01-09 12:00") }; - Assert.Equal(10, new Personnummer("20800108-6670", new Personnummer.Options() {TimeProvider = timeProvider} ).Age); // Had birthday yesterday - Assert.Equal(10, new Personnummer("20800109-8287", new Personnummer.Options() {TimeProvider = timeProvider} ).Age); // Birthday today - Assert.Equal(9, new Personnummer("20800110-8516", new Personnummer.Options() {TimeProvider = timeProvider} ).Age); // Upcoming Birthday tomorrow + Assert.Equal(10, new Personnummer("20800108-6670", new Personnummer.Options() {Now = clock.GetNow} ).Age); // Had birthday yesterday + Assert.Equal(10, new Personnummer("20800109-8287", new Personnummer.Options() {Now = clock.GetNow} ).Age); // Birthday today + Assert.Equal(9, new Personnummer("20800110-8516", new Personnummer.Options() {Now = clock.GetNow} ).Age); // Upcoming Birthday tomorrow } -#endif - [Theory] [ClassData(typeof(ValidSsnDataProvider))] public void TestFormat(PersonnummerData ssn) diff --git a/Personnummer.Tests/TestClock.cs b/Personnummer.Tests/TestClock.cs new file mode 100644 index 0000000..f1bcb78 --- /dev/null +++ b/Personnummer.Tests/TestClock.cs @@ -0,0 +1,16 @@ +using System; + +namespace Personnummer.Tests; + +public sealed class TestClock +{ + public DateTimeOffset Now { get; set; } = new( + new DateTime(2025, 1, 1, 0, 0, 1), + TimeSpan.Zero + ); + + public DateTimeOffset GetNow() + { + return Now; + } +} \ No newline at end of file diff --git a/Personnummer.Tests/TestTimeProvider.cs b/Personnummer.Tests/TestTimeProvider.cs deleted file mode 100644 index e2b67e3..0000000 --- a/Personnummer.Tests/TestTimeProvider.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace Personnummer.Tests; - -#if NET8_0_OR_GREATER - -/// -/// TimeProvider which always returns the same date: 2025 01 01 00:00:01 with UTC timezone on local time. -/// -public class TestTimeProvider : TimeProvider -{ - internal DateTimeOffset Now { get; set; } = new( - new DateOnly(2025, 1, 1), - new TimeOnly(0, 0, 0, 1), - TimeSpan.Zero - ); - - public override DateTimeOffset GetUtcNow() - { - return Now; - } - - public override TimeZoneInfo LocalTimeZone { get; } = TimeZoneInfo.Utc; -} - -#endif diff --git a/Personnummer/Personnummer.cs b/Personnummer/Personnummer.cs index 4cf7ce9..aea89ab 100644 --- a/Personnummer/Personnummer.cs +++ b/Personnummer/Personnummer.cs @@ -13,6 +13,7 @@ public Options() { AllowInterimNumber = false; AllowCoordinationNumber = true; + Now = () => DateTimeOffset.Now; } /// @@ -25,20 +26,12 @@ 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. - /// - /// Defaults to System provider. - /// + /// Function to get the current date and time. ///
- public TimeProvider TimeProvider { private get; init; } = TimeProvider.System; + public Func Now { get; set; } - internal DateTimeOffset DateTimeNow => TimeProvider.GetLocalNow(); -#else - internal DateTimeOffset DateTimeNow => DateTimeOffset.Now; -#endif + internal DateTimeOffset DateTimeNow => Now(); } #region Fields and Properties diff --git a/Personnummer/Personnummer.csproj b/Personnummer/Personnummer.csproj index 3043dc5..eedf7db 100644 --- a/Personnummer/Personnummer.csproj +++ b/Personnummer/Personnummer.csproj @@ -1,7 +1,6 @@  - netstandard2.1;net48;net10.0;net8.0;net9.0 Personnummer Johannes Tegnér, Personnummer Contributors Verify Swedish personal identity numbers. @@ -19,6 +18,7 @@ icon.png Readme.md true + netstandard2.1