using AyCode.Core.Extensions; using AyCode.Services.SignalRs; namespace AyCode.Services.Tests.SignalRs; [TestClass] public class PostJsonDataMessageTests { [TestMethod] public void Debug_ParameterBinary_RoundTrip_ForInt() { var parameters = new object[] { 42 }; Console.WriteLine($"Parameters: [{string.Join(", ", parameters)}]"); var bytes = SignalRSerializationHelper.SerializeParametersToBinary(parameters); Console.WriteLine($"Binary bytes: {bytes.Length}"); // Simulate server deserialization with known target types var paramInfos = typeof(PostJsonDataMessageTests) .GetMethod(nameof(DummyIntMethod))!.GetParameters(); var deserialized = SignalRSerializationHelper.DeserializeParametersFromBinary(bytes, paramInfos); Assert.IsNotNull(deserialized); Assert.AreEqual(1, deserialized.Length); Assert.AreEqual(42, deserialized[0]); } [TestMethod] [DataRow(42)] [DataRow("45")] [DataRow(true)] public void ParameterBinary_FullRoundTrip_AnyParameter(object testValue) { Console.WriteLine("=== Step 1: Client creates object[] ==="); var parameters = new[] { testValue }; Console.WriteLine("\n=== Step 2: Binary serialization ==="); var bytes = SignalRSerializationHelper.SerializeParametersToBinary(parameters); Console.WriteLine($"Binary bytes: {bytes.Length}"); Console.WriteLine("\n=== Step 3: Server deserializes with target type ==="); var paramInfos = new[] { GetParamInfoForType(testValue.GetType()) }; var serverParams = SignalRSerializationHelper.DeserializeParametersFromBinary(bytes, paramInfos); Console.WriteLine($"Server params[0]: '{serverParams[0]}' (type: {serverParams[0]?.GetType().Name})"); Console.WriteLine("\n=== Step 4: Service method uses parameter ==="); var serviceResult = $"{serverParams![0]}"; Console.WriteLine($"Service result: '{serviceResult}'"); Console.WriteLine("\n=== Step 5: Server creates response ==="); var response = new SignalResponseDataMessage(100, SignalResponseStatus.Success, serviceResult, AyCode.Core.Serializers.Binaries.AcBinarySerializerOptions.Default); Console.WriteLine("\n=== Step 6: Response Binary ==="); var responseBytes = response.ToBinary(); Console.WriteLine("\n=== Step 7: Client deserializes response ==="); var clientResponse = responseBytes.BinaryTo(); Console.WriteLine("\n=== Step 8: Client deserializes to string ==="); var finalResult = clientResponse?.GetResponseData(); Console.WriteLine($"Final result: '{finalResult}'"); Assert.AreEqual(testValue.ToString(), finalResult); } [TestMethod] public void ParameterBinary_MultipleParams_RoundTrip() { var guid = Guid.NewGuid(); var parameters = new object[] { 42, "hello", true, guid }; var bytes = SignalRSerializationHelper.SerializeParametersToBinary(parameters); var paramInfos = typeof(PostJsonDataMessageTests) .GetMethod(nameof(DummyMultiMethod))!.GetParameters(); var deserialized = SignalRSerializationHelper.DeserializeParametersFromBinary(bytes, paramInfos); Assert.IsNotNull(deserialized); Assert.AreEqual(4, deserialized.Length); Assert.AreEqual(42, deserialized[0]); Assert.AreEqual("hello", deserialized[1]); Assert.AreEqual(true, deserialized[2]); Assert.AreEqual(guid, deserialized[3]); } // Dummy methods for ParameterInfo extraction public static void DummyIntMethod(int value) { } public static void DummyMultiMethod(int a, string b, bool c, Guid d) { } private static System.Reflection.ParameterInfo GetParamInfoForType(Type type) { // Find a dummy method with the matching parameter type if (type == typeof(int)) return typeof(PostJsonDataMessageTests).GetMethod(nameof(DummyInt))!.GetParameters()[0]; if (type == typeof(string)) return typeof(PostJsonDataMessageTests).GetMethod(nameof(DummyString))!.GetParameters()[0]; if (type == typeof(bool)) return typeof(PostJsonDataMessageTests).GetMethod(nameof(DummyBool))!.GetParameters()[0]; throw new NotSupportedException($"No dummy method for type {type.Name}"); } public static void DummyInt(int v) { } public static void DummyString(string v) { } public static void DummyBool(bool v) { } }