package org.simpleflatmapper.reflect.test.meta; import org.junit.Test; import org.simpleflatmapper.reflect.InstantiatorDefinition; import org.simpleflatmapper.reflect.ReflectionService; import org.simpleflatmapper.reflect.meta.ClassMeta; import org.simpleflatmapper.reflect.meta.DefaultPropertyNameMatcher; import org.simpleflatmapper.reflect.meta.PropertyMeta; import org.simpleflatmapper.reflect.setter.NullSetter; import org.simpleflatmapper.test.beans.DbObject; import org.simpleflatmapper.util.ConstantPredicate; import org.simpleflatmapper.util.Consumer; import org.simpleflatmapper.util.Predicate; import org.simpleflatmapper.util.TypeReference; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import static org.junit.Assert.*; public class OptionalClassMetaTest { private final Type dbObjectType = new TypeReference<Optional<DbObject>>() { }.getType(); ClassMeta<Optional<DbObject>> objectClassMeta = ReflectionService.newInstance().getClassMeta(dbObjectType); ClassMeta<Optional<String>> stringClassMeta = ReflectionService.newInstance().getClassMeta(new TypeReference<Optional<String>>() { }.getType()); private Predicate<PropertyMeta<?, ?>> isValidPropertyMeta = ConstantPredicate.truePredicate(); @Test public void testFindProperty() throws Exception { PropertyMeta<Optional<DbObject>, String> email = objectClassMeta.newPropertyFinder(isValidPropertyMeta).findProperty(DefaultPropertyNameMatcher.of("email")); DbObject dbObject = new DbObject(); dbObject.setEmail("houlala 2 la mission!"); Optional<DbObject> optional = Optional.of(dbObject); assertEquals("houlala 2 la mission!", email.getGetter().get(optional)); email.getSetter().set(optional, "OuiOui"); assertEquals("OuiOui", email.getGetter().get(optional)); assertEquals(null, email.getGetter().get(Optional.<DbObject>empty())); PropertyMeta<Optional<String>, String> strValue = stringClassMeta.newPropertyFinder(isValidPropertyMeta).findProperty(DefaultPropertyNameMatcher.of("value")); assertEquals("str", strValue.getGetter().get(Optional.of("str"))); assertTrue(NullSetter.isNull(strValue.getSetter())); } @Test public void testInstantiatorDefinition() throws Exception { List<InstantiatorDefinition> instantiatorDefinitions = objectClassMeta.getInstantiatorDefinitions(); assertEquals(1, instantiatorDefinitions.size()); InstantiatorDefinition id = instantiatorDefinitions.get(0); assertEquals(1, id.getParameters().length); assertEquals("value", id.getParameters()[0].getName()); } @Test public void testForEach() { List<String> names = new ArrayList<String>(); ClassMeta<Object> classMeta = ReflectionService.newInstance().getClassMeta(new TypeReference<Optional<DbObject>>() { }.getType()); classMeta.forEachProperties(new Consumer<PropertyMeta<?, ?>>() { @Override public void accept(PropertyMeta<?, ?> dbObjectPropertyMeta) { names.add(dbObjectPropertyMeta.getName()); } }); assertEquals(Arrays.asList("value"), names); } }