using AyCode.Core.Serializers.Binaries;
using AyCode.Core.Tests.TestModels;
namespace AyCode.Core.Tests.Serialization;
///
/// Tests for Source Generator based IGeneratedBinaryWriter integration.
///
[TestClass]
public class GeneratedSerializerIntegrationTests
{
[TestMethod]
public void GeneratedWriterType_Exists_ForMarkedTypes()
{
var type = typeof(GeneratedSerializerTestModel);
var writerTypeName = $"{type.FullName}_GeneratedWriter";
var writerType = type.Assembly.GetType(writerTypeName);
Assert.IsNotNull(writerType,
$"Generated writer type '{writerTypeName}' should exist for [AcBinarySerializable] marked type");
}
[TestMethod]
public void GeneratedWriterType_ImplementsInterface()
{
var type = typeof(SimpleGeneratedModel);
var writerTypeName = $"{type.FullName}_GeneratedWriter";
var writerType = type.Assembly.GetType(writerTypeName);
Assert.IsNotNull(writerType, $"Generated writer type '{writerTypeName}' should exist");
Assert.IsTrue(typeof(IGeneratedBinaryWriter).IsAssignableFrom(writerType),
"Generated writer should implement IGeneratedBinaryWriter");
}
[TestMethod]
public void Serialization_WorksCorrectly_WithGeneratedWriterPresent()
{
var original = new GeneratedSerializerTestModel
{
Id = 42,
Name = "Test",
IsActive = true,
Value = 3.14,
Created = new DateTime(2025, 1, 5, 10, 30, 0, DateTimeKind.Utc),
UniqueId = Guid.NewGuid(),
Price = 99.99m,
BigNumber = 9999999999L
};
var bytes = AcBinarySerializer.Serialize(original, AcBinarySerializerOptions.WithoutReferenceHandling);
var deserialized = AcBinaryDeserializer.Deserialize(bytes);
Assert.IsNotNull(deserialized);
Assert.AreEqual(original.Id, deserialized.Id);
Assert.AreEqual(original.Name, deserialized.Name);
Assert.AreEqual(original.IsActive, deserialized.IsActive);
Assert.AreEqual(original.Value, deserialized.Value);
Assert.AreEqual(original.Created, deserialized.Created);
Assert.AreEqual(original.UniqueId, deserialized.UniqueId);
Assert.AreEqual(original.Price, deserialized.Price);
Assert.AreEqual(original.BigNumber, deserialized.BigNumber);
}
[TestMethod]
public void GeneratedWriter_PrimitiveClass_RoundTrip()
{
var original = new PrimitiveTestClass
{
IntValue = 42,
StringValue = "TestName",
BoolValue = true,
DoubleValue = 3.14,
DateTimeValue = new DateTime(2025, 1, 5, 10, 30, 0, DateTimeKind.Utc),
GuidValue = Guid.NewGuid(),
DecimalValue = 99.99m,
LongValue = 9999999999L,
FloatValue = 1.5f,
ByteValue = 42,
ShortValue = 123,
EnumValue = TestStatus.Active,
NullableInt = 7,
NullableIntNull = null
};
var options = AcBinarySerializerOptions.FastMode;
var bytes = AcBinarySerializer.Serialize(original, options);
var deserialized = AcBinaryDeserializer.Deserialize(bytes, options);
Assert.IsNotNull(deserialized);
Assert.AreEqual(original.IntValue, deserialized.IntValue);
Assert.AreEqual(original.StringValue, deserialized.StringValue);
Assert.AreEqual(original.BoolValue, deserialized.BoolValue);
Assert.AreEqual(original.DoubleValue, deserialized.DoubleValue);
Assert.AreEqual(original.DateTimeValue, deserialized.DateTimeValue);
Assert.AreEqual(original.GuidValue, deserialized.GuidValue);
Assert.AreEqual(original.DecimalValue, deserialized.DecimalValue);
Assert.AreEqual(original.LongValue, deserialized.LongValue);
Assert.AreEqual(original.NullableInt, deserialized.NullableInt);
Assert.IsNull(deserialized.NullableIntNull);
}
[TestMethod]
public void GeneratedWriter_ComplexHierarchy_RoundTrip()
{
TestDataFactory.ResetIdCounter();
var sharedTag = TestDataFactory.CreateTag("SharedTag");
var sharedUser = TestDataFactory.CreateUser("shareduser");
var order = TestDataFactory.CreateOrder(
itemCount: 2,
palletsPerItem: 2,
measurementsPerPallet: 2,
pointsPerMeasurement: 2,
sharedTag: sharedTag,
sharedUser: sharedUser);
var options = AcBinarySerializerOptions.FastMode;
var bytes = AcBinarySerializer.Serialize(order, options);
var deserialized = AcBinaryDeserializer.Deserialize(bytes, options);
Assert.IsNotNull(deserialized);
Assert.AreEqual(order.Id, deserialized.Id);
Assert.AreEqual(order.OrderNumber, deserialized.OrderNumber);
Assert.AreEqual(order.Status, deserialized.Status);
Assert.AreEqual(order.TotalAmount, deserialized.TotalAmount);
Assert.AreEqual(order.Items.Count, deserialized.Items.Count);
for (var i = 0; i < order.Items.Count; i++)
{
Assert.AreEqual(order.Items[i].Id, deserialized.Items[i].Id);
Assert.AreEqual(order.Items[i].Pallets.Count, deserialized.Items[i].Pallets.Count);
}
}
}