using AyCode.Core.Extensions;
using static AyCode.Core.Tests.Serialization.AcSerializerModels;
using static AyCode.Core.Tests.Serialization.AcSerializerTestHelper;
namespace AyCode.Core.Tests.Serialization;
///
/// Tests for nullable value type serialization.
///
[TestClass]
public class AcBinarySerializerNullableTests
{
[TestMethod]
public void Deserialize_NullableIntProperty_WithValue_RoundTrip()
{
var obj = new TestClassWithNullableProperties { Id = 42, NullableInt = 123, NullableIntNull = null };
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(42, result.Id);
Assert.AreEqual(123, result.NullableInt);
Assert.IsNull(result.NullableIntNull);
}
[TestMethod]
public void Deserialize_NullableDoubleProperty_WithValue_RoundTrip()
{
var obj = new TestClassWithNullableProperties { Id = 1, NullableDouble = 3.14159, NullableDoubleNull = null };
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(3.14159, result.NullableDouble);
Assert.IsNull(result.NullableDoubleNull);
}
[TestMethod]
public void Deserialize_NullableDateTimeProperty_WithValue_RoundTrip()
{
var testDate = new DateTime(2024, 12, 25, 10, 30, 45, DateTimeKind.Utc);
var obj = new TestClassWithNullableProperties { Id = 1, NullableDateTime = testDate, NullableDateTimeNull = null };
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(testDate, result.NullableDateTime);
Assert.IsNull(result.NullableDateTimeNull);
}
[TestMethod]
public void Deserialize_NullableGuidProperty_WithValue_RoundTrip()
{
var testGuid = Guid.NewGuid();
var obj = new TestClassWithNullableProperties { Id = 1, NullableGuid = testGuid, NullableGuidNull = null };
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(testGuid, result.NullableGuid);
Assert.IsNull(result.NullableGuidNull);
}
[TestMethod]
public void Deserialize_NullableDecimalProperty_WithValue_RoundTrip()
{
var obj = new TestClassWithNullableProperties { Id = 1, NullableDecimal = 123456.789m, NullableDecimalNull = null };
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(123456.789m, result.NullableDecimal);
Assert.IsNull(result.NullableDecimalNull);
}
[TestMethod]
public void Deserialize_NullableBoolProperty_WithValue_RoundTrip()
{
var obj = new TestClassWithNullableProperties { Id = 1, NullableBool = true, NullableBoolNull = null };
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(true, result.NullableBool);
Assert.IsNull(result.NullableBoolNull);
}
[TestMethod]
public void Deserialize_NullableLongProperty_WithValue_RoundTrip()
{
var obj = new TestClassWithNullableProperties { Id = 1, NullableLong = 9876543210L, NullableLongNull = null };
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(9876543210L, result.NullableLong);
Assert.IsNull(result.NullableLongNull);
}
[TestMethod]
public void Deserialize_AllNullablePropertiesWithValues_RoundTrip()
{
var testDate = new DateTime(2024, 6, 15, 14, 30, 0, DateTimeKind.Utc);
var testGuid = Guid.Parse("12345678-1234-1234-1234-123456789abc");
var obj = new TestClassWithNullableProperties
{
Id = 999,
NullableInt = int.MaxValue,
NullableIntNull = 42,
NullableLong = long.MaxValue,
NullableLongNull = 100L,
NullableDouble = double.MaxValue,
NullableDoubleNull = 2.5,
NullableDecimal = decimal.MaxValue,
NullableDecimalNull = 1.1m,
NullableDateTime = testDate,
NullableDateTimeNull = DateTime.UtcNow,
NullableGuid = testGuid,
NullableGuidNull = Guid.NewGuid(),
NullableBool = false,
NullableBoolNull = true
};
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(obj.Id, result.Id);
Assert.AreEqual(obj.NullableInt, result.NullableInt);
Assert.AreEqual(obj.NullableIntNull, result.NullableIntNull);
Assert.AreEqual(obj.NullableLong, result.NullableLong);
Assert.AreEqual(obj.NullableLongNull, result.NullableLongNull);
Assert.AreEqual(obj.NullableDouble, result.NullableDouble);
Assert.AreEqual(obj.NullableDecimalNull, result.NullableDecimalNull);
Assert.AreEqual(obj.NullableDateTime, result.NullableDateTime);
Assert.AreEqual(obj.NullableGuid, result.NullableGuid);
Assert.AreEqual(obj.NullableBool, result.NullableBool);
Assert.AreEqual(obj.NullableBoolNull, result.NullableBoolNull);
}
[TestMethod]
public void Deserialize_ObjectWithNestedNullableProperties_RoundTrip()
{
var obj = new TestParentWithNullableChild
{
Id = 1,
Name = "Parent",
Child = new TestClassWithNullableProperties
{
Id = 2,
NullableInt = 100,
NullableDouble = 5.5,
NullableDateTime = DateTime.UtcNow,
NullableGuid = Guid.NewGuid()
}
};
var binary = obj.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(obj.Id, result.Id);
Assert.AreEqual(obj.Name, result.Name);
Assert.IsNotNull(result.Child);
Assert.AreEqual(obj.Child.NullableInt, result.Child.NullableInt);
Assert.AreEqual(obj.Child.NullableDouble, result.Child.NullableDouble);
}
[TestMethod]
public void Deserialize_ListOfObjectsWithNullableProperties_RoundTrip()
{
var items = CreateNullablePropertyItems(10);
var binary = items.ToBinary();
var result = binary.BinaryTo>();
Assert.IsNotNull(result);
Assert.AreEqual(10, result.Count);
for (int i = 0; i < 10; i++)
{
var original = items[i];
var deserialized = result[i];
Assert.AreEqual(original.Id, deserialized.Id, $"Id mismatch at index {i}");
Assert.AreEqual(original.NullableInt, deserialized.NullableInt, $"NullableInt mismatch at index {i}");
Assert.AreEqual(original.NullableDouble, deserialized.NullableDouble, $"NullableDouble mismatch at index {i}");
Assert.AreEqual(original.NullableGuid, deserialized.NullableGuid, $"NullableGuid mismatch at index {i}");
}
}
[TestMethod]
public void Deserialize_StockTakingLikeHierarchy_WithNullableProperties_RoundTrip()
{
var stockTaking = CreateStockTaking(2, 2);
var binary = stockTaking.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(stockTaking.Id, result.Id);
Assert.AreEqual(stockTaking.IsClosed, result.IsClosed);
Assert.AreEqual(stockTaking.Creator, result.Creator);
Assert.IsNotNull(result.StockTakingItems);
Assert.AreEqual(2, result.StockTakingItems.Count);
var item0 = result.StockTakingItems[0];
Assert.IsNotNull(item0.StockTakingItemPallets);
Assert.AreEqual(2, item0.StockTakingItemPallets.Count);
}
[TestMethod]
public void Deserialize_ListOfStockTakingLikeEntities_RoundTrip()
{
var stockTakings = CreateStockTakingList(2, 1, 1);
var binary = stockTakings.ToBinary();
var result = binary.BinaryTo>();
Assert.IsNotNull(result);
Assert.AreEqual(2, result.Count);
Assert.AreEqual(1, result[0].Id);
Assert.IsNotNull(result[0].StockTakingItems);
Assert.AreEqual(1, result[0].StockTakingItems.Count);
Assert.AreEqual(2, result[1].Id);
Assert.IsNotNull(result[1].StockTakingItems);
}
}