// <summary> // Prepares composite steps for validation // </summary> // <param name="stepCounter">StepCounter object to count optional and required steps</param> // <param name="parentIsOptional">Indicates if parent step is optional</param> // <param name="parentStep">parent step object</param> // <param name="indexInParent">index of this step inside its parent</param> private static void PrepareExpectedTrace(TraceGroup traceStep, bool parentIsOptional, TraceGroup parentStep, int indexInParent) { // set parent step reference for this step traceStep.parent = parentStep; traceStep.indexInParent = indexInParent; bool optional = parentIsOptional || traceStep.Optional; // set parent step reference for children steps for (int i = 0; i < traceStep.Steps.Count; i++) { WorkflowTraceStep childStep = traceStep.Steps[i]; if (childStep is TraceGroup) { TraceValidator.PrepareExpectedTrace((TraceGroup)childStep, optional, traceStep, i); } else if (childStep is IActualTraceStep) { if (optional || childStep.Optional) { TraceValidator.AddExpectedOptStepCount((IActualTraceStep)childStep); } else { TraceValidator.AddExpectedReqStepCount((IActualTraceStep)childStep); } } } // declare & init endIndexes[] array traceStep.endIndexes = new int[traceStep.Steps.Count]; for (int i = 0; i < traceStep.Steps.Count; i++) { traceStep.endIndexes[i] = -1; } }