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);
        }
Esempio n. 2
0
        public ProcessModel AddEventCatcherFor <TEvent>(string name)
            where TEvent : class
        {
            var eventCatcher = new TypedEventCatcher <TEvent>();
            var element      = NamedProcessElement <IEventCatcher> .Create(name, eventCatcher);

            return(AddEventCatcher(element));
        }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
 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");