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 }