ParserOverridesTest.java

package tools.jackson.core.unittest.json;

import java.io.ByteArrayInputStream;
import java.io.StringReader;

import tools.jackson.core.JsonParser;
import tools.jackson.core.JsonToken;
import tools.jackson.core.ObjectReadContext;
import tools.jackson.core.json.JsonFactory;
import tools.jackson.core.unittest.*;

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

public class ParserOverridesTest extends JacksonCoreTestBase
{
    /*
    /**********************************************************
    /* Wrappers, to test stream and reader-based parsers
    /**********************************************************
     */

    public void testTokenAccess() throws Exception
    {
        JsonFactory jf = new JsonFactory();
        _testTokenAccess(jf, false);
        _testTokenAccess(jf, true);
    }

    public void testCurrentName() throws Exception
    {
        JsonFactory jf = new JsonFactory();
        _testCurrentName(jf, false);
        _testCurrentName(jf, true);
    }

    /*
    /**********************************************************
    /* Actual test methods
    /**********************************************************
     */

    public void _testTokenAccess(JsonFactory jf, boolean useStream) throws Exception
    {
        final String DOC = "[ ]";
        JsonParser jp = useStream ?
                jf.createParser(ObjectReadContext.empty(), new ByteArrayInputStream(DOC.getBytes("UTF-8")))
                : jf.createParser(ObjectReadContext.empty(), DOC);
        assertNull(jp.currentToken());
        jp.clearCurrentToken();
        assertNull(jp.currentToken());
        assertNull(jp.getEmbeddedObject());
        assertToken(JsonToken.START_ARRAY, jp.nextToken());
        assertToken(JsonToken.START_ARRAY, jp.currentToken());
        jp.clearCurrentToken();
        assertNull(jp.currentToken());
        // Also: no codec defined by default
        try {
            jp.readValueAsTree();
            fail("Should get exception without codec");
        } catch (UnsupportedOperationException e) {
            verifyException(e, "Operation not supported");
        }
        jp.close();
    }

    private void _testCurrentName(JsonFactory jf, boolean useStream) throws Exception
    {
        final String DOC = "{\"first\":{\"second\":3, \"third\":false}}";
        JsonParser jp = useStream ?
                jf.createParser(ObjectReadContext.empty(), new ByteArrayInputStream(DOC.getBytes("UTF-8")))
                : jf.createParser(ObjectReadContext.empty(), new StringReader(DOC));
        assertNull(jp.currentToken());
        assertToken(JsonToken.START_OBJECT, jp.nextToken());
        assertToken(JsonToken.PROPERTY_NAME, jp.nextToken());
        assertEquals("first", jp.currentName());
        assertToken(JsonToken.START_OBJECT, jp.nextToken());
        assertEquals("first", jp.currentName()); // still the same...
//        jp.overrideCurrentName("foobar");
//        assertEquals("foobar", jp.currentName()); // but not any more!

        assertToken(JsonToken.PROPERTY_NAME, jp.nextToken());
        assertEquals("second", jp.currentName());
        assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken());
        assertEquals("second", jp.currentName());

        assertToken(JsonToken.PROPERTY_NAME, jp.nextToken());
        assertEquals("third", jp.currentName());
        assertToken(JsonToken.VALUE_FALSE, jp.nextToken());
        assertEquals("third", jp.currentName());

        assertToken(JsonToken.END_OBJECT, jp.nextToken());
        // should retain overrides, too
//        assertEquals("foobar", jp.currentName());

        assertToken(JsonToken.END_OBJECT, jp.nextToken());
        jp.clearCurrentToken();
        assertNull(jp.currentToken());
        jp.close();
    }
}