package php.runtime.loader.dump;
import org.junit.Assert;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.runners.MethodSorters;
import php.runtime.common.Modifier;
import php.runtime.env.Context;
import php.runtime.env.Environment;
import php.runtime.Memory;
import php.runtime.reflection.ClassEntity;
import php.runtime.reflection.ConstantEntity;
import php.runtime.reflection.MethodEntity;
import php.runtime.reflection.PropertyEntity;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@RunWith(JUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ClassDumperTest {
private final Context context = new Context(new File("unknown"));
private final Environment environment = new Environment();
private final ClassDumper dumper = new ClassDumper(context, null, environment, true);
@Test
public void testBasic() throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
ClassEntity entity = new ClassEntity(context);
entity.setAbstract(true);
entity.setFinal(true);
entity.setId(1);
entity.setName("Foobar");
entity.setData(new byte[]{1,2,3,4});
dumper.save(entity, output);
ClassEntity copyEntity = dumper.load(new ByteArrayInputStream(output.toByteArray()));
Assert.assertEquals("Foobar", copyEntity.getName());
Assert.assertTrue(copyEntity.isAbstract());
Assert.assertTrue(copyEntity.isFinal());
Assert.assertArrayEquals(new byte[]{1,2,3,4}, copyEntity.getData());
}
@Test
public void testComplex() throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
final ClassEntity entity = new ClassEntity(context);
entity.setId(1);
entity.setName("Foobar");
entity.setData(new byte[]{1});
entity.addConstant(new ConstantEntity("const1", Memory.TRUE, true));
entity.addConstant(new ConstantEntity("const2", Memory.FALSE, true));
entity.addConstant(new ConstantEntity("const3", Memory.NULL, true));
entity.addProperty(new PropertyEntity(context){{
setName("prop1");
setStatic(true);
setDefaultValue(Memory.CONST_INT_3);
}});
entity.addProperty(new PropertyEntity(context) {{
setName("prop2");
setStatic(false);
setDefaultValue(Memory.CONST_INT_5);
}});
entity.addMethod(new MethodEntity(context) {{
setName("method1");
setModifier(Modifier.PUBLIC);
setClazz(entity);
}}, null);
dumper.save(entity, output);
ClassEntity copyEntity = dumper.load(new ByteArrayInputStream(output.toByteArray()));
Assert.assertEquals("Foobar", copyEntity.getName());
Assert.assertArrayEquals(new byte[]{1}, copyEntity.getData());
Assert.assertEquals(3, copyEntity.constants.size());
Assert.assertEquals(1, copyEntity.staticProperties.size());
Assert.assertEquals(1, copyEntity.properties.size());
Assert.assertEquals(1, copyEntity.getMethods().size());
Assert.assertEquals("const1", copyEntity.findConstant("const1").getName());
Assert.assertEquals("const2", copyEntity.findConstant("const2").getName());
Assert.assertEquals("const3", copyEntity.findConstant("const3").getName());
Assert.assertEquals("prop1", copyEntity.staticProperties.get("prop1").getName());
Assert.assertEquals("prop2", copyEntity.properties.get("prop2").getName());
Assert.assertEquals("method1", copyEntity.findMethod("method1").getName());
}
}