public void ScheduleTellRepeatedly_in_milliseconds_Tests(int initialDelay, int interval)
{
// Prepare, set up actions to be fired
IScheduler scheduler = new DedicatedThreadScheduler(Sys);
var cancelable = new Cancelable(Sys.Scheduler);
var receiver = ActorOf(dsl =>
{
//Receive three messages, and store the time when these were received
//after three messages stop the actor and send the times to TestActor
var messages = new List<DateTimeOffset>();
dsl.Receive<string>((s, context) =>
{
messages.Add(context.System.Scheduler.Now);
if(messages.Count == 3)
{
TestActor.Tell(messages);
cancelable.Cancel();
context.Stop(context.Self);
}
});
});
scheduler.ScheduleTellRepeatedly(initialDelay, interval, receiver, "Test", ActorRefs.NoSender, cancelable);
//Expect to get a list from receiver after it has received three messages
var dateTimeOffsets = ExpectMsg<List<DateTimeOffset>>();
dateTimeOffsets.ShouldHaveCount(3);
Action<int, int> validate = (a, b) =>
{
var valA = dateTimeOffsets[a];
var valB = dateTimeOffsets[b];
var diffBetweenMessages = Math.Abs((valB - valA).TotalMilliseconds);
var diffInMs = Math.Abs(diffBetweenMessages - interval);
var deviate = (diffInMs / interval);
deviate.Should(val => val < 0.1, string.Format("Expected the interval between message {1} and {2} to deviate maximum 10% from {0}. It was {3} ms between the messages. It deviated {4}%", interval, a + 1, b + 1, diffBetweenMessages, deviate * 100));
};
validate(0, 1);
validate(1, 2);
}