AyCode.Core/AyCode.Services.Tests/SignalRs/PostJsonDataMessageTests.cs

103 lines
4.4 KiB
C#

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<SignalResponseDataMessage>();
Console.WriteLine("\n=== Step 8: Client deserializes to string ===");
var finalResult = clientResponse?.GetResponseData<string>();
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) { }
}