package org.simpleflatmapper.test.map.mapper;
import org.junit.Test;
import org.simpleflatmapper.map.Mapper;
import org.simpleflatmapper.map.MappingContext;
import org.simpleflatmapper.map.MappingException;
import org.simpleflatmapper.reflect.ReflectionService;
import org.simpleflatmapper.reflect.meta.ClassMeta;
import org.simpleflatmapper.test.beans.DbListObject;
import org.simpleflatmapper.test.map.SampleFieldKey;
import org.simpleflatmapper.test.map.SampleFieldKeyMapperKeyComparator;
import org.simpleflatmapper.map.SetRowMapper;
import org.simpleflatmapper.map.error.RethrowConsumerErrorHandler;
import org.simpleflatmapper.map.mapper.DynamicSetRowMapper;
import org.simpleflatmapper.map.mapper.MapperKey;
import org.simpleflatmapper.map.mapper.StaticSetRowMapper;
import org.simpleflatmapper.test.beans.DbObject;
import org.simpleflatmapper.util.ArrayEnumarable;
import org.simpleflatmapper.util.Enumarable;
import org.simpleflatmapper.util.ErrorHelper;
import org.simpleflatmapper.util.ListCollector;
import org.simpleflatmapper.util.UnaryFactory;
import org.simpleflatmapper.util.UnaryFactoryWithException;
import java.util.Iterator;
import java.util.List;
//IFJAVA8_START
import java.util.stream.Collectors;
//IFJAVA8_END
import static org.junit.Assert.*;
public class SetRowMapperTest {
public static final Object[][] ID_NAME_DATA = {{1l, "name1"}, {2l, "name2"}};
public static final Object[][] ID_NAME_EMAIL_DATA = {{1l, "name1", "email1"}, {2l, "name2", "email2"}};
public static final UnaryFactory<Object[][], Enumarable<Object[]>> ENUMARABLE_UNARY_FACTORY = new UnaryFactory<Object[][], Enumarable<Object[]>>() {
@Override
public Enumarable<Object[]> newInstance(Object[][] objects) {
return new ArrayEnumarable<Object[]>(objects);
}
};
public static final Mapper<Object[], DbObject> ID_NAME_MAPPER = new Mapper<Object[], DbObject>() {
@Override
public DbObject map(Object[] source) throws MappingException {
return map(source, null);
}
@Override
public DbObject map(Object[] source, MappingContext<? super Object[]> context) throws MappingException {
DbObject dbObject = new DbObject();
try {
mapTo(source, dbObject, null);
} catch (Exception e) {
ErrorHelper.rethrow(e);
}
return dbObject;
}
@Override
public void mapTo(Object[] source, DbObject target, MappingContext<? super Object[]> context) throws Exception {
target.setId((Long) source[0]);
target.setName((String) source[1]);
}
};
public static final Mapper<Object[], DbObject> ID_NAME_EMIL_MAPPER = new Mapper<Object[], DbObject>() {
@Override
public DbObject map(Object[] source) throws MappingException {
return map(source, null);
}
@Override
public DbObject map(Object[] source, MappingContext<? super Object[]> context) throws MappingException {
DbObject dbObject = new DbObject();
try {
mapTo(source, dbObject, null);
} catch (Exception e) {
ErrorHelper.rethrow(e);
}
return dbObject;
}
@Override
public void mapTo(Object[] source, DbObject target, MappingContext<? super Object[]> context) throws Exception {
target.setId((Long) source[0]);
target.setName((String) source[1]);
target.setEmail((String) source[2]);
}
};
public static final MapperKey<SampleFieldKey> ID_NAME_MAPPER_KEY = new MapperKey<SampleFieldKey>(new SampleFieldKey("id", 0), new SampleFieldKey("name", 1));
public static final MapperKey<SampleFieldKey> ID_NAME_EMAIL_MAPPER_KEY = new MapperKey<SampleFieldKey>(new SampleFieldKey("id", 0), new SampleFieldKey("name", 1), new SampleFieldKey("email", 2));
@Test
public void testStatic() throws Exception {
StaticSetRowMapper<Object[], Object[][], DbObject, RuntimeException> staticSetRowMapper =
new StaticSetRowMapper<Object[], Object[][], DbObject, RuntimeException>(ID_NAME_MAPPER,
RethrowConsumerErrorHandler.INSTANCE, MappingContext.EMPTY_FACTORY, ENUMARABLE_UNARY_FACTORY);
checkSetRowMapperIdName(staticSetRowMapper);
}
private void checkSetRowMapperIdName(SetRowMapper<Object[], Object[][], DbObject, RuntimeException> staticSetRowMapper) throws Exception {
checkIdNameResult(staticSetRowMapper.forEach(ID_NAME_DATA, new ListCollector<DbObject>()).getList());
checkIdNameResult(staticSetRowMapper.iterator(ID_NAME_DATA));
//IFJAVA8_START
checkIdNameResult(staticSetRowMapper.stream(ID_NAME_DATA).collect(Collectors.<DbObject>toList()));
//IFJAVA8_END
checkIdNameRow(1l, staticSetRowMapper.map(ID_NAME_DATA[0]));
checkIdNameRow(1l, staticSetRowMapper.map(ID_NAME_DATA[0], null));
DbObject d = new DbObject();
staticSetRowMapper.mapTo(ID_NAME_DATA[0], d, null);
checkIdNameRow(1l, d);
}
private void checkIdNameResult(Iterator<DbObject> it) {
assertTrue(it.hasNext());
checkIdNameRow(1l, it.next());
assertTrue(it.hasNext());
checkIdNameRow(2l, it.next());
assertFalse(it.hasNext());
}
private void checkIdNameResult(List<DbObject> list) {
assertEquals(2, list.size());
checkIdNameRow(1l, list.get(0));
checkIdNameRow(2l, list.get(1));
}
private void checkIdNameRow(long id, DbObject o) {
assertEquals(id, o.getId());
assertEquals("name" + id, o.getName());
assertNull(o.getEmail());
}
private void checkSetRowMapperIdNameEmail(SetRowMapper<Object[], Object[][], DbObject, RuntimeException> staticSetRowMapper) throws Exception {
checkIdNameEmailResult(staticSetRowMapper.forEach(ID_NAME_EMAIL_DATA, new ListCollector<DbObject>()).getList());
checkIdNameEmailResult(staticSetRowMapper.iterator(ID_NAME_EMAIL_DATA));
//IFJAVA8_START
checkIdNameEmailResult(staticSetRowMapper.stream(ID_NAME_EMAIL_DATA).collect(Collectors.<DbObject>toList()));
//IFJAVA8_END
checkIdNameEmailRow(1l, staticSetRowMapper.map(ID_NAME_EMAIL_DATA[0]));
checkIdNameEmailRow(1l, staticSetRowMapper.map(ID_NAME_EMAIL_DATA[0], null));
DbObject d = new DbObject();
staticSetRowMapper.mapTo(ID_NAME_EMAIL_DATA[0], d, null);
checkIdNameEmailRow(1l, d);
}
private void checkIdNameEmailResult(Iterator<DbObject> it) {
assertTrue(it.hasNext());
checkIdNameEmailRow(1l, it.next());
assertTrue(it.hasNext());
checkIdNameEmailRow(2l, it.next());
assertFalse(it.hasNext());
}
private void checkIdNameEmailResult(List<DbObject> list) {
assertEquals(2, list.size());
checkIdNameEmailRow(1l, list.get(0));
checkIdNameEmailRow(2l, list.get(1));
}
private void checkIdNameEmailRow(long id, DbObject o) {
assertEquals(id, o.getId());
assertEquals("name" + id, o.getName());
assertEquals("email" + id, o.getEmail());
}
@Test
public void testDynamic() throws Exception {
UnaryFactory<MapperKey<SampleFieldKey>, SetRowMapper<Object[], Object[][], DbObject, RuntimeException>> mapperFactory =
new UnaryFactory<MapperKey<SampleFieldKey>, SetRowMapper<Object[], Object[][], DbObject, RuntimeException>>() {
@Override
public SetRowMapper<Object[], Object[][], DbObject, RuntimeException> newInstance(MapperKey<SampleFieldKey> sampleFieldKeyMapperKey) {
Mapper<Object[], DbObject> mapper = sampleFieldKeyMapperKey.getColumns().length == 2 ? ID_NAME_MAPPER : ID_NAME_EMIL_MAPPER;
return new StaticSetRowMapper<Object[], Object[][], DbObject, RuntimeException>(mapper,
RethrowConsumerErrorHandler.INSTANCE, MappingContext.EMPTY_FACTORY, ENUMARABLE_UNARY_FACTORY);
}
};
UnaryFactoryWithException<Object[], MapperKey<SampleFieldKey>, RuntimeException> mapperKeyFromRow = new UnaryFactoryWithException<Object[], MapperKey<SampleFieldKey>, RuntimeException>() {
@Override
public MapperKey<SampleFieldKey> newInstance(Object[] objects) throws RuntimeException {
return objects.length == 2 ? ID_NAME_MAPPER_KEY : ID_NAME_EMAIL_MAPPER_KEY;
}
};
UnaryFactoryWithException<Object[][], MapperKey<SampleFieldKey>, RuntimeException> mapperKeyFromSet = new UnaryFactoryWithException<Object[][], MapperKey<SampleFieldKey>, RuntimeException>() {
@Override
public MapperKey<SampleFieldKey> newInstance(Object[][] objects) throws RuntimeException {
return objects[0].length == 2 ? ID_NAME_MAPPER_KEY : ID_NAME_EMAIL_MAPPER_KEY;
}
};
DynamicSetRowMapper<Object[], Object[][], DbObject, RuntimeException, SampleFieldKey> dynamicSetRowMapper =
new DynamicSetRowMapper<Object[], Object[][], DbObject, RuntimeException, SampleFieldKey>(mapperFactory, mapperKeyFromRow, mapperKeyFromSet, SampleFieldKeyMapperKeyComparator.INSTANCE);
checkSetRowMapperIdName(dynamicSetRowMapper);
checkSetRowMapperIdNameEmail(dynamicSetRowMapper);
}
}