123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package helper
- import (
- "sync"
- "testing"
- "time"
- )
- func TestDebouncer_FirstCallImmediate(t *testing.T) {
- debouncer := NewDebouncer(100 * time.Millisecond)
- var called bool
- var mu sync.Mutex
- callback := func() {
- mu.Lock()
- called = true
- mu.Unlock()
- }
- debouncer.Trigger(callback)
- // Wait a short time for the goroutine to execute
- time.Sleep(10 * time.Millisecond)
- mu.Lock()
- if !called {
- t.Error("First call should execute immediately")
- }
- mu.Unlock()
- debouncer.Stop()
- }
- func TestDebouncer_SubsequentCallsDebounced(t *testing.T) {
- debouncer := NewDebouncer(50 * time.Millisecond)
- var callCount int
- var mu sync.Mutex
- callback := func() {
- mu.Lock()
- callCount++
- mu.Unlock()
- }
- // First call - should execute immediately
- debouncer.Trigger(callback)
- time.Sleep(10 * time.Millisecond)
- // Multiple rapid calls - should be debounced
- debouncer.Trigger(callback)
- debouncer.Trigger(callback)
- debouncer.Trigger(callback)
- // Wait for debounce period
- time.Sleep(70 * time.Millisecond)
- mu.Lock()
- if callCount != 2 { // First immediate + one debounced
- t.Errorf("Expected 2 calls, got %d", callCount)
- }
- mu.Unlock()
- debouncer.Stop()
- }
- func TestDebouncer_Stop(t *testing.T) {
- debouncer := NewDebouncer(100 * time.Millisecond)
- var called bool
- var mu sync.Mutex
- callback := func() {
- mu.Lock()
- called = true
- mu.Unlock()
- }
- // First call to set isFirst to false
- debouncer.Trigger(callback)
- time.Sleep(10 * time.Millisecond)
- // Reset called flag
- mu.Lock()
- called = false
- mu.Unlock()
- // Trigger and immediately stop
- debouncer.Trigger(callback)
- debouncer.Stop()
- // Wait longer than debounce period
- time.Sleep(150 * time.Millisecond)
- mu.Lock()
- if called {
- t.Error("Callback should not be called after Stop()")
- }
- mu.Unlock()
- }
|