public void should_advance_workflow()
        {
            //arrange
            var definition = new WorkflowDefinition();
            var pointer1   = new ExecutionPointer()
            {
                Active = true, StepId = 0, Status = PointerStatus.Running
            };
            var pointer2 = new ExecutionPointer();
            var outcome  = new StepOutcome()
            {
                NextStep = 1
            };
            var step           = A.Fake <WorkflowStep>();
            var workflowResult = new WorkflowExecutorResult();
            var instance       = GivenWorkflow(pointer1);
            var result         = ExecutionResult.Next();

            A.CallTo(() => step.Outcomes).Returns(new List <StepOutcome>()
            {
                outcome
            });
            A.CallTo(() => PointerFactory.BuildNextPointer(definition, pointer1, outcome)).Returns(pointer2);

            //act
            Subject.ProcessExecutionResult(instance, definition, pointer1, step, result, workflowResult);

            //assert
            pointer1.Active.Should().BeFalse();
            pointer1.Status.Should().Be(PointerStatus.Complete);
            pointer1.EndTime.Should().NotBeNull();

            A.CallTo(() => PointerFactory.BuildNextPointer(definition, pointer1, outcome)).MustHaveHappened();
            instance.ExecutionPointers.Should().Contain(pointer2);
        }
Exemplo n.º 2
0
        public IStepOutcomeBuilder <TData> When(object outcomeValue)
        {
            StepOutcome result = new StepOutcome();

            result.Value = outcomeValue;
            Step.Outcomes.Add(result);
            var outcomeBuilder = new StepOutcomeBuilder <TData>(_workflowBuilder, result);

            return(outcomeBuilder);
        }
Exemplo n.º 3
0
        public IStepOutcomeBuilder <TData> When(object outcomeValue, string label = null)
        {
            StepOutcome result = new StepOutcome();

            result.Value = x => outcomeValue;
            result.Label = label;
            Step.Outcomes.Add(result);
            var outcomeBuilder = new StepOutcomeBuilder <TData>(WorkflowBuilder, result);

            return(outcomeBuilder);
        }
Exemplo n.º 4
0
        public void should_select_correct_outcomes()
        {
            //arrange
            var definition = new WorkflowDefinition();
            var pointer1   = new ExecutionPointer()
            {
                Id = "1", Active = true, StepId = 0, Status = PointerStatus.Running
            };
            var pointer2 = new ExecutionPointer()
            {
                Id = "2"
            };
            var pointer3 = new ExecutionPointer()
            {
                Id = "3"
            };
            Expression <Func <object, object> > expr1 = data => 10;
            Expression <Func <object, object> > expr2 = data => 20;
            var outcome1 = new StepOutcome()
            {
                NextStep = 1, Value = expr1
            };
            var outcome2 = new StepOutcome()
            {
                NextStep = 2, Value = expr2
            };
            var step           = A.Fake <WorkflowStep>();
            var workflowResult = new WorkflowExecutorResult();
            var instance       = GivenWorkflow(pointer1);
            var result         = ExecutionResult.Outcome(20);

            A.CallTo(() => step.Outcomes).Returns(new List <StepOutcome>()
            {
                outcome1, outcome2
            });
            A.CallTo(() => PointerFactory.BuildNextPointer(definition, pointer1, outcome1)).Returns(pointer2);
            A.CallTo(() => PointerFactory.BuildNextPointer(definition, pointer1, outcome2)).Returns(pointer3);

            //act
            Subject.ProcessExecutionResult(instance, definition, pointer1, step, result, workflowResult);

            //assert
            pointer1.Active.Should().BeFalse();
            pointer1.Status.Should().Be(PointerStatus.Complete);
            pointer1.EndTime.Should().NotBeNull();

            A.CallTo(() => PointerFactory.BuildNextPointer(definition, pointer1, outcome1)).MustNotHaveHappened();
            A.CallTo(() => PointerFactory.BuildNextPointer(definition, pointer1, outcome2)).MustHaveHappened();
            instance.ExecutionPointers.Should().NotContain(pointer2);
            instance.ExecutionPointers.Should().Contain(pointer3);
        }
Exemplo n.º 5
0
        public IStepOutcomeBuilder <TData> When(object outcomeValue, string label = null)
        {
            Expression <Func <object, object> > expr = x => outcomeValue;
            StepOutcome result = new StepOutcome
            {
                Value = expr,
                Label = label
            };

            Step.Outcomes.Add(result);
            var outcomeBuilder = new StepOutcomeBuilder <TData>(WorkflowBuilder, result);

            return(outcomeBuilder);
        }
Exemplo n.º 6
0
        internal BuildStepDomainEntity Stop(StepOutcome outcome)
        {
            if (Status != BuildStepStatus.Running)
            {
                throw new Exception($"Step was not expecting to be stopped: it was not running.");
            }
            switch (outcome)
            {
            case StepOutcome.Fail:
                Status = BuildStepStatus.Error;
                break;

            case StepOutcome.Success:
            case StepOutcome.Unknown:
                Status = BuildStepStatus.Done;
                break;
            }
            return(this);
        }
