using SuiteLink.Client.Protocol; namespace SuiteLink.Client.Tests.Protocol; public sealed class SuiteLinkSubscriptionCodecTests { [Fact] public void EncodeAdvise_WritesExpectedGoldenVectorWithCallerTagId() { var bytes = SuiteLinkSubscriptionCodec.EncodeAdvise(0x11223344, "A"); var frame = SuiteLinkFrameReader.ParseFrame(bytes); byte[] expected = [0x0A, 0x00, 0x10, 0x80, 0x44, 0x33, 0x22, 0x11, 0x01, 0x41, 0x00, 0xA5]; Assert.Equal(expected, bytes); Assert.Equal(0x10, bytes[2]); Assert.Equal(0x80, bytes[3]); Assert.Equal(SuiteLinkSubscriptionCodec.AdviseMessageType, frame.MessageType); Assert.Equal(0x11223344u, SuiteLinkEncoding.ReadUInt32LittleEndian(frame.Payload.Span[..4])); } [Fact] public void EncodeAdviseWithoutTagId_UsesExplicitDefaultTagIdOfZero() { var bytes = SuiteLinkSubscriptionCodec.EncodeAdvise("Pump001.Run"); var frame = SuiteLinkFrameReader.ParseFrame(bytes); Assert.Equal(0u, SuiteLinkEncoding.ReadUInt32LittleEndian(frame.Payload.Span[..4])); } [Fact] public void EncodeUnadvise_WritesExpectedGoldenVector() { var bytes = SuiteLinkSubscriptionCodec.EncodeUnadvise(0x78563412); var frame = SuiteLinkFrameReader.ParseFrame(bytes); byte[] expected = [0x07, 0x00, 0x04, 0x80, 0x12, 0x34, 0x56, 0x78, 0xA5]; Assert.Equal(expected, bytes); Assert.Equal(0x04, bytes[2]); Assert.Equal(0x80, bytes[3]); Assert.Equal(SuiteLinkSubscriptionCodec.UnadviseMessageType, frame.MessageType); Assert.Equal(4, frame.Payload.Length); Assert.Equal(0x78563412u, SuiteLinkEncoding.ReadUInt32LittleEndian(frame.Payload.Span)); } [Fact] public void DecodeAdviseAck_ParsesTagIdFromFixedVector() { // remaining=0x0008, type=0x0003, payload={tag_id=0x78563412, unknown=0x00}, marker=0xA5 byte[] frame = [0x08, 0x00, 0x03, 0x00, 0x12, 0x34, 0x56, 0x78, 0x00, 0xA5]; var ack = SuiteLinkSubscriptionCodec.DecodeAdviseAck(frame); Assert.Equal(0x78563412u, ack.TagId); } [Fact] public void DecodeAdviseAckMany_ParsesTwoAckItems() { // remaining=0x000D, type=0x0003, payload={item1,item2}, marker=0xA5 byte[] frame = [ 0x0D, 0x00, 0x03, 0x00, 0x12, 0x34, 0x56, 0x78, 0x00, 0xAA, 0xBB, 0xCC, 0xDD, 0x01, 0xA5 ]; var acks = SuiteLinkSubscriptionCodec.DecodeAdviseAckMany(frame); Assert.Equal(2, acks.Count); Assert.Equal(0x78563412u, acks[0].TagId); Assert.Equal(0xDDCCBBAAu, acks[1].TagId); } }