package org.jbehave.core.reporters; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.jbehave.core.model.ExamplesTable; import org.jbehave.core.model.GivenStories; import org.jbehave.core.model.Lifecycle; import org.jbehave.core.model.Meta; import org.jbehave.core.model.Narrative; import org.jbehave.core.model.OutcomesTable; import org.jbehave.core.model.Scenario; import org.jbehave.core.model.Story; import org.jbehave.core.model.StoryDuration; /** * Filters out the reports from all stories that pass, The delegate receives * output only for failing or pending stories. */ public class SilentSuccessFilter implements StoryReporter { private final StoryReporter delegate; private State runState = State.SILENT; private State beforeStoryState = State.SILENT; private State afterStoryState = State.SILENT; private State scenarioState = State.SILENT; private List<Todo> scenarioTodos = new ArrayList<Todo>(); private boolean givenStory; public SilentSuccessFilter(StoryReporter delegate) { this.delegate = delegate; } @Override public void dryRun() { runState = new State(){ @Override public void report(){ delegate.dryRun(); } }; runState.report(); } @Override public void pendingMethods(final List<String> methods) { runState = new State(){ @Override public void report(){ delegate.pendingMethods(methods); } }; runState.report(); } @Override public void restarted(String step, Throwable cause) { } @Override public void restartedStory(Story story, Throwable cause) { } @Override public void storyCancelled(Story story, StoryDuration storyDuration) { } @Override public void beforeStory(final Story story, final boolean givenStory) { this.givenStory = givenStory; beforeStoryState = new State() { @Override public void report() { delegate.beforeStory(story, givenStory); beforeStoryState = State.SILENT; } }; } @Override public void narrative(final Narrative narrative) { beforeStoryState = new State() { @Override public void report() { delegate.narrative(narrative); } }; beforeStoryState.report(); } @Override public void lifecyle(final Lifecycle lifecycle) { beforeStoryState = new State() { @Override public void report() { delegate.lifecyle(lifecycle); } }; beforeStoryState.report(); } @Override public void storyNotAllowed(final Story story, final String filter) { beforeStoryState = new State() { @Override public void report() { delegate.storyNotAllowed(story, filter); } }; beforeStoryState.report(); } @Override public void afterStory(boolean givenStory) { afterStoryState.report(); } @Override public void beforeStep(String step) { } @Override public void ignorable(final String step) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.ignorable(step); } }); } @Override public void comment(final String step) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.comment(step); } }); } @Override public void failed(final String step, final Throwable cause) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.failed(step, cause); } }); setStateToNoisy(); } @Override public void failedOutcomes(final String step, final OutcomesTable table) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.failedOutcomes(step, table); } }); setStateToNoisy(); } @Override public void notPerformed(final String step) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.notPerformed(step); } }); setStateToNoisy(); } @Override public void pending(final String step) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.pending(step); } }); setStateToNoisy(); } @Override public void successful(final String step) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.successful(step); } }); } @Override public void afterScenario() { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.afterScenario(); } }); scenarioState.report(); } @Override public void beforeScenario(final String scenarioTitle) { scenarioTodos = new ArrayList<Todo>(); scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.beforeScenario(scenarioTitle); } }); } @Override public void scenarioNotAllowed(final Scenario scenario, final String filter) { scenarioState = new State() { @Override public void report() { delegate.scenarioNotAllowed(scenario, filter); } }; scenarioState.report(); } @Override public void scenarioMeta(final Meta meta) { scenarioTodos = new ArrayList<Todo>(); scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.scenarioMeta(meta); } }); } @Override public void givenStories(final GivenStories givenStories) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.givenStories(givenStories); } }); } @Override public void givenStories(final List<String> storyPaths) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.givenStories(storyPaths); } }); } @Override public void beforeExamples(final List<String> steps, final ExamplesTable table) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.beforeExamples(steps, table); } }); } @Override public void example(final Map<String, String> tableRow) { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.example(tableRow); } }); } @Override public void afterExamples() { scenarioTodos.add(new Todo() { @Override public void doNow() { delegate.afterExamples(); } }); } private static interface Todo { void doNow(); } private interface State { State SILENT = new State() { @Override public void report() { } }; void report(); } private void setStateToNoisy() { scenarioState = new State() { @Override public void report() { beforeStoryState.report(); for (Todo todo : scenarioTodos) { todo.doNow(); } afterStoryState = new State() { @Override public void report() { delegate.afterStory(givenStory); afterStoryState = State.SILENT; } }; scenarioState = State.SILENT; } }; } }