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

188 lines
5.9 KiB
C#

using ClosedXML.Excel;
using JdeScoping.ExcelIO.Attributes;
using JdeScoping.ExcelIO.Generators;
using JdeScoping.ExcelIO.Helpers;
using Shouldly;
using Xunit;
namespace JdeScoping.ExcelIO.Tests;
public class AttributeTableWriterTests
{
private readonly OutputColumnCache _cache = new();
private readonly AttributeTableWriter _writer;
public AttributeTableWriterTests()
{
_writer = new AttributeTableWriter(_cache);
}
[OutputTable(TabName = "Test Items", TableName = "Test_Items", ShowHeader = false)]
private class TestItem
{
[OutputColumn(Order = 10, HeaderText = "ID")]
public int Id { get; set; }
[OutputColumn(Order = 20, HeaderText = "Name")]
public string Name { get; set; } = string.Empty;
[OutputColumn(Order = 30, HeaderText = "Value")]
public decimal Value { get; set; }
}
[OutputTable(TabName = "Wrapped Table", TableName = "Wrapped_Table")]
private class WrappedItem
{
[OutputColumn(Order = 10, HeaderText = "Description", WrapText = true, AutoWidth = false, Width = 65)]
public string Description { get; set; } = string.Empty;
}
private class NoAttributeItem
{
public string Data { get; set; } = string.Empty;
}
[Fact]
public void WriteTable_CreatesTableWithCorrectColumns()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<TestItem>
{
new() { Id = 1, Name = "Item 1", Value = 10.5m },
new() { Id = 2, Name = "Item 2", Value = 20.5m }
};
var table = _writer.WriteTable(worksheet, 1, 1, data);
table.ShouldNotBeNull();
table.ColumnCount().ShouldBe(3);
table.RowCount().ShouldBe(3); // Header + 2 data rows
}
[Fact]
public void WriteTable_UsesLight18TableStyle()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<TestItem> { new() { Id = 1, Name = "Test", Value = 100m } };
var table = _writer.WriteTable(worksheet, 1, 1, data);
table.ShouldNotBeNull();
table.Theme.ShouldBe(XLTableTheme.TableStyleLight18);
}
[Fact]
public void WriteTable_SetsColumnHeaders()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<TestItem> { new() { Id = 1, Name = "Test", Value = 100m } };
_writer.WriteTable(worksheet, 1, 1, data);
worksheet.Cell(1, 1).Value.GetText().ShouldBe("ID");
worksheet.Cell(1, 2).Value.GetText().ShouldBe("Name");
worksheet.Cell(1, 3).Value.GetText().ShouldBe("Value");
}
[Fact]
public void WriteTable_WritesDataRows()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<TestItem>
{
new() { Id = 1, Name = "Item 1", Value = 10.5m },
new() { Id = 2, Name = "Item 2", Value = 20.5m }
};
_writer.WriteTable(worksheet, 1, 1, data);
worksheet.Cell(2, 1).Value.GetNumber().ShouldBe(1);
worksheet.Cell(2, 2).Value.GetText().ShouldBe("Item 1");
worksheet.Cell(2, 3).Value.GetNumber().ShouldBe(10.5);
worksheet.Cell(3, 1).Value.GetNumber().ShouldBe(2);
}
[Fact]
public void WriteTable_WithShowHeader_CreatesMergedHeader()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<TestItem> { new() { Id = 1, Name = "Test", Value = 100m } };
_writer.WriteTable(worksheet, 1, 1, data, showHeader: true, headerText: "Test Header");
// First row should be merged header
var headerRange = worksheet.Range(1, 1, 1, 3);
headerRange.IsMerged().ShouldBeTrue();
worksheet.Cell(1, 1).Value.GetText().ShouldBe("Test Header");
// Column headers should be on row 2
worksheet.Cell(2, 1).Value.GetText().ShouldBe("ID");
}
[Fact]
public void WriteTable_EmptyData_CreatesTableWithHeaderOnly()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<TestItem>();
var table = _writer.WriteTable(worksheet, 1, 1, data);
table.ShouldNotBeNull();
// Table should exist with headers
table.ColumnCount().ShouldBe(3);
}
[Fact]
public void WriteTable_NoAttributes_ReturnsNull()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<NoAttributeItem> { new() { Data = "Test" } };
var table = _writer.WriteTable(worksheet, 1, 1, data);
table.ShouldBeNull();
}
[Fact]
public void WriteTable_WrappedColumn_SetsFixedWidth()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<WrappedItem> { new() { Description = "Long description text" } };
_writer.WriteTable(worksheet, 1, 1, data);
worksheet.Column(1).Width.ShouldBe(65);
worksheet.Column(1).Style.Alignment.WrapText.ShouldBeTrue();
}
[Fact]
public void WriteTable_TableNameOverride_UsesProvidedName()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test");
var data = new List<TestItem> { new() { Id = 1, Name = "Test", Value = 100m } };
var table = _writer.WriteTable(worksheet, 1, 1, data, tableNameOverride: "Custom_Table");
table.ShouldNotBeNull();
table.Name.ShouldBe("Custom_Table");
}
}