Title: [1447] trunk/core/jbehave-core/src/main/java/org/jbehave/scenario/steps: JBEHAVE-223: Refactored NumberListConverter to use NumberFormat only when argumentType is Number (i.e.
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:

http://xircles.codehaus.org/manage_email

Reply via email to