- Revision
- 1581
- Author
- mauro
- Date
- 2010-02-22 14:41:53 -0600 (Mon, 22 Feb 2010)
Log Message
JBEHAVE-239: Added uponEmbedded boolean attribute to @Before/@AfterStory annotations, to allow before and after story steps to be run or not depending on the embedded story status.
Modified Paths
- trunk/core/examples/trader/src/main/java/org/jbehave/examples/trader/BeforeAfterSteps.java
- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/ScenarioRunnerBehaviour.java
- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/StepsBehaviour.java
- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreatorBehaviour.java
- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/ScenarioRunner.java
- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/AfterStory.java
- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/BeforeStory.java
- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/CandidateSteps.java
- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/StepCreator.java
- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/Steps.java
- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreator.java
Added Paths
Removed Paths
Diff
Modified: trunk/core/examples/trader/src/main/java/org/jbehave/examples/trader/BeforeAfterSteps.java (1580 => 1581)
--- trunk/core/examples/trader/src/main/java/org/jbehave/examples/trader/BeforeAfterSteps.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/examples/trader/src/main/java/org/jbehave/examples/trader/BeforeAfterSteps.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -20,6 +20,16 @@ System.out.println("After Story ..."); } + @BeforeStory(uponEmbedded=true) + public void beforeEmbeddedStory() { + System.out.println("Before Embedded Story ..."); + } + + @AfterStory(uponEmbedded=true) + public void afterEmbeddedStory() { + System.out.println("After Embedded Story ..."); + } + @BeforeScenario public void beforeScenario() { System.out.println("Before Scenario ...");
Modified: trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/ScenarioRunnerBehaviour.java (1580 => 1581)
--- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/ScenarioRunnerBehaviour.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/ScenarioRunnerBehaviour.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -69,12 +69,12 @@ when(creator.createStepsFrom(scenarioDefinition2, tableRow, mySteps)).thenReturn(new Step[] { successfulStep }); when(creator.createStepsFrom(scenarioDefinition3, tableRow, mySteps)).thenReturn( new Step[] { successfulStep, pendingStep }); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition, creator, mySteps); + givenStoryWithNoBeforeOrAfterSteps(storyDefinition, embeddedStory, creator, mySteps); // When ErrorStrategy errorStrategy = mock(ErrorStrategy.class); ScenarioRunner runner = new ScenarioRunner(); - runner.run(storyDefinition, configurationWith(reporter, creator, errorStrategy), false, mySteps); + runner.run(storyDefinition, configurationWith(reporter, creator, errorStrategy), embeddedStory, mySteps); // Then InOrder inOrder = inOrder(reporter, errorStrategy); @@ -119,19 +119,19 @@ when(successfulStep.perform()).thenReturn(StepResult.success("successfulStep")); Step anotherSuccessfulStep = mock(Step.class); when(anotherSuccessfulStep.perform()).thenReturn(StepResult.success("anotherSuccessfulStep")); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition1, creator, mySteps); + givenStoryWithNoBeforeOrAfterSteps(storyDefinition1, embeddedStory, creator, mySteps); when(creator.createStepsFrom(scenarioDefinition1, tableRow, mySteps)).thenReturn(new Step[] { successfulStep }); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition2, creator, mySteps); + givenStoryWithNoBeforeOrAfterSteps(storyDefinition2, embeddedStory, creator, mySteps); when(creator.createStepsFrom(scenarioDefinition2, tableRow, mySteps)).thenReturn( new Step[] { anotherSuccessfulStep }); when(scenarioDefiner.loadScenarioDefinitionsFor("/path/to/given/scenario1")).thenReturn(storyDefinition1); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition1, creator, mySteps); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition2, creator, mySteps); + givenStoryWithNoBeforeOrAfterSteps(storyDefinition1, embeddedStory, creator, mySteps); + givenStoryWithNoBeforeOrAfterSteps(storyDefinition2, embeddedStory, creator, mySteps); ErrorStrategy errorStrategy = mock(ErrorStrategy.class); // When ScenarioRunner runner = new ScenarioRunner(); - runner.run(storyDefinition2, configurationWith(scenarioDefiner, reporter, creator, errorStrategy), false, + runner.run(storyDefinition2, configurationWith(scenarioDefiner, reporter, creator, errorStrategy), embeddedStory, mySteps); // Then @@ -162,11 +162,12 @@ when(fourthStepAlsoPending.doNotPerform()).thenReturn( StepResult.notPerformed("Then I should not be performed either")); StoryDefinition storyDefinition = new StoryDefinition(new ScenarioDefinition("")); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition, creator, mySteps); + boolean embeddedStory = false; + givenStoryWithNoBeforeOrAfterSteps(storyDefinition, embeddedStory, creator, mySteps); // When ScenarioRunner runner = new ScenarioRunner(); - runner.run(storyDefinition, configurationWith(reporter, creator), false, + runner.run(storyDefinition, configurationWith(reporter, creator), embeddedStory, mySteps); // Then @@ -197,8 +198,8 @@ when(creator.createStepsFrom((ScenarioDefinition) anyObject(), eq(tableRow), eq(mySteps))).thenReturn( new Step[] { firstStepExceptional, secondStepNotPerformed }); StoryDefinition storyDefinition = new StoryDefinition(new ScenarioDefinition("")); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition, creator, mySteps); boolean embeddedStory = false; + givenStoryWithNoBeforeOrAfterSteps(storyDefinition, embeddedStory, creator, mySteps); // When ScenarioRunner runner = new ScenarioRunner(); @@ -233,12 +234,13 @@ when(creator.createStepsFrom(scenario1, tableRow, mySteps)).thenReturn(new Step[] { pendingStep }); when(creator.createStepsFrom(scenario2, tableRow, mySteps)).thenReturn(new Step[] { secondStep }); StoryDefinition storyDefinition = new StoryDefinition(scenario1, scenario2); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition, creator, mySteps); + boolean embeddedStory = false; + givenStoryWithNoBeforeOrAfterSteps(storyDefinition, embeddedStory, creator, mySteps); // When ScenarioRunner runner = new ScenarioRunner(); - runner.run(storyDefinition, configurationWith(reporter, creator), false, mySteps); + runner.run(storyDefinition, configurationWith(reporter, creator), embeddedStory, mySteps); // Then verify(pendingStep).perform(); @@ -257,12 +259,13 @@ StepCreator creator = mock(StepCreator.class); CandidateSteps mySteps = mock(Steps.class); StoryDefinition storyDefinition = new StoryDefinition(); - when(creator.createStepsFrom(storyDefinition, Stage.BEFORE, mySteps)).thenReturn(new Step[] { beforeStep }); - when(creator.createStepsFrom(storyDefinition, Stage.AFTER, mySteps)).thenReturn(new Step[] { afterStep }); + boolean embeddedStory = false; + when(creator.createStepsFrom(storyDefinition, Stage.BEFORE, embeddedStory, mySteps)).thenReturn(new Step[] { beforeStep }); + when(creator.createStepsFrom(storyDefinition, Stage.AFTER, embeddedStory, mySteps)).thenReturn(new Step[] { afterStep }); // When ScenarioRunner runner = new ScenarioRunner(); - runner.run(storyDefinition, configurationWith(reporter, creator), false, mySteps); + runner.run(storyDefinition, configurationWith(reporter, creator), embeddedStory, mySteps); // Then verify(beforeStep).perform(); @@ -283,21 +286,22 @@ when(creator.createStepsFrom((ScenarioDefinition) anyObject(), eq(tableRow), eq(mySteps))).thenReturn( new Step[] { pendingStep }); StoryDefinition storyDefinition = new StoryDefinition(new ScenarioDefinition("")); - givenStoryWithNoBeforeOrAfterSteps(storyDefinition, creator, mySteps); + boolean embeddedStory = false; + givenStoryWithNoBeforeOrAfterSteps(storyDefinition, embeddedStory, creator, mySteps); // When ScenarioRunner runner = new ScenarioRunner(); runner.run(storyDefinition, configurationWithPendingStrategy(creator, reporter, - strategy), false, mySteps); + strategy), embeddedStory, mySteps); // Then verify(strategy).handleError(pendingResult.getThrowable()); } - private void givenStoryWithNoBeforeOrAfterSteps(StoryDefinition storyDefinition1, StepCreator creator, CandidateSteps mySteps) { - when(creator.createStepsFrom(storyDefinition1, Stage.BEFORE, mySteps)).thenReturn(new Step[] {}); - when(creator.createStepsFrom(storyDefinition1, Stage.AFTER, mySteps)).thenReturn(new Step[] {}); + private void givenStoryWithNoBeforeOrAfterSteps(StoryDefinition storyDefinition, boolean embeddedStory, StepCreator creator, CandidateSteps mySteps) { + when(creator.createStepsFrom(storyDefinition, Stage.BEFORE, embeddedStory, mySteps)).thenReturn(new Step[] {}); + when(creator.createStepsFrom(storyDefinition, Stage.AFTER, embeddedStory, mySteps)).thenReturn(new Step[] {}); } private Configuration configurationWithPendingStrategy(StepCreator creator, ScenarioReporter reporter,
Modified: trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/StepsBehaviour.java (1580 => 1581)
--- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/StepsBehaviour.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/StepsBehaviour.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -86,6 +86,33 @@ } @Test + public void shouldProvideStepsToBePerformedBeforeStory() { + MultipleAliasesSteps steps = new MultipleAliasesSteps(); + List<Step> beforeStory = steps.runBeforeStory(false); + ensureThat(beforeStory.size(), equalTo(1)); + beforeStory.get(0).perform(); + ensureThat(steps.beforeStory); + List<Step> beforeEmbeddedStory = steps.runBeforeStory(true); + ensureThat(beforeEmbeddedStory.size(), equalTo(1)); + beforeEmbeddedStory.get(0).perform(); + ensureThat(steps.beforeEmbeddedStory); + } + + @Test + public void shouldProvideStepsToBePerformedAfterStory() { + MultipleAliasesSteps steps = new MultipleAliasesSteps(); + List<Step> afterStory = steps.runAfterStory(false); + ensureThat(afterStory.size(), equalTo(1)); + afterStory.get(0).perform(); + ensureThat(steps.afterStory); + List<Step> afterEmbeddedStory = steps.runAfterStory(true); + ensureThat(afterEmbeddedStory.size(), equalTo(1)); + afterEmbeddedStory.get(0).perform(); + ensureThat(steps.afterEmbeddedStory); + } + + + @Test public void shouldProvideStepsToBePerformedBeforeScenarios() { MultipleAliasesSteps steps = new MultipleAliasesSteps(); List<Step> executableSteps = steps.runBeforeScenario(); @@ -175,6 +202,10 @@ private boolean afterAny; private boolean afterSuccess; private boolean afterFailure; + private boolean beforeStory; + private boolean afterStory; + private boolean beforeEmbeddedStory; + private boolean afterEmbeddedStory; @org.jbehave.scenario.annotations.Given("a given") @org.jbehave.scenario.annotations.Aliases(values={"a given alias", "another given alias"}) @@ -193,7 +224,28 @@ public void then() { thens++; } + + @org.jbehave.scenario.annotations.BeforeStory + public void beforeStory() { + beforeStory = true; + } + @org.jbehave.scenario.annotations.AfterStory + public void afterStory() { + afterStory = true; + } + + @org.jbehave.scenario.annotations.BeforeStory(uponEmbedded=true) + public void beforeEmbeddedStory() { + beforeEmbeddedStory = true; + } + + @org.jbehave.scenario.annotations.AfterStory(uponEmbedded=true) + public void afterEmbeddedStory() { + afterEmbeddedStory = true; + } + + @org.jbehave.scenario.annotations.BeforeScenario public void beforeScenarios() { before = true;
Modified: trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreatorBehaviour.java (1580 => 1581)
--- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreatorBehaviour.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreatorBehaviour.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -109,17 +109,18 @@ Step stepAfter1 = mock(Step.class); Step stepAfter2 = mock(Step.class); - when(steps1.runBeforeStory()).thenReturn(asList(stepBefore1)); - when(steps2.runBeforeStory()).thenReturn(asList(stepBefore2)); - when(steps1.runAfterStory()).thenReturn(asList(stepAfter1)); - when(steps2.runAfterStory()).thenReturn(asList(stepAfter2)); + boolean embeddedStory = false; + when(steps1.runBeforeStory(embeddedStory)).thenReturn(asList(stepBefore1)); + when(steps2.runBeforeStory(embeddedStory)).thenReturn(asList(stepBefore2)); + when(steps1.runAfterStory(embeddedStory)).thenReturn(asList(stepAfter1)); + when(steps2.runAfterStory(embeddedStory)).thenReturn(asList(stepAfter2)); // When we create the series of steps for the scenario UnmatchedToPendingStepCreator creator = new UnmatchedToPendingStepCreator(); Step[] beforeSteps = creator.createStepsFrom(new StoryDefinition(new ScenarioDefinition("")), Stage.BEFORE, - steps1, steps2); + embeddedStory, steps1, steps2); Step[] afterSteps = creator.createStepsFrom(new StoryDefinition(new ScenarioDefinition("")), Stage.AFTER, - steps1, steps2); + embeddedStory, steps1, steps2); // Then all before and after steps should be added ensureThat(beforeSteps, array(equalTo(stepBefore1), equalTo(stepBefore2)));
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/ScenarioRunner.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/ScenarioRunner.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/ScenarioRunner.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -59,7 +59,7 @@ throwable = null; reporter.beforeStory(story, embeddedStory); - runSteps(stepCreator.createStepsFrom(story, StepCreator.Stage.BEFORE, candidateSteps), embeddedStory); + runSteps(stepCreator.createStepsFrom(story, StepCreator.Stage.BEFORE, embeddedStory, candidateSteps), embeddedStory); for (ScenarioDefinition scenario : story.getScenarios()) { reporter.beforeScenario(scenario.getTitle()); runGivenScenarios(configuration, scenario, candidateSteps); // first run any given scenarios, if any @@ -70,7 +70,7 @@ } reporter.afterScenario(); } - runSteps(stepCreator.createStepsFrom(story, StepCreator.Stage.AFTER, candidateSteps), embeddedStory); + runSteps(stepCreator.createStepsFrom(story, StepCreator.Stage.AFTER, embeddedStory, candidateSteps), embeddedStory); reporter.afterStory(embeddedStory); currentStrategy.handleError(throwable); }
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/AfterStory.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/AfterStory.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/AfterStory.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -9,4 +9,6 @@ @Target(ElementType.METHOD) public @interface AfterStory { + boolean uponEmbedded() default false; + }
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/BeforeStory.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/BeforeStory.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/annotations/BeforeStory.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -9,4 +9,6 @@ @Target(ElementType.METHOD) public @interface BeforeStory { + boolean uponEmbedded() default false; + }
Copied: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/errors/BeforeOrAfterException.java (from rev 1566, trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/errors/BeforeOrAfterScenarioException.java) (0 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/errors/BeforeOrAfterException.java (rev 0) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/errors/BeforeOrAfterException.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -0,0 +1,21 @@ +package org.jbehave.scenario.errors; + +import static java.text.MessageFormat.format; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; + +/** + * Thrown when methods with before or after annotations (story or scenario) fail. + */ +...@suppresswarnings("serial") +public class BeforeOrAfterException extends RuntimeException { + + private static final String MESSAGE = "Method {0}.{1}, annotated with {2} failed."; + + public BeforeOrAfterException( + Class<? extends Annotation> annotation, Method method, Throwable t) { + super(format(MESSAGE, method.getClass().getSimpleName(), + method.getName(), annotation.getSimpleName()), t); + } +}
Deleted: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/errors/BeforeOrAfterScenarioException.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/errors/BeforeOrAfterScenarioException.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/errors/BeforeOrAfterScenarioException.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -1,25 +0,0 @@ -package org.jbehave.scenario.errors; - -import static java.text.MessageFormat.format; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; - -import org.jbehave.scenario.annotations.AfterScenario; -import org.jbehave.scenario.annotations.BeforeScenario; - -/** - * Thrown when methods annotated with {...@link BeforeScenario @BeforeScenario} or - * {...@link AfterScenario @AfterScenario} fail. - */ -...@suppresswarnings("serial") -public class BeforeOrAfterScenarioException extends RuntimeException { - - private static final String MESSAGE = "Method {0}.{1}, annotated with {2} failed."; - - public BeforeOrAfterScenarioException( - Class<? extends Annotation> annotation, Method method, Throwable t) { - super(format(MESSAGE, method.getClass().getSimpleName(), - method.getName(), annotation.getSimpleName()), t); - } -}
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/CandidateSteps.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/CandidateSteps.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/CandidateSteps.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -22,18 +22,20 @@ CandidateStep[] getSteps(Class<?> stepsClass); /** - * Return all the executable steps to run before each story + * Return all the executable steps to run before each story, based on the embedded status * + * @param embeddedStory the boolean flag denoting the embedded status * @return The list of steps */ - List<Step> runBeforeStory(); + List<Step> runBeforeStory(boolean embeddedStory); /** - * Return all the executable steps to run after each story + * Return all the executable steps to run after each story, based on the embedded status * + * @param embeddedStory the boolean flag denoting the embedded status * @return The list of steps */ - List<Step> runAfterStory(); + List<Step> runAfterStory(boolean embeddedStory); /** * Return all the executable steps to run before each scenario
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/StepCreator.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/StepCreator.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/StepCreator.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -15,7 +15,7 @@ BEFORE, AFTER }; - Step[] createStepsFrom(StoryDefinition storyDefinition, Stage stage, CandidateSteps... candidateSteps); + Step[] createStepsFrom(StoryDefinition storyDefinition, Stage stage, boolean embeddedStory, CandidateSteps... candidateSteps); Step[] createStepsFrom(ScenarioDefinition scenarioDefinition, Map<String, String> tableRow, CandidateSteps... candidateSteps);
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/Steps.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/Steps.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/Steps.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -26,7 +26,7 @@ import org.jbehave.scenario.annotations.When; import org.jbehave.scenario.annotations.AfterScenario.Outcome; import org.jbehave.scenario.definition.KeyWords; -import org.jbehave.scenario.errors.BeforeOrAfterScenarioException; +import org.jbehave.scenario.errors.BeforeOrAfterException; import org.jbehave.scenario.parser.StepPatternBuilder; import org.jbehave.scenario.reporters.ScenarioReporter; @@ -217,43 +217,71 @@ } } - public List<Step> runBeforeStory() { - return stepsHaving(BeforeStory.class, new OkayToRun()); + public List<Step> runBeforeStory(boolean embeddedStory) { + return storyStepsHaving(BeforeStory.class, embeddedStory, new OkayToRun()); } - public List<Step> runAfterStory() { - return stepsHaving(AfterStory.class, new OkayToRun()); + public List<Step> runAfterStory(boolean embeddedStory) { + return storyStepsHaving(AfterStory.class, embeddedStory, new OkayToRun()); } + List<Step> storyStepsHaving(final Class<? extends Annotation> annotationClass, boolean embeddedStory, final StepPart forSuccess) { + List<Step> steps = new ArrayList<Step>(); + for (final Method method : methodsOf(instance)) { + if (method.isAnnotationPresent(annotationClass)) { + if ( runnableStoryStep(method.getAnnotation(annotationClass), embeddedStory) ){ + steps.add(new Step() { + public StepResult doNotPerform() { + return forSuccess.run(annotationClass, method); + } + + public StepResult perform() { + return forSuccess.run(annotationClass, method); + } + }); + } + } + } + return steps; + } + + private boolean runnableStoryStep(Annotation annotation, boolean embeddedStory) { + boolean uponEmbedded = uponEmbedded(annotation); + return uponEmbedded == embeddedStory; + } + + private boolean uponEmbedded(Annotation annotation) { + if ( annotation instanceof BeforeStory ){ + return ((BeforeStory)annotation).uponEmbedded(); + } else if ( annotation instanceof AfterStory ){ + return ((AfterStory)annotation).uponEmbedded(); + } + return false; + } + public List<Step> runBeforeScenario() { - return stepsHaving(BeforeScenario.class, new OkayToRun()); + return scenarioStepsHaving(BeforeScenario.class, new OkayToRun()); } public List<Step> runAfterScenario() { List<Step> steps = new ArrayList<Step>(); - steps.addAll(stepsHavingOutcome(AfterScenario.class, ANY, new OkayToRun(), new OkayToRun())); - steps.addAll(stepsHavingOutcome(AfterScenario.class, SUCCESS, new OkayToRun(), new DoNotRun())); - steps.addAll(stepsHavingOutcome(AfterScenario.class, FAILURE, new DoNotRun(), new OkayToRun())); + steps.addAll(scenarioStepsHavingOutcome(AfterScenario.class, ANY, new OkayToRun(), new OkayToRun())); + steps.addAll(scenarioStepsHavingOutcome(AfterScenario.class, SUCCESS, new OkayToRun(), new DoNotRun())); + steps.addAll(scenarioStepsHavingOutcome(AfterScenario.class, FAILURE, new DoNotRun(), new OkayToRun())); return steps; } - List<Step> stepsHaving(final Class<? extends Annotation> annotationClass, final StepPart forScenarios) { + List<Step> scenarioStepsHaving(final Class<? extends Annotation> annotationClass, final StepPart forSuccess) { List<Step> steps = new ArrayList<Step>(); - Method[] methods; - if (instance == null) { - methods = this.getClass().getMethods(); - } else { - methods = instance.getClass().getMethods(); - } - for (final Method method : methods) { + for (final Method method : methodsOf(instance)) { if (method.isAnnotationPresent(annotationClass)) { steps.add(new Step() { public StepResult doNotPerform() { - return forScenarios.run(annotationClass, method); + return forSuccess.run(annotationClass, method); } public StepResult perform() { - return forScenarios.run(annotationClass, method); + return forSuccess.run(annotationClass, method); } }); @@ -262,22 +290,21 @@ return steps; } - private List<Step> stepsHavingOutcome(final Class<? extends AfterScenario> annotationClass, final Outcome outcome, - final StepPart forSuccessfulScenarios, final StepPart forUnsuccessfulScenarios) { + private List<Step> scenarioStepsHavingOutcome(final Class<? extends AfterScenario> annotationClass, final Outcome outcome, + final StepPart forSuccess, final StepPart forFailure) { List<Step> steps = new ArrayList<Step>(); - Method[] methods = instance.getClass().getMethods(); - for (final Method method : methods) { + for (final Method method : methodsOf(instance)) { if (method.isAnnotationPresent(annotationClass)) { AfterScenario annotation = method.getAnnotation(annotationClass); if (outcome.equals(annotation.uponOutcome())) { steps.add(new Step() { public StepResult doNotPerform() { - return forUnsuccessfulScenarios.run(annotationClass, method); + return forFailure.run(annotationClass, method); } public StepResult perform() { - return forSuccessfulScenarios.run(annotationClass, method); + return forSuccess.run(annotationClass, method); } }); @@ -287,13 +314,25 @@ return steps; } + private Method[] methodsOf(Object instance) { + Method[] methods; + if (instance == null) { + methods = this.getClass().getMethods(); + } else { + methods = instance.getClass().getMethods(); + } + return methods; + } + class OkayToRun implements StepPart { public StepResult run(final Class<? extends Annotation> annotation, Method method) { try { method.invoke(instance); } catch (InvocationTargetException e) { if (e.getCause() != null) { - throw new BeforeOrAfterScenarioException(annotation, method, e.getCause()); + throw new BeforeOrAfterException(annotation, method, e.getCause()); + } else { + throw new RuntimeException(e); } } catch (Throwable t) { throw new RuntimeException(t);
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreator.java (1580 => 1581)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreator.java 2010-02-21 23:04:22 UTC (rev 1580) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/UnmatchedToPendingStepCreator.java 2010-02-22 20:41:53 UTC (rev 1581) @@ -16,15 +16,15 @@ */ public class UnmatchedToPendingStepCreator implements StepCreator { - public Step[] createStepsFrom(StoryDefinition storyDefinition, Stage stage, CandidateSteps... candidateSteps) { + public Step[] createStepsFrom(StoryDefinition storyDefinition, Stage stage, boolean embeddedStory, CandidateSteps... candidateSteps) { List<Step> steps = new ArrayList<Step>(); for (CandidateSteps candidates : candidateSteps) { switch (stage) { case BEFORE: - steps.addAll(candidates.runBeforeStory()); + steps.addAll(candidates.runBeforeStory(embeddedStory)); break; case AFTER: - steps.addAll(candidates.runAfterStory()); + steps.addAll(candidates.runAfterStory(embeddedStory)); break; default: break;
To unsubscribe from this list please visit: