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.
This commit is contained in:
@@ -0,0 +1,365 @@
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,616 @@
|
||||
using JdeScoping.Core.Models.Infrastructure;
|
||||
using JdeScoping.Core.Models.Search;
|
||||
using JdeScoping.Core.ViewModels;
|
||||
using Shouldly;
|
||||
|
||||
namespace JdeScoping.Core.Tests.Unit;
|
||||
|
||||
/// <summary>
|
||||
/// Unit tests for the QueryTypes class
|
||||
/// </summary>
|
||||
public class QueryTypesTests
|
||||
{
|
||||
#region Static Definition Tests
|
||||
|
||||
[Fact]
|
||||
public void WorkOrder_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.WorkOrder;
|
||||
|
||||
qt.Code.ShouldBe("WorkOrder");
|
||||
qt.Name.ShouldBe("Work Order");
|
||||
qt.OrderIndex.ShouldBe(10);
|
||||
qt.WorkOrderFilter.ShouldBeTrue();
|
||||
qt.TimeSpanFilter.ShouldBeFalse();
|
||||
qt.ItemNumberFilter.ShouldBeFalse();
|
||||
qt.ProfitCenterFilter.ShouldBeFalse();
|
||||
qt.WorkCenterFilter.ShouldBeFalse();
|
||||
qt.ComponentLotFilter.ShouldBeFalse();
|
||||
qt.OperatorFilter.ShouldBeFalse();
|
||||
qt.ItemOperationMisFilter.ShouldBeFalse();
|
||||
qt.ExtractMisFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ComponentLot_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.ComponentLot;
|
||||
|
||||
qt.Code.ShouldBe("ComponentLot");
|
||||
qt.Name.ShouldBe("Component Lot");
|
||||
qt.OrderIndex.ShouldBe(20);
|
||||
qt.ComponentLotFilter.ShouldBeTrue();
|
||||
qt.TimeSpanFilter.ShouldBeFalse();
|
||||
qt.WorkOrderFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanProfitCenter_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanProfitCenter;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanProfitCenter");
|
||||
qt.Name.ShouldBe("Time Span + Profit Center");
|
||||
qt.OrderIndex.ShouldBe(30);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeTrue();
|
||||
qt.WorkOrderFilter.ShouldBeFalse();
|
||||
qt.ItemNumberFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanWorkCenter_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanWorkCenter;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanWorkCenter");
|
||||
qt.Name.ShouldBe("Time Span + Work Center");
|
||||
qt.OrderIndex.ShouldBe(40);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanOperator_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanOperator;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanOperator");
|
||||
qt.Name.ShouldBe("Time Span + Operator");
|
||||
qt.OrderIndex.ShouldBe(50);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.OperatorFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeFalse();
|
||||
qt.ProfitCenterFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanProfitCenterItem_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanProfitCenterItem;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanProfitCenterItem");
|
||||
qt.Name.ShouldBe("Time Span + Profit Center + Item Number");
|
||||
qt.OrderIndex.ShouldBe(60);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeTrue();
|
||||
qt.ItemNumberFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanProfitCenterIOM_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanProfitCenterIOM;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanProfitCenterIOM");
|
||||
qt.Name.ShouldBe("Time Span + Profit Center + Item/Operation/MIS");
|
||||
qt.OrderIndex.ShouldBe(70);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeTrue();
|
||||
qt.ItemOperationMisFilter.ShouldBeTrue();
|
||||
qt.ItemNumberFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanProfitCenterWorkOrderIOM_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanProfitCenterWorkOrderIOM;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanProfitCenterWorkOrderIOM");
|
||||
qt.Name.ShouldBe("Time Span + Profit Center + Work Order + Item/Operation/MIS");
|
||||
qt.OrderIndex.ShouldBe(80);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.WorkOrderFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeTrue();
|
||||
qt.ItemOperationMisFilter.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanProfitCenterExtractMIS_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanProfitCenterExtractMIS;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanProfitCenterExtractMIS");
|
||||
qt.Name.ShouldBe("Time Span + Profit Center + Extract MIS");
|
||||
qt.OrderIndex.ShouldBe(90);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeTrue();
|
||||
qt.ExtractMisFilter.ShouldBeTrue();
|
||||
qt.ItemOperationMisFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanWorkCenterItem_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanWorkCenterItem;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanWorkCenterItem");
|
||||
qt.Name.ShouldBe("Time Span + Work Center + Item Number");
|
||||
qt.OrderIndex.ShouldBe(100);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeTrue();
|
||||
qt.ItemNumberFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanWorkCenterExtractMIS_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanWorkCenterExtractMIS;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanWorkCenterExtractMIS");
|
||||
qt.Name.ShouldBe("Time Span + Work Center + Extract MIS");
|
||||
qt.OrderIndex.ShouldBe(110);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeTrue();
|
||||
qt.ExtractMisFilter.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanWorkCenterIOM_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanWorkCenterIOM;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanWorkCenterIOM");
|
||||
qt.Name.ShouldBe("Time Span + Work Center + Item/Operation/MIS");
|
||||
qt.OrderIndex.ShouldBe(120);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeTrue();
|
||||
qt.ItemOperationMisFilter.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanWorkCenterWorkOrderIOM_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanWorkCenterWorkOrderIOM;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanWorkCenterWorkOrderIOM");
|
||||
qt.Name.ShouldBe("Time Span + Work Center + Work Order + Item/Operation/MIS");
|
||||
qt.OrderIndex.ShouldBe(130);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.WorkOrderFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeTrue();
|
||||
qt.ItemOperationMisFilter.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanItem_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanItem;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanItem");
|
||||
qt.Name.ShouldBe("Time Span + Item Number");
|
||||
qt.OrderIndex.ShouldBe(140);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.ItemNumberFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeFalse();
|
||||
qt.WorkCenterFilter.ShouldBeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanWorkCenterOperator_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanWorkCenterOperator;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanWorkCenterOperator");
|
||||
qt.Name.ShouldBe("Time Span + Work Center + Operator");
|
||||
qt.OrderIndex.ShouldBe(150);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.WorkCenterFilter.ShouldBeTrue();
|
||||
qt.OperatorFilter.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TimeSpanProfitCenterOperator_HasCorrectProperties()
|
||||
{
|
||||
var qt = QueryTypes.TimeSpanProfitCenterOperator;
|
||||
|
||||
qt.Code.ShouldBe("TimeSpanProfitCenterOperator");
|
||||
qt.Name.ShouldBe("Time Span + Profit Center + Operator");
|
||||
qt.OrderIndex.ShouldBe(160);
|
||||
qt.TimeSpanFilter.ShouldBeTrue();
|
||||
qt.ProfitCenterFilter.ShouldBeTrue();
|
||||
qt.OperatorFilter.ShouldBeTrue();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region DefinedTypes Dictionary Tests
|
||||
|
||||
[Fact]
|
||||
public void DefinedTypes_ContainsExactly16Entries()
|
||||
{
|
||||
QueryTypes.DefinedTypes.Count.ShouldBe(16);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefinedTypes_ContainsAllStaticTypes()
|
||||
{
|
||||
var types = QueryTypes.DefinedTypes;
|
||||
|
||||
types.ShouldContainKey("WorkOrder");
|
||||
types.ShouldContainKey("ComponentLot");
|
||||
types.ShouldContainKey("TimeSpanProfitCenter");
|
||||
types.ShouldContainKey("TimeSpanWorkCenter");
|
||||
types.ShouldContainKey("TimeSpanOperator");
|
||||
types.ShouldContainKey("TimeSpanProfitCenterItem");
|
||||
types.ShouldContainKey("TimeSpanProfitCenterIOM");
|
||||
types.ShouldContainKey("TimeSpanProfitCenterWorkOrderIOM");
|
||||
types.ShouldContainKey("TimeSpanProfitCenterExtractMIS");
|
||||
types.ShouldContainKey("TimeSpanWorkCenterItem");
|
||||
types.ShouldContainKey("TimeSpanWorkCenterExtractMIS");
|
||||
types.ShouldContainKey("TimeSpanWorkCenterIOM");
|
||||
types.ShouldContainKey("TimeSpanWorkCenterWorkOrderIOM");
|
||||
types.ShouldContainKey("TimeSpanItem");
|
||||
types.ShouldContainKey("TimeSpanWorkCenterOperator");
|
||||
types.ShouldContainKey("TimeSpanProfitCenterOperator");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefinedTypes_AllCodesAreUnique()
|
||||
{
|
||||
var codes = QueryTypes.DefinedTypes.Keys.ToList();
|
||||
var uniqueCodes = codes.Distinct().ToList();
|
||||
|
||||
codes.Count.ShouldBe(uniqueCodes.Count);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetAll Tests
|
||||
|
||||
[Fact]
|
||||
public void GetAll_Returns16Types()
|
||||
{
|
||||
var allTypes = QueryTypes.GetAll().ToList();
|
||||
|
||||
allTypes.Count.ShouldBe(16);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetAll_ReturnsSortedByOrderIndex()
|
||||
{
|
||||
var allTypes = QueryTypes.GetAll().ToList();
|
||||
|
||||
for (int i = 1; i < allTypes.Count; i++)
|
||||
{
|
||||
allTypes[i].OrderIndex.ShouldBeGreaterThan(allTypes[i - 1].OrderIndex);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetAll_FirstIsWorkOrder()
|
||||
{
|
||||
var first = QueryTypes.GetAll().First();
|
||||
|
||||
first.Code.ShouldBe("WorkOrder");
|
||||
first.OrderIndex.ShouldBe(10);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetAll_LastIsTimeSpanProfitCenterOperator()
|
||||
{
|
||||
var last = QueryTypes.GetAll().Last();
|
||||
|
||||
last.Code.ShouldBe("TimeSpanProfitCenterOperator");
|
||||
last.OrderIndex.ShouldBe(160);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetByCode Tests
|
||||
|
||||
[Theory]
|
||||
[InlineData("WorkOrder")]
|
||||
[InlineData("ComponentLot")]
|
||||
[InlineData("TimeSpanProfitCenter")]
|
||||
[InlineData("TimeSpanWorkCenter")]
|
||||
[InlineData("TimeSpanItem")]
|
||||
public void GetByCode_ReturnsCorrectType_ForValidCode(string code)
|
||||
{
|
||||
var result = QueryTypes.GetByCode(code);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe(code);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetByCode_ReturnsNull_ForInvalidCode()
|
||||
{
|
||||
var result = QueryTypes.GetByCode("InvalidCode");
|
||||
|
||||
result.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetByCode_IsCaseSensitive()
|
||||
{
|
||||
var result = QueryTypes.GetByCode("workorder"); // lowercase
|
||||
|
||||
result.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetByCode_ReturnsNull_ForEmptyString()
|
||||
{
|
||||
var result = QueryTypes.GetByCode("");
|
||||
|
||||
result.ShouldBeNull();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Identify Tests
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsNull_ForNullCriteria()
|
||||
{
|
||||
var result = QueryTypes.Identify(null!);
|
||||
|
||||
result.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsNull_ForEmptyCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria();
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsWorkOrder_ForWorkOrderCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
WorkOrderNumbers = [12345]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("WorkOrder");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsComponentLot_ForComponentLotCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
ComponentLotNumbers = [new LotViewModel { LotNumber = "LOT123", ItemNumber = "ITEM1" }]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("ComponentLot");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanProfitCenter_ForTimeSpanAndProfitCenterCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-30),
|
||||
ProfitCenters = ["PC01"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanProfitCenter");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanWorkCenter_ForTimeSpanAndWorkCenterCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MaximumDt = DateTime.Now,
|
||||
WorkCenters = ["WC01"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanWorkCenter");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanOperator_ForTimeSpanAndOperatorCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-7),
|
||||
OperatorIDs = ["OP001"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanOperator");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanItem_ForTimeSpanAndItemCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-30),
|
||||
ItemNumbers = ["ITEM001"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanItem");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanProfitCenterItem_ForComplexCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-30),
|
||||
ProfitCenters = ["PC01"],
|
||||
ItemNumbers = ["ITEM001"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanProfitCenterItem");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanProfitCenterExtractMIS_ForExtractMisCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-30),
|
||||
ProfitCenters = ["PC01"],
|
||||
ExtractMisData = true
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanProfitCenterExtractMIS");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanProfitCenterIOM_ForPartOperationsCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-30),
|
||||
ProfitCenters = ["PC01"],
|
||||
PartOperations = [new PartOperationViewModel { ItemNumber = "ITEM1", OperationNumber = "10" }]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanProfitCenterIOM");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanProfitCenterWorkOrderIOM_ForComplexIOMCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-30),
|
||||
WorkOrderNumbers = [12345],
|
||||
ProfitCenters = ["PC01"],
|
||||
PartOperations = [new PartOperationViewModel { ItemNumber = "ITEM1", OperationNumber = "10" }]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanProfitCenterWorkOrderIOM");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanWorkCenterOperator_ForWorkCenterAndOperatorCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-7),
|
||||
WorkCenters = ["WC01"],
|
||||
OperatorIDs = ["OP001"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanWorkCenterOperator");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsTimeSpanProfitCenterOperator_ForProfitCenterAndOperatorCriteria()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-7),
|
||||
ProfitCenters = ["PC01"],
|
||||
OperatorIDs = ["OP001"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanProfitCenterOperator");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_ReturnsNull_ForInvalidCombination()
|
||||
{
|
||||
// This combination doesn't match any defined query type
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
WorkOrderNumbers = [12345],
|
||||
ComponentLotNumbers = [new LotViewModel { LotNumber = "LOT1", ItemNumber = "ITEM1" }]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_HandlesMinimumDtOnly()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MinimumDt = DateTime.Now.AddDays(-30),
|
||||
ProfitCenters = ["PC01"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanProfitCenter");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Identify_HandlesMaximumDtOnly()
|
||||
{
|
||||
var criteria = new SearchCriteria
|
||||
{
|
||||
MaximumDt = DateTime.Now,
|
||||
WorkCenters = ["WC01"]
|
||||
};
|
||||
|
||||
var result = QueryTypes.Identify(criteria);
|
||||
|
||||
result.ShouldNotBeNull();
|
||||
result.Code.ShouldBe("TimeSpanWorkCenter");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user