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

     1  package i2c
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"testing"
     7  
     8  	"gobot.io/x/gobot"
     9  	"gobot.io/x/gobot/gobottest"
    10  )
    11  
    12  var _ gobot.Driver = (*SHT2xDriver)(nil)
    13  
    14  // --------- HELPERS
    15  func initTestSHT2xDriver() (driver *SHT2xDriver) {
    16  	driver, _ = initTestSHT2xDriverWithStubbedAdaptor()
    17  	return
    18  }
    19  
    20  func initTestSHT2xDriverWithStubbedAdaptor() (*SHT2xDriver, *i2cTestAdaptor) {
    21  	adaptor := newI2cTestAdaptor()
    22  	return NewSHT2xDriver(adaptor), adaptor
    23  }
    24  
    25  // --------- TESTS
    26  
    27  func TestNewSHT2xDriver(t *testing.T) {
    28  	// Does it return a pointer to an instance of SHT2xDriver?
    29  	var sht2x interface{} = NewSHT2xDriver(newI2cTestAdaptor())
    30  	_, ok := sht2x.(*SHT2xDriver)
    31  	if !ok {
    32  		t.Errorf("NewSHT2xDriver() should have returned a *SHT2xDriver")
    33  	}
    34  }
    35  
    36  func TestSHT2xDriver(t *testing.T) {
    37  	sht2x := initTestSHT2xDriver()
    38  	gobottest.Refute(t, sht2x.Connection(), nil)
    39  }
    40  
    41  func TestSHT2xDriverStart(t *testing.T) {
    42  	sht2x, _ := initTestSHT2xDriverWithStubbedAdaptor()
    43  
    44  	gobottest.Assert(t, sht2x.Start(), nil)
    45  }
    46  
    47  func TestSHT2xStartConnectError(t *testing.T) {
    48  	d, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
    49  	adaptor.Testi2cConnectErr(true)
    50  	gobottest.Assert(t, d.Start(), errors.New("Invalid i2c connection"))
    51  }
    52  
    53  func TestSHT2xDriverHalt(t *testing.T) {
    54  	sht2x := initTestSHT2xDriver()
    55  
    56  	gobottest.Assert(t, sht2x.Halt(), nil)
    57  }
    58  
    59  func TestSHT2xDriverReset(t *testing.T) {
    60  	sht2x, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
    61  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
    62  		return 0, nil
    63  	}
    64  	sht2x.Start()
    65  	err := sht2x.Reset()
    66  	gobottest.Assert(t, err, nil)
    67  }
    68  
    69  func TestSHT2xDriverMeasurements(t *testing.T) {
    70  	sht2x, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
    71  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
    72  		buf := new(bytes.Buffer)
    73  		// Values produced by dumping data from actual sensor
    74  		if adaptor.written[len(adaptor.written)-1] == SHT2xTriggerTempMeasureNohold {
    75  			buf.Write([]byte{95, 168, 59})
    76  		} else if adaptor.written[len(adaptor.written)-1] == SHT2xTriggerHumdMeasureNohold {
    77  			buf.Write([]byte{94, 202, 22})
    78  		}
    79  		copy(b, buf.Bytes())
    80  		return buf.Len(), nil
    81  	}
    82  	sht2x.Start()
    83  	temp, err := sht2x.Temperature()
    84  	gobottest.Assert(t, err, nil)
    85  	gobottest.Assert(t, temp, float32(18.809052))
    86  	hum, err := sht2x.Humidity()
    87  	gobottest.Assert(t, err, nil)
    88  	gobottest.Assert(t, hum, float32(40.279907))
    89  }
    90  
    91  func TestSHT2xDriverAccuracy(t *testing.T) {
    92  	sht2x, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
    93  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
    94  		buf := new(bytes.Buffer)
    95  		if adaptor.written[len(adaptor.written)-1] == SHT2xReadUserReg {
    96  			buf.Write([]byte{0x3a})
    97  		} else if adaptor.written[len(adaptor.written)-2] == SHT2xWriteUserReg {
    98  			buf.Write([]byte{adaptor.written[len(adaptor.written)-1]})
    99  		} else {
   100  			return 0, nil
   101  		}
   102  		copy(b, buf.Bytes())
   103  		return buf.Len(), nil
   104  	}
   105  	sht2x.Start()
   106  	sht2x.SetAccuracy(SHT2xAccuracyLow)
   107  	gobottest.Assert(t, sht2x.Accuracy(), SHT2xAccuracyLow)
   108  	err := sht2x.sendAccuracy()
   109  	gobottest.Assert(t, err, nil)
   110  }
   111  
   112  func TestSHT2xDriverTemperatureCrcError(t *testing.T) {
   113  	sht2x, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
   114  	sht2x.Start()
   115  
   116  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
   117  		buf := new(bytes.Buffer)
   118  		if adaptor.written[len(adaptor.written)-1] == SHT2xTriggerTempMeasureNohold {
   119  			buf.Write([]byte{95, 168, 0})
   120  		}
   121  		copy(b, buf.Bytes())
   122  		return buf.Len(), nil
   123  	}
   124  	temp, err := sht2x.Temperature()
   125  	gobottest.Assert(t, err, errors.New("Invalid crc"))
   126  	gobottest.Assert(t, temp, float32(0.0))
   127  }
   128  
   129  func TestSHT2xDriverHumidityCrcError(t *testing.T) {
   130  	sht2x, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
   131  	sht2x.Start()
   132  
   133  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
   134  		buf := new(bytes.Buffer)
   135  		if adaptor.written[len(adaptor.written)-1] == SHT2xTriggerHumdMeasureNohold {
   136  			buf.Write([]byte{94, 202, 0})
   137  		}
   138  		copy(b, buf.Bytes())
   139  		return buf.Len(), nil
   140  	}
   141  	hum, err := sht2x.Humidity()
   142  	gobottest.Assert(t, err, errors.New("Invalid crc"))
   143  	gobottest.Assert(t, hum, float32(0.0))
   144  }
   145  
   146  func TestSHT2xDriverTemperatureLengthError(t *testing.T) {
   147  	sht2x, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
   148  	sht2x.Start()
   149  
   150  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
   151  		buf := new(bytes.Buffer)
   152  		if adaptor.written[len(adaptor.written)-1] == SHT2xTriggerTempMeasureNohold {
   153  			buf.Write([]byte{95, 168})
   154  		}
   155  		copy(b, buf.Bytes())
   156  		return buf.Len(), nil
   157  	}
   158  	temp, err := sht2x.Temperature()
   159  	gobottest.Assert(t, err, ErrNotEnoughBytes)
   160  	gobottest.Assert(t, temp, float32(0.0))
   161  }
   162  
   163  func TestSHT2xDriverHumidityLengthError(t *testing.T) {
   164  	sht2x, adaptor := initTestSHT2xDriverWithStubbedAdaptor()
   165  	sht2x.Start()
   166  
   167  	adaptor.i2cReadImpl = func(b []byte) (int, error) {
   168  		buf := new(bytes.Buffer)
   169  		if adaptor.written[len(adaptor.written)-1] == SHT2xTriggerHumdMeasureNohold {
   170  			buf.Write([]byte{94, 202})
   171  		}
   172  		copy(b, buf.Bytes())
   173  		return buf.Len(), nil
   174  	}
   175  	hum, err := sht2x.Humidity()
   176  	gobottest.Assert(t, err, ErrNotEnoughBytes)
   177  	gobottest.Assert(t, hum, float32(0.0))
   178  }
   179  
   180  func TestSHT2xDriverSetName(t *testing.T) {
   181  	b := initTestSHT2xDriver()
   182  	b.SetName("TESTME")
   183  	gobottest.Assert(t, b.Name(), "TESTME")
   184  }
   185  
   186  func TestSHT2xDriverOptions(t *testing.T) {
   187  	b := NewSHT2xDriver(newI2cTestAdaptor(), WithBus(2))
   188  	gobottest.Assert(t, b.GetBusOrDefault(1), 2)
   189  }