Title: [1246] trunk/core/jbehave-core/src/java/org/jbehave/scenario/steps: Better exception handling for missing starting words in candidate steps.
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:

http://xircles.codehaus.org/manage_email

Reply via email to