gobot.io/x/gobot/v2@v2.1.0/drivers/gpio/button_driver_test.go (about) 1 package gpio 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 = (*ButtonDriver)(nil) 14 15 const buttonTestDelay = 250 16 17 func initTestButtonDriver() *ButtonDriver { 18 return NewButtonDriver(newGpioTestAdaptor(), "1") 19 } 20 21 func TestButtonDriverHalt(t *testing.T) { 22 d := initTestButtonDriver() 23 go func() { 24 <-d.halt 25 }() 26 gobottest.Assert(t, d.Halt(), nil) 27 } 28 29 func TestButtonDriver(t *testing.T) { 30 d := NewButtonDriver(newGpioTestAdaptor(), "1") 31 gobottest.Refute(t, d.Connection(), nil) 32 33 d = NewButtonDriver(newGpioTestAdaptor(), "1", 30*time.Second) 34 gobottest.Assert(t, d.interval, 30*time.Second) 35 } 36 37 func TestButtonDriverStart(t *testing.T) { 38 sem := make(chan bool) 39 a := newGpioTestAdaptor() 40 d := NewButtonDriver(a, "1") 41 42 d.Once(ButtonPush, func(data interface{}) { 43 gobottest.Assert(t, d.Active, true) 44 sem <- true 45 }) 46 47 a.TestAdaptorDigitalRead(func(string) (val int, err error) { 48 val = 1 49 return 50 }) 51 52 gobottest.Assert(t, d.Start(), nil) 53 54 select { 55 case <-sem: 56 case <-time.After(buttonTestDelay * time.Millisecond): 57 t.Errorf("Button Event \"Push\" was not published") 58 } 59 60 d.Once(ButtonRelease, func(data interface{}) { 61 gobottest.Assert(t, d.Active, false) 62 sem <- true 63 }) 64 65 a.TestAdaptorDigitalRead(func(string) (val int, err error) { 66 val = 0 67 return 68 }) 69 70 select { 71 case <-sem: 72 case <-time.After(buttonTestDelay * time.Millisecond): 73 t.Errorf("Button Event \"Release\" was not published") 74 } 75 76 d.Once(Error, func(data interface{}) { 77 sem <- true 78 }) 79 80 a.TestAdaptorDigitalRead(func(string) (val int, err error) { 81 err = errors.New("digital read error") 82 return 83 }) 84 85 select { 86 case <-sem: 87 case <-time.After(buttonTestDelay * time.Millisecond): 88 t.Errorf("Button Event \"Error\" was not published") 89 } 90 91 d.Once(ButtonPush, func(data interface{}) { 92 sem <- true 93 }) 94 95 d.halt <- true 96 97 a.TestAdaptorDigitalRead(func(string) (val int, err error) { 98 val = 1 99 return 100 }) 101 102 select { 103 case <-sem: 104 t.Errorf("Button Event \"Press\" should not published") 105 case <-time.After(buttonTestDelay * time.Millisecond): 106 } 107 } 108 109 func TestButtonDriverDefaultState(t *testing.T) { 110 sem := make(chan bool) 111 a := newGpioTestAdaptor() 112 d := NewButtonDriver(a, "1") 113 d.DefaultState = 1 114 115 d.Once(ButtonPush, func(data interface{}) { 116 gobottest.Assert(t, d.Active, true) 117 sem <- true 118 }) 119 120 a.TestAdaptorDigitalRead(func(string) (val int, err error) { 121 val = 0 122 return 123 }) 124 125 gobottest.Assert(t, d.Start(), nil) 126 127 select { 128 case <-sem: 129 case <-time.After(buttonTestDelay * time.Millisecond): 130 t.Errorf("Button Event \"Push\" was not published") 131 } 132 133 d.Once(ButtonRelease, func(data interface{}) { 134 gobottest.Assert(t, d.Active, false) 135 sem <- true 136 }) 137 138 a.TestAdaptorDigitalRead(func(string) (val int, err error) { 139 val = 1 140 return 141 }) 142 143 select { 144 case <-sem: 145 case <-time.After(buttonTestDelay * time.Millisecond): 146 t.Errorf("Button Event \"Release\" was not published") 147 } 148 } 149 150 func TestButtonDriverDefaultName(t *testing.T) { 151 g := initTestButtonDriver() 152 gobottest.Assert(t, strings.HasPrefix(g.Name(), "Button"), true) 153 } 154 155 func TestButtonDriverSetName(t *testing.T) { 156 g := initTestButtonDriver() 157 g.SetName("mybot") 158 gobottest.Assert(t, g.Name(), "mybot") 159 }