input.New refactor and test

master
Bel LaPointe 2023-03-24 12:05:50 -06:00
parent 6e1bfc177d
commit adabc4eb98
3 changed files with 74 additions and 22 deletions

View File

@ -3,6 +3,7 @@ package input
import (
"context"
"os"
"syscall"
)
type Input interface {
@ -11,19 +12,46 @@ type Input interface {
}
func New(ctx context.Context) Input {
foo := randomCharFromRange('a', 'g')
if p, ok := os.LookupEnv("INPUT_RANDOM_WEIGHT_FILE"); ok && len(p) > 0 {
foo = randomCharFromWeightFile(p)
}
var result Input = NewRandom(foo)
if os.Getenv("INPUT_KEYBOARD") == "true" {
result = NewKeyboard()
}
if os.Getenv("INPUT_BUFFERED") == "true" {
result = NewBuffered(ctx, result)
}
if p, ok := os.LookupEnv("INPUT_REMAP_FILE"); ok && len(p) > 0 {
result = NewRemapFromFile(result, p)
}
return result
return newNew(ctx)()
}
func newNew(ctx context.Context) func() Input {
maker := newSourceFunc()
if os.Getenv("INPUT_BUFFERED") == "true" {
oldMaker := maker
maker = func() Input {
return NewBuffered(ctx, oldMaker())
}
}
if p := os.Getenv("INPUT_REMAP_FILE"); p != "" {
oldMaker := maker
maker = func() Input {
return NewRemapFromFile(oldMaker(), p)
}
}
if os.Getenv("INPUT_REFRESH_ON_SIGUSR1") != "" {
oldMaker := maker
c := NewRefreshCh(syscall.SIGUSR1)
maker = func() Input {
return NewRefresh(oldMaker, c)
}
}
return maker
}
func newSourceFunc() func() Input {
if os.Getenv("INPUT_KEYBOARD") == "true" {
singletonKeyboard := NewKeyboard()
return func() Input {
return singletonKeyboard
}
}
return func() Input {
generator := randomCharFromRange('a', 'g')
if p, ok := os.LookupEnv("INPUT_RANDOM_WEIGHT_FILE"); ok && len(p) > 0 {
generator = randomCharFromWeightFile(p)
}
return NewRandom(generator)
}
}

View File

@ -1,6 +1,10 @@
package input
import "testing"
import (
"context"
"os"
"testing"
)
func TestInput(t *testing.T) {
var _ Input = &Random{}
@ -9,3 +13,20 @@ func TestInput(t *testing.T) {
var _ Input = Remap{}
var _ Input = &Refresh{}
}
func TestNewNew(t *testing.T) {
t.Run("refreshing", func(t *testing.T) {
ctx, can := context.WithCancel(context.Background())
defer can()
os.Setenv("INPUT_BUFFERED", "true")
os.Setenv("INPUT_REFRESH_ON_SIGUSR1", "true")
foo := New(ctx)
if refresh, ok := foo.(*Refresh); !ok {
t.Errorf("%T", foo)
} else if buffered, ok := refresh.input.(*Buffered); !ok {
t.Errorf("%T", refresh.input)
} else if _, ok := buffered.input.(*Random); !ok {
t.Errorf("%T", buffered.input)
}
})
}

View File

@ -25,12 +25,15 @@ func NewRefresh(newInput func() Input, ch <-chan os.Signal) *Refresh {
input: newInput(),
}
go func() {
select {
case <-ctx.Done():
return
case sig := <-ch:
log.Println("refreshing for", sig)
result.input = newInput()
defer log.Println("refreshing done")
for {
select {
case <-ctx.Done():
return
case sig := <-ch:
log.Println("refreshing for", sig)
result.input = newInput()
}
}
}()
return result