/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.wicket.util.convert.converters; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import java.math.BigDecimal; import java.text.ChoiceFormat; import java.text.NumberFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.convert.converter.BigDecimalConverter; import org.apache.wicket.util.convert.converter.BooleanConverter; import org.apache.wicket.util.convert.converter.ByteConverter; import org.apache.wicket.util.convert.converter.CalendarConverter; import org.apache.wicket.util.convert.converter.CharacterConverter; import org.apache.wicket.util.convert.converter.DateConverter; import org.apache.wicket.util.convert.converter.DoubleConverter; import org.apache.wicket.util.convert.converter.FloatConverter; import org.apache.wicket.util.convert.converter.IntegerConverter; import org.apache.wicket.util.convert.converter.LongConverter; import org.apache.wicket.util.convert.converter.ShortConverter; import org.junit.Test; @SuppressWarnings("javadoc") public final class ConvertersTest { /** Dutch locale for localized testing. */ private static final Locale DUTCH_LOCALE = new Locale("nl", "NL"); @Test public void thousandSeperator() throws Exception { BigDecimalConverter bdc = new BigDecimalConverter(); assertEquals(new BigDecimal(3000), bdc.convertToObject("3 000", Locale.FRENCH)); DoubleConverter dc = new DoubleConverter(); assertEquals(3000, dc.convertToObject("3 000", Locale.FRENCH), 0.001); } /** * WICKET-4988 nbsp between digits only */ @Test public void thousandSeperatorWithCurrency() throws Exception { FloatConverter fc = new FloatConverter() { private static final long serialVersionUID = 1L; @Override protected NumberFormat newNumberFormat(Locale locale) { return NumberFormat.getCurrencyInstance(locale); } }; // \u00A0 = nbsp // \u00A4 = currency symbol (unspecified currency) String string = "1\u00A0234,00 \u00A4"; assertEquals(string, fc.convertToString(Float.valueOf(1234f), Locale.FRENCH)); assertEquals(Float.valueOf(1234f), fc.convertToObject(string, Locale.FRENCH)); } @Test public void validBooleanConversions() { BooleanConverter converter = new BooleanConverter(); assertEquals(Boolean.FALSE, converter.convertToObject("", Locale.US)); assertEquals("true", converter.convertToString(Boolean.TRUE, Locale.getDefault(Locale.Category.FORMAT))); assertEquals("false", converter.convertToString(Boolean.FALSE, Locale.getDefault(Locale.Category.FORMAT))); assertEquals(Boolean.TRUE, converter.convertToObject("true", Locale.getDefault(Locale.Category.FORMAT))); assertEquals(Boolean.FALSE, converter.convertToObject("false", Locale.getDefault(Locale.Category.FORMAT))); } @Test(expected = ConversionException.class) public void invalidBooleanConversion() { BooleanConverter converter = new BooleanConverter(); // should throw an exception converter.convertToObject("whatever", Locale.getDefault(Locale.Category.FORMAT)); } @Test public void validByteConversions() { ByteConverter converter = new ByteConverter(); assertNull(converter.convertToObject("", Locale.US)); assertEquals(new Byte((byte)10), converter.convertToObject("10", Locale.US)); assertEquals("10", converter.convertToString((byte)10, Locale.US)); } @Test(expected = ConversionException.class) public void invalidByteConversion1() { ByteConverter converter = new ByteConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidByteConversion2() { ByteConverter converter = new ByteConverter(); converter.convertToObject("10whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidByteConversion3() { ByteConverter converter = new ByteConverter(); converter.convertToObject("256", Locale.US); } @Test public void validDoubleConversions() { DoubleConverter converter = new DoubleConverter(); assertEquals("7.1", converter.convertToString(7.1, Locale.US)); assertEquals("7,1", converter.convertToString(7.1, DUTCH_LOCALE)); assertNull(converter.convertToObject("", Locale.US)); assertEquals(1.1, converter.convertToObject("1.1", Locale.US), 0.001); assertEquals("1.1", converter.convertToString(1.1, Locale.US)); } @Test(expected = ConversionException.class) public void invalidDoubleConversion1() { DoubleConverter converter = new DoubleConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidDoubleConversion2() { DoubleConverter converter = new DoubleConverter(); converter.convertToObject("1.1whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidDoubleConversion3() { DoubleConverter converter = new DoubleConverter(); converter.convertToObject("1" + Double.MAX_VALUE, Locale.US); } @Test public void validFloatConversions() { FloatConverter converter = new FloatConverter(); assertNull(converter.convertToObject("", Locale.US)); assertEquals(new Float(1.1), converter.convertToObject("1.1", Locale.US)); assertEquals("1.1", converter.convertToString(new Float(1.1), Locale.US)); } @Test(expected = ConversionException.class) public void invalidFloatConversion1() { FloatConverter converter = new FloatConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidFloatConversion2() { FloatConverter converter = new FloatConverter(); converter.convertToObject("1.1whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidFloatConversion3() { FloatConverter converter = new FloatConverter(); converter.convertToObject("1" + Float.MAX_VALUE, Locale.US); } @Test public void validIntegerConversions() { IntegerConverter converter = new IntegerConverter(); assertEquals("7", converter.convertToString(7, Locale.US)); assertNull(converter.convertToObject("", Locale.US)); assertEquals(new Integer(10), converter.convertToObject("10", Locale.US)); assertEquals("10", converter.convertToString(10, Locale.US)); } @Test(expected = ConversionException.class) public void invalidIntegerConversion1() { IntegerConverter converter = new IntegerConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidIntegerConversion2() { IntegerConverter converter = new IntegerConverter(); converter.convertToObject("10whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidIntegerConversion3() { IntegerConverter converter = new IntegerConverter(); converter.convertToObject("1.0", Locale.US); fail("Conversion should have thrown an exception"); } @Test(expected = ConversionException.class) public void invalidIntegerConversion4() { IntegerConverter converter = new IntegerConverter(); converter.convertToObject("1" + Integer.MAX_VALUE, Locale.US); } @Test public void validLongConversions() { LongConverter converter = new LongConverter(); assertNull(converter.convertToObject("", Locale.US)); assertEquals(new Long(10), converter.convertToObject("10", Locale.US)); assertEquals("10", converter.convertToString((long)10, Locale.US)); } @Test(expected = ConversionException.class) public void invalidLongConversion1() { LongConverter converter = new LongConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidLongConversion2() { LongConverter converter = new LongConverter(); converter.convertToObject("10whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidLongConversion3() { LongConverter converter = new LongConverter(); converter.convertToObject("1" + Long.MAX_VALUE, Locale.US); } @Test(expected = ConversionException.class) public void invalidLongConversion4() { LongConverter converter = new LongConverter(); // WICKET-5853 assert that the compared number is out of range of Long final String biggerThanLong = "9223372036854776833"; assertEquals(1, new BigDecimal(biggerThanLong).compareTo(BigDecimal.valueOf(Long.MAX_VALUE))); converter.convertToObject(biggerThanLong, Locale.US); } @Test(expected = ConversionException.class) public void invalidLongConversion5() { LongConverter converter = new LongConverter(); // WICKET-5853 assert that the compared number is out of range of Long final String biggerThanLong = "9223372036854776832"; assertEquals(1, new BigDecimal(biggerThanLong).compareTo(BigDecimal.valueOf(Long.MAX_VALUE))); converter.convertToObject(biggerThanLong, Locale.US); } @Test public void shortConversions() { ShortConverter converter = new ShortConverter(); assertNull(converter.convertToObject("", Locale.US)); assertEquals(new Short((short)10), converter.convertToObject("10", Locale.US)); assertEquals("10", converter.convertToString((short)10, Locale.US)); } @Test(expected = ConversionException.class) public void invalidShortConversion1() { ShortConverter converter = new ShortConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidShortConversion2() { ShortConverter converter = new ShortConverter(); converter.convertToObject("10whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidShortConversion3() { ShortConverter converter = new ShortConverter(); converter.convertToObject("" + (Short.MAX_VALUE + 1), Locale.US); } @Test public void validCharacterConverter() { CharacterConverter converter = new CharacterConverter(); assertNull(converter.convertToObject("", Locale.US)); assertEquals("A", converter.convertToString('A', DUTCH_LOCALE)); assertEquals((Object)'A', converter.convertToObject("A", DUTCH_LOCALE)); } @Test(expected = ConversionException.class) public void invalidCharacterConversion1() { CharacterConverter converter = new CharacterConverter(); converter.convertToObject("AA", Locale.US); fail("Conversion should have thrown an exception"); } @Test public void validDateConverters() { DateConverter converter = new DateConverter(); assertNull(new DateConverter().convertToObject("", Locale.US)); Calendar cal = Calendar.getInstance(DUTCH_LOCALE); cal.clear(); cal.set(2002, Calendar.OCTOBER, 24); Date date = cal.getTime(); assertEquals("24-10-02", converter.convertToString(date, DUTCH_LOCALE)); assertEquals(date, converter.convertToObject("24-10-02", DUTCH_LOCALE)); assertEquals("10/24/02", converter.convertToString(date, Locale.US)); assertEquals(date, converter.convertToObject("10/24/02", Locale.US)); } @Test(expected = ConversionException.class) public void invalidDateConversion1() { DateConverter converter = new DateConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidDateConversion2() { DateConverter converter = new DateConverter(); converter.convertToObject("10/24/02whatever", Locale.US); } @Test public void calendarConverter() { CalendarConverter converter = new CalendarConverter(); Calendar cal = Calendar.getInstance(DUTCH_LOCALE); cal.clear(); cal.set(2011, Calendar.MAY, 1); assertEquals("1-5-11", converter.convertToString(cal, DUTCH_LOCALE)); assertEquals(cal, converter.convertToObject("1-5-11", DUTCH_LOCALE)); cal = Calendar.getInstance(Locale.US); cal.clear(); cal.set(2011, Calendar.MAY, 1); assertEquals("5/1/11", converter.convertToString(cal, Locale.US)); assertEquals(cal, converter.convertToObject("5/1/11", Locale.US)); } @Test(expected = ConversionException.class) public void invalidCalendarConversion1() { CalendarConverter converter = new CalendarConverter(); converter.convertToObject("whatever", Locale.US); } @Test(expected = ConversionException.class) public void invalidCalendarConversion2() { CalendarConverter converter = new CalendarConverter(); converter.convertToObject("5/1/11whatever", Locale.US); } /** * See WICKET-2878 and * http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29 */ @Test public void bigDecimalConverter() { BigDecimal bd = new BigDecimalConverter().convertToObject("0.1", Locale.US); assertEquals(new BigDecimal("0.1"), bd); bd = new BigDecimalConverter().convertToObject("0,1", Locale.GERMAN); assertEquals(new BigDecimal("0.1"), bd); String max = "1" + Double.MAX_VALUE; bd = new BigDecimalConverter().convertToObject(max, Locale.US); assertEquals(new BigDecimal(max), bd); } @Test public void customFormat() { @SuppressWarnings("serial") IntegerConverter converter = new IntegerConverter() { protected NumberFormat newNumberFormat(Locale locale) { return new ChoiceFormat(new double[] { 1, 2, 3 }, new String[] { "one", "two", "three" }); } }; Integer integer = converter.convertToObject("two", Locale.US); assertEquals(new Integer(2), integer); } @Test(expected = ConversionException.class) public void invalidCustomConversion1() { @SuppressWarnings("serial") IntegerConverter converter = new IntegerConverter() { protected NumberFormat newNumberFormat(Locale locale) { return new ChoiceFormat(new double[] { 1, 2, 3 }, new String[] { "one", "two", "three" }); } }; converter.convertToObject("four", Locale.US); fail("Conversion should have thrown an exception"); } }