using FrameworkBLL.Engine; using Xunit; namespace FrameworkTests; /// /// Covers TypeNormalizer's documented SQL Server ↔ PostgreSQL value mappings /// (docs/Platform-Architecture-Integration-Reference.md §9.6/§5) — the only piece of the /// DataSync engine that is pure, public, and needs no database connection to verify. /// public class TypeNormalizerTests { [Fact] public void NormalizeCLR_NullValue_ReturnsNull() { Assert.Null(TypeNormalizer.NormalizeCLR(null, DatabaseType.SqlServer, DatabaseType.PostgreSQL)); } [Fact] public void NormalizeCLR_SameSourceAndTarget_ReturnsValueUnchanged() { var result = TypeNormalizer.NormalizeCLR(true, DatabaseType.SqlServer, DatabaseType.SqlServer); Assert.Equal(true, result); } [Fact] public void NormalizeCLR_SqlServerBitToPostgresBool_ConvertsToBoolean() { var result = TypeNormalizer.NormalizeCLR(true, DatabaseType.SqlServer, DatabaseType.PostgreSQL); Assert.IsType(result); Assert.True((bool)result!); } [Fact] public void NormalizeCLR_PostgresBoolToSqlServerBit_ConvertsToByte() { var result = TypeNormalizer.NormalizeCLR(true, DatabaseType.PostgreSQL, DatabaseType.SqlServer); Assert.Equal((byte)1, result); } [Fact] public void NormalizeCLR_SqlServerGuidToPostgresUuid_ConvertsToStringRepresentation() { var guid = Guid.NewGuid(); var result = TypeNormalizer.NormalizeCLR(guid, DatabaseType.SqlServer, DatabaseType.PostgreSQL); Assert.Equal(guid.ToString(), result); } [Fact] public void NormalizeCLR_PostgresUuidStringToSqlServerGuid_ParsesBackToGuid() { var guid = Guid.NewGuid(); var result = TypeNormalizer.Normalize(guid.ToString(), "uuid", DatabaseType.SqlServer); Assert.Equal(guid, result); } [Fact] public void NormalizeCLR_DateTimeOffset_MapsToUtcDateTimeForSqlServerTarget() { var dto = new DateTimeOffset(2026, 1, 1, 12, 0, 0, TimeSpan.FromHours(5)); var result = TypeNormalizer.NormalizeCLR(dto, DatabaseType.PostgreSQL, DatabaseType.SqlServer); Assert.Equal(dto.UtcDateTime, result); } [Fact] public void Normalize_SqlServerMoneyToDecimal_ConvertsCorrectly() { var result = TypeNormalizer.Normalize(123.45m, "money", DatabaseType.PostgreSQL); Assert.Equal(123.45m, result); } [Fact] public void Normalize_PostgresNumericToDecimal_ConvertsCorrectly() { var result = TypeNormalizer.Normalize(99.99m, "numeric", DatabaseType.SqlServer); Assert.Equal(99.99m, result); } [Fact] public void Normalize_UnmappedSourceDataType_ReturnsValueUnchanged() { var result = TypeNormalizer.Normalize("hello", "nvarchar", DatabaseType.PostgreSQL); Assert.Equal("hello", result); } [Fact] public void Normalize_TargetNotSqlServerOrPostgres_ReturnsValueUnchanged() { // MySQL/Oracle target: Normalize() has no branch for them yet (Phase 4) — must pass through as-is. var result = TypeNormalizer.Normalize(42, "int", DatabaseType.MySQL); Assert.Equal(42, result); } }