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  }