Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 45 additions & 24 deletions src/devices/Mcp23xxx/tests/EnableDisableTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,21 @@ namespace Iot.Device.Mcp23xxx.Tests
{
public class EnableDisableTests : Mcp23xxxTest
{
private readonly GpioDriverMock _driverMock;
private readonly GpioController _gpioMock;

public EnableDisableTests()
{
_driverMock = new GpioDriverMock();
_gpioMock = new GpioController(_driverMock);
}

[Theory]
[MemberData(nameof(ResetTestDevices))]
public void InitialResetState(TestDevice testDevice)
{
_gpioMock.OpenPin(1, PinMode.Input);
Assert.Equal(PinValue.Low, _gpioMock.Read(1));
_gpioMock.SetPinMode(1, PinMode.Output);
GpioController gpioMock = testDevice.ResetController!;
GpioDriverMock driverMock = testDevice.ResetDriverMock!;

gpioMock.OpenPin(1, PinMode.Input);
Assert.Equal(PinValue.Low, gpioMock.Read(1));
gpioMock.SetPinMode(1, PinMode.Output);
testDevice.Device.Enable();
_gpioMock.SetPinMode(1, PinMode.Input);
Assert.Equal(PinValue.High, _gpioMock.Read(1));
_gpioMock.ClosePin(1);
_driverMock.Reset();
gpioMock.SetPinMode(1, PinMode.Input);
Assert.Equal(PinValue.High, gpioMock.Read(1));
gpioMock.ClosePin(1);
driverMock.Reset();
}

[Theory]
Expand Down Expand Up @@ -89,24 +83,51 @@ public static TheoryData<TestDevice> ResetTestDevices
{
TheoryData<TestDevice> devices = new TheoryData<TestDevice>();

// Create separate driver mock for each device to avoid parallel test issues
GpioDriverMock driverMock;
GpioController gpioController;

// Don't want to use the same bus mock for each
I2cDeviceMock i2c = new I2cDeviceMock(1);
devices.Add(new TestDevice(new Mcp23008(i2c, reset: 1, controller: new GpioController(_driverMock)), i2c.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23008(i2c, reset: 1, controller: gpioController), i2c.DeviceMock, driverMock, gpioController));

i2c = new I2cDeviceMock(1);
devices.Add(new TestDevice(new Mcp23009(i2c, reset: 1, controller: new GpioController(_driverMock)), i2c.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23009(i2c, reset: 1, controller: gpioController), i2c.DeviceMock, driverMock, gpioController));

i2c = new I2cDeviceMock(2);
devices.Add(new TestDevice(new Mcp23017(i2c, reset: 1, controller: new GpioController(_driverMock)), i2c.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23017(i2c, reset: 1, controller: gpioController), i2c.DeviceMock, driverMock, gpioController));

i2c = new I2cDeviceMock(2);
devices.Add(new TestDevice(new Mcp23018(i2c, reset: 1, controller: new GpioController(_driverMock)), i2c.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23018(i2c, reset: 1, controller: gpioController), i2c.DeviceMock, driverMock, gpioController));

SpiDeviceMock spi = new SpiDeviceMock(1);
devices.Add(new TestDevice(new Mcp23s08(spi, 0x20, reset: 1, controller: new GpioController(_driverMock)), spi.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23s08(spi, 0x20, reset: 1, controller: gpioController), spi.DeviceMock, driverMock, gpioController));

spi = new SpiDeviceMock(1);
devices.Add(new TestDevice(new Mcp23s09(spi, reset: 1, controller: new GpioController(_driverMock)), spi.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23s09(spi, reset: 1, controller: gpioController), spi.DeviceMock, driverMock, gpioController));

spi = new SpiDeviceMock(2);
devices.Add(new TestDevice(new Mcp23s17(spi, 0x20, reset: 1, controller: new GpioController(_driverMock)), spi.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23s17(spi, 0x20, reset: 1, controller: gpioController), spi.DeviceMock, driverMock, gpioController));

spi = new SpiDeviceMock(2);
devices.Add(new TestDevice(new Mcp23s18(spi, reset: 1, controller: new GpioController(_driverMock)), spi.DeviceMock));
driverMock = new GpioDriverMock();
gpioController = new GpioController(driverMock);
devices.Add(new TestDevice(new Mcp23s18(spi, reset: 1, controller: gpioController), spi.DeviceMock, driverMock, gpioController));

return devices;
}
}
Expand Down
21 changes: 21 additions & 0 deletions src/devices/Mcp23xxx/tests/Mcp23xxxTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,32 @@ public struct TestDevice
public Mcp23xxxChipMock ChipMock { get; }
public GpioController Controller { get; }

/// <summary>
/// Optional GpioDriverMock for tests that use reset pin functionality.
/// </summary>
public GpioDriverMock? ResetDriverMock { get; }

/// <summary>
/// Optional GpioController (backed by ResetDriverMock) for tests that use reset pin functionality.
/// </summary>
public GpioController? ResetController { get; }

public TestDevice(Mcp23xxx device, Mcp23xxxChipMock chipMock)
{
Device = device;
ChipMock = chipMock;
Controller = new GpioController(Device);
ResetDriverMock = null;
ResetController = null;
}

public TestDevice(Mcp23xxx device, Mcp23xxxChipMock chipMock, GpioDriverMock resetDriverMock, GpioController resetController)
{
Device = device;
ChipMock = chipMock;
Controller = new GpioController(Device);
ResetDriverMock = resetDriverMock;
ResetController = resetController;
}
}

Expand Down