public void Test_WallClockTime_FromApproximateDateTimeOffset_And_FromPseudoMilliseconds_Difference_Between_Dates_Results_In_Expected_Number_Of_Leap_Seconds( int startYear, int startMonth, int expectedSeconds) { //Arrange var dtoStart = new DateTimeOffset(startYear, startMonth, 1, 0, 0, 0, TimeSpan.Zero); var dtoNow = new DateTimeOffset(2025, 6, 1, 0, 0, 0, TimeSpan.Zero); var wctStart = WallClockTime.FromApproximateDateTimeOffset(dtoStart); var wctNow = WallClockTime.FromApproximateDateTimeOffset(dtoNow); var wctStart2 = WallClockTime.FromPseudoMilliseconds(dtoStart.ToUnixTimeMilliseconds()); var wctNow2 = WallClockTime.FromPseudoMilliseconds(dtoNow.ToUnixTimeMilliseconds()); //Act var dtoDiff = dtoNow - dtoStart; var wctDiff = wctNow - wctStart; var wctDiff2 = wctNow2 - wctStart2; var leapSeconds = (wctDiff - dtoDiff).TotalSeconds; var leapSeconds2 = (wctDiff2 - dtoDiff).TotalSeconds; //Assert Assert.AreEqual(expectedSeconds, leapSeconds); Assert.AreEqual(expectedSeconds, leapSeconds2); }
public void Test_WallClockTime_AddTrueMilliseconds_And_SubtractTrueMilliseconds_Works_With_Negative_Numbers( int year, int month, int day, int second, int negativeOrZeroSeconds, int expectedLeapSeconds) { //Arrange var negativeOrZeroMs = negativeOrZeroSeconds * 1000; var dto = new DateTimeOffset(year, month, day, 0, 0, second, TimeSpan.Zero); var wct = WallClockTime.FromApproximateDateTimeOffset(dto); //Act var addResult = wct.AddTrueMilliseconds(negativeOrZeroMs); var substractResult = addResult.SubtractTrueMilliseconds(negativeOrZeroMs); //Assert Assert.IsTrue(substractResult.Equals(wct)); Assert.IsTrue(substractResult <= wct); Assert.IsTrue(substractResult == wct); Assert.IsTrue(substractResult >= addResult); Assert.IsTrue(substractResult > addResult); Assert.IsTrue(substractResult != addResult); Assert.IsTrue(addResult < wct); Assert.AreEqual(substractResult.ToApproximateDateTimeOffset(), dto); Assert.AreEqual(addResult.ToApproximateDateTimeOffset(), dto.AddMilliseconds(negativeOrZeroMs + expectedLeapSeconds * 1000)); }