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