THRIFT-5756 Run php tests in github actions
diff --git a/lib/php/test/Unit/JsonSerializeTest.php b/lib/php/test/Unit/JsonSerializeTest.php
new file mode 100644
index 0000000..9fdc3f3
--- /dev/null
+++ b/lib/php/test/Unit/JsonSerializeTest.php
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace Test\Thrift\Unit;
+
+use PHPUnit\Framework\TestCase;
+use stdClass;
+use Thrift\ClassLoader\ThriftClassLoader;
+
+/***
+ * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:json -r  --out ./Resources/packages/phpjs ./Resources/ThriftTest.thrift
+ */
+class JsonSerializeTest extends TestCase
+{
+    protected function setUp()
+    {
+        $loader = new ThriftClassLoader();
+        $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpjs');
+        $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpjs');
+        $loader->register();
+    }
+
+    public function testEmptyStruct()
+    {
+        $empty = new \ThriftTest\EmptyStruct(array('non_existing_key' => 'bar'));
+        $this->assertEquals(new stdClass(), json_decode(json_encode($empty)));
+    }
+
+    public function testStringsAndInts()
+    {
+        $input = array(
+            'string_thing' => 'foo',
+            'i64_thing' => 1234567890,
+        );
+        $xtruct = new \ThriftTest\Xtruct($input);
+
+        // Xtruct's 'i32_thing' and 'byte_thing' fields should not be present here!
+        $expected = new stdClass();
+        $expected->string_thing = $input['string_thing'];
+        $expected->i64_thing = $input['i64_thing'];
+        $this->assertEquals($expected, json_decode(json_encode($xtruct)));
+    }
+
+    public function testNestedStructs()
+    {
+        $xtruct2 = new \ThriftTest\Xtruct2(array(
+            'byte_thing' => 42,
+            'struct_thing' => new \ThriftTest\Xtruct(array(
+                'i32_thing' => 123456,
+            )),
+        ));
+
+        $expected = new stdClass();
+        $expected->byte_thing = $xtruct2->byte_thing;
+        $expected->struct_thing = new stdClass();
+        $expected->struct_thing->i32_thing = $xtruct2->struct_thing->i32_thing;
+        $this->assertEquals($expected, json_decode(json_encode($xtruct2)));
+    }
+
+    public function testInsanity()
+    {
+        $xinput = array('string_thing' => 'foo');
+        $xtruct = new \ThriftTest\Xtruct($xinput);
+        $insanity = new \ThriftTest\Insanity(array(
+            'xtructs' => array($xtruct, $xtruct, $xtruct)
+        ));
+        $expected = new stdClass();
+        $expected->xtructs = array((object)$xinput, (object)$xinput, (object)$xinput);
+        $this->assertEquals($expected, json_decode(json_encode($insanity)));
+    }
+
+    public function testNestedLists()
+    {
+        $bonk = new \ThriftTest\Bonk(array('message' => 'foo'));
+        $nested = new \ThriftTest\NestedListsBonk(array('bonk' => array(array(array($bonk)))));
+        $expected = new stdClass();
+        $expected->bonk = array(array(array((object)array('message' => 'foo'))));
+        $this->assertEquals($expected, json_decode(json_encode($nested)));
+    }
+
+    public function testMaps()
+    {
+        $intmap = new \ThriftTest\ThriftTest_testMap_args(['thing' => [0 => 'zero']]);
+        $emptymap = new \ThriftTest\ThriftTest_testMap_args([]);
+        $this->assertEquals('{"thing":{"0":"zero"}}', json_encode($intmap));
+        $this->assertEquals('{}', json_encode($emptymap));
+    }
+
+    public function testScalarTypes()
+    {
+        $b = new \ThriftTest\Bools(['im_true' => '1', 'im_false' => '0']);
+        $this->assertEquals('{"im_true":true,"im_false":false}', json_encode($b));
+        $s = new \ThriftTest\StructA(['s' => 42]);
+        $this->assertEquals('{"s":"42"}', json_encode($s));
+    }
+}