GeneratorDupHandlingTest.java
package tools.jackson.core.unittest.write;
import java.io.*;
import tools.jackson.core.JsonGenerator;
import tools.jackson.core.ObjectWriteContext;
import tools.jackson.core.StreamWriteFeature;
import tools.jackson.core.TokenStreamFactory;
import tools.jackson.core.exc.StreamWriteException;
import tools.jackson.core.unittest.*;
import static org.junit.jupiter.api.Assertions.fail;
public class GeneratorDupHandlingTest
extends JacksonCoreTestBase
{
public void testSimpleDupsEagerlyBytes() {
_testSimpleDups(true, newStreamFactory());
}
public void testSimpleDupsEagerlyChars() {
_testSimpleDups(false, newStreamFactory());
}
@SuppressWarnings("resource")
protected void _testSimpleDups(boolean useStream, TokenStreamFactory f)
{
// First: fine, when not checking
_writeSimple0(_generator(f, useStream), "a");
_writeSimple1(_generator(f, useStream), "b");
// but not when checking
f = f.rebuild().enable(StreamWriteFeature.STRICT_DUPLICATE_DETECTION).build();
try (JsonGenerator g1 = _generator(f, useStream)) {
_writeSimple0(g1, "a");
fail("Should have gotten exception");
} catch (StreamWriteException e) {
verifyException(e, "duplicate Object property \"a\"");
}
try (JsonGenerator g2 = _generator(f, useStream)) {
_writeSimple1(g2, "x");
fail("Should have gotten exception");
} catch (StreamWriteException e) {
verifyException(e, "duplicate Object property \"x\"");
}
}
protected JsonGenerator _generator(TokenStreamFactory f, boolean useStream)
{
return useStream ?
f.createGenerator(ObjectWriteContext.empty(), new ByteArrayOutputStream())
: f.createGenerator(ObjectWriteContext.empty(), new StringWriter());
}
protected void _writeSimple0(JsonGenerator g, String name)
{
g.writeStartObject();
g.writeNumberProperty(name, 1);
g.writeNumberProperty(name, 2);
g.writeEndObject();
g.close();
}
protected void _writeSimple1(JsonGenerator g, String name)
{
g.writeStartArray();
g.writeNumber(3);
g.writeStartObject();
g.writeNumberProperty("foo", 1);
g.writeNumberProperty("bar", 1);
g.writeNumberProperty(name, 1);
g.writeNumberProperty("bar2", 1);
g.writeNumberProperty(name, 2);
g.writeEndObject();
g.writeEndArray();
g.close();
}
}