- Revision
- 1246
- Author
- mauro
- Date
- 2009-09-13 08:39:53 -0500 (Sun, 13 Sep 2009)
Log Message
Better exception handling for missing starting words in candidate steps.
Modified Paths
Diff
Modified: trunk/core/jbehave-core/src/behaviour/org/jbehave/scenario/steps/StepsBehaviour.java (1245 => 1246)
--- trunk/core/jbehave-core/src/behaviour/org/jbehave/scenario/steps/StepsBehaviour.java 2009-09-13 12:53:05 UTC (rev 1245) +++ trunk/core/jbehave-core/src/behaviour/org/jbehave/scenario/steps/StepsBehaviour.java 2009-09-13 13:39:53 UTC (rev 1246) @@ -5,9 +5,12 @@ import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import org.jbehave.scenario.annotations.AfterScenario; +import org.jbehave.scenario.i18n.I18nKeyWords; +import org.jbehave.scenario.steps.CandidateStep.StartingWordNotFound; import org.jbehave.scenario.steps.Steps.DuplicateCandidateStepFoundException; import org.junit.Test; @@ -108,6 +111,31 @@ } + @Test + public void shouldAllowI18nOfSteps(){ + I18nSteps steps = new I18nSteps(new I18nKeyWords(new Locale("it"))); + CandidateStep[] candidateSteps = steps.getSteps(); + ensureThat(candidateSteps.length, equalTo(3)); + + candidateSteps[0].createFrom(tableRow, "Dato che un dato che").perform(); + candidateSteps[1].createFrom(tableRow, "Quando un quando").perform(); + candidateSteps[2].createFrom(tableRow, "Allora un allora").perform(); + + ensureThat(steps.givens, equalTo(1)); + ensureThat(steps.whens, equalTo(1)); + ensureThat(steps.thens, equalTo(1)); + } + + @Test(expected=StartingWordNotFound.class) + public void shouldNotCreateStepIfStartingWordNotFound(){ + I18nSteps steps = new I18nSteps(new I18nKeyWords(new Locale("it"))); + CandidateStep[] candidateSteps = steps.getSteps(); + ensureThat(candidateSteps.length, equalTo(3)); + + // misspelled starting word + candidateSteps[0].createFrom(tableRow, "Dado che un dato che"); + + } static class MultipleAliasesSteps extends Steps { @@ -198,4 +226,31 @@ } } + + static class I18nSteps extends Steps { + + private int givens; + private int whens; + private int thens; + + public I18nSteps(I18nKeyWords keywords) { + super(keywords); + } + + @org.jbehave.scenario.annotations.Given("un dato che") + public void given() { + givens++; + } + + @org.jbehave.scenario.annotations.When("un quando") + public void when() { + whens++; + } + + @org.jbehave.scenario.annotations.Then("un allora") + public void then() { + thens++; + } + + } }
Modified: trunk/core/jbehave-core/src/java/org/jbehave/scenario/steps/CandidateStep.java (1245 => 1246)
--- trunk/core/jbehave-core/src/java/org/jbehave/scenario/steps/CandidateStep.java 2009-09-13 12:53:05 UTC (rev 1245) +++ trunk/core/jbehave-core/src/java/org/jbehave/scenario/steps/CandidateStep.java 2009-09-13 13:39:53 UTC (rev 1246) @@ -1,10 +1,11 @@ package org.jbehave.scenario.steps; +import static java.util.Arrays.asList; + import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; -import java.util.Arrays; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -32,7 +33,7 @@ private final String[] startingWords; private final Pattern pattern; private final String[] groupNames; - + private StepMonitor stepMonitor = new SilentStepMonitor(); private Paranamer paranamer = new NullParanamer(); @@ -66,15 +67,15 @@ } public boolean matches(String stepAsString) { - String word = findStartingWord(stepAsString); - if (word == null) { + try { + Matcher matcher = matcherForStep(stepAsString); + boolean matches = matcher.matches(); + stepMonitor.stepMatchesPattern(stepAsString, matches, pattern + .pattern()); + return matches; + } catch (StartingWordNotFound e) { return false; } - String trimmed = trimStartingWord(word, stepAsString); - Matcher matcher = pattern.matcher(trimmed); - boolean matches = matcher.matches(); - stepMonitor.stepMatchesPattern(stepAsString, matches, pattern.pattern()); - return matches; } private String trimStartingWord(String word, String step) { @@ -83,25 +84,28 @@ public Step createFrom(Map<String, String> tableRow, final String stepAsString) { - String startingWord = findStartingWord(stepAsString); - Matcher matcher = pattern.matcher(trimStartingWord(startingWord, - stepAsString)); + Matcher matcher = matcherForStep(stepAsString); matcher.find(); Type[] types = method.getGenericParameterTypes(); String[] annotationNames = annotatedParameterNames(); String[] parameterNames = paranamer.lookupParameterNames(method, false); - Object[] args = argsForStep(tableRow, matcher, types, - annotationNames, parameterNames); + Object[] args = argsForStep(tableRow, matcher, types, annotationNames, + parameterNames); return createStep(stepAsString, args); } - private Object[] argsForStep(Map<String, String> tableRow, - Matcher matcher, Type[] types, String[] annotationNames, - String[] parameterNames) { + private Matcher matcherForStep(final String stepAsString) { + String startingWord = findStartingWord(stepAsString); + String trimmed = trimStartingWord(startingWord, stepAsString); + return pattern.matcher(trimmed); + } + + private Object[] argsForStep(Map<String, String> tableRow, Matcher matcher, + Type[] types, String[] annotationNames, String[] parameterNames) { final Object[] args = new Object[types.length]; for (int position = 0; position < types.length; position++) { - String arg = argForPosition(position, annotationNames, parameterNames, - tableRow, matcher); + String arg = argForPosition(position, annotationNames, + parameterNames, tableRow, matcher); args[position] = parameterConverters.convert(arg, types[position]); } return args; @@ -113,7 +117,8 @@ int annotatedNamePosition = parameterPosition(annotationNames, position); int parameterNamePosition = parameterPosition(parameterNames, position); String arg = null; - if (annotatedNamePosition != -1 && isGroupName(annotationNames[position])) { + if (annotatedNamePosition != -1 + && isGroupName(annotationNames[position])) { String name = annotationNames[position]; stepMonitor.usingAnnotatedNameForArg(name, position); arg = getGroup(matcher, name); @@ -144,8 +149,7 @@ return tableRow.get(name); } - private boolean isTableFieldName(Map<String, String> tableRow, - String name) { + private boolean isTableFieldName(Map<String, String> tableRow, String name) { return tableRow.get(name) != null; } @@ -156,7 +160,7 @@ return matcher.group(i + 1); } } - throw new NoGroupFoundForNameException("No group found for name "+name+" amongst "+Arrays.asList(groupNames)); + throw new NoGroupFoundForName(name, groupNames); } private boolean isGroupName(String name) { @@ -203,13 +207,14 @@ return names; } - private String findStartingWord(final String stepAsString) { + private String findStartingWord(final String stepAsString) + throws StartingWordNotFound { for (String word : startingWords) { if (stepAsString.startsWith(word)) { return word; } } - return null; + throw new StartingWordNotFound(stepAsString, startingWords); } private Step createStep(final String stepAsString, final Object[] args) { @@ -257,14 +262,25 @@ public String toString() { return stepAsString; } - + @SuppressWarnings("serial") - public static class NoGroupFoundForNameException extends RuntimeException { + public static class NoGroupFoundForName extends RuntimeException { - public NoGroupFoundForNameException(String message) { - super(message); + public NoGroupFoundForName(String name, String[] groupNames) { + super("No group found for name " + name + " amongst " + + asList(groupNames)); } } + @SuppressWarnings("serial") + public static class StartingWordNotFound extends RuntimeException { + + public StartingWordNotFound(String step, String[] startingWords) { + super("No starting word found for step " + step + " amongst " + + asList(startingWords)); + } + + } + }
To unsubscribe from this list please visit:
