@Test
 public void shouldAllowSpecificationOfStoryFinderClass() {
   // Given
   AbstractEmbedderTask task = new AbstractEmbedderTask() {};
   // When
   task.setStoryFinderClass(MyStoryFinder.class.getName());
   StoryFinder storyFinder = task.newStoryFinder();
   // Then
   assertThat(storyFinder.getClass().getName(), equalTo(MyStoryFinder.class.getName()));
 }
 @Test
 public void shouldAllowSpecificationOfInjectableEmbedderClass() {
   // Given
   AbstractEmbedderTask task = new AbstractEmbedderTask() {};
   // When
   task.setInjectableEmbedderClass(MyInjectableEmbedder.class.getName());
   Embedder embedder = task.newEmbedder();
   // Then
   assertThat(embedder.getClass().getName(), equalTo(MyEmbedder.class.getName()));
 }
 @Test
 public void shouldCreateNewEmbedderWithExecutors() {
   // Given
   AbstractEmbedderTask task = new AbstractEmbedderTask() {};
   // When
   task.setExecutorsClass(MyExecutors.class.getName());
   Embedder embedder = task.newEmbedder();
   // Then
   assertThat(embedder.executorService(), sameInstance(EXECUTOR_SERVICE));
 }
 @Test
 public void shouldAllowTestScopedSearchDirectory() {
   // Given
   AbstractEmbedderTask task = new AbstractEmbedderTask() {};
   // When
   task.setTestSourceDirectory("src/test");
   task.setTestOutputDirectory("target/test-classes");
   task.setScope("test");
   // Then
   assertThat(task.searchDirectory(), equalTo("src/test"));
 }
 @Test
 public void shouldCreateNewEmbedderWithSystemProperties() throws IOException {
   // Given
   AbstractEmbedderTask task = new AbstractEmbedderTask() {};
   // When
   Properties systemProperties = new Properties();
   systemProperties.setProperty("one", "1");
   systemProperties.setProperty("two", "2");
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   systemProperties.store(out, "");
   task.setSystemProperties(out.toString());
   Embedder embedder = task.newEmbedder();
   // Then
   assertThat(embedder.systemProperties(), equalTo(systemProperties));
 }
 @Test
 public void shouldCreateNewEmbedderWithDefaultControls() {
   // Given
   AbstractEmbedderTask task = new AbstractEmbedderTask() {};
   // When
   Embedder embedder = task.newEmbedder();
   // Then
   EmbedderControls embedderControls = embedder.embedderControls();
   assertThat(embedderControls.batch(), is(false));
   assertThat(embedderControls.generateViewAfterStories(), is(true));
   assertThat(embedderControls.ignoreFailureInStories(), is(false));
   assertThat(embedderControls.ignoreFailureInView(), is(false));
   assertThat(embedderControls.verboseFailures(), is(false));
   assertThat(embedderControls.verboseFiltering(), is(false));
   assertThat(embedderControls.skip(), is(false));
   assertThat(embedderControls.storyTimeoutInSecs(), equalTo(300L));
   assertThat(embedderControls.failOnStoryTimeout(), is(false));
   assertThat(embedderControls.threads(), equalTo(1));
 }
  @Test
  public void shouldCreateNewEmbedderWithAntMonitor() {
    // Given
    Project project = mock(Project.class);
    AbstractEmbedderTask task = new AbstractEmbedderTask() {};
    task.setProject(project);
    // When
    Embedder embedder = task.newEmbedder();
    // Then
    EmbedderMonitor embedderMonitor = embedder.embedderMonitor();
    assertThat(embedderMonitor.toString(), equalTo("AntEmbedderMonitor"));

    // and verify monitor calls are propagated to Project log
    BatchFailures failures = new BatchFailures();
    embedderMonitor.batchFailed(failures);
    verify(project).log(task, "Failed to run batch " + failures, MSG_WARN);

    String name = "name";
    Throwable cause = new RuntimeException();
    embedderMonitor.embeddableFailed(name, cause);
    verify(project).log(task, "Failed to run embeddable " + name, cause, MSG_WARN);

    List<String> classNames = asList("name1", "name2");
    embedderMonitor.embeddablesSkipped(classNames);
    verify(project).log(task, "Skipped embeddables " + classNames, MSG_INFO);

    embedderMonitor.runningEmbeddable(name);
    verify(project).log(task, "Running embeddable " + name, MSG_INFO);

    List<String> storyPaths = asList("/path1", "/path2");
    embedderMonitor.storiesSkipped(storyPaths);
    verify(project).log(task, "Skipped stories " + storyPaths, MSG_INFO);

    String path = "/path";
    embedderMonitor.storyFailed(path, cause);
    verify(project).log(task, "Failed to run story " + path, cause, MSG_WARN);

    embedderMonitor.runningStory(path);
    verify(project).log(task, "Running story " + path, MSG_INFO);

    Object annotatedInstance = new Object();
    Class<?> type = Object.class;
    embedderMonitor.annotatedInstanceNotOfType(annotatedInstance, type);
    verify(project)
        .log(task, "Annotated instance " + annotatedInstance + " not of type " + type, MSG_WARN);

    File outputDirectory = new File("/dir");
    List<String> formats = asList(Format.CONSOLE.name(), Format.HTML.name());
    Properties viewProperties = new Properties();
    embedderMonitor.generatingReportsView(outputDirectory, formats, viewProperties);
    verify(project)
        .log(
            task,
            "Generating reports view to '"
                + outputDirectory
                + "' using formats '"
                + formats
                + "'"
                + " and view properties '"
                + viewProperties
                + "'",
            MSG_INFO);

    embedderMonitor.reportsViewGenerationFailed(outputDirectory, formats, viewProperties, cause);
    verify(project)
        .log(
            task,
            "Failed to generate reports view to '"
                + outputDirectory
                + "' using formats '"
                + formats
                + "'"
                + " and view properties '"
                + viewProperties
                + "'",
            cause,
            MSG_WARN);

    int stories = 2;
    int storiesNotAllowed = 1;
    int storiesPending = 1;
    int scenarios = 4;
    int scenariosFailed = 1;
    int scenariosNotAllowed = 0;
    int scenariosPending = 1;
    int stepsFailed = 1;
    embedderMonitor.reportsViewGenerated(
        new ReportsCount(
            stories,
            storiesNotAllowed,
            storiesPending,
            scenarios,
            scenariosFailed,
            scenariosNotAllowed,
            scenariosPending,
            stepsFailed));
    verify(project)
        .log(
            task,
            "Reports view generated with "
                + stories
                + " stories (of which "
                + storiesPending
                + " pending) containing "
                + scenarios
                + " scenarios (of which "
                + scenariosPending
                + " pending)",
            MSG_INFO);
    verify(project)
        .log(
            task,
            "Meta filters excluded "
                + storiesNotAllowed
                + " stories and  "
                + scenariosNotAllowed
                + " scenarios",
            MSG_INFO);

    embedderMonitor.reportsViewNotGenerated();
    verify(project).log(task, "Reports view not generated", MSG_INFO);
  }