code: public StepEndState runSteps(ExecutionToken executionToken, StepInvokerProvider stepInvokerProvider, List<StepToken> stepList, StepCatalogue stepCatalogue, boolean skip) {
  
          for (StepToken step : stepList) {
              StepEndState endState = processStep(executionToken, stepInvokerProvider, step, stepCatalogue, skip);
              switch (endState) {
                  case PASSED:
                      break;
                  case FAILED:
                      skip = true;//skip (don't execute) the rest of the steps
                      break;
                  case UNDEFINED:
                      skip = true;//skip (don't execute) the rest of the steps
                      break;
                  case PENDING:
                      skip = true;//skip (don't execute) the rest of the steps
                      break;
                  case TIMEOUT:
                      skip = true;//skip (don't execute) the rest of the steps
                      break;
                  case SKIPPED:
                  case DRYRUN:
                      break;
                  default :
                      throw new RuntimeException("Unhandled step state " + endState);
  
              }
          }
  
          StepEndState stepMacroEndState = StepMacro.calculateStepMacroEndState(stepList);
          return stepMacroEndState;
      }
docs: Process all steps in stepList
  
  @param skip, do not actually execute (but mark as skipped if not unimplemented)
  
  @return a StepEndState is the StepMacro step's end state, if these steps are executed as part of a StepMacro rather than scenario