gobot.io/x/gobot/v2@v2.1.0/drivers/aio/analog_sensor_driver_test.go (about)

     1  package aio
     2  
     3  import (
     4  	"errors"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"gobot.io/x/gobot/v2"
    10  	"gobot.io/x/gobot/v2/gobottest"
    11  )
    12  
    13  var _ gobot.Driver = (*AnalogSensorDriver)(nil)
    14  
    15  func TestAnalogSensorDriver(t *testing.T) {
    16  	a := newAioTestAdaptor()
    17  	d := NewAnalogSensorDriver(a, "1")
    18  	gobottest.Refute(t, d.Connection(), nil)
    19  
    20  	// default interval
    21  	gobottest.Assert(t, d.interval, 10*time.Millisecond)
    22  
    23  	// commands
    24  	a = newAioTestAdaptor()
    25  	d = NewAnalogSensorDriver(a, "42", 30*time.Second)
    26  	d.SetScaler(func(input int) float64 { return 2.5*float64(input) - 3 })
    27  	gobottest.Assert(t, d.Pin(), "42")
    28  	gobottest.Assert(t, d.interval, 30*time.Second)
    29  
    30  	a.TestAdaptorAnalogRead(func() (val int, err error) {
    31  		val = 100
    32  		return
    33  	})
    34  	ret := d.Command("ReadRaw")(nil).(map[string]interface{})
    35  	gobottest.Assert(t, ret["val"].(int), 100)
    36  	gobottest.Assert(t, ret["err"], nil)
    37  
    38  	ret = d.Command("Read")(nil).(map[string]interface{})
    39  	gobottest.Assert(t, ret["val"].(float64), 247.0)
    40  	gobottest.Assert(t, ret["err"], nil)
    41  
    42  	// refresh value on read
    43  	a = newAioTestAdaptor()
    44  	d = NewAnalogSensorDriver(a, "3")
    45  	a.TestAdaptorAnalogRead(func() (val int, err error) {
    46  		val = 150
    47  		return
    48  	})
    49  	gobottest.Assert(t, d.Value(), 0.0)
    50  	val, err := d.Read()
    51  	gobottest.Assert(t, err, nil)
    52  	gobottest.Assert(t, val, 150.0)
    53  	gobottest.Assert(t, d.Value(), 150.0)
    54  	gobottest.Assert(t, d.RawValue(), 150)
    55  }
    56  
    57  func TestAnalogSensorDriverWithLinearScaler(t *testing.T) {
    58  	// the input scales per default from 0...255
    59  	var tests = map[string]struct {
    60  		toMin float64
    61  		toMax float64
    62  		input int
    63  		want  float64
    64  	}{
    65  		"single_byte_range_min":   {toMin: 0, toMax: 255, input: 0, want: 0},
    66  		"single_byte_range_max":   {toMin: 0, toMax: 255, input: 255, want: 255},
    67  		"single_below_min":        {toMin: 3, toMax: 121, input: -1, want: 3},
    68  		"single_is_max":           {toMin: 5, toMax: 6, input: 255, want: 6},
    69  		"single_upscale":          {toMin: 337, toMax: 5337, input: 127, want: 2827.196078431373},
    70  		"grd_int_range_min":       {toMin: -180, toMax: 180, input: 0, want: -180},
    71  		"grd_int_range_minus_one": {toMin: -180, toMax: 180, input: 127, want: -0.7058823529411598},
    72  		"grd_int_range_max":       {toMin: -180, toMax: 180, input: 255, want: 180},
    73  		"upscale":                 {toMin: -10, toMax: 1234, input: 255, want: 1234},
    74  	}
    75  	a := newAioTestAdaptor()
    76  	d := NewAnalogSensorDriver(a, "7")
    77  	for name, tt := range tests {
    78  		t.Run(name, func(t *testing.T) {
    79  			// arrange
    80  			d.SetScaler(AnalogSensorLinearScaler(0, 255, tt.toMin, tt.toMax))
    81  			a.TestAdaptorAnalogRead(func() (val int, err error) {
    82  				return tt.input, nil
    83  			})
    84  			// act
    85  			got, err := d.Read()
    86  			// assert
    87  			gobottest.Assert(t, err, nil)
    88  			gobottest.Assert(t, got, tt.want)
    89  		})
    90  	}
    91  }
    92  
    93  func TestAnalogSensorDriverStart(t *testing.T) {
    94  	sem := make(chan bool, 1)
    95  	a := newAioTestAdaptor()
    96  	d := NewAnalogSensorDriver(a, "1")
    97  	d.SetScaler(func(input int) float64 { return float64(input * input) })
    98  
    99  	// expect data to be received
   100  	d.Once(d.Event(Data), func(data interface{}) {
   101  		gobottest.Assert(t, data.(int), 100)
   102  		sem <- true
   103  	})
   104  
   105  	d.Once(d.Event(Value), func(data interface{}) {
   106  		gobottest.Assert(t, data.(float64), 10000.0)
   107  		sem <- true
   108  	})
   109  
   110  	// send data
   111  	a.TestAdaptorAnalogRead(func() (val int, err error) {
   112  		val = 100
   113  		return
   114  	})
   115  
   116  	gobottest.Assert(t, d.Start(), nil)
   117  
   118  	select {
   119  	case <-sem:
   120  	case <-time.After(1 * time.Second):
   121  		t.Errorf("AnalogSensor Event \"Data\" was not published")
   122  	}
   123  
   124  	// expect error to be received
   125  	d.Once(d.Event(Error), func(data interface{}) {
   126  		gobottest.Assert(t, data.(error).Error(), "read error")
   127  		sem <- true
   128  	})
   129  
   130  	// send error
   131  	a.TestAdaptorAnalogRead(func() (val int, err error) {
   132  		err = errors.New("read error")
   133  		return
   134  	})
   135  
   136  	select {
   137  	case <-sem:
   138  	case <-time.After(1 * time.Second):
   139  		t.Errorf("AnalogSensor Event \"Error\" was not published")
   140  	}
   141  
   142  	// send a halt message
   143  	d.Once(d.Event(Data), func(data interface{}) {
   144  		sem <- true
   145  	})
   146  
   147  	d.Once(d.Event(Value), func(data interface{}) {
   148  		sem <- true
   149  	})
   150  
   151  	a.TestAdaptorAnalogRead(func() (val int, err error) {
   152  		val = 200
   153  		return
   154  	})
   155  
   156  	d.halt <- true
   157  
   158  	select {
   159  	case <-sem:
   160  		t.Errorf("AnalogSensor Event should not published")
   161  	case <-time.After(1 * time.Second):
   162  	}
   163  }
   164  
   165  func TestAnalogSensorDriverHalt(t *testing.T) {
   166  	d := NewAnalogSensorDriver(newAioTestAdaptor(), "1")
   167  	done := make(chan struct{})
   168  	go func() {
   169  		<-d.halt
   170  		close(done)
   171  	}()
   172  	gobottest.Assert(t, d.Halt(), nil)
   173  	select {
   174  	case <-done:
   175  	case <-time.After(100 * time.Millisecond):
   176  		t.Errorf("AnalogSensor was not halted")
   177  	}
   178  }
   179  
   180  func TestAnalogSensorDriverDefaultName(t *testing.T) {
   181  	d := NewAnalogSensorDriver(newAioTestAdaptor(), "1")
   182  	gobottest.Assert(t, strings.HasPrefix(d.Name(), "AnalogSensor"), true)
   183  }
   184  
   185  func TestAnalogSensorDriverSetName(t *testing.T) {
   186  	d := NewAnalogSensorDriver(newAioTestAdaptor(), "1")
   187  	d.SetName("mybot")
   188  	gobottest.Assert(t, d.Name(), "mybot")
   189  }