Files
jdescopingtool/NEW/tests/JdeScoping.Core.Tests/Unit/JdeDateConverterTests.cs
T
Joseph Doherty 26ff8d9b4f Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
2026-01-02 07:43:29 -05:00

366 lines
8.7 KiB
C#

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
}