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 }