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