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.
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user