/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed 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.springframework.format.number;
import java.math.BigDecimal;
import java.util.List;
import java.util.Locale;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.convert.support.ConversionServiceFactory;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.format.annotation.NumberFormat.Style;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.util.StringValueResolver;
import org.springframework.validation.DataBinder;
/**
* @author Keith Donald
* @author Juergen Hoeller
*/
public class NumberFormattingTests {
private FormattingConversionService conversionService = new FormattingConversionService();
private DataBinder binder;
@Before
public void setUp() {
ConversionServiceFactory.addDefaultConverters(conversionService);
conversionService.setEmbeddedValueResolver(new StringValueResolver() {
public String resolveStringValue(String strVal) {
if ("${pattern}".equals(strVal)) {
return "#,##.00";
}
else {
return strVal;
}
}
});
conversionService.addFormatterForFieldType(Number.class, new NumberFormatter());
conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());
LocaleContextHolder.setLocale(Locale.US);
binder = new DataBinder(new TestBean());
binder.setConversionService(conversionService);
}
@After
public void tearDown() {
LocaleContextHolder.setLocale(null);
}
@Test
public void testDefaultNumberFormatting() {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("numberDefault", "3,339.12");
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("3,339", binder.getBindingResult().getFieldValue("numberDefault"));
}
@Test
public void testDefaultNumberFormattingAnnotated() {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("numberDefaultAnnotated", "3,339.12");
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("3,339.12", binder.getBindingResult().getFieldValue("numberDefaultAnnotated"));
}
@Test
public void testCurrencyFormatting() {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("currency", "$3,339.12");
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("$3,339.12", binder.getBindingResult().getFieldValue("currency"));
}
@Test
public void testPercentFormatting() {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("percent", "53%");
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("53%", binder.getBindingResult().getFieldValue("percent"));
}
@Test
public void testPatternFormatting() {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("pattern", "1,25.00");
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("1,25.00", binder.getBindingResult().getFieldValue("pattern"));
}
@Test
public void testPatternArrayFormatting() {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("patternArray", new String[] {"1,25.00", "2,35.00"});
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("1,25.00", binder.getBindingResult().getFieldValue("patternArray[0]"));
assertEquals("2,35.00", binder.getBindingResult().getFieldValue("patternArray[1]"));
propertyValues = new MutablePropertyValues();
propertyValues.add("patternArray[0]", "1,25.00");
propertyValues.add("patternArray[1]", "2,35.00");
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("1,25.00", binder.getBindingResult().getFieldValue("patternArray[0]"));
assertEquals("2,35.00", binder.getBindingResult().getFieldValue("patternArray[1]"));
}
@Test
public void testPatternListFormatting() {
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("patternList", new String[] {"1,25.00", "2,35.00"});
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("1,25.00", binder.getBindingResult().getFieldValue("patternList[0]"));
assertEquals("2,35.00", binder.getBindingResult().getFieldValue("patternList[1]"));
propertyValues = new MutablePropertyValues();
propertyValues.add("patternList[0]", "1,25.00");
propertyValues.add("patternList[1]", "2,35.00");
binder.bind(propertyValues);
assertEquals(0, binder.getBindingResult().getErrorCount());
assertEquals("1,25.00", binder.getBindingResult().getFieldValue("patternList[0]"));
assertEquals("2,35.00", binder.getBindingResult().getFieldValue("patternList[1]"));
}
@SuppressWarnings("unused")
private static class TestBean {
private Integer numberDefault;
@NumberFormat
private Double numberDefaultAnnotated;
@NumberFormat(style=Style.CURRENCY)
private BigDecimal currency;
@NumberFormat(style=Style.PERCENT)
private BigDecimal percent;
@NumberFormat(pattern="${pattern}")
private BigDecimal pattern;
@NumberFormat(pattern="#,##.00")
private BigDecimal[] patternArray;
@NumberFormat(pattern="#,##.00")
private List[] patternList;
public Integer getNumberDefault() {
return numberDefault;
}
public void setNumberDefault(Integer numberDefault) {
this.numberDefault = numberDefault;
}
public Double getNumberDefaultAnnotated() {
return numberDefaultAnnotated;
}
public void setNumberDefaultAnnotated(Double numberDefaultAnnotated) {
this.numberDefaultAnnotated = numberDefaultAnnotated;
}
public BigDecimal getCurrency() {
return currency;
}
public void setCurrency(BigDecimal currency) {
this.currency = currency;
}
public BigDecimal getPercent() {
return percent;
}
public void setPercent(BigDecimal percent) {
this.percent = percent;
}
public BigDecimal getPattern() {
return pattern;
}
public void setPattern(BigDecimal pattern) {
this.pattern = pattern;
}
public BigDecimal[] getPatternArray() {
return patternArray;
}
public void setPatternArray(BigDecimal[] patternArray) {
this.patternArray = patternArray;
}
public List[] getPatternList() {
return patternList;
}
public void setPatternList(List[] patternList) {
this.patternList = patternList;
}
}
}