You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
5.6 KiB

  1. using JTNE.Protocol.MessageBody;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using Xunit;
  6. using JTNE.Protocol.Extensions;
  7. using JTNE.Protocol.Formatters;
  8. using JTNE.Protocol.Attributes;
  9. namespace JTNE.Protocol.Test.MessageBody
  10. {
  11. public class JTNE_0x02_CustomBodyTest
  12. {
  13. [Fact]
  14. public void Test1()
  15. {
  16. JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1));
  17. JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2));
  18. JTNE_0x02 jTNE_0X02 = new JTNE_0x02();
  19. jTNE_0X02.CusotmSerializeObjectValues = new Dictionary<byte, JTNE_0x02_CustomBody>();
  20. JTNE_0x02_0xA1 jTNE_0X02_0XA1 = new JTNE_0x02_0xA1();
  21. jTNE_0X02_0XA1.UserName = "SmallChi";
  22. jTNE_0X02_0XA1.Age = 18;
  23. jTNE_0X02.CusotmSerializeObjectValues.Add(0xA1, jTNE_0X02_0XA1);
  24. JTNE_0x02_0xA2 jTNE_0X02_0XA2 = new JTNE_0x02_0xA2();
  25. jTNE_0X02_0XA2.CompanyName = "小池有限公司";
  26. jTNE_0X02.CusotmSerializeObjectValues.Add(0xA2, jTNE_0X02_0XA2);
  27. var hex = JTNESerializer.Serialize(jTNE_0X02).ToHexString();
  28. Assert.Equal("A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000", hex);
  29. }
  30. [Fact]
  31. public void Test2()
  32. {
  33. JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA1, typeof(JTNE_0x02_0xA1));
  34. JTNEGlobalConfigs.Instance.Register_JTNE0x02CustomBody(0xA2, typeof(JTNE_0x02_0xA2));
  35. JTNEGlobalConfigs.Instance.Encoding = Encoding.UTF8;
  36. var data = "A1000E536D616C6C436869000000000012A20014E5B08FE6B1A0E69C89E99990E585ACE58FB80000".ToHexBytes();
  37. JTNE_0x02 jTNE_0X02 = JTNESerializer.Deserialize<JTNE_0x02>(data);
  38. Assert.Empty(jTNE_0X02.Values);
  39. JTNE_0x02_0xA1 jTNE_0X02_0XA1 = JTNESerializer.Deserialize<JTNE_0x02_0xA1>(jTNE_0X02.CusotmValues[0xA1]);
  40. Assert.Equal(0xA1, jTNE_0X02_0XA1.TypeCode);
  41. Assert.Equal(14, jTNE_0X02_0XA1.Length);
  42. Assert.Equal("SmallChi", jTNE_0X02_0XA1.UserName);
  43. Assert.Equal(18, jTNE_0X02_0XA1.Age);
  44. JTNE_0x02_0xA2 jTNE_0X02_0XA2 = JTNESerializer.Deserialize<JTNE_0x02_0xA2>(jTNE_0X02.CusotmValues[0xA2]);
  45. Assert.Equal(0xA2, jTNE_0X02_0XA2.TypeCode);
  46. Assert.Equal(20, jTNE_0X02_0XA2.Length);
  47. Assert.Equal("小池有限公司", jTNE_0X02_0XA2.CompanyName);
  48. }
  49. }
  50. /// <summary>
  51. ///自定义0xA1消息
  52. /// </summary>
  53. [JTNEFormatter(typeof(JTNE_0x02_0xA1_Formatter))]
  54. public class JTNE_0x02_0xA1: JTNE_0x02_CustomBody
  55. {
  56. public override ushort Length { get; set; } = 14;
  57. public override byte TypeCode { get; set; } = 0xA1;
  58. public string UserName { get; set; }
  59. public ushort Age { get; set; }
  60. }
  61. /// <summary>
  62. ///自定义0xA2消息
  63. /// </summary>
  64. [JTNEFormatter(typeof(JTNE_0x02_0xA2_Formatter))]
  65. public class JTNE_0x02_0xA2 : JTNE_0x02_CustomBody
  66. {
  67. public override ushort Length { get; set; } = 20;
  68. public override byte TypeCode { get; set; } = 0xA2;
  69. public string CompanyName { get; set; }
  70. }
  71. /// <summary>
  72. /// 自定义0xA1消息序列化器
  73. /// </summary>
  74. public class JTNE_0x02_0xA1_Formatter : IJTNEFormatter<JTNE_0x02_0xA1>
  75. {
  76. public JTNE_0x02_0xA1 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
  77. {
  78. int offset = 0;
  79. JTNE_0x02_0xA1 jTNE_0X02_0XA1 = new JTNE_0x02_0xA1();
  80. jTNE_0X02_0XA1.TypeCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
  81. jTNE_0X02_0XA1.Length = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
  82. jTNE_0X02_0XA1.UserName = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset,12);
  83. jTNE_0X02_0XA1.Age = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
  84. readSize = offset;
  85. return jTNE_0X02_0XA1;
  86. }
  87. public int Serialize(ref byte[] bytes, int offset, JTNE_0x02_0xA1 value)
  88. {
  89. offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.TypeCode);
  90. offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.Length);
  91. offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.UserName,12);
  92. offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.Age);
  93. return offset;
  94. }
  95. }
  96. /// <summary>
  97. /// 自定义0xA2消息序列化器
  98. /// </summary>
  99. public class JTNE_0x02_0xA2_Formatter : IJTNEFormatter<JTNE_0x02_0xA2>
  100. {
  101. public JTNE_0x02_0xA2 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
  102. {
  103. int offset = 0;
  104. JTNE_0x02_0xA2 jTNE_0X02_0XA2 = new JTNE_0x02_0xA2();
  105. jTNE_0X02_0XA2.TypeCode = JTNEBinaryExtensions.ReadByteLittle(bytes, ref offset);
  106. jTNE_0X02_0XA2.Length = JTNEBinaryExtensions.ReadUInt16Little(bytes, ref offset);
  107. jTNE_0X02_0XA2.CompanyName = JTNEBinaryExtensions.ReadStringLittle(bytes, ref offset, 20);
  108. readSize = offset;
  109. return jTNE_0X02_0XA2;
  110. }
  111. public int Serialize(ref byte[] bytes, int offset, JTNE_0x02_0xA2 value)
  112. {
  113. offset += JTNEBinaryExtensions.WriteByteLittle(bytes, offset, value.TypeCode);
  114. offset += JTNEBinaryExtensions.WriteUInt16Little(bytes, offset, value.Length);
  115. offset += JTNEBinaryExtensions.WriteStringLittle(bytes, offset, value.CompanyName, 20);
  116. return offset;
  117. }
  118. }
  119. }