package com.fasterxml.jackson.core.json; import java.io.ByteArrayInputStream; import java.io.StringReader; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.SerializableString; import com.fasterxml.jackson.core.io.SerializedString; public class TestNextXxx extends com.fasterxml.jackson.test.BaseTest { /* /******************************************************** /* Wrappers to test InputStream vs Reader /******************************************************** */ // [JACKSON-653] public void testIsNextTokenName() throws Exception { _testIsNextTokenName1(false); _testIsNextTokenName1(true); _testIsNextTokenName2(false); _testIsNextTokenName2(true); } // [Issue#34] public void testIssue34() throws Exception { _testIssue34(false); _testIssue34(true); } // [Issue#38] with nextFieldName public void testIssue38() throws Exception { _testIssue38(false); _testIssue38(true); } /* /******************************************************** /* Actual test code /******************************************************** */ private void _testIsNextTokenName1(boolean useStream) throws Exception { final String DOC = "{\"name\":123,\"name2\":14,\"x\":\"name\"}"; JsonFactory jf = new JsonFactory(); JsonParser jp = useStream ? jf.createParser(new ByteArrayInputStream(DOC.getBytes("UTF-8"))) : jf.createParser(new StringReader(DOC)); SerializedString NAME = new SerializedString("name"); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.START_OBJECT, jp.getCurrentToken()); assertTrue(jp.nextFieldName(NAME)); assertToken(JsonToken.FIELD_NAME, jp.getCurrentToken()); assertEquals(NAME.getValue(), jp.getCurrentName()); assertEquals(NAME.getValue(), jp.getText()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.VALUE_NUMBER_INT, jp.getCurrentToken()); assertEquals(123, jp.getIntValue()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.FIELD_NAME, jp.getCurrentToken()); assertEquals("name2", jp.getCurrentName()); assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.FIELD_NAME, jp.getCurrentToken()); assertEquals("x", jp.getCurrentName()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.VALUE_STRING, jp.getCurrentToken()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.END_OBJECT, jp.getCurrentToken()); assertFalse(jp.nextFieldName(NAME)); assertNull(jp.getCurrentToken()); jp.close(); } private void _testIsNextTokenName2(boolean useStream) throws Exception { final String DOC = "{\"name\":123,\"name2\":14,\"x\":\"name\"}"; JsonFactory jf = new JsonFactory(); JsonParser jp = useStream ? jf.createParser(new ByteArrayInputStream(DOC.getBytes("UTF-8"))) : jf.createParser(new StringReader(DOC)); SerializableString NAME = new SerializedString("name"); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.START_OBJECT, jp.getCurrentToken()); assertTrue(jp.nextFieldName(NAME)); assertToken(JsonToken.FIELD_NAME, jp.getCurrentToken()); assertEquals(NAME.getValue(), jp.getCurrentName()); assertEquals(NAME.getValue(), jp.getText()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.VALUE_NUMBER_INT, jp.getCurrentToken()); assertEquals(123, jp.getIntValue()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.FIELD_NAME, jp.getCurrentToken()); assertEquals("name2", jp.getCurrentName()); assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.FIELD_NAME, jp.getCurrentToken()); assertEquals("x", jp.getCurrentName()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.VALUE_STRING, jp.getCurrentToken()); assertFalse(jp.nextFieldName(NAME)); assertToken(JsonToken.END_OBJECT, jp.getCurrentToken()); assertFalse(jp.nextFieldName(NAME)); assertNull(jp.getCurrentToken()); jp.close(); } private void _testIssue34(boolean useStream) throws Exception { final int TESTROUNDS = 223; final String DOC_PART = "{ \"fieldName\": 1 }"; // build the big document to trigger issue StringBuilder sb = new StringBuilder(2000); for (int i = 0; i < TESTROUNDS; ++i) { sb.append(DOC_PART); } final String DOC = sb.toString(); SerializableString fieldName = new SerializedString("fieldName"); JsonFactory jf = new JsonFactory(); JsonParser parser = useStream ? jf.createParser(new ByteArrayInputStream(DOC.getBytes("UTF-8"))) : jf.createParser(new StringReader(DOC)); for (int i = 0; i < TESTROUNDS - 1; i++) { assertEquals(JsonToken.START_OBJECT, parser.nextToken()); // These will succeed assertTrue(parser.nextFieldName(fieldName)); parser.nextLongValue(-1); assertEquals(JsonToken.END_OBJECT, parser.nextToken()); } assertEquals(JsonToken.START_OBJECT, parser.nextToken()); // This will fail assertTrue(parser.nextFieldName(fieldName)); parser.close(); } private void _testIssue38(boolean useStream) throws Exception { final String DOC = "{\"field\" :\"value\"}"; SerializableString fieldName = new SerializedString("field"); JsonFactory jf = new JsonFactory(); JsonParser parser = useStream ? jf.createParser(new ByteArrayInputStream(DOC.getBytes("UTF-8"))) : jf.createParser(new StringReader(DOC)); assertEquals(JsonToken.START_OBJECT, parser.nextToken()); assertTrue(parser.nextFieldName(fieldName)); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("value", parser.getText()); assertEquals(JsonToken.END_OBJECT, parser.nextToken()); assertNull(parser.nextToken()); parser.close(); } }