public SpecInfo Run(SpecInfo spec, MessageFormatter formatter) { var givenSteps = new StepInfo[_given.Count]; for (int i = 0; i < _given.Count; i++) { var given = _given[i]; int i1 = i; given.DescribeTo(s => { var stepInfo = new StepInfo(s); givenSteps[i1] = stepInfo; return spec.ReportGivenStep(stepInfo); }, formatter); } var prepareStep = new StepInfo("Setup completed"); spec.ReportGivenStep(prepareStep); _when.DescribeTo(spec.ReportWhenStep, formatter); var token = new CancellationTokenSource(); var events = new List<object>(); try { //wireup Action<object> sink = events.Add; var router = _wireup(sink); if (_given.Count == 0) { var step = new StepInfo("No history"); spec.ReportGivenStep(step); step.Pass(); } else for (int i = 0; i < _given.Count; i++) { var g = _given[i]; g.RunTo(router); givenSteps[i].Pass(); } events.Clear(); prepareStep.Pass(); //run when _when.RunTo(router); spec.When.Pass(); } catch { _expectations.DescribeTo(spec, formatter); throw; } finally { token.Cancel(); } //then _expectations.Verify(events.ToArray(), spec, formatter); return spec; }