Skip to content

Commit 7a9ef35

Browse files
committed
csharp: Fix missing support for sbytes serialization
1 parent 02ad5c4 commit 7a9ef35

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

csharp/src/CompostRpc/Serialization.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ private static readonly Dictionary<Type, Func<byte[], object>> _primitiveTypeDes
2222
= new()
2323
{
2424
{typeof(bool), (buf) => BitConverter.ToBoolean(buf, 0)},
25+
{typeof(sbyte), (buf) => unchecked((sbyte)buf[0])},
2526
{typeof(short), (buf) => BitConverter.ToInt16(buf, 0)},
2627
{typeof(ushort), (buf) => BitConverter.ToUInt16(buf, 0)},
2728
{typeof(int), (buf) => BitConverter.ToInt32(buf, 0)},
@@ -282,6 +283,7 @@ public static void SerializePrimitive(object arg, byte[] buffer, ref BufferUnit
282283
int next_offset = arg switch
283284
{
284285
bool argt => CopyBytes(BitConverter.GetBytes(argt), 0, buffer, offset.Bytes, 1),
286+
sbyte argt => CopyBytes(unchecked((byte)argt), buffer, offset.Bytes),
285287
short argt => CopyBytes(BitConverter.GetBytes(argt), 0, buffer, offset.Bytes, sizeof(short)),
286288
ushort argt => CopyBytes(BitConverter.GetBytes(argt), 0, buffer, offset.Bytes, sizeof(ushort)),
287289
uint argt => CopyBytes(BitConverter.GetBytes(argt), 0, buffer, offset.Bytes, sizeof(uint)),

csharp/tests/CompostRpc.UnitTests/SerializationTests.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public void BufferAllocationOverLimitTest()
2222
{
2323
{-1, 0, 4, [0xF0,0,0,0]},
2424
{-8, 0, 4, [0x80,0,0,0]},
25+
{(sbyte)-1, 0, 8, [0xFF,0,0,0]},
2526
{0xFU, 6, 4, [0x03,0xC0,0,0]},
2627
{0xFU, 1, 4, [0x78,0,0,0]},
2728
{0xFU, 0, 4, [0xF0,0,0,0]},
@@ -80,4 +81,46 @@ public void PackedEnumSerializationTest()
8081
offset = BufferUnit.Zero;
8182
Assert.ThrowsAny<OverflowException>(() => Serialization.SerializePackedPrimitive(Status.Fail, buffer, ref offset, size));
8283
}
84+
85+
public static TheoryData<object> SignedPrimitiveSerializationTestData
86+
{
87+
get
88+
{
89+
var data = new TheoryData<object>
90+
{
91+
(object)(sbyte)-128,
92+
(object)(sbyte)-1,
93+
(object)(sbyte)0,
94+
(object)(sbyte)127,
95+
(object)short.MinValue,
96+
(object)(short)-1,
97+
(object)(short)0,
98+
(object)short.MaxValue,
99+
(object)int.MinValue,
100+
(object)-1,
101+
(object)0,
102+
(object)int.MaxValue,
103+
(object)long.MinValue,
104+
(object)-1L,
105+
(object)0L,
106+
(object)long.MaxValue
107+
};
108+
return data;
109+
}
110+
}
111+
112+
[MemberData(nameof(SignedPrimitiveSerializationTestData))]
113+
[Theory]
114+
public void SignedPrimitiveSerializationTest(object value)
115+
{
116+
Type valueType = value.GetType();
117+
byte[] buffer = new byte[Serialization.GetTypeSize(valueType).Bytes];
118+
BufferUnit offset = BufferUnit.Zero;
119+
120+
Serialization.SerializePrimitive(value, buffer, ref offset);
121+
122+
offset = BufferUnit.Zero;
123+
object actual = Serialization.DeserializePrimitive(valueType, buffer, ref offset);
124+
Assert.Equal(value, actual);
125+
}
83126
}

0 commit comments

Comments
 (0)