Files
jdescopingtool/NEW/tests/JdeScoping.ExcelIO.Tests/OutputColumnCacheTests.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

101 lines
2.9 KiB
C#

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);
}
}