| /* |
| * 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.ext.beans; |
| |
| import java.math.BigDecimal; |
| import java.math.BigInteger; |
| |
| import org.junit.internal.runners.JUnit38ClassRunner; |
| import org.junit.runner.RunWith; |
| |
| import junit.framework.TestCase; |
| |
| @SuppressWarnings("boxing") |
| @RunWith(JUnit38ClassRunner.class) |
| public class OverloadedNumberUtilTest extends TestCase { |
| |
| public OverloadedNumberUtilTest(String name) { |
| super(name); |
| } |
| |
| public void testIntegerCoercions() { |
| cipEqu(Byte.valueOf(Byte.MAX_VALUE)); |
| cipEqu(Byte.valueOf((byte) 0)); |
| cipEqu(Byte.valueOf(Byte.MIN_VALUE)); |
| |
| cipEqu(Short.valueOf(Byte.MAX_VALUE), |
| new OverloadedNumberUtil.ShortOrByte((short) Byte.MAX_VALUE, Byte.MAX_VALUE)); |
| cipEqu(Short.valueOf((short) 0), |
| new OverloadedNumberUtil.ShortOrByte((short) 0, (byte) 0)); |
| cipEqu(Short.valueOf(Byte.MIN_VALUE), |
| new OverloadedNumberUtil.ShortOrByte((short) Byte.MIN_VALUE, Byte.MIN_VALUE)); |
| |
| cipEqu(Short.valueOf((short) (Byte.MAX_VALUE + 1))); |
| cipEqu(Short.valueOf((short) (Byte.MIN_VALUE - 1))); |
| cipEqu(Short.valueOf(Short.MAX_VALUE)); |
| cipEqu(Short.valueOf(Short.MIN_VALUE)); |
| |
| cipEqu(Integer.valueOf(Byte.MAX_VALUE), |
| new OverloadedNumberUtil.IntegerOrByte((int) Byte.MAX_VALUE, Byte.MAX_VALUE)); |
| cipEqu(Integer.valueOf(0), |
| new OverloadedNumberUtil.IntegerOrByte(0, (byte) 0)); |
| cipEqu(Integer.valueOf(Byte.MIN_VALUE), |
| new OverloadedNumberUtil.IntegerOrByte((int) Byte.MIN_VALUE, Byte.MIN_VALUE)); |
| |
| cipEqu(Integer.valueOf(Byte.MAX_VALUE + 1), |
| new OverloadedNumberUtil.IntegerOrShort(Byte.MAX_VALUE + 1, (short) (Byte.MAX_VALUE + 1))); |
| cipEqu(Integer.valueOf(Byte.MIN_VALUE - 1), |
| new OverloadedNumberUtil.IntegerOrShort(Byte.MIN_VALUE - 1, (short) (Byte.MIN_VALUE - 1))); |
| cipEqu(Integer.valueOf(Short.MAX_VALUE), |
| new OverloadedNumberUtil.IntegerOrShort((int) Short.MAX_VALUE, Short.MAX_VALUE)); |
| cipEqu(Integer.valueOf(Short.MIN_VALUE), |
| new OverloadedNumberUtil.IntegerOrShort((int) Short.MIN_VALUE, Short.MIN_VALUE)); |
| |
| cipEqu(Integer.valueOf(Short.MAX_VALUE + 1)); |
| cipEqu(Integer.valueOf(Short.MIN_VALUE - 1)); |
| cipEqu(Integer.valueOf(Integer.MAX_VALUE)); |
| cipEqu(Integer.valueOf(Integer.MIN_VALUE)); |
| |
| cipEqu(Long.valueOf(Byte.MAX_VALUE), |
| new OverloadedNumberUtil.LongOrByte((long) Byte.MAX_VALUE, Byte.MAX_VALUE)); |
| cipEqu(Long.valueOf(0), |
| new OverloadedNumberUtil.LongOrByte((long) 0, (byte) 0)); |
| cipEqu(Long.valueOf(Byte.MIN_VALUE), |
| new OverloadedNumberUtil.LongOrByte((long) Byte.MIN_VALUE, Byte.MIN_VALUE)); |
| |
| cipEqu(Long.valueOf(Byte.MAX_VALUE + 1), |
| new OverloadedNumberUtil.LongOrShort((long) (Byte.MAX_VALUE + 1), (short) (Byte.MAX_VALUE + 1))); |
| cipEqu(Long.valueOf(Byte.MIN_VALUE - 1), |
| new OverloadedNumberUtil.LongOrShort((long) (Byte.MIN_VALUE - 1), (short) (Byte.MIN_VALUE - 1))); |
| cipEqu(Long.valueOf(Short.MAX_VALUE), |
| new OverloadedNumberUtil.LongOrShort((long) Short.MAX_VALUE, Short.MAX_VALUE)); |
| cipEqu(Long.valueOf(Short.MIN_VALUE), |
| new OverloadedNumberUtil.LongOrShort((long) Short.MIN_VALUE, Short.MIN_VALUE)); |
| |
| cipEqu(Long.valueOf(Short.MAX_VALUE + 1), |
| new OverloadedNumberUtil.LongOrInteger((long) Short.MAX_VALUE + 1, Short.MAX_VALUE + 1)); |
| cipEqu(Long.valueOf(Short.MIN_VALUE - 1), |
| new OverloadedNumberUtil.LongOrInteger((long) Short.MIN_VALUE - 1, Short.MIN_VALUE - 1)); |
| cipEqu(Long.valueOf(Integer.MAX_VALUE), |
| new OverloadedNumberUtil.LongOrInteger((long) Integer.MAX_VALUE, Integer.MAX_VALUE)); |
| cipEqu(Long.valueOf(Integer.MIN_VALUE), |
| new OverloadedNumberUtil.LongOrInteger((long) Integer.MIN_VALUE, Integer.MIN_VALUE)); |
| |
| cipEqu(Long.valueOf(Integer.MAX_VALUE + 1L)); |
| cipEqu(Long.valueOf(Integer.MIN_VALUE - 1L)); |
| cipEqu(Long.valueOf(Long.MAX_VALUE)); |
| cipEqu(Long.valueOf(Long.MIN_VALUE)); |
| } |
| |
| public void testIntegerNoCoercions() { |
| cipEqu(Integer.valueOf(Byte.MAX_VALUE), Integer.valueOf(Byte.MAX_VALUE), 0); |
| cipEqu(Integer.valueOf(0), Integer.valueOf(0), 0); |
| cipEqu(Integer.valueOf(Byte.MIN_VALUE), Integer.valueOf(Byte.MIN_VALUE), 0); |
| } |
| |
| public void testIntegerLimitedCoercions() { |
| cipEqu(Integer.valueOf(Byte.MAX_VALUE), Integer.valueOf(Byte.MAX_VALUE), TypeFlags.INTEGER); |
| cipEqu(Integer.valueOf(0), Integer.valueOf(0), TypeFlags.INTEGER); |
| cipEqu(Integer.valueOf(Byte.MIN_VALUE), Integer.valueOf(Byte.MIN_VALUE), TypeFlags.INTEGER); |
| |
| cipEqu(Long.valueOf(Integer.MAX_VALUE + 1L), Long.valueOf(Integer.MAX_VALUE + 1L), TypeFlags.INTEGER); |
| |
| for (int n = -1; n < 2; n++) { |
| final Long longN = Long.valueOf(n); |
| cipEqu(longN, new OverloadedNumberUtil.LongOrInteger(longN, n), TypeFlags.INTEGER); |
| cipEqu(longN, new OverloadedNumberUtil.LongOrShort(longN, (short) n), TypeFlags.SHORT); |
| cipEqu(longN, new OverloadedNumberUtil.LongOrByte(longN, (byte) n), TypeFlags.BYTE); |
| cipEqu(longN, new OverloadedNumberUtil.LongOrShort(longN, (short) n), |
| TypeFlags.SHORT | TypeFlags.INTEGER); |
| } |
| } |
| |
| public void testBigDecimalCoercions() { |
| cipEqu(new BigDecimal(123), new OverloadedNumberUtil.IntegerBigDecimal(new BigDecimal(123))); |
| cipEqu(new BigDecimal(123), new OverloadedNumberUtil.IntegerBigDecimal(new BigDecimal(123)), |
| TypeFlags.DOUBLE | TypeFlags.INTEGER); |
| cipEqu(new BigDecimal(123), TypeFlags.INTEGER); |
| cipEqu(new BigDecimal(123), TypeFlags.INTEGER | TypeFlags.LONG); |
| cipEqu(new BigDecimal(123), TypeFlags.DOUBLE); |
| cipEqu(new BigDecimal(123), TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| |
| cipEqu(new BigDecimal(123.5)); |
| // Not wasting time with check if it's a whole number if we only have integer-only or non-integer-only targets: |
| cipEqu(new BigDecimal(123.5), TypeFlags.INTEGER | TypeFlags.LONG); |
| cipEqu(new BigDecimal(123.5), TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| |
| cipEqu(new BigDecimal("0.01")); |
| cipEqu(new BigDecimal("-0.01")); |
| cipEqu(BigDecimal.ZERO, new OverloadedNumberUtil.IntegerBigDecimal(BigDecimal.ZERO)); |
| } |
| |
| public void testUnknownNumberCoercion() { |
| cipEqu(new RationalNumber(2, 3)); |
| } |
| |
| @SuppressWarnings("boxing") |
| public void testDoubleCoercion() { |
| cipEqu(Double.valueOf(1.5), new OverloadedNumberUtil.DoubleOrFloat(1.5)); |
| cipEqu(Double.valueOf(-0.125), new OverloadedNumberUtil.DoubleOrFloat(-0.125)); |
| cipEqu(Double.valueOf(Float.MAX_VALUE), new OverloadedNumberUtil.DoubleOrFloat((double) Float.MAX_VALUE)); |
| cipEqu(Double.valueOf(-Float.MAX_VALUE), new OverloadedNumberUtil.DoubleOrFloat((double) -Float.MAX_VALUE)); |
| cipEqu(Double.valueOf(Float.MAX_VALUE * 10.0)); |
| cipEqu(Double.valueOf(-Float.MAX_VALUE * 10.0)); |
| |
| cipEqu(Double.valueOf(0), new OverloadedNumberUtil.DoubleOrByte(0.0, (byte) 0)); |
| cipEqu(Double.valueOf(Byte.MAX_VALUE), new OverloadedNumberUtil.DoubleOrByte((double) Byte.MAX_VALUE, Byte.MAX_VALUE)); |
| cipEqu(Double.valueOf(Byte.MIN_VALUE), new OverloadedNumberUtil.DoubleOrByte((double) Byte.MIN_VALUE, Byte.MIN_VALUE)); |
| |
| cipEqu(Double.valueOf(Byte.MAX_VALUE + 1), new OverloadedNumberUtil.DoubleOrShort((double) |
| (Byte.MAX_VALUE + 1), (short) (Byte.MAX_VALUE + 1))); |
| cipEqu(Double.valueOf(Byte.MIN_VALUE - 1), new OverloadedNumberUtil.DoubleOrShort((double) |
| (Byte.MIN_VALUE - 1), (short) (Byte.MIN_VALUE - 1))); |
| |
| cipEqu(Double.valueOf(Short.MAX_VALUE + 1), |
| new OverloadedNumberUtil.DoubleOrIntegerOrFloat((double) Short.MAX_VALUE + 1, Short.MAX_VALUE + 1)); |
| cipEqu(Double.valueOf(Short.MIN_VALUE - 1), |
| new OverloadedNumberUtil.DoubleOrIntegerOrFloat((double) Short.MIN_VALUE - 1, Short.MIN_VALUE - 1)); |
| cipEqu(Double.valueOf(16777216), new OverloadedNumberUtil.DoubleOrIntegerOrFloat(16777216.0, 16777216)); |
| cipEqu(Double.valueOf(-16777216), new OverloadedNumberUtil.DoubleOrIntegerOrFloat(-16777216.0, -16777216)); |
| |
| cipEqu(Double.valueOf(Integer.MAX_VALUE), |
| new OverloadedNumberUtil.DoubleOrInteger((double) Integer.MAX_VALUE, Integer.MAX_VALUE)); |
| cipEqu(Double.valueOf(Integer.MIN_VALUE), |
| new OverloadedNumberUtil.DoubleOrInteger((double) Integer.MIN_VALUE, Integer.MIN_VALUE)); |
| |
| cipEqu(Double.valueOf(Integer.MAX_VALUE + 1L), |
| new OverloadedNumberUtil.DoubleOrLong(Double.valueOf(Integer.MAX_VALUE + 1L), Integer.MAX_VALUE + 1L)); |
| cipEqu(Double.valueOf(Integer.MIN_VALUE - 1L), |
| new OverloadedNumberUtil.DoubleOrLong(Double.valueOf(Integer.MIN_VALUE - 1L), Integer.MIN_VALUE - 1L)); |
| cipEqu(Double.valueOf(Long.MAX_VALUE), |
| new OverloadedNumberUtil.DoubleOrFloat((double) Long.MAX_VALUE)); |
| cipEqu(Double.valueOf(Long.MIN_VALUE), |
| new OverloadedNumberUtil.DoubleOrFloat((double) Long.MIN_VALUE)); |
| |
| // When only certain target types are present: |
| cipEqu(Double.valueOf(5), new OverloadedNumberUtil.DoubleOrByte(5.0, (byte) 5), TypeFlags.BYTE); |
| cipEqu(Double.valueOf(5), new OverloadedNumberUtil.DoubleOrByte(5.0, (byte) 5), TypeFlags.BYTE | TypeFlags.SHORT); |
| cipEqu(Double.valueOf(-129), TypeFlags.BYTE); |
| cipEqu(Double.valueOf(5), new OverloadedNumberUtil.DoubleOrShort(5.0, (short) 5), TypeFlags.SHORT); |
| cipEqu(Double.valueOf(5), new OverloadedNumberUtil.DoubleOrInteger(5.0, 5), TypeFlags.INTEGER); |
| cipEqu(Double.valueOf(5), new OverloadedNumberUtil.DoubleOrLong(5.0, 5), TypeFlags.LONG); |
| cipEqu(Double.valueOf(5), new OverloadedNumberUtil.DoubleOrFloat(5.0), TypeFlags.FLOAT); |
| cipEqu(Double.valueOf(5), Double.valueOf(5), TypeFlags.DOUBLE); |
| cipEqu(Double.valueOf(5), new OverloadedNumberUtil.DoubleOrFloat(5.0), |
| TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(Double.valueOf(5.9), new OverloadedNumberUtil.DoubleOrFloat(5.9), |
| TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(Double.valueOf(5.9), |
| TypeFlags.DOUBLE | TypeFlags.INTEGER); |
| cipEqu(Double.valueOf(5.9), new OverloadedNumberUtil.DoubleOrFloat(5.9), |
| TypeFlags.FLOAT | TypeFlags.INTEGER); |
| cipEqu(Double.valueOf(5.9), TypeFlags.INTEGER); |
| cipEqu(Double.valueOf(Long.MAX_VALUE), |
| new OverloadedNumberUtil.DoubleOrFloat((double) Long.MAX_VALUE), |
| TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(Double.valueOf(Long.MAX_VALUE), |
| TypeFlags.DOUBLE | TypeFlags.LONG); |
| cipEqu(Double.valueOf(Long.MIN_VALUE), |
| new OverloadedNumberUtil.DoubleOrFloat((double) Long.MIN_VALUE), |
| TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(Double.valueOf(Float.MAX_VALUE * 10), |
| TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(Double.valueOf(-Float.MAX_VALUE * 10), |
| TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| |
| // Rounded values: |
| cipEqu(Double.valueOf(0.0000009), |
| new OverloadedNumberUtil.DoubleOrByte(0.0000009, (byte) 0)); |
| cipEqu(Double.valueOf(-0.0000009), |
| new OverloadedNumberUtil.DoubleOrByte(-0.0000009, (byte) 0)); |
| cipEqu(Double.valueOf(0.9999991), |
| new OverloadedNumberUtil.DoubleOrByte(0.9999991, (byte) 1)); |
| cipEqu(Double.valueOf(-0.9999991), |
| new OverloadedNumberUtil.DoubleOrByte(-0.9999991, (byte) -1)); |
| cipEqu(Double.valueOf(0.0000009), |
| new OverloadedNumberUtil.DoubleOrShort(0.0000009, (short) 0), |
| TypeFlags.SHORT | TypeFlags.DOUBLE); |
| cipEqu(Double.valueOf(0.0000009), new OverloadedNumberUtil.DoubleOrInteger(0.0000009, 0), |
| TypeFlags.INTEGER | TypeFlags.DOUBLE); |
| cipEqu(Double.valueOf(0.0000009), new OverloadedNumberUtil.DoubleOrLong(0.0000009, 0), |
| TypeFlags.LONG | TypeFlags.DOUBLE); |
| cipEqu(Double.valueOf(0.0000009), |
| new OverloadedNumberUtil.DoubleOrByte(0.0000009, (byte) 0), TypeFlags.BYTE); |
| cipEqu(Double.valueOf(0.0000009), |
| new OverloadedNumberUtil.DoubleOrShort(0.0000009, (short) 0), TypeFlags.SHORT); |
| cipEqu(Double.valueOf(0.0000009), |
| new OverloadedNumberUtil.DoubleOrInteger(0.0000009, 0), TypeFlags.INTEGER); |
| cipEqu(Double.valueOf(0.0000009), |
| new OverloadedNumberUtil.DoubleOrLong(0.0000009, 0L), TypeFlags.LONG); |
| cipEqu(Double.valueOf(0.9999999), |
| new OverloadedNumberUtil.DoubleOrInteger(0.9999999, 1), TypeFlags.INTEGER); |
| cipEqu(Double.valueOf(Byte.MAX_VALUE + 0.9e-6), |
| new OverloadedNumberUtil.DoubleOrByte(Byte.MAX_VALUE + 0.9e-6, Byte.MAX_VALUE)); |
| cipEqu(Double.valueOf(Byte.MIN_VALUE - 0.9e-6), |
| new OverloadedNumberUtil.DoubleOrByte(Byte.MIN_VALUE - 0.9e-6, Byte.MIN_VALUE)); |
| cipEqu(Double.valueOf(Byte.MAX_VALUE + 1.1e-6), |
| new OverloadedNumberUtil.DoubleOrFloat(Byte.MAX_VALUE + 1.1e-6)); |
| cipEqu(Double.valueOf(Byte.MIN_VALUE - 1.1e-6), |
| new OverloadedNumberUtil.DoubleOrFloat(Byte.MIN_VALUE - 1.1e-6)); |
| cipEqu(Double.valueOf(Byte.MAX_VALUE + 0.9999991), |
| new OverloadedNumberUtil.DoubleOrShort( |
| Byte.MAX_VALUE + 0.9999991, (short) (Byte.MAX_VALUE + 1))); |
| cipEqu(Double.valueOf(Byte.MIN_VALUE - 0.9999991), |
| new OverloadedNumberUtil.DoubleOrShort( |
| Byte.MIN_VALUE - 0.9999991, (short) (Byte.MIN_VALUE - 1))); |
| |
| cipEqu(Double.valueOf(Byte.MAX_VALUE + 1), new OverloadedNumberUtil.DoubleOrShort((double) |
| (Byte.MAX_VALUE + 1), (short) (Byte.MAX_VALUE + 1))); |
| cipEqu(Double.valueOf(Byte.MIN_VALUE - 1), new OverloadedNumberUtil.DoubleOrShort((double) |
| (Byte.MIN_VALUE - 1), (short) (Byte.MIN_VALUE - 1))); |
| |
| cipEqu(Short.MAX_VALUE + 0.9999991, |
| new OverloadedNumberUtil.DoubleOrIntegerOrFloat(Short.MAX_VALUE + 0.9999991, Short.MAX_VALUE + 1)); |
| cipEqu(Short.MIN_VALUE - 0.9999991, |
| new OverloadedNumberUtil.DoubleOrIntegerOrFloat(Short.MIN_VALUE - 0.9999991, Short.MIN_VALUE - 1)); |
| cipEqu(16777216 + 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrIntegerOrFloat(16777216 + 0.9e-6, 16777216)); |
| cipEqu(-16777216 - 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrIntegerOrFloat(-16777216 - 0.9e-6, -16777216)); |
| |
| cipEqu(Integer.MAX_VALUE + 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrInteger(Integer.MAX_VALUE + 0.9e-6, Integer.MAX_VALUE)); |
| cipEqu(Integer.MIN_VALUE - 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrInteger(Integer.MIN_VALUE - 0.9e-6, Integer.MIN_VALUE)); |
| |
| cipEqu(Integer.MAX_VALUE + 1L + 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrFloat(Integer.MAX_VALUE + 1L + 0.9e-6)); |
| cipEqu(Integer.MIN_VALUE - 1L - 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrFloat(Integer.MIN_VALUE - 1L - 0.9e-6)); |
| cipEqu(Long.MAX_VALUE + 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrFloat(Long.MAX_VALUE + 0.9e-6)); |
| cipEqu(Long.MIN_VALUE - 0.9e-6, |
| new OverloadedNumberUtil.DoubleOrFloat(Long.MIN_VALUE - 0.9e-6)); |
| } |
| |
| @SuppressWarnings("boxing") |
| public void testFloatCoercion() { |
| cipEqu(1.00002f); |
| cipEqu(-1.00002f); |
| cipEqu(1.999989f); |
| cipEqu(-1.999989f); |
| cipEqu(16777218f); |
| cipEqu(-16777218f); |
| |
| cipEqu(1f, new OverloadedNumberUtil.FloatOrByte(1f, (byte) 1)); |
| cipEqu(-1f, new OverloadedNumberUtil.FloatOrByte(-1f, (byte) -1)); |
| cipEqu(1.000009f, new OverloadedNumberUtil.FloatOrByte(1.000009f, (byte) 1)); |
| cipEqu(-1.000009f, new OverloadedNumberUtil.FloatOrByte(-1.000009f, (byte) -1)); |
| cipEqu(1.999991f, new OverloadedNumberUtil.FloatOrByte(1.999991f, (byte) 2)); |
| cipEqu(-1.999991f, new OverloadedNumberUtil.FloatOrByte(-1.999991f, (byte) -2)); |
| |
| cipEqu(1000f, new OverloadedNumberUtil.FloatOrShort(1000f, (short) 1000)); |
| cipEqu(-1000f, new OverloadedNumberUtil.FloatOrShort(-1000f, (short) -1000)); |
| cipEqu(1000.00006f); |
| |
| cipEqu(60000f, new OverloadedNumberUtil.FloatOrInteger(60000f, 60000)); |
| cipEqu(-60000f, new OverloadedNumberUtil.FloatOrInteger(-60000f, -60000)); |
| cipEqu(60000.004f); |
| |
| cipEqu(100f, new OverloadedNumberUtil.FloatOrByte(100f, (byte) 100), TypeFlags.MASK_KNOWN_INTEGERS); |
| cipEqu(1000f, new OverloadedNumberUtil.FloatOrShort(1000f, (short) 1000), TypeFlags.MASK_KNOWN_INTEGERS); |
| cipEqu(60000f, new OverloadedNumberUtil.FloatOrInteger(60000f, 60000), TypeFlags.MASK_KNOWN_INTEGERS); |
| cipEqu(60000f, new OverloadedNumberUtil.FloatOrInteger(60000f, 60000), TypeFlags.LONG); |
| cipEqu((float) Integer.MAX_VALUE, (float) Integer.MAX_VALUE, TypeFlags.LONG); |
| cipEqu((float) -Integer.MAX_VALUE, (float) -Integer.MAX_VALUE); |
| |
| cipEqu(0.5f, 0.5f, TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(0.5f, 0.5f, TypeFlags.DOUBLE); |
| } |
| |
| public void testBigIntegerCoercion() { |
| BigInteger bi; |
| |
| cipEqu(BigInteger.ZERO, new OverloadedNumberUtil.BigIntegerOrByte(BigInteger.ZERO)); |
| bi = new BigInteger(String.valueOf(Byte.MAX_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrByte(bi)); |
| bi = new BigInteger(String.valueOf(Byte.MIN_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrByte(bi)); |
| |
| bi = new BigInteger(String.valueOf(Byte.MAX_VALUE + 1)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrShort(bi)); |
| bi = new BigInteger(String.valueOf(Byte.MIN_VALUE - 1)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrShort(bi)); |
| bi = new BigInteger(String.valueOf(Short.MAX_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrShort(bi)); |
| bi = new BigInteger(String.valueOf(Short.MIN_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrShort(bi)); |
| |
| bi = new BigInteger(String.valueOf(Short.MAX_VALUE + 1)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrInteger(bi)); |
| bi = new BigInteger(String.valueOf(Short.MIN_VALUE - 1)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrInteger(bi)); |
| bi = new BigInteger(String.valueOf(Integer.MAX_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrInteger(bi)); |
| bi = new BigInteger(String.valueOf(Integer.MIN_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrInteger(bi)); |
| |
| bi = new BigInteger(String.valueOf(Integer.MAX_VALUE + 1L)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrLong(bi)); |
| bi = new BigInteger(String.valueOf(Integer.MIN_VALUE - 1L)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrLong(bi)); |
| bi = new BigInteger(String.valueOf(Long.MAX_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrLong(bi)); |
| bi = new BigInteger(String.valueOf(Long.MIN_VALUE)); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrLong(bi)); |
| |
| cipEqu(new BigInteger(String.valueOf(Long.MAX_VALUE)).add(BigInteger.ONE)); |
| cipEqu(new BigInteger(String.valueOf(Long.MIN_VALUE)).subtract(BigInteger.ONE)); |
| |
| bi = new BigInteger("0"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrFloat(bi), |
| TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrFloat(bi), |
| TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrFloat(bi), |
| TypeFlags.FLOAT); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), |
| TypeFlags.DOUBLE); |
| |
| bi = new BigInteger("16777215"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrFloat(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| bi = new BigInteger("-16777215"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrFloat(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| |
| bi = new BigInteger("16777216"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrFloat(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| bi = new BigInteger("-16777216"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrFloat(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| |
| bi = new BigInteger("16777217"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, TypeFlags.FLOAT); |
| bi = new BigInteger("-16777217"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, TypeFlags.FLOAT); |
| |
| bi = new BigInteger("9007199254740991"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.DOUBLE); |
| bi = new BigInteger("-9007199254740991"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.DOUBLE); |
| |
| bi = new BigInteger("9007199254740992"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.DOUBLE); |
| bi = new BigInteger("-9007199254740992"); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, new OverloadedNumberUtil.BigIntegerOrDouble(bi), TypeFlags.DOUBLE); |
| |
| bi = new BigInteger("9007199254740993"); |
| cipEqu(bi, TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(bi, TypeFlags.FLOAT); |
| cipEqu(bi, TypeFlags.DOUBLE); |
| bi = new BigInteger("-9007199254740993"); |
| cipEqu(bi, TypeFlags.MASK_KNOWN_NONINTEGERS); |
| cipEqu(bi, TypeFlags.DOUBLE | TypeFlags.FLOAT); |
| cipEqu(bi, TypeFlags.FLOAT); |
| cipEqu(bi, TypeFlags.DOUBLE); |
| |
| bi = new BigInteger("9007199254740994"); |
| cipEqu(bi, TypeFlags.MASK_KNOWN_NONINTEGERS); |
| bi = new BigInteger("-9007199254740994"); |
| cipEqu(bi, TypeFlags.MASK_KNOWN_NONINTEGERS); |
| } |
| |
| private void cipEqu(Number actualAndExpected) { |
| cipEqu(actualAndExpected, actualAndExpected, -1); |
| } |
| |
| private void cipEqu(Number actual, Number expected) { |
| cipEqu(actual, expected, -1); |
| } |
| |
| private void cipEqu(Number actualAndExpected, int flags) { |
| cipEqu(actualAndExpected, actualAndExpected, flags); |
| } |
| |
| @SuppressWarnings("boxing") |
| private void cipEqu(Number actual, Number expected, int flags) { |
| Number res = OverloadedNumberUtil.addFallbackType(actual, flags); |
| assertEquals(expected.getClass(), res.getClass()); |
| assertEquals(expected, res); |
| |
| // Some number types wrap the number with multiple types and equals() only compares one of them. So we try to |
| // catch any inconsistency: |
| assertEquals(expected.byteValue(), res.byteValue()); |
| assertEquals(expected.shortValue(), res.shortValue()); |
| assertEquals(expected.intValue(), res.intValue()); |
| assertEquals(expected.longValue(), res.longValue()); |
| assertEquals(expected.floatValue(), res.floatValue()); |
| assertEquals(expected.doubleValue(), res.doubleValue()); |
| } |
| |
| public void testGetArgumentConversionPrice() { |
| // Unknown number types: |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| RationalNumber.class, Integer.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, RationalNumber.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| RationalNumber.class, Float.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| Float.class, RationalNumber.class)); |
| assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice( |
| RationalNumber.class, RationalNumber.class)); |
| |
| // Fully check some rows (not all of them; the code is generated anyways): |
| |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, Byte.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, Short.class)); |
| assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, Integer.class)); |
| assertEquals(10004, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, Long.class)); |
| assertEquals(10005, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, BigInteger.class)); |
| assertEquals(30006, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, Float.class)); |
| assertEquals(20007, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, Double.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, BigDecimal.class)); |
| |
| assertEquals(45001, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, Byte.class)); |
| assertEquals(44002, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, Short.class)); |
| assertEquals(41003, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, Integer.class)); |
| assertEquals(41004, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, Long.class)); |
| assertEquals(40005, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, BigInteger.class)); |
| assertEquals(33006, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, Float.class)); |
| assertEquals(32007, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, Double.class)); |
| assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, BigDecimal.class)); |
| |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, Byte.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, Short.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, Integer.class)); |
| assertEquals(21004, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, Long.class)); |
| assertEquals(21005, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, BigInteger.class)); |
| assertEquals(40006, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, Float.class)); |
| assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, Double.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, BigDecimal.class)); |
| |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, Byte.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, Short.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, Integer.class)); |
| assertEquals(Integer.MAX_VALUE, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, Long.class)); |
| assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, BigInteger.class)); |
| assertEquals(40006, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, Float.class)); |
| assertEquals(20007, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, Double.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, BigDecimal.class)); |
| |
| // Check if all fromC is present: |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| Byte.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| Short.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| Integer.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| Long.class, BigDecimal.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigInteger.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| Float.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| Double.class, BigDecimal.class)); |
| assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice( |
| BigDecimal.class, BigDecimal.class)); |
| assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.IntegerBigDecimal.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrFloat.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.FloatOrByte.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrShort.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.FloatOrByte.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.FloatOrShort.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.FloatOrInteger.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrByte.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrIntegerOrFloat.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrInteger.class, BigDecimal.class)); |
| assertEquals(20008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.DoubleOrLong.class, BigDecimal.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrByte.class, BigDecimal.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrShort.class, BigDecimal.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrInteger.class, BigDecimal.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrLong.class, BigDecimal.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrFloat.class, BigDecimal.class)); |
| assertEquals(10008, OverloadedNumberUtil.getArgumentConversionPrice( |
| OverloadedNumberUtil.BigIntegerOrDouble.class, BigDecimal.class)); |
| } |
| |
| } |