/*
* 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 net.formio.format;
import static org.junit.Assert.fail;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Test;
/**
* Tests for {@link BasicFormatters}.
* @author Radek Beran
*/
public class BasicFormattersTest {
@Test
public void testClassesUsability() {
Assert.assertEquals(Integer.class, Integer.class);
Assert.assertEquals(BigDecimal.class, BigDecimal.class);
Assert.assertFalse(BigInteger.class.equals(BigDecimal.class));
Assert.assertFalse(BigInteger.class.equals(Number.class));
}
@Test
public void testParseEnDecimal() {
final BasicFormatters formatters = new BasicFormatters();
final Location loc = Location.ENGLISH;
BigDecimal bd = formatters.parseFromString("3,6", BigDecimal.class, loc);
Assert.assertNotNull("Result decimal is null", bd);
// Separator "," considered as thousands delimiter
Assert.assertEquals(BigDecimal.valueOf(36L), bd);
BigDecimal bd2 = formatters.parseFromString("3.6", BigDecimal.class, loc);
Assert.assertNotNull("Result decimal is null", bd2);
Assert.assertEquals(BigDecimal.valueOf(36, 1), bd2);
}
@Test
public void testMakeStringBigDecimal() {
final BasicFormatters formatters = new BasicFormatters();
Assert.assertEquals("50,6", formatters.makeString(BigDecimal.valueOf(5060, 2), Location.CZECH));
Assert.assertEquals("50.6", formatters.makeString(BigDecimal.valueOf(5060, 2), Location.ENGLISH));
}
@Test
public void testParseFromString() {
final BasicFormatters formatters = new BasicFormatters();
final Location csArea = Location.CZECHIA;
final Location enArea = Location.ENGLISH;
Date date = formatters.parseFromString("12.3.2014 16:30", Date.class, "dd.MM.yyyy HH:mm", csArea);
Assert.assertNotNull("Result date is null", date);
Calendar cal = getCalendarForDate(date);
Assert.assertEquals(12, cal.get(Calendar.DAY_OF_MONTH));
Assert.assertEquals(3 - 1, cal.get(Calendar.MONTH));
Assert.assertEquals(2014, cal.get(Calendar.YEAR));
Assert.assertEquals(16, cal.get(Calendar.HOUR_OF_DAY));
Assert.assertEquals(30, cal.get(Calendar.MINUTE));
BigDecimal bd = formatters.parseFromString("3,6", BigDecimal.class, "#.#", csArea);
Assert.assertNotNull("Result decimal is null", bd);
Assert.assertEquals(BigDecimal.valueOf(36, 1), bd);
BigDecimal bd2 = formatters.parseFromString("3.6", BigDecimal.class, "#.#", enArea);
Assert.assertNotNull("Result decimal is null", bd2);
Assert.assertEquals(BigDecimal.valueOf(36, 1), bd2);
BigDecimal bd3 = formatters.parseFromString("3,6", BigDecimal.class, csArea);
Assert.assertNotNull("Result decimal is null", bd3);
Assert.assertEquals(BigDecimal.valueOf(36, 1), bd3);
BigDecimal bd4 = formatters.parseFromString("3.6", BigDecimal.class, enArea);
Assert.assertNotNull("Result decimal is null", bd4);
Assert.assertEquals(BigDecimal.valueOf(36, 1), bd4);
Double d = formatters.parseFromString("2,1", Double.class, csArea);
Assert.assertNotNull("Result double is null", d);
Assert.assertEquals(2.1, d.doubleValue(), 0.001);
Double d2 = formatters.parseFromString("2,1", Double.class, csArea);
Assert.assertNotNull("Result double is null", d2);
Assert.assertEquals(2.1, d2.doubleValue(), 0.001);
BigInteger bi = formatters.parseFromString("123", BigInteger.class, csArea);
Assert.assertNotNull("Result big integer is null", bi);
Assert.assertEquals(BigInteger.valueOf(123), bi);
BigInteger bi2 = formatters.parseFromString("123,3", BigInteger.class, csArea);
Assert.assertNotNull("Result big integer is null", bi2);
Assert.assertEquals(BigInteger.valueOf(123), bi2);
Short s = formatters.parseFromString("6", Short.class, csArea);
Assert.assertNotNull("Result Short is null", s);
Assert.assertEquals(Short.valueOf("6"), s);
Short s2 = formatters.parseFromString("45.45", Short.class, csArea);
Assert.assertNotNull("Result Short is null", s2);
Assert.assertEquals(Short.valueOf("45"), s2);
Integer i = formatters.parseFromString("45", Integer.class, csArea);
Assert.assertNotNull("Result Integer is null", i);
Assert.assertEquals(Integer.valueOf(45), i);
Integer i2 = formatters.parseFromString("45.45", Integer.class, csArea);
Assert.assertNotNull("Result Integer is null", i2);
Assert.assertEquals(Integer.valueOf(45), i2);
Long l = formatters.parseFromString("45", Long.class, csArea);
Assert.assertNotNull("Result Long is null", l);
Assert.assertEquals(Long.valueOf(45), l);
Long l2 = formatters.parseFromString("45.45", Long.class, csArea);
Assert.assertNotNull("Result Long is null", l2);
Assert.assertEquals(Long.valueOf(45), l2);
MluvnickyPad e = formatters.parseFromString("GENITIV", MluvnickyPad.class, csArea);
Assert.assertNotNull("Result Enum is null", e);
Assert.assertEquals(MluvnickyPad.GENITIV, e);
}
@Test
public void testParseFromString2() {
final Location loc = Location.getInstance(new Locale("cs", "CZ"));
final BasicFormatters formatters = new BasicFormatters();
Assert.assertEquals("true", formatters.makeString(Boolean.TRUE, loc));
Assert.assertEquals("false", formatters.makeString(Boolean.FALSE, loc));
Assert.assertEquals("1", formatters.makeString(Byte.valueOf((byte)1), loc));
Assert.assertEquals("1", formatters.makeString(Short.valueOf((short)1), loc)); // NOPMD by Radek on 2.3.14 19:27
Assert.assertEquals("1", formatters.makeString(Integer.valueOf(1), loc));
Assert.assertEquals("1", formatters.makeString(Long.valueOf(1L), loc));
Assert.assertEquals("hello", formatters.makeString("hello", loc));
Assert.assertEquals("3", formatters.makeString(new BigInteger("3"), loc));
Assert.assertEquals("2,1", formatters.makeString(Double.valueOf(2.1), loc));
String dateStr = "12.03.2014 16:30";
String dateFormat = "dd.MM.yyyy HH:mm";
Date date = formatters.parseFromString(dateStr, Date.class, dateFormat, loc);
Assert.assertEquals(dateStr, formatters.makeString(date, dateFormat, loc));
String bdStr = "3,6";
String bdFormat = "#.#";
BigDecimal bd = formatters.parseFromString(bdStr, BigDecimal.class, bdFormat, loc);
Assert.assertEquals(bdStr, formatters.makeString(bd, bdFormat, loc));
Assert.assertEquals(MluvnickyPad.GENITIV.name(), formatters.makeString(MluvnickyPad.GENITIV, loc));
Assert.assertEquals(null, formatters.makeString(null, loc));
}
@Test
public void testFormattersToAndFromString() {
try {
final Location loc = Location.getInstance(new Locale("cs", "CZ"));
final BasicFormatters formatters = new BasicFormatters();
Date date = new SimpleDateFormat(FormatsCache.DEFAULT_DATE_FORMAT).parse("1.12.2014");
Assert.assertEquals(date, formatters.parseFromString(formatters.makeString(date, loc), Date.class, loc));
Assert.assertEquals(Boolean.TRUE, formatters.parseFromString(formatters.makeString(Boolean.TRUE, loc), Boolean.class, loc));
Assert.assertEquals(Boolean.FALSE, formatters.parseFromString(formatters.makeString(Boolean.FALSE, loc), Boolean.class, loc));
Assert.assertEquals(Byte.valueOf((byte)1), formatters.parseFromString(formatters.makeString(Byte.valueOf((byte)1), loc), Byte.class, loc));
Assert.assertEquals(Short.valueOf((short)1), formatters.parseFromString(formatters.makeString(Short.valueOf((short)1), loc), Short.class, loc)); // NOPMD by Radek on 2.3.14 19:27
Assert.assertEquals(Integer.valueOf(1), formatters.parseFromString(formatters.makeString(Integer.valueOf(1), loc), Integer.class, loc));
Assert.assertEquals(Long.valueOf(1L), formatters.parseFromString(formatters.makeString(Long.valueOf(1L), loc), Long.class, loc));
Assert.assertEquals(new BigInteger("3"), formatters.parseFromString(formatters.makeString(new BigInteger("3"), loc), BigInteger.class, loc));
Assert.assertEquals("hello, dolly", formatters.parseFromString(formatters.makeString("hello, dolly", loc), String.class, loc));
String dStr = "123456789.0123456789";
String dToStr = formatters.makeString(Double.valueOf(dStr), loc);
// System.out.println(dToStr);
Assert.assertEquals(Double.valueOf(dStr), formatters.parseFromString(dToStr, Double.class, loc));
String bdStr = "123456789123456789876543210.012345678987654321987654321";
String bdToStr = formatters.makeString(new BigDecimal(bdStr), loc);
// System.out.println(bdToStr);
Assert.assertEquals(new BigDecimal(bdStr), formatters.parseFromString(bdToStr, BigDecimal.class, loc));
Assert.assertEquals(MluvnickyPad.GENITIV, formatters.parseFromString(formatters.makeString(MluvnickyPad.GENITIV, loc), MluvnickyPad.class, loc));
} catch (Exception ex) {
ex.printStackTrace();
fail(ex.getMessage());
}
}
@Test
public void testParseLongFromString() {
final BasicFormatters formatters = new BasicFormatters();
Assert.assertEquals(Long.valueOf(Long.MAX_VALUE), formatters.parseFromString("" + Long.MAX_VALUE, Long.class, Location.ENGLISH));
}
@Test
public void testParseBooleanFromString() {
final BasicFormatters formatters = new BasicFormatters();
final Location enArea = Location.ENGLISH;
Assert.assertEquals(Boolean.TRUE, formatters.parseFromString("on", Boolean.class, enArea));
Assert.assertEquals(Boolean.FALSE, formatters.parseFromString("off", Boolean.class, enArea));
}
@Test
public void testMakeStringFromBoolean() {
final BasicFormatters formatters = new BasicFormatters();
final Location enArea = Location.ENGLISH;
Assert.assertEquals("true", formatters.makeString(Boolean.TRUE, enArea));
}
@Test(expected=FormatterNotFoundException.class)
public void testNonRegisteredParser() {
final Location loc = Location.CZECH;
final BasicFormatters formatters = new BasicFormatters();
formatters.parseFromString("12.3.2014 16:30", Day.class, "dd.MM.yyyy HH:mm", loc);
}
@Test(expected=StringParseException.class)
public void testIncorrectFormat() {
final Location loc = Location.CZECH;
final BasicFormatters formatters = new BasicFormatters();
formatters.parseFromString("12.3.2014 16:30", Date.class, "jj.ee.yyyy HH:mm", loc);
}
@Test(expected=StringParseException.class)
public void testTooSpecificFormat() {
final Location loc = Location.CZECH;
final BasicFormatters formatters = new BasicFormatters();
// But hours and minutes are not present in the string
Date date2 = formatters.parseFromString("12.3.2014", Date.class, "dd.MM.yyyy HH:mm", loc);
Assert.assertNotNull("Result date is null", date2);
Calendar cal2 = getCalendarForDate(date2);
Assert.assertEquals(12, cal2.get(Calendar.DAY_OF_MONTH));
Assert.assertEquals(3 - 1, cal2.get(Calendar.MONTH));
Assert.assertEquals(2014, cal2.get(Calendar.YEAR));
}
@Test(expected=StringParseException.class)
public void testInvalidBigDecimal() {
final Location loc = Location.CZECH;
final BasicFormatters formatters = new BasicFormatters();
formatters.parseFromString("aaa", BigDecimal.class, loc);
}
@Test
public void testExtensibility() {
final Location loc = Location.CZECH;
final BasicFormatters stringParsers = new ExtendedFormatters();
// Extended formatter supporting special Day class:
Day date = stringParsers.parseFromString("12.3.2014", Day.class, "dd.MM.yyyy", loc);
Assert.assertNotNull("Result date is null", date);
Calendar cal = getCalendarForDate(date);
Assert.assertEquals(12, cal.get(Calendar.DAY_OF_MONTH));
Assert.assertEquals(3 - 1, cal.get(Calendar.MONTH));
Assert.assertEquals(2014, cal.get(Calendar.YEAR));
}
@Test
public void testParsersKeyEquality() {
Assert.assertEquals(BasicFormatters.class, BasicFormatters.class);
}
@Test
public void testFormatterKeyEquality() {
Assert.assertEquals(BasicFormatters.class, BasicFormatters.class);
}
private Calendar getCalendarForDate(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal;
}
static class ExtendedFormatters extends BasicFormatters {
@Override
protected Map<Class<?>, Formatter<?>> registerFormatters() {
Map<Class<?>, Formatter<?>> formatters = new HashMap<Class<?>, Formatter<?>>();
formatters.putAll(super.registerFormatters());
formatters.put(Day.class, new Formatter<Day>() {
@Override
public Day parseFromString(String str, Class<Day> destClass, String formatPattern, Location loc) {
try {
Date date = FormatsCache.getOrCreateDateFormat(formatPattern, loc).parse(str);
return date != null ? Day.valueOf(date) : null;
} catch (Exception ex) {
throw new StringParseException(Day.class, str, ex);
}
}
@Override
public String makeString(Day value, String formatPattern, Location loc) {
return FormatsCache.getOrCreateDateFormat(formatPattern, loc).format(value);
}
});
return Collections.unmodifiableMap(formatters);
}
}
}