package org.deephacks.confit.serialization;
import com.google.common.collect.ImmutableMap;
import org.deephacks.confit.model.Bean;
import org.deephacks.confit.model.BeanId;
import org.deephacks.confit.serialization.ConfigTestData.Child;
import org.deephacks.confit.serialization.ConfigTestData.Grandfather;
import org.deephacks.confit.serialization.ConfigTestData.Parent;
import org.junit.Test;
import java.util.List;
import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals;
import static org.unitils.reflectionassert.ReflectionComparatorMode.LENIENT_ORDER;
public class BeanSerializationTest {
@Test
public void test_basic_serialization() {
Bean bean = ConfigTestData.getChild("bean").toBean();
byte[] data = bean.write();
Bean result = Bean.read(bean.getId(), data);
assertReflectionEquals(bean, result, LENIENT_ORDER);
}
@Test
public void test_single_level_reference_serialization() {
Parent parent = getParentWithReferences("parent");
Bean bean = parent.toBean();
removeBeanReferenceInstances(bean);
byte[] data = bean.write();
Bean result = Bean.read(bean.getId(), data);
assertReflectionEquals(bean, result, LENIENT_ORDER);
}
@Test
public void test_multi_level_reference_serialization() {
Parent p1 = getParentWithReferences("p1");
Parent p2 = getParentWithReferences("p2");
Grandfather g1 = ConfigTestData.getGrandfather("g1");
g1.add(p1, p2);
g1.setProp20(ImmutableMap.of("p1", p1, "p2", p2));
Bean bean = g1.toBean();
removeBeanReferenceInstances(bean);
byte[] data = bean.write();
Bean result = Bean.read(bean.getId(), data);
assertReflectionEquals(bean, result, LENIENT_ORDER);
}
private Parent getParentWithReferences(String instanceId) {
Child c1 = ConfigTestData.getChild("c1");
Child c2 = ConfigTestData.getChild("c2");
Parent parent = ConfigTestData.getParent(instanceId);
parent.add(c1, c2);
parent.setProp6(c2);
parent.setProp20(ImmutableMap.of("c1", c1, "c2", c2));
return parent;
}
/**
* Reading a serialized bean does not initialize it bean reference with an actual instance,
* and we need to remove these in order to do assertions.
*/
private void removeBeanReferenceInstances(Bean bean) {
for (String prop : bean.getReferenceNames()) {
List<BeanId> beanIds = bean.getReference(prop);
for (BeanId id : beanIds) {
id.setBean(null);
}
}
}
}