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(); 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(); 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(); columns.Count.ShouldBe(3); columns.ShouldNotContain(c => c.Name == "NonOutputColumn"); } [Fact] public void GetColumns_ReturnsEmptyForEmptyModel() { var columns = _cache.GetColumns(); columns.Count.ShouldBe(0); } [Fact] public void GetColumns_CachesResults() { var columns1 = _cache.GetColumns(); var columns2 = _cache.GetColumns(); ReferenceEquals(columns1, columns2).ShouldBeTrue(); } [Fact] public void GetColumns_ByType_ReturnsCorrectColumns() { var columns = _cache.GetColumns(typeof(TestModel)); columns.Count.ShouldBe(3); } }