Skip to content

Commit

Permalink
Merge pull request #6 from Sander0542/tests/real-device
Browse files Browse the repository at this point in the history
Real Device Tests
  • Loading branch information
Sander0542 authored Aug 12, 2021
2 parents 9758db9 + 09d4e09 commit 8130ff5
Show file tree
Hide file tree
Showing 14 changed files with 263 additions and 34 deletions.
7 changes: 7 additions & 0 deletions Sander0542.CMLedController.sln
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sander0542.CMLedController.
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sander0542.CMLedController.Abstractions.Tests", "tests\Sander0542.CMLedController.Abstractions.Tests\Sander0542.CMLedController.Abstractions.Tests.csproj", "{D4AFD886-6AD9-4D33-91FA-85674F47C265}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sander0542.CMLedController.RealDevice.Tests", "tests\Sander0542.CMLedController.RealDevice.Tests\Sander0542.CMLedController.RealDevice.Tests.csproj", "{63854E6D-DE37-4E3E-B42C-2E1224B09D43}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -88,6 +90,10 @@ Global
{D4AFD886-6AD9-4D33-91FA-85674F47C265}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D4AFD886-6AD9-4D33-91FA-85674F47C265}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D4AFD886-6AD9-4D33-91FA-85674F47C265}.Release|Any CPU.Build.0 = Release|Any CPU
{63854E6D-DE37-4E3E-B42C-2E1224B09D43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{63854E6D-DE37-4E3E-B42C-2E1224B09D43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63854E6D-DE37-4E3E-B42C-2E1224B09D43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63854E6D-DE37-4E3E-B42C-2E1224B09D43}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{17AD0A8D-31E5-4EB5-A88D-4624BED47E4A} = {FF7A7245-5961-4C06-A2D8-339978F36A41}
Expand All @@ -101,5 +107,6 @@ Global
{3A0968BA-B9B8-407D-8C21-FD389EA8880C} = {2E69E693-5378-469D-B104-84203E1CE0BE}
{61554D47-F7D7-4438-958C-92C80276AA42} = {2E69E693-5378-469D-B104-84203E1CE0BE}
{D4AFD886-6AD9-4D33-91FA-85674F47C265} = {2E69E693-5378-469D-B104-84203E1CE0BE}
{63854E6D-DE37-4E3E-B42C-2E1224B09D43} = {2E69E693-5378-469D-B104-84203E1CE0BE}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public static void SetColor(this byte[] data, PacketOffset packetOffset, Color c
data[packetOffset + 1] = color.G;
data[packetOffset + 2] = color.B;
}

public static Color GetColor(this byte[] data, PacketOffset packetOffset)
{
return Color.FromArgb(
Expand Down Expand Up @@ -47,5 +47,30 @@ public static byte[] PreparePacket(this byte[] data)
}
return new byte[] { 0x00 }.Concat(newData).ToArray();
}

public static byte[] PrepareResponse(this byte[] data)
{
if (data.Length == Constants.PacketSize)
{
return data;
}

if (data.Length == Constants.PacketSize + 1 && data[0] == 0x00)
{
return data.TakeLast(Constants.PacketSize).ToArray();
}

if (data.Length > Constants.PacketSize)
{
throw new ArgumentOutOfRangeException(nameof(data), $"The data of the response cannot be greater than {Constants.PacketSize}");
}

var newData = data.ToList();
while (newData.Count < Constants.PacketSize)
{
newData.Add(0x00);
}
return newData.ToArray();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@ public LedControllerDevice(TDevice device)
Device = device;
}

protected abstract Task WriteAsync(byte[] data, CancellationToken token = default);

protected abstract Task<byte[]> WriteAndReadAsync(byte[] data, CancellationToken token = default);

protected async Task<byte[]> WriteAndReadDataAsync(byte[] data, CancellationToken token = default)
{
return (await WriteAndReadAsync(data.PreparePacket(), token)).PrepareResponse();
}

public abstract void Dispose();

public Mode Mode { get; private set; }
Expand Down Expand Up @@ -116,7 +119,7 @@ private async Task SendFlowControlAsync(byte flag, CancellationToken token = def
data[0] = OpCode.FlowControl;
data[1] = flag;

await WriteAsync(data.PreparePacket(), token);
await WriteAndReadDataAsync(data, token);
}

private async Task SendApplyAsync(CancellationToken token = default)
Expand All @@ -125,7 +128,7 @@ private async Task SendApplyAsync(CancellationToken token = default)
data[0] = OpCode.Unknown50;
data[1] = OpCodeType.Unknown55;

await WriteAsync(data.PreparePacket(), token);
await WriteAndReadDataAsync(data, token);
}

