hybridgroup.gobot/drivers/i2c/th02_driver_test.go

283 lines
6.3 KiB
Go

package i2c
import (
"errors"
"fmt"
"testing"
"time"
"gobot.io/x/gobot"
"gobot.io/x/gobot/gobottest"
)
var _ gobot.Driver = (*TH02Driver)(nil)
// // --------- HELPERS
func initTestTH02Driver() *SHT3xDriver {
driver, _ := initTestSHT3xDriverWithStubbedAdaptor()
return driver
}
func initTestTH02DriverWithStubbedAdaptor() (*TH02Driver, *i2cTestAdaptor) {
adaptor := newI2cTestAdaptor()
return NewTH02Driver(adaptor), adaptor
}
// --------- TESTS
func TestNewTH02Driver(t *testing.T) {
i2cd := newI2cTestAdaptor()
defer i2cd.Close()
// Does it return a pointer to an instance of SHT3xDriver?
var iface interface{} = NewTH02Driver(i2cd)
_, ok := iface.(*TH02Driver)
if !ok {
t.Errorf("NewTH02Driver() should have returned a *NewTH02Driver")
}
b := NewTH02Driver(i2cd, func(Config) {})
gobottest.Refute(t, b.Connection(), nil)
//cover some basically useless protions the Interface demands
if name := b.Name(); name != b.name {
t.Errorf("Didnt return the proper name. Got %q wanted %q", name, b.name)
}
if b.SetName("42"); b.name != "42" {
t.Errorf("yikes - didnt set name.")
}
}
func TestTH02Driver_Accuracy(t *testing.T) {
i2cd := newI2cTestAdaptor()
defer i2cd.Close()
b := NewTH02Driver(i2cd)
if b.SetAddress(0x42); b.addr != 0x42 {
t.Error("Didnt set address as expected")
}
if b.SetAccuracy(0x42); b.accuracy != TH02HighAccuracy {
t.Error("Setting an invalid accuracy should resolve to TH02HighAccuracy")
}
if b.SetAccuracy(TH02LowAccuracy); b.accuracy != TH02LowAccuracy {
t.Error("Expected setting low accuracy to actually set to low accuracy")
}
if acc := b.Accuracy(); acc != TH02LowAccuracy {
t.Errorf("Accuract() didnt return what was expected")
}
}
func TestTH022DriverStart(t *testing.T) {
b, _ := initTestTH02DriverWithStubbedAdaptor()
gobottest.Assert(t, b.Start(), nil)
}
func TestTH02StartConnectError(t *testing.T) {
d, adaptor := initTestTH02DriverWithStubbedAdaptor()
adaptor.Testi2cConnectErr(true)
gobottest.Assert(t, d.Start(), errors.New("Invalid i2c connection"))
}
func TestTH02DriverHalt(t *testing.T) {
sht3x := initTestTH02Driver()
gobottest.Assert(t, sht3x.Halt(), nil)
}
func TestTH02DriverOptions(t *testing.T) {
d := NewTH02Driver(newI2cTestAdaptor(), WithBus(2))
gobottest.Assert(t, d.GetBusOrDefault(1), 2)
d.Halt()
}
func TestTH02Driver_ReadData(t *testing.T) {
d, i2cd := initTestTH02DriverWithStubbedAdaptor()
gobottest.Assert(t, d.Start(), nil)
type x struct {
rd, wr func([]byte) (int, error)
rtn uint16
errNil bool
}
tests := map[string]x{
"example RH": x{
rd: func(b []byte) (int, error) {
copy(b, []byte{0x00, 0x07, 0xC0})
return 3, nil
},
wr: func([]byte) (int, error) {
return 1, nil
},
errNil: true,
rtn: 1984,
},
"example T": x{
rd: func(b []byte) (int, error) {
copy(b, []byte{0x00, 0x12, 0xC0})
return 3, nil
},
wr: func([]byte) (int, error) {
return 1, nil
},
errNil: true,
rtn: 4800,
},
"timeout - no wait for ready": x{
rd: func(b []byte) (int, error) {
time.Sleep(200 * time.Millisecond)
copy(b, []byte{0x01})
return 1, fmt.Errorf("nope")
},
wr: func([]byte) (int, error) {
return 1, nil
},
errNil: false,
rtn: 0,
},
"unable to write status register": x{
rd: func(b []byte) (int, error) {
copy(b, []byte{0x00})
return 0, nil
},
wr: func([]byte) (int, error) {
return 0, fmt.Errorf("Nope")
},
errNil: false,
rtn: 0,
},
"unable to read doesnt provide enought data": x{
rd: func(b []byte) (int, error) {
copy(b, []byte{0x00, 0x01})
return 2, nil
},
wr: func([]byte) (int, error) {
return 1, nil
},
errNil: false,
rtn: 0,
},
}
for name, x := range tests {
t.Log("Running", name)
i2cd.i2cReadImpl = x.rd
i2cd.i2cWriteImpl = x.wr
got, err := d.readData()
gobottest.Assert(t, err == nil, x.errNil)
gobottest.Assert(t, got, x.rtn)
}
}
func TestTH02Driver_waitForReady(t *testing.T) {
d, i2cd := initTestTH02DriverWithStubbedAdaptor()
gobottest.Assert(t, d.Start(), nil)
i2cd.i2cReadImpl = func(b []byte) (int, error) {
time.Sleep(50 * time.Millisecond)
copy(b, []byte{0x01, 0x00})
return 3, nil
}
i2cd.i2cWriteImpl = func([]byte) (int, error) {
return 1, nil
}
timeout := 10 * time.Microsecond
if err := d.waitForReady(&timeout); err == nil {
t.Error("Expected a timeout error")
}
}
func TestTH02Driver_WriteRegister(t *testing.T) {
d, i2cd := initTestTH02DriverWithStubbedAdaptor()
gobottest.Assert(t, d.Start(), nil)
i2cd.i2cWriteImpl = func([]byte) (int, error) {
return 1, nil
}
if err := d.writeRegister(0x00, 0x00); err != nil {
t.Errorf("expected a nil error write")
}
}
func TestTH02Driver_Heater(t *testing.T) {
d, i2cd := initTestTH02DriverWithStubbedAdaptor()
gobottest.Assert(t, d.Start(), nil)
i2cd.i2cReadImpl = func(b []byte) (int, error) {
copy(b, []byte{0xff})
return 1, nil
}
i2cd.i2cWriteImpl = func([]byte) (int, error) {
return 1, nil
}
on, err := d.Heater()
gobottest.Assert(t, on, true)
gobottest.Assert(t, err, nil)
}
func TestTH02Driver_SerialNumber(t *testing.T) {
d, i2cd := initTestTH02DriverWithStubbedAdaptor()
gobottest.Assert(t, d.Start(), nil)
i2cd.i2cReadImpl = func(b []byte) (int, error) {
copy(b, []byte{0x42})
return 1, nil
}
i2cd.i2cWriteImpl = func([]byte) (int, error) {
return 1, nil
}
sn, err := d.SerialNumber()
gobottest.Assert(t, sn, uint32((0x42)>>4))
gobottest.Assert(t, err, nil)
}
func TestTH02Driver_ApplySettings(t *testing.T) {
d := &TH02Driver{}
type x struct {
acc, base, out byte
heating bool
}
tests := map[string]x{
"low acc, heating": x{acc: TH02LowAccuracy, base: 0x00, heating: true, out: 0x01},
"high acc, no heating": x{acc: TH02HighAccuracy, base: 0x00, heating: false, out: 0x23},
}
for name, x := range tests {
t.Log(name)
d.accuracy = x.acc
d.heating = x.heating
got := d.applysettings(x.base)
gobottest.Assert(t, x.out, got)
}
}
func TestTH02Driver_Sample(t *testing.T) {
d, i2cd := initTestTH02DriverWithStubbedAdaptor()
gobottest.Assert(t, d.Start(), nil)
i2cd.i2cReadImpl = func(b []byte) (int, error) {
copy(b, []byte{0x00, 0x00, 0x07, 0xC0})
return 4, nil
}
i2cd.i2cWriteImpl = func([]byte) (int, error) {
return 1, nil
}
temp, rh, _ := d.Sample()
gobottest.Assert(t, temp, float32(0))
gobottest.Assert(t, rh, float32(0))
}