- Revision
- 743
- Author
- mauro
- Date
- 2007-07-10 08:18:50 -0500 (Tue, 10 Jul 2007)
Log Message
JBEHAVE-86: Applied patch from Eric Lewin.
Modified Paths
- trunk/core/src/analysis/user withdraws cash.txt
- trunk/core/src/java/org/jbehave/core/story/StoryBuilder.java
- trunk/core/src/java/org/jbehave/core/story/StoryLoader.java
- trunk/core/src/java/org/jbehave/core/story/StoryPrinter.java
- trunk/core/src/java/org/jbehave/core/story/domain/MultiStepScenario.java
- trunk/core/src/java/org/jbehave/core/story/domain/ScenarioDrivenStory.java
- trunk/core/src/java/org/jbehave/core/util/CamelCaseConverter.java
- trunk/plugins/maven/src/main/java/org/jbehave/mojo/StoryRunnerMojo.java
Added Paths
Diff
Modified: trunk/core/src/analysis/user withdraws cash.txt (742 => 743)
--- trunk/core/src/analysis/user withdraws cash.txt 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/core/src/analysis/user withdraws cash.txt 2007-07-10 13:18:50 UTC (rev 743) @@ -1,29 +1,16 @@ -Story: User withdraws cash - -As a Bank card holder -I want to be able to withdraw cash from an ATM -So that I dont have to visit the bank - -Scenario: Happy scenario - -Given Account is in credit -When User requests cash -Then ATM should dispense cash -and ATM should return bank card -and account balance should be reduced - -Scenario: Happy story with overdraft - -Given Account has overdraft facility -and Account is easily within overdraft limit -When User requests cash -Then ATM should dispense cash -and ATM should return bank card -and account balance should be reduced - -Scenario: In lots of trouble - -Given Account is over overdraft limit -When User requests cash -Then Refuse cash -and Keep bank card +Title: User withdraws cash +As a Bank card holder +I want to be able to withdraw cash from an ATM +So that I dont have to visit the bank +Scenario: Happy scenario +Given Account is in credit +When User requests cash +Then ATM should dispense cash and ATM should return bank card and account balance should be reduced +Scenario: Happy story with overdraft +Given Account has overdraft facility and Account is easily within overdraft limit +When User requests cash +Then ATM should dispense cash and ATM should return bank card and account balance should be reduced +Scenario: In lots of trouble +Given Account is over overdraft limit +When User requests cash +Then Refuse cash and Keep bank card
Modified: trunk/core/src/java/org/jbehave/core/story/StoryBuilder.java (742 => 743)
--- trunk/core/src/java/org/jbehave/core/story/StoryBuilder.java 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/core/src/java/org/jbehave/core/story/StoryBuilder.java 2007-07-10 13:18:50 UTC (rev 743) @@ -3,7 +3,6 @@ import java.text.MessageFormat; import java.util.Iterator; -import org.jbehave.core.story.codegen.domain.BasicDetails; import org.jbehave.core.story.codegen.domain.ScenarioDetails; import org.jbehave.core.story.codegen.domain.StoryDetails; import org.jbehave.core.story.domain.Event; @@ -27,7 +26,7 @@ private StoryDetails details; private final String rootPackageName; - private ClassLoader classLoader; + private final ClassLoader classLoader; private final ClassBuilder builder = new ClassBuilder(); public StoryBuilder(StoryDetails details, String rootPackageName) { @@ -41,23 +40,25 @@ } public Story story(){ - ScenarioDrivenStory story = new ScenarioDrivenStory(new Narrative(details.role, details.feature, details.benefit)) { + return new ScenarioDrivenStory(new Narrative(details.role, details.feature, details.benefit)) { public void specify() { for ( Iterator i = details.scenarios.iterator(); i.hasNext(); ){ - addScenario(scenario((ScenarioDetails)i.next(), details.name)); + addScenario(scenario((ScenarioDetails)i.next())); } } + + public String getName() { + return details.name; + } }; - return story; } - private Scenario scenario(final ScenarioDetails details, String storyName) { + private Scenario scenario(final ScenarioDetails details) { return new MultiStepScenario() { public void specifySteps() { // given for (Iterator i = details.context.givens.iterator(); i.hasNext();) { - BasicDetails given = (BasicDetails)i.next(); - given((Given)builder.newGiven(given.name)); + given((Given)builder.newGiven((String) i.next())); } // when @@ -65,10 +66,13 @@ // then for (Iterator i = details.outcome.outcomes.iterator(); i.hasNext();) { - BasicDetails outcome = (BasicDetails)i.next(); - then((Outcome)builder.newOutcome(outcome.name)); + then((Outcome)builder.newOutcome((String) i.next())); } } + + public String getName() { + return details.name; + } }; } @@ -95,7 +99,7 @@ private Object newInstance(String name, String packageName) { try { String fullName = buildFullClassName(name, packageName); - return classLoader.loadClass(name).newInstance(); + return classLoader.loadClass(fullName).newInstance(); } catch ( Exception e) { throw new RuntimeException("Failed to create instance for name "+name, e); }
Modified: trunk/core/src/java/org/jbehave/core/story/StoryLoader.java (742 => 743)
--- trunk/core/src/java/org/jbehave/core/story/StoryLoader.java 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/core/src/java/org/jbehave/core/story/StoryLoader.java 2007-07-10 13:18:50 UTC (rev 743) @@ -28,7 +28,7 @@ public Story loadStory(String storyPath, String storyPackage) throws MalformedURLException { StoryDetails storyDetails = storyParser.parseStory(getReader(storyPath, classLoader)); - return new StoryBuilder(storyDetails, storyPackage).story(); + return new StoryBuilder(storyDetails, storyPackage, classLoader).story(); } public Story loadStory(String storyClassName) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Modified: trunk/core/src/java/org/jbehave/core/story/StoryPrinter.java (742 => 743)
--- trunk/core/src/java/org/jbehave/core/story/StoryPrinter.java 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/core/src/java/org/jbehave/core/story/StoryPrinter.java 2007-07-10 13:18:50 UTC (rev 743) @@ -31,6 +31,7 @@ public void print(String storyPath, String storyPackage) throws MalformedURLException { Story story = storyLoader.loadStory(storyPath, storyPackage); + story.specify(); story.narrateTo(renderer); }
Modified: trunk/core/src/java/org/jbehave/core/story/domain/MultiStepScenario.java (742 => 743)
--- trunk/core/src/java/org/jbehave/core/story/domain/MultiStepScenario.java 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/core/src/java/org/jbehave/core/story/domain/MultiStepScenario.java 2007-07-10 13:18:50 UTC (rev 743) @@ -57,7 +57,7 @@ * @author <a href="" PROTECTED]">Dan North</a> * @author <a href="" PROTECTED]">Elizabeth Keogh</a> */ -public abstract class MultiStepScenario implements Scenario { +public abstract class MultiStepScenario implements Scenario, Named { private static final String UNSPECIFIED = "Unspecified"; private static final String SPECIFIED = "Specified"; @@ -77,6 +77,10 @@ state = SPECIFIED; } + public String getName() { + return this.getClass().getName(); + } + protected abstract void specifySteps(); public void run(World world) {
Added: trunk/core/src/java/org/jbehave/core/story/domain/Named.java (0 => 743)
--- trunk/core/src/java/org/jbehave/core/story/domain/Named.java (rev 0) +++ trunk/core/src/java/org/jbehave/core/story/domain/Named.java 2007-07-10 13:18:50 UTC (rev 743) @@ -0,0 +1,8 @@ +package org.jbehave.core.story.domain; + +/** + * @author Eric Lewin + */ +public interface Named { + String getName(); +}
Modified: trunk/core/src/java/org/jbehave/core/story/domain/ScenarioDrivenStory.java (742 => 743)
--- trunk/core/src/java/org/jbehave/core/story/domain/ScenarioDrivenStory.java 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/core/src/java/org/jbehave/core/story/domain/ScenarioDrivenStory.java 2007-07-10 13:18:50 UTC (rev 743) @@ -34,7 +34,7 @@ * @author <a href="" PROTECTED]">Dan North</a> * @author <a href="" PROTECTED]">Elizabeth Keogh</a> */ -public abstract class ScenarioDrivenStory implements Story { +public abstract class ScenarioDrivenStory implements Story, Named { private final Narrative narrative; private final List scenarios; private final List listeners; @@ -53,7 +53,11 @@ public List scenarios() { return scenarios; } - + + public String getName() { + return this.getClass().getName(); + } + public Narrative narrative() { return narrative; } @@ -61,7 +65,7 @@ public void run() { for (Iterator i = scenarios.iterator(); i.hasNext();) { Scenario scenario = (Scenario) i.next(); - informListeners(runScenario(createWorld(), this.getClass(), scenario)); + informListeners(runScenario(createWorld(), this, scenario)); } } @@ -76,9 +80,9 @@ return new HashMapWorld(); } - private ScenarioResult runScenario(World world, Class storyClass, Scenario scenario) { + private ScenarioResult runScenario(World world, Story story, Scenario scenario) { ScenarioResult result; - String storyDescription = new CamelCaseConverter(storyClass).toPhrase(); + String storyDescription = new CamelCaseConverter(story).toPhrase(); String description = new CamelCaseConverter(scenario).toPhrase(); try { @@ -109,7 +113,7 @@ for ( Iterator i = scenarios.iterator(); i.hasNext(); ){ ((Scenario) i.next()).narrateTo(renderer); } - } + } public String toString() { StringBuffer buffer = new StringBuffer();
Modified: trunk/core/src/java/org/jbehave/core/util/CamelCaseConverter.java (742 => 743)
--- trunk/core/src/java/org/jbehave/core/util/CamelCaseConverter.java 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/core/src/java/org/jbehave/core/util/CamelCaseConverter.java 2007-07-10 13:18:50 UTC (rev 743) @@ -1,107 +1,111 @@ -/* - * Created on 13-Aug-2004 - * - * (c) 2003-2004 ThoughtWorks Ltd - * - * See license.txt for license details - */ -package org.jbehave.core.util; - - -/** - * Method object to convert to and from CamelCase - * - * @author <a href="" PROTECTED]">Dan North</a> - */ -public class CamelCaseConverter { - private final char[] chars; - int pos = 0; - - public CamelCaseConverter(String words) { - words = words.substring(words.lastIndexOf('.') + 1); - words = words.substring(words.lastIndexOf('$') + 1); - chars = words.toCharArray(); - } - - public CamelCaseConverter(Class type) { - this(type.getName()); - } - - public CamelCaseConverter(Object obj) { - this(obj.getClass()); - } - - public String toCamelCase() { - StringBuffer buf = new StringBuffer(); - while (pos < chars.length) { - if (Character.isWhitespace(chars[pos])) { - pos++; - if (pos < chars.length) { - buf.append(Character.toUpperCase(chars[pos])); - } - } - else if (pos == 0) { - buf.append(Character.toUpperCase(chars[pos])); - } - else { - buf.append(chars[pos]); - } - pos++; - } - return buf.toString(); - } - - public String toPhrase() { - StringBuffer buf = new StringBuffer(); - while (pos < chars.length) { - int numUppercase = countUppercase(); - switch (numUppercase) { - case 0: - processRegularChar(buf); - break; - case 1: - processSingleUppercaseChar(buf); - break; - case 2: - processTwoUppercaseChars(buf); - break; - default: - processUppercaseWord(buf, numUppercase); - break; - } - } - return buf.toString(); - } - - private int countUppercase() { - int count = 0; - while (pos + count < chars.length && Character.isUpperCase(chars[pos + count])) - count++; - return count; - } - - private void processRegularChar(StringBuffer buf) { - buf.append(chars[pos++]); - } - - private void processSingleUppercaseChar(StringBuffer buf) { - if (buf.length() > 0) { - buf.append(' '); - } - buf.append(Character.toLowerCase(chars[pos++])); - } - - private void processTwoUppercaseChars(StringBuffer buf) { - processSingleUppercaseChar(buf); - processSingleUppercaseChar(buf); - } - - private void processUppercaseWord(StringBuffer buf, int numUppercase) { - while (pos < numUppercase - 1) { - buf.append(chars[pos++]); - } - processSingleUppercaseChar(buf); - } - - -} +/* + * Created on 13-Aug-2004 + * + * (c) 2003-2004 ThoughtWorks Ltd + * + * See license.txt for license details + */ +package org.jbehave.core.util; + +import org.jbehave.core.story.domain.Named; + + +/** + * Method object to convert to and from CamelCase + * + * @author <a href="" PROTECTED]">Dan North</a> + */ +public class CamelCaseConverter { + private final char[] chars; + int pos = 0; + + public CamelCaseConverter(String words) { + words = words.substring(words.lastIndexOf('.') + 1); + words = words.substring(words.lastIndexOf('$') + 1); + chars = words.toCharArray(); + } + + + public CamelCaseConverter(Class type) { + this(type.getName()); + } + + public CamelCaseConverter(Object obj) { + this(obj instanceof Named ? ((Named) obj).getName() : obj.getClass().getName()); + } + + + public String toCamelCase() { + StringBuffer buf = new StringBuffer(); + while (pos < chars.length) { + if (Character.isWhitespace(chars[pos])) { + pos++; + if (pos < chars.length) { + buf.append(Character.toUpperCase(chars[pos])); + } + } + else if (pos == 0) { + buf.append(Character.toUpperCase(chars[pos])); + } + else { + buf.append(chars[pos]); + } + pos++; + } + return buf.toString(); + } + + public String toPhrase() { + StringBuffer buf = new StringBuffer(); + while (pos < chars.length) { + int numUppercase = countUppercase(); + switch (numUppercase) { + case 0: + processRegularChar(buf); + break; + case 1: + processSingleUppercaseChar(buf); + break; + case 2: + processTwoUppercaseChars(buf); + break; + default: + processUppercaseWord(buf, numUppercase); + break; + } + } + return buf.toString(); + } + + private int countUppercase() { + int count = 0; + while (pos + count < chars.length && Character.isUpperCase(chars[pos + count])) + count++; + return count; + } + + private void processRegularChar(StringBuffer buf) { + buf.append(chars[pos++]); + } + + private void processSingleUppercaseChar(StringBuffer buf) { + if (buf.length() > 0) { + buf.append(' '); + } + buf.append(Character.toLowerCase(chars[pos++])); + } + + private void processTwoUppercaseChars(StringBuffer buf) { + processSingleUppercaseChar(buf); + processSingleUppercaseChar(buf); + } + + private void processUppercaseWord(StringBuffer buf, int numUppercase) { + while (pos < numUppercase - 1) { + buf.append(chars[pos++]); + } + processSingleUppercaseChar(buf); + } + + +}
Modified: trunk/plugins/maven/src/main/java/org/jbehave/mojo/StoryRunnerMojo.java (742 => 743)
--- trunk/plugins/maven/src/main/java/org/jbehave/mojo/StoryRunnerMojo.java 2007-07-10 12:54:50 UTC (rev 742) +++ trunk/plugins/maven/src/main/java/org/jbehave/mojo/StoryRunnerMojo.java 2007-07-10 13:18:50 UTC (rev 743) @@ -38,7 +38,8 @@ try { getLog().debug("Running story "+ storyPath); StoryLoader loader = new StoryLoader(storyParser, new BehavioursClassLoader(classpathElements)); - Story story = loader.loadStory(storyPath, storyPackage); + Story story = loader.loadStory(storyPath, storyPackage); + story.specify(); storyRunner.run(story); } catch (Exception e) { throw new MojoExecutionException("Failed to run story "+storyPath+" with package "+storyPackage, e);
To unsubscribe from this list please visit: