blob: cdafa480acacb4662473232d2bd2de7fc9b75245 [file] [log] [blame]
package com.fasterxml.jackson.databind.node;
import java.math.BigDecimal;
import java.math.BigInteger;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* Basic tests for {@link JsonNode} implementations that
* contain numeric values.
*/
public class TestNumberNodes extends NodeTestBase
{
public void testShort()
{
ShortNode n = ShortNode.valueOf((short) 1);
assertStandardEquals(n);
assertTrue(0 != n.hashCode());
// assertEquals(JsonToken.VALUE_NUMBER_SHORT, n.asToken()); // TODO: fix when available
assertEquals(JsonParser.NumberType.INT, n.numberType());
assertEquals(1, n.intValue());
assertEquals(1L, n.longValue());
assertEquals(BigDecimal.ONE, n.decimalValue());
assertEquals(BigInteger.ONE, n.bigIntegerValue());
assertEquals("1", n.asText());
assertNodeNumbers(n, 1, 1.0);
assertTrue(ShortNode.valueOf((short) 0).canConvertToInt());
assertTrue(ShortNode.valueOf(Short.MAX_VALUE).canConvertToInt());
assertTrue(ShortNode.valueOf(Short.MIN_VALUE).canConvertToInt());
assertTrue(ShortNode.valueOf((short) 0).canConvertToLong());
assertTrue(ShortNode.valueOf(Short.MAX_VALUE).canConvertToLong());
assertTrue(ShortNode.valueOf(Short.MIN_VALUE).canConvertToLong());
}
public void testInt()
{
IntNode n = IntNode.valueOf(1);
assertStandardEquals(n);
assertTrue(0 != n.hashCode());
assertEquals(JsonToken.VALUE_NUMBER_INT, n.asToken());
assertEquals(JsonParser.NumberType.INT, n.numberType());
assertEquals(1, n.intValue());
assertEquals(1L, n.longValue());
assertEquals(BigDecimal.ONE, n.decimalValue());
assertEquals(BigInteger.ONE, n.bigIntegerValue());
assertEquals("1", n.asText());
assertNodeNumbers(n, 1, 1.0);
assertTrue(IntNode.valueOf(0).canConvertToInt());
assertTrue(IntNode.valueOf(Integer.MAX_VALUE).canConvertToInt());
assertTrue(IntNode.valueOf(Integer.MIN_VALUE).canConvertToInt());
assertTrue(IntNode.valueOf(0).canConvertToLong());
assertTrue(IntNode.valueOf(Integer.MAX_VALUE).canConvertToLong());
assertTrue(IntNode.valueOf(Integer.MIN_VALUE).canConvertToLong());
}
public void testLong()
{
LongNode n = LongNode.valueOf(1L);
assertStandardEquals(n);
assertTrue(0 != n.hashCode());
assertEquals(JsonToken.VALUE_NUMBER_INT, n.asToken());
assertEquals(JsonParser.NumberType.LONG, n.numberType());
assertEquals(1, n.intValue());
assertEquals(1L, n.longValue());
assertEquals(BigDecimal.ONE, n.decimalValue());
assertEquals(BigInteger.ONE, n.bigIntegerValue());
assertEquals("1", n.asText());
assertNodeNumbers(n, 1, 1.0);
// ok if contains small enough value
assertTrue(LongNode.valueOf(0).canConvertToInt());
assertTrue(LongNode.valueOf(Integer.MAX_VALUE).canConvertToInt());
assertTrue(LongNode.valueOf(Integer.MIN_VALUE).canConvertToInt());
// but not in other cases
assertFalse(LongNode.valueOf(1L + Integer.MAX_VALUE).canConvertToInt());
assertFalse(LongNode.valueOf(-1L + Integer.MIN_VALUE).canConvertToInt());
assertTrue(LongNode.valueOf(0L).canConvertToLong());
assertTrue(LongNode.valueOf(Long.MAX_VALUE).canConvertToLong());
assertTrue(LongNode.valueOf(Long.MIN_VALUE).canConvertToLong());
}
public void testDouble()
{
DoubleNode n = DoubleNode.valueOf(0.25);
assertStandardEquals(n);
assertTrue(0 != n.hashCode());
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, n.asToken());
assertEquals(JsonParser.NumberType.DOUBLE, n.numberType());
assertEquals(0, n.intValue());
assertEquals(0.25, n.doubleValue());
assertNotNull(n.decimalValue());
assertEquals(BigInteger.ZERO, n.bigIntegerValue());
assertEquals("0.25", n.asText());
// 1.6:
assertNodeNumbers(DoubleNode.valueOf(4.5), 4, 4.5);
assertTrue(DoubleNode.valueOf(0).canConvertToInt());
assertTrue(DoubleNode.valueOf(Integer.MAX_VALUE).canConvertToInt());
assertTrue(DoubleNode.valueOf(Integer.MIN_VALUE).canConvertToInt());
assertFalse(DoubleNode.valueOf(1L + Integer.MAX_VALUE).canConvertToInt());
assertFalse(DoubleNode.valueOf(-1L + Integer.MIN_VALUE).canConvertToInt());
assertTrue(DoubleNode.valueOf(0L).canConvertToLong());
assertTrue(DoubleNode.valueOf(Long.MAX_VALUE).canConvertToLong());
assertTrue(DoubleNode.valueOf(Long.MIN_VALUE).canConvertToLong());
}
// @since 2.2
public void testFloat()
{
FloatNode n = FloatNode.valueOf(0.25f);
assertStandardEquals(n);
assertTrue(0 != n.hashCode());
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, n.asToken());
assertEquals(JsonParser.NumberType.FLOAT, n.numberType());
assertEquals(0, n.intValue());
assertEquals(0.25, n.doubleValue());
assertEquals(0.25f, n.floatValue());
assertNotNull(n.decimalValue());
assertEquals(BigInteger.ZERO, n.bigIntegerValue());
assertEquals("0.25", n.asText());
// 1.6:
assertNodeNumbers(FloatNode.valueOf(4.5f), 4, 4.5f);
assertTrue(FloatNode.valueOf(0).canConvertToInt());
assertTrue(FloatNode.valueOf(Integer.MAX_VALUE).canConvertToInt());
assertTrue(FloatNode.valueOf(Integer.MIN_VALUE).canConvertToInt());
// rounding errors if we just add/sub 1... so:
assertFalse(FloatNode.valueOf(1000L + Integer.MAX_VALUE).canConvertToInt());
assertFalse(FloatNode.valueOf(-1000L + Integer.MIN_VALUE).canConvertToInt());
assertTrue(FloatNode.valueOf(0L).canConvertToLong());
assertTrue(FloatNode.valueOf(Integer.MAX_VALUE).canConvertToLong());
assertTrue(FloatNode.valueOf(Integer.MIN_VALUE).canConvertToLong());
}
public void testDecimalNode() throws Exception
{
DecimalNode n = DecimalNode.valueOf(BigDecimal.ONE);
assertStandardEquals(n);
assertTrue(n.equals(new DecimalNode(BigDecimal.ONE)));
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, n.asToken());
assertEquals(JsonParser.NumberType.BIG_DECIMAL, n.numberType());
assertTrue(n.isNumber());
assertFalse(n.isIntegralNumber());
assertTrue(n.isBigDecimal());
assertEquals(BigDecimal.ONE, n.numberValue());
assertEquals(1, n.intValue());
assertEquals(1L, n.longValue());
assertEquals(BigDecimal.ONE, n.decimalValue());
assertEquals("1", n.asText());
// 1.6:
assertNodeNumbers(n, 1, 1.0);
assertTrue(DecimalNode.valueOf(BigDecimal.ZERO).canConvertToInt());
assertTrue(DecimalNode.valueOf(BigDecimal.valueOf(Integer.MAX_VALUE)).canConvertToInt());
assertTrue(DecimalNode.valueOf(BigDecimal.valueOf(Integer.MIN_VALUE)).canConvertToInt());
assertFalse(DecimalNode.valueOf(BigDecimal.valueOf(1L + Integer.MAX_VALUE)).canConvertToInt());
assertFalse(DecimalNode.valueOf(BigDecimal.valueOf(-1L + Integer.MIN_VALUE)).canConvertToInt());
assertTrue(DecimalNode.valueOf(BigDecimal.ZERO).canConvertToLong());
assertTrue(DecimalNode.valueOf(BigDecimal.valueOf(Long.MAX_VALUE)).canConvertToLong());
assertTrue(DecimalNode.valueOf(BigDecimal.valueOf(Long.MIN_VALUE)).canConvertToLong());
}
public void testBigIntegerNode() throws Exception
{
BigIntegerNode n = BigIntegerNode.valueOf(BigInteger.ONE);
assertStandardEquals(n);
assertTrue(n.equals(new BigIntegerNode(BigInteger.ONE)));
assertEquals(JsonToken.VALUE_NUMBER_INT, n.asToken());
assertEquals(JsonParser.NumberType.BIG_INTEGER, n.numberType());
assertTrue(n.isNumber());
assertTrue(n.isIntegralNumber());
assertTrue(n.isBigInteger());
assertEquals(BigInteger.ONE, n.numberValue());
assertEquals(1, n.intValue());
assertEquals(1L, n.longValue());
assertEquals(BigInteger.ONE, n.bigIntegerValue());
assertEquals("1", n.asText());
// 1.6:
assertNodeNumbers(n, 1, 1.0);
BigInteger maxLong = BigInteger.valueOf(Long.MAX_VALUE);
n = BigIntegerNode.valueOf(maxLong);
assertEquals(Long.MAX_VALUE, n.longValue());
ObjectMapper mapper = new ObjectMapper();
JsonNode n2 = mapper.readTree(maxLong.toString());
assertEquals(Long.MAX_VALUE, n2.longValue());
// then over long limit:
BigInteger beyondLong = maxLong.shiftLeft(2); // 4x max long
n2 = mapper.readTree(beyondLong.toString());
assertEquals(beyondLong, n2.bigIntegerValue());
assertTrue(BigIntegerNode.valueOf(BigInteger.ZERO).canConvertToInt());
assertTrue(BigIntegerNode.valueOf(BigInteger.valueOf(Integer.MAX_VALUE)).canConvertToInt());
assertTrue(BigIntegerNode.valueOf(BigInteger.valueOf(Integer.MIN_VALUE)).canConvertToInt());
assertFalse(BigIntegerNode.valueOf(BigInteger.valueOf(1L + Integer.MAX_VALUE)).canConvertToInt());
assertFalse(BigIntegerNode.valueOf(BigInteger.valueOf(-1L + Integer.MIN_VALUE)).canConvertToInt());
assertTrue(BigIntegerNode.valueOf(BigInteger.ZERO).canConvertToLong());
assertTrue(BigIntegerNode.valueOf(BigInteger.valueOf(Long.MAX_VALUE)).canConvertToLong());
assertTrue(BigIntegerNode.valueOf(BigInteger.valueOf(Long.MIN_VALUE)).canConvertToLong());
}
}