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 { 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 { 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 { 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 { 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 { 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(); 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 { 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 { 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 { 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"); } }