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  }