commit 8b49e0ab364507cf3521b142042b7fd3f8b3adf0
Author: Alberto Scotto <[email protected]>
AuthorDate: Sun, 22 Mar 2015 12:44:41 +0000
Commit: Mauro Talevi <[email protected]>
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,
+ ;
}