@Test
  public void shouldAllowToSkipBeforeAndAfterScenarioStepsIfGivenStory() throws Throwable {
    // Given
    Scenario scenario1 = new Scenario("scenario 1", asList("successfulStep"));
    GivenStories givenStories = new GivenStories("/path/to/given/story1");
    Scenario scenario2 =
        new Scenario(
            "scenario 2",
            Meta.EMPTY,
            givenStories,
            ExamplesTable.EMPTY,
            asList("anotherSuccessfulStep"));
    Story story1 = new Story(new Description("story 1"), Narrative.EMPTY, asList(scenario1));
    Story story2 = new Story(new Description("story 2"), Narrative.EMPTY, asList(scenario2));

    Step step = mock(Step.class);
    StepResult result = mock(StepResult.class);
    when(step.perform(null)).thenReturn(result);

    StoryParser storyParser = mock(StoryParser.class);
    StoryLoader storyLoader = mock(StoryLoader.class);
    StoryReporter reporter = mock(ConcurrentStoryReporter.class);
    StepCollector collector = mock(StepCollector.class);
    CandidateSteps mySteps = new Steps();
    Step successfulStep = mockSuccessfulStep("successfulStep");
    Step anotherSuccessfulStep = mockSuccessfulStep("anotherSuccessfulStep");
    givenStoryWithNoBeforeOrAfterSteps(story1, false, collector, mySteps);
    when(collector.collectScenarioSteps(asList(mySteps), scenario1, parameters))
        .thenReturn(asList(successfulStep));
    givenStoryWithNoBeforeOrAfterSteps(story2, true, collector, mySteps);
    when(collector.collectScenarioSteps(asList(mySteps), scenario2, parameters))
        .thenReturn(asList(anotherSuccessfulStep));
    when(storyLoader.loadStoryAsText("/path/to/given/story1")).thenReturn("storyContent");
    when(storyParser.parseStory("storyContent", "/path/to/given/story1")).thenReturn(story1);
    FailureStrategy failureStrategy = mock(FailureStrategy.class);

    Step beforeStep = mockSuccessfulStep("SuccessfulBeforeScenarioStep");
    Step afterStep = mockSuccessfulStep("SuccessfulAfterScenarioStep");
    when(collector.collectBeforeOrAfterScenarioSteps(
            eq(asList(mySteps)), Matchers.<Meta>any(), eq(Stage.BEFORE), eq(ScenarioType.NORMAL)))
        .thenReturn(asList(beforeStep));
    when(collector.collectBeforeOrAfterScenarioSteps(
            eq(asList(mySteps)), Matchers.<Meta>any(), eq(Stage.AFTER), eq(ScenarioType.NORMAL)))
        .thenReturn(asList(afterStep));

    // When
    StoryRunner runner = new StoryRunner();
    Configuration configuration =
        configurationWith(storyParser, storyLoader, reporter, collector, failureStrategy);
    configuration.storyControls().doSkipBeforeAndAfterScenarioStepsIfGivenStory(true);
    runner.run(configuration, asList(mySteps), story2);

    // Then
    verify(collector).collectScenarioSteps(asList(mySteps), scenario1, parameters);
    verify(collector).collectScenarioSteps(asList(mySteps), scenario2, parameters);

    InOrder inOrder = inOrder(beforeStep, successfulStep, anotherSuccessfulStep, afterStep);

    inOrder.verify(beforeStep).perform(null);
    inOrder.verify(successfulStep).perform(null);
    inOrder.verify(anotherSuccessfulStep).perform(null);
    inOrder.verify(afterStep).perform(null);
  }
  @Test
  public void shouldRunGivenStoriesAtStoryAndScenarioLevel() throws Throwable {
    // Given
    GivenStories storyGivenStories = new GivenStories("/path/to/given/story1");
    GivenStories scenarioGivenStories = new GivenStories("/path/to/given/story1");
    Scenario scenario1 = new Scenario("scenario 1", asList("successfulStep"));
    Scenario scenario2 =
        new Scenario(
            "scenario 2",
            Meta.EMPTY,
            scenarioGivenStories,
            ExamplesTable.EMPTY,
            asList("anotherSuccessfulStep"));
    Story story1 = new Story(new Description("story 1"), Narrative.EMPTY, asList(scenario1));
    Story story2 =
        new Story(
            "",
            new Description("story 2"),
            Meta.EMPTY,
            Narrative.EMPTY,
            storyGivenStories,
            asList(scenario2));

    Step step = mock(Step.class);
    StepResult result = mock(StepResult.class);
    when(step.perform(null)).thenReturn(result);

    StoryParser storyParser = mock(StoryParser.class);
    StoryLoader storyLoader = mock(StoryLoader.class);
    StoryReporter reporter = mock(ConcurrentStoryReporter.class);
    StepCollector collector = mock(StepCollector.class);
    CandidateSteps mySteps = new Steps();
    Step successfulStep = mockSuccessfulStep("successfulStep");
    Step anotherSuccessfulStep = mockSuccessfulStep("anotherSuccessfulStep");
    boolean givenStory = false;
    givenStoryWithNoBeforeOrAfterSteps(story1, givenStory, collector, mySteps);
    when(collector.collectScenarioSteps(asList(mySteps), scenario1, parameters))
        .thenReturn(asList(successfulStep));
    givenStoryWithNoBeforeOrAfterSteps(story2, givenStory, collector, mySteps);
    when(collector.collectScenarioSteps(asList(mySteps), scenario2, parameters))
        .thenReturn(asList(anotherSuccessfulStep));
    when(storyLoader.loadStoryAsText("/path/to/given/story1")).thenReturn("storyContent");
    when(storyParser.parseStory("storyContent", "/path/to/given/story1")).thenReturn(story1);
    givenStoryWithNoBeforeOrAfterSteps(story1, givenStory, collector, mySteps);
    givenStoryWithNoBeforeOrAfterSteps(story2, givenStory, collector, mySteps);
    FailureStrategy failureStrategy = mock(FailureStrategy.class);

    // When
    StoryRunner runner = new StoryRunner();
    Configuration configuration =
        configurationWith(storyParser, storyLoader, reporter, collector, failureStrategy);
    runner.run(configuration, asList(mySteps), story2);

    // Then
    InOrder inOrder = inOrder(reporter);
    inOrder.verify(reporter).beforeStory(story2, givenStory);
    inOrder.verify(reporter).givenStories(storyGivenStories);
    inOrder.verify(reporter).givenStories(scenarioGivenStories);
    inOrder.verify(reporter).successful("successfulStep");
    inOrder.verify(reporter).successful("anotherSuccessfulStep");
    inOrder.verify(reporter).afterStory(givenStory);
    verify(reporter, never()).beforeStory(story1, givenStory);
  }