@@ -82,15 +82,35 @@ public void TestParseInvalid(PersonnummerData ssn)
82
82
public void TestAge ( PersonnummerData ssn )
83
83
{
84
84
var timeProvider = new TestTimeProvider ( ) ;
85
+ var localNow = timeProvider . GetLocalNow ( ) ;
85
86
DateTime dt = DateTime . ParseExact ( ssn . LongFormat . Substring ( 0 , ssn . LongFormat . Length - 4 ) , "yyyyMMdd" , CultureInfo . InvariantCulture , DateTimeStyles . None ) ;
86
- int years = timeProvider . GetLocalNow ( ) . Year - dt . Year ;
87
+
88
+ var years = localNow . Year - dt . Year ;
89
+ if ( ! ( localNow . Month > dt . Month || ( localNow . Month == dt . Month && localNow . Day >= dt . Day ) ) )
90
+ {
91
+ years -- ;
92
+ }
87
93
88
94
Assert . Equal ( years , Personnummer . Parse ( ssn . SeparatedLong , new Personnummer . Options { AllowCoordinationNumber = false , TimeProvider = timeProvider } ) . Age ) ;
89
95
Assert . Equal ( years , Personnummer . Parse ( ssn . SeparatedFormat , new Personnummer . Options { AllowCoordinationNumber = false , TimeProvider = timeProvider } ) . Age ) ;
90
96
Assert . Equal ( years , Personnummer . Parse ( ssn . LongFormat , new Personnummer . Options { AllowCoordinationNumber = false , TimeProvider = timeProvider } ) . Age ) ;
91
97
// Du to age not being possible to fetch from >100 year short format without separator, we aught to check this here.
92
98
Assert . Equal ( years > 99 ? years - 100 : years , Personnummer . Parse ( ssn . ShortFormat , new Personnummer . Options { AllowCoordinationNumber = false , TimeProvider = timeProvider } ) . Age ) ;
93
99
}
100
+
101
+ [ Fact ]
102
+ public void TestEdgeCasesAroundBirthday ( )
103
+ {
104
+ var timeProvider = new TestTimeProvider
105
+ {
106
+ Now = DateTimeOffset . Parse ( "2090-01-09 12:00" )
107
+ } ;
108
+
109
+ Assert . Equal ( 10 , new Personnummer ( "20800108-6670" , new Personnummer . Options ( ) { TimeProvider = timeProvider } ) . Age ) ; // Had birthday yesterday
110
+ Assert . Equal ( 10 , new Personnummer ( "20800109-8287" , new Personnummer . Options ( ) { TimeProvider = timeProvider } ) . Age ) ; // Birthday today
111
+ Assert . Equal ( 9 , new Personnummer ( "20800110-8516" , new Personnummer . Options ( ) { TimeProvider = timeProvider } ) . Age ) ; // Upcoming Birthday tomorrow
112
+ }
113
+
94
114
#endif
95
115
96
116
[ Theory ]
@@ -236,15 +256,5 @@ public void TestParseTooShort()
236
256
} ) . Message
237
257
) ;
238
258
}
239
-
240
- [ Fact ]
241
- public void TestEdgeCasesAroundBirthday ( )
242
- {
243
- var timeProvider = new TestTimeProvider ( ) ; //TestTime is 2025-10-05
244
- Assert . Equal ( 18 , new Personnummer ( "20071004-3654" , new Personnummer . Options ( ) { TimeProvider = timeProvider } ) . Age ) ; // Had birthday yesterday
245
- Assert . Equal ( 18 , new Personnummer ( "20071005-3653" , new Personnummer . Options ( ) { TimeProvider = timeProvider } ) . Age ) ; // Birthday today
246
- Assert . Equal ( 17 , new Personnummer ( "20071006-3652" , new Personnummer . Options ( ) { TimeProvider = timeProvider } ) . Age ) ; // Upcoming Birthday tomorrow
247
- }
248
-
249
259
}
250
260
}
0 commit comments