using JdeScoping.Core.Helpers; using Shouldly; namespace JdeScoping.Core.Tests.Unit; public class JdeDateConverterTests { #region ToDateTime(int jdeDate) Tests [Fact] public void ToDateTime_WithZero_ReturnsNull() { // Act var result = JdeDateConverter.ToDateTime(0); // Assert result.ShouldBeNull(); } [Fact] public void ToDateTime_WithNegative_ReturnsNull() { // Act var result = JdeDateConverter.ToDateTime(-1); // Assert result.ShouldBeNull(); } [Fact] public void ToDateTime_With1900sDate_ConvertsCorrectly() { // Arrange - January 1, 1990 = 090001 (C=0, YY=90, DDD=001) int jdeDate = 90001; // Act var result = JdeDateConverter.ToDateTime(jdeDate); // Assert result.ShouldNotBeNull(); result.Value.Year.ShouldBe(1990); result.Value.Month.ShouldBe(1); result.Value.Day.ShouldBe(1); } [Fact] public void ToDateTime_With2000sDate_ConvertsCorrectly() { // Arrange - January 1, 2024 = 124001 (C=1, YY=24, DDD=001) int jdeDate = 124001; // Act var result = JdeDateConverter.ToDateTime(jdeDate); // Assert result.ShouldNotBeNull(); result.Value.Year.ShouldBe(2024); result.Value.Month.ShouldBe(1); result.Value.Day.ShouldBe(1); } [Fact] public void ToDateTime_WithLeapYearDay366_ConvertsCorrectly() { // Arrange - December 31, 2024 = 124366 (2024 is a leap year) int jdeDate = 124366; // Act var result = JdeDateConverter.ToDateTime(jdeDate); // Assert result.ShouldNotBeNull(); result.Value.Year.ShouldBe(2024); result.Value.Month.ShouldBe(12); result.Value.Day.ShouldBe(31); } [Fact] public void ToDateTime_WithNonLeapYearDay366_ReturnsNull() { // Arrange - 2023 is not a leap year, so day 366 is invalid int jdeDate = 123366; // Act var result = JdeDateConverter.ToDateTime(jdeDate); // Assert result.ShouldBeNull(); } [Fact] public void ToDateTime_WithInvalidDayOfYear_Zero_ReturnsNull() { // Arrange - day 0 is invalid int jdeDate = 124000; // Act var result = JdeDateConverter.ToDateTime(jdeDate); // Assert result.ShouldBeNull(); } [Fact] public void ToDateTime_WithInvalidDayOfYear_TooHigh_ReturnsNull() { // Arrange - day 400 is invalid int jdeDate = 124400; // Act var result = JdeDateConverter.ToDateTime(jdeDate); // Assert result.ShouldBeNull(); } [Fact] public void ToDateTime_WithMidYearDate_ConvertsCorrectly() { // Arrange - July 4, 2024 = day 186 of year = 124186 int jdeDate = 124186; // Act var result = JdeDateConverter.ToDateTime(jdeDate); // Assert result.ShouldNotBeNull(); result.Value.Year.ShouldBe(2024); result.Value.Month.ShouldBe(7); result.Value.Day.ShouldBe(4); } #endregion #region ToDateTime(int jdeDate, int jdeTime) Tests [Fact] public void ToDateTime_WithValidTime_ConvertsCorrectly() { // Arrange - January 1, 2024 at 14:30:45 int jdeDate = 124001; int jdeTime = 143045; // Act var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime); // Assert result.ShouldNotBeNull(); result.Value.Year.ShouldBe(2024); result.Value.Month.ShouldBe(1); result.Value.Day.ShouldBe(1); result.Value.Hour.ShouldBe(14); result.Value.Minute.ShouldBe(30); result.Value.Second.ShouldBe(45); } [Fact] public void ToDateTime_WithZeroTime_ReturnsDateOnly() { // Arrange int jdeDate = 124001; int jdeTime = 0; // Act var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime); // Assert result.ShouldNotBeNull(); result.Value.Hour.ShouldBe(0); result.Value.Minute.ShouldBe(0); result.Value.Second.ShouldBe(0); } [Fact] public void ToDateTime_WithMidnight_ConvertsCorrectly() { // Arrange - midnight = 000000 int jdeDate = 124001; int jdeTime = 1; // 00:00:01 // Act var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime); // Assert result.ShouldNotBeNull(); result.Value.Hour.ShouldBe(0); result.Value.Minute.ShouldBe(0); result.Value.Second.ShouldBe(1); } [Fact] public void ToDateTime_WithEndOfDay_ConvertsCorrectly() { // Arrange - 23:59:59 int jdeDate = 124001; int jdeTime = 235959; // Act var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime); // Assert result.ShouldNotBeNull(); result.Value.Hour.ShouldBe(23); result.Value.Minute.ShouldBe(59); result.Value.Second.ShouldBe(59); } [Fact] public void ToDateTime_WithInvalidDate_IgnoresTime() { // Arrange int jdeDate = 0; int jdeTime = 120000; // Act var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime); // Assert result.ShouldBeNull(); } #endregion #region ToJdeDate Extension Method Tests [Fact] public void ToJdeDate_With1900sDate_ConvertsCorrectly() { // Arrange var date = new DateTime(1990, 1, 1); // Act var result = date.ToJdeDate(); // Assert result.ShouldBe(90001); } [Fact] public void ToJdeDate_With2000sDate_ConvertsCorrectly() { // Arrange var date = new DateTime(2024, 1, 1); // Act var result = date.ToJdeDate(); // Assert result.ShouldBe(124001); } [Fact] public void ToJdeDate_WithLeapYearLastDay_ConvertsCorrectly() { // Arrange - December 31, 2024 is day 366 var date = new DateTime(2024, 12, 31); // Act var result = date.ToJdeDate(); // Assert result.ShouldBe(124366); } [Fact] public void ToJdeDate_WithMidYearDate_ConvertsCorrectly() { // Arrange - July 4, 2024 is day 186 var date = new DateTime(2024, 7, 4); // Act var result = date.ToJdeDate(); // Assert result.ShouldBe(124186); } #endregion #region ToJdeTime Extension Method Tests [Fact] public void ToJdeTime_WithMidnight_ReturnsZero() { // Arrange var date = new DateTime(2024, 1, 1, 0, 0, 0); // Act var result = date.ToJdeTime(); // Assert result.ShouldBe(0); } [Fact] public void ToJdeTime_WithAfternoon_ConvertsCorrectly() { // Arrange var date = new DateTime(2024, 1, 1, 14, 30, 45); // Act var result = date.ToJdeTime(); // Assert result.ShouldBe(143045); } [Fact] public void ToJdeTime_WithEndOfDay_ConvertsCorrectly() { // Arrange var date = new DateTime(2024, 1, 1, 23, 59, 59); // Act var result = date.ToJdeTime(); // Assert result.ShouldBe(235959); } #endregion #region Round-Trip Tests [Theory] [InlineData(1990, 1, 1)] [InlineData(1999, 12, 31)] [InlineData(2000, 1, 1)] [InlineData(2024, 7, 4)] [InlineData(2024, 12, 31)] public void RoundTrip_DateOnly_PreservesValue(int year, int month, int day) { // Arrange var original = new DateTime(year, month, day); // Act var jdeDate = original.ToJdeDate(); var converted = JdeDateConverter.ToDateTime(jdeDate); // Assert converted.ShouldNotBeNull(); converted.Value.Date.ShouldBe(original.Date); } [Theory] [InlineData(0, 0, 0)] [InlineData(12, 30, 45)] [InlineData(23, 59, 59)] public void RoundTrip_DateAndTime_PreservesValue(int hour, int minute, int second) { // Arrange var original = new DateTime(2024, 6, 15, hour, minute, second); // Act var jdeDate = original.ToJdeDate(); var jdeTime = original.ToJdeTime(); var converted = JdeDateConverter.ToDateTime(jdeDate, jdeTime); // Assert converted.ShouldNotBeNull(); converted.Value.ShouldBe(original); } #endregion }