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 }