package org.javersion.json;
import static java.util.Arrays.asList;
import static org.hamcrest.Matchers.equalTo;
import static org.javersion.path.PropertyPath.ROOT;
import static org.javersion.path.PropertyPath.parse;
import static org.junit.Assert.assertThat;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.javersion.core.Persistent;
import org.javersion.path.PropertyPath;
import org.junit.Test;
import com.google.common.collect.ImmutableMap;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class JsonSerializerTest {
private Gson gson = new GsonBuilder().serializeNulls().create();
private JsonSerializer serializer = new JsonSerializer();
@Test
public void empty_object() {
Map<PropertyPath, Object> map = serializer.parse("{}").properties;
assertThat(map, equalTo(ImmutableMap.of(ROOT, Persistent.object())));
assertThat(serializer.serialize(map), equalTo("{}"));
}
@Test
public void type_field() {
Map<PropertyPath, Object> map = serializer.parse(toJson(map("_type", "MyType"))).properties;
assertThat(map, equalTo(ImmutableMap.of(ROOT, Persistent.object("MyType"))));
assertThat(serializer.serialize(map), equalTo("{\"_type\":\"MyType\"}"));
}
@Test
public void sparse_list() {
Map<PropertyPath, Object> map = ImmutableMap.of(parse(""), Persistent.array(), parse("[1]"), 1l, parse("[3]"), 3l);
assertThat(serializer.serialize(map), equalTo("[null,1,null,3]"));
}
@Test
public void object_with_primitive_properties() {
final String json = toJson(map());
assertSerializationRoundTrip(json);
}
private Map<String, Object> map() {
return map("boolean", true, "nil", null, "number", 123, "string", "str");
}
@Test
public void array_with_primitive_properties() {
final String json = toJson(array());
assertSerializationRoundTrip(json);
}
private List<? extends Serializable> array() {
return asList("str", 123, true, null);
}
@Test
public void empty_array() {
Map<PropertyPath, Object> map = serializer.parse("[]").properties;
assertThat(map, equalTo(ImmutableMap.of(ROOT, Persistent.array())));
assertThat(serializer.serialize(map), equalTo("[]"));
}
@Test
public void nested_structure() {
final String json = toJson(asList("str", 123, map(), true, array(), null, asList(asList(map(), array()))));
assertSerializationRoundTrip(json);
}
private void assertSerializationRoundTrip(String json) {
Map<PropertyPath, Object> map = serializer.parse(json).properties;
assertThat(serializer.serialize(map), equalTo(json));
}
private String toJson(Object src) {
return gson.toJson(src);
}
private static Map<String, Object> map(Object... keysAndValues) {
Map<String, Object> map = new LinkedHashMap<>();
for (int i=0; i < keysAndValues.length; i+=2) {
map.put(String.valueOf(keysAndValues[i]), keysAndValues[i+1]);
}
return map;
}
}