public static InternalTestActorRef Create(ActorSystem system, Props props, IActorRef supervisor = null, string name = null)
{
if(name == null)
name = CreateUniqueName();
if(supervisor == null)
{
var systemImpl = (ActorSystemImpl)system;
supervisor = systemImpl.Guardian;
}
if(props.Deploy.Dispatcher == Deploy.NoDispatcherGiven)
{
props = props.WithDispatcher(CallingThreadDispatcher.Id);
}
var dispatcher = system.Dispatchers.Lookup(props.Deploy.Dispatcher);
var supervisorLocal = supervisor as LocalActorRef;
if(supervisorLocal != null)
{
supervisorLocal.Cell.ReserveChild(name);
}
else
{
var supervisorRep = supervisor as RepointableActorRef;
if(supervisorRep != null)
{
var repUnderlying = supervisorRep.Underlying;
if(repUnderlying is UnstartedCell)
throw new IllegalStateException("Cannot attach a TestActor to an unstarted top-level actor, ensure that it is started by sending a message and observing the reply");
var cellUnderlying = repUnderlying as ActorCell;
if(cellUnderlying != null)
{
cellUnderlying.ReserveChild(name);
}
else
{
system.Log.Error("Trying to attach child {0} to unknown type of supervisor cell {1}, this is not going to end well", name, repUnderlying.GetType());
}
}
}
//TODO: Should be: Func<Mailbox> mailbox = () => system.Mailboxes.FromConfig(dispatcher.Configurator.Config);
Func<Mailbox> mailbox = () => system.Mailboxes.CreateMailbox(props, null);
var testActorRef = new InternalTestActorRef(system, props, dispatcher, mailbox, (IInternalActorRef)supervisor, supervisor.Path / name);
// we need to start ourselves since the creation of an actor has been split into initialization and starting
testActorRef.Underlying.Start();
return testActorRef;
}