diff --git a/AyCode.Benchmark/JitDisassemblyBenchmark.cs b/AyCode.Benchmark/JitDisassemblyBenchmark.cs index 0c77de2..431cc4d 100644 --- a/AyCode.Benchmark/JitDisassemblyBenchmark.cs +++ b/AyCode.Benchmark/JitDisassemblyBenchmark.cs @@ -24,7 +24,7 @@ namespace AyCode.Core.Benchmarks; [MemoryDiagnoser(displayGenColumns: false)] public class JitDisassemblyBenchmark { - private TestOrder _order = null!; + private TestOrder_All_True _order = null!; private AcBinarySerializerOptions _fastModeOptions = null!; private AcBinarySerializerOptions _defaultOptions = null!; private byte[] _serializedFastMode = null!; @@ -34,7 +34,7 @@ public class JitDisassemblyBenchmark public void Setup() { TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); // Medium data: enough properties to show loop behavior, not too large for disassembly @@ -65,9 +65,9 @@ public class JitDisassemblyBenchmark /// FastMode deserialize. /// [Benchmark] - public TestOrder Deserialize_FastMode() + public TestOrder_All_True Deserialize_FastMode() { - return AcBinaryDeserializer.Deserialize(_serializedFastMode, _fastModeOptions); + return AcBinaryDeserializer.Deserialize(_serializedFastMode, _fastModeOptions); } /// @@ -84,8 +84,8 @@ public class JitDisassemblyBenchmark /// Default deserialize — ref tracking + string interning. /// [Benchmark] - public TestOrder Deserialize_Default() + public TestOrder_All_True Deserialize_Default() { - return AcBinaryDeserializer.Deserialize(_serializedDefault, _defaultOptions); + return AcBinaryDeserializer.Deserialize(_serializedDefault, _defaultOptions); } } diff --git a/AyCode.Benchmark/Program.cs b/AyCode.Benchmark/Program.cs index ef640de..bc7987a 100644 --- a/AyCode.Benchmark/Program.cs +++ b/AyCode.Benchmark/Program.cs @@ -169,7 +169,7 @@ namespace AyCode.Benchmark // Create test data with shared references TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var sharedMeta = TestDataFactory.CreateMetadata("shared", withChild: true); @@ -247,19 +247,19 @@ namespace AyCode.Benchmark // AcBinary WithRef Deserialize sw.Restart(); for (int i = 0; i < iterations; i++) - _ = AcBinaryDeserializer.Deserialize(acBinaryWithRef); + _ = AcBinaryDeserializer.Deserialize(acBinaryWithRef); var acWithRefDeserialize = sw.Elapsed.TotalMilliseconds; // AcBinary NoRef Deserialize sw.Restart(); for (int i = 0; i < iterations; i++) - _ = AcBinaryDeserializer.Deserialize(acBinaryNoRef); + _ = AcBinaryDeserializer.Deserialize(acBinaryNoRef); var acNoRefDeserialize = sw.Elapsed.TotalMilliseconds; // MessagePack Deserialize sw.Restart(); for (int i = 0; i < iterations; i++) - _ = MessagePackSerializer.Deserialize(msgPackData, msgPackOptions); + _ = MessagePackSerializer.Deserialize(msgPackData, msgPackOptions); var msgPackDeserialize = sw.Elapsed.TotalMilliseconds; results.Add(("Deserialize", "WithRef", acWithRefDeserialize, msgPackDeserialize)); @@ -332,12 +332,12 @@ namespace AyCode.Benchmark Console.WriteLine(); } - static TestOrder CreatePopulateTarget(TestOrder source) + static TestOrder_All_True CreatePopulateTarget(TestOrder_All_True source) { - var target = new TestOrder { Id = source.Id }; + var target = new TestOrder_All_True { Id = source.Id }; foreach (var item in source.Items) { - target.Items.Add(new TestOrderItem { Id = item.Id }); + target.Items.Add(new TestOrderItem_All_True { Id = item.Id }); } return target; } diff --git a/AyCode.Benchmark/SerializationBenchmarks.cs b/AyCode.Benchmark/SerializationBenchmarks.cs index f226491..6c9921e 100644 --- a/AyCode.Benchmark/SerializationBenchmarks.cs +++ b/AyCode.Benchmark/SerializationBenchmarks.cs @@ -88,7 +88,7 @@ public class SimpleBinaryBenchmark [RankColumn] public class ComplexBinaryBenchmark { - private TestOrder _testOrder = null!; + private TestOrder_All_True _testOrder = null!; private byte[] _acBinaryData = null!; private string _jsonData = null!; @@ -130,10 +130,10 @@ public class ComplexBinaryBenchmark public string Serialize_Json() => AcJsonSerializer.Serialize(_testOrder, _jsonOptions); [Benchmark(Description = "AcBinary Deserialize")] - public TestOrder? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(_acBinaryData); + public TestOrder_All_True? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(_acBinaryData); [Benchmark(Description = "JSON Deserialize")] - public TestOrder? Deserialize_Json() => AcJsonDeserializer.Deserialize(_jsonData, _jsonOptions); + public TestOrder_All_True? Deserialize_Json() => AcJsonDeserializer.Deserialize(_jsonData, _jsonOptions); } /// @@ -144,7 +144,7 @@ public class ComplexBinaryBenchmark [RankColumn] public class MessagePackComparisonBenchmark { - private TestOrder _testOrder = null!; + private TestOrder_All_True _testOrder = null!; private byte[] _acBinaryData = null!; private byte[] _msgPackData = null!; private byte[] _bsonData = null!; @@ -216,18 +216,18 @@ public class MessagePackComparisonBenchmark public byte[] Serialize_Bson() => _testOrder.ToBsonDocument().ToBson(); [Benchmark(Description = "AcBinary Deserialize")] - public TestOrder? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(_acBinaryData); + public TestOrder_All_True? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(_acBinaryData); [Benchmark(Description = "MessagePack Deserialize")] - public TestOrder? Deserialize_MsgPack() => MessagePackSerializer.Deserialize(_msgPackData, _msgPackOptions); + public TestOrder_All_True? Deserialize_MsgPack() => MessagePackSerializer.Deserialize(_msgPackData, _msgPackOptions); [Benchmark(Description = "BSON Deserialize")] - public TestOrder? Deserialize_Bson() + public TestOrder_All_True? Deserialize_Bson() { if (_bsonData == null || _bsonData.Length == 0) return null; using var ms = new MemoryStream(_bsonData); using var reader = new BsonBinaryReader(ms); - return BsonSerializer.Deserialize(reader); + return BsonSerializer.Deserialize(reader); } } @@ -241,8 +241,8 @@ public class MessagePackComparisonBenchmark public class AcBinaryVsMessagePackFullBenchmark { // Test data - private TestOrder _testOrder = null!; - private TestOrder _populateTarget = null!; + private TestOrder_All_True _testOrder = null!; + private TestOrder_All_True _populateTarget = null!; // Serialized data - AcBinary private byte[] _acBinaryWithRef = null!; @@ -262,7 +262,7 @@ public class AcBinaryVsMessagePackFullBenchmark { // Create test data with shared references TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var sharedMeta = TestDataFactory.CreateMetadata("shared", withChild: true); @@ -296,10 +296,10 @@ public class AcBinaryVsMessagePackFullBenchmark } // Create populate target - _populateTarget = new TestOrder { Id = _testOrder.Id }; + _populateTarget = new TestOrder_All_True { Id = _testOrder.Id }; foreach (var item in _testOrder.Items) { - _populateTarget.Items.Add(new TestOrderItem { Id = item.Id }); + _populateTarget.Items.Add(new TestOrderItem_All_True { Id = item.Id }); } // Print size comparison @@ -340,21 +340,21 @@ public class AcBinaryVsMessagePackFullBenchmark #region Deserialize Benchmarks [Benchmark(Description = "AcBinary Deserialize WithRef")] - public TestOrder? Deserialize_AcBinary_WithRef() => AcBinaryDeserializer.Deserialize(_acBinaryWithRef); + public TestOrder_All_True? Deserialize_AcBinary_WithRef() => AcBinaryDeserializer.Deserialize(_acBinaryWithRef); [Benchmark(Description = "AcBinary Deserialize NoRef")] - public TestOrder? Deserialize_AcBinary_NoRef() => AcBinaryDeserializer.Deserialize(_acBinaryNoRef); + public TestOrder_All_True? Deserialize_AcBinary_NoRef() => AcBinaryDeserializer.Deserialize(_acBinaryNoRef); [Benchmark(Description = "MessagePack Deserialize")] - public TestOrder? Deserialize_MsgPack() => MessagePackSerializer.Deserialize(_msgPackData, _msgPackOptions); + public TestOrder_All_True? Deserialize_MsgPack() => MessagePackSerializer.Deserialize(_msgPackData, _msgPackOptions); [Benchmark(Description = "BSON Deserialize")] - public TestOrder? Deserialize_Bson() + public TestOrder_All_True? Deserialize_Bson() { if (_bsonData == null || _bsonData.Length == 0) return null; using var ms = new MemoryStream(_bsonData); using var reader = new BsonBinaryReader(ms); - return BsonSerializer.Deserialize(reader); + return BsonSerializer.Deserialize(reader); } #endregion @@ -391,12 +391,12 @@ public class AcBinaryVsMessagePackFullBenchmark AcBinaryDeserializer.PopulateMerge(_acBinaryNoRef, target); } - private TestOrder CreatePopulateTarget() + private TestOrder_All_True CreatePopulateTarget() { - var target = new TestOrder { Id = _testOrder.Id }; + var target = new TestOrder_All_True { Id = _testOrder.Id }; foreach (var item in _testOrder.Items) { - target.Items.Add(new TestOrderItem { Id = item.Id }); + target.Items.Add(new TestOrderItem_All_True { Id = item.Id }); } return target; } @@ -412,9 +412,9 @@ public class AcBinaryVsMessagePackFullBenchmark [MemoryDiagnoser] public class SizeComparisonBenchmark { - private TestOrder _smallOrder = null!; - private TestOrder _mediumOrder = null!; - private TestOrder _largeOrder = null!; + private TestOrder_All_True _smallOrder = null!; + private TestOrder_All_True _mediumOrder = null!; + private TestOrder_All_True _largeOrder = null!; private MessagePackSerializerOptions _msgPackOptions = null!; private AcBinarySerializerOptions _withRefOptions = null!; @@ -464,7 +464,7 @@ public class SizeComparisonBenchmark Console.WriteLine(new string('=', 80) + "\n"); } - private void PrintOrderSize(string name, TestOrder order) + private void PrintOrderSize(string name, TestOrder_All_True order) { var acWithRef = AcBinarySerializer.Serialize(order, _withRefOptions); var acNoRef = AcBinarySerializer.Serialize(order, _noRefOptions); @@ -499,7 +499,7 @@ public enum BinaryBenchmarkMode public abstract class AcBinaryOptionsBenchmarkBase { - protected TestOrder TestOrder = null!; + protected TestOrder_All_True TestOrder = null!; protected AcBinarySerializerOptions BinaryOptions = null!; protected MessagePackSerializerOptions MsgPackOptions = null!; protected byte[] AcBinaryData = null!; @@ -560,10 +560,10 @@ public class AcBinaryOptionsSerializeBenchmark : AcBinaryOptionsBenchmarkBase public class AcBinaryOptionsDeserializeBenchmark : AcBinaryOptionsBenchmarkBase { [Benchmark(Description = "MessagePack Deserialize", Baseline = true)] - public TestOrder? Deserialize_MessagePack() => MessagePackSerializer.Deserialize(MsgPackData, MsgPackOptions); + public TestOrder_All_True? Deserialize_MessagePack() => MessagePackSerializer.Deserialize(MsgPackData, MsgPackOptions); [Benchmark(Description = "AcBinary Deserialize")] - public TestOrder? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(AcBinaryData); + public TestOrder_All_True? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(AcBinaryData); } /// @@ -578,8 +578,8 @@ public class LargeScaleBinaryBenchmark { // Test data - smaller scale for benchmark (500 items ? 25K objects) // Production would be 2200 items ? 100K+ objects - private TestOrder _testOrder = null!; - private TestOrder _populateTarget = null!; + private TestOrder_All_True _testOrder = null!; + private TestOrder_All_True _populateTarget = null!; // Serialized data private byte[] _acBinaryData = null!; @@ -619,10 +619,10 @@ public class LargeScaleBinaryBenchmark _msgPackData = MessagePackSerializer.Serialize(_testOrder, _msgPackOptions); // Create populate target - _populateTarget = new TestOrder { Id = _testOrder.Id }; + _populateTarget = new TestOrder_All_True { Id = _testOrder.Id }; foreach (var item in _testOrder.Items.Take(10)) // Only first 10 for populate target { - _populateTarget.Items.Add(new TestOrderItem { Id = item.Id }); + _populateTarget.Items.Add(new TestOrderItem_All_True { Id = item.Id }); } PrintStats(); @@ -642,10 +642,10 @@ public class LargeScaleBinaryBenchmark } [Benchmark(Description = "LargeScale AcBinary Deserialize")] - public TestOrder? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(_acBinaryData); + public TestOrder_All_True? Deserialize_AcBinary() => AcBinaryDeserializer.Deserialize(_acBinaryData); [Benchmark(Description = "LargeScale MsgPack Deserialize", Baseline = true)] - public TestOrder? Deserialize_MsgPack() => MessagePackSerializer.Deserialize(_msgPackData, _msgPackOptions); + public TestOrder_All_True? Deserialize_MsgPack() => MessagePackSerializer.Deserialize(_msgPackData, _msgPackOptions); [Benchmark(Description = "LargeScale AcBinary Serialize")] public byte[] Serialize_AcBinary() => AcBinarySerializer.Serialize(_testOrder, _binaryOptions); diff --git a/AyCode.Benchmark/SignalRCommunicationBenchmarks.cs b/AyCode.Benchmark/SignalRCommunicationBenchmarks.cs index daf4008..9e14a01 100644 --- a/AyCode.Benchmark/SignalRCommunicationBenchmarks.cs +++ b/AyCode.Benchmark/SignalRCommunicationBenchmarks.cs @@ -107,18 +107,18 @@ public class SignalRCommunicationBenchmarks [Benchmark(Description = "Server: Deserialize complex OrderItem")] [BenchmarkCategory("Server", "Deserialize")] - public TestOrderItem Server_DeserializeComplexOrderItem() + public TestOrderItem_All_True Server_DeserializeComplexOrderItem() { var postMessage = MessagePackSerializer.Deserialize(_complexOrderItemMessage, SignalRMessageFactory.ContractlessOptions); - return postMessage.PostDataJson!.JsonTo()!; + return postMessage.PostDataJson!.JsonTo()!; } [Benchmark(Description = "Server: Deserialize complex Order")] [BenchmarkCategory("Server", "Deserialize")] - public TestOrder Server_DeserializeComplexOrder() + public TestOrder_All_True Server_DeserializeComplexOrder() { var postMessage = MessagePackSerializer.Deserialize(_complexOrderMessage, SignalRMessageFactory.ContractlessOptions); - return postMessage.PostDataJson!.JsonTo()!; + return postMessage.PostDataJson!.JsonTo()!; } #endregion @@ -144,10 +144,10 @@ public class SignalRCommunicationBenchmarks [Benchmark(Description = "Client: Deserialize complex Order response")] [BenchmarkCategory("Client", "Response")] - public TestOrder? Client_DeserializeOrderResponse() + public TestOrder_All_True? Client_DeserializeOrderResponse() { var response = SignalRMessageFactory.DeserializeResponse(_complexResponseMessage); - return response?.ResponseData?.JsonTo(); + return response?.ResponseData?.JsonTo(); } #endregion @@ -171,19 +171,19 @@ public class SignalRCommunicationBenchmarks [Benchmark(Description = "Full: Complex Order round-trip")] [BenchmarkCategory("Full")] - public TestOrder? Full_ComplexOrderRoundTrip() + public TestOrder_All_True? Full_ComplexOrderRoundTrip() { // Client creates message var requestBytes = SignalRMessageFactory.CreateComplexObjectMessage(_data.TestOrder); // Server deserializes var postMessage = MessagePackSerializer.Deserialize(requestBytes, SignalRMessageFactory.ContractlessOptions); - var order = postMessage.PostDataJson!.JsonTo()!; + var order = postMessage.PostDataJson!.JsonTo()!; // Server modifies and creates response order.OrderNumber = "PROCESSED-" + order.OrderNumber; var responseBytes = SignalRMessageFactory.CreateSuccessResponse(CommonSignalRTags.TestOrderParam, order); // Client deserializes response var response = SignalRMessageFactory.DeserializeResponse(responseBytes); - return response?.ResponseData?.JsonTo(); + return response?.ResponseData?.JsonTo(); } #endregion } \ No newline at end of file diff --git a/AyCode.Benchmark/SignalRRoundTripBenchmarks.cs b/AyCode.Benchmark/SignalRRoundTripBenchmarks.cs index 4c170b7..ee83af4 100644 --- a/AyCode.Benchmark/SignalRRoundTripBenchmarks.cs +++ b/AyCode.Benchmark/SignalRRoundTripBenchmarks.cs @@ -24,9 +24,9 @@ public class SignalRRoundTripBenchmarks private BenchmarkSignalRService _service = null!; // Pre-created test data - private TestOrderItem _testOrderItem = null!; - private TestOrder _testOrder = null!; - private SharedTag _sharedTag = null!; + private TestOrderItem_All_True _testOrderItem = null!; + private TestOrder_All_True _testOrder = null!; + private SharedTag_All_True _sharedTag = null!; private int[] _intArray = null!; private List _stringList = null!; private Guid _testGuid; @@ -41,9 +41,9 @@ public class SignalRRoundTripBenchmarks _hub.RegisterService(_service, _client); // Pre-create test data - _testOrderItem = new TestOrderItem { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10.50m }; + _testOrderItem = new TestOrderItem_All_True { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10.50m }; _testOrder = TestDataFactory.CreateOrder(itemCount: 3); - _sharedTag = new SharedTag { Id = 1, Name = "Important", Color = "#FF0000" }; + _sharedTag = new SharedTag_All_True { Id = 1, Name = "Important", Color = "#FF0000" }; _intArray = [1, 2, 3, 4, 5]; _stringList = ["apple", "banana", "cherry"]; _testGuid = Guid.NewGuid(); @@ -104,25 +104,25 @@ public class SignalRRoundTripBenchmarks #region Complex Object Benchmarks - [Benchmark(Description = "RoundTrip: TestOrderItem")] + [Benchmark(Description = "RoundTrip: TestOrderItem_All_True")] [BenchmarkCategory("Complex")] - public TestOrderItem? RoundTrip_TestOrderItem() + public TestOrderItem_All_True? RoundTrip_TestOrderItem() { - return _client.PostDataSync(BenchmarkSignalRTags.TestOrderItemParam, _testOrderItem); + return _client.PostDataSync(BenchmarkSignalRTags.TestOrderItemParam, _testOrderItem); } - [Benchmark(Description = "RoundTrip: TestOrder (3 items)")] + [Benchmark(Description = "RoundTrip: TestOrder_All_True (3 items)")] [BenchmarkCategory("Complex")] - public TestOrder? RoundTrip_TestOrder() + public TestOrder_All_True? RoundTrip_TestOrder() { - return _client.PostDataSync(BenchmarkSignalRTags.TestOrderParam, _testOrder); + return _client.PostDataSync(BenchmarkSignalRTags.TestOrderParam, _testOrder); } - [Benchmark(Description = "RoundTrip: SharedTag")] + [Benchmark(Description = "RoundTrip: SharedTag_All_True")] [BenchmarkCategory("Complex")] - public SharedTag? RoundTrip_SharedTag() + public SharedTag_All_True? RoundTrip_SharedTag() { - return _client.PostDataSync(BenchmarkSignalRTags.SharedTagParam, _sharedTag); + return _client.PostDataSync(BenchmarkSignalRTags.SharedTagParam, _sharedTag); } #endregion @@ -278,7 +278,7 @@ public class BenchmarkSignalRService public string HandleMultipleTypes(bool flag, string text, int number) => $"{flag}-{text}-{number}"; [SignalR(BenchmarkSignalRTags.TestOrderItemParam)] - public TestOrderItem HandleTestOrderItem(TestOrderItem item) => new() + public TestOrderItem_All_True HandleTestOrderItem(TestOrderItem_All_True item) => new() { Id = item.Id, ProductName = $"Processed: {item.ProductName}", @@ -287,10 +287,10 @@ public class BenchmarkSignalRService }; [SignalR(BenchmarkSignalRTags.TestOrderParam)] - public TestOrder HandleTestOrder(TestOrder order) => order; + public TestOrder_All_True HandleTestOrder(TestOrder_All_True order) => order; [SignalR(BenchmarkSignalRTags.SharedTagParam)] - public SharedTag HandleSharedTag(SharedTag tag) => tag; + public SharedTag_All_True HandleSharedTag(SharedTag_All_True tag) => tag; [SignalR(BenchmarkSignalRTags.IntArrayParam)] public int[] HandleIntArray(int[] values) => values.Select(x => x * 2).ToArray(); @@ -299,7 +299,7 @@ public class BenchmarkSignalRService public List HandleStringList(List items) => items.Select(x => x.ToUpper()).ToList(); [SignalR(BenchmarkSignalRTags.IntAndDtoParam)] - public string HandleIntAndDto(int id, TestOrderItem item) => $"{id}-{item?.ProductName}"; + public string HandleIntAndDto(int id, TestOrderItem_All_True item) => $"{id}-{item?.ProductName}"; [SignalR(BenchmarkSignalRTags.FiveParams)] public string HandleFiveParams(int a, string b, bool c, Guid d, decimal e) => $"{a}-{b}-{c}-{d}-{e}"; diff --git a/AyCode.Core.Serializers.Console/BenchmarkLoop.cs b/AyCode.Core.Serializers.Console/BenchmarkLoop.cs index 1fb50c1..dffc596 100644 --- a/AyCode.Core.Serializers.Console/BenchmarkLoop.cs +++ b/AyCode.Core.Serializers.Console/BenchmarkLoop.cs @@ -739,12 +739,12 @@ internal static class BenchmarkLoop } /// - /// Validates MemoryPack setup at startup. Aborts the benchmark if TestOrder is not [MemoryPackable]. + /// Validates MemoryPack setup at startup. Aborts the benchmark if TestOrder_All_True is not [MemoryPackable]. /// Without this attribute, MemoryPack falls back to runtime resolver (slower) — comparison would be INVALID. /// internal static void ValidateMemoryPackSetup() { - var typesToCheck = new[] { typeof(TestOrder) }; + var typesToCheck = new[] { typeof(TestOrder_All_True) }; foreach (var type in typesToCheck) { diff --git a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBenchmark.cs index 1bd4883..000280b 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBenchmark.cs @@ -10,7 +10,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class AcBinaryBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly AcBinarySerializerOptions _options; private readonly byte[] _serialized; @@ -23,7 +23,7 @@ internal sealed class AcBinaryBenchmark : ISerializerBenchmark public long SetupDeserializeAllocBytes => 0; public string OptionsDescription => BenchmarkOptions.BuildAcBinary(_options); - public AcBinaryBenchmark(TestOrder order, AcBinarySerializerOptions options, string optionsPreset) + public AcBinaryBenchmark(TestOrder_All_True order, AcBinarySerializerOptions options, string optionsPreset) { _order = order; _options = options; @@ -35,12 +35,12 @@ internal sealed class AcBinaryBenchmark : ISerializerBenchmark public void Serialize() => AcBinarySerializer.Serialize(_order, _options); [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => AcBinaryDeserializer.Deserialize(_serialized, _options); + public void Deserialize() => AcBinaryDeserializer.Deserialize(_serialized, _options); public bool VerifyRoundTrip() { var bytes = AcBinarySerializer.Serialize(_order, _options); - var roundTripped = AcBinaryDeserializer.Deserialize(bytes, _options); + var roundTripped = AcBinaryDeserializer.Deserialize(bytes, _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBufferWriterBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBufferWriterBenchmark.cs index 58415b2..40db3e4 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBufferWriterBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryBufferWriterBenchmark.cs @@ -11,7 +11,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class AcBinaryBufferWriterBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly AcBinarySerializerOptions _options; private readonly byte[] _serialized; private readonly ArrayBufferWriter _bufferWriter; @@ -25,7 +25,7 @@ internal sealed class AcBinaryBufferWriterBenchmark : ISerializerBenchmark public long SetupDeserializeAllocBytes => 0; public string OptionsDescription => BenchmarkOptions.BuildAcBinary(_options); - public AcBinaryBufferWriterBenchmark(TestOrder order, AcBinarySerializerOptions options, string optionsPreset) + public AcBinaryBufferWriterBenchmark(TestOrder_All_True order, AcBinarySerializerOptions options, string optionsPreset) { _order = order; _options = options; @@ -55,14 +55,14 @@ internal sealed class AcBinaryBufferWriterBenchmark : ISerializerBenchmark // (the production-realistic surface for SignalR / Pipe consumers) rather than secretly testing // byte[] Deser under the BufWr label. [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => AcBinaryDeserializer.Deserialize(new ReadOnlySequence(_serialized), _options); + public void Deserialize() => AcBinaryDeserializer.Deserialize(new ReadOnlySequence(_serialized), _options); public bool VerifyRoundTrip() { _bufferWriter.ResetWrittenCount(); AcBinarySerializer.Serialize(_order, _bufferWriter, _options); - var roundTripped = AcBinaryDeserializer.Deserialize(new ReadOnlySequence(_bufferWriter.WrittenMemory), _options); + var roundTripped = AcBinaryDeserializer.Deserialize(new ReadOnlySequence(_bufferWriter.WrittenMemory), _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryFreshBufferWriterBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryFreshBufferWriterBenchmark.cs index 420ceb9..e098f63 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryFreshBufferWriterBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryFreshBufferWriterBenchmark.cs @@ -14,7 +14,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class AcBinaryFreshBufferWriterBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly AcBinarySerializerOptions _options; private readonly byte[] _serialized; @@ -27,7 +27,7 @@ internal sealed class AcBinaryFreshBufferWriterBenchmark : ISerializerBenchmark public long SetupDeserializeAllocBytes => 0; public string OptionsDescription => BenchmarkOptions.BuildAcBinary(_options, $", BufferSize={_options.BufferWriterChunkSize}B"); - public AcBinaryFreshBufferWriterBenchmark(TestOrder order, AcBinarySerializerOptions options, string optionsPreset) + public AcBinaryFreshBufferWriterBenchmark(TestOrder_All_True order, AcBinarySerializerOptions options, string optionsPreset) { _order = order; // BufferWriterChunkSize comes from the caller (central source of truth in CreateSerializers @@ -51,13 +51,13 @@ internal sealed class AcBinaryFreshBufferWriterBenchmark : ISerializerBenchmark // (the production-realistic surface for SignalR / Pipe consumers) rather than secretly testing // byte[] Deser under the BufWr label. [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => AcBinaryDeserializer.Deserialize(new ReadOnlySequence(_serialized), _options); + public void Deserialize() => AcBinaryDeserializer.Deserialize(new ReadOnlySequence(_serialized), _options); public bool VerifyRoundTrip() { var abw = new ArrayBufferWriter(); AcBinarySerializer.Serialize(_order, abw, _options); - var roundTripped = AcBinaryDeserializer.Deserialize(new ReadOnlySequence(abw.WrittenMemory), _options); + var roundTripped = AcBinaryDeserializer.Deserialize(new ReadOnlySequence(abw.WrittenMemory), _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryPipeBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryPipeBenchmark.cs index 363e7cb..c69bb92 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryPipeBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryPipeBenchmark.cs @@ -26,7 +26,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class AcBinaryInMemoryPipeBenchmark : ISerializerBenchmark, IDisposable { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly AcBinarySerializerOptions _options; private readonly byte[] _serialized; // for SerializedSize reporting only @@ -57,7 +57,7 @@ internal sealed class AcBinaryInMemoryPipeBenchmark : ISerializerBenchmark, IDis public bool IsRoundTripOnly => true; public string OptionsDescription => BenchmarkOptions.BuildAcBinary(_options, $", BufferSize={_options.BufferWriterChunkSize}B, Transport=Pipe(in-memory,multiMessage,2-task)"); - public AcBinaryInMemoryPipeBenchmark(TestOrder order, AcBinarySerializerOptions options, string optionsPreset) + public AcBinaryInMemoryPipeBenchmark(TestOrder_All_True order, AcBinarySerializerOptions options, string optionsPreset) { _order = order; _options = options; @@ -106,7 +106,7 @@ internal sealed class AcBinaryInMemoryPipeBenchmark : ISerializerBenchmark, IDis try { - var result = AcBinaryDeserializer.Deserialize(_input, _options); + var result = AcBinaryDeserializer.Deserialize(_input, _options); if (_captureResult) _lastResult = result; } catch @@ -158,7 +158,7 @@ internal sealed class AcBinaryInMemoryPipeBenchmark : ISerializerBenchmark, IDis try { Serialize(); - var result = _lastResult as TestOrder; + var result = _lastResult as TestOrder_All_True; return result != null && BenchmarkLoop.DeepEqualsViaJson(_order, result); } finally diff --git a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryRawByteArrayBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryRawByteArrayBenchmark.cs index d2e305a..9e13e9b 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryRawByteArrayBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryInMemoryRawByteArrayBenchmark.cs @@ -23,7 +23,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class AcBinaryInMemoryRawByteArrayBenchmark : ISerializerBenchmark, IDisposable { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly AcBinarySerializerOptions _options; private readonly byte[] _serialized; // for SerializedSize reporting only @@ -48,7 +48,7 @@ internal sealed class AcBinaryInMemoryRawByteArrayBenchmark : ISerializerBenchma public bool IsRoundTripOnly => true; public string OptionsDescription => BenchmarkOptions.BuildAcBinary(_options, $", BufferSize={_options.BufferWriterChunkSize}B, Transport=in-memory(raw,2-task)"); - public AcBinaryInMemoryRawByteArrayBenchmark(TestOrder order, AcBinarySerializerOptions options, string optionsPreset) + public AcBinaryInMemoryRawByteArrayBenchmark(TestOrder_All_True order, AcBinarySerializerOptions options, string optionsPreset) { _order = order; _options = options; @@ -89,7 +89,7 @@ internal sealed class AcBinaryInMemoryRawByteArrayBenchmark : ISerializerBenchma var bytes = _pendingBytes; if (bytes != null) { - var result = AcBinaryDeserializer.Deserialize(bytes, _options); + var result = AcBinaryDeserializer.Deserialize(bytes, _options); if (_captureResult) _lastResult = result; } } @@ -142,7 +142,7 @@ internal sealed class AcBinaryInMemoryRawByteArrayBenchmark : ISerializerBenchma try { Serialize(); - var result = _lastResult as TestOrder; + var result = _lastResult as TestOrder_All_True; return result != null && BenchmarkLoop.DeepEqualsViaJson(_order, result); } finally diff --git a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeBenchmark.cs index 99bd6c7..1442c7c 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeBenchmark.cs @@ -41,7 +41,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class AcBinaryNamedPipeBenchmark : ISerializerBenchmark, IDisposable { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly AcBinarySerializerOptions _options; private readonly byte[] _serialized; // for SerializedSize reporting only @@ -72,7 +72,7 @@ internal sealed class AcBinaryNamedPipeBenchmark : ISerializerBenchmark, IDispos public bool IsRoundTripOnly => true; public string OptionsDescription => BenchmarkOptions.BuildAcBinary(_options, $", BufferSize={_options.BufferWriterChunkSize}B, Transport=NamedPipe(long-lived,multiMessage,2-task)"); - public AcBinaryNamedPipeBenchmark(TestOrder order, AcBinarySerializerOptions options, string optionsPreset) + public AcBinaryNamedPipeBenchmark(TestOrder_All_True order, AcBinarySerializerOptions options, string optionsPreset) { _order = order; // BufferWriterChunkSize comes from the caller (central source of truth in CreateSerializers @@ -152,7 +152,7 @@ internal sealed class AcBinaryNamedPipeBenchmark : ISerializerBenchmark, IDispos try { - var result = AcBinaryDeserializer.Deserialize(_input, _options); + var result = AcBinaryDeserializer.Deserialize(_input, _options); if (_captureResult) _lastResult = result; } catch @@ -203,7 +203,7 @@ internal sealed class AcBinaryNamedPipeBenchmark : ISerializerBenchmark, IDispos try { Serialize(); - var result = _lastResult as TestOrder; + var result = _lastResult as TestOrder_All_True; return result != null && BenchmarkLoop.DeepEqualsViaJson(_order, result); } finally diff --git a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeRawByteArrayBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeRawByteArrayBenchmark.cs index 6f85d79..cd4f6a1 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeRawByteArrayBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/AcBinaryNamedPipeRawByteArrayBenchmark.cs @@ -27,7 +27,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class AcBinaryNamedPipeRawByteArrayBenchmark : ISerializerBenchmark, IDisposable { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly AcBinarySerializerOptions _options; private readonly byte[] _serialized; // for SerializedSize reporting + receive-side size known upfront @@ -59,7 +59,7 @@ internal sealed class AcBinaryNamedPipeRawByteArrayBenchmark : ISerializerBenchm public bool IsRoundTripOnly => true; public string OptionsDescription => BenchmarkOptions.BuildAcBinary(_options, $", BufferSize={_options.BufferWriterChunkSize}B, Transport=NamedPipe(raw,2-task)"); - public AcBinaryNamedPipeRawByteArrayBenchmark(TestOrder order, AcBinarySerializerOptions options, string optionsPreset) + public AcBinaryNamedPipeRawByteArrayBenchmark(TestOrder_All_True order, AcBinarySerializerOptions options, string optionsPreset) { _order = order; // BufferWriterChunkSize comes from the caller — same source-of-truth contract as @@ -125,7 +125,7 @@ internal sealed class AcBinaryNamedPipeRawByteArrayBenchmark : ISerializerBenchm if (n == 0) break; // pipe closed / EOF — partial read swallowed totalRead += n; } - var result = AcBinaryDeserializer.Deserialize(bytes, _options); + var result = AcBinaryDeserializer.Deserialize(bytes, _options); if (_captureResult) _lastResult = result; } catch @@ -183,7 +183,7 @@ internal sealed class AcBinaryNamedPipeRawByteArrayBenchmark : ISerializerBenchm try { Serialize(); - var result = _lastResult as TestOrder; + var result = _lastResult as TestOrder_All_True; return result != null && BenchmarkLoop.DeepEqualsViaJson(_order, result); } finally diff --git a/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBenchmark.cs index 1606ed5..700dfe1 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBenchmark.cs @@ -11,7 +11,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class MemoryPackBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly MemoryPackSerializerOptions _options; private readonly byte[] _serialized; @@ -24,7 +24,7 @@ internal sealed class MemoryPackBenchmark : ISerializerBenchmark public long SetupDeserializeAllocBytes => 0; public string? OptionsDescription => $"StringEncoding={_options.StringEncoding}"; - public MemoryPackBenchmark(TestOrder order, string optionsPreset) + public MemoryPackBenchmark(TestOrder_All_True order, string optionsPreset) { _order = order; OptionsPreset = optionsPreset; @@ -36,12 +36,12 @@ internal sealed class MemoryPackBenchmark : ISerializerBenchmark public void Serialize() => MemoryPackSerializer.Serialize(_order, _options); [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => MemoryPackSerializer.Deserialize(_serialized, _options); + public void Deserialize() => MemoryPackSerializer.Deserialize(_serialized, _options); public bool VerifyRoundTrip() { var bytes = MemoryPackSerializer.Serialize(_order, _options); - var roundTripped = MemoryPackSerializer.Deserialize(bytes, _options); + var roundTripped = MemoryPackSerializer.Deserialize(bytes, _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBufferWriterBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBufferWriterBenchmark.cs index e61aa7f..91f956e 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBufferWriterBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackBufferWriterBenchmark.cs @@ -12,7 +12,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class MemoryPackBufferWriterBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly MemoryPackSerializerOptions _options; private readonly byte[] _serialized; private readonly ArrayBufferWriter _bufferWriter; @@ -26,7 +26,7 @@ internal sealed class MemoryPackBufferWriterBenchmark : ISerializerBenchmark public long SetupDeserializeAllocBytes => 0; public string? OptionsDescription => $"StringEncoding={_options.StringEncoding}"; - public MemoryPackBufferWriterBenchmark(TestOrder order, string optionsPreset) + public MemoryPackBufferWriterBenchmark(TestOrder_All_True order, string optionsPreset) { _order = order; OptionsPreset = optionsPreset; @@ -51,13 +51,13 @@ internal sealed class MemoryPackBufferWriterBenchmark : ISerializerBenchmark // BufWr semantic: read from a ReadOnlySequence overload (apples-to-apples with AcBinary's // BufWr Deser path). MemoryPack's ROS overload also single-segment-fast-paths internally. [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => MemoryPackSerializer.Deserialize(new ReadOnlySequence(_serialized), _options); + public void Deserialize() => MemoryPackSerializer.Deserialize(new ReadOnlySequence(_serialized), _options); public bool VerifyRoundTrip() { _bufferWriter.ResetWrittenCount(); MemoryPackSerializer.Serialize(_bufferWriter, _order, _options); - var roundTripped = MemoryPackSerializer.Deserialize(new ReadOnlySequence(_bufferWriter.WrittenMemory), _options); + var roundTripped = MemoryPackSerializer.Deserialize(new ReadOnlySequence(_bufferWriter.WrittenMemory), _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackFreshBufferWriterBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackFreshBufferWriterBenchmark.cs index e69cde4..144aada 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackFreshBufferWriterBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/MemoryPackFreshBufferWriterBenchmark.cs @@ -11,7 +11,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class MemoryPackFreshBufferWriterBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly MemoryPackSerializerOptions _options; private readonly byte[] _serialized; @@ -24,7 +24,7 @@ internal sealed class MemoryPackFreshBufferWriterBenchmark : ISerializerBenchmar public long SetupDeserializeAllocBytes => 0; public string? OptionsDescription => $"StringEncoding={_options.StringEncoding}"; - public MemoryPackFreshBufferWriterBenchmark(TestOrder order, string optionsPreset) + public MemoryPackFreshBufferWriterBenchmark(TestOrder_All_True order, string optionsPreset) { _order = order; OptionsPreset = optionsPreset; @@ -42,13 +42,13 @@ internal sealed class MemoryPackFreshBufferWriterBenchmark : ISerializerBenchmar // BufWr semantic: read from a ReadOnlySequence overload (apples-to-apples with AcBinary's // BufWr Deser path). MemoryPack's ROS overload also single-segment-fast-paths internally. [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => MemoryPackSerializer.Deserialize(new ReadOnlySequence(_serialized), _options); + public void Deserialize() => MemoryPackSerializer.Deserialize(new ReadOnlySequence(_serialized), _options); public bool VerifyRoundTrip() { var abw = new ArrayBufferWriter(); MemoryPackSerializer.Serialize(abw, _order, _options); - var roundTripped = MemoryPackSerializer.Deserialize(new ReadOnlySequence(abw.WrittenMemory), _options); + var roundTripped = MemoryPackSerializer.Deserialize(new ReadOnlySequence(abw.WrittenMemory), _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Serializers.Console/Benchmarks/MessagePackBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/MessagePackBenchmark.cs index af2d67b..204473a 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/MessagePackBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/MessagePackBenchmark.cs @@ -8,13 +8,13 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// /// MessagePack benchmark, Byte[] I/O mode. Excluded from NativeAOT build because v3's StandardResolver -/// falls back to DynamicGenericResolver for closed-generic types (List<TestOrderItem> et al.), +/// falls back to DynamicGenericResolver for closed-generic types (List<TestOrderItem_All_True> et al.), /// which uses Activator.CreateInstance on formatter types the AOT trimmer drops → /// MissingMethodException at runtime. Available for regular JIT runs (dotnet run) only. /// internal sealed class MessagePackBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly MessagePackSerializerOptions _options; private readonly byte[] _serialized; @@ -27,7 +27,7 @@ internal sealed class MessagePackBenchmark : ISerializerBenchmark public long SetupDeserializeAllocBytes => 0; public string OptionsDescription { get; } - public MessagePackBenchmark(TestOrder order, string optionsPreset) + public MessagePackBenchmark(TestOrder_All_True order, string optionsPreset) { _order = order; OptionsPreset = optionsPreset; @@ -46,12 +46,12 @@ internal sealed class MessagePackBenchmark : ISerializerBenchmark public void Serialize() => MessagePackSerializer.Serialize(_order, _options); [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => MessagePackSerializer.Deserialize(_serialized, _options); + public void Deserialize() => MessagePackSerializer.Deserialize(_serialized, _options); public bool VerifyRoundTrip() { var bytes = MessagePackSerializer.Serialize(_order, _options); - var roundTripped = MessagePackSerializer.Deserialize(bytes, _options); + var roundTripped = MessagePackSerializer.Deserialize(bytes, _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Serializers.Console/Benchmarks/SystemTextJsonBenchmark.cs b/AyCode.Core.Serializers.Console/Benchmarks/SystemTextJsonBenchmark.cs index 2d45ccc..ac8bce0 100644 --- a/AyCode.Core.Serializers.Console/Benchmarks/SystemTextJsonBenchmark.cs +++ b/AyCode.Core.Serializers.Console/Benchmarks/SystemTextJsonBenchmark.cs @@ -12,7 +12,7 @@ namespace AyCode.Core.Serializers.Console.Benchmarks; /// internal sealed class SystemTextJsonBenchmark : ISerializerBenchmark { - private readonly TestOrder _order; + private readonly TestOrder_All_True _order; private readonly JsonSerializerOptions _options; private readonly string _serialized; private readonly byte[] _serializedUtf8; @@ -25,7 +25,7 @@ internal sealed class SystemTextJsonBenchmark : ISerializerBenchmark public long SetupSerializeAllocBytes => 0; public long SetupDeserializeAllocBytes => 0; - public SystemTextJsonBenchmark(TestOrder order, string optionsPreset) + public SystemTextJsonBenchmark(TestOrder_All_True order, string optionsPreset) { _order = order; OptionsPreset = optionsPreset; @@ -43,12 +43,12 @@ internal sealed class SystemTextJsonBenchmark : ISerializerBenchmark public void Serialize() => JsonSerializer.Serialize(_order, _options); [MethodImpl(MethodImplOptions.NoInlining)] - public void Deserialize() => JsonSerializer.Deserialize(_serialized, _options); + public void Deserialize() => JsonSerializer.Deserialize(_serialized, _options); public bool VerifyRoundTrip() { var json = JsonSerializer.Serialize(_order, _options); - var roundTripped = JsonSerializer.Deserialize(json, _options); + var roundTripped = JsonSerializer.Deserialize(json, _options); return BenchmarkLoop.DeepEqualsViaJson(_order, roundTripped); } } diff --git a/AyCode.Core.Tests/GeneratedWriters/TestOrderWriter.cs b/AyCode.Core.Tests/GeneratedWriters/TestOrderWriter.cs index 08a4560..70d4195 100644 --- a/AyCode.Core.Tests/GeneratedWriters/TestOrderWriter.cs +++ b/AyCode.Core.Tests/GeneratedWriters/TestOrderWriter.cs @@ -5,7 +5,7 @@ using AyCode.Core.Tests.TestModels; namespace AyCode.Core.Tests.GeneratedWriters; /// -/// Hand-written generated binary writer for TestOrder. +/// Hand-written generated binary writer for TestOrder_All_True. /// Demonstrates the pattern that the source generator will produce. /// /// Bypasses the runtime switch/delegate property loop: @@ -27,15 +27,15 @@ internal sealed class TestOrderWriter : IGeneratedBinaryWriter int depth) where TOutput : struct, IBinaryOutputBase { - var obj = Unsafe.As(value); + var obj = Unsafe.As(value); var nextDepth = depth; // Properties in alphabetical order (matching runtime serializer): - // AuditMetadata: MetadataInfo? (complex, nullable) + // AuditMetadata: MetadataInfo_All_True? (complex, nullable) WriteComplexOrNull(obj.AuditMetadata, context, nextDepth); - // Category: SharedCategory? (complex, nullable) + // Category: SharedCategory_All_True? (complex, nullable) WriteComplexOrNull(obj.Category, context, nextDepth); // CreatedAt: DateTime (markerless) @@ -44,16 +44,16 @@ internal sealed class TestOrderWriter : IGeneratedBinaryWriter // Id: int (markerless) context.WriteVarInt(obj.Id); - // Items: List (collection) + // Items: List (collection) WriteComplexOrNull(obj.Items, context, nextDepth); - // MetadataList: List (collection) + // MetadataList: List (collection) WriteComplexOrNull(obj.MetadataList, context, nextDepth); - // NoMergeItems: List (collection) + // NoMergeItems: List (collection) WriteComplexOrNull(obj.NoMergeItems, context, nextDepth); - // OrderMetadata: MetadataInfo? (complex, nullable) + // OrderMetadata: MetadataInfo_All_True? (complex, nullable) WriteComplexOrNull(obj.OrderMetadata, context, nextDepth); // OrderNumber: string @@ -74,16 +74,16 @@ internal sealed class TestOrderWriter : IGeneratedBinaryWriter context.WriteByte(BinaryTypeCode.Null); } - // PrimaryTag: SharedTag? (complex, nullable) + // PrimaryTag: SharedTag_All_True? (complex, nullable) WriteComplexOrNull(obj.PrimaryTag, context, nextDepth); - // SecondaryTag: SharedTag? (complex, nullable) + // SecondaryTag: SharedTag_All_True? (complex, nullable) WriteComplexOrNull(obj.SecondaryTag, context, nextDepth); // Status: TestStatus (enum, markerless) context.WriteVarInt((int)obj.Status); - // Tags: List (collection) + // Tags: List (collection) WriteComplexOrNull(obj.Tags, context, nextDepth); // TotalAmount: decimal (markerless) diff --git a/AyCode.Core.Tests/JsonExtensionTests.cs b/AyCode.Core.Tests/JsonExtensionTests.cs index 0dd62c0..3637c4c 100644 --- a/AyCode.Core.Tests/JsonExtensionTests.cs +++ b/AyCode.Core.Tests/JsonExtensionTests.cs @@ -116,7 +116,7 @@ public sealed class JsonExtensionTests public void SemanticReference_SharedTag_SerializesWithSemanticId() { // Arrange - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var order = TestDataFactory.CreateOrder(itemCount: 2, sharedTag: sharedTag); // Act @@ -133,7 +133,7 @@ public sealed class JsonExtensionTests { // Arrange var sharedTag = TestDataFactory.CreateTag("OriginalKey"); - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", @@ -183,19 +183,19 @@ public sealed class JsonExtensionTests public void NewtonsoftReference_DeepNestedNonId_HandlesCorrectly() { // Arrange - var rootMeta = new MetadataInfo + var rootMeta = new MetadataInfo_All_True { Key = "Root", Value = "RootValue", - ChildMetadata = new MetadataInfo + ChildMetadata = new MetadataInfo_All_True { Key = "Child", Value = "ChildValue", - ChildMetadata = new MetadataInfo { Key = "GrandChild", Value = "GrandChildValue" } + ChildMetadata = new MetadataInfo_All_True { Key = "GrandChild", Value = "GrandChildValue" } } }; - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", @@ -225,7 +225,7 @@ public sealed class JsonExtensionTests var sharedMeta = TestDataFactory.CreateMetadata(); sharedTag.Description = sharedMeta.Key; // Link them - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", @@ -234,7 +234,7 @@ public sealed class JsonExtensionTests OrderMetadata = sharedMeta, AuditMetadata = sharedMeta, Tags = [sharedTag], - Items = [new TestOrderItem { Id = 10, ProductName = "A", Tag = sharedTag, ItemMetadata = sharedMeta }] + Items = [new TestOrderItem_All_True { Id = 10, ProductName = "A", Tag = sharedTag, ItemMetadata = sharedMeta }] }; var json = order.ToJson(); @@ -254,8 +254,8 @@ public sealed class JsonExtensionTests // Arrange var order = TestDataFactory.CreateOrder(itemCount: 1); order.NoMergeItems = [ - new TestOrderItem { Id = 100, ProductName = "NoMerge-A" }, - new TestOrderItem { Id = 101, ProductName = "NoMerge-B" } + new TestOrderItem_All_True { Id = 100, ProductName = "NoMerge-A" }, + new TestOrderItem_All_True { Id = 101, ProductName = "NoMerge-B" } ]; var originalRef = order.NoMergeItems; @@ -284,13 +284,13 @@ public sealed class JsonExtensionTests public void NonIdCollection_ReplacesContent() { // Arrange - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", MetadataList = [ - new MetadataInfo { Key = "Old-A" }, - new MetadataInfo { Key = "Old-B" } + new MetadataInfo_All_True { Key = "Old-A" }, + new MetadataInfo_All_True { Key = "Old-B" } ] }; @@ -367,7 +367,7 @@ public sealed class JsonExtensionTests // Act var json = order.ToJson(); - var deserialized = json.JsonTo(); + var deserialized = json.JsonTo(); // Assert Assert.IsNotNull(deserialized); @@ -442,7 +442,7 @@ public sealed class JsonExtensionTests [TestMethod] public void WasmCompat_AcJsonSerializer_SimpleObject() { - var item = new TestOrderItem { Id = 1, ProductName = "Test", Quantity = 10, UnitPrice = 99.99m, Status = TestStatus.Processing }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Test", Quantity = 10, UnitPrice = 99.99m, Status = TestStatus.Processing }; var json = AcJsonSerializer.Serialize(item); @@ -453,10 +453,10 @@ public sealed class JsonExtensionTests [TestMethod] public void WasmCompat_AcJsonDeserializer_RoundTrip() { - var original = new TestOrderItem { Id = 42, ProductName = "WASM Test", Quantity = 5, UnitPrice = 25.50m, Status = TestStatus.Shipped }; + var original = new TestOrderItem_All_True { Id = 42, ProductName = "WASM Test", Quantity = 5, UnitPrice = 25.50m, Status = TestStatus.Shipped }; var json = AcJsonSerializer.Serialize(original); - var deserialized = AcJsonDeserializer.Deserialize(json); + var deserialized = AcJsonDeserializer.Deserialize(json); Assert.IsNotNull(deserialized); Assert.AreEqual(42, deserialized.Id); @@ -484,14 +484,14 @@ public sealed class JsonExtensionTests [TestMethod] public void WasmCompat_EmptyCollections_HandleCorrectly() { - var order = new TestOrder { Id = 1, OrderNumber = "EMPTY-TEST", Items = [], Tags = [] }; + var order = new TestOrder_All_True { Id = 1, OrderNumber = "EMPTY-TEST", Items = [], Tags = [] }; var json = AcJsonSerializer.Serialize(order); Assert.IsTrue(json.Contains("\"Items\":[]"), "Empty Items should serialize as []"); Assert.IsTrue(json.Contains("\"Tags\":[]"), "Empty Tags should serialize as []"); - var deserialized = AcJsonDeserializer.Deserialize(json); + var deserialized = AcJsonDeserializer.Deserialize(json); Assert.IsNotNull(deserialized?.Items); Assert.AreEqual(0, deserialized.Items.Count); @@ -513,8 +513,8 @@ public sealed class JsonExtensionTests [TestMethod] public void WasmCompat_SharedReferences_IdRefResolution() { - var sharedTag = new SharedTag { Id = 999, Name = "SharedKey" }; - var order = new TestOrder { Id = 1, OrderNumber = "REF-TEST", PrimaryTag = sharedTag, SecondaryTag = sharedTag, Tags = [sharedTag] }; + var sharedTag = new SharedTag_All_True { Id = 999, Name = "SharedKey" }; + var order = new TestOrder_All_True { Id = 1, OrderNumber = "REF-TEST", PrimaryTag = sharedTag, SecondaryTag = sharedTag, Tags = [sharedTag] }; var json = AcJsonSerializer.Serialize(order); @@ -528,7 +528,7 @@ public sealed class JsonExtensionTests NullValueHandling = NullValueHandling.Ignore }; - var deserialized = JsonConvert.DeserializeObject(json, nativeSettings); + var deserialized = JsonConvert.DeserializeObject(json, nativeSettings); Assert.IsNotNull(deserialized); Assert.AreSame(deserialized.PrimaryTag, deserialized.SecondaryTag); @@ -543,10 +543,10 @@ public sealed class JsonExtensionTests public void CrossSerializer_MixedReferences_CompatibleWithNewtonsoft() { // Arrange - var sharedTag = new SharedTag { Id = 100, Name = "SharedKey", CreatedAt = DateTime.UtcNow }; - var sharedMeta = new MetadataInfo { Key = "SharedMeta", Value = "MetaValue", ChildMetadata = new MetadataInfo { Key = "Child" } }; + var sharedTag = new SharedTag_All_True { Id = 100, Name = "SharedKey", CreatedAt = DateTime.UtcNow }; + var sharedMeta = new MetadataInfo_All_True { Key = "SharedMeta", Value = "MetaValue", ChildMetadata = new MetadataInfo_All_True { Key = "Child" } }; - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", @@ -556,7 +556,7 @@ public sealed class JsonExtensionTests OrderMetadata = sharedMeta, AuditMetadata = sharedMeta, Tags = [sharedTag], - Items = [new TestOrderItem { Id = 10, ProductName = "Product-A", Tag = sharedTag, ItemMetadata = sharedMeta }] + Items = [new TestOrderItem_All_True { Id = 10, ProductName = "Product-A", Tag = sharedTag, ItemMetadata = sharedMeta }] }; // Act - Serialize with AyCode @@ -570,7 +570,7 @@ public sealed class JsonExtensionTests NullValueHandling = NullValueHandling.Ignore }; - var deserialized = JsonConvert.DeserializeObject(json, nativeSettings); + var deserialized = JsonConvert.DeserializeObject(json, nativeSettings); // Assert Assert.IsNotNull(deserialized); @@ -589,11 +589,11 @@ public sealed class JsonExtensionTests var json = @"{ ""Id"": 1, ""OrderNumber"": ""ORD-001"", - ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag"" }, + ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag_All_True"" }, ""SecondaryTag"": { ""$ref"": ""1"" } }"; - var order = new TestOrder { Id = 1, OrderNumber = "OLD" }; + var order = new TestOrder_All_True { Id = 1, OrderNumber = "OLD" }; // Act json.JsonTo(order); @@ -602,7 +602,7 @@ public sealed class JsonExtensionTests Assert.IsNotNull(order.PrimaryTag, "PrimaryTag should be set"); Assert.IsNotNull(order.SecondaryTag, "SecondaryTag should be set from $ref"); Assert.AreEqual(100, order.PrimaryTag.Id); - Assert.AreEqual("SharedTag", order.PrimaryTag.Name); + Assert.AreEqual("SharedTag_All_True", order.PrimaryTag.Name); Assert.AreSame(order.PrimaryTag, order.SecondaryTag, "SecondaryTag should reference the same object as PrimaryTag via $ref"); } @@ -613,14 +613,14 @@ public sealed class JsonExtensionTests var json = @"{ ""Id"": 1, ""OrderNumber"": ""ORD-001"", - ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag"" }, + ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag_All_True"" }, ""Tags"": [ { ""$ref"": ""1"" }, { ""$id"": ""2"", ""Id"": 200, ""Name"": ""OtherTag"" } ] }"; - var order = new TestOrder { Id = 1, OrderNumber = "OLD", Tags = new List() }; + var order = new TestOrder_All_True { Id = 1, OrderNumber = "OLD", Tags = new List() }; // Act json.JsonTo(order); @@ -648,11 +648,11 @@ public sealed class JsonExtensionTests ""PrimaryTag"": { ""$ref"": ""1"" } }"; - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "OLD", - Items = new List { new TestOrderItem { Id = 10, ProductName = "OLD" } } + Items = new List { new TestOrderItem_All_True { Id = 10, ProductName = "OLD" } } }; // Act @@ -672,10 +672,10 @@ public sealed class JsonExtensionTests ""Id"": 1, ""OrderNumber"": ""ORD-001"", ""SecondaryTag"": { ""$ref"": ""1"" }, - ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag"" } + ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag_All_True"" } }"; - var order = new TestOrder { Id = 1, OrderNumber = "OLD" }; + var order = new TestOrder_All_True { Id = 1, OrderNumber = "OLD" }; // Act json.JsonTo(order); @@ -693,7 +693,7 @@ public sealed class JsonExtensionTests var json = @"{ ""Id"": 1, ""OrderNumber"": ""ORD-001"", - ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag"" }, + ""PrimaryTag"": { ""$id"": ""1"", ""Id"": 100, ""Name"": ""SharedTag_All_True"" }, ""SecondaryTag"": { ""$ref"": ""1"" }, ""Tags"": [ { ""$ref"": ""1"" }, @@ -702,7 +702,7 @@ public sealed class JsonExtensionTests ] }"; - var order = new TestOrder { Id = 1, OrderNumber = "OLD", Tags = new List() }; + var order = new TestOrder_All_True { Id = 1, OrderNumber = "OLD", Tags = new List() }; // Act json.JsonTo(order); @@ -731,10 +731,10 @@ public sealed class JsonExtensionTests ""PrimaryTag"": { ""$ref"": ""deep1"" } }"; - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, - Items = new List { new TestOrderItem { Id = 10 } } + Items = new List { new TestOrderItem_All_True { Id = 10 } } }; // Act @@ -762,10 +762,10 @@ public sealed class JsonExtensionTests }] }"; - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, - Items = new List { new TestOrderItem { Id = 10 } } + Items = new List { new TestOrderItem_All_True { Id = 10 } } }; // Act @@ -789,7 +789,7 @@ public sealed class JsonExtensionTests }"; // Act - var order = AcJsonDeserializer.Deserialize(json); + var order = AcJsonDeserializer.Deserialize(json); // Assert Assert.IsNotNull(order); @@ -820,7 +820,7 @@ public sealed class JsonExtensionTests }"; // Act - var order = AcJsonDeserializer.Deserialize(json); + var order = AcJsonDeserializer.Deserialize(json); // Assert Assert.IsNotNull(order); @@ -841,8 +841,8 @@ public sealed class JsonExtensionTests ""SecondaryTag"": { ""$ref"": ""1"" } }"; - var existingTag = new SharedTag { Id = 999, Name = "ExistingTag" }; - var order = new TestOrder + var existingTag = new SharedTag_All_True { Id = 999, Name = "ExistingTag" }; + var order = new TestOrder_All_True { Id = 1, SecondaryTag = existingTag @@ -1047,9 +1047,9 @@ public sealed class JsonExtensionTests { Id = 1, Name = "Test", - Tag = new SharedTag { Id = 1, Name = "Tag" } + Tag = new SharedTag_All_True { Id = 1, Name = "Tag" } }; - // Using existing Tag property with Guid in SharedTag's CreatedAt + // Using existing Tag property with Guid in SharedTag_All_True's CreatedAt var json = AcJsonSerializer.Serialize(obj); @@ -1240,8 +1240,8 @@ public sealed class JsonExtensionTests public void Populate_ObjectToObject_PopulatesProperties() { var json = "{\"Name\": \"Updated\", \"Id\": 99}"; - var obj = new SharedTag { Id = 1, Name = "Original" }; - AcJsonDeserializer.Populate(json, obj, typeof(SharedTag)); + var obj = new SharedTag_All_True { Id = 1, Name = "Original" }; + AcJsonDeserializer.Populate(json, obj, typeof(SharedTag_All_True)); Assert.AreEqual(99, obj.Id); Assert.AreEqual("Updated", obj.Name); } @@ -1249,14 +1249,14 @@ public sealed class JsonExtensionTests [TestMethod] public void Deserialize_NullJson_ReturnsDefault() { - var result = AcJsonDeserializer.Deserialize("null"); + var result = AcJsonDeserializer.Deserialize("null"); Assert.IsNull(result); } [TestMethod] public void Deserialize_EmptyJson_ReturnsDefault() { - var result = AcJsonDeserializer.Deserialize(""); + var result = AcJsonDeserializer.Deserialize(""); Assert.IsNull(result); } @@ -1312,7 +1312,7 @@ public sealed class JsonExtensionTests try { - AcJsonDeserializer.Deserialize(invalidJson); + AcJsonDeserializer.Deserialize(invalidJson); Assert.Fail("Expected AcJsonDeserializationException"); } catch (AcJsonDeserializationException) @@ -1329,7 +1329,7 @@ public sealed class JsonExtensionTests try { - AcJsonDeserializer.Deserialize(doubleQuotedJson); + AcJsonDeserializer.Deserialize(doubleQuotedJson); Assert.Fail("Expected AcJsonDeserializationException for double-serialized JSON"); } catch (AcJsonDeserializationException ex) @@ -1346,7 +1346,7 @@ public sealed class JsonExtensionTests try { - AcJsonDeserializer.Deserialize(arrayJson); + AcJsonDeserializer.Deserialize(arrayJson); Assert.Fail("Expected AcJsonDeserializationException"); } catch (AcJsonDeserializationException ex) @@ -1363,7 +1363,7 @@ public sealed class JsonExtensionTests try { - AcJsonDeserializer.Deserialize>(objectJson); + AcJsonDeserializer.Deserialize>(objectJson); Assert.Fail("Expected AcJsonDeserializationException"); } catch (AcJsonDeserializationException ex) @@ -1376,7 +1376,7 @@ public sealed class JsonExtensionTests public void Populate_NullTarget_ThrowsArgumentNullException() { var json = "{\"Id\":1}"; - TestOrderItem? target = null; + TestOrderItem_All_True? target = null; try { @@ -1392,7 +1392,7 @@ public sealed class JsonExtensionTests [TestMethod] public void Populate_InvalidJson_ThrowsException() { - var target = new TestOrderItem(); + var target = new TestOrderItem_All_True(); var invalidJson = "{ not valid }"; try @@ -1409,7 +1409,7 @@ public sealed class JsonExtensionTests [TestMethod] public void Populate_ArrayToNonList_ThrowsException() { - var target = new TestOrderItem(); + var target = new TestOrderItem_All_True(); var arrayJson = "[1,2,3]"; try @@ -1432,7 +1432,7 @@ public sealed class JsonExtensionTests { var json = "{\"Id\":1,\"ProductName\":\"Test \\\"quoted\\\" and \\\\backslash\"}"; - var result = AcJsonDeserializer.Deserialize(json); + var result = AcJsonDeserializer.Deserialize(json); Assert.IsNotNull(result); Assert.AreEqual("Test \"quoted\" and \\backslash", result.ProductName); @@ -1443,7 +1443,7 @@ public sealed class JsonExtensionTests { var json = "{\"Id\":1,\"ProductName\":\"中文日本語한국어🎉\"}"; - var result = AcJsonDeserializer.Deserialize(json); + var result = AcJsonDeserializer.Deserialize(json); Assert.IsNotNull(result); Assert.AreEqual("中文日本語한국어🎉", result.ProductName); @@ -1454,7 +1454,7 @@ public sealed class JsonExtensionTests { var json = "{\"Id\":999999999,\"ProductName\":\"Big\",\"Quantity\":2147483647}"; - var result = AcJsonDeserializer.Deserialize(json); + var result = AcJsonDeserializer.Deserialize(json); Assert.IsNotNull(result); Assert.AreEqual(999999999, result.Id); @@ -1464,7 +1464,7 @@ public sealed class JsonExtensionTests [TestMethod] public void Serialize_ThenDeserialize_RoundTripPreservesData() { - var original = new TestOrderItem + var original = new TestOrderItem_All_True { Id = 42, ProductName = "Test with \"quotes\" and \\backslash", @@ -1474,7 +1474,7 @@ public sealed class JsonExtensionTests }; var json = original.ToJson(); - var restored = AcJsonDeserializer.Deserialize(json); + var restored = AcJsonDeserializer.Deserialize(json); Assert.IsNotNull(restored); Assert.AreEqual(original.Id, restored.Id); @@ -1491,12 +1491,12 @@ public sealed class JsonExtensionTests [TestMethod] public void Deserialize_TaskWrappedJson_DirectDeserialization_OnlyGetsRootProperties() { - // This JSON represents a serialized Task - the actual data is in "Result" + // This JSON represents a serialized Task - the actual data is in "Result" // This happens when someone forgets to await an async method before serializing var taskWrappedJson = "{\"Result\":{\"Id\":1,\"ProductName\":\"Processed: TestProduct\",\"Quantity\":10,\"UnitPrice\":20,\"TotalPrice\":200},\"Id\":1,\"Status\":5,\"IsCompleted\":true,\"IsCompletedSuccessfully\":true}"; - // Direct deserialization to TestOrderItem only gets root-level properties - var result = AcJsonDeserializer.Deserialize(taskWrappedJson); + // Direct deserialization to TestOrderItem_All_True only gets root-level properties + var result = AcJsonDeserializer.Deserialize(taskWrappedJson); Assert.IsNotNull(result); // Id=1 is at root level and matches @@ -1509,11 +1509,11 @@ public sealed class JsonExtensionTests [TestMethod] public void Deserialize_TaskWrappedJson_UseWrapperClass_ExtractsCorrectly() { - // This JSON represents a serialized Task - the actual data is in "Result" + // This JSON represents a serialized Task - the actual data is in "Result" var taskWrappedJson = "{\"Result\":{\"Id\":1,\"ProductName\":\"Processed: TestProduct\",\"Quantity\":10,\"UnitPrice\":20,\"TotalPrice\":200},\"Id\":1,\"Status\":5,\"IsCompleted\":true,\"IsCompletedSuccessfully\":true}"; // Proper approach: deserialize to a wrapper type and extract Result - var wrapper = AcJsonDeserializer.Deserialize>(taskWrappedJson); + var wrapper = AcJsonDeserializer.Deserialize>(taskWrappedJson); Assert.IsNotNull(wrapper); Assert.IsNotNull(wrapper.Result); diff --git a/AyCode.Core.Tests/Serialization/AcBinarySerializerBenchmarkTests.cs b/AyCode.Core.Tests/Serialization/AcBinarySerializerBenchmarkTests.cs index 03e538d..eb5bbae 100644 --- a/AyCode.Core.Tests/Serialization/AcBinarySerializerBenchmarkTests.cs +++ b/AyCode.Core.Tests/Serialization/AcBinarySerializerBenchmarkTests.cs @@ -14,7 +14,7 @@ public class AcBinarySerializerBenchmarkTests var binary = AcBinarySerializer.Serialize(order); Assert.IsTrue(binary.Length > 0, "Binary data should not be empty"); - var result = AcBinaryDeserializer.Deserialize(binary); + var result = AcBinaryDeserializer.Deserialize(binary); Assert.IsNotNull(result); Assert.AreEqual(order.Id, result.Id); Assert.AreEqual(order.OrderNumber, result.OrderNumber); @@ -29,7 +29,7 @@ public class AcBinarySerializerBenchmarkTests var binary = AcBinarySerializer.Serialize(order); Assert.IsTrue(binary.Length > 0); - var result = AcBinaryDeserializer.Deserialize(binary); + var result = AcBinaryDeserializer.Deserialize(binary); Assert.IsNotNull(result); Assert.AreEqual(order.Id, result.Id); } @@ -42,7 +42,7 @@ public class AcBinarySerializerBenchmarkTests var binary = AcBinarySerializer.Serialize(order); Assert.IsTrue(binary.Length > 0, "Binary data should not be empty"); - var result = AcBinaryDeserializer.Deserialize(binary); + var result = AcBinaryDeserializer.Deserialize(binary); Assert.IsNotNull(result); Assert.AreEqual(order.Id, result.Id); Assert.AreEqual(order.OrderNumber, result.OrderNumber); @@ -69,8 +69,8 @@ public class AcBinarySerializerBenchmarkTests Console.WriteLine($"With interning: {binaryWithInterning.Length}, Without: {binaryWithoutInterning.Length}"); // Both should deserialize correctly regardless of size - var result1 = AcBinaryDeserializer.Deserialize(binaryWithInterning); - var result2 = AcBinaryDeserializer.Deserialize(binaryWithoutInterning); + var result1 = AcBinaryDeserializer.Deserialize(binaryWithInterning); + var result2 = AcBinaryDeserializer.Deserialize(binaryWithoutInterning); Assert.IsNotNull(result1); Assert.IsNotNull(result2); diff --git a/AyCode.Core.Tests/Serialization/AcBinarySerializerChainReferenceTests.cs b/AyCode.Core.Tests/Serialization/AcBinarySerializerChainReferenceTests.cs index c86e5f3..4f14a10 100644 --- a/AyCode.Core.Tests/Serialization/AcBinarySerializerChainReferenceTests.cs +++ b/AyCode.Core.Tests/Serialization/AcBinarySerializerChainReferenceTests.cs @@ -20,7 +20,7 @@ public class AcBinarySerializerChainReferenceTests public void ChainPopulate_IIdObjects_PreservesReferences() { // Setup: Create internal cache with 5 categories - var internalCache = new List + var internalCache = new List { new() { Id = 1, Name = "Category1", SortOrder = 1 }, new() { Id = 2, Name = "Category2", SortOrder = 2 }, @@ -30,7 +30,7 @@ public class AcBinarySerializerChainReferenceTests }; // Server returns subset of categories (like grid pagination - page 2: items 3-5) - var serverData = new List + var serverData = new List { new() { Id = 3, Name = "Category3_Updated", SortOrder = 33 }, new() { Id = 4, Name = "Category4_Updated", SortOrder = 44 }, @@ -41,10 +41,10 @@ public class AcBinarySerializerChainReferenceTests var binary = serverData.ToBinary(); // Grid's visible list (empty initially) - var gridVisibleList = new List(); + var gridVisibleList = new List(); // CRITICAL: Use Chain API to parse once, populate both cache and grid - using var chain = binary.BinaryToChain>(); + using var chain = binary.BinaryToChain>(); // First: Update internal cache (will become 3 items: 3-5 updated) chain.ThenPopulate(internalCache); @@ -77,7 +77,7 @@ public class AcBinarySerializerChainReferenceTests public void JsonChainPopulate_IIdObjects_PreservesReferences() { // Setup: Create internal cache - var internalCache = new List + var internalCache = new List { new() { Id = 1, Name = "Category1", SortOrder = 1 }, new() { Id = 2, Name = "Category2", SortOrder = 2 }, @@ -85,7 +85,7 @@ public class AcBinarySerializerChainReferenceTests }; // Server returns subset - var serverData = new List + var serverData = new List { new() { Id = 2, Name = "Category2_Updated", SortOrder = 22 }, new() { Id = 3, Name = "Category3_Updated", SortOrder = 33 } @@ -95,10 +95,10 @@ public class AcBinarySerializerChainReferenceTests var json = serverData.ToJson(); // Grid's visible list - var gridVisibleList = new List(); + var gridVisibleList = new List(); // Use JSON Chain API - using var chain = json.JsonToChain>(); + using var chain = json.JsonToChain>(); // Update internal cache (will replace with 2 items) chain.ThenPopulate(internalCache); @@ -163,22 +163,22 @@ public class AcBinarySerializerChainReferenceTests { // Large internal cache var internalCache = Enumerable.Range(1, 10) - .Select(i => new SharedCategory { Id = i, Name = $"Category{i}", SortOrder = i * 10 }) + .Select(i => new SharedCategory_All_True { Id = i, Name = $"Category{i}", SortOrder = i * 10 }) .ToList(); // Server returns items 3-7 var serverData = Enumerable.Range(3, 5) - .Select(i => new SharedCategory { Id = i, Name = $"Category{i}_Updated", SortOrder = i * 11 }) + .Select(i => new SharedCategory_All_True { Id = i, Name = $"Category{i}_Updated", SortOrder = i * 11 }) .ToList(); var binary = serverData.ToBinary(); // Three different grid pages/views - var gridPage1 = new List(); - var gridPage2 = new List(); - var gridPage3 = new List(); + var gridPage1 = new List(); + var gridPage2 = new List(); + var gridPage3 = new List(); - using var chain = binary.BinaryToChain>(); + using var chain = binary.BinaryToChain>(); // Update cache first chain.ThenPopulate(internalCache); @@ -208,17 +208,17 @@ public class AcBinarySerializerChainReferenceTests [TestMethod] public void ChainPopulate_SimpleCase_Works() { - var list1 = new List(); - var list2 = new List(); + var list1 = new List(); + var list2 = new List(); - var serverData = new List + var serverData = new List { new() { Id = 1, Name = "Cat1", SortOrder = 10 } }; var binary = serverData.ToBinary(); - using var chain = binary.BinaryToChain>(); + using var chain = binary.BinaryToChain>(); // First populate chain.ThenPopulate(list1); diff --git a/AyCode.Core.Tests/Serialization/AcBinarySerializerIIdReferenceTests.cs b/AyCode.Core.Tests/Serialization/AcBinarySerializerIIdReferenceTests.cs index c58e110..48d246f 100644 --- a/AyCode.Core.Tests/Serialization/AcBinarySerializerIIdReferenceTests.cs +++ b/AyCode.Core.Tests/Serialization/AcBinarySerializerIIdReferenceTests.cs @@ -96,9 +96,9 @@ public class AcBinarySerializerIIdReferenceTests foreach (var mode in modes) { // Arrange: SAME instance used multiple times - var userPreferences = new UserPreferences(); - var sharedTag = new SharedTag { Id = 1, Name = "ImportantTag", Color = "#FF0000" }; - var sharedUser = new SharedUser { Id = 1, Preferences = userPreferences }; + var userPreferences = new UserPreferences_All_True(); + var sharedTag = new SharedTag_All_True { Id = 1, Name = "ImportantTag", Color = "#FF0000" }; + var sharedUser = new SharedUser_All_True { Id = 1, Preferences = userPreferences }; var order = new TestOrder_Circ_Ref { @@ -109,8 +109,8 @@ public class AcBinarySerializerIIdReferenceTests Items = [ new TestOrderItem_Circ_Ref { Id = 1, ProductName = "Product-A", Tag = sharedTag, Assignee = sharedUser }, - new TestOrderItem_Circ_Ref { Id = 2, ProductName = "Product-B", Tag = sharedTag, Assignee = new SharedUser { Id = 2, Preferences = userPreferences }}, - new TestOrderItem_Circ_Ref { Id = 3, ProductName = "Product-C", Tag = sharedTag, Assignee = new SharedUser { Id = 3, Preferences = userPreferences } } + new TestOrderItem_Circ_Ref { Id = 2, ProductName = "Product-B", Tag = sharedTag, Assignee = new SharedUser_All_True { Id = 2, Preferences = userPreferences }}, + new TestOrderItem_Circ_Ref { Id = 3, ProductName = "Product-C", Tag = sharedTag, Assignee = new SharedUser_All_True { Id = 3, Preferences = userPreferences } } ] }; @@ -167,7 +167,7 @@ public class AcBinarySerializerIIdReferenceTests break; case ReferenceHandlingMode.All: - // IId types + Non-IId (UserPreferences) should have ObjectRefs + // IId types + Non-IId (UserPreferences_All_True) should have ObjectRefs Assert.IsTrue(objectRefCount >= 4, $"[{mode}] Expected at least 4 ObjectRefs, found {objectRefCount}"); Assert.AreSame(result.PrimaryTag, result.Items[0].Tag, $"[{mode}] Tag reference identity failed"); Assert.AreSame(result.Owner, result.Items[0].Assignee, $"[{mode}] User reference identity failed"); @@ -176,7 +176,7 @@ public class AcBinarySerializerIIdReferenceTests Assert.AreSame(result.Parent, result.Items[1]); // Non-IId should also have reference identity in All mode - Assert.AreSame(result.Owner.Preferences, result.Items[0].Assignee.Preferences, $"[{mode}] UserPreferences reference identity failed - Non-IId should work in All mode!"); + Assert.AreSame(result.Owner.Preferences, result.Items[0].Assignee.Preferences, $"[{mode}] UserPreferences_All_True reference identity failed - Non-IId should work in All mode!"); break; } @@ -207,44 +207,44 @@ public class AcBinarySerializerIIdReferenceTests { // Arrange: DIFFERENT instances but SAME IId.Id // CRITICAL: Multiple DIFFERENT TYPES all have Id=1 - must not be confused! - var sharedTag = new SharedTag { Id = 55, Name = "ImportantTag_55", Color = "#FF0000" }; - var order = new TestOrder + var sharedTag = new SharedTag_All_True { Id = 55, Name = "ImportantTag_55", Color = "#FF0000" }; + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", // All three types have Id=1 - tests (Type, Id) keying, not just Id - PrimaryTag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Owner = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" }, - Category = new SharedCategory { Id = 1, Name = "Category_Id1", SortOrder = 10 }, + PrimaryTag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Owner = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" }, + Category = new SharedCategory_All_True { Id = 1, Name = "Category_Id1", SortOrder = 10 }, Items = [ - new TestOrderItem + new TestOrderItem_All_True { Id = 1, ProductName = "Product-A", - Tag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Assignee = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" } + Tag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Assignee = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" } }, - new TestOrderItem + new TestOrderItem_All_True { Id = 2, ProductName = "Product-B", - Tag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Assignee = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" } + Tag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Assignee = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" } }, - new TestOrderItem + new TestOrderItem_All_True { Id = 3, ProductName = "Product-C", - Tag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Assignee = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" } + Tag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Assignee = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" } } ] }; // Act var binary = order.ToBinary(); - var result = binary.BinaryTo(); + var result = binary.BinaryTo(); // Assert 1: Check if ObjectRef is used (IId-based deduplication active) var objectRefCount = CountObjectRefs(binary); @@ -254,11 +254,11 @@ public class AcBinarySerializerIIdReferenceTests // Assert 3: Reference identity - same TYPE with same Id should be same reference // Tags with Id=1 should all be same reference Assert.AreSame(result.PrimaryTag, result.Items[0].Tag, - "CRITICAL: Item[0].Tag should be same reference as PrimaryTag (same SharedTag.Id=1)"); + "CRITICAL: Item[0].Tag should be same reference as PrimaryTag (same SharedTag_All_True.Id=1)"); Assert.AreSame(result.PrimaryTag, result.Items[1].Tag, - "CRITICAL: Item[1].Tag should be same reference as PrimaryTag (same SharedTag.Id=1)"); + "CRITICAL: Item[1].Tag should be same reference as PrimaryTag (same SharedTag_All_True.Id=1)"); Assert.AreSame(result.PrimaryTag, result.Items[2].Tag, - "CRITICAL: Item[2].Tag should be same reference as PrimaryTag (same SharedTag.Id=1)"); + "CRITICAL: Item[2].Tag should be same reference as PrimaryTag (same SharedTag_All_True.Id=1)"); // Users with Id=1 should all be same reference Assert.AreSame(result.Owner, result.Items[0].Assignee, @@ -325,38 +325,38 @@ public class AcBinarySerializerIIdReferenceTests public void DifferentInstances_SameIId_SmallerBinaryWithDataIntegrity() { // Arrange: 10 different instances with SAME IId - var orderWithSameIId = new TestOrder + var orderWithSameIId = new TestOrder_All_True { Id = 1, OrderNumber = "SAME-IID", - Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem + Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem_All_True { Id = i, ProductName = $"Product-{i}", // All have SAME IId.Id = 1, but DIFFERENT instances - Assignee = new SharedUser { Id = 1, Username = "shared_user_name", Email = "shared@test.com" } + Assignee = new SharedUser_All_True { Id = 1, Username = "shared_user_name", Email = "shared@test.com" } }).ToList() }; // Arrange: 10 different instances with DIFFERENT IIds - var orderWithDifferentIIds = new TestOrder + var orderWithDifferentIIds = new TestOrder_All_True { Id = 1, OrderNumber = "DIFF-IID", - Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem + Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem_All_True { Id = i, ProductName = $"Product-{i}", // All have DIFFERENT IId.Id - Assignee = new SharedUser { Id = i * 100, Username = "unique_user_name", Email = "unique@test.com" } + Assignee = new SharedUser_All_True { Id = i * 100, Username = "unique_user_name", Email = "unique@test.com" } }).ToList() }; // Act var sameIIdBinary = orderWithSameIId.ToBinary(); var diffIIdBinary = orderWithDifferentIIds.ToBinary(); - var sameIIdResult = sameIIdBinary.BinaryTo(); - var diffIIdResult = diffIIdBinary.BinaryTo(); + var sameIIdResult = sameIIdBinary.BinaryTo(); + var diffIIdResult = diffIIdBinary.BinaryTo(); // Assert 1: Size comparison Console.WriteLine($"Same IId binary size: {sameIIdBinary.Length} bytes"); @@ -506,15 +506,15 @@ public class AcBinarySerializerIIdReferenceTests public void IIdDetection_Diagnostic() { // Test GetIdInfo directly - var sharedTagType = typeof(SharedTag); + var sharedTagType = typeof(SharedTag_All_True); var idInfo = AyCode.Core.Helpers.JsonUtilities.GetIdInfo(sharedTagType); - Console.WriteLine($"SharedTag GetIdInfo: IsId={idInfo.IsId}, IdType={idInfo.IdType?.Name}"); - Assert.IsTrue(idInfo.IsId, "SharedTag should be detected as IId"); - Assert.AreEqual(typeof(int), idInfo.IdType, "SharedTag Id type should be int"); + Console.WriteLine($"SharedTag_All_True GetIdInfo: IsId={idInfo.IsId}, IdType={idInfo.IdType?.Name}"); + Assert.IsTrue(idInfo.IsId, "SharedTag_All_True should be detected as IId"); + Assert.AreEqual(typeof(int), idInfo.IdType, "SharedTag_All_True Id type should be int"); // Test SharedUser - var sharedUserType = typeof(SharedUser); + var sharedUserType = typeof(SharedUser_All_True); var userIdInfo = AyCode.Core.Helpers.JsonUtilities.GetIdInfo(sharedUserType); Console.WriteLine($"SharedUser GetIdInfo: IsId={userIdInfo.IsId}, IdType={userIdInfo.IdType?.Name}"); Assert.IsTrue(userIdInfo.IsId, "SharedUser should be detected as IId"); @@ -532,7 +532,7 @@ public class AcBinarySerializerIIdReferenceTests [TestMethod] public void SharedCategory_DataIntegrity() { - var categories = new List + var categories = new List { new() { Id = 1, Name = "Category1", SortOrder = 1, IsDefault = true }, new() { Id = 2, Name = "Category2", SortOrder = 2, ParentCategoryId = 1 }, @@ -540,7 +540,7 @@ public class AcBinarySerializerIIdReferenceTests }; var binary = categories.ToBinary(); - var result = binary.BinaryTo>(); + var result = binary.BinaryTo>(); Assert.IsNotNull(result); Assert.AreEqual(3, result.Count); diff --git a/AyCode.Core.Tests/Serialization/AcBinarySerializerNamedPipeTests.cs b/AyCode.Core.Tests/Serialization/AcBinarySerializerNamedPipeTests.cs index f03ebc0..d72c1d7 100644 --- a/AyCode.Core.Tests/Serialization/AcBinarySerializerNamedPipeTests.cs +++ b/AyCode.Core.Tests/Serialization/AcBinarySerializerNamedPipeTests.cs @@ -150,7 +150,7 @@ public class AcBinarySerializerNamedPipeTests return await receiveTask.ConfigureAwait(false); } - private static (int items, int pallets, int measurements, int points) CountTestOrderHierarchy(TestOrder order) + private static (int items, int pallets, int measurements, int points) CountTestOrderHierarchy(TestOrder_All_True order) { var items = order.Items.Count; int pallets = 0, measurements = 0, points = 0; diff --git a/AyCode.Core.Tests/Serialization/AcBinarySerializerPipeParallelTests.cs b/AyCode.Core.Tests/Serialization/AcBinarySerializerPipeParallelTests.cs index a031c4a..3ae6312 100644 --- a/AyCode.Core.Tests/Serialization/AcBinarySerializerPipeParallelTests.cs +++ b/AyCode.Core.Tests/Serialization/AcBinarySerializerPipeParallelTests.cs @@ -515,7 +515,7 @@ public class AcBinarySerializerPipeParallelTests var pipe = new Pipe(); using var input = new AsyncPipeReaderInput(initialCapacity: opts.BufferWriterChunkSize * 2); - var deserTask = Task.Run(() => AcBinaryDeserializer.Deserialize(input, opts)); + var deserTask = Task.Run(() => AcBinaryDeserializer.Deserialize(input, opts)); var drainTask = input.DrainFromAsync(pipe.Reader); var serTask = Task.Run(async () => { @@ -541,7 +541,7 @@ public class AcBinarySerializerPipeParallelTests Assert.AreEqual(origCounts.points, resultCounts.points, "Points count mismatch"); } - private static (int items, int pallets, int measurements, int points) CountTestOrderHierarchy(TestOrder order) + private static (int items, int pallets, int measurements, int points) CountTestOrderHierarchy(TestOrder_All_True order) { var items = order.Items.Count; int pallets = 0, measurements = 0, points = 0; diff --git a/AyCode.Core.Tests/Serialization/AcBinarySerializerSGenRuntimeCompatibilityTests.cs b/AyCode.Core.Tests/Serialization/AcBinarySerializerSGenRuntimeCompatibilityTests.cs index 685bd03..11ea151 100644 --- a/AyCode.Core.Tests/Serialization/AcBinarySerializerSGenRuntimeCompatibilityTests.cs +++ b/AyCode.Core.Tests/Serialization/AcBinarySerializerSGenRuntimeCompatibilityTests.cs @@ -30,7 +30,7 @@ public class AcBinarySerializerSGenRuntimeCompatibilityTests var expectedJson = JsonSerializer.Serialize(dataSet.Order, StjOptions); var bytes = AcBinarySerializer.Serialize(dataSet.Order, serializeOptions); - var roundTrip = AcBinaryDeserializer.Deserialize(bytes, deserializeOptions); + var roundTrip = AcBinaryDeserializer.Deserialize(bytes, deserializeOptions); var actualJson = JsonSerializer.Serialize(roundTrip, StjOptions); Assert.AreEqual(expectedJson, actualJson, $"STJ mismatch. Dataset={dataSet.Name}, WireMode={serializeOptions.WireMode}, BaseOptions={serializeOptions.ReferenceHandling}/{serializeOptions.UseStringInterning}"); @@ -56,7 +56,7 @@ public class AcBinarySerializerSGenRuntimeCompatibilityTests var expectedJson = JsonSerializer.Serialize(dataSet.Order, StjOptions); var bytes = AcBinarySerializer.Serialize(dataSet.Order, serializeOptions); - var roundTrip = AcBinaryDeserializer.Deserialize(bytes, deserializeOptions); + var roundTrip = AcBinaryDeserializer.Deserialize(bytes, deserializeOptions); var actualJson = JsonSerializer.Serialize(roundTrip, StjOptions); Assert.AreEqual(expectedJson, actualJson, $"STJ mismatch. Dataset={dataSet.Name}, WireMode={serializeOptions.WireMode}, BaseOptions={serializeOptions.ReferenceHandling}/{serializeOptions.UseStringInterning}"); @@ -97,7 +97,7 @@ public class AcBinarySerializerSGenRuntimeCompatibilityTests }; } - private static void AssertOrderEquivalent(TestOrder expected, TestOrder? actual, string context) + private static void AssertOrderEquivalent(TestOrder_All_True expected, TestOrder_All_True? actual, string context) { Assert.IsNotNull(actual, context); Assert.AreEqual(expected.Id, actual.Id, context); diff --git a/AyCode.Core.Tests/Serialization/AcExpressionNodeSerializationTests.cs b/AyCode.Core.Tests/Serialization/AcExpressionNodeSerializationTests.cs index 69eaa3e..1f74415 100644 --- a/AyCode.Core.Tests/Serialization/AcExpressionNodeSerializationTests.cs +++ b/AyCode.Core.Tests/Serialization/AcExpressionNodeSerializationTests.cs @@ -22,7 +22,7 @@ public class AcExpressionNodeSerializationTests public void AcJsonSerializer_WithAcExpressionNode_RoundTrip_Works() { // Arrange - Create an expression with a constant value - System.Linq.Expressions.Expression> filterExpression = + System.Linq.Expressions.Expression> filterExpression = item => item.Quantity > 5; var expressionNode = AcExpressionConverter.ToNode(filterExpression); @@ -39,11 +39,11 @@ public class AcExpressionNodeSerializationTests Assert.IsNotNull(deserialized, "Deserialized node should not be null"); // Rebuild and test - var rebuiltExpression = AcExpressionRebuilder.FromNode(deserialized); + var rebuiltExpression = AcExpressionRebuilder.FromNode(deserialized); var compiled = rebuiltExpression.Compile(); - var matchingItem = new TestOrderItem { Id = 1, Quantity = 10 }; - var nonMatchingItem = new TestOrderItem { Id = 2, Quantity = 3 }; + var matchingItem = new TestOrderItem_All_True { Id = 1, Quantity = 10 }; + var nonMatchingItem = new TestOrderItem_All_True { Id = 2, Quantity = 3 }; Assert.IsTrue(compiled(matchingItem), "Matching item should pass filter"); Assert.IsFalse(compiled(nonMatchingItem), "Non-matching item should fail filter"); @@ -121,7 +121,7 @@ public class AcExpressionNodeSerializationTests public void AcBinarySerializer_WithAcExpressionNode_RoundTrip_Works() { // Arrange - System.Linq.Expressions.Expression> filterExpression = + System.Linq.Expressions.Expression> filterExpression = item => item.Quantity > 5; var originalNode = AcExpressionConverter.ToNode(filterExpression); @@ -137,11 +137,11 @@ public class AcExpressionNodeSerializationTests Assert.AreEqual(originalNode.NodeType, deserialized.NodeType); // Rebuild and test - var rebuiltExpression = AcExpressionRebuilder.FromNode(deserialized); + var rebuiltExpression = AcExpressionRebuilder.FromNode(deserialized); var compiled = rebuiltExpression.Compile(); - var matchingItem = new TestOrderItem { Id = 1, Quantity = 10 }; - var nonMatchingItem = new TestOrderItem { Id = 2, Quantity = 3 }; + var matchingItem = new TestOrderItem_All_True { Id = 1, Quantity = 10 }; + var nonMatchingItem = new TestOrderItem_All_True { Id = 2, Quantity = 3 }; Assert.IsTrue(compiled(matchingItem), "Matching item should pass filter"); Assert.IsFalse(compiled(nonMatchingItem), "Non-matching item should fail filter"); @@ -183,7 +183,7 @@ public class AcExpressionNodeSerializationTests { // Arrange - Expression with captured decimal: item => item.UnitPrice > 99.99m var minPrice = 99.99m; - System.Linq.Expressions.Expression> filterExpression = + System.Linq.Expressions.Expression> filterExpression = item => item.UnitPrice > minPrice; var originalNode = AcExpressionConverter.ToNode(filterExpression); @@ -195,11 +195,11 @@ public class AcExpressionNodeSerializationTests // Assert - Rebuild and verify it still works with decimal comparison Assert.IsNotNull(deserializedNode); - var rebuiltExpression = AcExpressionRebuilder.FromNode(deserializedNode); + var rebuiltExpression = AcExpressionRebuilder.FromNode(deserializedNode); var compiledFilter = rebuiltExpression.Compile(); - var expensiveItem = new TestOrderItem { UnitPrice = 150m }; - var cheapItem = new TestOrderItem { UnitPrice = 50m }; + var expensiveItem = new TestOrderItem_All_True { UnitPrice = 150m }; + var cheapItem = new TestOrderItem_All_True { UnitPrice = 50m }; Assert.IsTrue(compiledFilter(expensiveItem), "Expensive item should pass filter"); Assert.IsFalse(compiledFilter(cheapItem), "Cheap item should fail filter"); @@ -212,7 +212,7 @@ public class AcExpressionNodeSerializationTests public void AcBinarySerializer_WithEnumValue_PreservesType() { // Arrange - Expression with enum comparison - System.Linq.Expressions.Expression> filterExpression = + System.Linq.Expressions.Expression> filterExpression = item => item.Status == TestStatus.Completed; var originalNode = AcExpressionConverter.ToNode(filterExpression); @@ -224,11 +224,11 @@ public class AcExpressionNodeSerializationTests // Assert Assert.IsNotNull(deserializedNode); - var rebuiltExpression = AcExpressionRebuilder.FromNode(deserializedNode); + var rebuiltExpression = AcExpressionRebuilder.FromNode(deserializedNode); var compiledFilter = rebuiltExpression.Compile(); - var completedItem = new TestOrderItem { Status = TestStatus.Completed }; - var pendingItem = new TestOrderItem { Status = TestStatus.Pending }; + var completedItem = new TestOrderItem_All_True { Status = TestStatus.Completed }; + var pendingItem = new TestOrderItem_All_True { Status = TestStatus.Pending }; Assert.IsTrue(compiledFilter(completedItem), "Completed item should pass filter"); Assert.IsFalse(compiledFilter(pendingItem), "Pending item should fail filter"); diff --git a/AyCode.Core.Tests/Serialization/AcJsonSerializerIIdReferenceTests.cs b/AyCode.Core.Tests/Serialization/AcJsonSerializerIIdReferenceTests.cs index b516cdd..5e122e2 100644 --- a/AyCode.Core.Tests/Serialization/AcJsonSerializerIIdReferenceTests.cs +++ b/AyCode.Core.Tests/Serialization/AcJsonSerializerIIdReferenceTests.cs @@ -46,25 +46,25 @@ public class AcJsonSerializerIIdReferenceTests public void SameInstance_Json_SerializeAndDeserialize() { // Arrange: SAME instance used 4 times - var sharedTag = new SharedTag { Id = 1, Name = "ImportantTag", Color = "#FF0000" }; + var sharedTag = new SharedTag_All_True { Id = 1, Name = "ImportantTag", Color = "#FF0000" }; - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", PrimaryTag = sharedTag, Items = [ - new TestOrderItem { Id = 1, ProductName = "Product-A", Tag = sharedTag }, - new TestOrderItem { Id = 2, ProductName = "Product-B", Tag = sharedTag }, - new TestOrderItem { Id = 3, ProductName = "Product-C", Tag = sharedTag } + new TestOrderItem_All_True { Id = 1, ProductName = "Product-A", Tag = sharedTag }, + new TestOrderItem_All_True { Id = 2, ProductName = "Product-B", Tag = sharedTag }, + new TestOrderItem_All_True { Id = 3, ProductName = "Product-C", Tag = sharedTag } ] }; // Act var json = order.ToJson(); Console.WriteLine(json); - var result = json.JsonTo(); + var result = json.JsonTo(); // Assert 1: JSON contains $ref markers (reference handling is active) var refCount = CountOccurrences(json, "{\"$ref\":\"1\"}"); @@ -118,43 +118,43 @@ public class AcJsonSerializerIIdReferenceTests { // Arrange: DIFFERENT instances but SAME IId.Id // CRITICAL: Multiple DIFFERENT TYPES all have Id=1 - must not be confused! - var order = new TestOrder + var order = new TestOrder_All_True { Id = 1, OrderNumber = "ORD-001", // All three types have Id=1 - tests (Type, Id) keying, not just Id - PrimaryTag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Owner = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" }, - Category = new SharedCategory { Id = 1, Name = "Category_Id1", SortOrder = 10 }, + PrimaryTag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Owner = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" }, + Category = new SharedCategory_All_True { Id = 1, Name = "Category_Id1", SortOrder = 10 }, Items = [ - new TestOrderItem + new TestOrderItem_All_True { Id = 1, ProductName = "Product-A", - Tag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Assignee = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" } + Tag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Assignee = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" } }, - new TestOrderItem + new TestOrderItem_All_True { Id = 2, ProductName = "Product-B", - Tag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Assignee = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" } + Tag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Assignee = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" } }, - new TestOrderItem + new TestOrderItem_All_True { Id = 3, ProductName = "Product-C", - Tag = new SharedTag { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, - Assignee = new SharedUser { Id = 1, Username = "User_Id1", Email = "user1@test.com" } + Tag = new SharedTag_All_True { Id = 1, Name = "Tag_Id1", Color = "#FF0000" }, + Assignee = new SharedUser_All_True { Id = 1, Username = "User_Id1", Email = "user1@test.com" } } ] }; // Act var json = order.ToJson(); - var result = json.JsonTo(); + var result = json.JsonTo(); // Assert 1: Check if $ref is used (IId-based deduplication active) var refCount = CountOccurrences(json, "\"$ref\""); @@ -208,11 +208,11 @@ public class AcJsonSerializerIIdReferenceTests // Assert 3: Reference identity - same TYPE with same Id should be same reference // Tags with Id=1 should all be same reference Assert.AreSame(result.PrimaryTag, result.Items[0].Tag, - "CRITICAL: Item[0].Tag should be same reference as PrimaryTag (same SharedTag.Id=1)"); + "CRITICAL: Item[0].Tag should be same reference as PrimaryTag (same SharedTag_All_True.Id=1)"); Assert.AreSame(result.PrimaryTag, result.Items[1].Tag, - "CRITICAL: Item[1].Tag should be same reference as PrimaryTag (same SharedTag.Id=1)"); + "CRITICAL: Item[1].Tag should be same reference as PrimaryTag (same SharedTag_All_True.Id=1)"); Assert.AreSame(result.PrimaryTag, result.Items[2].Tag, - "CRITICAL: Item[2].Tag should be same reference as PrimaryTag (same SharedTag.Id=1)"); + "CRITICAL: Item[2].Tag should be same reference as PrimaryTag (same SharedTag_All_True.Id=1)"); // Users with Id=1 should all be same reference Assert.AreSame(result.Owner, result.Items[0].Assignee, @@ -238,36 +238,36 @@ public class AcJsonSerializerIIdReferenceTests public void DifferentInstances_SameIId_SmallerJsonWithDataIntegrity() { // Arrange: 10 different instances with SAME IId - var orderWithSameIId = new TestOrder + var orderWithSameIId = new TestOrder_All_True { Id = 1, OrderNumber = "SAME-IID", - Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem + Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem_All_True { Id = i, ProductName = $"Product-{i}", - Assignee = new SharedUser { Id = 1, Username = "shared_user_name", Email = "shared@test.com" } + Assignee = new SharedUser_All_True { Id = 1, Username = "shared_user_name", Email = "shared@test.com" } }).ToList() }; // Arrange: 10 different instances with DIFFERENT IIds - var orderWithDifferentIIds = new TestOrder + var orderWithDifferentIIds = new TestOrder_All_True { Id = 1, OrderNumber = "DIFF-IID", - Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem + Items = Enumerable.Range(1, 10).Select(i => new TestOrderItem_All_True { Id = i, ProductName = $"Product-{i}", - Assignee = new SharedUser { Id = i * 100, Username = "unique_user_name", Email = "unique@test.com" } + Assignee = new SharedUser_All_True { Id = i * 100, Username = "unique_user_name", Email = "unique@test.com" } }).ToList() }; // Act var sameIIdJson = orderWithSameIId.ToJson(); var diffIIdJson = orderWithDifferentIIds.ToJson(); - var sameIIdResult = sameIIdJson.JsonTo(); - var diffIIdResult = diffIIdJson.JsonTo(); + var sameIIdResult = sameIIdJson.JsonTo(); + var diffIIdResult = diffIIdJson.JsonTo(); // Assert 1: Size comparison Console.WriteLine($"Same IId JSON size: {sameIIdJson.Length} chars"); @@ -416,7 +416,7 @@ public class AcJsonSerializerIIdReferenceTests [TestMethod] public void SharedCategory_DataIntegrity() { - var categories = new List + var categories = new List { new() { Id = 1, Name = "Category1", SortOrder = 1, IsDefault = true }, new() { Id = 2, Name = "Category2", SortOrder = 2, ParentCategoryId = 1 }, @@ -424,7 +424,7 @@ public class AcJsonSerializerIIdReferenceTests }; var json = categories.ToJson(); - var result = json.JsonTo>(); + var result = json.JsonTo>(); Assert.IsNotNull(result); Assert.AreEqual(3, result.Count); diff --git a/AyCode.Core.Tests/Serialization/ChainReferenceDebugTest.cs b/AyCode.Core.Tests/Serialization/ChainReferenceDebugTest.cs index 884f85c..2294675 100644 --- a/AyCode.Core.Tests/Serialization/ChainReferenceDebugTest.cs +++ b/AyCode.Core.Tests/Serialization/ChainReferenceDebugTest.cs @@ -13,7 +13,7 @@ public class ChainReferenceDebugTest // Test ChainReferenceTracker directly var tracker = new AcSerializerCommon.ChainReferenceTracker(); - var category = new SharedCategory { Id = 100, Name = "TestCategory" }; + var category = new SharedCategory_All_True { Id = 100, Name = "TestCategory" }; // Register using reflection (like ThenPopulate does) tracker.TryRegisterIIdObject(category); @@ -32,17 +32,17 @@ public class ChainReferenceDebugTest [TestMethod] public void DebugSimpleChainPopulate() { - var list1 = new List(); - var list2 = new List(); + var list1 = new List(); + var list2 = new List(); - var serverData = new List + var serverData = new List { new() { Id = 1, Name = "Cat1", SortOrder = 10 } }; var binary = serverData.ToBinary(); - using var chain = binary.BinaryToChain>(); + using var chain = binary.BinaryToChain>(); // First populate chain.ThenPopulate(list1); diff --git a/AyCode.Core.Tests/Serialization/GeneratedSerializerIntegrationTests.cs b/AyCode.Core.Tests/Serialization/GeneratedSerializerIntegrationTests.cs index b13c155..7cf5a02 100644 --- a/AyCode.Core.Tests/Serialization/GeneratedSerializerIntegrationTests.cs +++ b/AyCode.Core.Tests/Serialization/GeneratedSerializerIntegrationTests.cs @@ -103,7 +103,7 @@ public class GeneratedSerializerIntegrationTests public void GeneratedWriter_ComplexHierarchy_RoundTrip() { TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var order = TestDataFactory.CreateOrder( @@ -116,7 +116,7 @@ public class GeneratedSerializerIntegrationTests var options = AcBinarySerializerOptions.FastMode; var bytes = AcBinarySerializer.Serialize(order, options); - var deserialized = AcBinaryDeserializer.Deserialize(bytes, options); + var deserialized = AcBinaryDeserializer.Deserialize(bytes, options); Assert.IsNotNull(deserialized); Assert.AreEqual(order.Id, deserialized.Id); diff --git a/AyCode.Core.Tests/Serialization/QuickBenchmark.cs b/AyCode.Core.Tests/Serialization/QuickBenchmark.cs index 489620d..600b999 100644 --- a/AyCode.Core.Tests/Serialization/QuickBenchmark.cs +++ b/AyCode.Core.Tests/Serialization/QuickBenchmark.cs @@ -83,12 +83,12 @@ public class QuickBenchmark Console.WriteLine($"[WARN] Deserialize: AcBinary is {deserRatio:F2}x slower"); } - private static TestOrder CreatePopulateTarget(TestOrder source) + private static TestOrder_All_True CreatePopulateTarget(TestOrder_All_True source) { - var target = new TestOrder { Id = source.Id }; + var target = new TestOrder_All_True { Id = source.Id }; foreach (var item in source.Items) { - target.Items.Add(new TestOrderItem { Id = item.Id }); + target.Items.Add(new TestOrderItem_All_True { Id = item.Id }); } return target; } @@ -105,7 +105,7 @@ public class QuickBenchmark for (int i = 0; i < 10; i++) { var bytes = order.ToBinary(); - var result = bytes.BinaryTo(); + var result = bytes.BinaryTo(); } // Measure serialize @@ -121,10 +121,10 @@ public class QuickBenchmark // Measure deserialize sw.Restart(); - TestOrder? deserialized = null; + TestOrder_All_True? deserialized = null; for (int i = 0; i < iterations; i++) { - deserialized = serialized.BinaryTo(); + deserialized = serialized.BinaryTo(); } sw.Stop(); var deserializeMs = sw.Elapsed.TotalMilliseconds; @@ -143,7 +143,7 @@ public class QuickBenchmark sw.Restart(); for (int i = 0; i < iterations; i++) { - var _ = json.JsonTo(jsonOptions); + var _ = json.JsonTo(jsonOptions); } sw.Stop(); var jsonDeserializeMs = sw.Elapsed.TotalMilliseconds; @@ -234,9 +234,9 @@ public class QuickBenchmark for (int i = 0; i < 20; i++) { var binBytes = AcBinarySerializer.Serialize(order, AcBinarySerializerOptions.Default); - var binResult = AcBinaryDeserializer.Deserialize(binBytes); + var binResult = AcBinaryDeserializer.Deserialize(binBytes); var msgBytes = MessagePackSerializer.Serialize(order, MsgPackOptions); - var msgResult = MessagePackSerializer.Deserialize(msgBytes, MsgPackOptions); + var msgResult = MessagePackSerializer.Deserialize(msgBytes, MsgPackOptions); } const int iterations = DefaultIterations; @@ -263,20 +263,20 @@ public class QuickBenchmark // === AcBinary Deserialize === sw.Restart(); - TestOrder? acBinaryResult = null; + TestOrder_All_True? acBinaryResult = null; for (int i = 0; i < iterations; i++) { - acBinaryResult = AcBinaryDeserializer.Deserialize(acBinaryData); + acBinaryResult = AcBinaryDeserializer.Deserialize(acBinaryData); } sw.Stop(); var acBinaryDeserMs = sw.Elapsed.TotalMilliseconds; // === MessagePack Deserialize === sw.Restart(); - TestOrder? msgPackResult = null; + TestOrder_All_True? msgPackResult = null; for (int i = 0; i < iterations; i++) { - msgPackResult = MessagePackSerializer.Deserialize(msgPackData, MsgPackOptions); + msgPackResult = MessagePackSerializer.Deserialize(msgPackData, MsgPackOptions); } sw.Stop(); var msgPackDeserMs = sw.Elapsed.TotalMilliseconds; @@ -382,7 +382,7 @@ public class QuickBenchmark public void GetAnalyzeStringInternCandidatesLog() { TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var sharedMeta = TestDataFactory.CreateMetadata("shared", withChild: true); @@ -413,7 +413,7 @@ public class QuickBenchmark { // Create test data with shared references TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var sharedMeta = TestDataFactory.CreateMetadata("shared", withChild: true); @@ -492,7 +492,7 @@ public class QuickBenchmark // Create test data with shared references TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var sharedMeta = TestDataFactory.CreateMetadata("shared", withChild: true); @@ -532,10 +532,10 @@ public class QuickBenchmark _ = MessagePackSerializer.Serialize(testOrder, MsgPackOptions); Console.WriteLine("acBinaryWithRef"); - _ = AcBinaryDeserializer.Deserialize(acBinaryWithRef); + _ = AcBinaryDeserializer.Deserialize(acBinaryWithRef); Console.WriteLine("acBinaryNoRef"); - _ = AcBinaryDeserializer.Deserialize(acBinaryNoRef); - _ = MessagePackSerializer.Deserialize(msgPackData, MsgPackOptions); + _ = AcBinaryDeserializer.Deserialize(acBinaryNoRef); + _ = MessagePackSerializer.Deserialize(msgPackData, MsgPackOptions); } // Wait for tiered JIT background compilation to complete @@ -573,19 +573,19 @@ public class QuickBenchmark // === Deserialize WithRef === sw.Restart(); for (int i = 0; i < DefaultIterations; i++) - _ = AcBinaryDeserializer.Deserialize(acBinaryWithRef); + _ = AcBinaryDeserializer.Deserialize(acBinaryWithRef); var acWithRefDeserMs = sw.Elapsed.TotalMilliseconds; // === Deserialize NoRef === sw.Restart(); for (int i = 0; i < DefaultIterations; i++) - _ = AcBinaryDeserializer.Deserialize(acBinaryNoRef); + _ = AcBinaryDeserializer.Deserialize(acBinaryNoRef); var acNoRefDeserMs = sw.Elapsed.TotalMilliseconds; // === MessagePack Deserialize === sw.Restart(); for (int i = 0; i < DefaultIterations; i++) - _ = MessagePackSerializer.Deserialize(msgPackData, MsgPackOptions); + _ = MessagePackSerializer.Deserialize(msgPackData, MsgPackOptions); var msgPackDeserMs = sw.Elapsed.TotalMilliseconds; // === Populate (AcBinary only) === @@ -632,7 +632,7 @@ public class QuickBenchmark // Create test data WITH shared references (to show WithRef advantage) TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var sharedMeta = TestDataFactory.CreateMetadata("shared", withChild: true); @@ -685,13 +685,13 @@ public class QuickBenchmark // Deserialize WithRef sw.Restart(); for (int i = 0; i < DefaultIterations; i++) - _ = AcBinaryDeserializer.Deserialize(withRefData); + _ = AcBinaryDeserializer.Deserialize(withRefData); var withRefDeserMs = sw.Elapsed.TotalMilliseconds; // Deserialize NoRef sw.Restart(); for (int i = 0; i < DefaultIterations; i++) - _ = AcBinaryDeserializer.Deserialize(noRefData); + _ = AcBinaryDeserializer.Deserialize(noRefData); var noRefDeserMs = sw.Elapsed.TotalMilliseconds; PrintBanner("PERFORMANCE COMPARISON (ms)"); @@ -709,8 +709,8 @@ public class QuickBenchmark } // Verify correctness - var resultWithRef = AcBinaryDeserializer.Deserialize(withRefData); - var resultNoRef = AcBinaryDeserializer.Deserialize(noRefData); + var resultWithRef = AcBinaryDeserializer.Deserialize(withRefData); + var resultNoRef = AcBinaryDeserializer.Deserialize(noRefData); Assert.IsNotNull(resultWithRef); Assert.IsNotNull(resultNoRef); Assert.AreEqual(testOrder.Id, resultWithRef.Id); @@ -755,7 +755,7 @@ public class QuickBenchmark // Deserialize (creates new object) sw.Restart(); for (int i = 0; i < DefaultIterations; i++) - _ = AcBinaryDeserializer.Deserialize(binaryData); + _ = AcBinaryDeserializer.Deserialize(binaryData); var deserializeMs = sw.Elapsed.TotalMilliseconds; // Populate (reuses existing object) diff --git a/AyCode.Core.Tests/TestModels/BenchmarkTestDataProvider.cs b/AyCode.Core.Tests/TestModels/BenchmarkTestDataProvider.cs index 1a829d5..6db1963 100644 --- a/AyCode.Core.Tests/TestModels/BenchmarkTestDataProvider.cs +++ b/AyCode.Core.Tests/TestModels/BenchmarkTestDataProvider.cs @@ -18,7 +18,7 @@ namespace AyCode.Core.Tests.TestModels; /// public static class CharsetSuffixes { - /// Empty suffix — short Hungarian baseline strings (e.g. "SharedTag") stay short, hitting + /// Empty suffix — short Hungarian baseline strings (e.g. "SharedTag_All_True") stay short, hitting /// the FixStr fast-path. Stress-test for FixStr / short-string code paths. Note: the baseline /// property values remain Hungarian; only the suffix is empty. Despite the "FixAscii" name, this /// option does NOT change baseline values to ASCII — it suppresses the suffix that would otherwise @@ -82,7 +82,7 @@ public static class BenchmarkTestDataProvider { if (resetId) TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var order = TestDataFactory.CreateOrder( @@ -104,11 +104,11 @@ public static class BenchmarkTestDataProvider { if (resetId) TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); var sharedMeta = TestDataFactory.CreateMetadata("shared", withChild: true); - var sharedPreferences = new UserPreferences + var sharedPreferences = new UserPreferences_All_True { Theme = "dark", Language = "hungarian", @@ -138,10 +138,10 @@ public static class BenchmarkTestDataProvider { if (resetId) TestDataFactory.ResetIdCounter(); - var sharedTag = TestDataFactory.CreateTag("SharedTag"); + var sharedTag = TestDataFactory.CreateTag("SharedTag_All_True"); var sharedUser = TestDataFactory.CreateUser("shareduser"); - var sharedPreferences = new UserPreferences + var sharedPreferences = new UserPreferences_All_True { Theme = "light", Language = "german", @@ -173,7 +173,7 @@ public static class BenchmarkTestDataProvider var sharedTag = TestDataFactory.CreateTag("RepeatedTag"); var sharedUser = TestDataFactory.CreateUser("repeateduser"); - var sharedPreferences = new UserPreferences + var sharedPreferences = new UserPreferences_All_True { Theme = "dark", Language = "hungarian", @@ -223,7 +223,7 @@ public static class BenchmarkTestDataProvider var sharedUser = TestDataFactory.CreateUser("deepuser"); var sharedCategory = TestDataFactory.CreateCategory("DeepCategory"); - var sharedPreferences = new UserPreferences + var sharedPreferences = new UserPreferences_All_True { Theme = "light", Language = "french", @@ -249,7 +249,7 @@ public static class BenchmarkTestDataProvider return new TestDataSet("Deep Nested (2x4x4x8)", order, iidRefPercent: 20); } - private static void ClearDeepLevelRefs(TestOrder order) + private static void ClearDeepLevelRefs(TestOrder_All_True order) { // Keep shared IId refs at the pallet level (Tag + Inspector) — these contribute the bulk of // the ~20% IId-ref share that the test data targets. Only Category is cleared at this level @@ -338,10 +338,10 @@ public static class BenchmarkTestDataProvider } } -public sealed class TestDataSet +public class TestDataSet { public string Name { get; } - public TestOrder Order { get; } + public TOrder Order { get; } /// /// Percentage of IId shared references in the data (0-100). @@ -349,7 +349,7 @@ public sealed class TestDataSet /// public int IIdRefPercent { get; } - public TestDataSet(string name, TestOrder order, int iidRefPercent = 0) + public TestDataSet(string name, TOrder order, int iidRefPercent = 0) { Name = name; Order = order; @@ -365,3 +365,11 @@ public sealed class TestDataSet ? $"{Name} [{IIdRefPercent}% IId refs]" : Name; } + +public sealed class TestDataSet : TestDataSet +{ + public TestDataSet(string name, TestOrder_All_True order, int iidRefPercent = 0) + : base(name, order, iidRefPercent) + { + } +} diff --git a/AyCode.Core.Tests/TestModels/SharedTestBaseModels.cs b/AyCode.Core.Tests/TestModels/SharedTestBaseModels.cs new file mode 100644 index 0000000..091b2ec --- /dev/null +++ b/AyCode.Core.Tests/TestModels/SharedTestBaseModels.cs @@ -0,0 +1,303 @@ +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 Reference Base Types + +public abstract class SharedTagBase : IId +{ + [Key(0)] + public int Id { get; set; } + [Key(1)] + public string Name { get; set; } = ""; + [AcStringIntern(true)] + [Key(2)] + public string Color { get; set; } = "#000000"; + [Key(3)] + public int Priority { get; set; } + [Key(4)] + public bool IsActive { get; set; } = true; + [Key(5)] + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + [Key(6)] + public string? Description { get; set; } +} + +public abstract class SharedCategoryBase : IId +{ + [Key(0)] + public int Id { get; set; } + [Key(1)] + public string Name { get; set; } = ""; + [Key(2)] + public string? Description { get; set; } + [Key(3)] + public int SortOrder { get; set; } + [Key(4)] + public bool IsDefault { get; set; } + [Key(5)] + public int? ParentCategoryId { get; set; } + [Key(6)] + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + [Key(7)] + public DateTime? UpdatedAt { get; set; } +} + +public abstract class SharedUserBase : IId +{ + [Key(0)] + public int Id { get; set; } + [Key(1)] + public string Username { get; set; } = ""; + [Key(2)] + public string Email { get; set; } = ""; + [Key(3)] + public string FirstName { get; set; } = ""; + [Key(4)] + public string LastName { get; set; } = ""; + [Key(5)] + public bool IsActive { get; set; } = true; + [Key(6)] + public TestUserRole Role { get; set; } = TestUserRole.User; + [Key(7)] + public DateTime? LastLoginAt { get; set; } + [Key(8)] + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + [Key(9)] + public UserPreferences_All_True? Preferences { get; set; } +} + +public abstract class UserPreferencesBase +{ + [AcStringIntern(true)] + [Key(0)] + public string Theme { get; set; } = "light"; + [AcStringIntern(true)] + [Key(1)] + public string Language { get; set; } = "en-US"; + [Key(2)] + public bool NotificationsEnabled { get; set; } = true; + [AcStringIntern(true)] + [Key(3)] + public string? EmailDigestFrequency { get; set; } +} + +public abstract class MetadataInfoBase +{ + [AcStringIntern(true)] + [Key(0)] + public string Key { get; set; } = ""; + [AcStringIntern(true)] + [Key(1)] + public string Value { get; set; } = ""; + [Key(2)] + public DateTime Timestamp { get; set; } = DateTime.UtcNow; + + [Key(3)] + public MetadataInfo_All_True? ChildMetadata { get; set; } +} + +#endregion + +#region Order Hierarchy Base Types + +public abstract class TestOrderBase : IId +{ + [Key(0)] + public int Id { get; set; } + + [Key(1)] + public string OrderNumber { get; set; } = ""; + + [Key(2)] + public TestStatus Status { get; set; } = TestStatus.Pending; + + [Key(3)] + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + [Key(4)] + public DateTime? PaidDateUtc { get; set; } + + [Key(5)] + public decimal TotalAmount { get; set; } + + [Key(6)] + public List Items { get; set; } = []; + + [Key(7)] + public SharedTag_All_True? PrimaryTag { get; set; } + + [Key(8)] + public SharedTag_All_True? SecondaryTag { get; set; } + + [Key(9)] + public SharedUser_All_True? Owner { get; set; } + + [Key(10)] + public SharedCategory_All_True? Category { get; set; } + + [Key(11)] + public List Tags { get; set; } = []; + + [Key(12)] + public MetadataInfo_All_True? OrderMetadata { get; set; } + + [Key(13)] + public MetadataInfo_All_True? AuditMetadata { get; set; } + + [Key(14)] + public List MetadataList { get; set; } = []; + + [JsonNoMergeCollection] + [Key(15)] + public List NoMergeItems { get; set; } = []; + + [MemoryPackIgnore] + [JsonIgnore] + [IgnoreMember] + [BsonIgnore] + public object? Parent { get; set; } +} + +public abstract class TestOrderItemBase : IId +{ + [Key(0)] + public int Id { get; set; } + + [AcStringIntern(true)] + [Key(1)] + public string ProductName { get; set; } = ""; + + [Key(2)] + public int Quantity { get; set; } + + [Key(3)] + public decimal UnitPrice { get; set; } + + [Key(4)] + public TestStatus Status { get; set; } = TestStatus.Pending; + + [Key(5)] + public List Pallets { get; set; } = []; + + [Key(6)] + public SharedTag_All_True? Tag { get; set; } + + [Key(7)] + public SharedUser_All_True? Assignee { get; set; } + + [Key(8)] + public MetadataInfo_All_True? ItemMetadata { get; set; } + + [MemoryPackIgnore] + [JsonIgnore] + [IgnoreMember] + [BsonIgnore] + public TestOrder_All_True? ParentOrder { get; set; } +} + +public abstract class TestPalletBase : IId +{ + [Key(0)] + public int Id { get; set; } + + [Key(1)] + public string PalletCode { get; set; } = ""; + + [Key(2)] + public int TrayCount { get; set; } + + [Key(3)] + public TestStatus Status { get; set; } = TestStatus.Pending; + + [Key(4)] + public double Weight { get; set; } + + [Key(5)] + public List Measurements { get; set; } = []; + + [Key(6)] + public SharedTag_All_True? Tag { get; set; } + + [Key(7)] + public SharedUser_All_True? Inspector { get; set; } + + [Key(8)] + public SharedCategory_All_True? Category { get; set; } + + [Key(9)] + public MetadataInfo_All_True? PalletMetadata { get; set; } + + [MemoryPackIgnore] + [JsonIgnore] + [IgnoreMember] + [BsonIgnore] + public TestOrderItem_All_True? ParentItem { get; set; } +} + +public abstract class TestMeasurementBase : IId +{ + [Key(0)] + public int Id { get; set; } + + [Key(1)] + public string Name { get; set; } = ""; + + [Key(2)] + public double TotalWeight { get; set; } + + [Key(3)] + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + [Key(4)] + public List Points { get; set; } = []; + + [Key(5)] + public SharedTag_All_True? Tag { get; set; } + + [Key(6)] + public SharedUser_All_True? Operator { get; set; } + + [MemoryPackIgnore] + [JsonIgnore] + [IgnoreMember] + [BsonIgnore] + public TestPallet_All_True? ParentPallet { get; set; } +} + +public abstract class TestMeasurementPointBase : IId +{ + [Key(0)] + public int Id { get; set; } + + [Key(1)] + public string Label { get; set; } = ""; + + [Key(2)] + public double Value { get; set; } + + [Key(3)] + public DateTime MeasuredAt { get; set; } = DateTime.UtcNow; + + [Key(4)] + public SharedTag_All_True? Tag { get; set; } + + [Key(5)] + public SharedUser_All_True? Verifier { get; set; } + + [MemoryPackIgnore] + [JsonIgnore] + [IgnoreMember] + [BsonIgnore] + public TestMeasurement_All_True? ParentMeasurement { get; set; } +} + +#endregion diff --git a/AyCode.Core.Tests/TestModels/SharedTestModels.cs b/AyCode.Core.Tests/TestModels/SharedTestModels.cs index 78dd3e7..87c61b6 100644 --- a/AyCode.Core.Tests/TestModels/SharedTestModels.cs +++ b/AyCode.Core.Tests/TestModels/SharedTestModels.cs @@ -48,208 +48,12 @@ public enum TestUserRole #endregion -#region Shared Reference Types (IId-based for $id/$ref testing) - -/// -/// Shared tag/label - used across multiple entities for cross-reference testing. -/// Implements IId<int> for semantic $id/$ref serialization. -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class SharedTag : IId -{ - [Key(0)] - public int Id { get; set; } - [Key(1)] - public string Name { get; set; } = ""; - [AcStringIntern(true)] - [Key(2)] - public string Color { get; set; } = "#000000"; - [Key(3)] - public int Priority { get; set; } - [Key(4)] - public bool IsActive { get; set; } = true; - [Key(5)] - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Key(6)] - public string? Description { get; set; } -} - -/// -/// Shared category - for hierarchical cross-reference testing. -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class SharedCategory : IId -{ - [Key(0)] - public int Id { get; set; } - [Key(1)] - public string Name { get; set; } = ""; - [Key(2)] - public string? Description { get; set; } - [Key(3)] - public int SortOrder { get; set; } - [Key(4)] - public bool IsDefault { get; set; } - [Key(5)] - public int? ParentCategoryId { get; set; } - [Key(6)] - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Key(7)] - public DateTime? UpdatedAt { get; set; } -} - -/// -/// Shared user reference - appears in many places to test $ref deduplication. -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class SharedUser : IId -{ - [Key(0)] - public int Id { get; set; } - [Key(1)] - public string Username { get; set; } = ""; - [Key(2)] - public string Email { get; set; } = ""; - [Key(3)] - public string FirstName { get; set; } = ""; - [Key(4)] - public string LastName { get; set; } = ""; - [Key(5)] - public bool IsActive { get; set; } = true; - [Key(6)] - public TestUserRole Role { get; set; } = TestUserRole.User; - [Key(7)] - public DateTime? LastLoginAt { get; set; } - [Key(8)] - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Key(9)] - public UserPreferences? Preferences { get; set; } -} - -/// -/// User preferences - non-IId nested object -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class UserPreferences -{ - [AcStringIntern(true)] - [Key(0)] - public string Theme { get; set; } = "light"; - [AcStringIntern(true)] - [Key(1)] - public string Language { get; set; } = "en-US"; - [Key(2)] - public bool NotificationsEnabled { get; set; } = true; - [AcStringIntern(true)] - [Key(3)] - public string? EmailDigestFrequency { get; set; } -} - -#endregion - -#region Non-IId Metadata (Newtonsoft numeric $id/$ref testing) - -/// -/// Non-IId metadata class - uses Newtonsoft PreserveReferencesHandling (numeric $id/$ref). -/// Does NOT implement IId, so uses standard Newtonsoft reference tracking. -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class MetadataInfo -{ - [AcStringIntern(true)] - [Key(0)] - public string Key { get; set; } = ""; - [AcStringIntern(true)] - [Key(1)] - public string Value { get; set; } = ""; - [Key(2)] - public DateTime Timestamp { get; set; } = DateTime.UtcNow; - - /// - /// Nested metadata for deep Newtonsoft reference testing - /// - [Key(3)] - public MetadataInfo? ChildMetadata { get; set; } -} - -#endregion - #region 5-Level Test Hierarchy (Order -> Item -> Pallet -> Measurement -> Point) /// /// Level 1: Main order - root of the hierarchy /// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class TestOrder : IId -{ - [Key(0)] - public int Id { get; set; } - [Key(1)] - public string OrderNumber { get; set; } = ""; - [Key(2)] - public TestStatus Status { get; set; } = TestStatus.Pending; - [Key(3)] - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Key(4)] - public DateTime? PaidDateUtc { get; set; } - [Key(5)] - public decimal TotalAmount { get; set; } - - // Level 2 collection - [Key(6)] - public List Items { get; set; } = []; - - // Shared reference properties (for $id/$ref testing) - [Key(7)] - public SharedTag? PrimaryTag { get; set; } - [Key(8)] - public SharedTag? SecondaryTag { get; set; } - [Key(9)] - public SharedUser? Owner { get; set; } - [Key(10)] - public SharedCategory? Category { get; set; } - - // Collection of shared references - [Key(11)] - public List Tags { get; set; } = []; - - // Non-IId metadata (for Newtonsoft $ref testing) - [Key(12)] - public MetadataInfo? OrderMetadata { get; set; } - [Key(13)] - public MetadataInfo? AuditMetadata { get; set; } - [Key(14)] - public List MetadataList { get; set; } = []; - - // NoMerge collection for testing replace behavior - [JsonNoMergeCollection] - [Key(15)] - public List NoMergeItems { get; set; } = []; - - // Parent reference - ignored by all serializers to prevent circular references - [MemoryPackIgnore] - [JsonIgnore] - [IgnoreMember] - [BsonIgnore] - public object? Parent { get; set; } -} - -/// -/// Level 1: Main order - root of the hierarchy -/// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public partial class TestOrder_Circ_Ref : IId { public int Id { get; set; } @@ -263,16 +67,16 @@ public partial class TestOrder_Circ_Ref : IId public List Items { get; set; } = []; // Shared reference properties (for $id/$ref testing) - public SharedTag? PrimaryTag { get; set; } - public SharedTag? SecondaryTag { get; set; } - public SharedUser? Owner { get; set; } - public SharedCategory? Category { get; set; } - + 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? OrderMetadata { get; set; } - public MetadataInfo? AuditMetadata { get; set; } - public List MetadataList { get; set; } = []; + 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] @@ -283,47 +87,7 @@ public partial class TestOrder_Circ_Ref : IId /// /// Level 2: Order item with pallets /// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class TestOrderItem : IId -{ - [Key(0)] - public int Id { get; set; } - [AcStringIntern(true)] - [Key(1)] - public string ProductName { get; set; } = ""; - [Key(2)] - public int Quantity { get; set; } - [Key(3)] - public decimal UnitPrice { get; set; } - [Key(4)] - public TestStatus Status { get; set; } = TestStatus.Pending; - - // Level 3 collection - [Key(5)] - public List Pallets { get; set; } = []; - - // Shared references - [Key(6)] - public SharedTag? Tag { get; set; } - [Key(7)] - public SharedUser? Assignee { get; set; } - [Key(8)] - public MetadataInfo? ItemMetadata { get; set; } - - // Parent reference - ignored by all serializers to prevent circular references - [MemoryPackIgnore] - [JsonIgnore] - [IgnoreMember] - [BsonIgnore] - public TestOrder? ParentOrder { get; set; } -} - -/// -/// Level 2: Order item with pallets -/// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public partial class TestOrderItem_Circ_Ref : IId { public int Id { get; set; } @@ -334,124 +98,15 @@ public partial class TestOrderItem_Circ_Ref : IId public TestStatus Status { get; set; } = TestStatus.Pending; // Level 3 collection - public List Pallets { get; set; } = []; + public List Pallets { get; set; } = []; // Shared references - public SharedTag? Tag { get; set; } - public SharedUser? Assignee { get; set; } - public MetadataInfo? ItemMetadata { get; set; } + 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; } } -/// -/// Level 3: Pallet containing measurements -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class TestPallet : IId -{ - [Key(0)] - public int Id { get; set; } - [Key(1)] - public string PalletCode { get; set; } = ""; - [Key(2)] - public int TrayCount { get; set; } - [Key(3)] - public TestStatus Status { get; set; } = TestStatus.Pending; - [Key(4)] - public double Weight { get; set; } - - // Level 4 collection - [Key(5)] - public List Measurements { get; set; } = []; - - // Shared IId references for better reference testing - [Key(6)] - public SharedTag? Tag { get; set; } - [Key(7)] - public SharedUser? Inspector { get; set; } - [Key(8)] - public SharedCategory? Category { get; set; } - - // Non-IId shared references - [Key(9)] - public MetadataInfo? PalletMetadata { get; set; } - - // Parent reference - ignored by all serializers to prevent circular references - [MemoryPackIgnore] - [JsonIgnore] - [IgnoreMember] - [BsonIgnore] - public TestOrderItem? ParentItem { get; set; } -} - -/// -/// Level 4: Measurement with multiple points -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class TestMeasurement : IId -{ - [Key(0)] - public int Id { get; set; } - [Key(1)] - public string Name { get; set; } = ""; - [Key(2)] - public double TotalWeight { get; set; } - [Key(3)] - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - - // Level 5 collection - [Key(4)] - public List Points { get; set; } = []; - - // Shared IId references for better reference testing - [Key(5)] - public SharedTag? Tag { get; set; } - [Key(6)] - public SharedUser? Operator { get; set; } - - // Parent reference - ignored by all serializers to prevent circular references - [MemoryPackIgnore] - [JsonIgnore] - [IgnoreMember] - [BsonIgnore] - public TestPallet? ParentPallet { get; set; } -} - -/// -/// Level 5: Deepest level - measurement point -/// -[MemoryPackable] -[AcBinarySerializable(false)] -[MessagePackObject] -public partial class TestMeasurementPoint : IId -{ - [Key(0)] - public int Id { get; set; } - [Key(1)] - public string Label { get; set; } = ""; - [Key(2)] - public double Value { get; set; } - [Key(3)] - public DateTime MeasuredAt { get; set; } = DateTime.UtcNow; - - // Shared IId reference for better reference testing (many points share same tag/user) - [Key(4)] - public SharedTag? Tag { get; set; } - [Key(5)] - public SharedUser? Verifier { get; set; } - - // Parent reference - ignored by all serializers to prevent circular references - [MemoryPackIgnore] - [JsonIgnore] - [IgnoreMember] - [BsonIgnore] - public TestMeasurement? ParentMeasurement { get; set; } -} - #endregion #region Guid-based IId types @@ -459,7 +114,7 @@ public partial class TestMeasurementPoint : IId /// /// Order with Guid Id - for testing Guid-based IId /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class TestGuidOrder : IId { public Guid Id { get; set; } @@ -471,7 +126,7 @@ public class TestGuidOrder : IId /// /// Item with Guid Id /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class TestGuidItem : IId { public Guid Id { get; set; } @@ -487,7 +142,7 @@ public class TestGuidItem : IId /// Simulates NopCommerce GenericAttribute - stores key-value pairs where DateTime values /// are stored as strings in the database. /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class TestGenericAttribute { public int Id { get; set; } @@ -499,7 +154,7 @@ public class TestGenericAttribute /// 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(false)] +[AcBinarySerializable(true)] public class TestDtoWithGenericAttributes : IId { public int Id { get; set; } @@ -510,12 +165,12 @@ public class TestDtoWithGenericAttributes : IId /// /// Order with nullable collections for null vs empty testing /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class TestOrderWithNullableCollections { public int Id { get; set; } public string OrderNumber { get; set; } = ""; - public List? Items { get; set; } + public List? Items { get; set; } public List? Tags { get; set; } } @@ -523,7 +178,7 @@ public class TestOrderWithNullableCollections /// Class with all primitive types for WASM/serialization testing /// [MemoryPackable] -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public partial class PrimitiveTestClass { public int IntValue { get; set; } @@ -546,7 +201,7 @@ public partial class PrimitiveTestClass /// Class with extended primitive types for full serializer coverage. /// Includes DateTimeOffset, TimeSpan, Dictionary, null properties. /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class ExtendedPrimitiveTestClass { public int Id { get; set; } @@ -567,16 +222,16 @@ public class ExtendedPrimitiveTestClass // Nullable properties that will be null public string? NullString { get; set; } - public TestOrderItem? NullObject { get; set; } + public TestOrderItem_All_True? NullObject { get; set; } // Nested object for complex serialization - public SharedTag? Tag { get; set; } + public SharedTag_All_True? Tag { get; set; } } /// /// Class with array of objects containing null items for WriteNull coverage /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class ObjectWithNullItems { public int Id { get; set; } @@ -591,7 +246,7 @@ public class ObjectWithNullItems /// "Server-side" DTO with extra properties that the "client" doesn't know about. /// Used to test SkipValue functionality when deserializing unknown properties. /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class ServerCustomerDto : IId { public int Id { get; set; } @@ -624,7 +279,7 @@ public class ServerCustomerDto : IId /// the deserializer must skip unknown properties correctly /// while still maintaining string intern table consistency. /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class ClientCustomerDto : IId { public int Id { get; set; } @@ -638,7 +293,7 @@ public class ClientCustomerDto : IId /// Server DTO with nested objects that client doesn't know about. /// Tests skipping complex nested structures. /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class ServerOrderWithExtras : IId { public int Id { get; set; } @@ -659,7 +314,7 @@ public class ServerOrderWithExtras : IId /// /// Client version of the order - doesn't have Customer/RelatedCustomers properties. /// -[AcBinarySerializable(false)] +[AcBinarySerializable(true)] public class ClientOrderSimple : IId { public int Id { get; set; } diff --git a/AyCode.Core.Tests/TestModels/SharedTestOrderModels.cs b/AyCode.Core.Tests/TestModels/SharedTestOrderModels.cs new file mode 100644 index 0000000..af0b947 --- /dev/null +++ b/AyCode.Core.Tests/TestModels/SharedTestOrderModels.cs @@ -0,0 +1,162 @@ +using AyCode.Core.Extensions; +using AyCode.Core.Serializers.Attributes; +using AyCode.Core.Serializers.Binaries; +using MemoryPack; +using MessagePack; + +namespace AyCode.Core.Tests.TestModels; + +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class SharedTag_All_True : SharedTagBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class SharedTag_All_False : SharedTagBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class SharedCategory_All_True : SharedCategoryBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class SharedCategory_All_False : SharedCategoryBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class SharedUser_All_True : SharedUserBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class SharedUser_All_False : SharedUserBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class UserPreferences_All_True : UserPreferencesBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class UserPreferences_All_False : UserPreferencesBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class MetadataInfo_All_True : MetadataInfoBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class MetadataInfo_All_False : MetadataInfoBase +{ +} + +/// +/// Level 1: Main order - root of the hierarchy +/// +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class TestOrder_All_True : TestOrderBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class TestOrder_All_False : TestOrderBase +{ +} + +/// +/// Level 2: Order item with pallets +/// +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class TestOrderItem_All_True : TestOrderItemBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class TestOrderItem_All_False : TestOrderItemBase +{ +} + +/// +/// Level 3: Pallet containing measurements +/// +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class TestPallet_All_True : TestPalletBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class TestPallet_All_False : TestPalletBase +{ +} + +/// +/// Level 4: Measurement with multiple points +/// +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class TestMeasurement_All_True : TestMeasurementBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class TestMeasurement_All_False : TestMeasurementBase +{ +} + +/// +/// Level 5: Deepest level - measurement point +/// +[MemoryPackable] +[AcBinarySerializable(true)] +[MessagePackObject] +public partial class TestMeasurementPoint_All_True : TestMeasurementPointBase +{ +} + +[MemoryPackable] +[AcBinarySerializable(false)] +[MessagePackObject] +public partial class TestMeasurementPoint_All_False : TestMeasurementPointBase +{ +} diff --git a/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs b/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs index f0963b1..c132a5d 100644 --- a/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs +++ b/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs @@ -236,8 +236,8 @@ public class SignalRBenchmarkData public byte[] MixedParamsMessage { get; } // Test data - public TestOrderItem TestOrderItem { get; } - public TestOrder TestOrder { get; } + public TestOrderItem_All_True TestOrderItem { get; } + public TestOrder_All_True TestOrder { get; } public int[] IntArray { get; } public Guid TestGuid { get; } @@ -246,7 +246,7 @@ public class SignalRBenchmarkData // Create test data TestGuid = Guid.NewGuid(); IntArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - TestOrderItem = new TestOrderItem + TestOrderItem = new TestOrderItem_All_True { Id = 42, ProductName = "Benchmark Product", diff --git a/AyCode.Core.Tests/TestModels/TestDataFactory.cs b/AyCode.Core.Tests/TestModels/TestDataFactory.cs index 31aaa4b..47889c0 100644 --- a/AyCode.Core.Tests/TestModels/TestDataFactory.cs +++ b/AyCode.Core.Tests/TestModels/TestDataFactory.cs @@ -27,10 +27,10 @@ public static class TestDataFactory /// /// Create a shared tag for cross-reference testing /// - public static SharedTag CreateTag(string? name = null, string? color = null) + public static SharedTag_All_True CreateTag(string? name = null, string? color = null) { var id = _idCounter++; - return new SharedTag + return new SharedTag_All_True { Id = id, Name = name ?? $"Címke-{id}", @@ -45,10 +45,10 @@ public static class TestDataFactory /// /// Create a shared category /// - public static SharedCategory CreateCategory(string? name = null, int? parentId = null) + public static SharedCategory_All_True CreateCategory(string? name = null, int? parentId = null) { var id = _idCounter++; - return new SharedCategory + return new SharedCategory_All_True { Id = id, Name = name ?? $"Kategória-{id}", @@ -64,10 +64,10 @@ public static class TestDataFactory /// /// Create a shared user for cross-reference testing /// - public static SharedUser CreateUser(string? username = null, TestUserRole role = TestUserRole.User) + public static SharedUser_All_True CreateUser(string? username = null, TestUserRole role = TestUserRole.User) { var id = _idCounter++; - return new SharedUser + return new SharedUser_All_True { Id = id, Username = username ?? $"felhasználó{id}", @@ -78,7 +78,7 @@ public static class TestDataFactory Role = role, LastLoginAt = DateTime.UtcNow.AddHours(-id), CreatedAt = DateTime.UtcNow.AddYears(-1), - Preferences = new UserPreferences + Preferences = new UserPreferences_All_True { Theme = id % 2 == 0 ? "sötét" : "világos", Language = "magyar", @@ -91,10 +91,10 @@ public static class TestDataFactory /// /// Create metadata info (non-IId) /// - public static MetadataInfo CreateMetadata(string? key = null, bool withChild = false) + public static MetadataInfo_All_True CreateMetadata(string? key = null, bool withChild = false) { var id = _idCounter++; - return new MetadataInfo + return new MetadataInfo_All_True { Key = key ?? $"Metaadat-{id}", Value = $"MetaÉrték-{id}", @@ -109,23 +109,23 @@ public static class TestDataFactory /// /// Create a deep order hierarchy with configurable depth. - /// Supports both IId-based (SharedTag, SharedUser, SharedCategory) and Non-IId (UserPreferences) shared references. + /// Supports both IId-based (SharedTag_All_True, SharedUser, SharedCategory_All_True) and Non-IId (UserPreferences_All_True) shared references. /// - public static TestOrder CreateOrder( + public static TestOrder_All_True CreateOrder( int itemCount = 2, int palletsPerItem = 2, int measurementsPerPallet = 2, int pointsPerMeasurement = 3, - SharedTag? sharedTag = null, - SharedUser? sharedUser = null, - MetadataInfo? sharedMetadata = null, - UserPreferences? sharedPreferences = null, - SharedCategory? sharedCategory = null) + SharedTag_All_True? sharedTag = null, + SharedUser_All_True? sharedUser = null, + MetadataInfo_All_True? sharedMetadata = null, + UserPreferences_All_True? sharedPreferences = null, + SharedCategory_All_True? sharedCategory = null) { // If sharedUser is provided but no sharedPreferences, use the user's preferences as shared sharedPreferences ??= sharedUser?.Preferences; - var order = new TestOrder + var order = new TestOrder_All_True { Id = _idCounter++, OrderNumber = $"Megrendelés-{_idCounter:D4}", @@ -167,18 +167,18 @@ public static class TestDataFactory /// Create an order item with pallets. /// Supports both IId-based and Non-IId shared references. /// - public static TestOrderItem CreateOrderItem( + public static TestOrderItem_All_True CreateOrderItem( int palletCount = 2, int measurementsPerPallet = 2, int pointsPerMeasurement = 3, - SharedTag? sharedTag = null, - SharedUser? sharedUser = null, - MetadataInfo? sharedMetadata = null, - UserPreferences? sharedPreferences = null, - SharedCategory? sharedCategory = null) + SharedTag_All_True? sharedTag = null, + SharedUser_All_True? sharedUser = null, + MetadataInfo_All_True? sharedMetadata = null, + UserPreferences_All_True? sharedPreferences = null, + SharedCategory_All_True? sharedCategory = null) { // Create assignee - if sharedUser provided, use it. Otherwise create new user with sharedPreferences - SharedUser? assignee = sharedUser; + SharedUser_All_True? assignee = sharedUser; if (assignee == null && sharedPreferences != null) { // Create a new user but with shared preferences (Non-IId ref testing) @@ -186,7 +186,7 @@ public static class TestDataFactory assignee.Preferences = sharedPreferences; } - var item = new TestOrderItem + var item = new TestOrderItem_All_True { Id = _idCounter++, ProductName = $"Termék-{_idCounter}", @@ -221,15 +221,15 @@ public static class TestDataFactory /// /// Create a pallet with measurements /// - public static TestPallet CreatePallet( + public static TestPallet_All_True CreatePallet( int measurementCount = 2, int pointsPerMeasurement = 3, - MetadataInfo? sharedMetadata = null, - SharedTag? sharedTag = null, - SharedUser? sharedInspector = null, - SharedCategory? sharedCategory = null) + MetadataInfo_All_True? sharedMetadata = null, + SharedTag_All_True? sharedTag = null, + SharedUser_All_True? sharedInspector = null, + SharedCategory_All_True? sharedCategory = null) { - var pallet = new TestPallet + var pallet = new TestPallet_All_True { Id = _idCounter++, PalletCode = $"Raklapkód-{_idCounter:D4}", @@ -255,12 +255,12 @@ public static class TestDataFactory /// /// Create a measurement with points /// - public static TestMeasurement CreateMeasurement( + public static TestMeasurement_All_True CreateMeasurement( int pointCount = 3, - SharedTag? sharedTag = null, - SharedUser? sharedOperator = null) + SharedTag_All_True? sharedTag = null, + SharedUser_All_True? sharedOperator = null) { - var measurement = new TestMeasurement + var measurement = new TestMeasurement_All_True { Id = _idCounter++, Name = $"Mérés-{_idCounter}", @@ -283,12 +283,12 @@ public static class TestDataFactory /// /// Create a measurement point /// - public static TestMeasurementPoint CreateMeasurementPoint( - SharedTag? sharedTag = null, - SharedUser? sharedVerifier = null) + public static TestMeasurementPoint_All_True CreateMeasurementPoint( + SharedTag_All_True? sharedTag = null, + SharedUser_All_True? sharedVerifier = null) { var id = _idCounter++; - return new TestMeasurementPoint + return new TestMeasurementPoint_All_True { Id = id, Label = $"MérőPont-{id}", @@ -307,7 +307,7 @@ public static class TestDataFactory /// Create a large graph for benchmarking with many cross-references. /// Creates approximately (itemCount * palletsPerItem * measurementsPerPallet * pointsPerMeasurement) objects. /// - public static TestOrder CreateBenchmarkOrder( + public static TestOrder_All_True CreateBenchmarkOrder( int itemCount = 5, int palletsPerItem = 4, int measurementsPerPallet = 3, @@ -320,7 +320,7 @@ public static class TestDataFactory var sharedUser = CreateUser("mérőfelhasználó", TestUserRole.Admin); var sharedMetadata = CreateMetadata("mérőteszt", withChild: true); - var order = new TestOrder + var order = new TestOrder_All_True { Id = _idCounter++, OrderNumber = $"MÉRŐTESZT-{_idCounter:D6}", @@ -338,7 +338,7 @@ public static class TestDataFactory for (int i = 0; i < itemCount; i++) { - var item = new TestOrderItem + var item = new TestOrderItem_All_True { Id = _idCounter++, ProductName = $"MérőTermék-{i}", @@ -353,7 +353,7 @@ public static class TestDataFactory for (int p = 0; p < palletsPerItem; p++) { - var pallet = new TestPallet + var pallet = new TestPallet_All_True { Id = _idCounter++, PalletCode = $"Raklapkód-{i}-{p}", @@ -366,7 +366,7 @@ public static class TestDataFactory for (int m = 0; m < measurementsPerPallet; m++) { - var measurement = new TestMeasurement + var measurement = new TestMeasurement_All_True { Id = _idCounter++, Name = $"Mérés-{i}-{p}-{m}", @@ -377,7 +377,7 @@ public static class TestDataFactory for (int pt = 0; pt < pointsPerMeasurement; pt++) { - var point = new TestMeasurementPoint + var point = new TestMeasurementPoint_All_True { Id = _idCounter++, Label = $"MérőPnt-{i}-{p}-{m}-{pt}", @@ -405,8 +405,8 @@ public static class TestDataFactory /// Pallets per item /// Measurements per pallet /// Points per measurement - /// Large TestOrder with many IId references - public static TestOrder CreateLargeScaleBenchmarkOrder( + /// Large TestOrder_All_True with many IId references + public static TestOrder_All_True CreateLargeScaleBenchmarkOrder( int rootItemCount = 500, int palletsPerItem = 3, int measurementsPerPallet = 3, @@ -420,7 +420,7 @@ public static class TestDataFactory var sharedMetadata = CreateMetadata("nagy-méretű", withChild: true); var sharedCategories = Enumerable.Range(1, 10).Select(i => CreateCategory($"Kategória-{i}")).ToList(); - var order = new TestOrder + var order = new TestOrder_All_True { Id = _idCounter++, OrderNumber = $"NAGYMÉRET-{_idCounter:D8}", @@ -438,7 +438,7 @@ public static class TestDataFactory for (int i = 0; i < rootItemCount; i++) { - var item = new TestOrderItem + var item = new TestOrderItem_All_True { Id = _idCounter++, ProductName = $"Termék-{i}", @@ -453,7 +453,7 @@ public static class TestDataFactory for (int p = 0; p < palletsPerItem; p++) { - var pallet = new TestPallet + var pallet = new TestPallet_All_True { Id = _idCounter++, PalletCode = $"Raklapkód-{i}-{p}", @@ -466,7 +466,7 @@ public static class TestDataFactory for (int m = 0; m < measurementsPerPallet; m++) { - var measurement = new TestMeasurement + var measurement = new TestMeasurement_All_True { Id = _idCounter++, Name = $"Mérés-{i}-{p}-{m}", @@ -477,7 +477,7 @@ public static class TestDataFactory for (int pt = 0; pt < pointsPerMeasurement; pt++) { - var point = new TestMeasurementPoint + var point = new TestMeasurementPoint_All_True { Id = _idCounter++, Label = $"MérőPnt-{i}-{p}-{m}-{pt}", diff --git a/AyCode.Services.Server.Tests/InvokeMethodExtensionTests.cs b/AyCode.Services.Server.Tests/InvokeMethodExtensionTests.cs index 73f4ef8..8f68cb6 100644 --- a/AyCode.Services.Server.Tests/InvokeMethodExtensionTests.cs +++ b/AyCode.Services.Server.Tests/InvokeMethodExtensionTests.cs @@ -37,13 +37,13 @@ public class InvokeMethodExtensionTests { var service = new TestSignalRService2(); var methodInfo = typeof(TestSignalRService2).GetMethod("HandleAsyncTestOrderItem")!; - var input = new TestOrderItem { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; + var input = new TestOrderItem_All_True { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; var result = methodInfo.InvokeMethod(service, input); - Assert.IsNotNull(result, "InvokeMethod should unwrap Task and return the result"); - Assert.IsInstanceOfType(result, typeof(TestOrderItem)); - var item = (TestOrderItem)result; + Assert.IsNotNull(result, "InvokeMethod should unwrap Task and return the result"); + Assert.IsInstanceOfType(result, typeof(TestOrderItem_All_True)); + var item = (TestOrderItem_All_True)result; Assert.AreEqual("Async: Widget", item.ProductName); Assert.AreEqual(15, item.Quantity); } @@ -81,13 +81,13 @@ public class InvokeMethodExtensionTests { var service = new TestSignalRService2(); var methodInfo = typeof(TestSignalRService2).GetMethod("HandleTaskFromResultTestOrderItem")!; - var input = new TestOrderItem { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; + var input = new TestOrderItem_All_True { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; var result = methodInfo.InvokeMethod(service, input); - Assert.IsNotNull(result, "InvokeMethod should unwrap Task.FromResult and return the result"); - Assert.IsInstanceOfType(result, typeof(TestOrderItem)); - var item = (TestOrderItem)result; + Assert.IsNotNull(result, "InvokeMethod should unwrap Task.FromResult and return the result"); + Assert.IsInstanceOfType(result, typeof(TestOrderItem_All_True)); + var item = (TestOrderItem_All_True)result; Assert.AreEqual("FromResult: Widget", item.ProductName); Assert.AreEqual(10, item.Quantity); // Doubled } diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRClientToHubTest.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRClientToHubTest.cs index b224a71..f1c4a52 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRClientToHubTest.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRClientToHubTest.cs @@ -165,7 +165,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Post_TestOrderItem_ReturnsProcessedItem() { - var item = new TestOrderItem { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10.50m }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10.50m }; var result = await _client.PostDataAsync(TestSignalRTags.TestOrderItemParam, item); @@ -181,7 +181,7 @@ public abstract class SignalRClientToHubTestBase { var order = TestDataFactory.CreateOrder(itemCount: 2); - var result = await _client.PostDataAsync(TestSignalRTags.TestOrderParam, order); + var result = await _client.PostDataAsync(TestSignalRTags.TestOrderParam, order); Assert.IsNotNull(result); Assert.AreEqual(order.Id, result.Id); @@ -192,9 +192,9 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Post_SharedTag_ReturnsSameTag() { - var tag = new SharedTag { Id = 1, Name = "Important", Color = "#FF0000" }; + var tag = new SharedTag_All_True { Id = 1, Name = "Important", Color = "#FF0000" }; - var result = await _client.PostDataAsync(TestSignalRTags.SharedTagParam, tag); + var result = await _client.PostDataAsync(TestSignalRTags.SharedTagParam, tag); Assert.IsNotNull(result); Assert.AreEqual(1, result.Id); @@ -242,13 +242,13 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Post_TestOrderItemList_ReturnsSameItems() { - var items = new List + var items = new List { new() { Id = 1, ProductName = "Item1" }, new() { Id = 2, ProductName = "Item2" } }; - var result = await _client.PostDataAsync, List>(TestSignalRTags.TestOrderItemListParam, items); + var result = await _client.PostDataAsync, List>(TestSignalRTags.TestOrderItemListParam, items); Assert.IsNotNull(result); Assert.AreEqual(2, result.Count); @@ -399,11 +399,11 @@ public abstract class SignalRClientToHubTestBase { var input = new[] { - new SharedTag { Id = 1, Name = "Tag1", Color = "#FF0000" }, - new SharedTag { Id = 2, Name = "Tag2", Color = "#00FF00" } + new SharedTag_All_True { Id = 1, Name = "Tag1", Color = "#FF0000" }, + new SharedTag_All_True { Id = 2, Name = "Tag2", Color = "#00FF00" } }; - var result = await _client.PostDataAsync(TestSignalRTags.SharedTagArrayParam, input); + var result = await _client.PostDataAsync(TestSignalRTags.SharedTagArrayParam, input); Assert.IsNotNull(result); Assert.AreEqual(2, result.Length); @@ -437,7 +437,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Post_IntAndDto_ReturnsFormattedString() { - var item = new TestOrderItem { Id = 1, ProductName = "Widget" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Widget" }; var result = await _client.PostAsync(TestSignalRTags.IntAndDtoParam, [42, item]); @@ -447,7 +447,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Post_DtoAndList_ReturnsFormattedString() { - var item = new TestOrderItem { Id = 1, ProductName = "Product" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Product" }; var numbers = new List { 1, 2, 3 }; var result = await _client.PostAsync(TestSignalRTags.DtoAndListParam, [item, numbers]); @@ -458,9 +458,9 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Post_ThreeComplexParams_ReturnsFormattedString() { - var item = new TestOrderItem { Id = 1, ProductName = "Item" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Item" }; var tags = new List { "tag1", "tag2", "tag3" }; - var sharedTag = new SharedTag { Id = 1, Name = "Shared" }; + var sharedTag = new SharedTag_All_True { Id = 1, Name = "Shared" }; var result = await _client.PostAsync(TestSignalRTags.ThreeComplexParams, [item, tags, sharedTag]); @@ -509,7 +509,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Async_TestOrderItem_ReturnsProcessedItem() { - var item = new TestOrderItem { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10.50m }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10.50m }; var result = await _client.PostDataAsync(TestSignalRTags.AsyncTestOrderItemParam, item); @@ -553,7 +553,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task RoundTrip_ComplexObject_PreservesAllProperties() { - var item = new TestOrderItem + var item = new TestOrderItem_All_True { Id = 999, ProductName = "RoundTrip Test Item", @@ -576,7 +576,7 @@ public abstract class SignalRClientToHubTestBase { var order = TestDataFactory.CreateOrder(itemCount: 3, palletsPerItem: 2, measurementsPerPallet: 1); - var result = await _client.PostDataAsync(TestSignalRTags.TestOrderParam, order); + var result = await _client.PostDataAsync(TestSignalRTags.TestOrderParam, order); Assert.IsNotNull(result); Assert.AreEqual(order.Id, result.Id); @@ -646,7 +646,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task ResponseData_NotDoubleEscaped() { - var item = new TestOrderItem { Id = 1, ProductName = "Test", Quantity = 10, UnitPrice = 20m }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Test", Quantity = 10, UnitPrice = 20m }; var result = await _client.PostDataAsync(TestSignalRTags.TestOrderItemParam, item); @@ -660,14 +660,14 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task CollectionResponse_DeserializesCorrectly() { - var items = new List + var items = new List { new() { Id = 1, ProductName = "Item1", Quantity = 10, UnitPrice = 1.1m }, new() { Id = 2, ProductName = "Item2", Quantity = 20, UnitPrice = 2.2m }, new() { Id = 3, ProductName = "Item3", Quantity = 30, UnitPrice = 3.3m } }; - var result = await _client.PostDataAsync, List>( + var result = await _client.PostDataAsync, List>( TestSignalRTags.TestOrderItemListParam, items); Assert.IsNotNull(result); @@ -683,7 +683,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task Async_Method_ReturnsActualResult_NotTaskWrapper() { - var item = new TestOrderItem { Id = 42, ProductName = "TestProduct", Quantity = 5, UnitPrice = 10m }; + var item = new TestOrderItem_All_True { Id = 42, ProductName = "TestProduct", Quantity = 5, UnitPrice = 10m }; var result = await _client.PostDataAsync(TestSignalRTags.AsyncTestOrderItemParam, item); @@ -712,7 +712,7 @@ public abstract class SignalRClientToHubTestBase [TestMethod] public async Task TaskFromResult_ComplexObject_ReturnsActualResult_NotTaskWrapper() { - var item = new TestOrderItem { Id = 42, ProductName = "TestProduct", Quantity = 5, UnitPrice = 10m }; + var item = new TestOrderItem_All_True { Id = 42, ProductName = "TestProduct", Quantity = 5, UnitPrice = 10m }; var result = await _client.PostDataAsync(TestSignalRTags.TaskFromResultTestOrderItemParam, item); @@ -769,13 +769,13 @@ public abstract class SignalRClientToHubTestBase { var service = new TestSignalRService2(); var methodInfo = typeof(TestSignalRService2).GetMethod("HandleAsyncTestOrderItem")!; - var input = new TestOrderItem { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; + var input = new TestOrderItem_All_True { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; var result = methodInfo.InvokeMethod(service, input); - Assert.IsNotNull(result, "InvokeMethod should unwrap Task and return the result"); - Assert.IsInstanceOfType(result, typeof(TestOrderItem)); - var item = (TestOrderItem)result; + Assert.IsNotNull(result, "InvokeMethod should unwrap Task and return the result"); + Assert.IsInstanceOfType(result, typeof(TestOrderItem_All_True)); + var item = (TestOrderItem_All_True)result; Assert.AreEqual("Async: Widget", item.ProductName); Assert.AreEqual(15, item.Quantity); } @@ -809,13 +809,13 @@ public abstract class SignalRClientToHubTestBase { var service = new TestSignalRService2(); var methodInfo = typeof(TestSignalRService2).GetMethod("HandleTaskFromResultTestOrderItem")!; - var input = new TestOrderItem { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; + var input = new TestOrderItem_All_True { Id = 1, ProductName = "Widget", Quantity = 5, UnitPrice = 10m }; var result = methodInfo.InvokeMethod(service, input); - Assert.IsNotNull(result, "InvokeMethod should unwrap Task.FromResult and return the result"); - Assert.IsInstanceOfType(result, typeof(TestOrderItem)); - var item = (TestOrderItem)result; + Assert.IsNotNull(result, "InvokeMethod should unwrap Task.FromResult and return the result"); + Assert.IsInstanceOfType(result, typeof(TestOrderItem_All_True)); + var item = (TestOrderItem_All_True)result; Assert.AreEqual("FromResult: Widget", item.ProductName); Assert.AreEqual(10, item.Quantity); } @@ -1056,7 +1056,7 @@ public abstract class SignalRClientToHubTestBase var dataSets = BenchmarkTestDataProvider.CreateTestDataSets(resetId: false); var orders = dataSets.Select(ds => ds.Order).ToList(); - var result = await _client.PostDataAsync, List>( + var result = await _client.PostDataAsync, List>( TestSignalRTags.TestOrderListParam, orders); Assert.IsNotNull(result); @@ -1077,7 +1077,7 @@ public abstract class SignalRClientToHubTestBase public async Task RoundTrip_VeryLargeOrderList_250KB_PreservesAllData() { TestDataFactory.ResetIdCounter(); - var orders = new List(); + var orders = new List(); for (var i = 0; i < 100; i++) { var tag = TestDataFactory.CreateTag($"Tag_{i}"); @@ -1091,7 +1091,7 @@ public abstract class SignalRClientToHubTestBase sharedUser: user)); } - var result = await _client.PostDataAsync, List>( + var result = await _client.PostDataAsync, List>( TestSignalRTags.TestOrderListParam, orders); Assert.IsNotNull(result, "Deserialization returned null — likely BWO GetTotalPosition drift on large payload"); @@ -1131,7 +1131,7 @@ public abstract class SignalRClientToHubTestBase }; TestDataFactory.ResetIdCounter(); - var orders = new List(); + var orders = new List(); for (var i = 0; i < 80; i++) { var tag = TestDataFactory.CreateTag($"Cég_{i}_{hungarianNames[i % hungarianNames.Length]}"); @@ -1159,7 +1159,7 @@ public abstract class SignalRClientToHubTestBase orders.Add(order); } - var result = await _client.PostDataAsync, List>( + var result = await _client.PostDataAsync, List>( TestSignalRTags.TestOrderListParam, orders); Assert.IsNotNull(result, diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Collections.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Collections.cs index 9e07ee3..70f5e64 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Collections.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Collections.cs @@ -22,8 +22,8 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1" }); - dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Item2" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Item1" }); + dataSource.Add(new TestOrderItem_All_True { Id = 2, ProductName = "Item2" }); dataSource.Clear(); Assert.AreEqual(0, dataSource.Count); @@ -35,7 +35,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Item1" }); dataSource.Clear(clearChangeTracking: false); Assert.AreEqual(0, dataSource.Count); @@ -55,7 +55,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual void Contains_ReturnsFalse_WhenItemNotExists() { var dataSource = CreateDataSource(_client, _crudTags); - Assert.IsFalse(dataSource.Contains(new TestOrderItem { Id = 9999 })); + Assert.IsFalse(dataSource.Contains(new TestOrderItem_All_True { Id = 9999 })); } [TestMethod] @@ -74,7 +74,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 5, ProductName = "Item5" }); + dataSource.Add(new TestOrderItem_All_True { Id = 5, ProductName = "Item5" }); Assert.AreEqual(0, dataSource.IndexOf(5)); } @@ -83,7 +83,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 10, ProductName = "Test" }); + dataSource.Add(new TestOrderItem_All_True { Id = 10, ProductName = "Test" }); var result = dataSource.TryGetIndex(10, out var index); Assert.IsTrue(result); @@ -119,7 +119,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, _crudTags); await dataSource.LoadDataSource(); - var array = new TestOrderItem[3]; + var array = new TestOrderItem_All_True[3]; dataSource.CopyTo(array); Assert.AreEqual("Product A", array[0].ProductName); @@ -147,7 +147,7 @@ public abstract partial class SignalRDataSourceTestBase var readOnly = dataSource.AsReadOnly(); Assert.AreEqual(3, readOnly.Count); - Assert.IsInstanceOfType(readOnly, typeof(System.Collections.ObjectModel.ReadOnlyCollection)); + Assert.IsInstanceOfType(readOnly, typeof(System.Collections.ObjectModel.ReadOnlyCollection)); } #endregion @@ -217,7 +217,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual void IList_Add_ReturnsCorrectIndex() { var dataSource = CreateDataSource(_client, _crudTags); - var item = new TestOrderItem { Id = 1, ProductName = "Test" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Test" }; var index = ((IList)dataSource).Add(item); Assert.AreEqual(0, index); @@ -228,7 +228,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - var item = new TestOrderItem { Id = 1, ProductName = "Test" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Test" }; dataSource.Add(item); Assert.IsTrue(((IList)dataSource).Contains(item)); @@ -239,7 +239,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - var item = new TestOrderItem { Id = 1, ProductName = "Test" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Test" }; dataSource.Add(item); Assert.AreEqual(0, ((IList)dataSource).IndexOf(item)); @@ -250,8 +250,8 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "First" }); - var newItem = new TestOrderItem { Id = 2, ProductName = "Inserted" }; + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "First" }); + var newItem = new TestOrderItem_All_True { Id = 2, ProductName = "Inserted" }; ((IList)dataSource).Insert(0, newItem); @@ -263,7 +263,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - var item = new TestOrderItem { Id = 1, ProductName = "Test" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Test" }; dataSource.Add(item); ((IList)dataSource).Remove(item); @@ -275,8 +275,8 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Original" }); - ((IList)dataSource)[0] = new TestOrderItem { Id = 1, ProductName = "Modified" }; + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Original" }); + ((IList)dataSource)[0] = new TestOrderItem_All_True { Id = 1, ProductName = "Modified" }; Assert.AreEqual("Modified", dataSource[0].ProductName); } @@ -286,10 +286,10 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1" }); - dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Item2" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Item1" }); + dataSource.Add(new TestOrderItem_All_True { Id = 2, ProductName = "Item2" }); - var array = new TestOrderItem[2]; + var array = new TestOrderItem_All_True[2]; ((ICollection)dataSource).CopyTo(array, 0); Assert.AreEqual("Item1", array[0].ProductName); @@ -341,7 +341,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual void Add_ThenRemove_ClearsTracking() { var dataSource = CreateDataSource(_client, _crudTags); - var item = new TestOrderItem { Id = 1, ProductName = "Temporary" }; + var item = new TestOrderItem_All_True { Id = 1, ProductName = "Temporary" }; dataSource.Add(item); Assert.AreEqual(1, dataSource.GetTrackingItems().Count); @@ -356,8 +356,8 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, _crudTags); // Add items - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1", Quantity = 10 }); - dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Item2", Quantity = 20 }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Item1", Quantity = 10 }); + dataSource.Add(new TestOrderItem_All_True { Id = 2, ProductName = "Item2", Quantity = 20 }); Assert.AreEqual(2, dataSource.GetTrackingItems().Count); // Save @@ -365,7 +365,7 @@ public abstract partial class SignalRDataSourceTestBase Assert.AreEqual(0, dataSource.GetTrackingItems().Count); // Update - dataSource[0] = new TestOrderItem { Id = 1, ProductName = "Updated1", Quantity = 100 }; + dataSource[0] = new TestOrderItem_All_True { Id = 1, ProductName = "Updated1", Quantity = 100 }; Assert.AreEqual(1, dataSource.GetTrackingItems().Count); Assert.AreEqual(TrackingState.Update, dataSource.GetTrackingItems()[0].TrackingState); diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.ContextAndFilter.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.ContextAndFilter.cs index ce77678..64b31ea 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.ContextAndFilter.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.ContextAndFilter.cs @@ -53,7 +53,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, expressionCrudTags); // Create filter as Expression - serializer automatically converts to AcExpressionNode - Expression> filter = item => item.Quantity > 15; + Expression> filter = item => item.Quantity > 15; // Set filter as ContextIds - serializer handles the conversion dataSource.ContextIds = [filter]; @@ -75,7 +75,7 @@ public abstract partial class SignalRDataSourceTestBase // Create filter as Expression - no manual conversion needed var minPrice = 150m; - Expression> filter = item => item.UnitPrice > minPrice; + Expression> filter = item => item.UnitPrice > minPrice; dataSource.ContextIds = [filter]; @@ -111,7 +111,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, expressionCrudTags); // Create filter as Expression - Expression> filter = item => item.ProductName!.Contains("A"); + Expression> filter = item => item.ProductName!.Contains("A"); dataSource.ContextIds = [filter]; @@ -131,7 +131,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, expressionCrudTags); // Create filter as Expression - complex condition - Expression> filter = item => item.Quantity >= 20 && item.UnitPrice < 250m; + Expression> filter = item => item.Quantity >= 20 && item.UnitPrice < 250m; dataSource.ContextIds = [filter]; @@ -166,7 +166,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, queryableCrudTags); // Create a lambda filter Expression - this gets wrapped in Where on the server - Expression> filter = x => x.Quantity > 15; + Expression> filter = x => x.Quantity > 15; // Convert to AcExpressionNode for sending var filterNode = AcExpressionConverter.ToNode(filter); @@ -189,7 +189,7 @@ public abstract partial class SignalRDataSourceTestBase // Create a lambda filter with decimal comparison var minPrice = 150m; - Expression> filter = x => x.UnitPrice > minPrice; + Expression> filter = x => x.UnitPrice > minPrice; var filterNode = AcExpressionConverter.ToNode(filter); dataSource.ContextIds = [filterNode]; @@ -210,7 +210,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, queryableCrudTags); // Create a filter with AND condition - Expression> filter = x => x.Quantity >= 20 && x.UnitPrice < 250m; + Expression> filter = x => x.Quantity >= 20 && x.UnitPrice < 250m; var filterNode = AcExpressionConverter.ToNode(filter); dataSource.ContextIds = [filterNode]; @@ -232,7 +232,7 @@ public abstract partial class SignalRDataSourceTestBase // Create a query chain: Where(x => x.Id > 1).Count() // This tests the method call chain serialization - var query = new List().AsQueryable() + var query = new List().AsQueryable() .Where(x => x.Id > 1); var queryNode = AcExpressionConverter.ToNode(query.Expression); @@ -270,7 +270,7 @@ public abstract partial class SignalRDataSourceTestBase public void QueryableAggregate_CountWithWhere_ExecutesOnServer() { // Arrange - Server data - var serverItems = new List + var serverItems = new List { new() { Id = 1, ProductName = "Product A", Quantity = 10 }, new() { Id = 2, ProductName = "Product B", Quantity = 20 }, @@ -279,14 +279,14 @@ public abstract partial class SignalRDataSourceTestBase // Build query: .Where(x => x.Id > 1).Count() // The Count() is an aggregate that should execute on the server! - var clientQuery = new List().AsQueryable() + var clientQuery = new List().AsQueryable() .Where(x => x.Id > 1); // Build the Count() call expression manually var countExpression = System.Linq.Expressions.Expression.Call( typeof(Queryable), nameof(Queryable.Count), - [typeof(TestOrderItem)], + [typeof(TestOrderItem_All_True)], clientQuery.Expression ); @@ -304,7 +304,7 @@ public abstract partial class SignalRDataSourceTestBase public void QueryableAggregate_CountWithPredicate_ExecutesOnServer() { // Arrange - Server data - var serverItems = new List + var serverItems = new List { new() { Id = 1, ProductName = "Product A", Quantity = 10 }, new() { Id = 2, ProductName = "Product B", Quantity = 20 }, @@ -312,13 +312,13 @@ public abstract partial class SignalRDataSourceTestBase }; // Build query: .Count(x => x.Quantity > 15) - var clientQuery = new List().AsQueryable(); - Expression> predicate = x => x.Quantity > 15; + var clientQuery = new List().AsQueryable(); + Expression> predicate = x => x.Quantity > 15; var countExpression = System.Linq.Expressions.Expression.Call( typeof(Queryable), nameof(Queryable.Count), - [typeof(TestOrderItem)], + [typeof(TestOrderItem_All_True)], clientQuery.Expression, System.Linq.Expressions.Expression.Quote(predicate) ); @@ -337,7 +337,7 @@ public abstract partial class SignalRDataSourceTestBase public void QueryableAggregate_Any_ExecutesOnServer() { // Arrange - Server data - var serverItems = new List + var serverItems = new List { new() { Id = 1, ProductName = "Product A", Quantity = 10 }, new() { Id = 2, ProductName = "Product B", Quantity = 20 }, @@ -345,13 +345,13 @@ public abstract partial class SignalRDataSourceTestBase }; // Build query: .Any(x => x.Quantity > 25) - var clientQuery = new List().AsQueryable(); - Expression> predicate = x => x.Quantity > 25; + var clientQuery = new List().AsQueryable(); + Expression> predicate = x => x.Quantity > 25; var anyExpression = System.Linq.Expressions.Expression.Call( typeof(Queryable), nameof(Queryable.Any), - [typeof(TestOrderItem)], + [typeof(TestOrderItem_All_True)], clientQuery.Expression, System.Linq.Expressions.Expression.Quote(predicate) ); @@ -370,7 +370,7 @@ public abstract partial class SignalRDataSourceTestBase public void QueryableAggregate_Sum_ExecutesOnServer() { // Arrange - Server data - var serverItems = new List + var serverItems = new List { new() { Id = 1, ProductName = "Product A", Quantity = 10, UnitPrice = 100m }, new() { Id = 2, ProductName = "Product B", Quantity = 20, UnitPrice = 200m }, @@ -378,13 +378,13 @@ public abstract partial class SignalRDataSourceTestBase }; // Build query: .Sum(x => x.Quantity) - var clientQuery = new List().AsQueryable(); - Expression> selector = x => x.Quantity; + var clientQuery = new List().AsQueryable(); + Expression> selector = x => x.Quantity; var sumExpression = System.Linq.Expressions.Expression.Call( typeof(Queryable), nameof(Queryable.Sum), - [typeof(TestOrderItem)], + [typeof(TestOrderItem_All_True)], clientQuery.Expression, System.Linq.Expressions.Expression.Quote(selector) ); @@ -407,7 +407,7 @@ public abstract partial class SignalRDataSourceTestBase public void QueryableExpression_WhenSerialized_HasCorrectStructure() { // Arrange - Create an IQueryable with Where - var query = new List().AsQueryable().Where(x => x.Id > 1); + var query = new List().AsQueryable().Where(x => x.Id > 1); // Act - Serialize the expression var queryNode = AcExpressionConverter.ToNode(query.Expression); @@ -445,11 +445,11 @@ public abstract partial class SignalRDataSourceTestBase public void QueryableExpression_ApplyToServer_Works() { // Arrange - Client query - var clientQuery = new List().AsQueryable().Where(x => x.Id > 1); + var clientQuery = new List().AsQueryable().Where(x => x.Id > 1); var queryNode = AcExpressionConverter.ToNode(clientQuery.Expression); // Server data - var serverItems = new List + var serverItems = new List { new() { Id = 1, ProductName = "Product A" }, new() { Id = 2, ProductName = "Product B" }, diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.CrudOperations.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.CrudOperations.cs index d566ac5..a0c50ea 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.CrudOperations.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.CrudOperations.cs @@ -11,7 +11,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual async Task Add_WithAutoSave_AddsItem() { var dataSource = CreateDataSource(_client, _crudTags); - var newItem = new TestOrderItem { Id = 100, ProductName = "New Product", Quantity = 5, UnitPrice = 50m }; + var newItem = new TestOrderItem_All_True { Id = 100, ProductName = "New Product", Quantity = 5, UnitPrice = 50m }; var result = await dataSource.Add(newItem, autoSave: true); Assert.AreEqual(1, dataSource.Count); @@ -23,7 +23,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual void Add_WithoutAutoSave_AddsToTrackingOnly() { var dataSource = CreateDataSource(_client, _crudTags); - var newItem = new TestOrderItem { Id = 100, ProductName = "New Product" }; + var newItem = new TestOrderItem_All_True { Id = 100, ProductName = "New Product" }; dataSource.Add(newItem); Assert.AreEqual(1, dataSource.Count); @@ -35,11 +35,11 @@ public abstract partial class SignalRDataSourceTestBase public virtual void Add_DuplicateId_ThrowsException() { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 100, ProductName = "First" }); + dataSource.Add(new TestOrderItem_All_True { Id = 100, ProductName = "First" }); Assert.ThrowsExactly(() => { - dataSource.Add(new TestOrderItem { Id = 100, ProductName = "Duplicate" }); + dataSource.Add(new TestOrderItem_All_True { Id = 100, ProductName = "Duplicate" }); }); } @@ -50,7 +50,7 @@ public abstract partial class SignalRDataSourceTestBase Assert.ThrowsExactly(() => { - dataSource.Add(new TestOrderItem { Id = 0, ProductName = "Invalid" }); + dataSource.Add(new TestOrderItem_All_True { Id = 0, ProductName = "Invalid" }); }); } @@ -61,9 +61,9 @@ public abstract partial class SignalRDataSourceTestBase var items = new[] { - new TestOrderItem { Id = 101, ProductName = "Item 1" }, - new TestOrderItem { Id = 102, ProductName = "Item 2" }, - new TestOrderItem { Id = 103, ProductName = "Item 3" } + new TestOrderItem_All_True { Id = 101, ProductName = "Item 1" }, + new TestOrderItem_All_True { Id = 102, ProductName = "Item 2" }, + new TestOrderItem_All_True { Id = 103, ProductName = "Item 3" } }; dataSource.AddRange(items); Assert.AreEqual(3, dataSource.Count); @@ -77,7 +77,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual async Task AddOrUpdate_AddsNew_WhenNotExists() { var dataSource = CreateDataSource(_client, _crudTags); - var newItem = new TestOrderItem { Id = 200, ProductName = "Brand New" }; + var newItem = new TestOrderItem_All_True { Id = 200, ProductName = "Brand New" }; var result = await dataSource.AddOrUpdate(newItem, autoSave: true); Assert.AreEqual(1, dataSource.Count); @@ -91,7 +91,7 @@ public abstract partial class SignalRDataSourceTestBase await dataSource.LoadDataSource(); var existingId = dataSource[0].Id; - var updatedItem = new TestOrderItem { Id = existingId, ProductName = "Updated Name", Quantity = 999 }; + var updatedItem = new TestOrderItem_All_True { Id = existingId, ProductName = "Updated Name", Quantity = 999 }; _ = await dataSource.AddOrUpdate(updatedItem, autoSave: true); Assert.AreEqual(3, dataSource.Count); @@ -107,9 +107,9 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "First" }); - dataSource.Add(new TestOrderItem { Id = 3, ProductName = "Third" }); - dataSource.Insert(1, new TestOrderItem { Id = 2, ProductName = "Second" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "First" }); + dataSource.Add(new TestOrderItem_All_True { Id = 3, ProductName = "Third" }); + dataSource.Insert(1, new TestOrderItem_All_True { Id = 2, ProductName = "Second" }); Assert.AreEqual(3, dataSource.Count); Assert.AreEqual("Second", dataSource[1].ProductName); @@ -121,7 +121,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - var newItem = new TestOrderItem { Id = 500, ProductName = "Inserted" }; + var newItem = new TestOrderItem_All_True { Id = 500, ProductName = "Inserted" }; _ = await dataSource.Insert(0, newItem, autoSave: true); Assert.AreEqual(1, dataSource.Count); @@ -138,7 +138,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, _crudTags); await dataSource.LoadDataSource(); - var updatedItem = new TestOrderItem + var updatedItem = new TestOrderItem_All_True { Id = dataSource[0].Id, ProductName = "Updated Product", @@ -157,7 +157,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, _crudTags); await dataSource.LoadDataSource(); - var updatedItem = new TestOrderItem + var updatedItem = new TestOrderItem_All_True { Id = dataSource[1].Id, ProductName = "Updated B", @@ -174,8 +174,8 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Original" }); - dataSource[0] = new TestOrderItem { Id = 1, ProductName = "Modified" }; + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Original" }); + dataSource[0] = new TestOrderItem_All_True { Id = 1, ProductName = "Modified" }; Assert.AreEqual(1, dataSource.GetTrackingItems().Count); Assert.AreEqual(TrackingState.Add, dataSource.GetTrackingItems()[0].TrackingState); @@ -216,7 +216,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "ToRemove" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "ToRemove" }); dataSource.GetTrackingItems().Clear(); dataSource.Remove(dataSource[0]); @@ -231,9 +231,9 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "First" }); - dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Second" }); - dataSource.Add(new TestOrderItem { Id = 3, ProductName = "Third" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "First" }); + dataSource.Add(new TestOrderItem_All_True { Id = 2, ProductName = "Second" }); + dataSource.Add(new TestOrderItem_All_True { Id = 3, ProductName = "Third" }); dataSource.GetTrackingItems().Clear(); dataSource.RemoveAt(1); @@ -260,7 +260,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Test" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Test" }); var result = dataSource.TryRemove(1, out var removedItem); Assert.IsTrue(result); diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadDataSource.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadDataSource.cs index d9da2e4..b1fcbce 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadDataSource.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadDataSource.cs @@ -23,7 +23,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual async Task LoadDataSource_ClearsChangeTracking_ByDefault() { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 999, ProductName = "Tracked" }); + dataSource.Add(new TestOrderItem_All_True { Id = 999, ProductName = "Tracked" }); Assert.AreEqual(1, dataSource.GetTrackingItems().Count); @@ -37,7 +37,7 @@ public abstract partial class SignalRDataSourceTestBase var dataSource = CreateDataSource(_client, _crudTags); await dataSource.LoadDataSource(); - dataSource.Add(new TestOrderItem { Id = 999, ProductName = "Tracked" }); + dataSource.Add(new TestOrderItem_All_True { Id = 999, ProductName = "Tracked" }); await dataSource.LoadDataSource(clearChangeTracking: false); Assert.AreEqual(1, dataSource.GetTrackingItems().Count); diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadItem.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadItem.cs index 0d3cca4..25e649e 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadItem.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.LoadItem.cs @@ -49,7 +49,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - ItemChangedEventArgs? eventArgs = null; + ItemChangedEventArgs? eventArgs = null; dataSource.OnDataSourceItemChanged = args => { eventArgs = args; return Task.CompletedTask; }; await dataSource.LoadItem(1); diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.SaveChanges.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.SaveChanges.cs index 6e68427..ae450a1 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.SaveChanges.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.SaveChanges.cs @@ -12,8 +12,8 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 101, ProductName = "Item 1" }); - dataSource.Add(new TestOrderItem { Id = 102, ProductName = "Item 2" }); + dataSource.Add(new TestOrderItem_All_True { Id = 101, ProductName = "Item 1" }); + dataSource.Add(new TestOrderItem_All_True { Id = 102, ProductName = "Item 2" }); var unsaved = await dataSource.SaveChanges(); @@ -25,7 +25,7 @@ public abstract partial class SignalRDataSourceTestBase public virtual async Task SaveChangesAsync_ClearsTracking() { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 103, ProductName = "Item 3" }); + dataSource.Add(new TestOrderItem_All_True { Id = 103, ProductName = "Item 3" }); await dataSource.SaveChangesAsync(); @@ -37,7 +37,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 201, ProductName = "Specific" }); + dataSource.Add(new TestOrderItem_All_True { Id = 201, ProductName = "Specific" }); var result = await dataSource.SaveItem(201); Assert.AreEqual("Specific", result.ProductName); diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Tracking.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Tracking.cs index 41d10d0..41fbed4 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Tracking.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.Tracking.cs @@ -12,7 +12,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Test" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Test" }); dataSource.SetTrackingStateToUpdate(dataSource[0]); @@ -25,7 +25,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "New Item" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "New Item" }); dataSource.SetTrackingStateToUpdate(dataSource[0]); Assert.AreEqual(TrackingState.Add, dataSource.GetTrackingItems()[0].TrackingState); @@ -36,7 +36,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Tracked" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Tracked" }); var result = dataSource.TryGetTrackingItem(1, out var trackingItem); Assert.IsTrue(result); @@ -63,7 +63,7 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Added" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Added" }); var result = dataSource.TryRollbackItem(1, out var originalValue); Assert.IsTrue(result); @@ -78,7 +78,7 @@ public abstract partial class SignalRDataSourceTestBase await dataSource.LoadDataSource(); var originalName = dataSource[0].ProductName; - dataSource[0] = new TestOrderItem { Id = dataSource[0].Id, ProductName = "Changed" }; + dataSource[0] = new TestOrderItem_All_True { Id = dataSource[0].Id, ProductName = "Changed" }; var result = dataSource.TryRollbackItem(dataSource[0].Id, out var originalValue); Assert.IsTrue(result); @@ -90,8 +90,8 @@ public abstract partial class SignalRDataSourceTestBase { var dataSource = CreateDataSource(_client, _crudTags); - dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1" }); - dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Item2" }); + dataSource.Add(new TestOrderItem_All_True { Id = 1, ProductName = "Item1" }); + dataSource.Add(new TestOrderItem_All_True { Id = 2, ProductName = "Item2" }); dataSource.Rollback(); Assert.AreEqual(0, dataSource.Count); diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.cs index 5cab3af..b7605f6 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.cs @@ -13,8 +13,8 @@ namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; /// The concrete DataSource type /// The inner list type (List or AcObservableCollection) public abstract partial class SignalRDataSourceTestBase - where TDataSource : AcSignalRDataSource - where TIList : class, IList + where TDataSource : AcSignalRDataSource + where TIList : class, IList { protected abstract AcSerializerOptions SerializerOption { get; } protected abstract TDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags); diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary.cs index 27e04a7..2c0e82c 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary.cs @@ -6,7 +6,7 @@ using AyCode.Services.SignalRs; namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; [TestClass] -public class SignalRDataSourceTests_List_Binary : SignalRDataSourceTestBase> +public class SignalRDataSourceTests_List_Binary : SignalRDataSourceTestBase> { protected override AcSerializerOptions SerializerOption => new AcBinarySerializerOptions(); protected override TestOrderItemListDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags) diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary_NoRef.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary_NoRef.cs index 480c1f7..aebbaf0 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary_NoRef.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Binary_NoRef.cs @@ -6,7 +6,7 @@ using AyCode.Services.SignalRs; namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; [TestClass] -public class SignalRDataSourceTests_List_Binary_NoRef : SignalRDataSourceTestBase> +public class SignalRDataSourceTests_List_Binary_NoRef : SignalRDataSourceTestBase> { protected override AcSerializerOptions SerializerOption => new AcBinarySerializerOptions { ReferenceHandling = ReferenceHandlingMode.None }; protected override TestOrderItemListDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags) diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Json.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Json.cs index e127882..07a2b77 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Json.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_List_Json.cs @@ -7,7 +7,7 @@ using AyCode.Services.SignalRs; namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; [TestClass] -public class SignalRDataSourceTests_List_Json : SignalRDataSourceTestBase> +public class SignalRDataSourceTests_List_Json : SignalRDataSourceTestBase> { protected override AcSerializerOptions SerializerOption => new AcJsonSerializerOptions(); protected override TestOrderItemListDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags) diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Binary.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Binary.cs index cbd8f44..820e3c5 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Binary.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Binary.cs @@ -7,7 +7,7 @@ using AyCode.Services.SignalRs; namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; [TestClass] -public class SignalRDataSourceTests_Observable_Binary : SignalRDataSourceTestBase> +public class SignalRDataSourceTests_Observable_Binary : SignalRDataSourceTestBase> { protected override AcSerializerOptions SerializerOption => new AcBinarySerializerOptions(); protected override TestOrderItemObservableDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags) diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Json.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Json.cs index a5f866f..701d521 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Json.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTests_Observable_Json.cs @@ -7,7 +7,7 @@ using AyCode.Services.SignalRs; namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; [TestClass] -public class SignalRDataSourceTests_Observable_Json : SignalRDataSourceTestBase> +public class SignalRDataSourceTests_Observable_Json : SignalRDataSourceTestBase> { protected override AcSerializerOptions SerializerOption => new AcJsonSerializerOptions(); protected override TestOrderItemObservableDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags) diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemListDataSource.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemListDataSource.cs index a676e1b..0c0a7b1 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemListDataSource.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemListDataSource.cs @@ -4,7 +4,7 @@ using AyCode.Services.SignalRs; namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; -public class TestOrderItemListDataSource : AcSignalRDataSource> +public class TestOrderItemListDataSource : AcSignalRDataSource> { public TestOrderItemListDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags crudTags) : base(signalRClient, crudTags) { } diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemObservableDataSource.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemObservableDataSource.cs index 7ace8fc..dff2ddf 100644 --- a/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemObservableDataSource.cs +++ b/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/TestOrderItemObservableDataSource.cs @@ -5,7 +5,7 @@ using AyCode.Services.SignalRs; namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources; -public class TestOrderItemObservableDataSource : AcSignalRDataSource> +public class TestOrderItemObservableDataSource : AcSignalRDataSource> { public TestOrderItemObservableDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags crudTags) : base(signalRClient, crudTags) { } diff --git a/AyCode.Services.Server.Tests/SignalRs/TestSignalRService2.cs b/AyCode.Services.Server.Tests/SignalRs/TestSignalRService2.cs index 2137bd2..560422f 100644 --- a/AyCode.Services.Server.Tests/SignalRs/TestSignalRService2.cs +++ b/AyCode.Services.Server.Tests/SignalRs/TestSignalRService2.cs @@ -104,9 +104,9 @@ public class TestSignalRService2 #region Complex Object Handlers (using shared DTOs) [SignalR(TestSignalRTags.TestOrderItemParam)] - public TestOrderItem HandleTestOrderItem(TestOrderItem item) + public TestOrderItem_All_True HandleTestOrderItem(TestOrderItem_All_True item) { - return new TestOrderItem + return new TestOrderItem_All_True { Id = item.Id, ProductName = $"Processed: {item.ProductName}", @@ -116,13 +116,13 @@ public class TestSignalRService2 } [SignalR(TestSignalRTags.TestOrderParam)] - public TestOrder HandleTestOrder(TestOrder order) + public TestOrder_All_True HandleTestOrder(TestOrder_All_True order) { return order; } [SignalR(TestSignalRTags.SharedTagParam)] - public SharedTag HandleSharedTag(SharedTag tag) + public SharedTag_All_True HandleSharedTag(SharedTag_All_True tag) { return tag; } @@ -150,7 +150,7 @@ public class TestSignalRService2 } [SignalR(TestSignalRTags.TestOrderItemListParam)] - public List HandleTestOrderItemList(List items) + public List HandleTestOrderItemList(List items) { return items; } @@ -214,7 +214,7 @@ public class TestSignalRService2 } [SignalR(TestSignalRTags.SharedTagArrayParam)] - public SharedTag[] HandleSharedTagArray(SharedTag[] tags) + public SharedTag_All_True[] HandleSharedTagArray(SharedTag_All_True[] tags) { return tags; } @@ -236,19 +236,19 @@ public class TestSignalRService2 #region Mixed Parameter Handlers [SignalR(TestSignalRTags.IntAndDtoParam)] - public string HandleIntAndDto(int id, TestOrderItem item) + public string HandleIntAndDto(int id, TestOrderItem_All_True item) { return $"{id}-{item?.ProductName}"; } [SignalR(TestSignalRTags.DtoAndListParam)] - public string HandleDtoAndList(TestOrderItem item, List numbers) + public string HandleDtoAndList(TestOrderItem_All_True item, List numbers) { return $"{item?.ProductName}-[{string.Join(",", numbers ?? [])}]"; } [SignalR(TestSignalRTags.ThreeComplexParams)] - public string HandleThreeComplexParams(TestOrderItem item, List tags, SharedTag sharedTag) + public string HandleThreeComplexParams(TestOrderItem_All_True item, List tags, SharedTag_All_True sharedTag) { return $"{item?.ProductName}-{tags?.Count}-{sharedTag?.Name}"; } @@ -264,10 +264,10 @@ public class TestSignalRService2 #region Async Task Method Tests [SignalR(TestSignalRTags.AsyncTestOrderItemParam)] - public async Task HandleAsyncTestOrderItem(TestOrderItem item) + public async Task HandleAsyncTestOrderItem(TestOrderItem_All_True item) { await Task.Delay(1); // Simulate async work - return new TestOrderItem + return new TestOrderItem_All_True { Id = item.Id, ProductName = $"Async: {item.ProductName}", @@ -316,13 +316,13 @@ public class TestSignalRService2 } /// - /// Returns Task<TestOrderItem> without async keyword. + /// Returns Task<TestOrderItem_All_True> without async keyword. /// CRITICAL: This simulates the exact production bug scenario. /// [SignalR(TestSignalRTags.TaskFromResultTestOrderItemParam)] - public Task HandleTaskFromResultTestOrderItem(TestOrderItem item) + public Task HandleTaskFromResultTestOrderItem(TestOrderItem_All_True item) { - return Task.FromResult(new TestOrderItem + return Task.FromResult(new TestOrderItem_All_True { Id = item.Id, ProductName = $"FromResult: {item.ProductName}", @@ -380,11 +380,11 @@ public class TestSignalRService2 #region Large Dataset / List Tests /// - /// Tests Binary serialization with a list of TestOrder objects. + /// Tests Binary serialization with a list of TestOrder_All_True objects. /// Used for testing string interning with deeply nested objects. /// [SignalR(TestSignalRTags.TestOrderListParam)] - public List HandleTestOrderList(List orders) + public List HandleTestOrderList(List orders) { return orders; } @@ -440,7 +440,7 @@ public class TestSignalRService2 #region DataSource CRUD Tests - private readonly List _dataSourceItems = + private readonly List _dataSourceItems = [ new() { Id = 1, ProductName = "Product A", Quantity = 10, UnitPrice = 100m }, new() { Id = 2, ProductName = "Product B", Quantity = 20, UnitPrice = 200m }, @@ -448,7 +448,7 @@ public class TestSignalRService2 ]; [SignalR(TestSignalRTags.DataSourceGetAll)] - public List DataSourceGetAll() => _dataSourceItems.ToList(); + public List DataSourceGetAll() => _dataSourceItems.ToList(); /// /// DataSource GetAll with Expression filter. @@ -456,7 +456,7 @@ public class TestSignalRService2 /// Uses IQueryable.Where() instead of Compile() for EF Core compatibility. /// [SignalR(TestSignalRTags.ExpressionDataSourceGetAll)] - public List ExpressionDataSourceGetAll(Expression>? filter = null) + public List ExpressionDataSourceGetAll(Expression>? filter = null) { if (filter == null) return _dataSourceItems.ToList(); @@ -471,10 +471,10 @@ public class TestSignalRService2 /// The expression is rebuilt and applied to the server's IQueryable. /// [SignalR(TestSignalRTags.QueryableDataSourceGetAll)] - public List QueryableDataSourceGetAll(AcExpressionNode? queryNode = null) + public List QueryableDataSourceGetAll(AcExpressionNode? queryNode = null) { // Simulate DbContext.Items (IQueryable) - IQueryable serverQuery = _dataSourceItems.AsQueryable(); + IQueryable serverQuery = _dataSourceItems.AsQueryable(); // If client sent a query node, rebuild and apply it if (queryNode != null) @@ -482,7 +482,7 @@ public class TestSignalRService2 // If it's a lambda expression, use it directly as a filter if (queryNode.NodeType == ExpressionType.Lambda) { - var filter = AcExpressionRebuilder.FromNode(queryNode); + var filter = AcExpressionRebuilder.FromNode(queryNode); serverQuery = serverQuery.Where(filter); } else @@ -505,7 +505,7 @@ public class TestSignalRService2 public object? QueryableDataSourceAggregate(AcExpressionNode queryNode) { // Build the query from the expression node - IQueryable serverQuery = _dataSourceItems.AsQueryable(); + IQueryable serverQuery = _dataSourceItems.AsQueryable(); // Apply the full expression tree (including the aggregate method) var result = AcSerializerCommon.ExecuteQueryFromNode(serverQuery, queryNode); @@ -514,17 +514,17 @@ public class TestSignalRService2 } [SignalR(TestSignalRTags.DataSourceGetItem)] - public TestOrderItem? DataSourceGetItem(int id) => _dataSourceItems.FirstOrDefault(x => x.Id == id); + public TestOrderItem_All_True? DataSourceGetItem(int id) => _dataSourceItems.FirstOrDefault(x => x.Id == id); [SignalR(TestSignalRTags.DataSourceAdd)] - public TestOrderItem DataSourceAdd(TestOrderItem item) + public TestOrderItem_All_True DataSourceAdd(TestOrderItem_All_True item) { _dataSourceItems.Add(item); return item; } [SignalR(TestSignalRTags.DataSourceUpdate)] - public TestOrderItem DataSourceUpdate(TestOrderItem item) + public TestOrderItem_All_True DataSourceUpdate(TestOrderItem_All_True item) { var index = _dataSourceItems.FindIndex(x => x.Id == item.Id); if (index >= 0) _dataSourceItems[index] = item; @@ -532,7 +532,7 @@ public class TestSignalRService2 } [SignalR(TestSignalRTags.DataSourceRemove)] - public TestOrderItem? DataSourceRemove(TestOrderItem item) + public TestOrderItem_All_True? DataSourceRemove(TestOrderItem_All_True item) { var existing = _dataSourceItems.FirstOrDefault(x => x.Id == item.Id); if (existing != null) _dataSourceItems.Remove(existing);