private async Task SendReadModeAsync(CancellationToken token = default)
Expand All @@ -134,7 +137,7 @@ private async Task SendReadModeAsync(CancellationToken token = default)
data[PacketOffset.Op] = OpCode.Read;
data[PacketOffset.Type] = OpCodeType.Mode;

var response = await WriteAndReadAsync(data.PreparePacket(), token);
var response = await WriteAndReadDataAsync(data, token);

Mode = response[PacketOffset.Mode];
}
Expand All @@ -146,7 +149,7 @@ private async Task SendSetModeAsync(Mode mode, CancellationToken token = default
data[PacketOffset.Type] = OpCodeType.Mode;
data[PacketOffset.Mode] = mode;

await WriteAsync(data.PreparePacket(), token);
await WriteAndReadDataAsync(data, token);
}

private async Task SendSetCustomColorsAsync(Color color1, Color color2, Color color3, Color color4, CancellationToken token = default)
Expand All @@ -165,7 +168,7 @@ private async Task SendSetCustomColorsAsync(Color color1, Color color2, Color co
data.SetColor(PacketOffset.MultipleColor3, color3);
data.SetColor(PacketOffset.MultipleColor4, color4);

await WriteAsync(data.PreparePacket(), token);
await WriteAndReadDataAsync(data, token);
}

private async Task SendReadCustomColorsAsync(CancellationToken token = default)
Expand All @@ -174,7 +177,7 @@ private async Task SendReadCustomColorsAsync(CancellationToken token = default)
data[PacketOffset.Op] = OpCode.Read;
data[PacketOffset.Type] = OpCodeType.LedInfo;

var response = await WriteAndReadAsync(data.PreparePacket(), token);
var response = await WriteAndReadDataAsync(data, token);

_port1Color = response.GetColor(PacketOffset.MultipleColor1);
_port2Color = response.GetColor(PacketOffset.MultipleColor2);
Expand Down Expand Up @@ -225,7 +228,7 @@ private async Task SendSetConfigAsync(Mode mode, byte speed, byte brightness, Co
}
}

await WriteAsync(data.PreparePacket(), token);
await WriteAndReadDataAsync(data, token);
}

private async Task SendReadConfigAsync(Mode mode, CancellationToken token = default)
Expand All @@ -235,7 +238,7 @@ private async Task SendReadConfigAsync(Mode mode, CancellationToken token = defa
data[PacketOffset.Type] = OpCodeType.ConfigFull;
data[PacketOffset.Mode] = mode;

var response = await WriteAndReadAsync(data.PreparePacket(), token);
var response = await WriteAndReadDataAsync(data, token);

Mode = mode;
Speed = response[PacketOffset.Speed];
Expand All @@ -251,7 +254,7 @@ private async Task SendCustomColorStartAsync(CancellationToken token = default)
data[PacketOffset.Op] = OpCode.Read;
data[PacketOffset.Type] = OpCodeType.Unknown30;

await WriteAsync(data.PreparePacket(), token);
await WriteAndReadDataAsync(data, token);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ public HidLibraryLedControllerDevice(HidDevice device) : base(device)
{
}

protected override async Task WriteAsync(byte[] data, CancellationToken token = default)
{
await Task.Run(() => Device.Write(data), token);
}

protected override async Task<byte[]> WriteAndReadAsync(byte[] data, CancellationToken token = default)
{
Device.Write(data);
Expand Down
5 changes: 0 additions & 5 deletions src/lib/Sander0542.CMLedController/LedControllerDevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,6 @@ public LedControllerDevice(IDevice device) : base(device)
{
}

protected override async Task WriteAsync(byte[] data, CancellationToken token = default)
{
await Device.WriteAsync(data, token);
}

protected override async Task<byte[]> WriteAndReadAsync(byte[] data, CancellationToken token = default)
{
return (await Device.WriteAndReadAsync(data, token)).Data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,33 @@ public void Call_PrepareData_TooShort_ReturnsRightSize()
Assert.Equal(Constants.PacketSize + 1, result.Length);
Assert.Equal(0x00, result[0]);
}

[Fact]
public void Call_PrepareResponse_ReturnsSame()
{
var data = new byte[Constants.PacketSize];

var result = data.PrepareResponse();

Assert.Same(data, result);
}

[Fact]
public void Call_PrepareResponse_TooLong_ThrowsError()
{
var data = new byte[Constants.PacketSize + 2];

Assert.Throws<ArgumentOutOfRangeException>(() => data.PrepareResponse());
}

[Fact]
public void Call_PrepareResponse_TooShort_ReturnsRightSize()
{
var data = new byte[Constants.PacketSize - 10];

var result = data.PrepareResponse();

Assert.Equal(Constants.PacketSize, result.Length);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public async Task Call_SetMode_SetsMode()
await controller.SetModeAsync(Mode.Breathing, Speed.None, 0xFF, Color.Red, Color.Blue);

Assert.Equal(Mode.Breathing, controller.Mode);
mockDevice.Verify(device => device.Write(It.IsAny<byte[]>()), Times.AtLeastOnce);
mockDevice.Verify(device => device.WriteAndRead(It.IsAny<byte[]>()), Times.AtLeastOnce);
}

[Fact]
Expand All @@ -31,7 +31,7 @@ public async Task Call_SetMode_SetsSpeed()
await controller.SetModeAsync(Mode.Breathing, Speed.BreathingFastest, 0xFF, Color.Red, Color.Blue);

Assert.Equal((byte)Speed.BreathingFastest, controller.Speed);
mockDevice.Verify(device => device.Write(It.IsAny<byte[]>()), Times.AtLeastOnce);
mockDevice.Verify(device => device.WriteAndRead(It.IsAny<byte[]>()), Times.AtLeastOnce);
}

[Fact]
Expand All @@ -43,7 +43,7 @@ public async Task Call_SetMode_SetsBrightness()
await controller.SetModeAsync(Mode.Breathing, Speed.None, 0xEF, Color.Red, Color.Blue);

Assert.Equal(0xEF, controller.Brightness);
mockDevice.Verify(device => device.Write(It.IsAny<byte[]>()), Times.AtLeastOnce);
mockDevice.Verify(device => device.WriteAndRead(It.IsAny<byte[]>()), Times.AtLeastOnce);
}

