diff --git a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharp/TimeSpanInCSharp.csproj b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharp/TimeSpanInCSharp.csproj index f02677bf64..dfb40caafc 100644 --- a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharp/TimeSpanInCSharp.csproj +++ b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharp/TimeSpanInCSharp.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net10.0 enable enable diff --git a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanInCSharpTests.csproj b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanInCSharpTests.csproj index 01bb70b283..84510344bc 100644 --- a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanInCSharpTests.csproj +++ b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanInCSharpTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanUnitTests.cs b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanUnitTests.cs index 53c694ba8b..ccffe42c17 100644 --- a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanUnitTests.cs +++ b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/TimeSpanUnitTests.cs @@ -50,8 +50,8 @@ public void GivenTwoTimeSpanValues_WhenCompareToOperationExecuted_VerifyAccurate [TestMethod] public void GivenTwoTimeSpanValues_WhenDivideOperationExecuted_VerifyAccurateResult() { - var firstTimeSpan = new TimeSpan(2, 60, 3600); - var secondTimeSpan = new TimeSpan(1, 30, 1800); + var firstTimeSpan = new TimeSpan(4, 0, 0); + var secondTimeSpan = new TimeSpan(2, 0, 0); var expected = firstTimeSpan.Divide(secondTimeSpan); var actual = firstTimeSpan / secondTimeSpan; @@ -64,8 +64,8 @@ public void GivenTwoTimeSpanValues_WhenDivideOperationExecuted_VerifyAccurateRes [TestMethod] public void GivenATimeSpan_WhenDividedByDivisor_VerifyAccurateResult() { - var firstTimeSpan = new TimeSpan(2, 60, 3600); - var secondTimeSpan = new TimeSpan(1, 30, 1800); + var firstTimeSpan = new TimeSpan(4, 0, 0); + var secondTimeSpan = new TimeSpan(2, 0, 0); var divisionByMethod = firstTimeSpan.Divide(2); var divisionByOperator = firstTimeSpan / 2; @@ -95,8 +95,8 @@ public void GivenTwoTimeSpanValues_WhenEqualityOperationApplied_VerifyAccurateRe [TestMethod] public void GivenATimeSpanAndFactor_WhenMultiplied_VerifyAccurateResult() { - var expected = new TimeSpan(2, 60, 3600); - var firstTimeSpan = new TimeSpan(1, 30, 1800); + var expected = new TimeSpan(4, 0, 0); + var firstTimeSpan = new TimeSpan(2, 0, 0); var factor = 2; var multiplyMethod = firstTimeSpan.Multiply(factor); @@ -112,9 +112,9 @@ public void GivenATimeSpanAndFactor_WhenMultiplied_VerifyAccurateResult() [TestMethod] public void GivenTwoTimeSpans_WhenSubtractOperationApplied_VerifyAccurateResult() { - var firstTimeSpan = new TimeSpan(2, 60, 3600); - var secondTimeSpan = new TimeSpan(1, 30, 1800); - var expected = new TimeSpan(1, 30, 1800); + var firstTimeSpan = new TimeSpan(4, 0, 0); + var secondTimeSpan = new TimeSpan(2, 0, 0); + var expected = new TimeSpan(2, 0, 0); var subtractMethod = firstTimeSpan.Subtract(secondTimeSpan); var subtractOperator = firstTimeSpan - secondTimeSpan; @@ -141,12 +141,12 @@ public void GivenATimeSpan_WhenConvertedToString_VerifyAccurateResult() [TestMethod] public void GivenATimeSpan_WhenConvertedToDuration_VerifyAccurateResult() { - var firstTimeSpan = new TimeSpan(2, 60, 3600); + var firstTimeSpan = new TimeSpan(4, 0, 0); var actual = firstTimeSpan.Duration(); - var expected = new TimeSpan(04, 00, 00); + var expected = new TimeSpan(4, 0, 0); - Assert.AreEqual(actual, expected); + Assert.AreEqual(expected, actual); Assert.IsInstanceOfType(actual, typeof(TimeSpan)); } @@ -159,7 +159,7 @@ public void GivenATimeSpan_WhenNegated_VerifyAccurateResult() var negateMethod = firstTimeSpan.Negate(); var negateOperator = -(firstTimeSpan); - Assert.AreEqual(negateMethod, expected); + Assert.AreEqual(expected, negateMethod); Assert.AreEqual(negateMethod, negateOperator); Assert.IsInstanceOfType(negateMethod, typeof(TimeSpan)); } @@ -189,5 +189,51 @@ public void GivenNumberOfHours_WhenFromHoursInvoked_VerifyAccurateResult() Assert.AreEqual(expected, actual); Assert.AreEqual(hours, totalHours); } + + [TestMethod] + public void GivenATimeSpan_WhenFormattedWithSpecifiers_VerifyAccurateResult() + { + var interval = new TimeSpan(1, 2, 3, 4, 5); + + Assert.AreEqual("1.02:03:04.0050000", interval.ToString("c", CultureInfo.InvariantCulture)); + Assert.AreEqual("1:2:03:04.005", interval.ToString("g", CultureInfo.InvariantCulture)); + Assert.AreEqual("02:03", interval.ToString(@"hh\:mm", CultureInfo.InvariantCulture)); + Assert.ThrowsExactly(() => interval.ToString("hh:mm", CultureInfo.InvariantCulture)); + } + + [TestMethod] + public void GivenStrings_WhenTryParseInvoked_VerifyAccurateResult() + { + Assert.IsFalse(TimeSpan.TryParse("24:00", out var failed)); + Assert.AreEqual(TimeSpan.Zero, failed); + + Assert.IsTrue(TimeSpan.TryParse("23:00", out var parsed)); + Assert.AreEqual(new TimeSpan(23, 0, 0), parsed); + + Assert.IsTrue(TimeSpan.TryParse("6", out var days)); + Assert.AreEqual(TimeSpan.FromDays(6), days); + } + + [TestMethod] + public void GivenTheNamedValues_WhenInspected_VerifyRangeBehavior() + { + Assert.AreEqual("10675199.02:48:05.4775807", TimeSpan.MaxValue.ToString()); + Assert.AreEqual(long.MaxValue, TimeSpan.MaxValue.Ticks); + Assert.AreEqual(long.MinValue, TimeSpan.MinValue.Ticks); + + Assert.ThrowsExactly(() => TimeSpan.MinValue.Negate()); + Assert.AreEqual(TimeSpan.FromMilliseconds(-1), Timeout.InfiniteTimeSpan); + } + + [TestMethod] + public void GivenSecondsAndMilliseconds_WhenIntegerOverloadUsed_VerifyNoPrecisionLoss() + { + var fromDouble = TimeSpan.FromSeconds(101.832); + var fromIntegers = TimeSpan.FromSeconds(seconds: 101, milliseconds: 832); + + Assert.AreEqual(1018319999L, fromDouble.Ticks); + Assert.AreEqual(1018320000L, fromIntegers.Ticks); + Assert.AreNotEqual(fromDouble, fromIntegers); + } } -} \ No newline at end of file +} diff --git a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/Usings.cs b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/Usings.cs index ab67c7ea9d..df6e1bd89b 100644 --- a/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/Usings.cs +++ b/dotnet-datetime/TimeSpanInCSharp/TimeSpanInCSharpTests/Usings.cs @@ -1 +1,2 @@ -global using Microsoft.VisualStudio.TestTools.UnitTesting; \ No newline at end of file +global using System.Globalization; +global using Microsoft.VisualStudio.TestTools.UnitTesting;