package org.develnext.jphp.zend.ext.json; import org.develnext.jphp.core.compiler.jvm.JvmCompilerCase; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import php.runtime.Memory; import php.runtime.env.CompileScope; import php.runtime.env.Environment; import php.runtime.lang.StdClass; import php.runtime.memory.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @RunWith(JUnit4.class) public class JsonFunctionsTest extends JvmCompilerCase { protected final Environment env = new Environment(newScope()); @Override protected CompileScope newScope() { CompileScope scope = super.newScope(); scope.registerExtension(new JsonExtension()); return scope; } @Test public void testScalarJsonEncode() { assertEquals("null", JsonFunctions.json_encode(Memory.NULL)); assertEquals("null", JsonFunctions.json_encode(Memory.UNDEFINED)); assertEquals("true", JsonFunctions.json_encode(Memory.TRUE)); assertEquals("false", JsonFunctions.json_encode(Memory.FALSE)); assertEquals("100500", JsonFunctions.json_encode(LongMemory.valueOf(100500))); assertEquals("100.5", JsonFunctions.json_encode(DoubleMemory.valueOf(100.500))); assertEquals("\"\"", JsonFunctions.json_encode(StringMemory.valueOf(""))); assertEquals("\"OK\"", JsonFunctions.json_encode(StringMemory.valueOf("OK"))); assertEquals("\"OK\"", JsonFunctions.json_encode(new StringBuilderMemory("OK"))); assertEquals("\"OK\"", JsonFunctions.json_encode(new BinaryMemory("OK"))); assertEquals("true", JsonFunctions.json_encode(new ReferenceMemory(Memory.TRUE))); } @Test public void testArrayJsonEncode() { // simple assertEquals("[1,2,3,4]", JsonFunctions.json_encode(new ArrayMemory(1,2,3,4))); assertEquals("[1,\"foo\",3.5,true]", JsonFunctions.json_encode(new ArrayMemory(1,"foo",3.5,true))); // nested assertEquals("[[1,2],[3,4],5]", JsonFunctions.json_encode(new ArrayMemory( new ArrayMemory(1,2), new ArrayMemory(3,4), 5 ))); } @Test public void testObjectJsonEncode() { assertEquals("{\"0\":100,\"1\":500}", JsonFunctions.json_encode( new ArrayMemory(100,500), JsonConstants.JSON_FORCE_OBJECT )); ArrayMemory array = new ArrayMemory(100, 500); array.put("x", new LongMemory(100500)); assertEquals("{\"0\":100,\"1\":500,\"x\":100500}", JsonFunctions.json_encode(array)); StdClass stdClass = new StdClass(env); stdClass.getProperties().put("x", new LongMemory(100)); stdClass.getProperties().put("y", new LongMemory(500)); stdClass.getProperties().put("\0*\0z", new LongMemory(100500)); assertEquals("{\"x\":100,\"y\":500}", JsonFunctions.json_encode(new ObjectMemory(stdClass))); } @Test public void testScalarJsonDecode() { assertEquals(Memory.TRUE, JsonFunctions.json_decode(env, "true")); assertEquals(Memory.FALSE, JsonFunctions.json_decode(env, "false")); assertEquals(Memory.NULL, JsonFunctions.json_decode(env, "null")); assertEquals(LongMemory.valueOf(5), JsonFunctions.json_decode(env, "5")); assertEquals(3.1, JsonFunctions.json_decode(env, "3.1").toDouble(), 0.00000001); assertEquals("foobar", JsonFunctions.json_decode(env, "\"foobar\"").toString()); } @Test public void testArrayJsonDecode() { Memory r = JsonFunctions.json_decode(env, "[1,2,3]"); assertTrue(r.isArray()); assertEquals(1, r.valueOfIndex(0).toLong()); assertEquals(2, r.valueOfIndex(1).toLong()); assertEquals(3, r.valueOfIndex(2).toLong()); assertEquals(3, r.toValue(ArrayMemory.class).size()); // nested r = JsonFunctions.json_decode(env, "[1,[2,3],[4,5]]"); assertTrue(r.isArray()); assertEquals(1, r.valueOfIndex(0).toLong()); assertTrue(r.valueOfIndex(1).isArray()); assertEquals(2, r.valueOfIndex(1).valueOfIndex(0).toLong()); assertEquals(3, r.valueOfIndex(1).valueOfIndex(1).toLong()); assertTrue(r.valueOfIndex(2).isArray()); assertEquals(4, r.valueOfIndex(2).valueOfIndex(0).toLong()); assertEquals(5, r.valueOfIndex(2).valueOfIndex(1).toLong()); assertEquals(3, r.toValue(ArrayMemory.class).size()); } @Test public void testObjectJsonDecode() { Memory r = JsonFunctions.json_decode(env, "{\"x\":100, \"y\":500}"); assertTrue(r.instanceOf(StdClass.class)); StdClass stdClass = r.toObject(StdClass.class); assertEquals(2, stdClass.getProperties().size()); assertEquals(100, stdClass.getProperties().valueOfIndex("x").toLong()); assertEquals(500, stdClass.getProperties().valueOfIndex("y").toLong()); } @Test public void testErrorJsonDecode() { Memory r = JsonFunctions.json_decode(env, "{\"x\":100"); assertEquals(Memory.NULL, r); assertEquals(JsonConstants.JSON_ERROR_SYNTAX, JsonFunctions.json_last_error(env)); } @Test public void testJsonSerializableJsonEncode() { check("json/json_serializable.php"); } @Test public void testBugs() { check("json/json_bug217.php"); } }