Rahix
8645718748
Add a hysteresis value that can be optionally configured for thresholdOutput blocks. This will hopefully help to prevent jumping outputs from feedback that is caused by the thresholdOutput itself.
90 lines
1.7 KiB
Go
90 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestMomentaryOutput(t *testing.T) {
|
|
mo := momentaryOutput{}
|
|
mo.trigger()
|
|
mo.process()
|
|
if !mo.output {
|
|
t.Fatalf("output didn't trigger")
|
|
}
|
|
mo.process()
|
|
if !mo.output {
|
|
t.Fatalf("output didn't keep triggered")
|
|
}
|
|
time.Sleep(time.Second)
|
|
mo.process()
|
|
if mo.output {
|
|
t.Fatalf("output didn't untrigger")
|
|
}
|
|
}
|
|
|
|
func TestThresholdOutput(t *testing.T) {
|
|
to := thresholdOutput{
|
|
threshold: 1,
|
|
hysteresis: 0.2,
|
|
}
|
|
to.process(0.7)
|
|
if to.output {
|
|
t.Fatalf("output shouldn't have triggered")
|
|
}
|
|
to.process(1)
|
|
if to.output {
|
|
t.Fatalf("output shouldn't have triggered")
|
|
}
|
|
to.process(1.3)
|
|
if !to.output {
|
|
t.Fatalf("output should have triggered")
|
|
}
|
|
to.process(1)
|
|
if !to.output {
|
|
t.Fatalf("output should have triggered")
|
|
}
|
|
to.process(0.7)
|
|
if !to.output {
|
|
t.Fatalf("output should have triggered (in debounce)")
|
|
}
|
|
|
|
// let debounce timeout pass
|
|
time.Sleep(time.Second * 6)
|
|
|
|
to.process(0.7)
|
|
if to.output {
|
|
t.Fatalf("output shouldn't have triggered")
|
|
}
|
|
}
|
|
|
|
func TestRingbufferInput(t *testing.T) {
|
|
ri := ringbufferInput{
|
|
limit: 3,
|
|
}
|
|
if ri.saturated() {
|
|
t.Fatal("ringbuffer shouldn't be saturated yet")
|
|
}
|
|
ri.process(1)
|
|
if ri.saturated() {
|
|
t.Fatal("ringbuffer shouldn't be saturated yet")
|
|
}
|
|
ri.process(2)
|
|
if ri.saturated() {
|
|
t.Fatal("ringbuffer shouldn't be saturated yet")
|
|
}
|
|
ri.process(3)
|
|
if !ri.saturated() {
|
|
t.Fatalf("ringbuffer should be saturated")
|
|
}
|
|
|
|
if diff := math.Abs(float64(ri.avg) - 2); diff > 0.01 {
|
|
t.Fatalf("ringbuffer avg should be ~2, is %f", ri.avg)
|
|
}
|
|
ri.process(10)
|
|
if diff := math.Abs(float64(ri.avg) - 5); diff > 0.01 {
|
|
t.Fatalf("ringbuffer avg should be ~5, is %f", ri.avg)
|
|
}
|
|
}
|