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 DateTime type handling and potential type mismatch issues.
///
[TestClass]
public class AcBinarySerializerDateTimeTests
{
[TestMethod]
public void Deserialize_DateTimeProperty_FromDifferentPropertyOrder_RoundTrip()
{
var entity = new TestEntityWithDateTimeAndInt
{
Id = 42,
IntValue = 100,
Created = new DateTime(2024, 12, 25, 10, 30, 45, DateTimeKind.Utc),
Modified = new DateTime(2024, 12, 26, 11, 45, 30, DateTimeKind.Utc),
StatusCode = 5,
Name = "TestEntity"
};
var binary = entity.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(42, result.Id);
Assert.AreEqual(100, result.IntValue);
Assert.AreEqual(entity.Created, result.Created, "Created DateTime should match");
Assert.AreEqual(entity.Modified, result.Modified, "Modified DateTime should match");
Assert.AreEqual(5, result.StatusCode);
Assert.AreEqual("TestEntity", result.Name);
}
[TestMethod]
public void Deserialize_ListOfEntitiesWithDateTimeProperties_RoundTrip()
{
var entities = CreateDateTimeEntities(10);
var binary = entities.ToBinary();
var result = binary.BinaryTo>();
Assert.IsNotNull(result);
Assert.AreEqual(10, result.Count);
for (int i = 0; i < 10; i++)
{
var original = entities[i];
var deserialized = result[i];
Assert.AreEqual(original.Id, deserialized.Id, $"Id mismatch at index {i}");
Assert.AreEqual(original.IntValue, deserialized.IntValue, $"IntValue mismatch at index {i}");
Assert.AreEqual(original.Created.Ticks, deserialized.Created.Ticks, $"Created mismatch at index {i}");
Assert.AreEqual(original.Modified.Ticks, deserialized.Modified.Ticks, $"Modified mismatch at index {i}");
Assert.AreEqual(original.StatusCode, deserialized.StatusCode, $"StatusCode mismatch at index {i}");
Assert.AreEqual(original.Name, deserialized.Name, $"Name mismatch at index {i}");
}
}
[TestMethod]
public void Deserialize_EntityWithManyIntPropertiesBeforeDateTime_RoundTrip()
{
var entity = new TestEntityWithManyIntsBeforeDateTime
{
Id = 1,
Value1 = 10,
Value2 = 20,
Value3 = 30,
Value4 = 40,
Value5 = 50,
FirstDateTime = new DateTime(2024, 1, 15, 10, 0, 0, DateTimeKind.Utc),
SecondDateTime = new DateTime(2024, 6, 20, 15, 30, 0, DateTimeKind.Utc),
FinalValue = 999
};
var binary = entity.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Id);
Assert.AreEqual(10, result.Value1);
Assert.AreEqual(20, result.Value2);
Assert.AreEqual(30, result.Value3);
Assert.AreEqual(40, result.Value4);
Assert.AreEqual(50, result.Value5);
Assert.AreEqual(entity.FirstDateTime, result.FirstDateTime, "FirstDateTime should match");
Assert.AreEqual(entity.SecondDateTime, result.SecondDateTime, "SecondDateTime should match");
Assert.AreEqual(999, result.FinalValue);
}
[TestMethod]
public void Deserialize_NestedEntityWithDateTimeInChild_RoundTrip()
{
var parent = new TestParentEntityWithDateTimeChild
{
ParentId = 1,
ParentName = "Parent",
Child = new TestEntityWithDateTimeAndInt
{
Id = 100,
IntValue = 200,
Created = DateTime.UtcNow.AddDays(-5),
Modified = DateTime.UtcNow,
StatusCode = 3,
Name = "Child"
}
};
var binary = parent.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(1, result.ParentId);
Assert.AreEqual("Parent", result.ParentName);
Assert.IsNotNull(result.Child);
Assert.AreEqual(100, result.Child.Id);
Assert.AreEqual(200, result.Child.IntValue);
Assert.AreEqual(parent.Child.Created.Ticks, result.Child.Created.Ticks, "Child.Created should match");
Assert.AreEqual(parent.Child.Modified.Ticks, result.Child.Modified.Ticks, "Child.Modified should match");
}
[TestMethod]
public void Deserialize_EntityWithCollectionContainingDateTimeItems_RoundTrip()
{
var parent = new TestParentWithDateTimeItemCollection
{
Id = 1,
Name = "Parent",
Created = DateTime.UtcNow.AddDays(-10),
Items = CreateDateTimeEntities(5)
};
var binary = parent.ToBinary();
var result = binary.BinaryTo();
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Id);
Assert.AreEqual("Parent", result.Name);
Assert.AreEqual(parent.Created.Ticks, result.Created.Ticks, "Parent.Created should match");
Assert.IsNotNull(result.Items);
Assert.AreEqual(5, result.Items.Count);
for (int i = 0; i < 5; i++)
{
var originalItem = parent.Items[i];
var deserializedItem = result.Items[i];
Assert.AreEqual(originalItem.Id, deserializedItem.Id, $"Items[{i}].Id should match");
Assert.AreEqual(originalItem.IntValue, deserializedItem.IntValue, $"Items[{i}].IntValue should match");
Assert.AreEqual(originalItem.Created.Ticks, deserializedItem.Created.Ticks, $"Items[{i}].Created should match");
Assert.AreEqual(originalItem.Modified.Ticks, deserializedItem.Modified.Ticks, $"Items[{i}].Modified should match");
}
}
[TestMethod]
public void Deserialize_ListOfParentEntitiesWithDateTimeChildCollections_RoundTrip()
{
var parents = CreateParentWithDateTimeItems(3, 3);
var binary = parents.ToBinary();
var result = binary.BinaryTo>();
Assert.IsNotNull(result);
Assert.AreEqual(3, result.Count);
for (int p = 0; p < 3; p++)
{
var originalParent = parents[p];
var deserializedParent = result[p];
Assert.AreEqual(originalParent.Id, deserializedParent.Id, $"Parent[{p}].Id should match");
Assert.AreEqual(originalParent.Name, deserializedParent.Name, $"Parent[{p}].Name should match");
Assert.AreEqual(originalParent.Created.Ticks, deserializedParent.Created.Ticks, $"Parent[{p}].Created should match");
Assert.IsNotNull(deserializedParent.Items);
Assert.AreEqual(3, deserializedParent.Items.Count, $"Parent[{p}].Items.Count should match");
for (int i = 0; i < 3; i++)
{
var originalItem = originalParent.Items![i];
var deserializedItem = deserializedParent.Items[i];
Assert.AreEqual(originalItem.Id, deserializedItem.Id, $"Parent[{p}].Items[{i}].Id should match");
Assert.AreEqual(originalItem.Created.Ticks, deserializedItem.Created.Ticks, $"Parent[{p}].Items[{i}].Created should match. Expected: {originalItem.Created}, Got: {deserializedItem.Created}");
}
}
}
}