package org.simpleflatmapper.test.map.impl; import org.junit.Test; import org.simpleflatmapper.map.FieldMapperErrorHandler; import org.simpleflatmapper.map.Mapper; import org.simpleflatmapper.map.MapperConfig; import org.simpleflatmapper.map.MappingException; import org.simpleflatmapper.test.map.SampleFieldKey; import org.simpleflatmapper.map.context.MappingContextFactoryBuilder; import org.simpleflatmapper.map.impl.IdentityFieldMapperColumnDefinitionProvider; import org.simpleflatmapper.map.property.FieldMapperColumnDefinition; import org.simpleflatmapper.map.mapper.ConstantSourceMapperBuilder; import org.simpleflatmapper.map.mapper.MapperSource; import org.simpleflatmapper.reflect.Getter; import org.simpleflatmapper.reflect.ReflectionService; import org.simpleflatmapper.reflect.getter.ConstantGetter; import org.simpleflatmapper.reflect.getter.GetterFactory; import org.simpleflatmapper.reflect.meta.ClassMeta; import java.lang.reflect.Type; import java.util.Date; import static org.junit.Assert.*; public class ConstantSourceMapperBuilderTest { public static final Date DATE = new Date(); public static final String STRING = "hello!"; ClassMeta<MyObjectWithInner> classMeta = ReflectionService.disableAsm().getClassMeta(MyObjectWithInner.class); GetterFactory<Object, SampleFieldKey> getterFactory = new GetterFactory<Object, SampleFieldKey>() { @SuppressWarnings("unchecked") @Override public <P> Getter<Object, P> newGetter(Type target, SampleFieldKey key, Object... properties) { if (key.getIndex() == 16) { return new Getter<Object, P>() { @Override public P get(Object target) throws Exception { throw new RuntimeException("Error !"); } }; } if (target.equals(Date.class)) { return (Getter<Object, P>) new ConstantGetter<Object, Date>(DATE); } else if (target.equals(String.class)) { return (Getter<Object, P>) new ConstantGetter<Object, String>(STRING); } return null; } }; MapperSource<Object, SampleFieldKey> mapperSource = new MapperSource<Object, SampleFieldKey>() { @Override public Class<Object> source() { return Object.class; } @Override public GetterFactory<Object, SampleFieldKey> getterFactory() { return getterFactory; } }; @Test public void testAnonymousParameterWithDifferentType() throws Exception { ConstantSourceMapperBuilder<Object, MyObjectWithInner, SampleFieldKey> constantSourceMapperBuilder = new ConstantSourceMapperBuilder<Object, MyObjectWithInner, SampleFieldKey>( mapperSource, classMeta, MapperConfig.config(new IdentityFieldMapperColumnDefinitionProvider<SampleFieldKey>()), new MappingContextFactoryBuilder<Object, SampleFieldKey>(null), SampleFieldKey.KEY_FACTORY ); constantSourceMapperBuilder.addMapping(new SampleFieldKey("prop", 0, Date.class), FieldMapperColumnDefinition.<SampleFieldKey>identity()); Mapper<Object, MyObjectWithInner> mapper = constantSourceMapperBuilder.mapper(); MyObjectWithInner o = mapper.map(null); assertEquals(DATE, o.prop.date); assertNull(o.prop.str); } @Test public void testMapInnerObjectWithMapper() throws Exception { ConstantSourceMapperBuilder<Object, MyObjectWithInner, SampleFieldKey> constantSourceMapperBuilder = new ConstantSourceMapperBuilder<Object, MyObjectWithInner, SampleFieldKey>( mapperSource, classMeta, MapperConfig.config(new IdentityFieldMapperColumnDefinitionProvider<SampleFieldKey>()), new MappingContextFactoryBuilder<Object, SampleFieldKey>(null), SampleFieldKey.KEY_FACTORY ); constantSourceMapperBuilder.addMapping(new SampleFieldKey("prop_date", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity()); Mapper<Object, MyObjectWithInner> mapper = constantSourceMapperBuilder.mapper(); MyObjectWithInner o = mapper.map(null); assertEquals(DATE, o.prop.date); assertNull(o.prop.str); } @Test public void testFieldMapperErrorHandler() throws Exception{ ConstantSourceMapperBuilder<Object, MyObjectWithInner, SampleFieldKey> constantSourceMapperBuilder = new ConstantSourceMapperBuilder<Object, MyObjectWithInner, SampleFieldKey>( mapperSource, classMeta, MapperConfig.config(new IdentityFieldMapperColumnDefinitionProvider<SampleFieldKey>()).fieldMapperErrorHandler(new FieldMapperErrorHandler<SampleFieldKey>() { @Override public void errorMappingField(SampleFieldKey key, Object source, Object target, Exception error) throws MappingException { } }), new MappingContextFactoryBuilder<Object, SampleFieldKey>(null), SampleFieldKey.KEY_FACTORY ); constantSourceMapperBuilder.addMapping(new SampleFieldKey("prop_date", 16), FieldMapperColumnDefinition.<SampleFieldKey>identity()); Mapper<Object, MyObjectWithInner> mapper = constantSourceMapperBuilder.mapper(); MyObjectWithInner o = mapper.map(null); System.out.println("mapper = " + mapper); assertNull(o.prop); } public static class MyObjectWithInner { public MultiConstructorObject prop; } public static class MultiConstructorObject { private String str; private Date date; public MultiConstructorObject(String str) { this.str = str; } public MultiConstructorObject(Date date) { this.date = date; } public String getStr() { return str; } public Date getDate() { return date; } } }