/* * Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org * Use is subject to license terms. See license.txt. */ package org.beanfabrics.model; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; import junit.framework.JUnit4TestAdapter; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author Michael Karneim */ public class BigDecimalPMTest { public static junit.framework.Test suite() { return new JUnit4TestAdapter(BigDecimalPMTest.class); } static Locale oldLocale; @Before public void setTemporaryDefaultLocale() { oldLocale = Locale.getDefault(); Locale.setDefault(Locale.US); } @After public void resetTemporaryDefaultLocale() { Locale.setDefault(oldLocale); } @Test public void create() { new BigDecimalPM(); } @Test public void canConvertTextIntoBigDecimal() { // Given: BigDecimalPM pm = new BigDecimalPM(); // When: pm.setText("1234.56"); // Then: BigDecimal bd = new BigDecimal("1234.56"); assertEquals("pm.getBigDecimal()", bd, pm.getBigDecimal()); } @Test public void alphanumericTextMustBeInvalid() { // Given: BigDecimalPM pm = new BigDecimalPM(); // When: pm.setText("1234abc"); // Then: assertEquals("pm.isValid()", false, pm.isValid()); } @Test public void reallyBigIntegerIsValid() { // Given: BigDecimalPM pm = new BigDecimalPM(); // When: pm.setText("9223372036854775809"); // Then: assertEquals("pm.isValid()", true, pm.isValid()); } @Test public void validationMessageIsLocalized() { // Given: Locale.setDefault(Locale.GERMAN); BigDecimalPM pm = new BigDecimalPM(); // When: pm.setText("blah"); // invalid text // Then: assertFalse("pm.isValid()", pm.isValid()); String message = pm.getValidationState().getMessage(); assertEquals("message", "Dies ist keine korrekte Zahl", message); } @Test public void canReformatTextUsingCustomFormat() { // Given: BigDecimalPM pm = new BigDecimalPM(); DecimalFormat format = new DecimalFormat("#.##"); pm.setFormat(new BigDecimalPM.Format(format)); // When: pm.setText("125.5678"); assertEquals("pm.getText()", "125.5678", pm.getText()); pm.reformat(); // Then: assertEquals("pm.isValid()", true, pm.isValid()); assertEquals("pm.getText()", "125.57", pm.getText()); } @Test public void settingAFormatDoesReformatText() { // Given: Locale.setDefault(Locale.GERMANY); BigDecimalPM pm = new BigDecimalPM(); DecimalFormat germanFormat = (DecimalFormat)NumberFormat.getNumberInstance(Locale.GERMANY); DecimalFormat usFormat = (DecimalFormat)NumberFormat.getNumberInstance(Locale.US); pm.setFormat(new BigDecimalPM.Format(germanFormat)); // When: pm.setText("1.234.567,89"); pm.setFormat(new BigDecimalPM.Format(usFormat)); // Then: assertEquals("1,234,567.89", pm.getText()); } @Test public void settingAFormatOnInvalidContentDoesNotReformatText() { // Given: Locale.setDefault(Locale.GERMANY); BigDecimalPM pm = new BigDecimalPM(); DecimalFormat germanFormat = (DecimalFormat)NumberFormat.getNumberInstance(Locale.GERMANY); DecimalFormat usFormat = (DecimalFormat)NumberFormat.getNumberInstance(Locale.US); pm.setFormat(new BigDecimalPM.Format(germanFormat)); // When: pm.setText("abcxyz"); pm.setFormat(new BigDecimalPM.Format(usFormat)); // Then: assertEquals("abcxyz", pm.getText()); } @Test public void canUsePercentSignInFormat() { // Given: BigDecimalPM pm = new BigDecimalPM(); pm.setFormat(new BigDecimalPM.Format(new DecimalFormat("#.##%"))); // When: pm.setBigDecimal(new BigDecimal("0.5123")); // Then: assertEquals("51.23%", pm.getText()); } @Test public void textWithoutPercentSignIsValid() { // Given: BigDecimalPM pm = new BigDecimalPM(); pm.setFormat(new BigDecimalPM.Format(new DecimalFormat("#.##%"))); String input = "10"; // When: pm.setText(input); // Then: assertEquals("pm.isValid()", true, pm.isValid()); } @Test public void reformattingANumberWithoutPercentageSignDoesMultiplyItWithMultiplier() { // Given: BigDecimalPM pm = new BigDecimalPM(); DecimalFormat percentFormat = new DecimalFormat("#.##%"); //percentFormat.setMultiplier(100); <- This is default pm.setFormat(new BigDecimalPM.Format(percentFormat)); // When: pm.setText("0.5123"); // Then: assertEquals("pm.isValid()", true, pm.isValid()); pm.reformat(); assertEquals("51.23%", pm.getText()); } @Test public void reformattingANumberWithPercentageSignDoesNotMultiplyItWithMultiplier() { // Given: BigDecimalPM pm = new BigDecimalPM(); DecimalFormat percentFormat = new DecimalFormat("#.##%"); //percentFormat.setMultiplier(100); <- This is default pm.setFormat(new BigDecimalPM.Format(percentFormat)); // When: pm.setText("51.23%"); // Then: assertEquals("pm.isValid()", true, pm.isValid()); pm.reformat(); assertEquals("51.23%", pm.getText()); } @Test public void testReformat_with_percent_sign_as_literal() { // Given: BigDecimalPM pm = new BigDecimalPM(); // pm.setFormat( new BigDecimalPM.Format(new DecimalFormat("#.##' %'"))); //pm.setFormat( new BigDecimalPM.Format(new DecimalFormat("#.## %"))); // When: pm.setText("1.23"); pm.reformat(); // Then: assertEquals("pm.getText()", "1.23 %", pm.getText()); } @Test public void testReformat_with_colon_as_literal() { // Given: BigDecimalPM pm = new BigDecimalPM(); //pm.setFormat( new BigDecimalPM.Format(new DecimalFormat(".0.00"))); pm.setFormat( new BigDecimalPM.Format(new DecimalFormat("'.'0.00"))); // When: pm.setText("1.23"); pm.reformat(); // Then: assertEquals("pm.getText()", ".1.23", pm.getText()); } }