26ff8d9b4f
Set up repository with legacy .NET Framework 4.8 source (OLD/), new .NET 10 Blazor solution (NEW/), OpenSpec specifications, documentation, and project configuration.
366 lines
8.7 KiB
C#
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
|
|
}
|