From 9b60ca3db510c9cb10b5f18be0fd694a702d7013 Mon Sep 17 00:00:00 2001 From: Aaron Schiff Date: Sat, 27 Jul 2019 17:15:41 -0500 Subject: [PATCH] Add tests for edge cases in ToLocalTIme For dotnet/coreclrdotnet/corefx#25658: Added conditional tests for ToLocalTIme() to test its behavior with DateTime.MinValue, DateTime.MaxValue, and ambiguous DST time. Fixed duplicate theory parameter for Subtract_DateTimeOffset. Commit migrated from https://github.com/dotnet/corefx/commit/dc8e5eb91bb8493f4a6ef6b1e3cd492d3a9a85e3 --- .../tests/System/DateTimeOffsetTests.cs | 43 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Runtime/tests/System/DateTimeOffsetTests.cs b/src/libraries/System.Runtime/tests/System/DateTimeOffsetTests.cs index cd6e29a..77d0d8f 100644 --- a/src/libraries/System.Runtime/tests/System/DateTimeOffsetTests.cs +++ b/src/libraries/System.Runtime/tests/System/DateTimeOffsetTests.cs @@ -306,8 +306,8 @@ namespace System.Tests var dateTimeOffset3 = new DateTimeOffset(new DateTime(1996, 10, 12, 8, 42, 0, DateTimeKind.Utc)); yield return new object[] { dateTimeOffset2, dateTimeOffset1, new TimeSpan(185, 14, 47, 0) }; - yield return new object[] { dateTimeOffset1, dateTimeOffset2, new TimeSpan(-185, -14, -47, 0) }; - yield return new object[] { dateTimeOffset1, dateTimeOffset2, new TimeSpan(-185, -14, -47, 0) }; + yield return new object[] { dateTimeOffset1, dateTimeOffset2, -new TimeSpan(185, 14, 47, 0) }; + yield return new object[] { dateTimeOffset1, dateTimeOffset3, -new TimeSpan(130, 10, 27, 0) }; } [Theory] @@ -674,7 +674,44 @@ namespace System.Tests DateTimeOffset dateTimeOffset = new DateTimeOffset(new DateTime(1000, DateTimeKind.Utc)); Assert.Equal(new DateTimeOffset(dateTimeOffset.UtcDateTime.ToLocalTime()), dateTimeOffset.ToLocalTime()); } - + + public static bool IsMinValueNegativeLocalOffset() => TimeZoneInfo.Local.GetUtcOffset(DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc)).Ticks < 0; + + [ConditionalFact(nameof(IsMinValueNegativeLocalOffset))] + public static void ToLocalTime_MinValue() + { + DateTimeOffset dateTimeOffset = new DateTimeOffset(DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc)); + TimeSpan offset = TimeZoneInfo.Local.GetUtcOffset(dateTimeOffset); + Assert.Equal(new DateTimeOffset(DateTime.MinValue, offset), dateTimeOffset.ToLocalTime()); + } + + public static bool IsMaxValuePositiveLocalOffset() => TimeZoneInfo.Local.GetUtcOffset(DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc)).Ticks > 0; + + [ConditionalFact(nameof(IsMaxValuePositiveLocalOffset))] + public static void ToLocalTime_MaxValue() + { + DateTimeOffset dateTimeOffset = new DateTimeOffset(DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc)); + TimeSpan offset = TimeZoneInfo.Local.GetUtcOffset(dateTimeOffset); + Assert.Equal(new DateTimeOffset(DateTime.MaxValue, offset), dateTimeOffset.ToLocalTime()); + } + + public static bool IsPacificTime() => TimeZoneInfo.Local.Id == "Pacific Standard Time"; + + public static IEnumerable ToLocalTime_Ambiguous_TestData() + { + yield return new object[] { new DateTime(2019, 11, 3, 8, 0, 0), new TimeSpan(-7, 0, 0) }; + yield return new object[] { new DateTime(2019, 11, 3, 9, 0, 0), new TimeSpan(-8, 0, 0) }; + } + + [ConditionalTheory(nameof(IsPacificTime))] + [MemberData(nameof(ToLocalTime_Ambiguous_TestData))] + public static void ToLocalTime_Ambiguous(DateTime utc, TimeSpan offset) + { + DateTimeOffset expectedLocalTime = new DateTimeOffset(utc + offset, offset); + DateTimeOffset actualLocalTime = new DateTimeOffset(utc, default).ToLocalTime(); + Assert.Equal(expectedLocalTime, actualLocalTime); + } + public static IEnumerable Equals_TestData() { yield return new object[] { DateTimeOffset.MinValue, DateTimeOffset.MinValue, true, true }; -- 2.7.4