gobot.io/x/gobot/v2@v2.1.0/drivers/i2c/adafruit1109_driver_test.go (about)

     1  package i2c
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  
     9  	"gobot.io/x/gobot/v2"
    10  	"gobot.io/x/gobot/v2/gobottest"
    11  )
    12  
    13  var _ gobot.Driver = (*Adafruit1109Driver)(nil)
    14  
    15  func initTestAdafruit1109WithStubbedAdaptor() (*Adafruit1109Driver, *i2cTestAdaptor) {
    16  	adaptor := newI2cTestAdaptor()
    17  	return NewAdafruit1109Driver(adaptor), adaptor
    18  }
    19  
    20  func TestNewAdafruit1109Driver(t *testing.T) {
    21  	var di interface{} = NewAdafruit1109Driver(newI2cTestAdaptor())
    22  	d, ok := di.(*Adafruit1109Driver)
    23  	if !ok {
    24  		t.Errorf("NewAdafruit1109Driver() should have returned a *Adafruit1109Driver")
    25  	}
    26  	gobottest.Refute(t, d.Driver, nil)
    27  	gobottest.Refute(t, d.Connection(), nil)
    28  	gobottest.Assert(t, strings.HasPrefix(d.Name(), "Adafruit1109"), true)
    29  	gobottest.Assert(t, strings.Contains(d.Name(), "MCP23017"), true)
    30  	gobottest.Assert(t, strings.Contains(d.Name(), "HD44780"), true)
    31  	gobottest.Refute(t, d.MCP23017Driver, nil)
    32  	gobottest.Refute(t, d.HD44780Driver, nil)
    33  	gobottest.Refute(t, d.redPin, nil)
    34  	gobottest.Refute(t, d.greenPin, nil)
    35  	gobottest.Refute(t, d.bluePin, nil)
    36  	gobottest.Refute(t, d.selectPin, nil)
    37  	gobottest.Refute(t, d.upPin, nil)
    38  	gobottest.Refute(t, d.downPin, nil)
    39  	gobottest.Refute(t, d.leftPin, nil)
    40  	gobottest.Refute(t, d.rightPin, nil)
    41  	gobottest.Refute(t, d.rwPin, nil)
    42  	gobottest.Refute(t, d.rsPin, nil)
    43  	gobottest.Refute(t, d.enPin, nil)
    44  	gobottest.Refute(t, d.dataPinD4, nil)
    45  	gobottest.Refute(t, d.dataPinD5, nil)
    46  	gobottest.Refute(t, d.dataPinD6, nil)
    47  	gobottest.Refute(t, d.dataPinD7, nil)
    48  }
    49  
    50  func TestAdafruit1109Connect(t *testing.T) {
    51  	d, _ := initTestAdafruit1109WithStubbedAdaptor()
    52  	gobottest.Assert(t, d.Connect(), nil)
    53  }
    54  
    55  func TestAdafruit1109Finalize(t *testing.T) {
    56  	d, _ := initTestAdafruit1109WithStubbedAdaptor()
    57  	gobottest.Assert(t, d.Finalize(), nil)
    58  }
    59  
    60  func TestAdafruit1109SetName(t *testing.T) {
    61  	d, _ := initTestAdafruit1109WithStubbedAdaptor()
    62  	d.SetName("foo")
    63  	gobottest.Assert(t, d.name, "foo")
    64  }
    65  
    66  func TestAdafruit1109Start(t *testing.T) {
    67  	d, _ := initTestAdafruit1109WithStubbedAdaptor()
    68  	gobottest.Assert(t, d.Start(), nil)
    69  }
    70  
    71  func TestAdafruit1109StartWriteErr(t *testing.T) {
    72  	d, adaptor := initTestAdafruit1109WithStubbedAdaptor()
    73  	adaptor.i2cWriteImpl = func([]byte) (int, error) {
    74  		return 0, errors.New("write error")
    75  	}
    76  	gobottest.Assert(t, d.Start(), errors.New("write error"))
    77  }
    78  
    79  func TestAdafruit1109StartReadErr(t *testing.T) {
    80  	d, adaptor := initTestAdafruit1109WithStubbedAdaptor()
    81  	adaptor.i2cReadImpl = func([]byte) (int, error) {
    82  		return 0, errors.New("read error")
    83  	}
    84  	gobottest.Assert(t, d.Start(), errors.New("MCP write-read: MCP write-ReadByteData(reg=0): read error"))
    85  }
    86  
    87  func TestAdafruit1109Halt(t *testing.T) {
    88  	d, _ := initTestAdafruit1109WithStubbedAdaptor()
    89  	d.Start()
    90  	gobottest.Assert(t, d.Halt(), nil)
    91  }
    92  
    93  func TestAdafruit1109DigitalRead(t *testing.T) {
    94  	var tests = map[string]struct {
    95  		read    uint8
    96  		wantReg uint8
    97  	}{
    98  		"A_0": {read: 0x01, wantReg: 0x12},
    99  		"A_1": {read: 0x02, wantReg: 0x12},
   100  		"A_2": {read: 0x04, wantReg: 0x12},
   101  		"A_3": {read: 0x08, wantReg: 0x12},
   102  		"A_4": {read: 0x10, wantReg: 0x12},
   103  		"A_5": {read: 0x20, wantReg: 0x12},
   104  		"A_6": {read: 0x40, wantReg: 0x12},
   105  		"A_7": {read: 0x80, wantReg: 0x12},
   106  		"B_0": {read: 0x01, wantReg: 0x13},
   107  		"B_1": {read: 0x02, wantReg: 0x13},
   108  		"B_2": {read: 0x04, wantReg: 0x13},
   109  		"B_3": {read: 0x08, wantReg: 0x13},
   110  		"B_4": {read: 0x10, wantReg: 0x13},
   111  		"B_5": {read: 0x20, wantReg: 0x13},
   112  		"B_6": {read: 0x40, wantReg: 0x13},
   113  		"B_7": {read: 0x80, wantReg: 0x13},
   114  	}
   115  	for name, tc := range tests {
   116  		t.Run(name, func(t *testing.T) {
   117  			// arrange
   118  			d, a := initTestAdafruit1109WithStubbedAdaptor()
   119  			d.Start()
   120  			a.written = []byte{} // reset writes of Start() and former test
   121  			// arrange reads
   122  			numCallsRead := 0
   123  			a.i2cReadImpl = func(b []byte) (int, error) {
   124  				numCallsRead++
   125  				b[0] = tc.read
   126  				return len(b), nil
   127  			}
   128  			// act
   129  			got, err := d.DigitalRead(name)
   130  			// assert
   131  			gobottest.Assert(t, err, nil)
   132  			gobottest.Assert(t, numCallsRead, 1)
   133  			gobottest.Assert(t, len(a.written), 1)
   134  			gobottest.Assert(t, a.written[0], tc.wantReg)
   135  			gobottest.Assert(t, got, 1)
   136  		})
   137  	}
   138  }
   139  
   140  func TestAdafruit1109SelectButton(t *testing.T) {
   141  	var tests = map[string]struct {
   142  		read uint8
   143  		want uint8
   144  	}{
   145  		"A0_not_pressed": {read: 0xFE, want: 0},
   146  		"A0_pressed":     {read: 0x01, want: 1},
   147  	}
   148  	for name, tc := range tests {
   149  		t.Run(name, func(t *testing.T) {
   150  			// arrange
   151  			d, a := initTestAdafruit1109WithStubbedAdaptor()
   152  			d.Start()
   153  			// arrange reads
   154  			numCallsRead := 0
   155  			a.i2cReadImpl = func(b []byte) (int, error) {
   156  				numCallsRead++
   157  				b[0] = tc.read
   158  				return len(b), nil
   159  			}
   160  			// act
   161  			got, err := d.SelectButton()
   162  			// assert
   163  			gobottest.Assert(t, err, nil)
   164  			gobottest.Assert(t, numCallsRead, 1)
   165  			gobottest.Assert(t, got, tc.want)
   166  		})
   167  	}
   168  }
   169  
   170  func TestAdafruit1109UpButton(t *testing.T) {
   171  	var tests = map[string]struct {
   172  		read uint8
   173  		want uint8
   174  	}{
   175  		"A3_not_pressed": {read: 0xF7, want: 0},
   176  		"A3_pressed":     {read: 0x08, want: 1},
   177  	}
   178  	for name, tc := range tests {
   179  		t.Run(name, func(t *testing.T) {
   180  			// arrange
   181  			d, a := initTestAdafruit1109WithStubbedAdaptor()
   182  			d.Start()
   183  			// arrange reads
   184  			numCallsRead := 0
   185  			a.i2cReadImpl = func(b []byte) (int, error) {
   186  				numCallsRead++
   187  				b[0] = tc.read
   188  				return len(b), nil
   189  			}
   190  			// act
   191  			got, err := d.UpButton()
   192  			// assert
   193  			gobottest.Assert(t, err, nil)
   194  			gobottest.Assert(t, numCallsRead, 1)
   195  			gobottest.Assert(t, got, tc.want)
   196  		})
   197  	}
   198  }
   199  
   200  func TestAdafruit1109DownButton(t *testing.T) {
   201  	var tests = map[string]struct {
   202  		read uint8
   203  		want uint8
   204  	}{
   205  		"A2_not_pressed": {read: 0xFB, want: 0},
   206  		"A2_pressed":     {read: 0x04, want: 1},
   207  	}
   208  	for name, tc := range tests {
   209  		t.Run(name, func(t *testing.T) {
   210  			// arrange
   211  			d, a := initTestAdafruit1109WithStubbedAdaptor()
   212  			d.Start()
   213  			// arrange reads
   214  			numCallsRead := 0
   215  			a.i2cReadImpl = func(b []byte) (int, error) {
   216  				numCallsRead++
   217  				b[0] = tc.read
   218  				return len(b), nil
   219  			}
   220  			// act
   221  			got, err := d.DownButton()
   222  			// assert
   223  			gobottest.Assert(t, err, nil)
   224  			gobottest.Assert(t, numCallsRead, 1)
   225  			gobottest.Assert(t, got, tc.want)
   226  		})
   227  	}
   228  }
   229  
   230  func TestAdafruit1109LeftButton(t *testing.T) {
   231  	var tests = map[string]struct {
   232  		read uint8
   233  		want uint8
   234  	}{
   235  		"A4_not_pressed": {read: 0xEF, want: 0},
   236  		"A4_pressed":     {read: 0x10, want: 1},
   237  	}
   238  	for name, tc := range tests {
   239  		t.Run(name, func(t *testing.T) {
   240  			// arrange
   241  			d, a := initTestAdafruit1109WithStubbedAdaptor()
   242  			d.Start()
   243  			// arrange reads
   244  			numCallsRead := 0
   245  			a.i2cReadImpl = func(b []byte) (int, error) {
   246  				numCallsRead++
   247  				b[0] = tc.read
   248  				return len(b), nil
   249  			}
   250  			// act
   251  			got, err := d.LeftButton()
   252  			// assert
   253  			gobottest.Assert(t, err, nil)
   254  			gobottest.Assert(t, numCallsRead, 1)
   255  			gobottest.Assert(t, got, tc.want)
   256  		})
   257  	}
   258  }
   259  
   260  func TestAdafruit1109RightButton(t *testing.T) {
   261  	var tests = map[string]struct {
   262  		read uint8
   263  		want uint8
   264  	}{
   265  		"A1_not_pressed": {read: 0xFD, want: 0},
   266  		"A1_pressed":     {read: 0x02, want: 1},
   267  	}
   268  	for name, tc := range tests {
   269  		t.Run(name, func(t *testing.T) {
   270  			// arrange
   271  			d, a := initTestAdafruit1109WithStubbedAdaptor()
   272  			d.Start()
   273  			// arrange reads
   274  			numCallsRead := 0
   275  			a.i2cReadImpl = func(b []byte) (int, error) {
   276  				numCallsRead++
   277  				b[0] = tc.read
   278  				return len(b), nil
   279  			}
   280  			// act
   281  			got, err := d.RightButton()
   282  			// assert
   283  			gobottest.Assert(t, err, nil)
   284  			gobottest.Assert(t, numCallsRead, 1)
   285  			gobottest.Assert(t, got, tc.want)
   286  		})
   287  	}
   288  }
   289  
   290  func TestAdafruit1109_parseID(t *testing.T) {
   291  	// arrange
   292  	ports := []string{"A", "B"}
   293  	for _, port := range ports {
   294  		for pin := uint8(0); pin <= 7; pin++ {
   295  			id := fmt.Sprintf("%s_%d", port, pin)
   296  			t.Run(id, func(t *testing.T) {
   297  				// act
   298  				got := adafruit1109ParseID(id)
   299  				// assert
   300  				gobottest.Assert(t, got, adafruit1109PortPin{port, pin})
   301  			})
   302  		}
   303  	}
   304  }