gobot.io/x/gobot/v2@v2.1.0/drivers/gpio/makey_button_driver_test.go (about)

     1  package gpio
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  	"time"
     7  
     8  	"gobot.io/x/gobot/v2"
     9  	"gobot.io/x/gobot/v2/gobottest"
    10  )
    11  
    12  var _ gobot.Driver = (*MakeyButtonDriver)(nil)
    13  
    14  const makeyTestDelay = 250
    15  
    16  func initTestMakeyButtonDriver() *MakeyButtonDriver {
    17  	return NewMakeyButtonDriver(newGpioTestAdaptor(), "1")
    18  }
    19  
    20  func TestMakeyButtonDriverHalt(t *testing.T) {
    21  	d := initTestMakeyButtonDriver()
    22  	done := make(chan struct{})
    23  	go func() {
    24  		<-d.halt
    25  		close(done)
    26  	}()
    27  	gobottest.Assert(t, d.Halt(), nil)
    28  	select {
    29  	case <-done:
    30  	case <-time.After(makeyTestDelay * time.Millisecond):
    31  		t.Errorf("MakeyButton was not halted")
    32  	}
    33  }
    34  
    35  func TestMakeyButtonDriver(t *testing.T) {
    36  	d := initTestMakeyButtonDriver()
    37  	gobottest.Assert(t, d.Pin(), "1")
    38  	gobottest.Refute(t, d.Connection(), nil)
    39  	gobottest.Assert(t, d.interval, 10*time.Millisecond)
    40  
    41  	d = NewMakeyButtonDriver(newGpioTestAdaptor(), "1", 30*time.Second)
    42  	gobottest.Assert(t, d.interval, 30*time.Second)
    43  }
    44  
    45  func TestMakeyButtonDriverStart(t *testing.T) {
    46  	sem := make(chan bool)
    47  	a := newGpioTestAdaptor()
    48  	d := NewMakeyButtonDriver(a, "1")
    49  
    50  	gobottest.Assert(t, d.Start(), nil)
    51  
    52  	d.Once(ButtonPush, func(data interface{}) {
    53  		gobottest.Assert(t, d.Active, true)
    54  		sem <- true
    55  	})
    56  
    57  	a.TestAdaptorDigitalRead(func(string) (val int, err error) {
    58  		val = 0
    59  		return
    60  	})
    61  
    62  	select {
    63  	case <-sem:
    64  	case <-time.After(makeyTestDelay * time.Millisecond):
    65  		t.Errorf("MakeyButton Event \"Push\" was not published")
    66  	}
    67  
    68  	d.Once(ButtonRelease, func(data interface{}) {
    69  		gobottest.Assert(t, d.Active, false)
    70  		sem <- true
    71  	})
    72  
    73  	a.TestAdaptorDigitalRead(func(string) (val int, err error) {
    74  		val = 1
    75  		return
    76  	})
    77  
    78  	select {
    79  	case <-sem:
    80  	case <-time.After(makeyTestDelay * time.Millisecond):
    81  		t.Errorf("MakeyButton Event \"Release\" was not published")
    82  	}
    83  
    84  	d.Once(Error, func(data interface{}) {
    85  		gobottest.Assert(t, data.(error).Error(), "digital read error")
    86  		sem <- true
    87  	})
    88  
    89  	a.TestAdaptorDigitalRead(func(string) (val int, err error) {
    90  		err = errors.New("digital read error")
    91  		return
    92  	})
    93  
    94  	select {
    95  	case <-sem:
    96  	case <-time.After(makeyTestDelay * time.Millisecond):
    97  		t.Errorf("MakeyButton Event \"Error\" was not published")
    98  	}
    99  
   100  	// send a halt message
   101  	d.Once(ButtonRelease, func(data interface{}) {
   102  		sem <- true
   103  	})
   104  
   105  	a.TestAdaptorDigitalRead(func(string) (val int, err error) {
   106  		val = 1
   107  		return
   108  	})
   109  
   110  	d.halt <- true
   111  
   112  	select {
   113  	case <-sem:
   114  		t.Errorf("MakeyButton Event should not have been published")
   115  	case <-time.After(makeyTestDelay * time.Millisecond):
   116  	}
   117  }