using JdeScoping.DataSync.Services; using Shouldly; namespace JdeScoping.DataSync.Tests.Services; public class ParameterFormatConverterTests { [Fact] public void ToJdeJulianDate_Year2024Day100_Returns124100() { var date = new DateTime(2024, 4, 9); // Day 100 var result = ParameterFormatConverter.ToJdeJulianDate(date); result.ShouldBe(124100); } [Fact] public void ToJdeJulianDate_Year1999Day365_Returns99365() { var date = new DateTime(1999, 12, 31); var result = ParameterFormatConverter.ToJdeJulianDate(date); result.ShouldBe(99365); } [Fact] public void ToJdeJulianDate_Year2000Day1_Returns100001() { // Year 2000 should have century bit = 1 var date = new DateTime(2000, 1, 1); var result = ParameterFormatConverter.ToJdeJulianDate(date); result.ShouldBe(100001); } [Fact] public void ToJdeJulianDate_Year1998Day1_Returns98001() { // Year 1998 should have century bit = 0 var date = new DateTime(1998, 1, 1); var result = ParameterFormatConverter.ToJdeJulianDate(date); result.ShouldBe(98001); } [Fact] public void ToJdeTime_143025_Returns143025() { var time = new DateTime(2024, 1, 1, 14, 30, 25); var result = ParameterFormatConverter.ToJdeTime(time); result.ShouldBe(143025); } [Fact] public void ToJdeTime_Midnight_Returns0() { var time = new DateTime(2024, 1, 1, 0, 0, 0); var result = ParameterFormatConverter.ToJdeTime(time); result.ShouldBe(0); } [Fact] public void ToJdeTime_235959_Returns235959() { var time = new DateTime(2024, 1, 1, 23, 59, 59); var result = ParameterFormatConverter.ToJdeTime(time); result.ShouldBe(235959); } [Fact] public void Convert_WithUtcTimezone_UsesUtc() { var converter = new ParameterFormatConverter("UTC"); var utcTime = DateTime.SpecifyKind(new DateTime(2024, 4, 9, 12, 0, 0), DateTimeKind.Utc); var result = converter.Convert(utcTime, "jdeJulian"); result.ShouldBe(124100); } [Fact] public void Convert_WithJdeTimeFormat_ReturnsInteger() { var converter = new ParameterFormatConverter("UTC"); var utcTime = DateTime.SpecifyKind(new DateTime(2024, 1, 1, 14, 30, 25), DateTimeKind.Utc); var result = converter.Convert(utcTime, "jdetime"); result.ShouldBe(143025); } [Fact] public void Convert_WithNullFormat_ReturnsAdjustedDateTime() { var converter = new ParameterFormatConverter("UTC"); var utcTime = DateTime.SpecifyKind(new DateTime(2024, 4, 9, 12, 0, 0), DateTimeKind.Utc); var result = converter.Convert(utcTime, null); result.ShouldBeOfType(); ((DateTime)result).ShouldBe(new DateTime(2024, 4, 9, 12, 0, 0)); } [Fact] public void Convert_WithUnknownFormat_ThrowsArgumentException() { var converter = new ParameterFormatConverter("UTC"); var utcTime = DateTime.SpecifyKind(new DateTime(2024, 4, 9, 12, 0, 0), DateTimeKind.Utc); Should.Throw(() => converter.Convert(utcTime, "unknown")); } [Fact] public void Constructor_WithLocalTimezone_Succeeds() { // Should not throw var converter = new ParameterFormatConverter("LOCAL"); converter.ShouldNotBeNull(); } [Fact] public void Constructor_WithUtcTimezone_Succeeds() { // Should not throw var converter = new ParameterFormatConverter("UTC"); converter.ShouldNotBeNull(); } [Fact] public void Convert_CaseInsensitiveFormat_ReturnsCorrectValue() { var converter = new ParameterFormatConverter("UTC"); var utcTime = DateTime.SpecifyKind(new DateTime(2024, 4, 9, 12, 0, 0), DateTimeKind.Utc); // Test case insensitivity var result1 = converter.Convert(utcTime, "JDEJULIAN"); var result2 = converter.Convert(utcTime, "JdeJulian"); var result3 = converter.Convert(utcTime, "jdejulian"); result1.ShouldBe(124100); result2.ShouldBe(124100); result3.ShouldBe(124100); } [Fact] public void Constructor_CaseInsensitiveTimezone_Succeeds() { // All these should work var converter1 = new ParameterFormatConverter("utc"); var converter2 = new ParameterFormatConverter("Utc"); var converter3 = new ParameterFormatConverter("local"); var converter4 = new ParameterFormatConverter("Local"); converter1.ShouldNotBeNull(); converter2.ShouldNotBeNull(); converter3.ShouldNotBeNull(); converter4.ShouldNotBeNull(); } }