using KeyOverlay.Core; using Xunit; namespace KeyOverlay.Core.Tests; public class LayerProtocolTests { [Fact] public void BuildRequest_Is32BytesWithCommandAndVersion() { var request = LayerProtocol.BuildRequest(); Assert.Equal(32, request.Length); Assert.Equal(0xE0, request[0]); Assert.Equal(0x01, request[1]); } [Fact] public void TryParse_ReadsLayerAndMasks() { var payload = new byte[32]; payload[0] = 0xE0; payload[1] = 0x01; payload[2] = 2; payload[3] = 0b0000_0101; // layer_state = layers 0 and 2 payload[7] = 0b0000_0001; // default_layer_state = layer 0 Assert.True(LayerProtocol.TryParse(payload, out var report)); Assert.Equal(2, report.HighestLayer); Assert.Equal(5u, report.LayerState); Assert.Equal(1u, report.DefaultLayerState); } [Fact] public void TryParse_ReadsLittleEndianMask() { var payload = new byte[32]; payload[0] = 0xE0; payload[1] = 0x01; payload[4] = 0x01; // bit 8 of layer_state Assert.True(LayerProtocol.TryParse(payload, out var report)); Assert.Equal(0x100u, report.LayerState); } [Fact] public void TryParse_RejectsUnhandledResponse() { var payload = new byte[32]; payload[0] = 0xFF; // old firmware: "unhandled" Assert.False(LayerProtocol.TryParse(payload, out _)); } [Fact] public void TryParse_RejectsUnknownProtocolVersion() { var payload = new byte[32]; payload[0] = 0xE0; payload[1] = 0x7F; Assert.False(LayerProtocol.TryParse(payload, out _)); } [Fact] public void TryParse_RejectsShortPayload() => Assert.False(LayerProtocol.TryParse(new byte[5], out _)); }