gobot.io/x/gobot/v2@v2.1.0/drivers/i2c/ssd1306_driver_test.go (about) 1 package i2c 2 3 import ( 4 "errors" 5 "fmt" 6 "image" 7 "reflect" 8 "strings" 9 "testing" 10 11 "gobot.io/x/gobot/v2" 12 "gobot.io/x/gobot/v2/gobottest" 13 ) 14 15 // this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver 16 // and tests all implementations, so no further tests needed here for gobot.Driver interface 17 var _ gobot.Driver = (*SSD1306Driver)(nil) 18 19 func initTestSSD1306DriverWithStubbedAdaptor(width, height int, externalVCC bool) (*SSD1306Driver, *i2cTestAdaptor) { 20 a := newI2cTestAdaptor() 21 d := NewSSD1306Driver(a, WithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC)) 22 if err := d.Start(); err != nil { 23 panic(err) 24 } 25 return d, a 26 } 27 28 func TestNewSSD1306Driver(t *testing.T) { 29 var di interface{} = NewSSD1306Driver(newI2cTestAdaptor()) 30 d, ok := di.(*SSD1306Driver) 31 if !ok { 32 t.Errorf("new should have returned a *SSD1306Driver") 33 } 34 gobottest.Refute(t, d.Driver, nil) 35 gobottest.Assert(t, strings.HasPrefix(d.Name(), "SSD1306"), true) 36 gobottest.Assert(t, d.defaultAddress, 0x3c) 37 } 38 39 func TestSSD1306StartDefault(t *testing.T) { 40 const ( 41 width = 128 42 height = 64 43 externalVCC = false 44 ) 45 d := NewSSD1306Driver(newI2cTestAdaptor(), 46 WithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC)) 47 gobottest.Assert(t, d.Start(), nil) 48 } 49 50 func TestSSD1306Start128x32(t *testing.T) { 51 const ( 52 width = 128 53 height = 32 54 externalVCC = false 55 ) 56 d := NewSSD1306Driver(newI2cTestAdaptor(), 57 WithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC)) 58 gobottest.Assert(t, d.Start(), nil) 59 } 60 61 func TestSSD1306Start96x16(t *testing.T) { 62 const ( 63 width = 96 64 height = 16 65 externalVCC = false 66 ) 67 d := NewSSD1306Driver(newI2cTestAdaptor(), 68 WithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC)) 69 gobottest.Assert(t, d.Start(), nil) 70 } 71 72 func TestSSD1306StartExternalVCC(t *testing.T) { 73 const ( 74 width = 128 75 height = 32 76 externalVCC = true 77 ) 78 d := NewSSD1306Driver(newI2cTestAdaptor(), 79 WithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC)) 80 gobottest.Assert(t, d.Start(), nil) 81 } 82 83 func TestSSD1306StartSizeError(t *testing.T) { 84 const ( 85 width = 128 86 height = 54 87 externalVCC = false 88 ) 89 d := NewSSD1306Driver(newI2cTestAdaptor(), 90 WithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC)) 91 gobottest.Assert(t, d.Start(), errors.New("128x54 resolution is unsupported, supported resolutions: 128x64, 128x32, 96x16")) 92 } 93 94 func TestSSD1306Halt(t *testing.T) { 95 s, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 96 gobottest.Assert(t, s.Halt(), nil) 97 } 98 99 func TestSSD1306Options(t *testing.T) { 100 s := NewSSD1306Driver(newI2cTestAdaptor(), WithBus(2), WithSSD1306DisplayHeight(32), WithSSD1306DisplayWidth(128)) 101 gobottest.Assert(t, s.GetBusOrDefault(1), 2) 102 gobottest.Assert(t, s.displayHeight, 32) 103 gobottest.Assert(t, s.displayWidth, 128) 104 } 105 106 func TestSSD1306Display(t *testing.T) { 107 s, _ := initTestSSD1306DriverWithStubbedAdaptor(96, 16, false) 108 s.Start() 109 gobottest.Assert(t, s.Display(), nil) 110 } 111 112 func TestSSD1306ShowImage(t *testing.T) { 113 s, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 114 s.Start() 115 img := image.NewRGBA(image.Rect(0, 0, 640, 480)) 116 gobottest.Assert(t, s.ShowImage(img), errors.New("image must match display width and height: 128x64")) 117 118 img = image.NewRGBA(image.Rect(0, 0, 128, 64)) 119 gobottest.Assert(t, s.ShowImage(img), nil) 120 } 121 122 func TestSSD1306Command(t *testing.T) { 123 s, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 124 s.Start() 125 126 a.i2cWriteImpl = func(got []byte) (int, error) { 127 expected := []byte{0x80, 0xFF} 128 if !reflect.DeepEqual(got, expected) { 129 t.Logf("sequence error, got %+v, expected %+v", got, expected) 130 return 0, fmt.Errorf("oops") 131 } 132 return 0, nil 133 } 134 err := s.command(0xFF) 135 gobottest.Assert(t, err, nil) 136 } 137 138 func TestSSD1306Commands(t *testing.T) { 139 s, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 140 s.Start() 141 142 a.i2cWriteImpl = func(got []byte) (int, error) { 143 expected := []byte{0x80, 0x00, 0x80, 0xFF} 144 if !reflect.DeepEqual(got, expected) { 145 t.Logf("sequence error, got %+v, expected %+v", got, expected) 146 return 0, fmt.Errorf("oops") 147 } 148 return 0, nil 149 } 150 err := s.commands([]byte{0x00, 0xFF}) 151 gobottest.Assert(t, err, nil) 152 } 153 154 func TestSSD1306On(t *testing.T) { 155 s, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 156 s.Start() 157 158 a.i2cWriteImpl = func(got []byte) (int, error) { 159 expected := []byte{0x80, ssd1306SetDisplayOn} 160 if !reflect.DeepEqual(got, expected) { 161 t.Logf("sequence error, got %+v, expected %+v", got, expected) 162 return 0, fmt.Errorf("oops") 163 } 164 return 0, nil 165 } 166 err := s.On() 167 gobottest.Assert(t, err, nil) 168 } 169 170 func TestSSD1306Off(t *testing.T) { 171 s, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 172 s.Start() 173 174 a.i2cWriteImpl = func(got []byte) (int, error) { 175 expected := []byte{0x80, ssd1306SetDisplayOff} 176 if !reflect.DeepEqual(got, expected) { 177 t.Logf("sequence error, got %+v, expected %+v", got, expected) 178 return 0, fmt.Errorf("oops") 179 } 180 return 0, nil 181 } 182 err := s.Off() 183 gobottest.Assert(t, err, nil) 184 } 185 186 func TestSSD1306Reset(t *testing.T) { 187 s, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 188 s.Start() 189 190 a.i2cWriteImpl = func(got []byte) (int, error) { 191 expectedOff := []byte{0x80, ssd1306SetDisplayOff} 192 expectedOn := []byte{0x80, ssd1306SetDisplayOn} 193 if !reflect.DeepEqual(got, expectedOff) && !reflect.DeepEqual(got, expectedOn) { 194 t.Logf("sequence error, got %+v, expected: %+v or %+v", got, expectedOff, expectedOn) 195 return 0, fmt.Errorf("oops") 196 } 197 return 0, nil 198 } 199 err := s.Reset() 200 gobottest.Assert(t, err, nil) 201 } 202 203 // COMMANDS 204 205 func TestSSD1306CommandsDisplay(t *testing.T) { 206 s, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 207 result := s.Command("Display")(map[string]interface{}{}) 208 gobottest.Assert(t, result.(map[string]interface{})["err"], nil) 209 } 210 211 func TestSSD1306CommandsOn(t *testing.T) { 212 s, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 213 214 result := s.Command("On")(map[string]interface{}{}) 215 gobottest.Assert(t, result.(map[string]interface{})["err"], nil) 216 } 217 218 func TestSSD1306CommandsOff(t *testing.T) { 219 s, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 220 221 result := s.Command("Off")(map[string]interface{}{}) 222 gobottest.Assert(t, result.(map[string]interface{})["err"], nil) 223 } 224 225 func TestSSD1306CommandsClear(t *testing.T) { 226 s, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 227 228 result := s.Command("Clear")(map[string]interface{}{}) 229 gobottest.Assert(t, result.(map[string]interface{})["err"], nil) 230 } 231 232 func TestSSD1306CommandsSetContrast(t *testing.T) { 233 s, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 234 a.i2cWriteImpl = func(got []byte) (int, error) { 235 expected := []byte{0x80, ssd1306SetContrast, 0x80, 0x10} 236 if !reflect.DeepEqual(got, expected) { 237 t.Logf("sequence error, got %+v, expected %+v", got, expected) 238 return 0, fmt.Errorf("oops") 239 } 240 return 0, nil 241 } 242 243 result := s.Command("SetContrast")(map[string]interface{}{ 244 "contrast": byte(0x10), 245 }) 246 gobottest.Assert(t, result.(map[string]interface{})["err"], nil) 247 } 248 249 func TestSSD1306CommandsSet(t *testing.T) { 250 s, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false) 251 252 gobottest.Assert(t, s.buffer.buffer[0], byte(0)) 253 s.Command("Set")(map[string]interface{}{ 254 "x": int(0), 255 "y": int(0), 256 "c": int(1), 257 }) 258 gobottest.Assert(t, s.buffer.buffer[0], byte(1)) 259 } 260 261 func TestDisplayBuffer(t *testing.T) { 262 width := 128 263 height := 64 264 size := 1024 // (width*height) / 8 265 display := NewDisplayBuffer(width, height, 8) 266 267 if display.Size() != size { 268 t.Errorf("invalid Size() (%d, expected %d)", 269 display.Size(), size) 270 } 271 if len(display.buffer) != size { 272 t.Errorf("allocated buffer size invalid (%d, expected %d)", 273 len(display.buffer), size) 274 } 275 276 gobottest.Assert(t, display.buffer[0], byte(0)) 277 gobottest.Assert(t, display.buffer[1], byte(0)) 278 279 display.SetPixel(0, 0, 1) 280 display.SetPixel(1, 0, 1) 281 display.SetPixel(2, 0, 1) 282 display.SetPixel(0, 1, 1) 283 gobottest.Assert(t, display.buffer[0], byte(3)) 284 gobottest.Assert(t, display.buffer[1], byte(1)) 285 286 display.SetPixel(0, 1, 0) 287 gobottest.Assert(t, display.buffer[0], byte(1)) 288 gobottest.Assert(t, display.buffer[1], byte(1)) 289 }