using AyCode.Core.Extensions; using AyCode.Core.Interfaces; using AyCode.Core.Serializers.Attributes; using AyCode.Core.Serializers.Binaries; using AyCode.Core.Serializers.Jsons; using MemoryPack; using MessagePack; using MongoDB.Bson.Serialization.Attributes; using Newtonsoft.Json; namespace AyCode.Core.Tests.TestModels; #region Shared Enums /// /// Common status enum for all test entities /// public enum TestStatus { Pending = 5, Active = 10, Processing = 20, Completed = 30, Shipped = 40, OnHold = 50 } /// /// Priority levels for tasks and projects /// public enum TestPriority { Low = 0, Medium = 1, High = 2, Critical = 3 } /// /// User roles for testing /// public enum TestUserRole { User = 0, Manager = 1, Admin = 2 } #endregion #region 5-Level Test Hierarchy (Order -> Item -> Pallet -> Measurement -> Point) /// /// Level 1: Main order - root of the hierarchy /// [AcBinarySerializable(true)] public partial class TestOrder_Circ_Ref : IId { public int Id { get; set; } public string OrderNumber { get; set; } = ""; public TestStatus Status { get; set; } = TestStatus.Pending; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime? PaidDateUtc { get; set; } public decimal TotalAmount { get; set; } // Level 2 collection public List Items { get; set; } = []; // Shared reference properties (for $id/$ref testing) public SharedTag_All_True? PrimaryTag { get; set; } public SharedTag_All_True? SecondaryTag { get; set; } public SharedUser_All_True? Owner { get; set; } public SharedCategory_All_True? Category { get; set; } // Collection of shared references public List Tags { get; set; } = []; public MetadataInfo_All_True? OrderMetadata { get; set; } public MetadataInfo_All_True? AuditMetadata { get; set; } public List MetadataList { get; set; } = []; // NoMerge collection for testing replace behavior [JsonNoMergeCollection] public List NoMergeItems { get; set; } = []; public object? Parent { get; set; } } /// /// Level 2: Order item with pallets /// [AcBinarySerializable(true)] public partial class TestOrderItem_Circ_Ref : IId { public int Id { get; set; } [AcStringIntern(true)] public string ProductName { get; set; } = ""; public int Quantity { get; set; } public decimal UnitPrice { get; set; } public TestStatus Status { get; set; } = TestStatus.Pending; // Level 3 collection public List Pallets { get; set; } = []; // Shared references public SharedTag_All_True? Tag { get; set; } public SharedUser_All_True? Assignee { get; set; } public MetadataInfo_All_True? ItemMetadata { get; set; } public TestOrder_Circ_Ref? ParentOrder { get; set; } } #endregion #region Guid-based IId types /// /// Order with Guid Id - for testing Guid-based IId /// [AcBinarySerializable(true)] public class TestGuidOrder : IId { public Guid Id { get; set; } public string Code { get; set; } = ""; public List Items { get; set; } = []; public int Count { get; set; } } /// /// Item with Guid Id /// [AcBinarySerializable(true)] public class TestGuidItem : IId { public Guid Id { get; set; } public string Name { get; set; } = ""; public int Qty { get; set; } } #endregion #region Test-specific classes /// /// Simulates NopCommerce GenericAttribute - stores key-value pairs where DateTime values /// are stored as strings in the database. /// [AcBinarySerializable(true)] public class TestGenericAttribute { public int Id { get; set; } public string Key { get; set; } = ""; public string Value { get; set; } = ""; } /// /// DTO with GenericAttributes collection - simulates OrderDto with string-stored DateTime values. /// This reproduces the production bug where Binary serialization was thought to corrupt DateTime strings. /// [AcBinarySerializable(true)] public class TestDtoWithGenericAttributes : IId { public int Id { get; set; } public string Name { get; set; } = ""; public List GenericAttributes { get; set; } = []; } /// /// Order with nullable collections for null vs empty testing /// [AcBinarySerializable(true)] public class TestOrderWithNullableCollections { public int Id { get; set; } public string OrderNumber { get; set; } = ""; public List? Items { get; set; } public List? Tags { get; set; } } /// /// Class with all primitive types for WASM/serialization testing /// [MemoryPackable] [AcBinarySerializable(true)] public partial class PrimitiveTestClass { public int IntValue { get; set; } public long LongValue { get; set; } public double DoubleValue { get; set; } public decimal DecimalValue { get; set; } public float FloatValue { get; set; } public bool BoolValue { get; set; } public string StringValue { get; set; } = ""; public Guid GuidValue { get; set; } public DateTime DateTimeValue { get; set; } public TestStatus EnumValue { get; set; } public byte ByteValue { get; set; } public short ShortValue { get; set; } public int? NullableInt { get; set; } public int? NullableIntNull { get; set; } } /// /// Class with extended primitive types for full serializer coverage. /// Includes DateTimeOffset, TimeSpan, Dictionary, null properties. /// [AcBinarySerializable(true)] public class ExtendedPrimitiveTestClass { public int Id { get; set; } public string Name { get; set; } = ""; // Extended primitive types not covered in PrimitiveTestClass public DateTimeOffset DateTimeOffsetValue { get; set; } public TimeSpan TimeSpanValue { get; set; } public uint UIntValue { get; set; } public ulong ULongValue { get; set; } public ushort UShortValue { get; set; } public sbyte SByteValue { get; set; } public char CharValue { get; set; } // Dictionary property for WriteDictionary coverage in object context public Dictionary? Counts { get; set; } public Dictionary? Labels { get; set; } // Nullable properties that will be null public string? NullString { get; set; } public TestOrderItem_All_True? NullObject { get; set; } // Nested object for complex serialization public SharedTag_All_True? Tag { get; set; } } /// /// Class with array of objects containing null items for WriteNull coverage /// [AcBinarySerializable(true)] public class ObjectWithNullItems { public int Id { get; set; } public List MixedItems { get; set; } = []; } #endregion #region Property Mismatch DTOs (Server has more properties than Client) /// /// "Server-side" DTO with extra properties that the "client" doesn't know about. /// Used to test SkipValue functionality when deserializing unknown properties. /// [AcBinarySerializable(true)] public class ServerCustomerDto : IId { public int Id { get; set; } // Common properties (both server and client have these) public string FirstName { get; set; } = ""; public string LastName { get; set; } = ""; // Extra properties (only server has these - client will skip them) public string Email { get; set; } = ""; public string Phone { get; set; } = ""; public string Address { get; set; } = ""; public string City { get; set; } = ""; public string Country { get; set; } = ""; public string PostalCode { get; set; } = ""; public string Company { get; set; } = ""; public string Department { get; set; } = ""; public string Notes { get; set; } = ""; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime? LastLoginAt { get; set; } public TestStatus Status { get; set; } = TestStatus.Active; public bool IsVerified { get; set; } public int LoginCount { get; set; } public decimal Balance { get; set; } } /// /// "Client-side" DTO with fewer properties than the server version. /// When deserializing ServerCustomerDto data into this type, /// the deserializer must skip unknown properties correctly /// while still maintaining string intern table consistency. /// [AcBinarySerializable(true)] public class ClientCustomerDto : IId { public int Id { get; set; } // Only basic properties - client doesn't need all server fields public string FirstName { get; set; } = ""; public string LastName { get; set; } = ""; } /// /// Server DTO with nested objects that client doesn't know about. /// Tests skipping complex nested structures. /// [AcBinarySerializable(true)] public class ServerOrderWithExtras : IId { public int Id { get; set; } public string OrderNumber { get; set; } = ""; public decimal TotalAmount { get; set; } // Nested object that client doesn't have public ServerCustomerDto? Customer { get; set; } // List of objects that client doesn't know about public List RelatedCustomers { get; set; } = []; // Extra simple properties public string InternalNotes { get; set; } = ""; public string ProcessingCode { get; set; } = ""; } /// /// Client version of the order - doesn't have Customer/RelatedCustomers properties. /// [AcBinarySerializable(true)] public class ClientOrderSimple : IId { public int Id { get; set; } public string OrderNumber { get; set; } = ""; public decimal TotalAmount { get; set; } } #endregion