package php.runtime.memory.serialization;
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.Memory;
import php.runtime.common.collections.map.LinkedMap;
import php.runtime.env.Environment;
import php.runtime.env.TraceInfo;
import php.runtime.lang.StdClass;
import php.runtime.memory.*;
import php.runtime.memory.output.serialization.Serializer;
@RunWith(JUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SerializerTest {
private final Environment environment = new Environment();
private String serialize(Memory value){
StringBuilder sb = new StringBuilder();
Serializer serializer = new Serializer(environment, TraceInfo.UNKNOWN, sb);
serializer.write(value);
return sb.toString();
}
@Test
public void testScalar(){
// NULL, UNDEFINED
Assert.assertEquals("N;", serialize(Memory.NULL));
Assert.assertEquals("N;", serialize(Memory.UNDEFINED));
// LONG
Assert.assertEquals("i:100500;", serialize(LongMemory.valueOf(100500)));
Assert.assertEquals("i:"+Long.MAX_VALUE+";", serialize(LongMemory.valueOf(Long.MAX_VALUE)));
Assert.assertEquals("i:"+Long.MIN_VALUE+";", serialize(LongMemory.valueOf(Long.MIN_VALUE)));
// BOOL
Assert.assertEquals("b:1;", serialize(Memory.TRUE));
Assert.assertEquals("b:0;", serialize(Memory.FALSE));
// DOUBLE
Assert.assertEquals("d:3.14;", serialize(DoubleMemory.valueOf(3.14)));
Assert.assertEquals("d:0;", serialize(DoubleMemory.valueOf(0)));
// STRING
Assert.assertEquals("s:6:\"foobar\";", serialize(new StringMemory("foobar")));
Assert.assertEquals("s:7:\"foo\nbar\";", serialize(new StringMemory("foo\nbar")));
Assert.assertEquals("s:7:\"foo\0bar\";", serialize(new StringMemory("foo\0bar")));
Assert.assertEquals("s:7:\"foo\0bar\";", serialize(new StringBuilderMemory("foo\0bar")));
Assert.assertEquals("s:7:\"foo\0bar\";", serialize(new BinaryMemory("foo\0bar")));
}
@Test
public void testArrays(){
Assert.assertEquals("a:0:{}", serialize(new ArrayMemory()));
Assert.assertEquals("a:2:{i:0;i:100;i:1;i:500;}", serialize(new ArrayMemory(100, 500)));
Assert.assertEquals("a:2:{s:1:\"x\";i:100;s:1:\"y\";i:500;}", serialize(new ArrayMemory(new LinkedMap(){{
put("x", 100);
put("y", 500);
}})));
Assert.assertEquals("a:2:{i:0;a:2:{i:0;i:100;i:1;i:500;}i:1;a:2:{i:0;i:200;i:1;i:600;}}",
serialize(new ArrayMemory(new ArrayMemory(100, 500), new ArrayMemory(200, 600))));
}
@Test
public void testObjects(){
Assert.assertEquals("O:8:\"stdClass\":0:{}", serialize(new ObjectMemory(new StdClass(environment))));
StdClass stdClass = new StdClass(environment);
stdClass.getProperties().refOfIndex("x").assign("foo");
stdClass.getProperties().refOfIndex("y").assign("bar");
Assert.assertEquals("O:8:\"stdClass\":2:{s:1:\"x\";s:3:\"foo\";s:1:\"y\";s:3:\"bar\";}",
serialize(new ObjectMemory(stdClass)));
}
}