155 lines
2.3 KiB
Go
155 lines
2.3 KiB
Go
package debounce_test
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/bep/debounce"
|
|
)
|
|
|
|
func TestDebounce(t *testing.T) {
|
|
var (
|
|
counter1 uint64
|
|
counter2 uint64
|
|
)
|
|
|
|
f1 := func() {
|
|
atomic.AddUint64(&counter1, 1)
|
|
}
|
|
|
|
f2 := func() {
|
|
atomic.AddUint64(&counter2, 1)
|
|
}
|
|
|
|
f3 := func() {
|
|
atomic.AddUint64(&counter2, 2)
|
|
}
|
|
|
|
debounced := debounce.New(100 * time.Millisecond)
|
|
|
|
for i := 0; i < 3; i++ {
|
|
for j := 0; j < 10; j++ {
|
|
debounced(f1)
|
|
}
|
|
|
|
time.Sleep(200 * time.Millisecond)
|
|
}
|
|
|
|
for i := 0; i < 4; i++ {
|
|
for j := 0; j < 10; j++ {
|
|
debounced(f2)
|
|
}
|
|
for j := 0; j < 10; j++ {
|
|
debounced(f3)
|
|
}
|
|
|
|
time.Sleep(200 * time.Millisecond)
|
|
}
|
|
|
|
c1 := int(atomic.LoadUint64(&counter1))
|
|
c2 := int(atomic.LoadUint64(&counter2))
|
|
if c1 != 3 {
|
|
t.Error("Expected count 3, was", c1)
|
|
}
|
|
if c2 != 8 {
|
|
t.Error("Expected count 8, was", c2)
|
|
}
|
|
}
|
|
|
|
func TestDebounceConcurrentAdd(t *testing.T) {
|
|
var wg sync.WaitGroup
|
|
|
|
var flag uint64
|
|
|
|
debounced := debounce.New(100 * time.Millisecond)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
debounced(func() {
|
|
atomic.CompareAndSwapUint64(&flag, 0, 1)
|
|
})
|
|
}()
|
|
}
|
|
wg.Wait()
|
|
|
|
time.Sleep(500 * time.Millisecond)
|
|
c := int(atomic.LoadUint64(&flag))
|
|
if c != 1 {
|
|
t.Error("Flag not set")
|
|
}
|
|
}
|
|
|
|
// Issue #1
|
|
func TestDebounceDelayed(t *testing.T) {
|
|
|
|
var (
|
|
counter1 uint64
|
|
)
|
|
|
|
f1 := func() {
|
|
atomic.AddUint64(&counter1, 1)
|
|
}
|
|
|
|
debounced := debounce.New(100 * time.Millisecond)
|
|
|
|
time.Sleep(110 * time.Millisecond)
|
|
|
|
debounced(f1)
|
|
|
|
time.Sleep(200 * time.Millisecond)
|
|
|
|
c1 := int(atomic.LoadUint64(&counter1))
|
|
if c1 != 1 {
|
|
t.Error("Expected count 1, was", c1)
|
|
}
|
|
|
|
}
|
|
|
|
func BenchmarkDebounce(b *testing.B) {
|
|
var counter uint64
|
|
|
|
f := func() {
|
|
atomic.AddUint64(&counter, 1)
|
|
}
|
|
|
|
debounced := debounce.New(100 * time.Millisecond)
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
debounced(f)
|
|
}
|
|
|
|
c := int(atomic.LoadUint64(&counter))
|
|
if c != 0 {
|
|
b.Fatal("Expected count 0, was", c)
|
|
}
|
|
}
|
|
|
|
func ExampleNew() {
|
|
var counter uint64
|
|
|
|
f := func() {
|
|
atomic.AddUint64(&counter, 1)
|
|
}
|
|
|
|
debounced := debounce.New(100 * time.Millisecond)
|
|
|
|
for i := 0; i < 3; i++ {
|
|
for j := 0; j < 10; j++ {
|
|
debounced(f)
|
|
}
|
|
|
|
time.Sleep(200 * time.Millisecond)
|
|
}
|
|
|
|
c := int(atomic.LoadUint64(&counter))
|
|
|
|
fmt.Println("Counter is", c)
|
|
// Output: Counter is 3
|
|
}
|