]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add error message constructor to all converters which can fail
authorArtur Signell <artur@vaadin.com>
Sun, 4 Sep 2016 20:35:42 +0000 (23:35 +0300)
committerArtur Signell <artur@vaadin.com>
Mon, 5 Sep 2016 08:34:20 +0000 (11:34 +0300)
Change-Id: I3ec60effc75e22765d21e0223ee1537ffbdb29e7

22 files changed:
server/src/main/java/com/vaadin/data/util/converter/AbstractStringToNumberConverter.java
server/src/main/java/com/vaadin/data/util/converter/StringToBigDecimalConverter.java
server/src/main/java/com/vaadin/data/util/converter/StringToBigIntegerConverter.java
server/src/main/java/com/vaadin/data/util/converter/StringToBooleanConverter.java
server/src/main/java/com/vaadin/data/util/converter/StringToDoubleConverter.java
server/src/main/java/com/vaadin/data/util/converter/StringToFloatConverter.java
server/src/main/java/com/vaadin/data/util/converter/StringToIntegerConverter.java
server/src/main/java/com/vaadin/data/util/converter/StringToLongConverter.java
server/src/main/java/com/vaadin/ui/declarative/DesignFormatter.java
server/src/test/java/com/vaadin/data/BinderBookOfVaadinTest.java
server/src/test/java/com/vaadin/tests/data/converter/AbstractConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/AbstractStringConverterTest.java [new file with mode: 0644]
server/src/test/java/com/vaadin/tests/data/converter/DateToLongConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/DateToSqlDateConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToBigDecimalConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToBigIntegerConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToBooleanConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToDateConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToDoubleConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToFloatConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToIntegerConverterTest.java
server/src/test/java/com/vaadin/tests/data/converter/StringToLongConverterTest.java

index bd2ea690a12d9f0d4d05da3f3a069d014177f348..c06a9baa614c6aefeb95bd0bbe3c83996e67c64e 100644 (file)
@@ -20,6 +20,8 @@ import java.text.NumberFormat;
 import java.text.ParsePosition;
 import java.util.Locale;
 
