package com.fasterxml.jackson.databind.util; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.BaseMapTest; import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; import com.fasterxml.jackson.databind.type.TypeFactory; public class BeanUtilTest extends BaseMapTest { static class IsGetters { public boolean isPrimitive() { return false; } public Boolean isWrapper() { return false; } public String isNotGetter() { return null; } public boolean is() { return false; } } static class Getters { public String getCallbacks() { return null; } public String getMetaClass() { return null; } public boolean get() { return false; } } static class Setters { public void setFoo() { } public void notSetter() { } public void set() { } } /* /********************************************************** /* Test methods /********************************************************** */ public void testNameMangle() { assertEquals("foo", BeanUtil.legacyManglePropertyName("getFoo", 3)); assertEquals("foo", BeanUtil.stdManglePropertyName("getFoo", 3)); assertEquals("url", BeanUtil.legacyManglePropertyName("getURL", 3)); assertEquals("URL", BeanUtil.stdManglePropertyName("getURL", 3)); } public void testGetDefaultValue() { TypeFactory tf = TypeFactory.defaultInstance(); // For collection/array/Map types, should give `NOT_EMPTY`: assertEquals(JsonInclude.Include.NON_EMPTY, BeanUtil.getDefaultValue(tf.constructType(Map.class))); assertEquals(JsonInclude.Include.NON_EMPTY, BeanUtil.getDefaultValue(tf.constructType(List.class))); assertEquals(JsonInclude.Include.NON_EMPTY, BeanUtil.getDefaultValue(tf.constructType(Object[].class))); // as well as ReferenceTypes, String assertEquals(JsonInclude.Include.NON_EMPTY, BeanUtil.getDefaultValue(tf.constructType(AtomicReference.class))); assertEquals("", BeanUtil.getDefaultValue(tf.constructType(String.class))); // primitive/wrappers have others assertEquals(Integer.valueOf(0), BeanUtil.getDefaultValue(tf.constructType(Integer.class))); // but POJOs have no real default assertNull(BeanUtil.getDefaultValue(tf.constructType(getClass()))); } public void testIsGetter() throws Exception { _testIsGetter("isPrimitive", "primitive"); _testIsGetter("isWrapper", "wrapper"); _testIsGetter("isNotGetter", null); _testIsGetter("is", null); } public void testOkNameForGetter() throws Exception { // mostly chosen to exercise groovy exclusion _testOkNameForGetter("getCallbacks", "callbacks"); _testOkNameForGetter("getMetaClass", "metaClass"); _testOkNameForGetter("get", null); } public void testOkNameForSetter() throws Exception { _testOkNameForSetter("setFoo", "foo"); _testOkNameForSetter("notSetter", null); _testOkNameForSetter("set", null); } /* /********************************************************** /* Helper methods /********************************************************** */ private void _testIsGetter(String name, String expName) throws Exception { _testIsGetter(name, expName, true); _testIsGetter(name, expName, false); } private void _testIsGetter(String name, String expName, boolean useStd) throws Exception { AnnotatedMethod m = _method(IsGetters.class, name); if (expName == null) { assertNull(BeanUtil.okNameForIsGetter(m, name, useStd)); } else { assertEquals(expName, BeanUtil.okNameForIsGetter(m, name, useStd)); } } private void _testOkNameForGetter(String name, String expName) throws Exception { _testOkNameForGetter(name, expName, true); _testOkNameForGetter(name, expName, false); } private void _testOkNameForGetter(String name, String expName, boolean useStd) throws Exception { AnnotatedMethod m = _method(Getters.class, name); if (expName == null) { assertNull(BeanUtil.okNameForGetter(m, useStd)); } else { assertEquals(expName, BeanUtil.okNameForGetter(m, useStd)); } } private void _testOkNameForSetter(String name, String expName) throws Exception { _testOkNameForSetter(name, expName, true); _testOkNameForSetter(name, expName, false); } @SuppressWarnings("deprecation") private void _testOkNameForSetter(String name, String expName, boolean useStd) throws Exception { AnnotatedMethod m = _method(Setters.class, name); if (expName == null) { assertNull(BeanUtil.okNameForSetter(m, useStd)); } else { assertEquals(expName, BeanUtil.okNameForSetter(m, useStd)); } } private AnnotatedMethod _method(Class<?> cls, String name, Class<?>...parameterTypes) throws Exception { return new AnnotatedMethod(null, cls.getMethod(name, parameterTypes), null, null); } }