package throttling import ( "time" ) func (suite *ThrottlerTestSuite) Test_throttlerImmediateNotificationAfterInitialized() { value := 0 throttler := NewThrottler[int](func(v *int) { value = *v }, 1.0) t0 := time.Now() v := 1 currentTime.now = t0 throttler.Notify(&v) suite.Equal(v, value) value = 0 // subsequent ping will not lead to a notification currentTime.now = t0.Add(10 * time.Second) throttler.Ping() suite.Equal(0, value) } func (suite *ThrottlerTestSuite) Test_TwoNotificationsInSHortSucessionSecondOneIsDeliverdWithDelay() { value := 0 delayMs := 1000 throttler := NewThrottler[int](func(v *int) { value = *v }, time.Duration(delayMs)*time.Millisecond) t0 := time.Now() v1 := 1 // v2 will not be delivered, the last value in the time interval will be v2 := 2 v3 := 3 currentTime.now = t0 throttler.Notify(&v1) suite.Equal(v1, value) throttler.Notify(&v2) throttler.Notify(&v3) suite.Equal(v1, value) currentTime.now = t0.Add(time.Duration(delayMs-1) * time.Millisecond) throttler.Ping() suite.Equal(v1, value) currentTime.now = t0.Add(time.Duration(delayMs) * time.Millisecond) throttler.Ping() suite.Equal(v3, value) // another ping won't deliver the same value again. value = 0 currentTime.now = t0.Add(time.Duration(delayMs) * time.Millisecond) throttler.Ping() suite.Equal(0, value) }