[Theory]
Expand All @@ -63,7 +63,7 @@ public async Task Call_SetMode_SetsColorMode(KnownColor knownColor1, KnownColor

Assert.Equal(color1, controller.GetModeColor(0));
Assert.Equal(color2, controller.GetModeColor(1));
mockDevice.Verify(device => device.Write(It.IsAny<byte[]>()), Times.AtLeastOnce);
mockDevice.Verify(device => device.WriteAndRead(It.IsAny<byte[]>()), Times.AtLeastOnce);
}

[Theory]
Expand All @@ -87,7 +87,7 @@ public async Task Call_SetMode_SetsPortColor(KnownColor knownColor1, KnownColor
Assert.Equal(color2, controller.GetPortColor(1));
Assert.Equal(color3, controller.GetPortColor(2));
Assert.Equal(color4, controller.GetPortColor(3));
mockDevice.Verify(device => device.Write(It.IsAny<byte[]>()), Times.AtLeastOnce);
mockDevice.Verify(device => device.WriteAndRead(It.IsAny<byte[]>()), Times.AtLeastOnce);
}

[Theory]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System;
using System.Linq;
using Xunit;

namespace Sander0542.CMLedController.RealDevice.Tests.Attributes
{
public sealed class IgnoreWhenNoDeviceFactAttribute : FactAttribute
{
public IgnoreWhenNoDeviceFactAttribute()
{
if (!LedControllerHelper.Present)
{
Skip = "This test requires at least one CoolerMaster RGB LED Controller installed";
}
}
}

public sealed class IgnoreWhenNoDeviceTheoryAttribute : TheoryAttribute
{
public IgnoreWhenNoDeviceTheoryAttribute()
{
if (!LedControllerHelper.Present)
{
Skip = "This test requires at least one CoolerMaster RGB LED Controller installed";
}
}
}

internal static class LedControllerHelper
{
internal static bool Present
{
get
{
try
{
return new LedControllerProvider().GetControllersAsync().Result.Any();
}
catch (Exception)
{

}

return false;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Sander0542.CMLedController.HidLibrary;
using Sander0542.CMLedController.Tests.Shared.Fixtures;

namespace Sander0542.CMLedController.RealDevice.Tests
{
public class HidLibraryLedControllerProviderTests : LedControllerProviderTests<HidLibraryLedControllerProvider>
{
public HidLibraryLedControllerProviderTests(LedControllerProviderFixture<HidLibraryLedControllerProvider> providerFixture) : base(providerFixture)
{
}
}
}
Loading

0 comments on commit 8130ff5

Please sign in to comment.