From 671f8ce35736b5cb7b7349912e02d205d514b6d0 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 6 Jan 2026 23:26:11 -0500 Subject: [PATCH] test(ExcelIO): add unit tests for fluent mapping infrastructure --- .../Mapping/ExcelClassMapTests.cs | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 NEW/tests/JdeScoping.ExcelIO.Tests/Mapping/ExcelClassMapTests.cs diff --git a/NEW/tests/JdeScoping.ExcelIO.Tests/Mapping/ExcelClassMapTests.cs b/NEW/tests/JdeScoping.ExcelIO.Tests/Mapping/ExcelClassMapTests.cs new file mode 100644 index 0000000..2ef42c9 --- /dev/null +++ b/NEW/tests/JdeScoping.ExcelIO.Tests/Mapping/ExcelClassMapTests.cs @@ -0,0 +1,134 @@ +using JdeScoping.ExcelIO.Mapping; +using Shouldly; +using Xunit; + +namespace JdeScoping.ExcelIO.Tests.Mapping; + +public class ExcelClassMapTests +{ + // Test model + private sealed class TestModel + { + public int Id { get; init; } + public string Name { get; init; } = string.Empty; + public DateTime CreatedAt { get; init; } + } + + // Test map + private sealed class TestModelMap : ExcelClassMap + { + public TestModelMap() + { + Table("Test_Table", "Test Tab"); + + Map(x => x.Id).Order(10).Header("ID Number"); + Map(x => x.Name).Order(20).Header("Full Name"); + Map(x => x.CreatedAt).Order(30).Header("Created").Format(ExcelFormats.Timestamp); + } + } + + [Fact] + public void MappedType_ReturnsCorrectType() + { + var map = new TestModelMap(); + map.MappedType.ShouldBe(typeof(TestModel)); + } + + [Fact] + public void Table_SetsTableAndTabName() + { + var map = new TestModelMap(); + map.TableName.ShouldBe("Test_Table"); + map.TabName.ShouldBe("Test Tab"); + } + + [Fact] + public void Columns_ReturnsOrderedColumns() + { + var map = new TestModelMap(); + var columns = map.Columns; + + columns.Count.ShouldBe(3); + columns[0].PropertyName.ShouldBe("Id"); + columns[1].PropertyName.ShouldBe("Name"); + columns[2].PropertyName.ShouldBe("CreatedAt"); + } + + [Fact] + public void Map_SetsHeaderText() + { + var map = new TestModelMap(); + var columns = map.Columns; + + columns[0].HeaderText.ShouldBe("ID Number"); + columns[1].HeaderText.ShouldBe("Full Name"); + columns[2].HeaderText.ShouldBe("Created"); + } + + [Fact] + public void Map_SetsFormat() + { + var map = new TestModelMap(); + var columns = map.Columns; + + columns[2].Format.ShouldBe(ExcelFormats.Timestamp); + } + + [Fact] + public void ValueGetter_ExtractsPropertyValue() + { + var map = new TestModelMap(); + var columns = map.Columns; + var testObj = new TestModel { Id = 42, Name = "Test", CreatedAt = new DateTime(2024, 1, 15) }; + + columns[0].ValueGetter(testObj).ShouldBe(42); + columns[1].ValueGetter(testObj).ShouldBe("Test"); + columns[2].ValueGetter(testObj).ShouldBe(new DateTime(2024, 1, 15)); + } +} + +public class ExcelMapRegistryTests +{ + private sealed class DummyModel { public int Id { get; init; } } + private sealed class DummyMap : ExcelClassMap + { + public DummyMap() { Map(x => x.Id).Order(1).Header("ID"); } + } + + [Fact] + public void Register_AndGetMap_ReturnsMap() + { + var registry = new ExcelMapRegistry(); + var map = new DummyMap(); + + registry.Register(map); + var retrieved = registry.GetMap(); + + retrieved.ShouldBe(map); + } + + [Fact] + public void GetMap_UnregisteredType_ThrowsInvalidOperationException() + { + var registry = new ExcelMapRegistry(); + + Should.Throw(() => registry.GetMap()); + } + + [Fact] + public void HasMap_RegisteredType_ReturnsTrue() + { + var registry = new ExcelMapRegistry(); + registry.Register(new DummyMap()); + + registry.HasMap().ShouldBeTrue(); + } + + [Fact] + public void HasMap_UnregisteredType_ReturnsFalse() + { + var registry = new ExcelMapRegistry(); + + registry.HasMap().ShouldBeFalse(); + } +}