New syntax for Given with many parameters -----------------------------------------
Key: JBEHAVE-261 URL: http://jira.codehaus.org/browse/JBEHAVE-261 Project: JBehave Issue Type: Improvement Components: Core Reporter: Bruno Bieth Fix For: 2.5.1 A given step might look like : {code}Given a person (first name) Bruno (last name) Bieth born 2010-01-01 in Tombouctou living in Canada driving 10,000 miles per year{code} It can be hard to read. Passed a certain amount of parameters I suggest the following syntax : {code} Given a person - First Name : Bruno - Last Name : Bieth - Birth date : 2010-01-01 - Birth country : Tombouctou - Country of residency : Canada - Miles driven per year : 10,000 {code} The java code would look like : {code} @GivenDetail( "a person" ) public void aPerson( @Named("First Name") String firstName, @Named("Last Name") String lastName, @Named("Birth date") DateTime birthDate, @Named("Birth country") String birthCountry, @Named("Country of residency") String countryOfResidency, @Named("Miles driven per year") Integer milesPerYear ) { person = new Person(firstName,lastName,birthDate,birthCountry,countryOfResidency,milesPerYear); } {code} The factory could use another CandidateSteps instance, say : {code} public class DetailedSteps implements CandidateSteps { private CandidateSteps delegate; private StepsConfiguration configuration; private Object instance; public DetailedSteps(StepsConfiguration configuration, CandidateSteps delegate, Object instance) { this.configuration = configuration; this.delegate = delegate; this.instance = instance; } @Override public CandidateStep[] getSteps() { return getSteps( instance.getClass() ); } @Override public CandidateStep[] getSteps(Class<?> stepsClass) { List<CandidateStep> steps = new ArrayList<CandidateStep>( Arrays.asList( delegate.getSteps(stepsClass))); for( Method method : stepsClass.getMethods() ) { GivenDetail annotation = method.getAnnotation(GivenDetail.class); if( annotation != null ) { steps.add( createGivenDetail( method, annotation ) ); } } return steps.toArray(new CandidateStep[steps.size()]); } private CandidateStep createGivenDetail(final Method method, GivenDetail annotation) { return new CandidateStep(annotation.value(), annotation.priority(), StepType.GIVEN, method, instance, new StepPatternBuilder() { @Override public String[] extractGroupNames(String string) { List<String> names = new ArrayList<String>(); for( Annotation[] annotations : method.getParameterAnnotations() ) { for( Annotation annotation : annotations ) { if( annotation instanceof Named ) { names.add( ((Named)annotation).value() ); } } } return names.toArray(new String[names.size()]); } @Override public Pattern buildPattern(String matchThis) { String[] groups = extractGroupNames(""); String pattern = matchThis.replaceAll(" ", "\\\\s+" ); for( String group : groups ) { pattern += "\\s+-\\s+" + group.replaceAll( " ", "\\\\s+" ) + "\\s*:\\s+(.*)"; } return Pattern.compile( pattern ); } },configuration.getParameterConverters(),configuration.getStartingWordsByType()); } @Override public List<Step> runAfterScenario() { return delegate.runAfterScenario(); } @Override public List<Step> runAfterStory(boolean embeddedStory) { return delegate.runAfterStory(embeddedStory); } @Override public List<Step> runBeforeScenario() { return delegate.runBeforeScenario(); } @Override public List<Step> runBeforeStory(boolean embeddedStory) { return delegate.runBeforeStory(embeddedStory); } } {code} -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email