package org.dayatang.utils.serializer;
import com.google.gson.*;
import org.dayatang.utils.DateUtils;
import org.dayatang.utils.support.Dictionary;
import org.dayatang.utils.support.DictionaryCategory;
import org.dayatang.utils.support.DomainEventSub;
import org.dayatang.utils.support.DomainEventSubDto;
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNull;
/**
* Created by yyang on 14-9-14.
*/
public class GsonSerializerTest {
private GsonSerializerBuilder builder;
private GsonSerializer instance;
private DictionaryCategory category;
private Dictionary dictionary1;
private Dictionary dictionary2;
private DomainEventSub event;
@Before
public void setUp() throws Exception {
builder = new GsonSerializerBuilder().dateFormat("yyyy-MM-dd");
instance = builder.build();
Date occurredOn = DateUtils.date(2002, 4, 11);
event = new DomainEventSub(occurredOn, 1);
event.setId("anId");
event.setProp1("abc");
event.setTransientField("transient");
event.setLastModified(DateUtils.date(2002, 12, 11));
}
@Test
public void notSerializeNulls() throws Exception {
String result = "{\"prop1\":\"abc\",\"lastModified\":\"2002-12-11\",\"id\":\"anId\",\"occurredOn\":\"2002-04-11\",\"version\":1}";
assertThat(instance.serialize(event), is(result));
}
@Test
public void serializeNulls() {
instance = builder.serializeNulls().build();
String result = "{\"prop1\":\"abc\",\"prop2\":null,\"lastModified\":\"2002-12-11\",\"id\":\"anId\",\"occurredOn\":\"2002-04-11\",\"version\":1}";
assertThat(instance.serialize(event), is(result));
}
@Test
public void prettyPrinting() {
instance = builder.prettyPrinting().build();
String lineSeparator = System.getProperty("line.separator");
String result = String.format(
"{\n \"prop1\": \"abc\",\n \"lastModified\": \"2002-12-11\",\n \"id\": \"anId\",\n \"occurredOn\": \"2002-04-11\",\n \"version\": 1\n}",
lineSeparator, lineSeparator, lineSeparator, lineSeparator, lineSeparator);
assertThat(instance.serialize(event), is(result));
}
@Test
public void excludeFieldsNamed() throws Exception {
String result = "{\"prop1\":\"abc\",\"lastModified\":\"2002-12-11\",\"id\":\"anId\",\"version\":1}";
instance = builder.excludeFieldsNamed("occurredOn").build();
assertThat(instance.serialize(event), is(result));
}
@Test
public void excludeFieldsWithModifiers() {
instance = builder.excludeFieldsWithModifiers(Modifier.PROTECTED, Modifier.TRANSIENT).build();
String result = "{\"prop1\":\"abc\",\"id\":\"anId\",\"occurredOn\":\"2002-04-11\",\"version\":1}";
assertThat(instance.serialize(event), is(result));
}
@Test
public void deserialize() throws Exception {
String eventBody = "{\"prop1\":\"abc\",\"prop2\":null,\"lastModified\":\"2002-12-11\",\"id\":\"anId\",\"occurredOn\":\"2002-04-11\",\"version\":1}";
DomainEventSub result = instance.deserialize(eventBody, DomainEventSub.class);
assertThat(result.getOccurredOn(), is(event.getOccurredOn()));
assertThat(result.getProp1(), is(event.getProp1()));
assertThat(result.getVersion(), is(event.getVersion()));
assertNull(result.getProp2());
}
@Test
public void test() {
DictionaryCategory category = new DictionaryCategory();
category.setName("a category");
category.setSortOrder(1);
category.setId(3L);
Dictionary dictionary1 = new Dictionary("01", "男", category);
Dictionary dictionary2 = new Dictionary("01", "男", category);
Set<Dictionary> dictionaries = new HashSet<Dictionary>();
dictionaries.add(dictionary1);
dictionaries.add(dictionary2);
category.setDictionaries(dictionaries);
System.out.println(instance.serialize(category));
}
@Test
public void registerTypeAdapter() {
builder = builder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
@Override
public JsonElement serialize(Date source, Type typeOfSource, JsonSerializationContext context) {
return new JsonPrimitive(source.getTime());
}
});
instance = builder.build();
String result = "{\"prop1\":\"abc\",\"lastModified\":1039536000000,\"id\":\"anId\",\"occurredOn\":1018454400000,\"version\":1}";
assertThat(instance.serialize(event), is(result));
}
@Test
public void addSerializationExclusionStrategy() {
builder = builder.addSerializationExclusionStrategy(new FieldNameExclusionStrategy("occurredOn"));
String result = "{\"prop1\":\"abc\",\"lastModified\":\"2002-12-11\",\"id\":\"anId\",\"version\":1}";
instance = builder.build();
assertThat(instance.serialize(event), is(result));
}
@Test
public void addDeserializationExclusionStrategy() {
builder = builder.addDeserializationExclusionStrategy(new FieldNameExclusionStrategy("version"));
instance = builder.build();
String eventBody = "{\"prop1\":\"abc\",\"lastModified\":\"2002-12-11\",\"id\":\"anId\",\"occurredOn\":\"2002-04-11\",\"version\":100}";
DomainEventSub result = instance.deserialize(eventBody, DomainEventSub.class);
assertThat(result.getOccurredOn(), is(DateUtils.date(2002, 4, 11)));
assertThat(result.getLastModified(), is(DateUtils.date(2002, 12, 11)));
assertThat(result.getProp1(), is("abc"));
assertNull(result.getProp2());
assertThat(result.getId(), is("anId"));
assertThat(result.getVersion(), is(not(100)));
}
@Test
public void beanCopy() {
DomainEventSubDto dto = new DomainEventSubDto();
dto.setId("anId");
dto.setTransientField("transient");
dto.setOccurredOn("2002-04-11");
dto.setProp1("abc");
dto.setVersion("234");
DomainEventSub event = instance.deserialize(instance.serialize(dto), DomainEventSub.class);
assertThat(event.getId(), is("anId"));
assertThat(event.getOccurredOn(), is(DateUtils.date(2002, 4, 11)));
assertThat(event.getTransientField(), nullValue());
assertThat(event.getProp1(), is("abc"));
assertThat(event.getProp2(), nullValue());
assertThat(event.getVersion(), is(234));
}
private static class FieldNameExclusionStrategy implements ExclusionStrategy {
private List<String> fieldNames;
private FieldNameExclusionStrategy(String... fieldNames) {
this.fieldNames = Arrays.asList(fieldNames);
}
@Override
public boolean shouldSkipField(FieldAttributes fieldAttributes) {
return fieldNames.contains(fieldAttributes.getName());
}
@Override
public boolean shouldSkipClass(Class<?> aClass) {
return false;
}
}
}