public void StartMiddleEnd() { var models = new InMemoryProcessModelsStore(); models.Store(ProcessModel.Create() .AddEventCatcher("start", TypedEventCatcher <Start> .Create()) .AddEventCatcher("middle", CatchAnyEventCatcher.Create()) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "middle", "end")); var instances = new InMemoryProcessInstancesStore(); var manager = new ProcessManager(models, instances); var result = manager.HandleEvent(new Start()).First(); manager.GetExecutionPoint( result.ProcessInstanceId, result.AffectedTokens.First() ).Should().Be("middle"); result = manager.HandleEvent(result.ProcessInstanceId, result.AffectedTokens.First(), new object()); manager.InstancesStore.GetById(result.ProcessInstanceId) .IsDone.Should().Be(true); }
public ProcessModel AddEventCatcherFor <TEvent>(string name) where TEvent : class { var eventCatcher = new TypedEventCatcher <TEvent>(); var element = NamedProcessElement <IEventCatcher> .Create(name, eventCatcher); return(AddEventCatcher(element)); }
public void AnswerIfCouldStartWithSpecificEvent() { var model = ProcessModel.Create() .AddEventCatcher("start", TypedEventCatcher <Start> .Create()) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "end"); model.CanStartWith(new ExecutionContext(null, null, null, null, null), new object()).Should().BeFalse(); model.CanStartWith(new ExecutionContext(null, null, null, null, null), new Start()).Should().BeTrue(); }
public void RespectEventTypes() { var model = ProcessModel.Create() .AddEventCatcher("start", TypedEventCatcher <Start> .Create()) .AddEventCatcher("middle1", TypedEventCatcher <Middle1> .Create()) .AddEventCatcher("middle2", TypedEventCatcher <Middle2> .Create()) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "middle1", "middle2", "end"); var processInstance = ProcessInstance.Create(model.Id); // nothing happens var context = new ExecutionContext(null, model, processInstance, processInstance.Token, null); processInstance.HandleEvent(context, new object()); processInstance.Token.ExecutionPoint.Should().BeNull(); processInstance.HandleEvent(context, new Start()); processInstance.Token.ExecutionPoint.Should().Be("middle1"); processInstance.HandleEvent(context, new Start()); processInstance.Token.ExecutionPoint.Should().Be("middle1"); processInstance.HandleEvent(context, new Middle2()); processInstance.Token.ExecutionPoint.Should().Be("middle1"); processInstance.HandleEvent(context, new Middle1()); processInstance.Token.ExecutionPoint.Should().Be("middle2"); processInstance.HandleEvent(context, new Middle1()); processInstance.Token.ExecutionPoint.Should().Be("middle2"); processInstance.HandleEvent(context, new Middle2()); processInstance.Token.ExecutionPoint.Should().BeNull(); processInstance.HandleEvent(context, new Middle2()); processInstance.Token.ExecutionPoint.Should().BeNull(); processInstance.History.Count().Should().Be(4); processInstance.IsDone.Should().BeTrue(); processInstance.Token.WasReleased.Should().BeTrue(); }
public void CreateInstancesOnlyWhenApplicable() { var model = ProcessModel.Create() .AddEventCatcher("start", TypedEventCatcher <Start> .Create()) .AddEventCatcher("middle", CatchAnyEventCatcher.Create()) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "middle", "end"); var models = new InMemoryProcessModelsStore(); models.Store(model); var instances = new InMemoryProcessInstancesStore(); var manager = new ProcessManager(models, instances); manager.HandleEvent(new object()); manager.InstancesStore.GetRunningInstancesCount().Should().Be(0); manager.HandleEvent(new Start()); manager.InstancesStore.GetRunningInstancesCount().Should().Be(1); }
public static ProcessModel Create() => ProcessModel.Create(MessagingProcessId) .AddEventCatcher("newMessage", TypedEventCatcher <NewMessageEvent> .Create()) .AddEventCatcher("processed", TypedEventCatcher <MessageProcessedEvent> .Create()) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("newMessage", "processed", "end");