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.env.Environment; import php.runtime.env.TraceInfo; import php.runtime.lang.StdClass; import php.runtime.memory.ArrayMemory; import php.runtime.memory.ObjectMemory; import php.runtime.memory.output.serialization.Deserializer; @RunWith(JUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class DeserializerTest { private final Environment environment = new Environment(); private Memory unserialize(String value){ Deserializer deserializer = new Deserializer(environment, TraceInfo.UNKNOWN); return deserializer.read(value); } @Test public void testScalar(){ Assert.assertEquals(Memory.NULL, unserialize("N;")); // bool Assert.assertEquals(Memory.TRUE, unserialize("b:1;")); Assert.assertEquals(Memory.FALSE, unserialize("b:0;")); // long Assert.assertEquals(100500, unserialize("i:100500;").toLong()); Assert.assertEquals(Long.MAX_VALUE, unserialize("i:"+Long.MAX_VALUE+";").toLong()); Assert.assertEquals(Long.MIN_VALUE, unserialize("i:"+Long.MIN_VALUE+";").toLong()); // double Assert.assertEquals(3.14, unserialize("d:3.14;").toDouble(), 0.00000001); Assert.assertEquals(0.0, unserialize("d:0.0;").toDouble(), 0.00000001); // string Assert.assertEquals("foobar", unserialize("s:6:\"foobar\";").toString()); Assert.assertEquals("foo\nbar", unserialize("s:7:\"foo\nbar\";").toString()); Assert.assertEquals("foo\0bar", unserialize("s:7:\"foo\0bar\";").toString()); } @Test public void testArrays(){ Memory value = unserialize("a:0:{}"); Assert.assertTrue(value instanceof ArrayMemory); Assert.assertEquals(0, ((ArrayMemory) value).size()); value = unserialize("a:2:{i:0;i:100;i:1;i:500;}"); Assert.assertTrue(value instanceof ArrayMemory); Assert.assertEquals(2, ((ArrayMemory) value).size()); Assert.assertEquals(100, value.valueOfIndex(0).toLong()); Assert.assertEquals(500, value.valueOfIndex(1).toLong()); value = unserialize("a:2:{s:1:\"x\";i:100;s:1:\"y\";i:500;}"); Assert.assertTrue(value instanceof ArrayMemory); Assert.assertEquals(2, ((ArrayMemory) value).size()); Assert.assertEquals(100, value.valueOfIndex("x").toLong()); Assert.assertEquals(500, value.valueOfIndex("y").toLong()); value = unserialize("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;}}"); Assert.assertTrue(value instanceof ArrayMemory); Assert.assertEquals(2, ((ArrayMemory) value).size()); Assert.assertTrue(value.valueOfIndex(0).toValue() instanceof ArrayMemory); Assert.assertTrue(value.valueOfIndex(1).toValue() instanceof ArrayMemory); Assert.assertEquals(100, value.valueOfIndex(0).toValue(ArrayMemory.class).valueOfIndex(0).toLong()); Assert.assertEquals(500, value.valueOfIndex(0).toValue(ArrayMemory.class).valueOfIndex(1).toLong()); Assert.assertEquals(200, value.valueOfIndex(1).toValue(ArrayMemory.class).valueOfIndex(0).toLong()); Assert.assertEquals(600, value.valueOfIndex(1).toValue(ArrayMemory.class).valueOfIndex(1).toLong()); value = unserialize("a:2:{s:1:\"a\";s:4:\"test\";s:1:\"b\";N;}"); Assert.assertTrue(value instanceof ArrayMemory); Assert.assertEquals(2, ((ArrayMemory) value).size()); Assert.assertEquals("test", value.valueOfIndex("a").toString()); Assert.assertEquals(Memory.NULL, value.valueOfIndex("b").toValue()); } @Test public void testObjects(){ Memory value = unserialize("O:8:\"stdClass\":0:{}"); Assert.assertTrue(value instanceof ObjectMemory); Assert.assertTrue(value.toValue(ObjectMemory.class).value instanceof StdClass); Assert.assertEquals(0, value.toValue(ObjectMemory.class).getProperties().size()); value = unserialize("O:8:\"stdClass\":2:{s:1:\"x\";s:3:\"foo\";s:1:\"y\";s:3:\"bar\";}"); Assert.assertTrue(value instanceof ObjectMemory); Assert.assertTrue(value.toValue(ObjectMemory.class).value instanceof StdClass); Assert.assertEquals(2, value.toValue(ObjectMemory.class).getProperties().size()); Assert.assertEquals("foo", value.toValue(ObjectMemory.class).getProperties().valueOfIndex("x").toString()); Assert.assertEquals("bar", value.toValue(ObjectMemory.class).getProperties().valueOfIndex("y").toString()); } }