Title: [1581] trunk/core/jbehave-core/src/main/java/org/jbehave/scenario: 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.

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:

http://xircles.codehaus.org/manage_email

Reply via email to