JsonNodeNumberValueTest.java

package tools.jackson.databind.node;

import java.math.BigDecimal;
import java.math.BigInteger;

import org.junit.jupiter.api.Test;

import tools.jackson.databind.JsonNode;
import tools.jackson.databind.exc.JsonNodeException;
import tools.jackson.databind.testutil.DatabindTestUtil;
import tools.jackson.databind.util.RawValue;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

/**
 * Tests for [databind#4958], JsonNode.numberValue()
 * over all node types.
 */
public class JsonNodeNumberValueTest
    extends DatabindTestUtil
{
    private final JsonNodeFactory NODES = newJsonMapper().getNodeFactory();

    @Test
    public void numberValueFromNumbersInt()
    {
        assertEquals(Integer.valueOf(127), NODES.numberNode((byte) 127).numberValue());
        assertEquals(Short.valueOf((short) 123), NODES.numberNode((short) 123).numberValue());
        assertEquals(Integer.valueOf(234), NODES.numberNode(234).numberValue());
        assertEquals(Long.valueOf(3456L), NODES.numberNode(3456L).numberValue());
        assertEquals(BigInteger.TWO, NODES.numberNode(BigInteger.TWO).numberValue());
    }

    @Test
    public void numberValueFromNumbersFP()
    {
        assertEquals(Float.valueOf(0.25f), NODES.numberNode(0.25f).numberValue());
        assertEquals(Double.valueOf(-2.125d), NODES.numberNode(-2.125d).numberValue());
        assertEquals(new BigDecimal("0.1"), NODES.numberNode(new BigDecimal("0.1")).numberValue());
    }

    @Test
    public void numberValueFromNonNumberScalars()
    {
        _assertFailForNonNumber(NODES.booleanNode(true));
        _assertFailForNonNumber(NODES.binaryNode(new byte[3]));
        _assertFailForNonNumber(NODES.stringNode("123"));
        _assertFailForNonNumber(NODES.rawValueNode(new RawValue("abc")));
        _assertFailForNonNumber(NODES.pojoNode(Boolean.TRUE));
    }

    @Test
    public void numberValueFromStructural()
    {
        _assertFailForNonNumber(NODES.arrayNode(3));
        _assertFailForNonNumber(NODES.objectNode());
    }

    @Test
    public void numberValueFromNonNumberMisc()
    {
        _assertFailForNonNumber(NODES.nullNode());
        _assertFailForNonNumber(NODES.missingNode());
    }

    private void _assertFailForNonNumber(JsonNode node) {
        Exception e = assertThrows(JsonNodeException.class,
                () ->  node.intValue(),
                "For ("+node.getClass().getSimpleName()+") value: "+node);
        assertThat(e.getMessage())
            .contains("cannot convert value")
            .contains("value type not numeric");
    }
}