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