Exemplo n.º 7
0
        private StepOutcome[] ConvertOutDataDefault(IOrchestrationComponent component)
        {
            List <StepOutcome> outcomes = new List <StepOutcome>();

            if (typeof(AbstractMultiPathProcessComponent).IsAssignableFrom(component.GetType()))
            {
                string[] paths = ((AbstractMultiPathProcessComponent)component).GetConnectionPaths();
                foreach (string path in paths)
                {
                    LogicBase.Core.Data.DataDefinition[] dataParts = null;
                    if (component is IMultiPathDataAdded)
                    {
                        dataParts = ((IMultiPathDataAdded)component).GetAddedData(path);
                    }
                    StepOutcome outcomeToAdd = new StepOutcome()
                    {
                        PathName = path
                    };
                    List <LogicBaseProjectConversionUtility.ProjectConversionService.DataDefinition> outcomeDefs
                        = new List <LogicBaseProjectConversionUtility.ProjectConversionService.DataDefinition>();
                    if (dataParts != null)
                    {
                        foreach (LogicBase.Core.Data.DataDefinition oldDef in dataParts)
                        {
                            outcomeDefs.Add(new LogicBaseProjectConversionUtility.ProjectConversionService.DataDefinition()
                            {
                                FullTypeName = oldDef.DataType.FullName,
                                IsList       = oldDef.IsArray,
                                Name         = oldDef.Name
                            });
                        }
                    }
                    outcomeToAdd.OutcomeData = outcomeDefs.ToArray();

                    outcomes.Add(outcomeToAdd);
                }
            }
            return(outcomes.ToArray());
        }
        public override StepOutcome[] GetOutcomes(IOrchestrationComponent component)
        {
            // Linked model outputs will need to be recreated to work well
            // so no need to worry about the outcomes from the old engine here.
            List <StepOutcome> results = new List <StepOutcome>();
            StepOutcome        result  = new StepOutcome();

            result.PathName = "End";

            List <DataDefinition> data = new List <DataDefinition>();

            foreach (LogicBase.Core.Data.DataDefinition x in component.Model.OutputData)
            {
                data.Add(new DataDefinition()
                {
                    Name         = x.Name,
                    IsList       = x.IsArray,
                    FullTypeName = x.DataType.FullName
                });
            }
            result.OutcomeData = data.ToArray();
            return(results.ToArray());
        }
Exemplo n.º 9
0
        public ExecutionPointer BuildNextPointer(WorkflowDefinition def, ExecutionPointer pointer, StepOutcome outcomeTarget)
        {
            var nextId = GenerateId();

            return(new ExecutionPointer()
            {
                Id = nextId,
                PredecessorId = pointer.Id,
                StepId = outcomeTarget.NextStep,
                Active = true,
                ContextItem = pointer.ContextItem,
                Status = PointerStatus.Pending,
                StepName = def.Steps.FindById(outcomeTarget.NextStep).Name,
                Scope = new List <string>(pointer.Scope)
            });
        }
Exemplo n.º 10
0
 public StepOutcomeBuilder(IWorkflowBuilder <TData> workflowBuilder, StepOutcome outcome)
 {
     WorkflowBuilder = workflowBuilder;
     Outcome         = outcome;
 }
Exemplo n.º 11
0
 private static void CreateOutcomeEntry(Dictionary<string, StepOutcome> dictionary, List<string> header, List<string> result)
 {
     string key = header.First().Trim().TrimEnd(':');
     var resultLineOne = result.First().Trim();
     var doneMatch = Regex.Match(resultLineOne, "done: (?<method>.*)\\((?<args>.*)\\) \\((?<seconds>.*)s\\)");
     var errorMatch = Regex.Match(resultLineOne, "(?<result>.*): (?<message>.*)");
     if (doneMatch.Success)
     {
         var args = header.Count > 1 ? string.Join("\n", header.Skip(2).Select(x => x.Trim())) : doneMatch.Groups["args"].Value;
         dictionary[key] = new StepOutcome
             {
                 Method = doneMatch.Groups["method"].Value,
                 Result = Status.Passed,
                 Args = args,
                 Seconds = double.Parse(doneMatch.Groups["seconds"].Value)
             };
     }
     else if (errorMatch.Success)
     {
         dictionary[key] = new StepOutcome
             {
                 Result = Status.Failed,
                 ErrorMessage = errorMatch.Groups["message"].Value + string.Concat(result.Skip(1).Select(x => "\n" + x)),
             };
     }
     else if (resultLineOne.StartsWith("-> No matching step definition found for the step"))
     {
         dictionary[key] = new StepOutcome
         {
             Result = Status.Pending,
             ErrorMessage = "(Step missing)",
             FullErrorMessage = "No matching step definition found for the step, implement it with:\n" + string.Concat(result.Skip(1).Select(x => "\n" + x))
         };
     }
     else if (resultLineOne.StartsWith("-> skipped because of previous errors"))
     {
         dictionary[key] = new StepOutcome
         {
             Result = Status.Unknown,
             ErrorMessage = "(Skipped)",
             FullErrorMessage = "Step was skipped because of previous errors"
         };
     }
     else
     {
         dictionary[key] = new StepOutcome
             {
                 Result = Status.Inconclusive,
                 FullErrorMessage = "SpecShow failed to parse: " + resultLineOne
             };
     }
 }
 public ProcessingResult(StepOutcome outcome, TResult result, IResultDetails details)
 {
     Result  = result;
     Outcome = outcome;
     Details = details;
 }
Exemplo n.º 13
0
 public EndStepCommand(string buildID, int stepIndex, StepOutcome outcome)
 {
     BuildID   = buildID;
     StepIndex = stepIndex;
     Outcome   = outcome;
 }