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);
}
}