gobot.io/x/gobot/v2@v2.1.0/drivers/spi/mcp3202_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 = (*MCP3202Driver)(nil)
    16  
    17  // must implement the AnalogReader interface
    18  var _ aio.AnalogReader = (*MCP3202Driver)(nil)
    19  
    20  func initTestMCP3202DriverWithStubbedAdaptor() (*MCP3202Driver, *spiTestAdaptor) {
    21  	a := newSpiTestAdaptor()
    22  	d := NewMCP3202Driver(a)
    23  	if err := d.Start(); err != nil {
    24  		panic(err)
    25  	}
    26  	return d, a
    27  }
    28  
    29  func TestNewMCP3202Driver(t *testing.T) {
    30  	var di interface{} = NewMCP3202Driver(newSpiTestAdaptor())
    31  	d, ok := di.(*MCP3202Driver)
    32  	if !ok {
    33  		t.Errorf("NewMCP3202Driver() should have returned a *MCP3202Driver")
    34  	}
    35  	gobottest.Refute(t, d.Driver, nil)
    36  	gobottest.Assert(t, strings.HasPrefix(d.Name(), "MCP3202"), true)
    37  }
    38  
    39  func TestMCP3202Read(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, 0xFF},
    54  			wantWritten: []byte{0x01, 0xA0, 0x00},
    55  			want:        0x0FFF,
    56  		},
    57  		"number_1_ok": {
    58  			chanNum:     1,
    59  			simRead:     []byte{0xFF, 0xFE, 0xFF},
    60  			wantWritten: []byte{0x01, 0xE0, 0x00},
    61  			want:        0x0EFF,
    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 := initTestMCP3202DriverWithStubbedAdaptor()
    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 TestMCP3202ReadWithError(t *testing.T) {
    84  	// arrange
    85  	d, a := initTestMCP3202DriverWithStubbedAdaptor()
    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  }