package com.fasterxml.jackson.core.main; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.test.BaseTest; import java.io.*; import java.math.BigDecimal; /** * Set of basic unit tests for verifying that the Object write methods * of {@link JsonGenerator} work as expected. */ public class TestGeneratorObject extends BaseTest { public void testEmptyObjectWrite() throws Exception { StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createGenerator(sw); JsonStreamContext ctxt = gen.getOutputContext(); assertTrue(ctxt.inRoot()); assertFalse(ctxt.inArray()); assertFalse(ctxt.inObject()); assertEquals(0, ctxt.getEntryCount()); assertEquals(0, ctxt.getCurrentIndex()); gen.writeStartObject(); ctxt = gen.getOutputContext(); assertFalse(ctxt.inRoot()); assertFalse(ctxt.inArray()); assertTrue(ctxt.inObject()); assertEquals(0, ctxt.getEntryCount()); assertEquals(0, ctxt.getCurrentIndex()); gen.writeEndObject(); ctxt = gen.getOutputContext(); assertTrue(ctxt.inRoot()); assertFalse(ctxt.inArray()); assertFalse(ctxt.inObject()); assertEquals(1, ctxt.getEntryCount()); // Index won't yet move assertEquals(0, ctxt.getCurrentIndex()); gen.close(); String docStr = sw.toString(); JsonParser jp = createParserUsingReader(docStr); assertEquals(JsonToken.START_OBJECT, jp.nextToken()); assertEquals(JsonToken.END_OBJECT, jp.nextToken()); assertEquals(null, jp.nextToken()); } public void testInvalidObjectWrite() throws Exception { StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createGenerator(sw); gen.writeStartObject(); // Mismatch: try { gen.writeEndArray(); fail("Expected an exception for mismatched array/object write"); } catch (JsonGenerationException e) { verifyException(e, "Current context not an array"); } } public void testSimpleObjectWrite() throws Exception { StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createGenerator(sw); gen.writeStartObject(); gen.writeFieldName("first"); gen.writeNumber(-901); gen.writeFieldName("sec"); gen.writeBoolean(false); gen.writeFieldName("3rd!"); // json field names are just strings, not ids with restrictions gen.writeString("yee-haw"); gen.writeEndObject(); gen.close(); String docStr = sw.toString(); JsonParser jp = createParserUsingReader(docStr); assertEquals(JsonToken.START_OBJECT, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("first", jp.getText()); assertEquals(JsonToken.VALUE_NUMBER_INT, jp.nextToken()); assertEquals(-901, jp.getIntValue()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("sec", jp.getText()); assertEquals(JsonToken.VALUE_FALSE, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("3rd!", jp.getText()); assertEquals(JsonToken.VALUE_STRING, jp.nextToken()); assertEquals("yee-haw", jp.getText()); assertEquals(JsonToken.END_OBJECT, jp.nextToken()); assertEquals(null, jp.nextToken()); jp.close(); } /** * Methods to test functionality added for [JACKSON-26] */ public void testConvenienceMethods() throws Exception { StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createGenerator(sw); gen.writeStartObject(); final BigDecimal dec = new BigDecimal("0.1"); final String TEXT = "\"some\nString!\""; gen.writeNullField("null"); gen.writeBooleanField("bt", true); gen.writeBooleanField("bf", false); gen.writeNumberField("int", -1289); gen.writeNumberField("dec", dec); gen.writeObjectFieldStart("ob"); gen.writeStringField("str", TEXT); gen.writeEndObject(); gen.writeArrayFieldStart("arr"); gen.writeEndArray(); gen.writeEndObject(); gen.close(); String docStr = sw.toString(); JsonParser jp = createParserUsingReader(docStr); assertEquals(JsonToken.START_OBJECT, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("null", jp.getText()); assertEquals(JsonToken.VALUE_NULL, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("bt", jp.getText()); assertEquals(JsonToken.VALUE_TRUE, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("bf", jp.getText()); assertEquals(JsonToken.VALUE_FALSE, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("int", jp.getText()); assertEquals(JsonToken.VALUE_NUMBER_INT, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("dec", jp.getText()); assertEquals(JsonToken.VALUE_NUMBER_FLOAT, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("ob", jp.getText()); assertEquals(JsonToken.START_OBJECT, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("str", jp.getText()); assertEquals(JsonToken.VALUE_STRING, jp.nextToken()); assertEquals(TEXT, getAndVerifyText(jp)); assertEquals(JsonToken.END_OBJECT, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("arr", jp.getText()); assertEquals(JsonToken.START_ARRAY, jp.nextToken()); assertEquals(JsonToken.END_ARRAY, jp.nextToken()); assertEquals(JsonToken.END_OBJECT, jp.nextToken()); assertEquals(null, jp.nextToken()); jp.close(); } /** * Tests to cover [JACKSON-164] */ public void testConvenienceMethodsWithNulls() throws Exception { StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createGenerator(sw); gen.writeStartObject(); gen.writeStringField("str", null); gen.writeNumberField("num", null); gen.writeObjectField("obj", null); gen.writeEndObject(); gen.close(); String docStr = sw.toString(); JsonParser jp = createParserUsingReader(docStr); assertEquals(JsonToken.START_OBJECT, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("str", jp.getCurrentName()); assertEquals(JsonToken.VALUE_NULL, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("num", jp.getCurrentName()); assertEquals(JsonToken.VALUE_NULL, jp.nextToken()); assertEquals(JsonToken.FIELD_NAME, jp.nextToken()); assertEquals("obj", jp.getCurrentName()); assertEquals(JsonToken.VALUE_NULL, jp.nextToken()); assertEquals(JsonToken.END_OBJECT, jp.nextToken()); } }