debouncer_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package helper
  2. import (
  3. "sync"
  4. "testing"
  5. "time"
  6. )
  7. func TestDebouncer_FirstCallImmediate(t *testing.T) {
  8. debouncer := NewDebouncer(100 * time.Millisecond)
  9. var called bool
  10. var mu sync.Mutex
  11. callback := func() {
  12. mu.Lock()
  13. called = true
  14. mu.Unlock()
  15. }
  16. debouncer.Trigger(callback)
  17. // Wait a short time for the goroutine to execute
  18. time.Sleep(10 * time.Millisecond)
  19. mu.Lock()
  20. if !called {
  21. t.Error("First call should execute immediately")
  22. }
  23. mu.Unlock()
  24. debouncer.Stop()
  25. }
  26. func TestDebouncer_SubsequentCallsDebounced(t *testing.T) {
  27. debouncer := NewDebouncer(50 * time.Millisecond)
  28. var callCount int
  29. var mu sync.Mutex
  30. callback := func() {
  31. mu.Lock()
  32. callCount++
  33. mu.Unlock()
  34. }
  35. // First call - should execute immediately
  36. debouncer.Trigger(callback)
  37. time.Sleep(10 * time.Millisecond)
  38. // Multiple rapid calls - should be debounced
  39. debouncer.Trigger(callback)
  40. debouncer.Trigger(callback)
  41. debouncer.Trigger(callback)
  42. // Wait for debounce period
  43. time.Sleep(70 * time.Millisecond)
  44. mu.Lock()
  45. if callCount != 2 { // First immediate + one debounced
  46. t.Errorf("Expected 2 calls, got %d", callCount)
  47. }
  48. mu.Unlock()
  49. debouncer.Stop()
  50. }
  51. func TestDebouncer_Stop(t *testing.T) {
  52. debouncer := NewDebouncer(100 * time.Millisecond)
  53. var called bool
  54. var mu sync.Mutex
  55. callback := func() {
  56. mu.Lock()
  57. called = true
  58. mu.Unlock()
  59. }
  60. // First call to set isFirst to false
  61. debouncer.Trigger(callback)
  62. time.Sleep(10 * time.Millisecond)
  63. // Reset called flag
  64. mu.Lock()
  65. called = false
  66. mu.Unlock()
  67. // Trigger and immediately stop
  68. debouncer.Trigger(callback)
  69. debouncer.Stop()
  70. // Wait longer than debounce period
  71. time.Sleep(150 * time.Millisecond)
  72. mu.Lock()
  73. if called {
  74. t.Error("Callback should not be called after Stop()")
  75. }
  76. mu.Unlock()
  77. }