package com.fasterxml.jackson.databind.cfg;
import java.util.Collections;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.introspect.ClassIntrospector;
public class DeserializationConfigTest extends BaseMapTest
{
private final ObjectMapper MAPPER = new ObjectMapper();
public void testFeatureDefaults()
{
ObjectMapper m = new ObjectMapper();
DeserializationConfig cfg = m.getDeserializationConfig();
// Expected defaults:
assertTrue(cfg.isEnabled(MapperFeature.USE_ANNOTATIONS));
assertTrue(cfg.isEnabled(MapperFeature.AUTO_DETECT_SETTERS));
assertTrue(cfg.isEnabled(MapperFeature.AUTO_DETECT_CREATORS));
assertTrue(cfg.isEnabled(MapperFeature.USE_GETTERS_AS_SETTERS));
assertTrue(cfg.isEnabled(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS));
assertFalse(cfg.isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS));
assertFalse(cfg.isEnabled(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS));
assertTrue(cfg.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
}
public void testBasicFeatures() throws Exception
{
DeserializationConfig config = MAPPER.getDeserializationConfig();
assertTrue(config.hasDeserializationFeatures(DeserializationFeature.EAGER_DESERIALIZER_FETCH.getMask()));
assertFalse(config.hasDeserializationFeatures(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY.getMask()));
assertTrue(config.hasSomeOfFeatures(DeserializationFeature.EAGER_DESERIALIZER_FETCH.getMask()
+ DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY.getMask()));
assertFalse(config.hasSomeOfFeatures(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY.getMask()));
// if no changes then same config object
assertSame(config, config.without());
assertSame(config, config.with());
assertSame(config, config.with(MAPPER.getSubtypeResolver()));
// and then change
DeserializationConfig newConfig = config.with(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
assertNotSame(config, newConfig);
config = newConfig;
// but another attempt with no real change returns same
assertSame(config, config.with(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES));
assertNotSame(config, config.with(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, false));
assertNotSame(config, config.with(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT,
DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES));
}
public void testParserFeatures() throws Exception
{
DeserializationConfig config = MAPPER.getDeserializationConfig();
assertNotSame(config, config.with(JsonParser.Feature.ALLOW_COMMENTS));
assertNotSame(config, config.withFeatures(JsonParser.Feature.ALLOW_COMMENTS,
JsonParser.Feature.ALLOW_MISSING_VALUES));
assertNotSame(config, config.without(JsonParser.Feature.ALLOW_COMMENTS));
assertNotSame(config, config.withoutFeatures(JsonParser.Feature.ALLOW_COMMENTS,
JsonParser.Feature.ALLOW_MISSING_VALUES));
}
public void testFormatFeatures() throws Exception
{
DeserializationConfig config = MAPPER.getDeserializationConfig();
assertNotSame(config, config.with(BogusFormatFeature.FF_DISABLED_BY_DEFAULT));
assertNotSame(config, config.withFeatures(BogusFormatFeature.FF_DISABLED_BY_DEFAULT,
BogusFormatFeature.FF_ENABLED_BY_DEFAULT));
assertNotSame(config, config.without(BogusFormatFeature.FF_ENABLED_BY_DEFAULT));
assertNotSame(config, config.withoutFeatures(BogusFormatFeature.FF_DISABLED_BY_DEFAULT,
BogusFormatFeature.FF_ENABLED_BY_DEFAULT));
}
/* Test to verify that we don't overflow number of features; if we
* hit the limit, need to change implementation -- this test just
* gives low-water mark
*/
public void testEnumIndexes()
{
int max = 0;
for (DeserializationFeature f : DeserializationFeature.values()) {
max = Math.max(max, f.ordinal());
}
if (max >= 31) { // 31 is actually ok; 32 not
fail("Max number of DeserializationFeature enums reached: "+max);
}
}
public void testOverrideIntrospectors()
{
ObjectMapper m = new ObjectMapper();
DeserializationConfig cfg = m.getDeserializationConfig();
// and finally, ensure we could override introspectors
cfg = cfg.with((ClassIntrospector) null); // no way to verify tho
cfg = cfg.with((AnnotationIntrospector) null);
assertNull(cfg.getAnnotationIntrospector());
}
public void testMisc() throws Exception
{
DeserializationConfig config = MAPPER.getDeserializationConfig();
assertEquals(JsonInclude.Value.empty(), config.getDefaultPropertyInclusion());
assertEquals(JsonInclude.Value.empty(), config.getDefaultPropertyInclusion(String.class));
assertSame(config, config.withRootName((PropertyName) null)); // defaults to 'none'
DeserializationConfig newConfig = config.withRootName(PropertyName.construct("foobar"));
assertNotSame(config, newConfig);
config = newConfig;
assertSame(config, config.withRootName(PropertyName.construct("foobar")));
assertSame(config, config.with(config.getAttributes()));
assertNotSame(config, config.with(new ContextAttributes.Impl(Collections.singletonMap("a", "b"))));
// should also be able to introspect:
assertNotNull(config.introspectDirectClassAnnotations(getClass()));
}
}