/// <summary>
        /// Instantiate transition from this step
        /// </summary>
        protected override TransitionBase Instantiate(IWorkplanContext context)
        {
            var engine        = Workflow.CreateEngine(Workplan, context);
            var indexResolver = _indexResolver ??= TransitionBase.CreateIndexResolver(OutputDescriptions);
            var transition    = new SubworkflowTransition(engine, indexResolver);

            return(transition);
        }
        /// <summary>
        /// Creates a <see cref="TaskTransition{T}"/> for this activity type
        /// </summary>
        protected override TransitionBase Instantiate(IWorkplanContext context)
        {
            if (context.IsDisabled(this))
            {
                return(new NullTransition());
            }

            // Create transition
            var indexResolver = _indexResolver ?? (_indexResolver = TransitionBase.CreateIndexResolver(OutputDescriptions));

            return(new TaskTransition <TActivity>(Parameters, indexResolver));
        }
        public void SubworkflowPause()
        {
            // Arrange
            var workplan = WorkplanDummy.CreatePausableSub();
            var exits    = workplan.Connectors.Where(c => c.Classification.HasFlag(NodeClassification.Exit)).ToArray();
            var outputs  = new[]
            {
                new OutputDescription {
                    MappingValue = (int)exits[0].Id
                },
            };
            var trans = new SubworkflowTransition(Workflow.CreateEngine(workplan, new NullContext()), TransitionBase.CreateIndexResolver(outputs))
            {
                Id      = 1,
                Inputs  = new[] { _inputs[0] },
                Outputs = _outputs
            };
            var triggered = new List <ITransition>();

            // Act
            trans.Initialize();
            trans.Triggered += (sender, args) => triggered.Add((ITransition)sender);
            _inputs[0].Add(_token);
            trans.Pause();
            var state = trans.InternalState;

            trans.Resume();

            // Assert
            Assert.AreEqual(0, _inputs[0].Tokens.Count());
            Assert.AreEqual(_token, _outputs[0].Tokens.First());
            Assert.AreEqual(1, triggered.Count);
            Assert.IsInstanceOf <WorkflowSnapshot>(state);
            var snapshot = (WorkflowSnapshot)state;

            Assert.AreEqual(1, snapshot.Holders.Length);
            var stepId = workplan.Steps.First(s => s is PausableStep).Id;

            Assert.AreEqual(stepId, snapshot.Holders[0].HolderId);
        }
        public void SubWorkflowTransition()
        {
            // Arrange
            var workplan = WorkplanDummy.CreateSub();
            var exits    = workplan.Connectors.Where(c => c.Classification.HasFlag(NodeClassification.Exit)).ToArray();
            var outputs  = new[]
            {
                new OutputDescription {
                    MappingValue = (int)exits[0].Id
                },
                new OutputDescription {
                    MappingValue = (int)exits[1].Id
                },
            };
            var trans = new SubworkflowTransition(Workflow.CreateEngine(workplan, new NullContext()), TransitionBase.CreateIndexResolver(outputs))
            {
                Id      = 1,
                Inputs  = new[] { _inputs[0] },
                Outputs = _outputs
            };
            var triggered = new List <ITransition>();

            // Act
            trans.Initialize();
            trans.Triggered += (sender, args) => triggered.Add((ITransition)sender);
            _inputs[0].Add(_token);

            // Assert
            Assert.AreEqual(0, _inputs[0].Tokens.Count());
            Assert.AreEqual(_token, _outputs[0].Tokens.First());
            Assert.AreEqual(2, triggered.Count);
            Assert.IsTrue(triggered.All(t => t is DummyTransition));
        }