26ff8d9b4f
Set up repository with legacy .NET Framework 4.8 source (OLD/), new .NET 10 Blazor solution (NEW/), OpenSpec specifications, documentation, and project configuration.
101 lines
2.9 KiB
C#
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);
|
|
}
|
|
}
|