001/*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 *     http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014package org.gbif.utils.number;
015
016import java.math.BigDecimal;
017
018import org.junit.jupiter.api.Test;
019
020import static org.junit.jupiter.api.Assertions.assertEquals;
021import static org.junit.jupiter.api.Assertions.assertNotEquals;
022import static org.junit.jupiter.api.Assertions.assertThrows;
023
024/**
025 *
026 * Tests for BigDecimal utility class
027 *
028 */
029public class BigDecimalUtilsTest {
030
031  /**
032   * This test is simply to illustrate why we use the BigDecimal(String) constructor.
033   * new BigDecimal(23.1) equals 23.10000000000000142108547152020037174224853515625
034   */
035  @Test
036  public void testBigDecimalConstructor() {
037    assertNotEquals(new BigDecimal("23.1"), new BigDecimal(23.1d));
038  }
039
040  @Test
041  public void testBigDecimalConstructorNull() {
042    assertThrows(NullPointerException.class, () -> BigDecimalUtils.fromDouble(null, false));
043  }
044
045  /**
046   * This test is simply to show why we are not using BigDecimal stripTrailingZeros function.
047   */
048  @Test
049  public void demonstrateBigDecimalStripTrailingZerosEquality() {
050    assertNotEquals(new BigDecimal("500.0").stripTrailingZeros(), new BigDecimal("500"));
051
052    // but, compareTo function will work as expected
053    assertEquals(0, new BigDecimal("500").compareTo(new BigDecimal("500.0").stripTrailingZeros()));
054  }
055
056  @Test
057  public void testFromDouble() {
058    assertEquals(new BigDecimal("23.4"), BigDecimalUtils.fromDouble(23.4, true));
059    assertEquals(new BigDecimal("23.4"), BigDecimalUtils.fromDouble(23.4, false));
060
061    assertEquals(new BigDecimal("23"), BigDecimalUtils.fromDouble(23d, true));
062    assertEquals(new BigDecimal("23.0"), BigDecimalUtils.fromDouble(23d, false));
063
064    assertEquals(new BigDecimal("23"), BigDecimalUtils.fromDouble(23.0, true));
065    assertEquals(new BigDecimal("23.0"), BigDecimalUtils.fromDouble(23.0, false));
066
067    assertEquals(new BigDecimal("23"), BigDecimalUtils.fromDouble(23.0000000000, true));
068    assertEquals(new BigDecimal("23.0"), BigDecimalUtils.fromDouble(23.0000000000, false));
069
070    assertEquals(
071        new BigDecimal("23.000000000001"), BigDecimalUtils.fromDouble(23.000000000001, true));
072    assertEquals(
073        new BigDecimal("23.000000000001"), BigDecimalUtils.fromDouble(23.000000000001, false));
074
075    assertEquals(new BigDecimal("500"), BigDecimalUtils.fromDouble(500d, true));
076    assertEquals(new BigDecimal("500.0"), BigDecimalUtils.fromDouble(500d, false));
077
078    assertEquals(new BigDecimal("50000"), BigDecimalUtils.fromDouble(50000d, true));
079    assertEquals(new BigDecimal("50000.0"), BigDecimalUtils.fromDouble(50000d, false));
080
081    assertEquals(new BigDecimal("50000.01"), BigDecimalUtils.fromDouble(50000.01, true));
082    assertEquals(new BigDecimal("50000.01"), BigDecimalUtils.fromDouble(50000.01, false));
083  }
084}