- Revision
- 1447
- Author
- mauro
- Date
- 2009-12-22 05:04:49 -0600 (Tue, 22 Dec 2009)
Log Message
JBEHAVE-223: Refactored NumberListConverter to use NumberFormat only when argumentType is Number (i.e. not a sub-class) and to use NumberConverter for specific number types.
Modified Paths
Diff
Modified: trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/CandidateStepBehaviour.java (1446 => 1447)
--- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/CandidateStepBehaviour.java 2009-12-22 04:03:42 UTC (rev 1446) +++ trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/CandidateStepBehaviour.java 2009-12-22 11:04:49 UTC (rev 1447) @@ -137,7 +137,7 @@ SomeSteps someSteps = new SomeSteps(); CandidateStep candidateStep = new CandidateStep("windows on the $nth floors", WHEN, SomeSteps.methodFor("aMethodWithListOfLongs"), someSteps, PATTERN_BUILDER, new ParameterConverters(), startingWords); - candidateStep.createFrom(tableRow, "When windows on the 1L,2L,3L floors").perform(); + candidateStep.createFrom(tableRow, "When windows on the 1,2,3 floors").perform(); ensureThat(((List<?>) someSteps.args).toString(), equalTo(asList(1L, 2L, 3L).toString())); candidateStep = new CandidateStep("windows on the $nth floors", WHEN, @@ -152,7 +152,7 @@ candidateStep = new CandidateStep("windows on the $nth floors", WHEN, SomeSteps.methodFor("aMethodWithListOfFloats"), someSteps, PATTERN_BUILDER, new ParameterConverters(), startingWords); - candidateStep.createFrom(tableRow, "When windows on the 1.1f,2.2f,3.3f floors").perform(); + candidateStep.createFrom(tableRow, "When windows on the 1.1,2.2,3.3 floors").perform(); ensureThat(((List<?>) someSteps.args).toString(), equalTo(asList(1.1f, 2.2f, 3.3f).toString())); }
Modified: trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/ParameterConvertersBehaviour.java (1446 => 1447)
--- trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/ParameterConvertersBehaviour.java 2009-12-22 04:03:42 UTC (rev 1446) +++ trunk/core/jbehave-core/src/behaviour/java/org/jbehave/scenario/steps/ParameterConvertersBehaviour.java 2009-12-22 11:04:49 UTC (rev 1447) @@ -40,7 +40,7 @@ } @SuppressWarnings("unchecked") - @Test + @Test public void shouldConvertCommaSeparatedValuesToListsOfNumbers() throws ParseException, IntrospectionException { ParameterConverters converters = new ParameterConverters(); @@ -48,13 +48,13 @@ .getGenericParameterTypes()[0]; List<Number> list = (List<Number>) converters.convert( "3, 0.5, 6.1f, 8.00", type); - ensureThat(list.get(0), equalTo(NUMBER_FORMAT.parse("3"))); - ensureThat(list.get(1), equalTo(NUMBER_FORMAT.parse("0.5"))); - ensureThat(list.get(2), equalTo(NUMBER_FORMAT.parse("6.1f"))); - ensureThat(list.get(3), equalTo(NUMBER_FORMAT.parse("8.00"))); + ensureThat(list.get(0), equalTo(NUMBER_FORMAT.parse("3"))); + ensureThat(list.get(1), equalTo(NUMBER_FORMAT.parse("0.5"))); + ensureThat(list.get(2), equalTo(NUMBER_FORMAT.parse("6.1f"))); + ensureThat(list.get(3), equalTo(NUMBER_FORMAT.parse("8.00"))); } - @SuppressWarnings("unchecked") + @SuppressWarnings("unchecked") @Test public void shouldConvertCommaSeparatedValuesToListsOfNumbersWithCustomFormat() throws ParseException, IntrospectionException { @@ -71,6 +71,46 @@ ensureThat(list.get(3), equalTo(numberFormat.parse("8.00"))); } + @SuppressWarnings("unchecked") + @Test + public void shouldConvertCommaSeparatedValuesOfSpecificNumberTypes() + throws ParseException, IntrospectionException { + ParameterConverters converters = new ParameterConverters(); + Type doublesType = SomeSteps.methodFor("aMethodWithListOfDoubles") + .getGenericParameterTypes()[0]; + List<Double> doubles = (List<Double>) converters.convert( + "3, 0.5, 0.0, 8.00", doublesType); + ensureThat(doubles.get(0), equalTo(3.0d)); + ensureThat(doubles.get(1), equalTo(0.5d)); + ensureThat(doubles.get(2), equalTo(0.0d)); + ensureThat(doubles.get(3), equalTo(8.00d)); + + Type floatsType = SomeSteps.methodFor("aMethodWithListOfFloats") + .getGenericParameterTypes()[0]; + List<Float> floats = (List<Float>) converters.convert( + "3, 0.5, 0.0, 8.00", floatsType); + ensureThat(floats.get(0), equalTo(3.0f)); + ensureThat(floats.get(1), equalTo(0.5f)); + ensureThat(floats.get(2), equalTo(0.0f)); + ensureThat(floats.get(3), equalTo(8.00f)); + + Type longsType = SomeSteps.methodFor("aMethodWithListOfLongs") + .getGenericParameterTypes()[0]; + List<Long> longs = (List<Long>) converters.convert( + "3, 0, 8", longsType); + ensureThat(longs.get(0), equalTo(3L)); + ensureThat(longs.get(1), equalTo(0L)); + ensureThat(longs.get(2), equalTo(8L)); + + Type intsType = SomeSteps.methodFor("aMethodWithListOfIntegers") + .getGenericParameterTypes()[0]; + List<Integer> ints = (List<Integer>) converters.convert( + "3, 0, 8", intsType); + ensureThat(ints.get(0), equalTo(3)); + ensureThat(ints.get(1), equalTo(0)); + ensureThat(ints.get(2), equalTo(8)); + } + @Test public void shouldConvertCommaSeparatedValuesToListOfStrings() throws IntrospectionException { ParameterConverters converters = new ParameterConverters();
Modified: trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/ParameterConverters.java (1446 => 1447)
--- trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/ParameterConverters.java 2009-12-22 04:03:42 UTC (rev 1446) +++ trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps/ParameterConverters.java 2009-12-22 11:04:49 UTC (rev 1447) @@ -114,6 +114,7 @@ public static class NumberListConverter implements ParameterConverter { + private NumberConverter numberConverter = new NumberConverter(); private NumberFormat numberFormat; private String valueSeparator; @@ -129,9 +130,8 @@ public boolean accept(Type type) { if (type instanceof ParameterizedType) { - ParameterizedType parameterizedType = (ParameterizedType) type; - Type rawType = parameterizedType.getRawType(); - Type argumentType = parameterizedType.getActualTypeArguments()[0]; + Type rawType = rawType(type); + Type argumentType = argumentType(type); return List.class.isAssignableFrom((Class<?>) rawType) && Number.class .isAssignableFrom((Class<?>) argumentType); @@ -139,9 +139,34 @@ return false; } - public Object convertValue(String value, Type type) { + private Type rawType(Type type) { + return ((ParameterizedType) type).getRawType(); + } + + private Type argumentType(Type type) { + return ((ParameterizedType) type).getActualTypeArguments()[0]; + } + + @SuppressWarnings("unchecked") + public Object convertValue(String value, Type type) { + Class<? extends Number> argumentType = (Class<? extends Number>) argumentType(type); List<String> values = trim(asList(value.split(valueSeparator))); - List<Number> numbers = new ArrayList<Number>(); + if ( argumentType.equals(Number.class) ){ + return convertWithNumberFormat(values); + } + return convertWithNumberConverter(values, argumentType); + } + + private List<Number> convertWithNumberConverter(List<String> values, Class<? extends Number> type) { + List<Number> numbers = new ArrayList<Number>(); + for (String value : values) { + numbers.add((Number) numberConverter.convertValue(value, type)); + } + return numbers; + } + + private List<Number> convertWithNumberFormat(List<String> values) { + List<Number> numbers = new ArrayList<Number>(); for (String numberValue : values) { try { numbers.add(numberFormat.parse(numberValue)); @@ -149,8 +174,8 @@ throw new InvalidParameterException(numberValue, e); } } - return numbers; - } + return numbers; + } }
To unsubscribe from this list please visit:
