private void AssertTransition(System.Func <PlayerState?, PlayerEvent?, bool> ignore, System.Action action, params object [] states)
{
Log.DebugFormat("AssertTransition: {0}", String.Join(", ", states.Select(s => s.ToString()).ToArray()));
int result_count = 0;
var reset_event = new ManualResetEvent(false);
var handler = new PlayerEventHandler(a => {
lock (states) {
if (result_count < states.Length)
{
var sca = a as PlayerEventStateChangeArgs;
var last_state = sca != null ? sca.Current : service.CurrentState;
var last_event = a.Event;
if (ignore != null && ignore(last_state, last_event))
{
Log.DebugFormat(" > ignoring {0}/{1}", last_event, last_state);
return;
}
if (sca == null)
{
Log.DebugFormat(" > {0}", a.Event);
}
else
{
Log.DebugFormat(" > {0}", last_state);
}
var evnt = (states[result_count] as PlayerEvent?) ?? PlayerEvent.StateChange;
var state = states[result_count] as PlayerState?;
result_count++;
Assert.AreEqual(evnt, last_event);
if (state != null)
{
Assert.AreEqual(state, last_state);
}
}
}
reset_event.Set();
});
service.ConnectEvent(handler);
if (action != null)
{
action();
}
while (result_count < states.Length)
{
reset_event.Reset();
if (!reset_event.WaitOne(2000))
{
Assert.Fail(String.Format("Waited 1s for state/event, didnt' happen"));
break;
}
}
service.DisconnectEvent(handler);
}