public void InputSource_CommandSucceedsDueToInput_CommandIsCompleted()
{
var commandCompleted = false;
var inputSource = new Subject<ProcessorInput>();
var resetEvent = new ManualResetEventSlim(false);
var fakeFilterManager = A.Fake<IFilterManager>();
A.CallTo(() => fakeFilterManager.Process(A<CommandBase>.Ignored)).Returns(true);
var processor = new CommandProcessor(inputSource, fakeFilterManager);
var command = new TestCommand(CommandState.New, interpretResponseAction: i => true);
command.RegisterForStateChange(Observer.Create<CommandState>(b =>
{
if (b == CommandState.Executing)
{
resetEvent.Set();
}
}));
processor.PublishCommand(command, Observer.Create<ICommandResponse<Unit>>(_ => { }, () =>
{
commandCompleted = true;
resetEvent.Set();
}));
resetEvent.Wait();
inputSource.OnNext(new ProcessorInput());
resetEvent.Wait();
Assert.IsTrue(commandCompleted);
}