From 32f2de0db3ab27eaa387cdd5a404452651912a65 Mon Sep 17 00:00:00 2001 From: Loretta Date: Wed, 13 May 2026 08:40:42 +0200 Subject: [PATCH] [LOADED_DOCS: 2 files, no new loads] Refactor tests to use _All_True model types throughout Replaced all usages of legacy test model types (e.g., TestOrder, TestOrderItem, SharedTag, etc.) with new, feature-complete _All_True variants across SignalR test infrastructure, data sources, and service handlers. Updated all generic constraints, method signatures, and test data to use the new types. Added SharedTestBaseModels.cs and SharedTestOrderModels.cs to define abstract bases and concrete _All_True models with full serialization attributes. This enables more thorough and realistic serialization/deserialization testing and future extensibility. --- AyCode.Benchmark/JitDisassemblyBenchmark.cs | 12 +- AyCode.Benchmark/Program.cs | 14 +- AyCode.Benchmark/SerializationBenchmarks.cs | 68 +-- .../SignalRCommunicationBenchmarks.cs | 18 +- .../SignalRRoundTripBenchmarks.cs | 36 +- .../BenchmarkLoop.cs | 4 +- .../Benchmarks/AcBinaryBenchmark.cs | 8 +- .../AcBinaryBufferWriterBenchmark.cs | 8 +- .../AcBinaryFreshBufferWriterBenchmark.cs | 8 +- .../AcBinaryInMemoryPipeBenchmark.cs | 8 +- .../AcBinaryInMemoryRawByteArrayBenchmark.cs | 8 +- .../Benchmarks/AcBinaryNamedPipeBenchmark.cs | 8 +- .../AcBinaryNamedPipeRawByteArrayBenchmark.cs | 8 +- .../Benchmarks/MemoryPackBenchmark.cs | 8 +- .../MemoryPackBufferWriterBenchmark.cs | 8 +- .../MemoryPackFreshBufferWriterBenchmark.cs | 8 +- .../Benchmarks/MessagePackBenchmark.cs | 10 +- .../Benchmarks/SystemTextJsonBenchmark.cs | 8 +- .../GeneratedWriters/TestOrderWriter.cs | 22 +- AyCode.Core.Tests/JsonExtensionTests.cs | 138 +++--- .../AcBinarySerializerBenchmarkTests.cs | 10 +- .../AcBinarySerializerChainReferenceTests.cs | 36 +- .../AcBinarySerializerIIdReferenceTests.cs | 80 ++-- .../AcBinarySerializerNamedPipeTests.cs | 2 +- .../AcBinarySerializerPipeParallelTests.cs | 4 +- ...SerializerSGenRuntimeCompatibilityTests.cs | 6 +- .../AcExpressionNodeSerializationTests.cs | 32 +- .../AcJsonSerializerIIdReferenceTests.cs | 66 +-- .../Serialization/ChainReferenceDebugTest.cs | 10 +- .../GeneratedSerializerIntegrationTests.cs | 4 +- .../Serialization/QuickBenchmark.cs | 56 +-- .../TestModels/BenchmarkTestDataProvider.cs | 32 +- .../TestModels/SharedTestBaseModels.cs | 303 +++++++++++++ .../TestModels/SharedTestModels.cs | 405 ++---------------- .../TestModels/SharedTestOrderModels.cs | 162 +++++++ .../TestModels/SignalRTestInfrastructure.cs | 6 +- .../TestModels/TestDataFactory.cs | 104 ++--- .../InvokeMethodExtensionTests.cs | 16 +- .../SignalRs/SignalRClientToHubTest.cs | 68 +-- .../SignalRDataSourceTestBase.Collections.cs | 46 +- ...nalRDataSourceTestBase.ContextAndFilter.cs | 52 +-- ...ignalRDataSourceTestBase.CrudOperations.cs | 46 +- ...ignalRDataSourceTestBase.LoadDataSource.cs | 4 +- .../SignalRDataSourceTestBase.LoadItem.cs | 2 +- .../SignalRDataSourceTestBase.SaveChanges.cs | 8 +- .../SignalRDataSourceTestBase.Tracking.cs | 14 +- .../SignalRDataSourceTestBase.cs | 4 +- .../SignalRDataSourceTests_List_Binary.cs | 2 +- ...ignalRDataSourceTests_List_Binary_NoRef.cs | 2 +- .../SignalRDataSourceTests_List_Json.cs | 2 +- ...ignalRDataSourceTests_Observable_Binary.cs | 2 +- .../SignalRDataSourceTests_Observable_Json.cs | 2 +- .../TestOrderItemListDataSource.cs | 2 +- .../TestOrderItemObservableDataSource.cs | 2 +- .../SignalRs/TestSignalRService2.cs | 54 +-- 55 files changed, 1092 insertions(+), 964 deletions(-) create mode 100644 AyCode.Core.Tests/TestModels/SharedTestBaseModels.cs create mode 100644 AyCode.Core.Tests/TestModels/SharedTestOrderModels.cs 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);