package spoon.test.serializable;
import org.junit.Test;
import spoon.reflect.code.CtStatement;
import spoon.reflect.declaration.CtPackage;
import spoon.reflect.declaration.CtType;
import spoon.reflect.factory.Factory;
import spoon.reflect.factory.FactoryImpl;
import spoon.support.DefaultCoreFactory;
import spoon.support.SerializationModelStreamer;
import spoon.support.StandardEnvironment;
import spoon.support.util.ByteSerialization;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static spoon.testing.utils.ModelUtils.build;
public class SerializableTest {
@Test
public void testSerialCtStatement() throws Exception {
Factory factory = new FactoryImpl(new DefaultCoreFactory(), new StandardEnvironment());
CtStatement sta2 = (factory).Code()
.createCodeSnippetStatement("String hello =\"t1\"; System.out.println(hello)").compile();
byte[] ser = ByteSerialization.serialize(sta2);
CtStatement des = (CtStatement) ByteSerialization.deserialize(ser);
String sigBef = sta2.getShortRepresentation();
String sigAf = des.getShortRepresentation();
CtType<?> typeBef = sta2.getParent(CtType.class);
assertNotNull(typeBef);
assertEquals(sigBef, sigAf);
des.setFactory(factory);
String toSBef = sta2.toString();
String toSgAf = des.toString();
assertEquals(toSBef, toSgAf);
CtType<?> typeDes = des.getParent(CtType.class);
assertNotNull(typeDes);
//After deserialization, getDeclaringType throws an exception
CtType<?> decl = typeDes.getDeclaringType();
assertNull(decl);
CtPackage parentOriginal = (CtPackage) typeBef.getParent();
CtPackage parentDeser = (CtPackage) typeDes.getParent();
assertEquals(CtPackage.TOP_LEVEL_PACKAGE_NAME,parentOriginal.getSimpleName());
assertEquals(CtPackage.TOP_LEVEL_PACKAGE_NAME,parentDeser.getSimpleName());
}
@Test
public void testSerialFile() throws Exception {
CtType<?> type = build("spoon.test.serializable", "Dummy");
byte[] ser = ByteSerialization.serialize(type);
CtType<?> des = (CtType<?>) ByteSerialization.deserialize(ser);
}
@Test
public void testSerializationModelStreamer() throws Exception {
Factory factory = build("spoon.test.serializable", "Dummy").getFactory();
ByteArrayOutputStream outstr = new ByteArrayOutputStream();
new SerializationModelStreamer().save(factory, outstr);
Factory loadedFactory = new SerializationModelStreamer().load(new ByteArrayInputStream(outstr.toByteArray()));
assertFalse(factory.Type().getAll().isEmpty());
assertFalse(loadedFactory.Type().getAll().isEmpty());
assertEquals(factory.getModel().getRootPackage(), loadedFactory.getModel().getRootPackage());
}
}