TokenCountTest.java

package com.fasterxml.jackson.core.constraints;

import java.nio.ByteBuffer;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.core.JUnit5TestBase;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.core.json.async.NonBlockingByteBufferJsonParser;
import com.fasterxml.jackson.core.json.async.NonBlockingJsonParser;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * Set of basic unit tests for verifying that the token count
 * functionality works as expected.
 */
public class TokenCountTest extends JUnit5TestBase {
    private final static JsonFactory JSON_FACTORY = JsonFactory.builder()
        .streamReadConstraints(StreamReadConstraints.builder().maxTokenCount(Long.MAX_VALUE).build())
        .build();
    private final static String ARRAY_DOC = a2q("{ 'nums': [1,2,3,4,5,6,7,8,9,10] }");
    private final static String SHORT_ARRAY_DOC = a2q("{ 'nums': [1,2,3] }");

    @Test
    void arrayDoc() throws Exception
    {
        for (int mode : ALL_MODES) {
            _testArrayDoc(mode);
        }
    }

    @Test
    void arrayDocNonBlockingArray() throws Exception
    {
        final byte[] input = ARRAY_DOC.getBytes("UTF-8");
        try (NonBlockingJsonParser p = (NonBlockingJsonParser) JSON_FACTORY.createNonBlockingByteArrayParser()) {
            p.feedInput(input, 0, input.length);
            p.endOfInput();
            _testArrayDoc(p);
        }
    }

    @Test
    void arrayDocNonBlockingBuffer() throws Exception
    {
        final byte[] input = ARRAY_DOC.getBytes("UTF-8");
        try (NonBlockingByteBufferJsonParser p = (NonBlockingByteBufferJsonParser) JSON_FACTORY.createNonBlockingByteBufferParser()) {
            p.feedInput(ByteBuffer.wrap(input, 0, input.length));
            p.endOfInput();
            _testArrayDoc(p);
        }
    }

    @Test
    void shortArrayDoc() throws Exception
    {
        for (int mode : ALL_MODES) {
            _testShortArrayDoc(mode);
        }
    }

    @Test
    void shortArrayDocNonBlockingArray() throws Exception
    {
        final byte[] input = SHORT_ARRAY_DOC.getBytes("UTF-8");
        try (NonBlockingJsonParser p = (NonBlockingJsonParser) JSON_FACTORY.createNonBlockingByteArrayParser()) {
            p.feedInput(input, 0, input.length);
            p.endOfInput();
            _testShortArrayDoc(p);
        }
    }

    @Test
    void shortArrayDocNonBlockingBuffer() throws Exception
    {
        final byte[] input = SHORT_ARRAY_DOC.getBytes("UTF-8");
        try (NonBlockingByteBufferJsonParser p = (NonBlockingByteBufferJsonParser)
            JSON_FACTORY.createNonBlockingByteBufferParser()) {
            p.feedInput(ByteBuffer.wrap(input, 0, input.length));
            p.endOfInput();
            _testShortArrayDoc(p);
        }
    }

    @Test
    void sampleDoc() throws Exception
    {
        for (int mode : ALL_MODES) {
            _testSampleDoc(mode);
        }
    }

    @Test
    void sampleDocNonBlockingArray() throws Exception
    {
        final byte[] input = SAMPLE_DOC_JSON_SPEC.getBytes("UTF-8");
        try (NonBlockingJsonParser p = (NonBlockingJsonParser) JSON_FACTORY.createNonBlockingByteArrayParser()) {
            p.feedInput(input, 0, input.length);
            p.endOfInput();
            _testSampleDoc(p);
        }
    }

    @Test
    void sampleDocNonBlockingBuffer() throws Exception
    {
        final byte[] input = SAMPLE_DOC_JSON_SPEC.getBytes("UTF-8");
        try (NonBlockingByteBufferJsonParser p = (NonBlockingByteBufferJsonParser)
            JSON_FACTORY.createNonBlockingByteBufferParser()) {
            p.feedInput(ByteBuffer.wrap(input, 0, input.length));
            p.endOfInput();
            _testSampleDoc(p);
        }
    }

    private void _testArrayDoc(int mode) throws Exception
    {
        try (JsonParser p = createParser(JSON_FACTORY, mode, ARRAY_DOC)) {
            _testArrayDoc(p);
        }
    }

    private void _testArrayDoc(JsonParser p) throws Exception
    {
        assertEquals(0, p.currentTokenCount());
        consumeTokens(p);
        assertEquals(15, p.currentTokenCount());
    }

    private void _testShortArrayDoc(int mode) throws Exception
    {
        try (JsonParser p = createParser(JSON_FACTORY, mode, SHORT_ARRAY_DOC)) {
            _testShortArrayDoc(p);
        }
    }

    private void _testShortArrayDoc(JsonParser p) throws Exception
    {
        assertEquals(0, p.currentTokenCount());
        consumeTokens(p);
        assertEquals(8, p.currentTokenCount());
    }

    private void _testSampleDoc(int mode) throws Exception
    {
        try (JsonParser p = createParser(JSON_FACTORY, mode, SAMPLE_DOC_JSON_SPEC)) {
            _testSampleDoc(p);
        }
    }

    private void _testSampleDoc(JsonParser p) throws Exception
    {
        assertEquals(0, p.currentTokenCount());
        consumeTokens(p);
        assertEquals(27, p.currentTokenCount());
    }

    private void consumeTokens(JsonParser p) throws Exception {
        while (p.nextToken() != null) {
            ;
        }
    }
}