using SuiteLink.Client.Protocol; namespace SuiteLink.Client.Tests.Protocol; public sealed class SuiteLinkWriteCodecTests { [Fact] public void EncodeWrite_BooleanValue_WritesExpectedGoldenVector() { var bytes = SuiteLinkWriteCodec.Encode(0x12345678, SuiteLinkValue.FromBoolean(true)); byte[] expected = [0x09, 0x00, 0x0B, 0x08, 0x78, 0x56, 0x34, 0x12, 0x01, 0x01, 0xA5]; Assert.Equal(expected, bytes); Assert.Equal(0x0B, bytes[2]); Assert.Equal(0x08, bytes[3]); } [Fact] public void EncodeWrite_Int32Value_WritesExpectedPayload() { var bytes = SuiteLinkWriteCodec.Encode(0x89ABCDEF, SuiteLinkValue.FromInt32(42)); var frame = SuiteLinkFrameReader.ParseFrame(bytes); Assert.Equal(0x0B, bytes[2]); Assert.Equal(0x08, bytes[3]); Assert.Equal(SuiteLinkWriteCodec.PokeMessageType, frame.MessageType); Assert.Equal(0x89ABCDEFu, SuiteLinkEncoding.ReadUInt32LittleEndian(frame.Payload.Span)); Assert.Equal((byte)SuiteLinkWireValueType.Integer, frame.Payload.Span[4]); Assert.Equal(42, SuiteLinkEncoding.ReadInt32LittleEndian(frame.Payload.Span[5..])); } [Fact] public void EncodeWrite_Float32Value_WritesExpectedPayload() { var bytes = SuiteLinkWriteCodec.Encode(0x00000007, SuiteLinkValue.FromFloat32(12.5f)); var frame = SuiteLinkFrameReader.ParseFrame(bytes); Assert.Equal(0x0B, bytes[2]); Assert.Equal(0x08, bytes[3]); Assert.Equal((byte)SuiteLinkWireValueType.Real, frame.Payload.Span[4]); Assert.Equal(12.5f, SuiteLinkEncoding.ReadSingleLittleEndian(frame.Payload.Span[5..])); } [Fact] public void EncodeWrite_StringValue_WritesExpectedPayload() { var bytes = SuiteLinkWriteCodec.Encode(0x00000008, SuiteLinkValue.FromString("OK")); var frame = SuiteLinkFrameReader.ParseFrame(bytes); Assert.Equal(0x0B, bytes[2]); Assert.Equal(0x08, bytes[3]); Assert.Equal((byte)SuiteLinkWireValueType.Message, frame.Payload.Span[4]); Assert.Equal((ushort)2, SuiteLinkEncoding.ReadUInt16LittleEndian(frame.Payload.Span[5..])); Assert.Equal((byte)'O', frame.Payload.Span[7]); Assert.Equal((byte)'K', frame.Payload.Span[8]); } [Fact] public void EncodeWrite_NoneValue_ThrowsNotSupportedException() { var ex = Assert.Throws( () => SuiteLinkWriteCodec.Encode(0x00000001, default)); Assert.Contains("unsupported", ex.Message, StringComparison.OrdinalIgnoreCase); } }