commit bd5e502d150216576429cd8b4208023251e5bd6e
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:25:15 +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,
+    ;
 }



Reply via email to