package com.alibaba.tamper;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
import com.alibaba.tamper.core.builder.BeanMappingBuilder;
import com.alibaba.tamper.core.config.BeanMappingConfigHelper;
import com.alibaba.tamper.core.config.BeanMappingConfigRespository;
import com.alibaba.tamper.object.NestedSrcMappingObject;
import com.alibaba.tamper.object.NestedTargetMappingObject;
import com.alibaba.tamper.object.SrcMappingObject;
import com.alibaba.tamper.object.TargetMappingObject;
import com.alibaba.tamper.process.convertor.StringAndDateConvertor.StringToDateDay;
/**
* 基于API构造mapping进行测试,更全面的测试
*
* @author jianghang 2011-6-22 下午01:51:19
*/
public class BeanMappingDymaicTest extends TestCase {
private static final String ONE = "one";
private static final String TWO = "two";
private static final String THREE = "three";
private static final String FOUR = "four";
private static final String ONE_OTHER = "oneOther";
private static final String TWO_OTHER = "twoOther";
private static final String THREE_OTHER = "threeOther";
private static final String FOUR_OTHER = "fourOther";
@Before
public void setUp() {
try {
// 清空下repository下的数据
TestUtils.setField(BeanMappingConfigHelper.getInstance(), "repository", new BeanMappingConfigRespository());
} catch (Exception e) {
Assert.fail();
}
}
@Test
public void testBehavior() {
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField(ONE, String.class), targetField(ONE_OTHER, String.class));
fields(srcField(TWO, String.class), targetField(TWO_OTHER, String.class));
fields(srcField(THREE, String.class), targetField(THREE_OTHER, String.class));
}
};
BeanMapping mapping = new BeanMapping(builder);
Map src = new HashMap();
src.put(ONE, null);// 测试null value
src.put(TWO, " "); // 测试emptyString
src.put(THREE, " ljh "); // 测试trimStrings
Map dest = new HashMap();
dest.put(ONE_OTHER, "ljh"); // 先设一个值,验证下是否有mapping
dest.put(TWO_OTHER, "ljh"); // 先设一个值,验证下是否有mapping
mapping.mapping(src, dest);
assertEquals(dest.get(ONE_OTHER), "ljh");
assertEquals(dest.get(TWO_OTHER), "ljh");
assertEquals(dest.get(THREE_OTHER), "ljh");
}
@Test
public void testNestedMapping() {// 测试嵌套mapping处理
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField(ONE, String.class), targetField(ONE_OTHER, BigInteger.class));
fields(srcField(TWO, BigInteger.class), targetField(TWO_OTHER, Integer.class));
fields(srcField(THREE, SrcMappingObject.class), targetField(THREE_OTHER, TargetMappingObject.class)).recursiveMapping(
true);
}
};
// 第二层mapping
BeanMappingBuilder nestedMapping = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(SrcMappingObject.class, TargetMappingObject.class);
fields(srcField("intValue"), targetField("intValue"));
fields(srcField("integerValue"), targetField("integerValue"));
fields(srcField("start"), targetField("start"));
fields(srcField("name"), targetField("targetName"));
fields(srcField("mapping"), targetField("mapping")).recursiveMapping(true);
}
};
// 第三层mapping
BeanMappingBuilder nextNestedMapping = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(NestedSrcMappingObject.class, NestedTargetMappingObject.class);
fields(srcField("name"), targetField("name"));
fields(srcField("bigDecimalValue"), targetField("value"));
}
};
BeanMappingConfigHelper.getInstance().register(nestedMapping);
BeanMappingConfigHelper.getInstance().register(nextNestedMapping);
BeanMapping mapping = new BeanMapping(builder);
Map src = new HashMap();
src.put(ONE, "10");
src.put(TWO, BigInteger.TEN);
SrcMappingObject srcRef = new SrcMappingObject();
srcRef.setIntegerValue(1);
srcRef.setIntValue(1);
srcRef.setName("ljh");
srcRef.setStart(true);
NestedSrcMappingObject nestedSrcRef = new NestedSrcMappingObject();
nestedSrcRef.setBigDecimalValue(BigDecimal.ONE);
nestedSrcRef.setName("ljh");
srcRef.setMapping(nestedSrcRef);
src.put(THREE, srcRef);
Map dest = new HashMap();
mapping.mapping(src, dest);
assertEquals(dest.get(ONE_OTHER), BigInteger.valueOf(10));
assertEquals(dest.get(TWO_OTHER), Integer.valueOf(10));
TargetMappingObject targetRef = (TargetMappingObject) dest.get(THREE_OTHER);
assertNotNull(targetRef.getMapping());
assertEquals(targetRef.getIntValue(), srcRef.getIntValue());
assertEquals(targetRef.getIntegerValue(), srcRef.getIntegerValue());
assertEquals(targetRef.getTargetName(), srcRef.getName());
assertEquals(targetRef.getMapping().getName(), srcRef.getMapping().getName());
assertEquals(targetRef.getMapping().getValue(), srcRef.getMapping().getBigDecimalValue().toString());
}
@Test
public void testAutoConvertor() {
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField(ONE, String.class), targetField(ONE_OTHER, BigInteger.class));
fields(srcField(TWO, BigInteger.class), targetField(TWO_OTHER, Integer.class));
fields(srcField(THREE, List.class), targetField(THREE_OTHER, Set.class));
}
};
BeanMapping mapping = new BeanMapping(builder);
Map src = new HashMap();
src.put(ONE, "10");
src.put(TWO, BigInteger.TEN);
Map nested = new HashMap();
nested.putAll(src);
src.put(THREE, Arrays.asList(nested));
Map dest = new HashMap();
mapping.mapping(src, dest);
assertEquals(dest.get(ONE_OTHER), BigInteger.TEN);
assertEquals(dest.get(TWO_OTHER), Integer.valueOf(10));
Set<Map> destNested = (Set) dest.get(THREE_OTHER);
Map destNestedMap = destNested.iterator().next();
// 验证下嵌套的属性,不会进行递归的mapping处理,所以不会出现ONE_OTHER属性
assertEquals(destNestedMap.get(ONE), "10");
assertEquals(destNestedMap.get(TWO), BigInteger.TEN);
}
@Test
public void testAliasConvertor() {
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField(ONE, String.class), targetField(ONE_OTHER, Date.class)).convertor("StringToDateDay");
fields(srcField(TWO, String.class), targetField(TWO_OTHER, Calendar.class)).convertor(
"StringToCalendarDay");
fields(srcField(THREE, Date.class), targetField(THREE_OTHER, String.class)).convertor("DateDayToString");
fields(srcField(FOUR, Calendar.class), targetField(FOUR_OTHER, String.class)).convertor(
"CalendarDayToString");
}
};
BeanMapping mapping = new BeanMapping(builder);
Map src = new HashMap();
src.put(ONE, "2011-10-01");
src.put(TWO, "2011-10-01");
Calendar dayCalendar = Calendar.getInstance();
dayCalendar.set(2011, 10 - 1, 01, 0, 0, 0);
dayCalendar.set(Calendar.MILLISECOND, 0);
Date dayDate = dayCalendar.getTime();
Calendar timeCalendar = Calendar.getInstance();
timeCalendar.set(2011, 10 - 1, 01, 23, 59, 59);
timeCalendar.set(Calendar.MILLISECOND, 0);
src.put(THREE, timeCalendar.getTime());
src.put(FOUR, timeCalendar);
Map dest = new HashMap();
mapping.mapping(src, dest);
assertEquals(((Date) dest.get(ONE_OTHER)).getTime(), dayDate.getTime());
assertEquals(((Calendar) dest.get(TWO_OTHER)).getTime().getTime(), dayCalendar.getTime().getTime());
assertEquals(dest.get(THREE_OTHER), "2011-10-01");
assertEquals(dest.get(FOUR_OTHER), "2011-10-01");
}
@Test
public void testConvertorClass() {
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField(ONE, String.class), targetField(ONE_OTHER, Date.class)).convertor(StringToDateDay.class);
}
};
BeanMapping mapping = new BeanMapping(builder);
Map src = new HashMap();
src.put(ONE, "2011-10-01");
Calendar dayCalendar = Calendar.getInstance();
dayCalendar.set(2011, 10 - 1, 01, 0, 0, 0);
dayCalendar.set(Calendar.MILLISECOND, 0);
Date dayDate = dayCalendar.getTime();
Map dest = new HashMap();
mapping.mapping(src, dest);
assertEquals(((Date) dest.get(ONE_OTHER)).getTime(), dayDate.getTime());
}
@Test
public void testDefaultValue() {
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField(ONE, String.class), targetField(ONE_OTHER, Date.class)).defaultValue("2011-10-01").convertor(
"StringToDateDay");
fields(srcField(TWO, BigInteger.class), targetField(TWO_OTHER, Integer.class)).defaultValue("10");
}
};
BeanMapping mapping = new BeanMapping(builder);
Map src = new HashMap(); // 不设置任何记录
Map dest = new HashMap();
Calendar dayCalendar = Calendar.getInstance();
dayCalendar.set(2011, 10 - 1, 01, 0, 0, 0);
dayCalendar.set(Calendar.MILLISECOND, 0);
Date dayDate = dayCalendar.getTime();
mapping.mapping(src, dest);
assertEquals(((Date) dest.get(ONE_OTHER)).getTime(), dayDate.getTime());
assertEquals(dest.get(TWO_OTHER), Integer.valueOf(10));
}
@Test
public void testFieldNoMethod() { // 测试下属性没有对应的方法
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField("intValue"), targetField(ONE_OTHER, String.class));
fields(srcField("integerValue"), targetField(TWO_OTHER, String.class));
fields(srcField("bigDecimalValue"), targetField(THREE_OTHER, String.class));
}
};
BeanMapping mapping = new BeanMapping(builder);
Map dest = new HashMap();
mapping.mapping(new NoMethodBean(), dest);
assertEquals(dest.get(ONE_OTHER), "10");
assertEquals(dest.get(TWO_OTHER), "10");
assertEquals(dest.get(THREE_OTHER), "10");
}
@Test
public void testThisSymbol() { // 测试下this的特殊属性
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField("intValue"), targetField(ONE_OTHER, String.class));
fields(srcField("integerValue"), targetField(TWO_OTHER, String.class));
fields(srcField("bigDecimalValue"), targetField(THREE_OTHER, String.class));
fields(srcField("this"), targetField(FOUR_OTHER));
}
};
BeanMapping mapping = new BeanMapping(builder);
Map dest = new HashMap();
mapping.mapping(new NoMethodBean(), dest);
assertEquals(dest.get(ONE_OTHER), "10");
assertEquals(dest.get(TWO_OTHER), "10");
assertEquals(dest.get(THREE_OTHER), "10");
assertEquals(dest.get(FOUR_OTHER).getClass(), NoMethodBean.class);
}
@Test
public void testNullSymbol() { // 测试下null的特殊属性
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField("null"), targetField(ONE_OTHER, String.class)).defaultValue("10");
}
};
BeanMapping mapping = new BeanMapping(builder);
Map dest = new HashMap();
mapping.mapping(new HashMap(), dest);
assertEquals(dest.get(ONE_OTHER), "10");
}
@Test
public void testCollectionNestedMapping() { // 测试下collection的mapping
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为
mapping(HashMap.class, HashMap.class);
fields(srcField(ONE),
targetField(ONE_OTHER, ArrayList.class).componentClasses(NestedTargetMappingObject.class));
fields(srcField(TWO),
targetField(TWO_OTHER, HashSet.class).componentClasses(NestedTargetMappingObject.class));
fields(srcField(THREE), targetField(THREE_OTHER, HashMap[].class).componentClasses(HashMap.class));
}
};
// 第二层mapping
BeanMappingBuilder nextNestedMapping = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(NestedSrcMappingObject.class, NestedTargetMappingObject.class);
fields(srcField("name"), targetField("name"));
fields(srcField("bigDecimalValue"), targetField("value"));
}
};
BeanMappingConfigHelper.getInstance().register(nextNestedMapping);
BeanMapping mapping = new BeanMapping(builder);
Map src = new HashMap();
HashMap[] mapArray = new HashMap[1];
Map arrayNested = new HashMap();
arrayNested.put("name", "ljh");
arrayNested.put("value", "10");
mapArray[0] = (HashMap) arrayNested;
src.put(ONE, mapArray);
List<NestedSrcMappingObject> objectList = new ArrayList<NestedSrcMappingObject>();
NestedSrcMappingObject listNested = new NestedSrcMappingObject();
listNested.setBigDecimalValue(BigDecimal.TEN);
listNested.setName("ljh");
objectList.add(listNested);
src.put(TWO, objectList);
Set<NestedSrcMappingObject> objectSet = new HashSet<NestedSrcMappingObject>();
NestedSrcMappingObject setNested = new NestedSrcMappingObject();
setNested.setBigDecimalValue(BigDecimal.TEN);
setNested.setName("ljh");
objectSet.add(listNested);
src.put(THREE, objectSet);
Map dest = new HashMap();
mapping.mapping(src, dest);
List<NestedTargetMappingObject> list = (List) dest.get(ONE_OTHER);
Set<NestedTargetMappingObject> set = (Set) dest.get(TWO_OTHER);
HashMap[] array = (HashMap[]) dest.get(THREE_OTHER);
assertEquals(list.get(0).getName(), "ljh");
assertEquals(list.get(0).getValue(), "10");
NestedTargetMappingObject obj = set.iterator().next();
assertEquals(obj.getName(), "ljh");
assertEquals(obj.getValue(), "10");
assertEquals(array[0].get("name"), "ljh");
assertEquals(array[0].get("bigDecimalValue"), BigDecimal.TEN);
}
public static class NoMethodBean {
private int intValue;
protected Integer integerValue;
public BigDecimal bigDecimalValue;
public NoMethodBean(){
intValue = 10;
integerValue = Integer.valueOf(10);
bigDecimalValue = BigDecimal.TEN;
}
public int getIntValue() {
return intValue;
}
}
}