gobot.io/x/gobot/v2@v2.1.0/drivers/i2c/sht2x_driver_test.go (about) 1 package i2c 2 3 import ( 4 "bytes" 5 "errors" 6 "strings" 7 "testing" 8 9 "gobot.io/x/gobot/v2" 10 "gobot.io/x/gobot/v2/gobottest" 11 ) 12 13 // this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver 14 // and tests all implementations, so no further tests needed here for gobot.Driver interface 15 var _ gobot.Driver = (*SHT2xDriver)(nil) 16 17 func initTestSHT2xDriverWithStubbedAdaptor() (*SHT2xDriver, *i2cTestAdaptor) { 18 a := newI2cTestAdaptor() 19 d := NewSHT2xDriver(a) 20 if err := d.Start(); err != nil { 21 panic(err) 22 } 23 return d, a 24 } 25 26 func TestNewSHT2xDriver(t *testing.T) { 27 var di interface{} = NewSHT2xDriver(newI2cTestAdaptor()) 28 d, ok := di.(*SHT2xDriver) 29 if !ok { 30 t.Errorf("NewSHT2xDriver() should have returned a *SHT2xDriver") 31 } 32 gobottest.Refute(t, d.Driver, nil) 33 gobottest.Assert(t, strings.HasPrefix(d.Name(), "SHT2x"), true) 34 gobottest.Assert(t, d.defaultAddress, 0x40) 35 } 36 37 func TestSHT2xOptions(t *testing.T) { 38 // This is a general test, that options are applied in constructor by using the common WithBus() option and 39 // least one of this driver. Further tests for options can also be done by call of "WithOption(val)(d)". 40 b := NewSHT2xDriver(newI2cTestAdaptor(), WithBus(2)) 41 gobottest.Assert(t, b.GetBusOrDefault(1), 2) 42 } 43 44 func TestSHT2xStart(t *testing.T) { 45 d := NewSHT2xDriver(newI2cTestAdaptor()) 46 gobottest.Assert(t, d.Start(), nil) 47 } 48 49 func TestSHT2xHalt(t *testing.T) { 50 d, _ := initTestSHT2xDriverWithStubbedAdaptor() 51 gobottest.Assert(t, d.Halt(), nil) 52 } 53 54 func TestSHT2xReset(t *testing.T) { 55 d, a := initTestSHT2xDriverWithStubbedAdaptor() 56 a.i2cReadImpl = func(b []byte) (int, error) { 57 return 0, nil 58 } 59 d.Start() 60 err := d.Reset() 61 gobottest.Assert(t, err, nil) 62 } 63 64 func TestSHT2xMeasurements(t *testing.T) { 65 d, a := initTestSHT2xDriverWithStubbedAdaptor() 66 a.i2cReadImpl = func(b []byte) (int, error) { 67 buf := new(bytes.Buffer) 68 // Values produced by dumping data from actual sensor 69 if a.written[len(a.written)-1] == SHT2xTriggerTempMeasureNohold { 70 buf.Write([]byte{95, 168, 59}) 71 } else if a.written[len(a.written)-1] == SHT2xTriggerHumdMeasureNohold { 72 buf.Write([]byte{94, 202, 22}) 73 } 74 copy(b, buf.Bytes()) 75 return buf.Len(), nil 76 } 77 d.Start() 78 temp, err := d.Temperature() 79 gobottest.Assert(t, err, nil) 80 gobottest.Assert(t, temp, float32(18.809052)) 81 hum, err := d.Humidity() 82 gobottest.Assert(t, err, nil) 83 gobottest.Assert(t, hum, float32(40.279907)) 84 } 85 86 func TestSHT2xAccuracy(t *testing.T) { 87 d, a := initTestSHT2xDriverWithStubbedAdaptor() 88 a.i2cReadImpl = func(b []byte) (int, error) { 89 buf := new(bytes.Buffer) 90 if a.written[len(a.written)-1] == SHT2xReadUserReg { 91 buf.Write([]byte{0x3a}) 92 } else if a.written[len(a.written)-2] == SHT2xWriteUserReg { 93 buf.Write([]byte{a.written[len(a.written)-1]}) 94 } else { 95 return 0, nil 96 } 97 copy(b, buf.Bytes()) 98 return buf.Len(), nil 99 } 100 d.Start() 101 d.SetAccuracy(SHT2xAccuracyLow) 102 gobottest.Assert(t, d.Accuracy(), SHT2xAccuracyLow) 103 err := d.sendAccuracy() 104 gobottest.Assert(t, err, nil) 105 } 106 107 func TestSHT2xTemperatureCrcError(t *testing.T) { 108 d, a := initTestSHT2xDriverWithStubbedAdaptor() 109 d.Start() 110 111 a.i2cReadImpl = func(b []byte) (int, error) { 112 buf := new(bytes.Buffer) 113 if a.written[len(a.written)-1] == SHT2xTriggerTempMeasureNohold { 114 buf.Write([]byte{95, 168, 0}) 115 } 116 copy(b, buf.Bytes()) 117 return buf.Len(), nil 118 } 119 temp, err := d.Temperature() 120 gobottest.Assert(t, err, errors.New("Invalid crc")) 121 gobottest.Assert(t, temp, float32(0.0)) 122 } 123 124 func TestSHT2xHumidityCrcError(t *testing.T) { 125 d, a := initTestSHT2xDriverWithStubbedAdaptor() 126 d.Start() 127 128 a.i2cReadImpl = func(b []byte) (int, error) { 129 buf := new(bytes.Buffer) 130 if a.written[len(a.written)-1] == SHT2xTriggerHumdMeasureNohold { 131 buf.Write([]byte{94, 202, 0}) 132 } 133 copy(b, buf.Bytes()) 134 return buf.Len(), nil 135 } 136 hum, err := d.Humidity() 137 gobottest.Assert(t, err, errors.New("Invalid crc")) 138 gobottest.Assert(t, hum, float32(0.0)) 139 } 140 141 func TestSHT2xTemperatureLengthError(t *testing.T) { 142 d, a := initTestSHT2xDriverWithStubbedAdaptor() 143 d.Start() 144 145 a.i2cReadImpl = func(b []byte) (int, error) { 146 buf := new(bytes.Buffer) 147 if a.written[len(a.written)-1] == SHT2xTriggerTempMeasureNohold { 148 buf.Write([]byte{95, 168}) 149 } 150 copy(b, buf.Bytes()) 151 return buf.Len(), nil 152 } 153 temp, err := d.Temperature() 154 gobottest.Assert(t, err, ErrNotEnoughBytes) 155 gobottest.Assert(t, temp, float32(0.0)) 156 } 157 158 func TestSHT2xHumidityLengthError(t *testing.T) { 159 d, a := initTestSHT2xDriverWithStubbedAdaptor() 160 d.Start() 161 162 a.i2cReadImpl = func(b []byte) (int, error) { 163 buf := new(bytes.Buffer) 164 if a.written[len(a.written)-1] == SHT2xTriggerHumdMeasureNohold { 165 buf.Write([]byte{94, 202}) 166 } 167 copy(b, buf.Bytes()) 168 return buf.Len(), nil 169 } 170 hum, err := d.Humidity() 171 gobottest.Assert(t, err, ErrNotEnoughBytes) 172 gobottest.Assert(t, hum, float32(0.0)) 173 }