+import com.vaadin.data.Result;
+
 /**
  * A converter that converts from the number type T to {@link String} and back.
  * Uses the given locale and {@link NumberFormat} for formatting and parsing.
@@ -35,6 +37,18 @@ import java.util.Locale;
 public abstract class AbstractStringToNumberConverter<T>
         implements Converter<String, T> {
 
+    private final String errorMessage;
+
+    /**
+     * Creates a new converter instance with the given error message.
+     *
+     * @param errorMessage
+     *            the error message to use if conversion fails
+     */
+    protected AbstractStringToNumberConverter(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
     /**
      * Returns the format used by {@link #convertToPresentation(Object, Locale)}
      * and {@link #convertToModel(Object, Locale)}.
@@ -61,9 +75,9 @@ public abstract class AbstractStringToNumberConverter<T>
      *            The locale to use for conversion
      * @return The converted value
      */
-    protected Number convertToNumber(String value, Locale locale) {
+    protected Result<Number> convertToNumber(String value, Locale locale) {
         if (value == null) {
-            return null;
+            return Result.ok(null);
         }
 
         // Remove leading and trailing white space
@@ -74,16 +88,24 @@ public abstract class AbstractStringToNumberConverter<T>
         ParsePosition parsePosition = new ParsePosition(0);
         Number parsedValue = getFormat(locale).parse(value, parsePosition);
         if (parsePosition.getIndex() != value.length()) {
-            throw new IllegalArgumentException(
-                    "Could not convert '" + value + "'");
+            return Result.error(getErrorMessage());
         }
 
         if (parsedValue == null) {
             // Convert "" to null
-            return null;
+            return Result.ok(null);
         }
 
-        return parsedValue;
+        return Result.ok(parsedValue);
+    }
+
+    /**
+     * Gets the error message to use when conversion fails.
+     *
+     * @return the error message
+     */
+    protected String getErrorMessage() {
+        return errorMessage;
     }
 
     @Override
index 639523516e37fcf8b61f6b2cffc58d66275052a3..af0a63fc7a7790e65908b2261a532d73cad845c3 100644 (file)
@@ -38,6 +38,17 @@ import com.vaadin.data.Result;
  */
 public class StringToBigDecimalConverter
         extends AbstractStringToNumberConverter<BigDecimal> {
+
+    /**
+     * Creates a new converter instance with the given error message.
+     *
+     * @param errorMessage
+     *            the error message to use if conversion fails
+     */
+    public StringToBigDecimalConverter(String errorMessage) {
+        super(errorMessage);
+    }
+
     @Override
     protected NumberFormat getFormat(Locale locale) {
         NumberFormat numberFormat = super.getFormat(locale);
@@ -50,7 +61,8 @@ public class StringToBigDecimalConverter
 
     @Override
     public Result<BigDecimal> convertToModel(String value, Locale locale) {
-        return Result.ok((BigDecimal) convertToNumber(value, locale));
+        return convertToNumber(value, locale)
+                .map(number -> (BigDecimal) number);
     }
 
 }
index 58080013b68e949450641ff4881b0849c0335932..d469db70553475f25b8dec5825fd7eaa19644cd6 100644 (file)
@@ -39,6 +39,15 @@ import com.vaadin.data.Result;
  */
 public class StringToBigIntegerConverter
         extends AbstractStringToNumberConverter<BigInteger> {
+    /**
+     * Creates a new converter instance with the given error message.
+     *
+     * @param errorMessage
+     *            the error message to use if conversion fails
+     */
+    public StringToBigIntegerConverter(String errorMessage) {
+        super(errorMessage);
+    }
 
     @Override
     protected NumberFormat getFormat(Locale locale) {
@@ -52,12 +61,13 @@ public class StringToBigIntegerConverter
 
     @Override
     public Result<BigInteger> convertToModel(String value, Locale locale) {
-
-        BigDecimal bigDecimalValue = (BigDecimal) convertToNumber(value,
-                locale);
-
-        return (bigDecimalValue != null)
-                ? Result.ok(bigDecimalValue.toBigInteger()) : Result.ok(null);
+        return convertToNumber(value, locale).map(number -> {
+            if (number == null) {
+                return null;
+            } else {
+                return ((BigDecimal) number).toBigInteger();
+            }
+        });
     }
 
 }
index 23ce22861923624934d407ff1beefe65f41edb54..7b9e1850f03076703e30df057c3cb79d99f25daf 100644 (file)
@@ -41,31 +41,39 @@ public class StringToBooleanConverter implements Converter<String, Boolean> {
 
     private final String falseString;
 
+    private String errorMessage;
+
     /**
      * Creates converter with default string representations - "true" and
      * "false".
      *
+     * @param errorMessage
+     *            the error message to use if conversion fails
      */
-    public StringToBooleanConverter() {
-        this(Boolean.TRUE.toString(), Boolean.FALSE.toString());
+    public StringToBooleanConverter(String errorMessage) {
+        this(errorMessage, Boolean.TRUE.toString(), Boolean.FALSE.toString());
     }
 
     /**
      * Creates converter with custom string representation.
      *
+     * @param errorMessage
+     *            the error message to use if conversion fails
      * @param falseString
      *            string representation for <code>false</code>
      * @param trueString
      *            string representation for <code>true</code>
      */
-    public StringToBooleanConverter(String trueString, String falseString) {
+    public StringToBooleanConverter(String errorMessage, String trueString,
+            String falseString) {
+        this.errorMessage = errorMessage;
         this.trueString = trueString;
         this.falseString = falseString;
     }
 
     @Override
     public Result<Boolean> convertToModel(String value, Locale locale) {
-        if (value == null || value.isEmpty()) {
+        if (value == null) {
             return Result.ok(null);
         }
 
@@ -76,8 +84,10 @@ public class StringToBooleanConverter implements Converter<String, Boolean> {
             return Result.ok(true);
         } else if (getFalseString(locale).equals(value)) {
             return Result.ok(false);
+        } else if (value.isEmpty()) {
+            return Result.ok(null);
         } else {
-            throw new IllegalArgumentException("Cannot convert " + value);
+            return Result.error(errorMessage);
         }
     }
 
index 374a553e8e20df561c888f3d84c4257ea2e09cdf..463a7f6b366004cc10225aa44422050315c8a549 100644 (file)
@@ -38,10 +38,27 @@ import com.vaadin.data.Result;
 public class StringToDoubleConverter
         extends AbstractStringToNumberConverter<Double> {
 
+    /**
+     * Creates a new converter instance with the given error message.
+     *
+     * @param errorMessage
+     *            the error message to use if conversion fails
+     */
+    public StringToDoubleConverter(String errorMessage) {
+        super(errorMessage);
+    }
+
     @Override
     public Result<Double> convertToModel(String value, Locale locale) {
-        Number n = convertToNumber(value, locale);
-        return n == null ? Result.ok(null) : Result.ok(n.doubleValue());
+        Result<Number> n = convertToNumber(value, locale);
+
+        return n.map(number -> {
+            if (number == null) {
+                return null;
+            } else {
+                return number.doubleValue();
+            }
+        });
     }
 
 }
index d05374a3ccf0ed162e2fdf136bf69c9e1f86d75b..be592665cfdb2b2c7d830ca24237fb820d099d9d 100644 (file)
@@ -27,10 +27,8 @@ import com.vaadin.data.Result;
  * parsing.
  * <p>
  * Leading and trailing white spaces are ignored when converting from a String.
- * </p>
  * <p>
  * Override and overwrite {@link #getFormat(Locale)} to use a different format.
- * </p>
  *
  * @author Vaadin Ltd
  * @since 8.0
@@ -38,10 +36,27 @@ import com.vaadin.data.Result;
 public class StringToFloatConverter
         extends AbstractStringToNumberConverter<Float> {
 
+    /**
+     * Creates a new converter instance with the given error message.
+     *
+     * @param errorMessage
+     *            the error message to use if conversion fails
+     */
+    public StringToFloatConverter(String errorMessage) {
+        super(errorMessage);
+    }
+
     @Override
     public Result<Float> convertToModel(String value, Locale locale) {
-        Number n = convertToNumber(value, locale);
-        return n == null ? Result.ok(null) : Result.ok(n.floatValue());
+        Result<Number> n = convertToNumber(value, locale);
+
+        return n.map(number -> {
+            if (number == null) {
+                return null;
+            } else {
+                return number.floatValue();
+            }
+        });
     }
 
 }
index 7a5ee69aed9f67ab0244b28ff267ced3e88c9c17..ec05647a514b8fe2db3b032a8977176fcdd1b2d9 100644 (file)
@@ -35,8 +35,6 @@ import com.vaadin.data.Result;
 public class StringToIntegerConverter
         extends AbstractStringToNumberConverter<Integer> {
 
-    private final String errorMessage;
-
     /**
      * Creates a new converter instance with the given error message.
      *
@@ -44,7 +42,7 @@ public class StringToIntegerConverter
      *            the error message to use if conversion fails
      */
     public StringToIntegerConverter(String errorMessage) {
-        this.errorMessage = errorMessage;
+        super(errorMessage);
     }
 
     /**
@@ -66,22 +64,23 @@ public class StringToIntegerConverter
 
     @Override
     public Result<Integer> convertToModel(String value, Locale locale) {
-        Number n = convertToNumber(value, locale);
-
-        if (n == null) {
-            return Result.ok(null);
-        }
-
-        int intValue = n.intValue();
-        if (intValue == n.longValue()) {
-            // If the value of n is outside the range of long, the return value
-            // of longValue() is either Long.MIN_VALUE or Long.MAX_VALUE. The
-            // above comparison promotes int to long and thus does not need to
-            // consider wrap-around.
-            return Result.ok(intValue);
-        } else {
-            return Result.error(errorMessage);
-        }
+        Result<Number> n = convertToNumber(value, locale);
+        return n.flatMap(number -> {
+            if (number == null) {
+                return Result.ok(null);
+            } else {
+                int intValue = number.intValue();
+                if (intValue == number.longValue()) {
+                    // If the value of n is outside the range of long, the
+                    // return value of longValue() is either Long.MIN_VALUE or
+                    // Long.MAX_VALUE. The/ above comparison promotes int to
+                    // long and thus does not need to consider wrap-around.
+                    return Result.ok(intValue);
+                } else {
+                    return Result.error(getErrorMessage());
+                }
+            }
+        });
     }
 
 }
index d82dec9ae9aa61bdad0283a9dbacd91ac0fb22b7..9b7bfa4fc6202728c915306c5767f1e637754455 100644 (file)
@@ -35,6 +35,16 @@ import com.vaadin.data.Result;
 public class StringToLongConverter
         extends AbstractStringToNumberConverter<Long> {
 
+    /**
+     * Creates a new converter instance with the given error message.
+     *
+     * @param errorMessage
+     *            the error message to use if conversion fails
+     */
+    public StringToLongConverter(String errorMessage) {
+        super(errorMessage);
+    }
+
     /**
      * Returns the format used by {@link #convertToPresentation(Long, Locale)}
      * and {@link #convertToModel(String, Locale)}.
@@ -53,9 +63,14 @@ public class StringToLongConverter
 
     @Override
     public Result<Long> convertToModel(String value, Locale locale) {
-        Number n = convertToNumber(value, locale);
-        return n == null ? Result.ok(null) : Result.ok(n.longValue());
-
+        Result<Number> n = convertToNumber(value, locale);
+        return n.map(number -> {
+            if (number == null) {
+                return null;
+            } else {
+                return number.longValue();
+            }
+        });
     }
 
 }
index 7414c0b1e7a917ec51ae97a1b484f16f36c64584..0fcefe0a27a0db620dec7640ec29329877daaa7d 100644 (file)
@@ -109,7 +109,8 @@ public class DesignFormatter implements Serializable {
         final DecimalFormat fmt = new DecimalFormat("0.###", symbols);
         fmt.setGroupingUsed(false);
 
-        Converter<String, ?> floatConverter = new StringToFloatConverter() {
+        Converter<String, ?> floatConverter = new StringToFloatConverter(
+                "Error converting value") {
             @Override
             protected NumberFormat getFormat(Locale locale) {
                 return fmt;
@@ -118,7 +119,8 @@ public class DesignFormatter implements Serializable {
         converterMap.put(Float.class, floatConverter);
         converterMap.put(float.class, floatConverter);
 
-        Converter<String, ?> doubleConverter = new StringToDoubleConverter() {
+        Converter<String, ?> doubleConverter = new StringToDoubleConverter(
+                "Error converting value") {
             @Override
             protected NumberFormat getFormat(Locale locale) {
                 return fmt;
@@ -130,12 +132,13 @@ public class DesignFormatter implements Serializable {
         final DecimalFormat bigDecimalFmt = new DecimalFormat("0.###", symbols);
         bigDecimalFmt.setGroupingUsed(false);
         bigDecimalFmt.setParseBigDecimal(true);
-        converterMap.put(BigDecimal.class, new StringToBigDecimalConverter() {
-            @Override
-            protected NumberFormat getFormat(Locale locale) {
-                return bigDecimalFmt;
-            };
-        });
+        converterMap.put(BigDecimal.class,
+                new StringToBigDecimalConverter("Error converting value") {
+                    @Override
+                    protected NumberFormat getFormat(Locale locale) {
+                        return bigDecimalFmt;
+                    };
+                });
 
         // strings do nothing
         converterMap.put(String.class, new Converter<String, String>() {
index 6ed2170fa77b49f6f0ae7dc41068908ee62684e5..02a32135f61dc9d67ef84ec50945afdc3fcbcbb8 100644 (file)
@@ -476,4 +476,36 @@ public class BinderBookOfVaadinTest {
         Assert.assertEquals("foo@bar.com", person.getEmail());
     }
 
+    @Test
+    public void manyConvertersAndValidators() throws ValidationException {
+        TextField yearOfBirthField = new TextField();
+        binder.forField(yearOfBirthField)
+                // Validator will be run with the String value of the field
+                .withValidator(text -> text.length() == 4,
+                        "Doesn't look like a year")
+                // Converter will only be run for strings with 4 characters
+                .withConverter(
+                        new StringToIntegerConverter("Must enter a number"))
+                // Validator will be run with the converted value
+                .withValidator(year -> year >= 1900 && year <= 2000,
+                        "Person must be born in the 20th century")
+                .bind(BookPerson::getYearOfBirth, BookPerson::setYearOfBirth);
+
+        yearOfBirthField.setValue("abc");
+        Assert.assertEquals("Doesn't look like a year",
+                binder.validate().get(0).getMessage());
+        yearOfBirthField.setValue("abcd");
+        Assert.assertEquals("Must enter a number",
+                binder.validate().get(0).getMessage());
+        yearOfBirthField.setValue("1200");
+        Assert.assertEquals("Person must be born in the 20th century",
+                binder.validate().get(0).getMessage());
+
+        yearOfBirthField.setValue("1950");
+        Assert.assertTrue(binder.validate().isEmpty());
+        BookPerson person = new BookPerson(1500, 12);
+        binder.save(person);
+        Assert.assertEquals(1950, person.getYearOfBirth());
+    }
+
 }
index 276b0b674ca908ac95e89cd2756dc09fdb66e379..bc9a96b3112603b541cb8b1d762cba05fb317c85 100644 (file)
@@ -10,16 +10,16 @@ public abstract class AbstractConverterTest {
 
     @Test
     public void testNullConversion() {
-        assertResult(null, getConverter().convertToModel(null, null));
+        assertValue(null, getConverter().convertToModel(null, null));
     }
 
     protected abstract Converter<?, ?> getConverter();
 
-    protected void assertResult(Object object, Result<?> result) {
-        assertResult(null, object, result);
+    protected void assertValue(Object object, Result<?> result) {
+        assertValue(null, object, result);
     }
 
-    protected void assertResult(String error, Object object, Result<?> result) {
+    protected void assertValue(String error, Object object, Result<?> result) {
         Assert.assertNotNull("Result should never be null", result);
         Assert.assertFalse("Result is not ok", result.isError());
         Assert.assertEquals(object,
@@ -27,4 +27,14 @@ public abstract class AbstractConverterTest {
                         error != null ? error : message)));
     }
 
+    protected void assertError(String expected, Result<?> result) {
+        Assert.assertNotNull("Result should never be null", result);
+        Assert.assertTrue("Result should be an error", result.isError());
+        Assert.assertEquals(expected, result.getMessage().get());
+    }
+
+    protected String getErrorMessage() {
+        return "conversion failed";
+    }
+
 }
diff --git a/server/src/test/java/com/vaadin/tests/data/converter/AbstractStringConverterTest.java b/server/src/test/java/com/vaadin/tests/data/converter/AbstractStringConverterTest.java
new file mode 100644 (file)
index 0000000..bf2653d
--- /dev/null
@@ -0,0 +1,32 @@
+package com.vaadin.tests.data.converter;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.data.Result;
+import com.vaadin.data.util.converter.Converter;
+
+public abstract class AbstractStringConverterTest
+        extends AbstractConverterTest {
+
+    @Override
+    protected abstract Converter<String, ?> getConverter();
+
+    @Test
+    public void testEmptyStringConversion() {
+        assertValue("Null value was converted incorrectly", null,
+                getConverter().convertToModel("", null));
+    }
+
+    @Test
+    public void testErrorMessage() {
+        Result<?> result = getConverter().convertToModel("abc", null);
+        Assert.assertTrue(result.isError());
+        Assert.assertEquals(getErrorMessage(), result.getMessage().get());
+    }
+
+    protected String getErrorMessage() {
+        return "conversion failed";
+    }
+
+}
index 3ce42f53487bf221177074119a9a4ab8ed601a34..d0eb336616ac0040a1226e0db089b6d211b38d56 100644 (file)
@@ -16,13 +16,13 @@ public class DateToLongConverterTest extends AbstractConverterTest {
     @Override
     @Test
     public void testNullConversion() {
-        assertResult(null, getConverter().convertToModel(null, null));
+        assertValue(null, getConverter().convertToModel(null, null));
     }
 
     @Test
     public void testValueConversion() {
         Date d = new Date(100, 0, 1);
-        assertResult(
+        assertValue(
                 Long.valueOf(946677600000l
                         + (d.getTimezoneOffset() + 120) * 60 * 1000L),
                 getConverter().convertToModel(d, null));
index 3bc4e2d481d7db83bc213d941f49d9e43db9dd21..6264b81da1403618390da0967cb9a7a3d1abaf78 100644 (file)
@@ -18,7 +18,7 @@ public class DateToSqlDateConverterTest extends AbstractConverterTest {
     public void testValueConversion() {
         Date testDate = new Date(100, 0, 1);
         long time = testDate.getTime();
-        assertResult(testDate, getConverter()
+        assertValue(testDate, getConverter()
                 .convertToModel(new java.sql.Date(time), Locale.ENGLISH));
     }
 }
index fd5fe2416b503361fbbef6f9bb4e2eee5e3587be..4481da2eadc7284f0ab12fca351d17dcd2a7daa0 100644 (file)
@@ -24,16 +24,12 @@ import org.junit.Test;
 import com.vaadin.data.Result;
 import com.vaadin.data.util.converter.StringToBigDecimalConverter;
 
-public class StringToBigDecimalConverterTest extends AbstractConverterTest {
+public class StringToBigDecimalConverterTest
+        extends AbstractStringConverterTest {
 
     @Override
     protected StringToBigDecimalConverter getConverter() {
-        return new StringToBigDecimalConverter();
-    }
-
-    @Test
-    public void testEmptyStringConversion() {
-        assertResult(null, getConverter().convertToModel("", null));
+        return new StringToBigDecimalConverter(getErrorMessage());
     }
 
     @Test
@@ -41,7 +37,7 @@ public class StringToBigDecimalConverterTest extends AbstractConverterTest {
         Result<BigDecimal> converted = getConverter().convertToModel("10",
                 null);
         BigDecimal expected = new BigDecimal(10);
-        assertResult(expected, converted);
+        assertValue(expected, converted);
     }
 
     @Test
index e537fdf8a1ebcf620e96bbe3e2090c11b968e020..56ed799bbcfe364937a2693fbe31b339c5483945 100644 (file)
@@ -18,24 +18,18 @@ package com.vaadin.tests.data.converter;
 import java.math.BigInteger;
 import java.util.Locale;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import com.vaadin.data.Result;
 import com.vaadin.data.util.converter.StringToBigIntegerConverter;
 
-import junit.framework.Assert;
-
-public class StringToBigIntegerConverterTest extends AbstractConverterTest {
+public class StringToBigIntegerConverterTest
+        extends AbstractStringConverterTest {
 
     @Override
     protected StringToBigIntegerConverter getConverter() {
-        return new StringToBigIntegerConverter();
-    }
-
-    @Test
-    public void testEmptyStringConversion() {
-        assertResult("Empty value was converted incorrectly", null,
-                getConverter().convertToModel("", null));
+        return new StringToBigIntegerConverter(getErrorMessage());
     }
 
     @Test
@@ -44,7 +38,7 @@ public class StringToBigIntegerConverterTest extends AbstractConverterTest {
         Result<BigInteger> converted = getConverter().convertToModel(bigInt,
                 null);
         BigInteger expected = new BigInteger(bigInt);
-        assertResult("Value bigger than max long was converted incorrectly",
+        assertValue("Value bigger than max long was converted incorrectly",
                 expected, converted);
     }
 
index d73fe5ca87738d83b716a2738aea6a666583b831..5ca24f64aaf6bd040cd7ae8c0bd10d0a9bbfea20 100644 (file)
@@ -9,16 +9,19 @@ import org.junit.Test;
 
 import com.vaadin.data.util.converter.StringToBooleanConverter;
 
-public class StringToBooleanConverterTest extends AbstractConverterTest {
+public class StringToBooleanConverterTest extends AbstractStringConverterTest {
 
     @Override
     protected StringToBooleanConverter getConverter() {
-        return new StringToBooleanConverter();
+        return new StringToBooleanConverter(getErrorMessage());
     }
 
-    StringToBooleanConverter yesNoConverter = new StringToBooleanConverter(
-            "yes", "no");
-    StringToBooleanConverter localeConverter = new StringToBooleanConverter() {
+    private StringToBooleanConverter yesNoConverter = new StringToBooleanConverter(
+            getErrorMessage(), "yes", "no");
+    private StringToBooleanConverter emptyTrueConverter = new StringToBooleanConverter(
+            getErrorMessage(), "", "ABSENT");
+    private StringToBooleanConverter localeConverter = new StringToBooleanConverter(
+            getErrorMessage()) {
         @Override
         public String getFalseString(Locale locale) {
             Date d = new Date(3000000000000L);
@@ -38,21 +41,16 @@ public class StringToBooleanConverterTest extends AbstractConverterTest {
         }
     };
 
-    @Test
-    public void testEmptyStringConversion() {
-        assertResult(null, getConverter().convertToModel("", null));
-    }
-
     @Test
     public void testValueConversion() {
-        assertResult(true, getConverter().convertToModel("true", null));
-        assertResult(false, getConverter().convertToModel("false", null));
+        assertValue(true, getConverter().convertToModel("true", null));
+        assertValue(false, getConverter().convertToModel("false", null));
     }
 
     @Test
     public void testYesNoValueConversion() {
-        assertResult(true, yesNoConverter.convertToModel("yes", null));
-        assertResult(false, yesNoConverter.convertToModel("no", null));
+        assertValue(true, yesNoConverter.convertToModel("yes", null));
+        assertValue(false, yesNoConverter.convertToModel("no", null));
 
         Assert.assertEquals("yes",
                 yesNoConverter.convertToPresentation(true, null));
@@ -60,6 +58,17 @@ public class StringToBooleanConverterTest extends AbstractConverterTest {
                 yesNoConverter.convertToPresentation(false, null));
     }
 
+    @Test
+    public void testEmptyTrueValueConversion() {
+        assertValue(true, emptyTrueConverter.convertToModel("", null));
+        assertValue(false, emptyTrueConverter.convertToModel("ABSENT", null));
+
+        Assert.assertEquals("",
+                emptyTrueConverter.convertToPresentation(true, null));
+        Assert.assertEquals("ABSENT",
+                emptyTrueConverter.convertToPresentation(false, null));
+    }
+
     @Test
     public void testLocale() {
         Assert.assertEquals("May 18, 2033",
index b7866ca9d67a33f98c790e0a0e88285e380f5b17..0fe20888470874294a5be490c9032f44f14a5f09 100644 (file)
@@ -16,12 +16,12 @@ public class StringToDateConverterTest extends AbstractConverterTest {
 
     @Test
     public void testEmptyStringConversion() {
-        assertResult(null, getConverter().convertToModel("", null));
+        assertValue(null, getConverter().convertToModel("", null));
     }
 
     @Test
     public void testValueConversion() {
-        assertResult(new Date(100, 0, 1), getConverter()
+        assertValue(new Date(100, 0, 1), getConverter()
                 .convertToModel("Jan 1, 2000 12:00:00 AM", Locale.ENGLISH));
     }
 }
index 8e043e208245a7261c539fe25d0da85874569985..28a5a7f73f2ac4062ad74b6efe17625783a876b8 100644 (file)
@@ -1,5 +1,6 @@
 package com.vaadin.tests.data.converter;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import com.vaadin.data.Result;
@@ -9,17 +10,25 @@ public class StringToDoubleConverterTest extends AbstractConverterTest {
 
     @Override
     protected StringToDoubleConverter getConverter() {
-        return new StringToDoubleConverter();
+        return new StringToDoubleConverter("Failed");
     }
 
     @Test
     public void testEmptyStringConversion() {
-        assertResult(null, getConverter().convertToModel("", null));
+        assertValue(null, getConverter().convertToModel("", null));
     }
 
     @Test
     public void testValueConversion() {
         Result<Double> value = getConverter().convertToModel("10", null);
-        assertResult(10.0d, value);
+        assertValue(10.0d, value);
     }
+
+    @Test
+    public void testErrorMessage() {
+        Result<Double> result = getConverter().convertToModel("abc", null);
+        Assert.assertTrue(result.isError());
+        Assert.assertEquals("Failed", result.getMessage().get());
+    }
+
 }
index a6292d3310f6326ff60ac444e1aeeb52e53ea56a..20b51deb5454a4f911b6a6c2568caf8c4a54f199 100644 (file)
@@ -4,27 +4,28 @@ import org.junit.Test;
 
 import com.vaadin.data.util.converter.StringToFloatConverter;
 
-public class StringToFloatConverterTest extends AbstractConverterTest {
+public class StringToFloatConverterTest extends AbstractStringConverterTest {
 
     @Override
     protected StringToFloatConverter getConverter() {
-        return new StringToFloatConverter();
+        return new StringToFloatConverter(getErrorMessage());
     }
 
     @Override
     @Test
     public void testNullConversion() {
-        assertResult(null, getConverter().convertToModel(null, null));
+        assertValue(null, getConverter().convertToModel(null, null));
     }
 
+    @Override
     @Test
     public void testEmptyStringConversion() {
-        assertResult(null, getConverter().convertToModel("", null));
+        assertValue(null, getConverter().convertToModel("", null));
     }
 
     @Test
     public void testValueConversion() {
-        assertResult(Float.valueOf(10),
+        assertValue(Float.valueOf(10),
                 getConverter().convertToModel("10", null));
     }
 }
index daaf27838b26abd65fad9e3addb5f46e7c8d048c..a215c2c78544cddd1193dc9ac465c5a94394187b 100644 (file)
@@ -3,6 +3,7 @@ package com.vaadin.tests.data.converter;
 import org.junit.Assert;
 import org.junit.Test;
 
+import com.vaadin.data.Result;
 import com.vaadin.data.util.converter.StringToIntegerConverter;
 
 public class StringToIntegerConverterTest extends AbstractConverterTest {
@@ -14,7 +15,7 @@ public class StringToIntegerConverterTest extends AbstractConverterTest {
 
     @Test
     public void testEmptyStringConversion() {
-        assertResult(null, getConverter().convertToModel("", null));
+        assertValue(null, getConverter().convertToModel("", null));
     }
 
     @Test
@@ -37,7 +38,14 @@ public class StringToIntegerConverterTest extends AbstractConverterTest {
 
     @Test
     public void testValueConversion() {
-        assertResult(Integer.valueOf(10),
+        assertValue(Integer.valueOf(10),
                 getConverter().convertToModel("10", null));
     }
+
+    @Test
+    public void testErrorMessage() {
+        Result<Integer> result = getConverter().convertToModel("abc", null);
+        Assert.assertTrue(result.isError());
+        Assert.assertEquals("Failed", result.getMessage().get());
+    }
 }
index 46afb848d3a343d35f9d7d147a9a082a60ab00c6..818e0f2ce7e4bd178a038b4709565b81328d0b24 100644 (file)
@@ -5,21 +5,22 @@ import org.junit.Test;
 import com.vaadin.data.Result;
 import com.vaadin.data.util.converter.StringToLongConverter;
 
-public class StringToLongConverterTest extends AbstractConverterTest {
+public class StringToLongConverterTest extends AbstractStringConverterTest {
 
     @Override
     protected StringToLongConverter getConverter() {
-        return new StringToLongConverter();
+        return new StringToLongConverter(getErrorMessage());
     }
 
+    @Override
     @Test
     public void testEmptyStringConversion() {
-        assertResult(null, getConverter().convertToModel("", null));
+        assertValue(null, getConverter().convertToModel("", null));
     }
 
     @Test
     public void testValueConversion() {
-        assertResult(Long.valueOf(10),
+        assertValue(Long.valueOf(10),
                 getConverter().convertToModel("10", null));
     }
 
@@ -27,9 +28,9 @@ public class StringToLongConverterTest extends AbstractConverterTest {
     public void testExtremeLongValueConversion() {
         Result<Long> l = getConverter().convertToModel("9223372036854775807",
                 null);
-        assertResult(Long.MAX_VALUE, l);
+        assertValue(Long.MAX_VALUE, l);
         l = getConverter().convertToModel("-9223372036854775808", null);
-        assertResult(Long.MIN_VALUE, l);
+        assertValue(Long.MIN_VALUE, l);
     }
 
     @Test
@@ -37,10 +38,10 @@ public class StringToLongConverterTest extends AbstractConverterTest {
         // Long.MAX_VALUE+1 is converted to Long.MAX_VALUE
         Result<Long> l = getConverter().convertToModel("9223372036854775808",
                 null);
-        assertResult(Long.MAX_VALUE, l);
+        assertValue(Long.MAX_VALUE, l);
         // Long.MIN_VALUE-1 is converted to Long.MIN_VALUE
         l = getConverter().convertToModel("-9223372036854775809", null);
-        assertResult(Long.MIN_VALUE, l);
+        assertValue(Long.MIN_VALUE, l);
 
     }
 }