gobot.io/x/gobot/v2@v2.1.0/drivers/spi/mcp3002_test.go (about) 1 package spi 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "gobot.io/x/gobot/v2" 9 "gobot.io/x/gobot/v2/drivers/aio" 10 "gobot.io/x/gobot/v2/gobottest" 11 ) 12 13 // this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver 14 // and tests all implementations, so no further tests needed here for gobot.Driver interface 15 var _ gobot.Driver = (*MCP3002Driver)(nil) 16 17 // must implement the AnalogReader interface 18 var _ aio.AnalogReader = (*MCP3002Driver)(nil) 19 20 func initTestMCP3002DriverWithStubbedAdaptor() (*MCP3002Driver, *spiTestAdaptor) { 21 a := newSpiTestAdaptor() 22 d := NewMCP3002Driver(a) 23 if err := d.Start(); err != nil { 24 panic(err) 25 } 26 return d, a 27 } 28 29 func TestNewMCP3002Driver(t *testing.T) { 30 var di interface{} = NewMCP3002Driver(newSpiTestAdaptor()) 31 d, ok := di.(*MCP3002Driver) 32 if !ok { 33 t.Errorf("NewMCP3002Driver() should have returned a *MCP3002Driver") 34 } 35 gobottest.Refute(t, d.Driver, nil) 36 gobottest.Assert(t, strings.HasPrefix(d.Name(), "MCP3002"), true) 37 } 38 39 func TestMCP3002Read(t *testing.T) { 40 var tests = map[string]struct { 41 chanNum int 42 simRead []byte 43 want int 44 wantWritten []byte 45 wantErr error 46 }{ 47 "number_negative_error": { 48 chanNum: -1, 49 wantErr: fmt.Errorf("Invalid channel '-1' for read"), 50 }, 51 "number_0_ok": { 52 chanNum: 0, 53 simRead: []byte{0xFF, 0xFF}, 54 wantWritten: []byte{0x68, 0x00}, 55 want: 0x3FF, 56 }, 57 "number_1_ok": { 58 chanNum: 1, 59 simRead: []byte{0xF2, 0x22}, 60 wantWritten: []byte{0x78, 0x00}, 61 want: 0x222, 62 }, 63 "number_2_error": { 64 chanNum: 2, 65 wantErr: fmt.Errorf("Invalid channel '2' for read"), 66 }, 67 } 68 for name, tc := range tests { 69 t.Run(name, func(t *testing.T) { 70 // arrange 71 d, a := initTestMCP3002DriverWithStubbedAdaptor() 72 a.spi.SetSimRead(tc.simRead) 73 // act 74 got, err := d.Read(tc.chanNum) 75 // assert 76 gobottest.Assert(t, err, tc.wantErr) 77 gobottest.Assert(t, got, tc.want) 78 gobottest.Assert(t, a.spi.Written(), tc.wantWritten) 79 }) 80 } 81 } 82 83 func TestMCP3002ReadWithError(t *testing.T) { 84 // arrange 85 d, a := initTestMCP3002DriverWithStubbedAdaptor() 86 a.spi.SetReadError(true) 87 // act 88 got, err := d.Read(0) 89 // assert 90 gobottest.Assert(t, err, fmt.Errorf("error while SPI read in mock")) 91 gobottest.Assert(t, got, 0) 92 }