public void InvokeMaxEveryDelayTimeTestWithoutSynchronizationContext()
{
Assert.IsNull(SynchronizationContext.Current);
int actionCallCount = 0;
var throttledAction = new ThrottledAction(() => Interlocked.Add(ref actionCallCount, 1), ThrottledActionMode.InvokeMaxEveryDelayTime, TimeSpan.FromMilliseconds(100));
Assert.IsFalse(throttledAction.IsRunning);
throttledAction.InvokeAccumulated();
Assert.IsTrue(throttledAction.IsRunning);
throttledAction.InvokeAccumulated();
throttledAction.InvokeAccumulated();
// Multiple calls of InvokeAccumulated within the delayTime should call the action just once.
Task.Delay(200).Wait();
Assert.AreEqual(1, actionCallCount);
Assert.IsFalse(throttledAction.IsRunning);
actionCallCount = 0;
throttledAction.InvokeAccumulated();
Task.Delay(10).Wait();
throttledAction.InvokeAccumulated();
Task.Delay(150).Wait();
throttledAction.InvokeAccumulated();
// Calls the action twice: First 2 InvokeAccumulated are within delayTime; Last is after delayTime.
Task.Delay(200).Wait();
Assert.AreEqual(2, actionCallCount);
Assert.IsFalse(throttledAction.IsRunning);
actionCallCount = 0;
throttledAction.InvokeAccumulated();
Task.Delay(10).Wait();
throttledAction.Cancel();
// Do not call the action because it is cancelled.
Task.Delay(200).Wait();
Assert.AreEqual(0, actionCallCount);
Assert.IsFalse(throttledAction.IsRunning);
}