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  }