blob: fc22d58cf1e0d26e06de0493a8e7f1f3adcac930 [file] [log] [blame]
/*
* 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 freemarker.core;
import static freemarker.core.ArithmeticEngine.*;
import static org.junit.Assert.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import org.hamcrest.Matchers;
import org.junit.Test;
public class ArithmeticEngineTest {
@Test
public void compareNumbersZeroTest() {
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(0, new BigDecimal("-0")));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(0.0, new BigDecimal("-0")));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(-0.0, new BigDecimal("+0")));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(-0.0, 0.0));
}
@Test
public void compareNumbersNoRoundingGlitchTest() {
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(1.1, new BigDecimal("1.1")));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(Double.MIN_VALUE, Math.nextUp(Double.MIN_VALUE)));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(
Double.MIN_VALUE, new BigDecimal("" + Math.nextUp(Double.MIN_VALUE))));
}
@Test
public void compareNumbersSameTypeTest() {
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(1, 2));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(1L, 2L));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers((short) 1, (short) 2));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers((byte) 1, (byte) 2));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(1.0, 2.0));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(1.0f, 2.0f));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(BigDecimal.ONE, BigDecimal.TEN));
}
@Test
public void compareNumbersScaleDoesNotMatterTest() {
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(1.0, new BigDecimal("1")));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(1.0, new BigDecimal("1.00")));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(1.0f, new BigDecimal("0.1E1")));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(1, new BigDecimal("1.0")));
}
@Test
public void compareNumbersInfinityTest() {
for (boolean isFloat : new boolean[] { false, true }) {
Number negInf = isFloat ? Float.NEGATIVE_INFINITY : Double.NEGATIVE_INFINITY;
Number posInf = isFloat ? Float.POSITIVE_INFINITY : Double.POSITIVE_INFINITY;
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(negInf, posInf));
assertEquals(1, BIGDECIMAL_ENGINE.compareNumbers(posInf, negInf));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(posInf, posInf));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(negInf, negInf));
Number otherNegInf = !isFloat ? Float.NEGATIVE_INFINITY : Double.NEGATIVE_INFINITY;
Number otherPosInf = !isFloat ? Float.POSITIVE_INFINITY : Double.POSITIVE_INFINITY;
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(negInf, otherPosInf));
assertEquals(1, BIGDECIMAL_ENGINE.compareNumbers(posInf, otherNegInf));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(posInf, otherPosInf));
assertEquals(0, BIGDECIMAL_ENGINE.compareNumbers(negInf, otherNegInf));
for (Number one : new Number[] {
BigDecimal.ONE, 1.0, 1f, 1, 1L, (byte) 1, (short) 1, BigInteger.ONE,
BigDecimal.ONE.negate(), -1.0, -1f, -1, -1L, (byte) -1, (short) -1, BigInteger.ONE.negate(),
BigDecimal.ZERO, 0.0, 0f, 0, 0L, (byte) 0, (short) 0, BigInteger.ZERO }) {
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(negInf, one));
assertEquals(1, BIGDECIMAL_ENGINE.compareNumbers(posInf, one));
assertEquals(1, BIGDECIMAL_ENGINE.compareNumbers(one, negInf));
assertEquals(-1, BIGDECIMAL_ENGINE.compareNumbers(one, posInf));
}
}
}
@Test
public void toNumberTest() {
for (ArithmeticEngine arithmeticEngine : new ArithmeticEngine[]{BIGDECIMAL_ENGINE, CONSERVATIVE_ENGINE}) {
assertEquals(Double.POSITIVE_INFINITY, arithmeticEngine.toNumber("INF"));
assertEquals(Double.NEGATIVE_INFINITY, arithmeticEngine.toNumber("-INF"));
assertEquals(Double.NEGATIVE_INFINITY, arithmeticEngine.toNumber("-Infinity"));
assertEquals(Double.POSITIVE_INFINITY, arithmeticEngine.toNumber("Infinity"));
Number nan = arithmeticEngine.toNumber("NaN");
assertThat(nan, Matchers.instanceOf(Double.class));
assertTrue(Double.isNaN((double) nan));
}
assertEquals(new BigDecimal("1234567"), BIGDECIMAL_ENGINE.toNumber("1234567"));
assertEquals(Integer.valueOf("1234567"), CONSERVATIVE_ENGINE.toNumber("1234567"));
assertEquals(new BigDecimal("12345678901234"), BIGDECIMAL_ENGINE.toNumber("12345678901234"));
assertEquals(12345678901234L, CONSERVATIVE_ENGINE.toNumber("12345678901234"));
assertEquals(new BigDecimal("12345678901234567890"), BIGDECIMAL_ENGINE.toNumber("12345678901234567890"));
assertEquals(new BigInteger("12345678901234567890"), CONSERVATIVE_ENGINE.toNumber("12345678901234567890"));
assertEquals(new BigDecimal("1.9"), BIGDECIMAL_ENGINE.toNumber("1.9"));
assertEquals(1.9, CONSERVATIVE_ENGINE.toNumber("1.9"));
assertEquals(new BigDecimal("0.9"), BIGDECIMAL_ENGINE.toNumber(".9"));
assertEquals(0.9, CONSERVATIVE_ENGINE.toNumber(".9"));
}
}