commit 8b49e0ab364507cf3521b142042b7fd3f8b3adf0 Author: Alberto Scotto <scotto.alberto...@gmail.com> AuthorDate: Sun, 22 Mar 2015 12:44:41 +0000 Commit: Mauro Talevi <mauro.tal...@aquilonia.org> CommitDate: Wed, 8 Apr 2015 19:30:59 +0100
JBEHAVE-1075: add FluentEnumConverter ..an EnumConverter able to convert lower-cased, space-separated values to enum constants. Before performing the actual conversion, it transforms values to upper-case, with any non-alphanumeric character replaced by an underscore ('_'). diff --git a/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java b/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java index 28be319..e1d1122 100755 --- a/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java +++ b/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java @@ -576,6 +576,37 @@ public class ParameterConverters { } /** + * An {@link EnumConverter} allowing stories prose to be more natural. + * Before performing the actual conversion, it transforms values to upper-case, + * with any non-alphanumeric character replaced by an underscore ('_'). + * <p> + * <b>Example</b>: + * assuming we have defined the step "{@code Given I am on the $page}" + * which is mapped to the method {@code iAmOnPage(PageEnum page)}, + * we can then write in a scenario: + * <pre>{@code + * Given I am on the login page + * }</pre> + * instead of: + * <pre>{@code + * Given I am on the LOGIN_PAGE + * }</pre> + * <p> + * <b>Warning</b>. This <i>requires</i> enum constants to follow the + * <a href="https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s5.2.4-constant-names"> + * standard conventions for constant names</a>, i.e. all uppercase letters, + * with words separated by underscores. + */ + public static class FluentEnumConverter extends EnumConverter { + + @Override + public Object convertValue(String value, Type type) { + String transformedValue = value.replaceAll("\\W", "_").toUpperCase(); + return super.convertValue(transformedValue, type); + } + } + + /** * Parses value to list of the same {@link Enum}, using an injectable value * separator (defaults to ",") and trimming each element of the list. */ diff --git a/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java b/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java index 872c1a2..8ddb0f2 100755 --- a/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java +++ b/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java @@ -29,6 +29,7 @@ import org.jbehave.core.steps.ParameterConverters.EnumConverter; import org.jbehave.core.steps.ParameterConverters.EnumListConverter; import org.jbehave.core.steps.ParameterConverters.ExamplesTableConverter; import org.jbehave.core.steps.ParameterConverters.ExamplesTableParametersConverter; +import org.jbehave.core.steps.ParameterConverters.FluentEnumConverter; import org.jbehave.core.steps.ParameterConverters.MethodReturningConverter; import org.jbehave.core.steps.ParameterConverters.NumberConverter; import org.jbehave.core.steps.ParameterConverters.NumberListConverter; @@ -459,6 +460,13 @@ public class ParameterConvertersBehaviour { assertThat((SomeEnum) converter.convertValue("ONE", type), equalTo(SomeEnum.ONE)); } + @Test + public void flexibleEnumConverter_givenLowercasedSpaceSeparatedValue() { + ParameterConverter converter = new FluentEnumConverter(); + assertThat(converter.accept(SomeEnum.class), equalTo(true)); + assertThat((SomeEnum) converter.convertValue("multiple words and 1 number", SomeEnum.class), equalTo(SomeEnum.MULTIPLE_WORDS_AND_1_NUMBER)); + } + @Test(expected = ParameterConvertionFailed.class) public void shouldFailToConvertEnumForValueNotDefined() throws IntrospectionException { diff --git a/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java b/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java index 018a40c..b2c07aa 100755 --- a/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java +++ b/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java @@ -169,5 +169,7 @@ public class SomeSteps extends Steps { enum SomeEnum { ONE, TWO, - THREE; + THREE, + MULTIPLE_WORDS_AND_1_NUMBER, + ; }