2016-12-20 13:25:22 +01:00
|
|
|
package aio
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"reflect"
|
|
|
|
"sync/atomic"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2023-10-20 10:27:09 +02:00
|
|
|
"github.com/stretchr/testify/assert"
|
2023-05-20 14:25:21 +02:00
|
|
|
"gobot.io/x/gobot/v2"
|
2016-12-20 13:25:22 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type DriverAndPinner interface {
|
|
|
|
gobot.Driver
|
|
|
|
gobot.Pinner
|
|
|
|
}
|
|
|
|
|
|
|
|
type DriverAndEventer interface {
|
|
|
|
gobot.Driver
|
|
|
|
gobot.Eventer
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDriverDefaults(t *testing.T) {
|
|
|
|
testAdaptor := newAioTestAdaptor()
|
|
|
|
pin := "456"
|
|
|
|
|
|
|
|
drivers := []DriverAndPinner{
|
|
|
|
NewGroveSoundSensorDriver(testAdaptor, pin),
|
|
|
|
NewGroveLightSensorDriver(testAdaptor, pin),
|
|
|
|
NewGrovePiezoVibrationSensorDriver(testAdaptor, pin),
|
|
|
|
NewGroveRotaryDriver(testAdaptor, pin),
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, driver := range drivers {
|
2023-10-20 10:27:09 +02:00
|
|
|
assert.Equal(t, testAdaptor, driver.Connection())
|
|
|
|
assert.Equal(t, pin, driver.Pin())
|
2016-12-20 13:25:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAnalogDriverHalt(t *testing.T) {
|
|
|
|
testAdaptor := newAioTestAdaptor()
|
|
|
|
pin := "456"
|
|
|
|
|
|
|
|
drivers := []DriverAndEventer{
|
|
|
|
NewGroveSoundSensorDriver(testAdaptor, pin),
|
|
|
|
NewGroveLightSensorDriver(testAdaptor, pin),
|
|
|
|
NewGrovePiezoVibrationSensorDriver(testAdaptor, pin),
|
|
|
|
NewGroveRotaryDriver(testAdaptor, pin),
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, driver := range drivers {
|
|
|
|
var callCount int32
|
2017-04-02 17:55:49 +02:00
|
|
|
testAdaptor.TestAdaptorAnalogRead(func() (int, error) {
|
2016-12-20 13:25:22 +01:00
|
|
|
atomic.AddInt32(&callCount, 1)
|
|
|
|
return 42, nil
|
2017-04-02 17:55:49 +02:00
|
|
|
})
|
|
|
|
|
2016-12-20 13:25:22 +01:00
|
|
|
// Start the driver and allow for multiple digital reads
|
2023-06-12 19:51:25 +02:00
|
|
|
_ = driver.Start()
|
2016-12-20 13:25:22 +01:00
|
|
|
time.Sleep(20 * time.Millisecond)
|
|
|
|
|
2023-06-12 19:51:25 +02:00
|
|
|
_ = driver.Halt()
|
2016-12-20 13:25:22 +01:00
|
|
|
lastCallCount := atomic.LoadInt32(&callCount)
|
|
|
|
// If driver was not halted, digital reads would still continue
|
|
|
|
time.Sleep(20 * time.Millisecond)
|
|
|
|
if atomic.LoadInt32(&callCount) != lastCallCount {
|
|
|
|
t.Errorf("AnalogRead was called after driver was halted")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDriverPublishesError(t *testing.T) {
|
|
|
|
testAdaptor := newAioTestAdaptor()
|
|
|
|
pin := "456"
|
|
|
|
|
|
|
|
drivers := []DriverAndEventer{
|
|
|
|
NewGroveSoundSensorDriver(testAdaptor, pin),
|
|
|
|
NewGroveLightSensorDriver(testAdaptor, pin),
|
|
|
|
NewGrovePiezoVibrationSensorDriver(testAdaptor, pin),
|
|
|
|
NewGroveRotaryDriver(testAdaptor, pin),
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, driver := range drivers {
|
|
|
|
sem := make(chan struct{}, 1)
|
|
|
|
// send error
|
|
|
|
returnErr := func() (val int, err error) {
|
|
|
|
err = errors.New("read error")
|
|
|
|
return
|
|
|
|
}
|
2017-04-02 17:55:49 +02:00
|
|
|
testAdaptor.TestAdaptorAnalogRead(returnErr)
|
2016-12-20 13:25:22 +01:00
|
|
|
|
2023-10-26 20:34:19 +02:00
|
|
|
assert.NoError(t, driver.Start())
|
2016-12-20 13:25:22 +01:00
|
|
|
|
|
|
|
// expect error
|
2023-06-12 19:51:25 +02:00
|
|
|
_ = driver.Once(driver.Event(Error), func(data interface{}) {
|
2023-10-20 10:27:09 +02:00
|
|
|
assert.Equal(t, "read error", data.(error).Error())
|
2016-12-20 13:25:22 +01:00
|
|
|
close(sem)
|
|
|
|
})
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-sem:
|
|
|
|
case <-time.After(time.Second):
|
|
|
|
t.Errorf("%s Event \"Error\" was not published", getType(driver))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cleanup
|
2023-06-12 19:51:25 +02:00
|
|
|
_ = driver.Halt()
|
2016-12-20 13:25:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getType(driver interface{}) string {
|
|
|
|
d := reflect.TypeOf(driver)
|
|
|
|
|
|
|
|
if d.Kind() == reflect.Ptr {
|
|
|
|
return d.Elem().Name()
|
|
|
|
}
|
|
|
|
|
|
|
|
return d.Name()
|
|
|
|
}
|