gobot.io/x/gobot@v1.16.0/drivers/i2c/bmp180_driver_test.go (about)

     1  package i2c
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"errors"
     7  	"testing"
     8  	"time"
     9  
    10  	"gobot.io/x/gobot"
    11  	"gobot.io/x/gobot/gobottest"
    12  )
    13  
    14  var _ gobot.Driver = (*BMP180Driver)(nil)
    15  
    16  // --------- HELPERS
    17  func initTestBMP180Driver() (driver *BMP180Driver) {
    18  	driver, _ = initTestBMP180DriverWithStubbedAdaptor()
    19  	return
    20  }
    21  
    22  func initTestBMP180DriverWithStubbedAdaptor() (*BMP180Driver, *i2cTestAdaptor) {
    23  	adaptor := newI2cTestAdaptor()
    24  	return NewBMP180Driver(adaptor), adaptor
    25  }
    26  
    27  // --------- TESTS
    28  
    29  func TestNewBMP180Driver(t *testing.T) {
    30  	// Does it return a pointer to an instance of BMP180Driver?
    31  	var bmp180 interface{} = NewBMP180Driver(newI2cTestAdaptor())
    32  	_, ok := bmp180.(*BMP180Driver)
    33  	if !ok {
    34  		t.Errorf("NewBMP180Driver() should have returned a *BMP180Driver")
    35  	}
    36  }
    37  
    38  func TestBMP180Driver(t *testing.T) {
    39  	bmp180 := initTestBMP180Driver()
    40  	gobottest.Refute(t, bmp180.Connection(), nil)
    41  }
    42  
    43  func TestBMP180DriverStart(t *testing.T) {
    44  	bmp180, _ := initTestBMP180DriverWithStubbedAdaptor()
    45  	gobottest.Assert(t, bmp180.Start(), nil)
    46  }
    47  
    48  func TestBMP180StartConnectError(t *testing.T) {
    49  	d, adaptor := initTestBMP180DriverWithStubbedAdaptor()
    50  	adaptor.Testi2cConnectErr(true)
    51  	gobottest.Assert(t, d.Start(), errors.New("Invalid i2c connection"))
    52  }
    53  
    54  func TestBMP180DriverStartWriteError(t *testing.T) {
    55  	bmp180, adaptor := initTestBMP180DriverWithStubbedAdaptor()
    56  	adaptor.i2cWriteImpl = func([]byte) (int, error) {
    57  		return 0, errors.New("write error")
    58  	}
    59  	gobottest.Assert(t, bmp180.Start(), errors.New("write error"))
    60  }
    61  
    62  func TestBMP180DriverHalt(t *testing.T) {
    63  	bmp180 := initTestBMP180Driver()
    64  
    65  	gobottest.Assert(t, bmp180.Halt(), nil)
    66  }
    67  
    68  func TestBMP180DriverMeasurements(t *testing.T) {
    69  	bmp180, adaptor := initTestBMP180DriverWithStubbedAdaptor()
    70  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
    71  		buf := new(bytes.Buffer)
    72  		// Values from the datasheet example.
    73  		if adaptor.written[len(adaptor.written)-1] == bmp180RegisterAC1MSB {
    74  			binary.Write(buf, binary.BigEndian, int16(408))
    75  			binary.Write(buf, binary.BigEndian, int16(-72))
    76  			binary.Write(buf, binary.BigEndian, int16(-14383))
    77  			binary.Write(buf, binary.BigEndian, uint16(32741))
    78  			binary.Write(buf, binary.BigEndian, uint16(32757))
    79  			binary.Write(buf, binary.BigEndian, uint16(23153))
    80  			binary.Write(buf, binary.BigEndian, int16(6190))
    81  			binary.Write(buf, binary.BigEndian, int16(4))
    82  			binary.Write(buf, binary.BigEndian, int16(-32768))
    83  			binary.Write(buf, binary.BigEndian, int16(-8711))
    84  			binary.Write(buf, binary.BigEndian, int16(2868))
    85  		} else if adaptor.written[len(adaptor.written)-2] == bmp180CmdTemp && adaptor.written[len(adaptor.written)-1] == bmp180RegisterTempMSB {
    86  			binary.Write(buf, binary.BigEndian, int16(27898))
    87  		} else if adaptor.written[len(adaptor.written)-2] == bmp180CmdPressure && adaptor.written[len(adaptor.written)-1] == bmp180RegisterPressureMSB {
    88  			binary.Write(buf, binary.BigEndian, int16(23843))
    89  			// XLSB, not used in this test.
    90  			buf.WriteByte(0)
    91  		}
    92  		copy(b, buf.Bytes())
    93  		return buf.Len(), nil
    94  	}
    95  	bmp180.Start()
    96  	temp, err := bmp180.Temperature()
    97  	gobottest.Assert(t, err, nil)
    98  	gobottest.Assert(t, temp, float32(15.0))
    99  	pressure, err := bmp180.Pressure()
   100  	gobottest.Assert(t, err, nil)
   101  	gobottest.Assert(t, pressure, float32(69964))
   102  }
   103  
   104  func TestBMP180DriverTemperatureError(t *testing.T) {
   105  	bmp180, adaptor := initTestBMP180DriverWithStubbedAdaptor()
   106  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
   107  		buf := new(bytes.Buffer)
   108  		// Values from the datasheet example.
   109  		if adaptor.written[len(adaptor.written)-1] == bmp180RegisterAC1MSB {
   110  			binary.Write(buf, binary.BigEndian, int16(408))
   111  			binary.Write(buf, binary.BigEndian, int16(-72))
   112  			binary.Write(buf, binary.BigEndian, int16(-14383))
   113  			binary.Write(buf, binary.BigEndian, uint16(32741))
   114  			binary.Write(buf, binary.BigEndian, uint16(32757))
   115  			binary.Write(buf, binary.BigEndian, uint16(23153))
   116  			binary.Write(buf, binary.BigEndian, int16(6190))
   117  			binary.Write(buf, binary.BigEndian, int16(4))
   118  			binary.Write(buf, binary.BigEndian, int16(-32768))
   119  			binary.Write(buf, binary.BigEndian, int16(-8711))
   120  			binary.Write(buf, binary.BigEndian, int16(2868))
   121  		} else if adaptor.written[len(adaptor.written)-2] == bmp180CmdTemp && adaptor.written[len(adaptor.written)-1] == bmp180RegisterTempMSB {
   122  			return 0, errors.New("temp error")
   123  		} else if adaptor.written[len(adaptor.written)-2] == bmp180CmdPressure && adaptor.written[len(adaptor.written)-1] == bmp180RegisterPressureMSB {
   124  			binary.Write(buf, binary.BigEndian, int16(23843))
   125  			// XLSB, not used in this test.
   126  			buf.WriteByte(0)
   127  		}
   128  		copy(b, buf.Bytes())
   129  		return buf.Len(), nil
   130  	}
   131  	bmp180.Start()
   132  	_, err := bmp180.Temperature()
   133  	gobottest.Assert(t, err, errors.New("temp error"))
   134  }
   135  
   136  func TestBMP180DriverPressureError(t *testing.T) {
   137  	bmp180, adaptor := initTestBMP180DriverWithStubbedAdaptor()
   138  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
   139  		buf := new(bytes.Buffer)
   140  		// Values from the datasheet example.
   141  		if adaptor.written[len(adaptor.written)-1] == bmp180RegisterAC1MSB {
   142  			binary.Write(buf, binary.BigEndian, int16(408))
   143  			binary.Write(buf, binary.BigEndian, int16(-72))
   144  			binary.Write(buf, binary.BigEndian, int16(-14383))
   145  			binary.Write(buf, binary.BigEndian, uint16(32741))
   146  			binary.Write(buf, binary.BigEndian, uint16(32757))
   147  			binary.Write(buf, binary.BigEndian, uint16(23153))
   148  			binary.Write(buf, binary.BigEndian, int16(6190))
   149  			binary.Write(buf, binary.BigEndian, int16(4))
   150  			binary.Write(buf, binary.BigEndian, int16(-32768))
   151  			binary.Write(buf, binary.BigEndian, int16(-8711))
   152  			binary.Write(buf, binary.BigEndian, int16(2868))
   153  		} else if adaptor.written[len(adaptor.written)-2] == bmp180CmdTemp && adaptor.written[len(adaptor.written)-1] == bmp180RegisterTempMSB {
   154  			binary.Write(buf, binary.BigEndian, int16(27898))
   155  		} else if adaptor.written[len(adaptor.written)-2] == bmp180CmdPressure && adaptor.written[len(adaptor.written)-1] == bmp180RegisterPressureMSB {
   156  			return 0, errors.New("press error")
   157  		}
   158  		copy(b, buf.Bytes())
   159  		return buf.Len(), nil
   160  	}
   161  	bmp180.Start()
   162  	_, err := bmp180.Pressure()
   163  	gobottest.Assert(t, err, errors.New("press error"))
   164  }
   165  
   166  func TestBMP180DriverPressureWriteError(t *testing.T) {
   167  	bmp180, adaptor := initTestBMP180DriverWithStubbedAdaptor()
   168  	bmp180.Start()
   169  
   170  	adaptor.i2cWriteImpl = func([]byte) (int, error) {
   171  		return 0, errors.New("write error")
   172  	}
   173  
   174  	_, err := bmp180.Pressure()
   175  	gobottest.Assert(t, err, errors.New("write error"))
   176  }
   177  
   178  func TestBMP180DriverSetName(t *testing.T) {
   179  	b := initTestBMP180Driver()
   180  	b.SetName("TESTME")
   181  	gobottest.Assert(t, b.Name(), "TESTME")
   182  }
   183  
   184  func TestBMP180DriverOptions(t *testing.T) {
   185  	b := NewBMP180Driver(newI2cTestAdaptor(), WithBus(2))
   186  	gobottest.Assert(t, b.GetBusOrDefault(1), 2)
   187  }
   188  
   189  func TestBMP180PauseForReading(t *testing.T) {
   190  	gobottest.Assert(t, pauseForReading(BMP180UltraLowPower), time.Duration(5*time.Millisecond))
   191  	gobottest.Assert(t, pauseForReading(BMP180Standard), time.Duration(8*time.Millisecond))
   192  	gobottest.Assert(t, pauseForReading(BMP180HighResolution), time.Duration(14*time.Millisecond))
   193  	gobottest.Assert(t, pauseForReading(BMP180UltraHighResolution), time.Duration(26*time.Millisecond))
   194  }