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,100 @@
|
||||
using JdeScoping.ExcelIO.Attributes;
|
||||
using JdeScoping.ExcelIO.Helpers;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests;
|
||||
|
||||
public class OutputColumnCacheTests
|
||||
{
|
||||
private readonly OutputColumnCache _cache = new();
|
||||
|
||||
[OutputTable(TabName = "Test Table", TableName = "Test_Table")]
|
||||
private class TestModel
|
||||
{
|
||||
[OutputColumn(Order = 30, HeaderText = "Column C")]
|
||||
public string ColumnC { get; set; } = string.Empty;
|
||||
|
||||
[OutputColumn(Order = 10, HeaderText = "Column A")]
|
||||
public string ColumnA { get; set; } = string.Empty;
|
||||
|
||||
[OutputColumn(Order = 20, HeaderText = "Column B")]
|
||||
public string ColumnB { get; set; } = string.Empty;
|
||||
|
||||
public string NonOutputColumn { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
private class TieBreakModel
|
||||
{
|
||||
[OutputColumn(Order = 10, HeaderText = "Zebra")]
|
||||
public string Zebra { get; set; } = string.Empty;
|
||||
|
||||
[OutputColumn(Order = 10, HeaderText = "Apple")]
|
||||
public string Apple { get; set; } = string.Empty;
|
||||
|
||||
[OutputColumn(Order = 10, HeaderText = "Mango")]
|
||||
public string Mango { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
private class EmptyModel
|
||||
{
|
||||
public string NoAttributes { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetColumns_ReturnsColumnsOrderedByOrderProperty()
|
||||
{
|
||||
var columns = _cache.GetColumns<TestModel>();
|
||||
|
||||
columns.Count.ShouldBe(3);
|
||||
columns[0].Attribute.HeaderText.ShouldBe("Column A");
|
||||
columns[1].Attribute.HeaderText.ShouldBe("Column B");
|
||||
columns[2].Attribute.HeaderText.ShouldBe("Column C");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetColumns_TieBreaksAlphabeticallyByPropertyName()
|
||||
{
|
||||
var columns = _cache.GetColumns<TieBreakModel>();
|
||||
|
||||
columns.Count.ShouldBe(3);
|
||||
// All have Order=10, so should be sorted by property name
|
||||
columns[0].Name.ShouldBe("Apple");
|
||||
columns[1].Name.ShouldBe("Mango");
|
||||
columns[2].Name.ShouldBe("Zebra");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetColumns_ExcludesPropertiesWithoutAttribute()
|
||||
{
|
||||
var columns = _cache.GetColumns<TestModel>();
|
||||
|
||||
columns.Count.ShouldBe(3);
|
||||
columns.ShouldNotContain(c => c.Name == "NonOutputColumn");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetColumns_ReturnsEmptyForEmptyModel()
|
||||
{
|
||||
var columns = _cache.GetColumns<EmptyModel>();
|
||||
|
||||
columns.Count.ShouldBe(0);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetColumns_CachesResults()
|
||||
{
|
||||
var columns1 = _cache.GetColumns<TestModel>();
|
||||
var columns2 = _cache.GetColumns<TestModel>();
|
||||
|
||||
ReferenceEquals(columns1, columns2).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetColumns_ByType_ReturnsCorrectColumns()
|
||||
{
|
||||
var columns = _cache.GetColumns(typeof(TestModel));
|
||||
|
||||
columns.Count.ShouldBe(3);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user