1111using Umbraco . Cms . Core . PropertyEditors ;
1212using Umbraco . Cms . Tests . Common . TestHelpers ;
1313using Umbraco . Extensions ;
14+ using DateTimeOffset = System . DateTimeOffset ;
1415
1516namespace Umbraco . Cms . Tests . UnitTests . Umbraco . Core . CoreThings ;
1617
@@ -332,6 +333,50 @@ public void CanConvertStringValuesToString()
332333 Assert . AreEqual ( "This is a string" , conv . Result ) ;
333334 }
334335
336+ [ Test ]
337+ public void CanConvertDateTimeOffsetToDateTime ( )
338+ {
339+ var dateTimeOffset = new DateTimeOffset ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) , TimeSpan . Zero ) ;
340+ var result = dateTimeOffset . TryConvertTo < DateTime > ( ) ;
341+ Assert . IsTrue ( result . Success ) ;
342+ Assert . Multiple ( ( ) =>
343+ {
344+ Assert . AreEqual ( new DateTime ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) ) , result . Result ) ;
345+ Assert . AreEqual ( DateTimeKind . Utc , result . Result . Kind ) ;
346+ } ) ;
347+ }
348+
349+ [ Test ]
350+ public void CanConvertDateTimeToDateTimeOffset ( )
351+ {
352+ var dateTime = new DateTime ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) , DateTimeKind . Utc ) ;
353+ var result = dateTime . TryConvertTo < DateTimeOffset > ( ) ;
354+ Assert . IsTrue ( result . Success ) ;
355+ Assert . AreEqual ( new DateTimeOffset ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) , TimeSpan . Zero ) , result . Result ) ;
356+ }
357+
358+ [ Test ]
359+ public void DiscardsOffsetWhenConvertingDateTimeOffsetToDateTime ( )
360+ {
361+ var dateTimeOffset = new DateTimeOffset ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) , TimeSpan . FromHours ( 2 ) ) ;
362+ var result = dateTimeOffset . TryConvertTo < DateTime > ( ) ;
363+ Assert . IsTrue ( result . Success ) ;
364+ Assert . Multiple ( ( ) =>
365+ {
366+ Assert . AreEqual ( new DateTime ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) ) , result . Result ) ;
367+ Assert . AreEqual ( DateTimeKind . Utc , result . Result . Kind ) ;
368+ } ) ;
369+ }
370+
371+ [ Test ]
372+ public void DiscardsDateTimeKindWhenConvertingDateTimeToDateTimeOffset ( )
373+ {
374+ var dateTime = new DateTime ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) , DateTimeKind . Local ) ;
375+ var result = dateTime . TryConvertTo < DateTimeOffset > ( ) ;
376+ Assert . IsTrue ( result . Success ) ;
377+ Assert . AreEqual ( new DateTimeOffset ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 , 01 , 02 , 03 ) , TimeSpan . Zero ) , result . Result ) ;
378+ }
379+
335380 [ Test ]
336381 public void Value_Editor_Can_Convert_Decimal_To_Decimal_Clr_Type ( )
337382 {
@@ -342,6 +387,23 @@ public void Value_Editor_Can_Convert_Decimal_To_Decimal_Clr_Type()
342387 Assert . AreEqual ( 12.34d , result . Result ) ;
343388 }
344389
390+ [ Test ]
391+ public void Value_Editor_Can_Convert_DateTimeOffset_To_DateTime_Clr_Type ( )
392+ {
393+ var valueEditor = MockedValueEditors . CreateDataValueEditor ( ValueTypes . Date ) ;
394+
395+ var result = valueEditor . TryConvertValueToCrlType ( new DateTimeOffset ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 ) , TimeSpan . Zero ) ) ;
396+ Assert . IsTrue ( result . Success ) ;
397+ Assert . IsTrue ( result . Result is DateTime ) ;
398+
399+ var dateTime = ( DateTime ) result . Result ;
400+ Assert . Multiple ( ( ) =>
401+ {
402+ Assert . AreEqual ( new DateTime ( new DateOnly ( 2024 , 07 , 05 ) , new TimeOnly ( 12 , 30 ) ) , dateTime ) ;
403+ Assert . AreEqual ( DateTimeKind . Utc , dateTime . Kind ) ;
404+ } ) ;
405+ }
406+
345407 private class MyTestObject
346408 {
347409 public override string ToString ( ) => "Hello world" ;
0 commit comments