aboutsummaryrefslogtreecommitdiffhomepage
path: root/php/tests
diff options
context:
space:
mode:
authorGravatar Paul Yang <TeBoring@users.noreply.github.com>2016-09-15 11:09:01 -0700
committerGravatar GitHub <noreply@github.com>2016-09-15 11:09:01 -0700
commite0e54661f76183684dca66694967a60cbb10f04e (patch)
tree0a2a20f984705fdf6ef13de8829901b80f88efb5 /php/tests
parent86fcd879b38505446799b2f2a2929415ddad620a (diff)
Check in php implementation. (#2052)
This pull request includes two implementation: C extension and PHP package. Both implementations support encode/decode of singular, repeated and map fields.
Diffstat (limited to 'php/tests')
-rw-r--r--php/tests/array_test.php888
-rw-r--r--php/tests/autoload.php4
-rw-r--r--php/tests/encode_decode_test.php136
-rw-r--r--php/tests/generated_class_test.php557
-rw-r--r--php/tests/map_field_test.php648
-rw-r--r--php/tests/memory_leak_test.php73
-rw-r--r--php/tests/php_implementation_test.php443
-rw-r--r--php/tests/test.pb.php1385
-rw-r--r--php/tests/test.proto136
-rwxr-xr-xphp/tests/test.sh23
-rw-r--r--php/tests/test_base.php92
-rw-r--r--php/tests/test_include.pb.php36
-rw-r--r--php/tests/test_util.php393
13 files changed, 4810 insertions, 4 deletions
diff --git a/php/tests/array_test.php b/php/tests/array_test.php
new file mode 100644
index 00000000..d683add5
--- /dev/null
+++ b/php/tests/array_test.php
@@ -0,0 +1,888 @@
+<?php
+
+require_once('test.pb.php');
+require_once('test_util.php');
+
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBType;
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+
+class RepeatedFieldTest extends PHPUnit_Framework_TestCase
+{
+
+ #########################################################
+ # Test int32 field.
+ #########################################################
+
+ public function testInt32()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+
+ // Test append.
+ $arr []= MAX_INT32;
+ $this->assertSame(MAX_INT32, $arr[0]);
+ $arr []= MIN_INT32;
+ $this->assertSame(MIN_INT32, $arr[1]);
+
+ $arr []= 1.1;
+ $this->assertSame(1, $arr[2]);
+ $arr []= MAX_INT32_FLOAT;
+ $this->assertSame(MAX_INT32, $arr[3]);
+ $arr []= MAX_INT32_FLOAT;
+ $this->assertSame(MAX_INT32, $arr[4]);
+
+ $arr []= '2';
+ $this->assertSame(2, $arr[5]);
+ $arr []= '3.1';
+ $this->assertSame(3, $arr[6]);
+ $arr []= MAX_INT32_STRING;
+ $this->assertSame(MAX_INT32, $arr[7]);
+
+ $this->assertEquals(8, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = 0;
+ $this->assertSame(0, $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= MAX_INT32;
+ $this->assertSame(MAX_INT32, $arr[0]);
+ $arr [1]= MIN_INT32;
+ $this->assertSame(MIN_INT32, $arr[1]);
+
+ $arr [2]= 1.1;
+ $this->assertSame(1, $arr[2]);
+ $arr [3]= MAX_INT32_FLOAT;
+ $this->assertSame(MAX_INT32, $arr[3]);
+ $arr [4]= MAX_INT32_FLOAT;
+ $this->assertSame(MAX_INT32, $arr[4]);
+
+ $arr [5]= '2';
+ $this->assertSame(2, $arr[5]);
+ $arr [6]= '3.1';
+ $this->assertSame(3, $arr[6]);
+ $arr [7]= MAX_INT32_STRING;
+ $this->assertSame(MAX_INT32, $arr[7]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32AppendStringFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr []= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32SetStringFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr []= 0;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32AppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32SetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr []= 0;
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test uint32 field.
+ #########################################################
+
+ public function testUint32()
+ {
+ $arr = new RepeatedField(GPBType::UINT32);
+
+ // Test append.
+ $arr []= MAX_UINT32;
+ $this->assertSame(-1, $arr[0]);
+ $arr []= -1;
+ $this->assertSame(-1, $arr[1]);
+ $arr []= MIN_UINT32;
+ $this->assertSame(MIN_UINT32, $arr[2]);
+
+ $arr []= 1.1;
+ $this->assertSame(1, $arr[3]);
+ $arr []= MAX_UINT32_FLOAT;
+ $this->assertSame(-1, $arr[4]);
+ $arr []= -1.0;
+ $this->assertSame(-1, $arr[5]);
+ $arr []= MIN_UINT32_FLOAT;
+ $this->assertSame(MIN_UINT32, $arr[6]);
+
+ $arr []= '2';
+ $this->assertSame(2, $arr[7]);
+ $arr []= '3.1';
+ $this->assertSame(3, $arr[8]);
+ $arr []= MAX_UINT32_STRING;
+ $this->assertSame(-1, $arr[9]);
+ $arr []= '-1.0';
+ $this->assertSame(-1, $arr[10]);
+ $arr []= MIN_UINT32_STRING;
+ $this->assertSame(MIN_UINT32, $arr[11]);
+
+ $this->assertEquals(12, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = 0;
+ $this->assertSame(0, $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= MAX_UINT32;
+ $this->assertSame(-1, $arr[0]);
+ $arr [1]= -1;
+ $this->assertSame(-1, $arr[1]);
+ $arr [2]= MIN_UINT32;
+ $this->assertSame(MIN_UINT32, $arr[2]);
+
+ $arr [3]= 1.1;
+ $this->assertSame(1, $arr[3]);
+ $arr [4]= MAX_UINT32_FLOAT;
+ $this->assertSame(-1, $arr[4]);
+ $arr [5]= -1.0;
+ $this->assertSame(-1, $arr[5]);
+ $arr [6]= MIN_UINT32_FLOAT;
+ $this->assertSame(MIN_UINT32, $arr[6]);
+
+ $arr [7]= '2';
+ $this->assertSame(2, $arr[7]);
+ $arr [8]= '3.1';
+ $this->assertSame(3, $arr[8]);
+ $arr [9]= MAX_UINT32_STRING;
+ $this->assertSame(-1, $arr[9]);
+ $arr [10]= '-1.0';
+ $this->assertSame(-1, $arr[10]);
+ $arr [11]= MIN_UINT32_STRING;
+ $this->assertSame(MIN_UINT32, $arr[11]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32AppendStringFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT32);
+ $arr []= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32SetStringFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT32);
+ $arr []= 0;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32AppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT32);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32SetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT32);
+ $arr []= 0;
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test int64 field.
+ #########################################################
+
+ public function testInt64()
+ {
+ $arr = new RepeatedField(GPBType::INT64);
+
+ // Test append.
+ $arr []= MAX_INT64;
+ $this->assertSame(MAX_INT64, $arr[0]);
+ $arr []= MIN_INT64;
+ $this->assertEquals(MIN_INT64, $arr[1]);
+
+ $arr []= 1.1;
+ $this->assertSame(1, $arr[2]);
+
+ $arr []= '2';
+ $this->assertSame(2, $arr[3]);
+ $arr []= '3.1';
+ $this->assertSame(3, $arr[4]);
+ $arr []= MAX_INT64_STRING;
+ $this->assertSame(MAX_INT64, $arr[5]);
+ $arr []= MIN_INT64_STRING;
+ $this->assertEquals(MIN_INT64, $arr[6]);
+
+ $this->assertEquals(7, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = 0;
+ $this->assertSame(0, $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= MAX_INT64;
+ $this->assertSame(MAX_INT64, $arr[0]);
+ $arr [1]= MIN_INT64;
+ $this->assertEquals(MIN_INT64, $arr[1]);
+
+ $arr [2]= 1.1;
+ $this->assertSame(1, $arr[2]);
+
+ $arr [3]= '2';
+ $this->assertSame(2, $arr[3]);
+ $arr [4]= '3.1';
+ $this->assertSame(3, $arr[4]);
+ $arr [5]= MAX_INT64_STRING;
+ $this->assertSame(MAX_INT64, $arr[5]);
+ $arr [6]= MIN_INT64_STRING;
+ $this->assertEquals(MIN_INT64, $arr[6]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64AppendStringFail()
+ {
+ $arr = new RepeatedField(GPBType::INT64);
+ $arr []= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64SetStringFail()
+ {
+ $arr = new RepeatedField(GPBType::INT64);
+ $arr []= 0;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64AppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::INT64);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64SetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::INT64);
+ $arr []= 0;
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test uint64 field.
+ #########################################################
+
+ public function testUint64()
+ {
+ $arr = new RepeatedField(GPBType::UINT64);
+
+ // Test append.
+ $arr []= MAX_UINT64;
+ $this->assertEquals(MAX_UINT64, $arr[0]);
+
+ $arr []= 1.1;
+ $this->assertSame(1, $arr[1]);
+
+ $arr []= '2';
+ $this->assertSame(2, $arr[2]);
+ $arr []= '3.1';
+ $this->assertSame(3, $arr[3]);
+ $arr []= MAX_UINT64_STRING;
+ $this->assertEquals(MAX_UINT64, $arr[4]);
+
+ $this->assertEquals(5, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = 0;
+ $this->assertSame(0, $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= MAX_UINT64;
+ $this->assertEquals(MAX_UINT64, $arr[0]);
+
+ $arr [1]= 1.1;
+ $this->assertSame(1, $arr[1]);
+
+ $arr [2]= '2';
+ $this->assertSame(2, $arr[2]);
+ $arr [3]= '3.1';
+ $this->assertSame(3, $arr[3]);
+ $arr [4]= MAX_UINT64_STRING;
+ $this->assertEquals(MAX_UINT64, $arr[4]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64AppendStringFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT64);
+ $arr []= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64SetStringFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT64);
+ $arr []= 0;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64AppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT64);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64SetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::UINT64);
+ $arr []= 0;
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test float field.
+ #########################################################
+
+ public function testFloat()
+ {
+ $arr = new RepeatedField(GPBType::FLOAT);
+
+ // Test append.
+ $arr []= 1;
+ $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
+
+ $arr []= 1.1;
+ $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
+
+ $arr []= '2';
+ $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
+ $arr []= '3.1';
+ $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
+
+ $this->assertEquals(4, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = 0;
+ $this->assertSame(0.0, $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= 1;
+ $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
+
+ $arr [1]= 1.1;
+ $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
+
+ $arr [2]= '2';
+ $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
+ $arr [3]= '3.1';
+ $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatAppendStringFail()
+ {
+ $arr = new RepeatedField(GPBType::FLOAT);
+ $arr []= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatSetStringFail()
+ {
+ $arr = new RepeatedField(GPBType::FLOAT);
+ $arr []= 0.0;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatAppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::FLOAT);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatSetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::FLOAT);
+ $arr []= 0.0;
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test double field.
+ #########################################################
+
+ public function testDouble()
+ {
+ $arr = new RepeatedField(GPBType::DOUBLE);
+
+ // Test append.
+ $arr []= 1;
+ $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
+
+ $arr []= 1.1;
+ $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
+
+ $arr []= '2';
+ $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
+ $arr []= '3.1';
+ $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
+
+ $this->assertEquals(4, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = 0;
+ $this->assertSame(0.0, $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= 1;
+ $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
+
+ $arr [1]= 1.1;
+ $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
+
+ $arr [2]= '2';
+ $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
+ $arr [3]= '3.1';
+ $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleAppendStringFail()
+ {
+ $arr = new RepeatedField(GPBType::DOUBLE);
+ $arr []= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleSetStringFail()
+ {
+ $arr = new RepeatedField(GPBType::DOUBLE);
+ $arr []= 0.0;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleAppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::DOUBLE);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleSetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::DOUBLE);
+ $arr []= 0.0;
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test bool field.
+ #########################################################
+
+ public function testBool()
+ {
+ $arr = new RepeatedField(GPBType::BOOL);
+
+ // Test append.
+ $arr []= true;
+ $this->assertSame(true, $arr[0]);
+
+ $arr []= -1;
+ $this->assertSame(true, $arr[1]);
+
+ $arr []= 1.1;
+ $this->assertSame(true, $arr[2]);
+
+ $arr []= '';
+ $this->assertSame(false, $arr[3]);
+
+ $this->assertEquals(4, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = 0;
+ $this->assertSame(false, $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= true;
+ $this->assertSame(true, $arr[0]);
+
+ $arr [1]= -1;
+ $this->assertSame(true, $arr[1]);
+
+ $arr [2]= 1.1;
+ $this->assertSame(true, $arr[2]);
+
+ $arr [3]= '';
+ $this->assertSame(false, $arr[3]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testBoolAppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::BOOL);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testBoolSetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::BOOL);
+ $arr []= true;
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test string field.
+ #########################################################
+
+ public function testString()
+ {
+ $arr = new RepeatedField(GPBType::STRING);
+
+ // Test append.
+ $arr []= 'abc';
+ $this->assertSame('abc', $arr[0]);
+
+ $arr []= 1;
+ $this->assertSame('1', $arr[1]);
+
+ $arr []= 1.1;
+ $this->assertSame('1.1', $arr[2]);
+
+ $arr []= true;
+ $this->assertSame('1', $arr[3]);
+
+ $this->assertEquals(4, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = '';
+ $this->assertSame('', $arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= 'abc';
+ $this->assertSame('abc', $arr[0]);
+
+ $arr [1]= 1;
+ $this->assertSame('1', $arr[1]);
+
+ $arr [2]= 1.1;
+ $this->assertSame('1.1', $arr[2]);
+
+ $arr [3]= true;
+ $this->assertSame('1', $arr[3]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringAppendMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::STRING);
+ $arr []= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringSetMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::STRING);
+ $arr []= 'abc';
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringAppendInvalidUTF8Fail()
+ {
+ $arr = new RepeatedField(GPBType::STRING);
+ $hex = hex2bin("ff");
+ $arr []= $hex;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringSetInvalidUTF8Fail()
+ {
+ $arr = new RepeatedField(GPBType::STRING);
+ $arr []= 'abc';
+ $hex = hex2bin("ff");
+ $arr [0]= $hex;
+ }
+
+ #########################################################
+ # Test message field.
+ #########################################################
+
+ public function testMessage()
+ {
+ $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
+
+ // Test append.
+ $sub_m = new TestMessage_Sub();
+ $sub_m->setA(1);
+ $arr []= $sub_m;
+ $this->assertSame(1, $arr[0]->getA());
+
+ $null = null;
+ $arr []= $null;
+ $this->assertNull($arr[1]);
+
+ $this->assertEquals(2, count($arr));
+
+ for ($i = 0; $i < count($arr); $i++) {
+ $arr[$i] = $null;
+ $this->assertNull($arr[$i]);
+ }
+
+ // Test set.
+ $arr [0]= $sub_m;
+ $this->assertSame(1, $arr[0]->getA());
+
+ $arr [1]= $null;
+ $this->assertNull($arr[1]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageAppendIntFail()
+ {
+ $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
+ $arr []= 1;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageSetIntFail()
+ {
+ $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
+ $arr []= new TestMessage_Sub;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageAppendStringFail()
+ {
+ $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
+ $arr []= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageSetStringFail()
+ {
+ $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
+ $arr []= new TestMessage_Sub;
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageAppendOtherMessageFail()
+ {
+ $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
+ $arr []= new TestMessage;
+ }
+
+ #########################################################
+ # Test offset type
+ #########################################################
+
+ public function testOffset()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr []= 0;
+
+ $arr [0]= 1;
+ $this->assertSame(1, $arr[0]);
+ $this->assertSame(1, count($arr));
+
+ $arr ['0']= 2;
+ $this->assertSame(2, $arr['0']);
+ $this->assertSame(2, $arr[0]);
+ $this->assertSame(1, count($arr));
+
+ $arr [0.0]= 3;
+ $this->assertSame(3, $arr[0.0]);
+ $this->assertSame(1, count($arr));
+ }
+
+ public function testInsertRemoval()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+
+ $arr []= 0;
+ $arr []= 1;
+ $arr []= 2;
+ $this->assertSame(3, count($arr));
+
+ unset($arr[2]);
+ $this->assertSame(2, count($arr));
+ $this->assertSame(0, $arr[0]);
+ $this->assertSame(1, $arr[1]);
+
+ $arr [] = 3;
+ $this->assertSame(3, count($arr));
+ $this->assertSame(0, $arr[0]);
+ $this->assertSame(1, $arr[1]);
+ $this->assertSame(3, $arr[2]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testRemoveMiddleFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+
+ $arr []= 0;
+ $arr []= 1;
+ $arr []= 2;
+ $this->assertSame(3, count($arr));
+
+ unset($arr[1]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testRemoveEmptyFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+
+ unset($arr[0]);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageOffsetFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr []= 0;
+ $arr [new TestMessage_Sub()]= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringOffsetFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr []= 0;
+ $arr ['abc']= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testSetNonExistedOffsetFail()
+ {
+ $arr = new RepeatedField(GPBType::INT32);
+ $arr [0]= 0;
+ }
+
+ #########################################################
+ # Test memory leak
+ #########################################################
+
+ public function testCycleLeak()
+ {
+ $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
+ $arr []= new TestMessage;
+ $arr[0]->SetRepeatedRecursive($arr);
+
+ // Clean up memory before test.
+ gc_collect_cycles();
+ $start = memory_get_usage();
+ unset($arr);
+
+ // Explicitly trigger garbage collection.
+ gc_collect_cycles();
+
+ $end = memory_get_usage();
+ $this->assertLessThan($start, $end);
+ }
+}
diff --git a/php/tests/autoload.php b/php/tests/autoload.php
deleted file mode 100644
index af88ba01..00000000
--- a/php/tests/autoload.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-
-require_once('test.pb.php');
-require_once('test_util.php');
diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php
new file mode 100644
index 00000000..d07907c0
--- /dev/null
+++ b/php/tests/encode_decode_test.php
@@ -0,0 +1,136 @@
+<?php
+
+require_once('test.pb.php');
+require_once('test_base.php');
+require_once('test_util.php');
+
+use Google\Protobuf\RepeatedField;
+use Google\Protobuf\GPBType;
+use Foo\TestEnum;
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+use Foo\TestPackedMessage;
+use Foo\TestUnpackedMessage;
+
+class EncodeDecodeTest extends TestBase
+{
+
+ public function testEncode()
+ {
+ $from = new TestMessage();
+ $this->expectEmptyFields($from);
+ $this->setFields($from);
+ $this->expectFields($from);
+
+ $data = $from->encode();
+ $this->assertSame(TestUtil::getGoldenTestMessage(), $data);
+ }
+
+ public function testDecode()
+ {
+ $to = new TestMessage();
+ $to->decode(TestUtil::getGoldenTestMessage());
+ $this->expectFields($to);
+ }
+
+ public function testEncodeDecode()
+ {
+ $from = new TestMessage();
+ $this->expectEmptyFields($from);
+ $this->setFields($from);
+ $this->expectFields($from);
+
+ $data = $from->encode();
+
+ $to = new TestMessage();
+ $to->decode($data);
+ $this->expectFields($to);
+ }
+
+ public function testEncodeDecodeEmpty()
+ {
+ $from = new TestMessage();
+ $this->expectEmptyFields($from);
+
+ $data = $from->encode();
+
+ $to = new TestMessage();
+ $to->decode($data);
+ $this->expectEmptyFields($to);
+ }
+
+ public function testEncodeDecodeOneof()
+ {
+ $m = new TestMessage();
+
+ $m->setOneofInt32(1);
+ $data = $m->encode();
+ $n = new TestMessage();
+ $n->decode($data);
+ $this->assertSame(1, $n->getOneofInt32());
+
+ $m->setOneofFloat(2.0);
+ $data = $m->encode();
+ $n = new TestMessage();
+ $n->decode($data);
+ $this->assertSame(2.0, $n->getOneofFloat());
+
+ $m->setOneofString('abc');
+ $data = $m->encode();
+ $n = new TestMessage();
+ $n->decode($data);
+ $this->assertSame('abc', $n->getOneofString());
+
+ $sub_m = new TestMessage_Sub();
+ $sub_m->setA(1);
+ $m->setOneofMessage($sub_m);
+ $data = $m->encode();
+ $n = new TestMessage();
+ $n->decode($data);
+ $this->assertSame(1, $n->getOneofMessage()->getA());
+ }
+
+ public function testPackedEncode()
+ {
+ $from = new TestPackedMessage();
+ TestUtil::setTestPackedMessage($from);
+ $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
+ $from->encode());
+ }
+
+ public function testPackedDecodePacked()
+ {
+ $to = new TestPackedMessage();
+ $to->decode(TestUtil::getGoldenTestPackedMessage());
+ TestUtil::assertTestPackedMessage($to);
+ }
+
+ public function testPackedDecodeUnpacked()
+ {
+ $to = new TestPackedMessage();
+ $to->decode(TestUtil::getGoldenTestUnpackedMessage());
+ TestUtil::assertTestPackedMessage($to);
+ }
+
+ public function testUnpackedEncode()
+ {
+ $from = new TestUnpackedMessage();
+ TestUtil::setTestPackedMessage($from);
+ $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
+ $from->encode());
+ }
+
+ public function testUnpackedDecodePacked()
+ {
+ $to = new TestUnpackedMessage();
+ $to->decode(TestUtil::getGoldenTestPackedMessage());
+ TestUtil::assertTestPackedMessage($to);
+ }
+
+ public function testUnpackedDecodeUnpacked()
+ {
+ $to = new TestUnpackedMessage();
+ $to->decode(TestUtil::getGoldenTestUnpackedMessage());
+ TestUtil::assertTestPackedMessage($to);
+ }
+}
diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php
new file mode 100644
index 00000000..56466cae
--- /dev/null
+++ b/php/tests/generated_class_test.php
@@ -0,0 +1,557 @@
+<?php
+
+require_once('test.pb.php');
+require_once('test_util.php');
+
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBType;
+use Foo\TestEnum;
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+
+class GeneratedClassTest extends PHPUnit_Framework_TestCase
+{
+
+ #########################################################
+ # Test field accessors.
+ #########################################################
+
+ public function testSetterGetter()
+ {
+ $m = new TestMessage();
+ $m->setOptionalInt32(1);
+ $this->assertSame(1, $m->getOptionalInt32());
+ }
+
+ #########################################################
+ # Test int32 field.
+ #########################################################
+
+ public function testInt32Field()
+ {
+ $m = new TestMessage();
+
+ // Set integer.
+ $m->setOptionalInt32(MAX_INT32);
+ $this->assertSame(MAX_INT32, $m->getOptionalInt32());
+ $m->setOptionalInt32(MIN_INT32);
+ $this->assertSame(MIN_INT32, $m->getOptionalInt32());
+
+ // Set float.
+ $m->setOptionalInt32(1.1);
+ $this->assertSame(1, $m->getOptionalInt32());
+ $m->setOptionalInt32(MAX_INT32_FLOAT);
+ $this->assertSame(MAX_INT32, $m->getOptionalInt32());
+ $m->setOptionalInt32(MIN_INT32_FLOAT);
+ $this->assertSame(MIN_INT32, $m->getOptionalInt32());
+
+ // Set string.
+ $m->setOptionalInt32('2');
+ $this->assertSame(2, $m->getOptionalInt32());
+ $m->setOptionalInt32('3.1');
+ $this->assertSame(3, $m->getOptionalInt32());
+ $m->setOptionalInt32(MAX_INT32_STRING);
+ $this->assertSame(MAX_INT32, $m->getOptionalInt32());
+ $m->setOptionalInt32(MIN_INT32_STRING);
+ $this->assertSame(MIN_INT32, $m->getOptionalInt32());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32FieldInvalidTypeFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalInt32(new TestMessage());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32FieldInvalidStringFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalInt32('abc');
+ }
+
+ #########################################################
+ # Test uint32 field.
+ #########################################################
+
+ public function testUint32Field()
+ {
+ $m = new TestMessage();
+
+ // Set integer.
+ $m->setOptionalUint32(MAX_UINT32);
+ $this->assertSame(-1, $m->getOptionalUint32());
+ $m->setOptionalUint32(-1);
+ $this->assertSame(-1, $m->getOptionalUint32());
+ $m->setOptionalUint32(MIN_UINT32);
+ $this->assertSame(MIN_INT32, $m->getOptionalUint32());
+
+ // Set float.
+ $m->setOptionalUint32(1.1);
+ $this->assertSame(1, $m->getOptionalUint32());
+ $m->setOptionalUint32(MAX_UINT32_FLOAT);
+ $this->assertSame(-1, $m->getOptionalUint32());
+ $m->setOptionalUint32(-1.0);
+ $this->assertSame(-1, $m->getOptionalUint32());
+ $m->setOptionalUint32(MIN_UINT32_FLOAT);
+ $this->assertSame(MIN_INT32, $m->getOptionalUint32());
+
+ // Set string.
+ $m->setOptionalUint32('2');
+ $this->assertSame(2, $m->getOptionalUint32());
+ $m->setOptionalUint32('3.1');
+ $this->assertSame(3, $m->getOptionalUint32());
+ $m->setOptionalUint32(MAX_UINT32_STRING);
+ $this->assertSame(-1, $m->getOptionalUint32());
+ $m->setOptionalUint32('-1.0');
+ $this->assertSame(-1, $m->getOptionalUint32());
+ $m->setOptionalUint32(MIN_UINT32_STRING);
+ $this->assertSame(MIN_INT32, $m->getOptionalUint32());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32FieldInvalidTypeFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalUint32(new TestMessage());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32FieldInvalidStringFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalUint32('abc');
+ }
+
+ #########################################################
+ # Test int64 field.
+ #########################################################
+
+ public function testInt64Field()
+ {
+ $m = new TestMessage();
+
+ // Set integer.
+ $m->setOptionalInt64(MAX_INT64);
+ $this->assertSame(MAX_INT64, $m->getOptionalInt64());
+ $m->setOptionalInt64(MIN_INT64);
+ $this->assertEquals(MIN_INT64, $m->getOptionalInt64());
+
+ // Set float.
+ $m->setOptionalInt64(1.1);
+ $this->assertSame(1, $m->getOptionalInt64());
+
+ // Set string.
+ $m->setOptionalInt64('2');
+ $this->assertSame(2, $m->getOptionalInt64());
+ $m->setOptionalInt64('3.1');
+ $this->assertSame(3, $m->getOptionalInt64());
+ $m->setOptionalInt64(MAX_INT64_STRING);
+ $this->assertSame(MAX_INT64, $m->getOptionalInt64());
+ $m->setOptionalInt64(MIN_INT64_STRING);
+ $this->assertEquals(MIN_INT64, $m->getOptionalInt64());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64FieldInvalidTypeFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalInt64(new TestMessage());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64FieldInvalidStringFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalInt64('abc');
+ }
+
+ #########################################################
+ # Test uint64 field.
+ #########################################################
+
+ public function testUint64Field()
+ {
+ $m = new TestMessage();
+
+ // Set integer.
+ $m->setOptionalUint64(MAX_UINT64);
+ $this->assertEquals(MAX_UINT64, $m->getOptionalUint64());
+
+ // Set float.
+ $m->setOptionalUint64(1.1);
+ $this->assertSame(1, $m->getOptionalUint64());
+
+ // Set string.
+ $m->setOptionalUint64('2');
+ $this->assertSame(2, $m->getOptionalUint64());
+ $m->setOptionalUint64('3.1');
+ $this->assertSame(3, $m->getOptionalUint64());
+ $m->setOptionalUint64(MAX_UINT64_STRING);
+ $this->assertEquals(MAX_UINT64, $m->getOptionalUint64());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64FieldInvalidTypeFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalUint64(new TestMessage());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64FieldInvalidStringFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalUint64('abc');
+ }
+
+ #########################################################
+ # Test enum field.
+ #########################################################
+
+ public function testEnumField()
+ {
+ $m = new TestMessage();
+
+ // Set enum.
+ $m->setOptionalEnum(TestEnum::ONE);
+ $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
+
+ // Set integer.
+ $m->setOptionalEnum(1);
+ $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
+
+ // Set float.
+ $m->setOptionalEnum(1.1);
+ $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
+
+ // Set string.
+ $m->setOptionalEnum("1");
+ $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
+ }
+
+ #########################################################
+ # Test float field.
+ #########################################################
+
+ public function testFloatField()
+ {
+ $m = new TestMessage();
+
+ // Set integer.
+ $m->setOptionalFloat(1);
+ $this->assertEquals(1.0, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
+
+ // Set float.
+ $m->setOptionalFloat(1.1);
+ $this->assertEquals(1.1, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
+
+ // Set string.
+ $m->setOptionalFloat('2');
+ $this->assertEquals(2.0, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
+ $m->setOptionalFloat('3.1');
+ $this->assertEquals(3.1, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatFieldInvalidTypeFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalFloat(new TestMessage());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatFieldInvalidStringFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalFloat('abc');
+ }
+
+ #########################################################
+ # Test double field.
+ #########################################################
+
+ public function testDoubleField()
+ {
+ $m = new TestMessage();
+
+ // Set integer.
+ $m->setOptionalDouble(1);
+ $this->assertEquals(1.0, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
+
+ // Set float.
+ $m->setOptionalDouble(1.1);
+ $this->assertEquals(1.1, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
+
+ // Set string.
+ $m->setOptionalDouble('2');
+ $this->assertEquals(2.0, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
+ $m->setOptionalDouble('3.1');
+ $this->assertEquals(3.1, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleFieldInvalidTypeFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalDouble(new TestMessage());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleFieldInvalidStringFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalDouble('abc');
+ }
+
+ #########################################################
+ # Test bool field.
+ #########################################################
+
+ public function testBoolField()
+ {
+ $m = new TestMessage();
+
+ // Set bool.
+ $m->setOptionalBool(true);
+ $this->assertSame(true, $m->getOptionalBool());
+
+ // Set integer.
+ $m->setOptionalBool(-1);
+ $this->assertSame(true, $m->getOptionalBool());
+
+ // Set float.
+ $m->setOptionalBool(1.1);
+ $this->assertSame(true, $m->getOptionalBool());
+
+ // Set string.
+ $m->setOptionalBool('');
+ $this->assertSame(false, $m->getOptionalBool());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testBoolFieldInvalidStringFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalBool(new TestMessage());
+ }
+
+ #########################################################
+ # Test string field.
+ #########################################################
+
+ public function testStringField()
+ {
+ $m = new TestMessage();
+
+ // Set string.
+ $m->setOptionalString('abc');
+ $this->assertSame('abc', $m->getOptionalString());
+
+ // Set integer.
+ $m->setOptionalString(1);
+ $this->assertSame('1', $m->getOptionalString());
+
+ // Set double.
+ $m->setOptionalString(1.1);
+ $this->assertSame('1.1', $m->getOptionalString());
+
+ // Set bool.
+ $m->setOptionalString(true);
+ $this->assertSame('1', $m->getOptionalString());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringFieldInvalidUTF8Fail()
+ {
+ $m = new TestMessage();
+ $hex = hex2bin("ff");
+ $m->setOptionalString($hex);
+ }
+
+ #########################################################
+ # Test bytes field.
+ #########################################################
+
+ public function testBytesField()
+ {
+ $m = new TestMessage();
+
+ // Set string.
+ $m->setOptionalBytes('abc');
+ $this->assertSame('abc', $m->getOptionalBytes());
+
+ // Set integer.
+ $m->setOptionalBytes(1);
+ $this->assertSame('1', $m->getOptionalBytes());
+
+ // Set double.
+ $m->setOptionalBytes(1.1);
+ $this->assertSame('1.1', $m->getOptionalBytes());
+
+ // Set bool.
+ $m->setOptionalBytes(true);
+ $this->assertSame('1', $m->getOptionalBytes());
+ }
+
+ public function testBytesFieldInvalidUTF8Success()
+ {
+ $m = new TestMessage();
+ $hex = hex2bin("ff");
+ $m->setOptionalBytes($hex);
+ }
+
+ #########################################################
+ # Test message field.
+ #########################################################
+
+ public function testMessageField()
+ {
+ $m = new TestMessage();
+
+ $sub_m = new TestMessage_Sub();
+ $sub_m->setA(1);
+ $m->setOptionalMessage($sub_m);
+ $this->assertSame(1, $m->getOptionalMessage()->getA());
+
+ $null = null;
+ $m->setOptionalMessage($null);
+ $this->assertNull($m->getOptionalMessage());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageFieldWrongTypeFail()
+ {
+ $m = new TestMessage();
+ $a = 1;
+ $m->setOptionalMessage($a);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageFieldWrongClassFail()
+ {
+ $m = new TestMessage();
+ $m->setOptionalMessage(new TestMessage());
+ }
+
+ #########################################################
+ # Test repeated field.
+ #########################################################
+
+ public function testRepeatedField()
+ {
+ $m = new TestMessage();
+
+ $repeated_int32 = new RepeatedField(GPBType::INT32);
+ $m->setRepeatedInt32($repeated_int32);
+ $this->assertSame($repeated_int32, $m->getRepeatedInt32());
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testRepeatedFieldWrongTypeFail()
+ {
+ $m = new TestMessage();
+ $a = 1;
+ $m->setRepeatedInt32($a);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testRepeatedFieldWrongObjectFail()
+ {
+ $m = new TestMessage();
+ $m->setRepeatedInt32($m);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testRepeatedFieldWrongRepeatedTypeFail()
+ {
+ $m = new TestMessage();
+
+ $repeated_int32 = new RepeatedField(GPBType::UINT32);
+ $m->setRepeatedInt32($repeated_int32);
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testRepeatedFieldWrongRepeatedMessageClassFail()
+ {
+ $m = new TestMessage();
+
+ $repeated_message = new RepeatedField(GPBType::MESSAGE,
+ TestMessage::class);
+ $m->setRepeatedMessage($repeated_message);
+ }
+
+ #########################################################
+ # Test oneof field.
+ #########################################################
+
+ public function testOneofField() {
+ $m = new TestMessage();
+
+ $m->setOneofInt32(1);
+ $this->assertSame(1, $m->getOneofInt32());
+ $this->assertSame(0.0, $m->getOneofFloat());
+ $this->assertSame('', $m->getOneofString());
+ $this->assertSame(NULL, $m->getOneofMessage());
+
+ $m->setOneofFloat(2.0);
+ $this->assertSame(0, $m->getOneofInt32());
+ $this->assertSame(2.0, $m->getOneofFloat());
+ $this->assertSame('', $m->getOneofString());
+ $this->assertSame(NULL, $m->getOneofMessage());
+
+ $m->setOneofString('abc');
+ $this->assertSame(0, $m->getOneofInt32());
+ $this->assertSame(0.0, $m->getOneofFloat());
+ $this->assertSame('abc', $m->getOneofString());
+ $this->assertSame(NULL, $m->getOneofMessage());
+
+ $sub_m = new TestMessage_Sub();
+ $sub_m->setA(1);
+ $m->setOneofMessage($sub_m);
+ $this->assertSame(0, $m->getOneofInt32());
+ $this->assertSame(0.0, $m->getOneofFloat());
+ $this->assertSame('', $m->getOneofString());
+ $this->assertSame(1, $m->getOneofMessage()->getA());
+ }
+}
diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php
new file mode 100644
index 00000000..d79d0da3
--- /dev/null
+++ b/php/tests/map_field_test.php
@@ -0,0 +1,648 @@
+<?php
+
+require_once('test.pb.php');
+require_once('test_util.php');
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\MapField;
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+
+class MapFieldTest extends PHPUnit_Framework_TestCase {
+
+ #########################################################
+ # Test int32 field.
+ #########################################################
+
+ public function testInt32() {
+ $arr = new MapField(GPBType::INT32, GPBType::INT32);
+
+ // Test integer argument.
+ $arr[MAX_INT32] = MAX_INT32;
+ $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
+ $arr[MIN_INT32] = MIN_INT32;
+ $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
+ $this->assertEquals(2, count($arr));
+ $this->assertTrue(isset($arr[MAX_INT32]));
+ $this->assertTrue(isset($arr[MIN_INT32]));
+ unset($arr[MAX_INT32]);
+ unset($arr[MIN_INT32]);
+ $this->assertEquals(0, count($arr));
+
+ // Test float argument.
+ $arr[1.9] = 1.9;
+ $arr[2.1] = 2.1;
+ $this->assertSame(1, $arr[1]);
+ $this->assertSame(2, $arr[2]);
+ $arr[MAX_INT32_FLOAT] = MAX_INT32_FLOAT;
+ $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
+ $arr[MIN_INT32_FLOAT] = MIN_INT32_FLOAT;
+ $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
+ $this->assertEquals(4, count($arr));
+ unset($arr[1.9]);
+ unset($arr[2.9]);
+ unset($arr[MAX_INT32_FLOAT]);
+ unset($arr[MIN_INT32_FLOAT]);
+ $this->assertEquals(0, count($arr));
+
+ // Test string argument.
+ $arr['2'] = '2';
+ $this->assertSame(2, $arr[2]);
+ $arr['3.1'] = '3.1';
+ $this->assertSame(3, $arr[3]);
+ $arr[MAX_INT32_STRING] = MAX_INT32_STRING;
+ $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
+ $this->assertEquals(3, count($arr));
+ unset($arr['2']);
+ unset($arr['3.1']);
+ unset($arr[MAX_INT32_STRING]);
+ $this->assertEquals(0, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32SetStringKeyFail()
+ {
+ $arr = new MapField(GPBType::INT32, GPBType::INT32);
+ $arr ['abc']= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32SetStringValueFail()
+ {
+ $arr = new MapField(GPBType::INT32, GPBType::INT32);
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32SetMessageKeyFail()
+ {
+ $arr = new MapField(GPBType::INT32, GPBType::INT32);
+ $arr [new TestMessage_Sub()]= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt32SetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::INT32, GPBType::INT32);
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test uint32 field.
+ #########################################################
+
+ public function testUint32() {
+ $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
+
+ // Test integer argument.
+ $arr[MAX_UINT32] = MAX_UINT32;
+ $this->assertSame(-1, $arr[-1]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[MAX_UINT32]);
+ $this->assertEquals(0, count($arr));
+
+ $arr[-1] = -1;
+ $this->assertSame(-1, $arr[-1]);
+ $arr[MIN_UINT32] = MIN_UINT32;
+ $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
+ $this->assertEquals(2, count($arr));
+ unset($arr[-1]);
+ unset($arr[MIN_UINT32]);
+ $this->assertEquals(0, count($arr));
+
+ // Test float argument.
+ $arr[MAX_UINT32_FLOAT] = MAX_UINT32_FLOAT;
+ $this->assertSame(-1, $arr[-1]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[MAX_UINT32_FLOAT]);
+ $this->assertEquals(0, count($arr));
+
+ $arr[3.1] = 3.1;
+ $this->assertSame(3, $arr[3]);
+ $arr[-1.0] = -1.0;
+ $this->assertSame(-1, $arr[-1]);
+ $arr[MIN_UINT32_FLOAT] = MIN_UINT32_FLOAT;
+ $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
+ $this->assertEquals(3, count($arr));
+ unset($arr[3.1]);
+ unset($arr[-1.0]);
+ unset($arr[MIN_UINT32_FLOAT]);
+ $this->assertEquals(0, count($arr));
+
+ // Test string argument.
+ $arr[MAX_UINT32_STRING] = MAX_UINT32_STRING;
+ $this->assertSame(-1, $arr[-1]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[MAX_UINT32_STRING]);
+ $this->assertEquals(0, count($arr));
+
+ $arr['7'] = '7';
+ $this->assertSame(7, $arr[7]);
+ $arr['3.1'] = '3.1';
+ $this->assertSame(3, $arr[3]);
+ $arr['-1.0'] = '-1.0';
+ $this->assertSame(-1, $arr[-1]);
+ $arr[MIN_UINT32_STRING] = MIN_UINT32_STRING;
+ $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
+ $this->assertEquals(4, count($arr));
+ unset($arr['7']);
+ unset($arr['3.1']);
+ unset($arr['-1.0']);
+ unset($arr[MIN_UINT32_STRING]);
+ $this->assertEquals(0, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32SetStringKeyFail()
+ {
+ $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
+ $arr ['abc']= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32SetStringValueFail()
+ {
+ $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32SetMessageKeyFail()
+ {
+ $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
+ $arr [new TestMessage_Sub()]= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint32SetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test int64 field.
+ #########################################################
+
+ public function testInt64() {
+ $arr = new MapField(GPBType::INT64, GPBType::INT64);
+
+ // Test integer argument.
+ $arr[MAX_INT64] = MAX_INT64;
+ $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
+ $arr[MIN_INT64] = MIN_INT64;
+ $this->assertEquals(MIN_INT64, $arr[MIN_INT64]);
+ $this->assertEquals(2, count($arr));
+ unset($arr[MAX_INT64]);
+ unset($arr[MIN_INT64]);
+ $this->assertEquals(0, count($arr));
+
+ // Test float argument.
+ $arr[1.1] = 1.1;
+ $this->assertSame(1, $arr[1]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[1.1]);
+ $this->assertEquals(0, count($arr));
+
+ // Test string argument.
+ $arr['2'] = '2';
+ $this->assertSame(2, $arr[2]);
+ $arr['3.1'] = '3.1';
+ $this->assertSame(3, $arr[3]);
+ $arr[MAX_INT64_STRING] = MAX_INT64_STRING;
+ $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
+ $arr[MIN_INT64_STRING] = MIN_INT64_STRING;
+ $this->assertEquals(MIN_INT64, $arr[MIN_INT64]);
+ $this->assertEquals(4, count($arr));
+ unset($arr['2']);
+ unset($arr['3.1']);
+ unset($arr[MAX_INT64_STRING]);
+ unset($arr[MIN_INT64_STRING]);
+ $this->assertEquals(0, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64SetStringKeyFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::INT64);
+ $arr ['abc']= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64SetStringValueFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::INT64);
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64SetMessageKeyFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::INT64);
+ $arr [new TestMessage_Sub()]= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testInt64SetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::INT64);
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test uint64 field.
+ #########################################################
+
+ public function testUint64() {
+ $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
+
+ // Test integer argument.
+ $arr[MAX_UINT64] = MAX_UINT64;
+ $this->assertEquals(MAX_UINT64, $arr[MAX_UINT64]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[MAX_UINT64]);
+ $this->assertEquals(0, count($arr));
+
+ // Test float argument.
+ $arr[1.1] = 1.1;
+ $this->assertSame(1, $arr[1]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[1.1]);
+ $this->assertEquals(0, count($arr));
+
+ // Test string argument.
+ $arr['2'] = '2';
+ $this->assertSame(2, $arr[2]);
+ $arr['3.1'] = '3.1';
+ $this->assertSame(3, $arr[3]);
+ $arr[MAX_UINT64_STRING] = MAX_UINT64_STRING;
+ $this->assertEquals(MAX_UINT64, $arr[MAX_UINT64]);
+ $this->assertEquals(3, count($arr));
+ unset($arr['2']);
+ unset($arr['3.1']);
+ unset($arr[MAX_UINT64_STRING]);
+ $this->assertEquals(0, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64SetStringKeyFail()
+ {
+ $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
+ $arr ['abc']= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64SetStringValueFail()
+ {
+ $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64SetMessageKeyFail()
+ {
+ $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
+ $arr [new TestMessage_Sub()]= 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testUint64SetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test float field.
+ #########################################################
+
+ public function testFloat() {
+ $arr = new MapField(GPBType::INT32, GPBType::FLOAT);
+
+ // Test set.
+ $arr[0] = 1;
+ $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
+
+ $arr[1] = 1.1;
+ $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
+
+ $arr[2] = '2';
+ $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
+ $arr[3] = '3.1';
+ $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
+
+ $this->assertEquals(4, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatSetStringValueFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::FLOAT);
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testFloatSetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::FLOAT);
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test double field.
+ #########################################################
+
+ public function testDouble() {
+ $arr = new MapField(GPBType::INT32, GPBType::DOUBLE);
+
+ // Test set.
+ $arr[0] = 1;
+ $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
+
+ $arr[1] = 1.1;
+ $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
+
+ $arr[2] = '2';
+ $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
+ $arr[3] = '3.1';
+ $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
+
+ $this->assertEquals(4, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleSetStringValueFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::DOUBLE);
+ $arr [0]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testDoubleSetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::INT64, GPBType::DOUBLE);
+ $arr [0]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test bool field.
+ #########################################################
+
+ public function testBool() {
+ $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
+
+ // Test boolean.
+ $arr[True] = True;
+ $this->assertSame(True, $arr[True]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[True]);
+ $this->assertEquals(0, count($arr));
+
+ $arr[False] = False;
+ $this->assertSame(False, $arr[False]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[False]);
+ $this->assertEquals(0, count($arr));
+
+ // Test integer.
+ $arr[-1] = -1;
+ $this->assertSame(True, $arr[True]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[-1]);
+ $this->assertEquals(0, count($arr));
+
+ $arr[0] = 0;
+ $this->assertSame(False, $arr[False]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[0]);
+ $this->assertEquals(0, count($arr));
+
+ // Test float.
+ $arr[1.1] = 1.1;
+ $this->assertSame(True, $arr[True]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[1.1]);
+ $this->assertEquals(0, count($arr));
+
+ $arr[0.0] = 0.0;
+ $this->assertSame(False, $arr[False]);
+ $this->assertEquals(1, count($arr));
+ unset($arr[0.0]);
+ $this->assertEquals(0, count($arr));
+
+ // Test string.
+ $arr['a'] = 'a';
+ $this->assertSame(True, $arr[True]);
+ $this->assertEquals(1, count($arr));
+ unset($arr['a']);
+ $this->assertEquals(0, count($arr));
+
+ $arr[''] = '';
+ $this->assertSame(False, $arr[False]);
+ $this->assertEquals(1, count($arr));
+ unset($arr['']);
+ $this->assertEquals(0, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testBoolSetMessageKeyFail()
+ {
+ $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
+ $arr [new TestMessage_Sub()]= true;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testBoolSetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
+ $arr [true]= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test string field.
+ #########################################################
+
+ public function testString() {
+ $arr = new MapField(GPBType::STRING, GPBType::STRING);
+
+ // Test set.
+ $arr['abc'] = 'abc';
+ $this->assertSame('abc', $arr['abc']);
+ $this->assertEquals(1, count($arr));
+ unset($arr['abc']);
+ $this->assertEquals(0, count($arr));
+
+ $arr[1] = 1;
+ $this->assertSame('1', $arr['1']);
+ $this->assertEquals(1, count($arr));
+ unset($arr[1]);
+ $this->assertEquals(0, count($arr));
+
+ $arr[1.1] = 1.1;
+ $this->assertSame('1.1', $arr['1.1']);
+ $this->assertEquals(1, count($arr));
+ unset($arr[1.1]);
+ $this->assertEquals(0, count($arr));
+
+ $arr[True] = True;
+ $this->assertSame('1', $arr['1']);
+ $this->assertEquals(1, count($arr));
+ unset($arr[True]);
+ $this->assertEquals(0, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringSetInvalidUTF8KeyFail()
+ {
+ $arr = new MapField(GPBType::STRING, GPBType::STRING);
+ $arr[hex2bin("ff")]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringSetInvalidUTF8ValueFail()
+ {
+ $arr = new MapField(GPBType::STRING, GPBType::STRING);
+ $arr ['abc']= hex2bin("ff");
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringSetMessageKeyFail()
+ {
+ $arr = new MapField(GPBType::STRING, GPBType::STRING);
+ $arr [new TestMessage_Sub()]= 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testStringSetMessageValueFail()
+ {
+ $arr = new MapField(GPBType::STRING, GPBType::STRING);
+ $arr ['abc']= new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test message field.
+ #########################################################
+
+ public function testMessage() {
+ $arr = new MapField(GPBType::INT32,
+ GPBType::MESSAGE, TestMessage_Sub::class);
+
+ // Test append.
+ $sub_m = new TestMessage_Sub();
+ $sub_m->setA(1);
+ $arr[0] = $sub_m;
+ $this->assertSame(1, $arr[0]->getA());
+
+ $null = NULL;
+ $arr[1] = $null;
+ $this->assertNull($arr[1]);
+
+ $this->assertEquals(2, count($arr));
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageSetIntValueFail()
+ {
+ $arr =
+ new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class);
+ $arr[0] = 0;
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageSetStringValueFail()
+ {
+ $arr =
+ new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class);
+ $arr[0] = 'abc';
+ }
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ */
+ public function testMessageSetOtherMessageValueFail()
+ {
+ $arr =
+ new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class);
+ $arr[0] = new TestMessage_Sub();
+ }
+
+ #########################################################
+ # Test memory leak
+ #########################################################
+
+ // TODO(teboring): Add it back.
+ // public function testCycleLeak()
+ // {
+ // $arr = new MapField(GPBType::INT32,
+ // GPBType::MESSAGE, TestMessage::class);
+ // $arr [0]= new TestMessage;
+ // $arr[0]->SetMapRecursive($arr);
+
+ // // Clean up memory before test.
+ // gc_collect_cycles();
+ // $start = memory_get_usage();
+ // unset($arr);
+
+ // // Explicitly trigger garbage collection.
+ // gc_collect_cycles();
+
+ // $end = memory_get_usage();
+ // $this->assertLessThan($start, $end);
+ // }
+}
diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php
new file mode 100644
index 00000000..ec54597b
--- /dev/null
+++ b/php/tests/memory_leak_test.php
@@ -0,0 +1,73 @@
+<?php
+
+# phpunit has memory leak by itself. Thus, it cannot be used to test memory leak.
+
+require_once('test.pb.php');
+require_once('test_util.php');
+
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBType;
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+
+$from = new TestMessage();
+TestUtil::setTestMessage($from);
+TestUtil::assertTestMessage($from);
+
+$data = $from->encode();
+
+$to = new TestMessage();
+$to->decode($data);
+
+TestUtil::assertTestMessage($to);
+
+$from->setRecursive($from);
+
+$arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
+$arr []= new TestMessage;
+$arr[0]->SetRepeatedRecursive($arr);
+
+// Test oneof fields.
+$m = new TestMessage();
+
+$m->setOneofInt32(1);
+assert(1 === $m->getOneofInt32());
+assert(0.0 === $m->getOneofFloat());
+assert('' === $m->getOneofString());
+assert(NULL === $m->getOneofMessage());
+$data = $m->encode();
+$n = new TestMessage();
+$n->decode($data);
+assert(1 === $n->getOneofInt32());
+
+$m->setOneofFloat(2.0);
+assert(0 === $m->getOneofInt32());
+assert(2.0 === $m->getOneofFloat());
+assert('' === $m->getOneofString());
+assert(NULL === $m->getOneofMessage());
+$data = $m->encode();
+$n = new TestMessage();
+$n->decode($data);
+assert(2.0 === $n->getOneofFloat());
+
+$m->setOneofString('abc');
+assert(0 === $m->getOneofInt32());
+assert(0.0 === $m->getOneofFloat());
+assert('abc' === $m->getOneofString());
+assert(NULL === $m->getOneofMessage());
+$data = $m->encode();
+$n = new TestMessage();
+$n->decode($data);
+assert('abc' === $n->getOneofString());
+
+$sub_m = new TestMessage_Sub();
+$sub_m->setA(1);
+$m->setOneofMessage($sub_m);
+assert(0 === $m->getOneofInt32());
+assert(0.0 === $m->getOneofFloat());
+assert('' === $m->getOneofString());
+assert(1 === $m->getOneofMessage()->getA());
+$data = $m->encode();
+$n = new TestMessage();
+$n->decode($data);
+assert(1 === $n->getOneofMessage()->getA());
diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php
new file mode 100644
index 00000000..82941dd2
--- /dev/null
+++ b/php/tests/php_implementation_test.php
@@ -0,0 +1,443 @@
+<?php
+
+require_once('test.pb.php');
+require_once('test_base.php');
+require_once('test_util.php');
+
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+use Foo\TestPackedMessage;
+use Google\Protobuf\Internal\InputStream;
+use Google\Protobuf\Internal\FileDescriptorSet;
+use Google\Protobuf\Internal\GPBUtil;
+use Google\Protobuf\Internal\Int64;
+use Google\Protobuf\Internal\Uint64;
+use Google\Protobuf\Internal\GPBLabel;
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\OutputStream;
+use Google\Protobuf\Internal\RepeatedField;
+
+class ImplementationTest extends TestBase
+{
+
+ public function testReadInt32()
+ {
+ $value = null;
+
+ // Positive number.
+ $input = new InputStream(hex2bin("01"));
+ GPBWire::readInt32($input, $value);
+ $this->assertSame(1, $value);
+
+ // Negative number.
+ $input = new InputStream(hex2bin("ffffffff0f"));
+ GPBWire::readInt32($input, $value);
+ $this->assertSame(-1, $value);
+
+ // Discard overflow bits.
+ $input = new InputStream(hex2bin("ffffffff7f"));
+ GPBWire::readInt32($input, $value);
+ $this->assertSame(-1, $value);
+ }
+
+ public function testReadUint32()
+ {
+ $value = null;
+
+ // Positive number.
+ $input = new InputStream(hex2bin("01"));
+ GPBWire::readUint32($input, $value);
+ $this->assertSame(1, $value);
+
+ // Max uint32.
+ $input = new InputStream(hex2bin("ffffffff0f"));
+ GPBWire::readUint32($input, $value);
+ $this->assertSame(-1, $value);
+
+ // Discard overflow bits.
+ $input = new InputStream(hex2bin("ffffffff7f"));
+ GPBWire::readUint32($input, $value);
+ $this->assertSame(-1, $value);
+ }
+
+ public function testReadInt64()
+ {
+ $value = null;
+
+ // Positive number.
+ $input = new InputStream(hex2bin("01"));
+ GPBWire::readInt64($input, $value);
+ $this->assertSame(1, $value->toInteger());
+
+ // Negative number.
+ $input = new InputStream(hex2bin("ffffffffffffffffff01"));
+ GPBWire::readInt64($input, $value);
+ $this->assertSame(-1, $value->toInteger());
+
+ // Discard overflow bits.
+ $input = new InputStream(hex2bin("ffffffffffffffffff0f"));
+ GPBWire::readInt64($input, $value);
+ $this->assertSame(-1, $value->toInteger());
+ }
+
+ public function testReadUint64()
+ {
+ $value = null;
+
+ // Positive number.
+ $input = new InputStream(hex2bin("01"));
+ GPBWire::readUint64($input, $value);
+ $this->assertSame(1, $value->toInteger());
+
+ // Negative number.
+ $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF01"));
+ GPBWire::readUint64($input, $value);
+ $this->assertSame(-1, $value->toInteger());
+
+ // Discard overflow bits.
+ $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF0F"));
+ GPBWire::readUint64($input, $value);
+ $this->assertSame(-1, $value->toInteger());
+ }
+
+ public function testReadSint32()
+ {
+ $value = null;
+
+ $input = new InputStream(hex2bin("00"));
+ GPBWire::readSint32($input, $value);
+ $this->assertSame(0, $value);
+
+ $input = new InputStream(hex2bin("01"));
+ GPBWire::readSint32($input, $value);
+ $this->assertSame(-1, $value);
+
+ $input = new InputStream(hex2bin("02"));
+ GPBWire::readSint32($input, $value);
+ $this->assertSame(1, $value);
+ }
+
+ public function testReadSint64()
+ {
+ $value = null;
+
+ $input = new InputStream(hex2bin("00"));
+ GPBWire::readSint64($input, $value);
+ $this->assertEquals(GPBUtil::Int64(0), $value);
+
+ $input = new InputStream(hex2bin("01"));
+ GPBWire::readSint64($input, $value);
+ $this->assertEquals(GPBUtil::Int64(-1), $value);
+
+ $input = new InputStream(hex2bin("02"));
+ GPBWire::readSint64($input, $value);
+ $this->assertEquals(GPBUtil::Int64(1), $value);
+ }
+
+ public function testReadFixed32()
+ {
+ $value = null;
+ $input = new InputStream(hex2bin("12345678"));
+ GPBWire::readFixed32($input, $value);
+ $this->assertSame(0x78563412, $value);
+ }
+
+ public function testReadFixed64()
+ {
+ $value = null;
+ $input = new InputStream(hex2bin("1234567812345678"));
+ GPBWire::readFixed64($input, $value);
+ $this->assertEquals(Uint64::newValue(0x78563412, 0x78563412), $value);
+ }
+
+ public function testReadSfixed32()
+ {
+ $value = null;
+ $input = new InputStream(hex2bin("12345678"));
+ GPBWire::readSfixed32($input, $value);
+ $this->assertSame(0x78563412, $value);
+ }
+
+ public function testReadFloat()
+ {
+ $value = null;
+ $input = new InputStream(hex2bin("0000803F"));
+ GPBWire::readFloat($input, $value);
+ $this->assertSame(1.0, $value);
+ }
+
+ public function testReadBool()
+ {
+ $value = null;
+
+ $input = new InputStream(hex2bin("00"));
+ GPBWire::readBool($input, $value);
+ $this->assertSame(false, $value);
+
+ $input = new InputStream(hex2bin("01"));
+ GPBWire::readBool($input, $value);
+ $this->assertSame(true, $value);
+ }
+
+ public function testReadDouble()
+ {
+ $value = null;
+ $input = new InputStream(hex2bin("000000000000F03F"));
+ GPBWire::readDouble($input, $value);
+ $this->assertSame(1.0, $value);
+ }
+
+ public function testReadSfixed64()
+ {
+ $value = null;
+ $input = new InputStream(hex2bin("1234567812345678"));
+ GPBWire::readSfixed64($input, $value);
+ $this->assertEquals(Int64::newValue(0x78563412, 0x78563412), $value);
+ }
+
+ public function testZigZagEncodeDecode()
+ {
+ $this->assertSame(0, GPBWire::zigZagEncode32(0));
+ $this->assertSame(1, GPBWire::zigZagEncode32(-1));
+ $this->assertSame(2, GPBWire::zigZagEncode32(1));
+ $this->assertSame(3, GPBWire::zigZagEncode32(-2));
+ $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode32(0x3FFFFFFF));
+ $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(0xC0000000));
+ $this->assertSame(-2, GPBWire::zigZagEncode32(0x7FFFFFFF));
+ $this->assertSame(-1, GPBWire::zigZagEncode32(0x80000000));
+
+ $this->assertSame(0, GPBWire::zigZagDecode32(0));
+ $this->assertSame(-1, GPBWire::zigZagDecode32(1));
+ $this->assertSame(1, GPBWire::zigZagDecode32(2));
+ $this->assertSame(-2, GPBWire::zigZagDecode32(3));
+ $this->assertSame(0x3FFFFFFF, GPBWire::zigZagDecode32(0x7FFFFFFE));
+ $this->assertSame(-1073741824, GPBWire::zigZagDecode32(0x7FFFFFFF));
+ $this->assertSame(0x7FFFFFFF, GPBWire::zigZagDecode32(0xFFFFFFFE));
+ $this->assertSame(-2147483648, GPBWire::zigZagDecode32(0xFFFFFFFF));
+
+ $this->assertEquals(GPBUtil::Uint64(0),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(0)));
+ $this->assertEquals(GPBUtil::Uint64(1),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(-1)));
+ $this->assertEquals(GPBUtil::Uint64(2),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(1)));
+ $this->assertEquals(GPBUtil::Uint64(3),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(-2)));
+ $this->assertEquals(
+ GPBUtil::Uint64(0x000000007FFFFFFE),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(0x000000003FFFFFFF)));
+ $this->assertEquals(
+ GPBUtil::Uint64(0x000000007FFFFFFF),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(0xFFFFFFFFC0000000)));
+ $this->assertEquals(
+ GPBUtil::Uint64(0x00000000FFFFFFFE),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(0x000000007FFFFFFF)));
+ $this->assertEquals(
+ GPBUtil::Uint64(0x00000000FFFFFFFF),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(0xFFFFFFFF80000000)));
+ $this->assertEquals(
+ Uint64::newValue(4294967295, 4294967294),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(0x7FFFFFFFFFFFFFFF)));
+ $this->assertEquals(
+ Uint64::newValue(4294967295, 4294967295),
+ GPBWire::zigZagEncode64(GPBUtil::Int64(0x8000000000000000)));
+
+ $this->assertEquals(GPBUtil::Int64(0),
+ GPBWire::zigZagDecode64(GPBUtil::Uint64(0)));
+ $this->assertEquals(GPBUtil::Int64(-1),
+ GPBWire::zigZagDecode64(GPBUtil::Uint64(1)));
+ $this->assertEquals(GPBUtil::Int64(1),
+ GPBWire::zigZagDecode64(GPBUtil::Uint64(2)));
+ $this->assertEquals(GPBUtil::Int64(-2),
+ GPBWire::zigZagDecode64(GPBUtil::Uint64(3)));
+
+ // Round trip
+ $this->assertSame(0, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(0)));
+ $this->assertSame(1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(1)));
+ $this->assertSame(-1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-1)));
+ $this->assertSame(14927,
+ GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(14927)));
+ $this->assertSame(-3612,
+ GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-3612)));
+ }
+
+ public function testDecode()
+ {
+ $m = new TestMessage();
+ $m->decode(TestUtil::getGoldenTestMessage());
+ TestUtil::assertTestMessage($m);
+ }
+
+ public function testDescriptorDecode()
+ {
+ $file_desc_set = new FileDescriptorSet();
+ $file_desc_set->decode(hex2bin(
+ "0a3b0a12746573745f696e636c7564652e70726f746f120362617222180a" .
+ "0b54657374496e636c75646512090a0161180120012805620670726f746f33"));
+
+ $this->assertSame(1, sizeof($file_desc_set->getFile()));
+
+ $file_desc = $file_desc_set->getFile()[0];
+ $this->assertSame("test_include.proto", $file_desc->getName());
+ $this->assertSame("bar", $file_desc->getPackage());
+ $this->assertSame(0, sizeof($file_desc->getDependency()));
+ $this->assertSame(1, sizeof($file_desc->getMessageType()));
+ $this->assertSame(0, sizeof($file_desc->getEnumType()));
+ $this->assertSame("proto3", $file_desc->getSyntax());
+
+ $desc = $file_desc->getMessageType()[0];
+ $this->assertSame("TestInclude", $desc->getName());
+ $this->assertSame(1, sizeof($desc->getField()));
+ $this->assertSame(0, sizeof($desc->getNestedType()));
+ $this->assertSame(0, sizeof($desc->getEnumType()));
+ $this->assertSame(0, sizeof($desc->getOneofDecl()));
+
+ $field = $desc->getField()[0];
+ $this->assertSame("a", $field->getName());
+ $this->assertSame(1, $field->getNumber());
+ $this->assertSame(GPBLabel::OPTIONAL, $field->getLabel());
+ $this->assertSame(GPBType::INT32, $field->getType());
+ }
+
+ public function testReadVarint64()
+ {
+ $var = 0;
+
+ // Empty buffer.
+ $input = new InputStream(hex2bin(''));
+ $this->assertFalse($input->readVarint64($var));
+
+ // The largest varint is 10 bytes long.
+ $input = new InputStream(hex2bin('8080808080808080808001'));
+ $this->assertFalse($input->readVarint64($var));
+
+ // Corrupted varint.
+ $input = new InputStream(hex2bin('808080'));
+ $this->assertFalse($input->readVarint64($var));
+
+ // Normal case.
+ $input = new InputStream(hex2bin('808001'));
+ $this->assertTrue($input->readVarint64($var));
+ $this->assertSame(16384, $var->toInteger());
+ $this->assertFalse($input->readVarint64($var));
+
+ // Read two varint.
+ $input = new InputStream(hex2bin('808001808002'));
+ $this->assertTrue($input->readVarint64($var));
+ $this->assertSame(16384, $var->toInteger());
+ $this->assertTrue($input->readVarint64($var));
+ $this->assertSame(32768, $var->toInteger());
+ $this->assertFalse($input->readVarint64($var));
+ }
+
+ public function testReadVarint32()
+ {
+ $var = 0;
+
+ // Empty buffer.
+ $input = new InputStream(hex2bin(''));
+ $this->assertFalse($input->readVarint32($var));
+
+ // The largest varint is 10 bytes long.
+ $input = new InputStream(hex2bin('8080808080808080808001'));
+ $this->assertFalse($input->readVarint32($var));
+
+ // Corrupted varint.
+ $input = new InputStream(hex2bin('808080'));
+ $this->assertFalse($input->readVarint32($var));
+
+ // Normal case.
+ $input = new InputStream(hex2bin('808001'));
+ $this->assertTrue($input->readVarint32($var));
+ $this->assertSame(16384, $var);
+ $this->assertFalse($input->readVarint32($var));
+
+ // Read two varint.
+ $input = new InputStream(hex2bin('808001808002'));
+ $this->assertTrue($input->readVarint32($var));
+ $this->assertSame(16384, $var);
+ $this->assertTrue($input->readVarint32($var));
+ $this->assertSame(32768, $var);
+ $this->assertFalse($input->readVarint32($var));
+
+ // Read a 64-bit integer. High-order bits should be discarded.
+ $input = new InputStream(hex2bin('808081808001'));
+ $this->assertTrue($input->readVarint32($var));
+ $this->assertSame(16384, $var);
+ $this->assertFalse($input->readVarint32($var));
+ }
+
+ public function testReadTag()
+ {
+ $input = new InputStream(hex2bin('808001'));
+ $tag = $input->readTag();
+ $this->assertSame(16384, $tag);
+ $tag = $input->readTag();
+ $this->assertSame(0, $tag);
+ }
+
+ public function testPushPopLimit()
+ {
+ $input = new InputStream(hex2bin('808001'));
+ $old_limit = $input->pushLimit(0);
+ $tag = $input->readTag();
+ $this->assertSame(0, $tag);
+ $input->popLimit($old_limit);
+ $tag = $input->readTag();
+ $this->assertSame(16384, $tag);
+ }
+
+ public function testReadRaw()
+ {
+ $input = new InputStream(hex2bin('808001'));
+ $buffer = null;
+
+ $this->assertTrue($input->readRaw(3, $buffer));
+ $this->assertSame(hex2bin('808001'), $buffer);
+
+ $this->assertFalse($input->readRaw(1, $buffer));
+ }
+
+ public function testWriteVarint32()
+ {
+ $output = new OutputStream(3);
+ $output->writeVarint32(16384);
+ $this->assertSame(hex2bin('808001'), $output->getData());
+ }
+
+ public function testWriteVarint64()
+ {
+ $output = new OutputStream(10);
+ $output->writeVarint64(-43);
+ $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData());
+ }
+
+ public function testWriteLittleEndian32()
+ {
+ $output = new OutputStream(4);
+ $output->writeLittleEndian32(46);
+ $this->assertSame(hex2bin('2E000000'), $output->getData());
+ }
+
+ public function testWriteLittleEndian64()
+ {
+ $output = new OutputStream(8);
+ $output->writeLittleEndian64(47);
+ $this->assertSame(hex2bin('2F00000000000000'), $output->getData());
+ }
+
+ public function testByteSize()
+ {
+ $m = new TestMessage();
+ TestUtil::setTestMessage($m);
+ $this->assertSame(447, $m->byteSize());
+ }
+
+ public function testPackedByteSize()
+ {
+ $m = new TestPackedMessage();
+ TestUtil::setTestPackedMessage($m);
+ $this->assertSame(156, $m->byteSize());
+ }
+}
diff --git a/php/tests/test.pb.php b/php/tests/test.pb.php
new file mode 100644
index 00000000..ed316b6e
--- /dev/null
+++ b/php/tests/test.pb.php
@@ -0,0 +1,1385 @@
+<?php
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: test.proto
+
+namespace Foo;
+
+require_once('test_include.pb.php');
+use Google\Protobuf\Internal\DescriptorPool;
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+class TestMessage extends \Google\Protobuf\Internal\Message
+{
+ private $optional_int32 = 0;
+ private $optional_int64 = 0;
+ private $optional_uint32 = 0;
+ private $optional_uint64 = 0;
+ private $optional_sint32 = 0;
+ private $optional_sint64 = 0;
+ private $optional_fixed32 = 0;
+ private $optional_fixed64 = 0;
+ private $optional_sfixed32 = 0;
+ private $optional_sfixed64 = 0;
+ private $optional_float = 0.0;
+ private $optional_double = 0.0;
+ private $optional_bool = false;
+ private $optional_string = '';
+ private $optional_bytes = '';
+ private $optional_enum = 0;
+ private $optional_message = null;
+ private $optional_included_message = null;
+ private $recursive = null;
+ private $repeated_int32;
+ private $repeated_int64;
+ private $repeated_uint32;
+ private $repeated_uint64;
+ private $repeated_sint32;
+ private $repeated_sint64;
+ private $repeated_fixed32;
+ private $repeated_fixed64;
+ private $repeated_sfixed32;
+ private $repeated_sfixed64;
+ private $repeated_float;
+ private $repeated_double;
+ private $repeated_bool;
+ private $repeated_string;
+ private $repeated_bytes;
+ private $repeated_enum;
+ private $repeated_message;
+ private $repeated_recursive;
+ private $map_int32_int32;
+ private $map_int64_int64;
+ private $map_uint32_uint32;
+ private $map_uint64_uint64;
+ private $map_sint32_sint32;
+ private $map_sint64_sint64;
+ private $map_fixed32_fixed32;
+ private $map_fixed64_fixed64;
+ private $map_sfixed32_sfixed32;
+ private $map_sfixed64_sfixed64;
+ private $map_int32_float;
+ private $map_int32_double;
+ private $map_bool_bool;
+ private $map_string_string;
+ private $map_int32_bytes;
+ private $map_int32_enum;
+ private $map_int32_message;
+ private $map_recursive;
+ protected $my_oneof;
+
+ public function getOptionalInt32()
+ {
+ return $this->optional_int32;
+ }
+
+ public function setOptionalInt32($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->optional_int32 = $var;
+ }
+
+ public function getOptionalInt64()
+ {
+ return $this->optional_int64;
+ }
+
+ public function setOptionalInt64($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->optional_int64 = $var;
+ }
+
+ public function getOptionalUint32()
+ {
+ return $this->optional_uint32;
+ }
+
+ public function setOptionalUint32($var)
+ {
+ GPBUtil::checkUint32($var);
+ $this->optional_uint32 = $var;
+ }
+
+ public function getOptionalUint64()
+ {
+ return $this->optional_uint64;
+ }
+
+ public function setOptionalUint64($var)
+ {
+ GPBUtil::checkUint64($var);
+ $this->optional_uint64 = $var;
+ }
+
+ public function getOptionalSint32()
+ {
+ return $this->optional_sint32;
+ }
+
+ public function setOptionalSint32($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->optional_sint32 = $var;
+ }
+
+ public function getOptionalSint64()
+ {
+ return $this->optional_sint64;
+ }
+
+ public function setOptionalSint64($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->optional_sint64 = $var;
+ }
+
+ public function getOptionalFixed32()
+ {
+ return $this->optional_fixed32;
+ }
+
+ public function setOptionalFixed32($var)
+ {
+ GPBUtil::checkUint32($var);
+ $this->optional_fixed32 = $var;
+ }
+
+ public function getOptionalFixed64()
+ {
+ return $this->optional_fixed64;
+ }
+
+ public function setOptionalFixed64($var)
+ {
+ GPBUtil::checkUint64($var);
+ $this->optional_fixed64 = $var;
+ }
+
+ public function getOptionalSfixed32()
+ {
+ return $this->optional_sfixed32;
+ }
+
+ public function setOptionalSfixed32($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->optional_sfixed32 = $var;
+ }
+
+ public function getOptionalSfixed64()
+ {
+ return $this->optional_sfixed64;
+ }
+
+ public function setOptionalSfixed64($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->optional_sfixed64 = $var;
+ }
+
+ public function getOptionalFloat()
+ {
+ return $this->optional_float;
+ }
+
+ public function setOptionalFloat($var)
+ {
+ GPBUtil::checkFloat($var);
+ $this->optional_float = $var;
+ }
+
+ public function getOptionalDouble()
+ {
+ return $this->optional_double;
+ }
+
+ public function setOptionalDouble($var)
+ {
+ GPBUtil::checkDouble($var);
+ $this->optional_double = $var;
+ }
+
+ public function getOptionalBool()
+ {
+ return $this->optional_bool;
+ }
+
+ public function setOptionalBool($var)
+ {
+ GPBUtil::checkBool($var);
+ $this->optional_bool = $var;
+ }
+
+ public function getOptionalString()
+ {
+ return $this->optional_string;
+ }
+
+ public function setOptionalString($var)
+ {
+ GPBUtil::checkString($var, True);
+ $this->optional_string = $var;
+ }
+
+ public function getOptionalBytes()
+ {
+ return $this->optional_bytes;
+ }
+
+ public function setOptionalBytes($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->optional_bytes = $var;
+ }
+
+ public function getOptionalEnum()
+ {
+ return $this->optional_enum;
+ }
+
+ public function setOptionalEnum($var)
+ {
+ GPBUtil::checkEnum($var, \Foo\TestEnum::class);
+ $this->optional_enum = $var;
+ }
+
+ public function getOptionalMessage()
+ {
+ return $this->optional_message;
+ }
+
+ public function setOptionalMessage(&$var)
+ {
+ GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class);
+ $this->optional_message = $var;
+ }
+
+ public function getOptionalIncludedMessage()
+ {
+ return $this->optional_included_message;
+ }
+
+ public function setOptionalIncludedMessage(&$var)
+ {
+ GPBUtil::checkMessage($var, \Bar\TestInclude::class);
+ $this->optional_included_message = $var;
+ }
+
+ public function getRecursive()
+ {
+ return $this->recursive;
+ }
+
+ public function setRecursive(&$var)
+ {
+ GPBUtil::checkMessage($var, \Foo\TestMessage::class);
+ $this->recursive = $var;
+ }
+
+ public function getRepeatedInt32()
+ {
+ return $this->repeated_int32;
+ }
+
+ public function setRepeatedInt32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::INT32);
+ $this->repeated_int32 = $var;
+ }
+
+ public function getRepeatedInt64()
+ {
+ return $this->repeated_int64;
+ }
+
+ public function setRepeatedInt64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::INT64);
+ $this->repeated_int64 = $var;
+ }
+
+ public function getRepeatedUint32()
+ {
+ return $this->repeated_uint32;
+ }
+
+ public function setRepeatedUint32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::UINT32);
+ $this->repeated_uint32 = $var;
+ }
+
+ public function getRepeatedUint64()
+ {
+ return $this->repeated_uint64;
+ }
+
+ public function setRepeatedUint64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::UINT64);
+ $this->repeated_uint64 = $var;
+ }
+
+ public function getRepeatedSint32()
+ {
+ return $this->repeated_sint32;
+ }
+
+ public function setRepeatedSint32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SINT32);
+ $this->repeated_sint32 = $var;
+ }
+
+ public function getRepeatedSint64()
+ {
+ return $this->repeated_sint64;
+ }
+
+ public function setRepeatedSint64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SINT64);
+ $this->repeated_sint64 = $var;
+ }
+
+ public function getRepeatedFixed32()
+ {
+ return $this->repeated_fixed32;
+ }
+
+ public function setRepeatedFixed32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
+ $this->repeated_fixed32 = $var;
+ }
+
+ public function getRepeatedFixed64()
+ {
+ return $this->repeated_fixed64;
+ }
+
+ public function setRepeatedFixed64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
+ $this->repeated_fixed64 = $var;
+ }
+
+ public function getRepeatedSfixed32()
+ {
+ return $this->repeated_sfixed32;
+ }
+
+ public function setRepeatedSfixed32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
+ $this->repeated_sfixed32 = $var;
+ }
+
+ public function getRepeatedSfixed64()
+ {
+ return $this->repeated_sfixed64;
+ }
+
+ public function setRepeatedSfixed64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
+ $this->repeated_sfixed64 = $var;
+ }
+
+ public function getRepeatedFloat()
+ {
+ return $this->repeated_float;
+ }
+
+ public function setRepeatedFloat(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
+ $this->repeated_float = $var;
+ }
+
+ public function getRepeatedDouble()
+ {
+ return $this->repeated_double;
+ }
+
+ public function setRepeatedDouble(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
+ $this->repeated_double = $var;
+ }
+
+ public function getRepeatedBool()
+ {
+ return $this->repeated_bool;
+ }
+
+ public function setRepeatedBool(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::BOOL);
+ $this->repeated_bool = $var;
+ }
+
+ public function getRepeatedString()
+ {
+ return $this->repeated_string;
+ }
+
+ public function setRepeatedString(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::STRING);
+ $this->repeated_string = $var;
+ }
+
+ public function getRepeatedBytes()
+ {
+ return $this->repeated_bytes;
+ }
+
+ public function setRepeatedBytes(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::BYTES);
+ $this->repeated_bytes = $var;
+ }
+
+ public function getRepeatedEnum()
+ {
+ return $this->repeated_enum;
+ }
+
+ public function setRepeatedEnum(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
+ $this->repeated_enum = $var;
+ }
+
+ public function getRepeatedMessage()
+ {
+ return $this->repeated_message;
+ }
+
+ public function setRepeatedMessage(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage_Sub::class);
+ $this->repeated_message = $var;
+ }
+
+ public function getRepeatedRecursive()
+ {
+ return $this->repeated_recursive;
+ }
+
+ public function setRepeatedRecursive(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage::class);
+ $this->repeated_recursive = $var;
+ }
+
+ public function getOneofInt32()
+ {
+ return $this->readOneof(51);
+ }
+
+ public function setOneofInt32($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->writeOneof(51, $var);
+ }
+
+ public function getOneofInt64()
+ {
+ return $this->readOneof(52);
+ }
+
+ public function setOneofInt64($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->writeOneof(52, $var);
+ }
+
+ public function getOneofUint32()
+ {
+ return $this->readOneof(53);
+ }
+
+ public function setOneofUint32($var)
+ {
+ GPBUtil::checkUint32($var);
+ $this->writeOneof(53, $var);
+ }
+
+ public function getOneofUint64()
+ {
+ return $this->readOneof(54);
+ }
+
+ public function setOneofUint64($var)
+ {
+ GPBUtil::checkUint64($var);
+ $this->writeOneof(54, $var);
+ }
+
+ public function getOneofSint32()
+ {
+ return $this->readOneof(55);
+ }
+
+ public function setOneofSint32($var)
+ {
+ GPBUtil::checkUint32($var);
+ $this->writeOneof(55, $var);
+ }
+
+ public function getOneofSint64()
+ {
+ return $this->readOneof(56);
+ }
+
+ public function setOneofSint64($var)
+ {
+ GPBUtil::checkUint64($var);
+ $this->writeOneof(56, $var);
+ }
+
+ public function getOneofFixed32()
+ {
+ return $this->readOneof(57);
+ }
+
+ public function setOneofFixed32($var)
+ {
+ GPBUtil::checkUint32($var);
+ $this->writeOneof(57, $var);
+ }
+
+ public function getOneofFixed64()
+ {
+ return $this->readOneof(58);
+ }
+
+ public function setOneofFixed64($var)
+ {
+ GPBUtil::checkUint64($var);
+ $this->writeOneof(58, $var);
+ }
+
+ public function getOneofSfixed32()
+ {
+ return $this->readOneof(59);
+ }
+
+ public function setOneofSfixed32($var)
+ {
+ GPBUtil::checkUint32($var);
+ $this->writeOneof(59, $var);
+ }
+
+ public function getOneofSfixed64()
+ {
+ return $this->readOneof(60);
+ }
+
+ public function setOneofSfixed64($var)
+ {
+ GPBUtil::checkUint64($var);
+ $this->writeOneof(60, $var);
+ }
+
+ public function getOneofDouble()
+ {
+ return $this->readOneof(61);
+ }
+
+ public function setOneofDouble($var)
+ {
+ GPBUtil::checkDouble($var);
+ $this->writeOneof(61, $var);
+ }
+
+ public function getOneofFloat()
+ {
+ return $this->readOneof(62);
+ }
+
+ public function setOneofFloat($var)
+ {
+ GPBUtil::checkFloat($var);
+ $this->writeOneof(62, $var);
+ }
+
+ public function getOneofBool()
+ {
+ return $this->readOneof(63);
+ }
+
+ public function setOneofBool($var)
+ {
+ GPBUtil::checkBool($var);
+ $this->writeOneof(63, $var);
+ }
+
+ public function getOneofString()
+ {
+ return $this->readOneof(64);
+ }
+
+ public function setOneofString($var)
+ {
+ GPBUtil::checkString($var, True);
+ $this->writeOneof(64, $var);
+ }
+
+ public function getOneofBytes()
+ {
+ return $this->readOneof(65);
+ }
+
+ public function setOneofBytes($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->writeOneof(65, $var);
+ }
+
+ public function getOneofEnum()
+ {
+ return $this->readOneof(66);
+ }
+
+ public function setOneofEnum($var)
+ {
+ GPBUtil::checkEnum($var, \Foo\TestEnum::class);
+ $this->writeOneof(66, $var);
+ }
+
+ public function getOneofMessage()
+ {
+ return $this->readOneof(67);
+ }
+
+ public function setOneofMessage(&$var)
+ {
+ GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class);
+ $this->writeOneof(67, $var);
+ }
+
+ public function getMapInt32Int32()
+ {
+ return $this->map_int32_int32;
+ }
+
+ public function setMapInt32Int32(&$var)
+ {
+ $this->map_int32_int32 = $var;
+ }
+
+ public function getMapInt64Int64()
+ {
+ return $this->map_int64_int64;
+ }
+
+ public function setMapInt64Int64(&$var)
+ {
+ $this->map_int64_int64 = $var;
+ }
+
+ public function getMapUint32Uint32()
+ {
+ return $this->map_uint32_uint32;
+ }
+
+ public function setMapUint32Uint32(&$var)
+ {
+ $this->map_uint32_uint32 = $var;
+ }
+
+ public function getMapUint64Uint64()
+ {
+ return $this->map_uint64_uint64;
+ }
+
+ public function setMapUint64Uint64(&$var)
+ {
+ $this->map_uint64_uint64 = $var;
+ }
+
+ public function getMapSint32Sint32()
+ {
+ return $this->map_sint32_sint32;
+ }
+
+ public function setMapSint32Sint32(&$var)
+ {
+ $this->map_sint32_sint32 = $var;
+ }
+
+ public function getMapSint64Sint64()
+ {
+ return $this->map_sint64_sint64;
+ }
+
+ public function setMapSint64Sint64(&$var)
+ {
+ $this->map_sint64_sint64 = $var;
+ }
+
+ public function getMapFixed32Fixed32()
+ {
+ return $this->map_fixed32_fixed32;
+ }
+
+ public function setMapFixed32Fixed32(&$var)
+ {
+ $this->map_fixed32_fixed32 = $var;
+ }
+
+ public function getMapFixed64Fixed64()
+ {
+ return $this->map_fixed64_fixed64;
+ }
+
+ public function setMapFixed64Fixed64(&$var)
+ {
+ $this->map_fixed64_fixed64 = $var;
+ }
+
+ public function getMapSfixed32Sfixed32()
+ {
+ return $this->map_sfixed32_sfixed32;
+ }
+
+ public function setMapSfixed32Sfixed32(&$var)
+ {
+ $this->map_sfixed32_sfixed32 = $var;
+ }
+
+ public function getMapSfixed64Sfixed64()
+ {
+ return $this->map_sfixed64_sfixed64;
+ }
+
+ public function setMapSfixed64Sfixed64(&$var)
+ {
+ $this->map_sfixed64_sfixed64 = $var;
+ }
+
+ public function getMapInt32Float()
+ {
+ return $this->map_int32_float;
+ }
+
+ public function setMapInt32Float(&$var)
+ {
+ $this->map_int32_float = $var;
+ }
+
+ public function getMapInt32Double()
+ {
+ return $this->map_int32_double;
+ }
+
+ public function setMapInt32Double(&$var)
+ {
+ $this->map_int32_double = $var;
+ }
+
+ public function getMapBoolBool()
+ {
+ return $this->map_bool_bool;
+ }
+
+ public function setMapBoolBool(&$var)
+ {
+ $this->map_bool_bool = $var;
+ }
+
+ public function getMapStringString()
+ {
+ return $this->map_string_string;
+ }
+
+ public function setMapStringString(&$var)
+ {
+ $this->map_string_string = $var;
+ }
+
+ public function getMapInt32Bytes()
+ {
+ return $this->map_int32_bytes;
+ }
+
+ public function setMapInt32Bytes(&$var)
+ {
+ $this->map_int32_bytes = $var;
+ }
+
+ public function getMapInt32Enum()
+ {
+ return $this->map_int32_enum;
+ }
+
+ public function setMapInt32Enum(&$var)
+ {
+ $this->map_int32_enum = $var;
+ }
+
+ public function getMapInt32Message()
+ {
+ return $this->map_int32_message;
+ }
+
+ public function setMapInt32Message(&$var)
+ {
+ $this->map_int32_message = $var;
+ }
+
+ public function getMapRecursive()
+ {
+ return $this->map_recursive;
+ }
+
+ public function setMapRecursive(&$var)
+ {
+ $this->map_recursive = $var;
+ }
+
+ public function getMyOneof()
+ {
+ return $this->my_oneof;
+ }
+
+}
+
+class TestMessage_Sub extends \Google\Protobuf\Internal\Message
+{
+ private $a = 0;
+
+ public function getA()
+ {
+ return $this->a;
+ }
+
+ public function setA($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->a = $var;
+ }
+
+}
+
+class TestPackedMessage extends \Google\Protobuf\Internal\Message
+{
+ private $repeated_int32;
+ private $repeated_int64;
+ private $repeated_uint32;
+ private $repeated_uint64;
+ private $repeated_sint32;
+ private $repeated_sint64;
+ private $repeated_fixed32;
+ private $repeated_fixed64;
+ private $repeated_sfixed32;
+ private $repeated_sfixed64;
+ private $repeated_float;
+ private $repeated_double;
+ private $repeated_bool;
+ private $repeated_enum;
+
+ public function getRepeatedInt32()
+ {
+ return $this->repeated_int32;
+ }
+
+ public function setRepeatedInt32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::INT32);
+ $this->repeated_int32 = $var;
+ }
+
+ public function getRepeatedInt64()
+ {
+ return $this->repeated_int64;
+ }
+
+ public function setRepeatedInt64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::INT64);
+ $this->repeated_int64 = $var;
+ }
+
+ public function getRepeatedUint32()
+ {
+ return $this->repeated_uint32;
+ }
+
+ public function setRepeatedUint32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::UINT32);
+ $this->repeated_uint32 = $var;
+ }
+
+ public function getRepeatedUint64()
+ {
+ return $this->repeated_uint64;
+ }
+
+ public function setRepeatedUint64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::UINT64);
+ $this->repeated_uint64 = $var;
+ }
+
+ public function getRepeatedSint32()
+ {
+ return $this->repeated_sint32;
+ }
+
+ public function setRepeatedSint32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SINT32);
+ $this->repeated_sint32 = $var;
+ }
+
+ public function getRepeatedSint64()
+ {
+ return $this->repeated_sint64;
+ }
+
+ public function setRepeatedSint64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SINT64);
+ $this->repeated_sint64 = $var;
+ }
+
+ public function getRepeatedFixed32()
+ {
+ return $this->repeated_fixed32;
+ }
+
+ public function setRepeatedFixed32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
+ $this->repeated_fixed32 = $var;
+ }
+
+ public function getRepeatedFixed64()
+ {
+ return $this->repeated_fixed64;
+ }
+
+ public function setRepeatedFixed64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
+ $this->repeated_fixed64 = $var;
+ }
+
+ public function getRepeatedSfixed32()
+ {
+ return $this->repeated_sfixed32;
+ }
+
+ public function setRepeatedSfixed32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
+ $this->repeated_sfixed32 = $var;
+ }
+
+ public function getRepeatedSfixed64()
+ {
+ return $this->repeated_sfixed64;
+ }
+
+ public function setRepeatedSfixed64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
+ $this->repeated_sfixed64 = $var;
+ }
+
+ public function getRepeatedFloat()
+ {
+ return $this->repeated_float;
+ }
+
+ public function setRepeatedFloat(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
+ $this->repeated_float = $var;
+ }
+
+ public function getRepeatedDouble()
+ {
+ return $this->repeated_double;
+ }
+
+ public function setRepeatedDouble(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
+ $this->repeated_double = $var;
+ }
+
+ public function getRepeatedBool()
+ {
+ return $this->repeated_bool;
+ }
+
+ public function setRepeatedBool(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::BOOL);
+ $this->repeated_bool = $var;
+ }
+
+ public function getRepeatedEnum()
+ {
+ return $this->repeated_enum;
+ }
+
+ public function setRepeatedEnum(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
+ $this->repeated_enum = $var;
+ }
+
+}
+
+class TestUnpackedMessage extends \Google\Protobuf\Internal\Message
+{
+ private $repeated_int32;
+ private $repeated_int64;
+ private $repeated_uint32;
+ private $repeated_uint64;
+ private $repeated_sint32;
+ private $repeated_sint64;
+ private $repeated_fixed32;
+ private $repeated_fixed64;
+ private $repeated_sfixed32;
+ private $repeated_sfixed64;
+ private $repeated_float;
+ private $repeated_double;
+ private $repeated_bool;
+ private $repeated_enum;
+
+ public function getRepeatedInt32()
+ {
+ return $this->repeated_int32;
+ }
+
+ public function setRepeatedInt32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::INT32);
+ $this->repeated_int32 = $var;
+ }
+
+ public function getRepeatedInt64()
+ {
+ return $this->repeated_int64;
+ }
+
+ public function setRepeatedInt64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::INT64);
+ $this->repeated_int64 = $var;
+ }
+
+ public function getRepeatedUint32()
+ {
+ return $this->repeated_uint32;
+ }
+
+ public function setRepeatedUint32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::UINT32);
+ $this->repeated_uint32 = $var;
+ }
+
+ public function getRepeatedUint64()
+ {
+ return $this->repeated_uint64;
+ }
+
+ public function setRepeatedUint64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::UINT64);
+ $this->repeated_uint64 = $var;
+ }
+
+ public function getRepeatedSint32()
+ {
+ return $this->repeated_sint32;
+ }
+
+ public function setRepeatedSint32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SINT32);
+ $this->repeated_sint32 = $var;
+ }
+
+ public function getRepeatedSint64()
+ {
+ return $this->repeated_sint64;
+ }
+
+ public function setRepeatedSint64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SINT64);
+ $this->repeated_sint64 = $var;
+ }
+
+ public function getRepeatedFixed32()
+ {
+ return $this->repeated_fixed32;
+ }
+
+ public function setRepeatedFixed32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
+ $this->repeated_fixed32 = $var;
+ }
+
+ public function getRepeatedFixed64()
+ {
+ return $this->repeated_fixed64;
+ }
+
+ public function setRepeatedFixed64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
+ $this->repeated_fixed64 = $var;
+ }
+
+ public function getRepeatedSfixed32()
+ {
+ return $this->repeated_sfixed32;
+ }
+
+ public function setRepeatedSfixed32(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
+ $this->repeated_sfixed32 = $var;
+ }
+
+ public function getRepeatedSfixed64()
+ {
+ return $this->repeated_sfixed64;
+ }
+
+ public function setRepeatedSfixed64(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
+ $this->repeated_sfixed64 = $var;
+ }
+
+ public function getRepeatedFloat()
+ {
+ return $this->repeated_float;
+ }
+
+ public function setRepeatedFloat(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
+ $this->repeated_float = $var;
+ }
+
+ public function getRepeatedDouble()
+ {
+ return $this->repeated_double;
+ }
+
+ public function setRepeatedDouble(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
+ $this->repeated_double = $var;
+ }
+
+ public function getRepeatedBool()
+ {
+ return $this->repeated_bool;
+ }
+
+ public function setRepeatedBool(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::BOOL);
+ $this->repeated_bool = $var;
+ }
+
+ public function getRepeatedEnum()
+ {
+ return $this->repeated_enum;
+ }
+
+ public function setRepeatedEnum(&$var)
+ {
+ GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
+ $this->repeated_enum = $var;
+ }
+
+}
+
+class TestEnum
+{
+ const ZERO = 0;
+ const ONE = 1;
+}
+
+$pool = DescriptorPool::getGeneratedPool();
+
+$pool->internalAddGeneratedFile(hex2bin(
+ "0a83250a0a746573742e70726f746f1203666f6f1a12746573745f696e63" .
+ "6c7564652e70726f746f22be1d0a0b546573744d65737361676512160a0e" .
+ "6f7074696f6e616c5f696e74333218012001280512160a0e6f7074696f6e" .
+ "616c5f696e74363418022001280312170a0f6f7074696f6e616c5f75696e" .
+ "74333218032001280d12170a0f6f7074696f6e616c5f75696e7436341804" .
+ "2001280412170a0f6f7074696f6e616c5f73696e74333218052001281112" .
+ "170a0f6f7074696f6e616c5f73696e74363418062001281212180a106f70" .
+ "74696f6e616c5f6669786564333218072001280712180a106f7074696f6e" .
+ "616c5f6669786564363418082001280612190a116f7074696f6e616c5f73" .
+ "6669786564333218092001280f12190a116f7074696f6e616c5f73666978" .
+ "65643634180a2001281012160a0e6f7074696f6e616c5f666c6f6174180b" .
+ "2001280212170a0f6f7074696f6e616c5f646f75626c65180c2001280112" .
+ "150a0d6f7074696f6e616c5f626f6f6c180d2001280812170a0f6f707469" .
+ "6f6e616c5f737472696e67180e2001280912160a0e6f7074696f6e616c5f" .
+ "6279746573180f2001280c12240a0d6f7074696f6e616c5f656e756d1810" .
+ "2001280e320d2e666f6f2e54657374456e756d122e0a106f7074696f6e61" .
+ "6c5f6d65737361676518112001280b32142e666f6f2e546573744d657373" .
+ "6167652e53756212330a196f7074696f6e616c5f696e636c756465645f6d" .
+ "65737361676518122001280b32102e6261722e54657374496e636c756465" .
+ "12230a0972656375727369766518132001280b32102e666f6f2e54657374" .
+ "4d65737361676512160a0e72657065617465645f696e743332181f200328" .
+ "0512160a0e72657065617465645f696e74363418202003280312170a0f72" .
+ "657065617465645f75696e74333218212003280d12170a0f726570656174" .
+ "65645f75696e74363418222003280412170a0f72657065617465645f7369" .
+ "6e74333218232003281112170a0f72657065617465645f73696e74363418" .
+ "242003281212180a1072657065617465645f666978656433321825200328" .
+ "0712180a1072657065617465645f6669786564363418262003280612190a" .
+ "1172657065617465645f736669786564333218272003280f12190a117265" .
+ "7065617465645f736669786564363418282003281012160a0e7265706561" .
+ "7465645f666c6f617418292003280212170a0f72657065617465645f646f" .
+ "75626c65182a2003280112150a0d72657065617465645f626f6f6c182b20" .
+ "03280812170a0f72657065617465645f737472696e67182c200328091216" .
+ "0a0e72657065617465645f6279746573182d2003280c12240a0d72657065" .
+ "617465645f656e756d182e2003280e320d2e666f6f2e54657374456e756d" .
+ "122e0a1072657065617465645f6d657373616765182f2003280b32142e66" .
+ "6f6f2e546573744d6573736167652e537562122c0a127265706561746564" .
+ "5f72656375727369766518302003280b32102e666f6f2e546573744d6573" .
+ "7361676512150a0b6f6e656f665f696e743332183320012805480012150a" .
+ "0b6f6e656f665f696e743634183420012803480012160a0c6f6e656f665f" .
+ "75696e74333218352001280d480012160a0c6f6e656f665f75696e743634" .
+ "183620012804480012160a0c6f6e656f665f73696e74333218372001280d" .
+ "480012160a0c6f6e656f665f73696e743634183820012804480012170a0d" .
+ "6f6e656f665f6669786564333218392001280d480012170a0d6f6e656f66" .
+ "5f66697865643634183a20012804480012180a0e6f6e656f665f73666978" .
+ "65643332183b2001280d480012180a0e6f6e656f665f7366697865643634" .
+ "183c20012804480012160a0c6f6e656f665f646f75626c65183d20012801" .
+ "480012150a0b6f6e656f665f666c6f6174183e20012802480012140a0a6f" .
+ "6e656f665f626f6f6c183f20012808480012160a0c6f6e656f665f737472" .
+ "696e67184020012809480012150a0b6f6e656f665f627974657318412001" .
+ "280c480012230a0a6f6e656f665f656e756d18422001280e320d2e666f6f" .
+ "2e54657374456e756d4800122d0a0d6f6e656f665f6d6573736167651843" .
+ "2001280b32142e666f6f2e546573744d6573736167652e5375624800123c" .
+ "0a0f6d61705f696e7433325f696e74333218472003280b32232e666f6f2e" .
+ "546573744d6573736167652e4d6170496e743332496e743332456e747279" .
+ "123c0a0f6d61705f696e7436345f696e74363418482003280b32232e666f" .
+ "6f2e546573744d6573736167652e4d6170496e743634496e743634456e74" .
+ "727912400a116d61705f75696e7433325f75696e74333218492003280b32" .
+ "252e666f6f2e546573744d6573736167652e4d617055696e74333255696e" .
+ "743332456e74727912400a116d61705f75696e7436345f75696e74363418" .
+ "4a2003280b32252e666f6f2e546573744d6573736167652e4d617055696e" .
+ "74363455696e743634456e74727912400a116d61705f73696e7433325f73" .
+ "696e743332184b2003280b32252e666f6f2e546573744d6573736167652e" .
+ "4d617053696e74333253696e743332456e74727912400a116d61705f7369" .
+ "6e7436345f73696e743634184c2003280b32252e666f6f2e546573744d65" .
+ "73736167652e4d617053696e74363453696e743634456e74727912440a13" .
+ "6d61705f666978656433325f66697865643332184d2003280b32272e666f" .
+ "6f2e546573744d6573736167652e4d617046697865643332466978656433" .
+ "32456e74727912440a136d61705f666978656436345f6669786564363418" .
+ "4e2003280b32272e666f6f2e546573744d6573736167652e4d6170466978" .
+ "6564363446697865643634456e74727912480a156d61705f736669786564" .
+ "33325f7366697865643332184f2003280b32292e666f6f2e546573744d65" .
+ "73736167652e4d617053666978656433325366697865643332456e747279" .
+ "12480a156d61705f73666978656436345f73666978656436341850200328" .
+ "0b32292e666f6f2e546573744d6573736167652e4d617053666978656436" .
+ "345366697865643634456e747279123c0a0f6d61705f696e7433325f666c" .
+ "6f617418512003280b32232e666f6f2e546573744d6573736167652e4d61" .
+ "70496e743332466c6f6174456e747279123e0a106d61705f696e7433325f" .
+ "646f75626c6518522003280b32242e666f6f2e546573744d657373616765" .
+ "2e4d6170496e743332446f75626c65456e74727912380a0d6d61705f626f" .
+ "6f6c5f626f6f6c18532003280b32212e666f6f2e546573744d6573736167" .
+ "652e4d6170426f6f6c426f6f6c456e74727912400a116d61705f73747269" .
+ "6e675f737472696e6718542003280b32252e666f6f2e546573744d657373" .
+ "6167652e4d6170537472696e67537472696e67456e747279123c0a0f6d61" .
+ "705f696e7433325f627974657318552003280b32232e666f6f2e54657374" .
+ "4d6573736167652e4d6170496e7433324279746573456e747279123a0a0e" .
+ "6d61705f696e7433325f656e756d18562003280b32222e666f6f2e546573" .
+ "744d6573736167652e4d6170496e743332456e756d456e74727912400a11" .
+ "6d61705f696e7433325f6d65737361676518572003280b32252e666f6f2e" .
+ "546573744d6573736167652e4d6170496e7433324d657373616765456e74" .
+ "727912390a0d6d61705f72656375727369766518582003280b32222e666f" .
+ "6f2e546573744d6573736167652e4d6170526563757273697665456e7472" .
+ "791a340a124d6170496e743332496e743332456e747279120b0a036b6579" .
+ "180120012805120d0a0576616c75651802200128053a0238011a340a124d" .
+ "6170496e743634496e743634456e747279120b0a036b6579180120012803" .
+ "120d0a0576616c75651802200128033a0238011a360a144d617055696e74" .
+ "333255696e743332456e747279120b0a036b657918012001280d120d0a05" .
+ "76616c756518022001280d3a0238011a360a144d617055696e7436345569" .
+ "6e743634456e747279120b0a036b6579180120012804120d0a0576616c75" .
+ "651802200128043a0238011a360a144d617053696e74333253696e743332" .
+ "456e747279120b0a036b6579180120012811120d0a0576616c7565180220" .
+ "0128113a0238011a360a144d617053696e74363453696e743634456e7472" .
+ "79120b0a036b6579180120012812120d0a0576616c75651802200128123a" .
+ "0238011a380a164d61704669786564333246697865643332456e74727912" .
+ "0b0a036b6579180120012807120d0a0576616c75651802200128073a0238" .
+ "011a380a164d61704669786564363446697865643634456e747279120b0a" .
+ "036b6579180120012806120d0a0576616c75651802200128063a0238011a" .
+ "3a0a184d617053666978656433325366697865643332456e747279120b0a" .
+ "036b657918012001280f120d0a0576616c756518022001280f3a0238011a" .
+ "3a0a184d617053666978656436345366697865643634456e747279120b0a" .
+ "036b6579180120012810120d0a0576616c75651802200128103a0238011a" .
+ "340a124d6170496e743332466c6f6174456e747279120b0a036b65791801" .
+ "20012805120d0a0576616c75651802200128023a0238011a350a134d6170" .
+ "496e743332446f75626c65456e747279120b0a036b657918012001280512" .
+ "0d0a0576616c75651802200128013a0238011a320a104d6170426f6f6c42" .
+ "6f6f6c456e747279120b0a036b6579180120012808120d0a0576616c7565" .
+ "1802200128083a0238011a360a144d6170537472696e67537472696e6745" .
+ "6e747279120b0a036b6579180120012809120d0a0576616c756518022001" .
+ "28093a0238011a340a124d6170496e7433324279746573456e747279120b" .
+ "0a036b6579180120012805120d0a0576616c756518022001280c3a023801" .
+ "1a420a114d6170496e743332456e756d456e747279120b0a036b65791801" .
+ "20012805121c0a0576616c756518022001280e320d2e666f6f2e54657374" .
+ "456e756d3a0238011a4c0a144d6170496e7433324d657373616765456e74" .
+ "7279120b0a036b657918012001280512230a0576616c756518022001280b" .
+ "32142e666f6f2e546573744d6573736167652e5375623a0238011a450a11" .
+ "4d6170526563757273697665456e747279120b0a036b6579180120012805" .
+ "121f0a0576616c756518022001280b32102e666f6f2e546573744d657373" .
+ "6167653a0238011a100a0353756212090a0161180120012805420a0a086d" .
+ "795f6f6e656f6622b7030a11546573745061636b65644d65737361676512" .
+ "1a0a0e72657065617465645f696e743332185a2003280542021001121a0a" .
+ "0e72657065617465645f696e743634185b2003280342021001121b0a0f72" .
+ "657065617465645f75696e743332185c2003280d42021001121b0a0f7265" .
+ "7065617465645f75696e743634185d2003280442021001121b0a0f726570" .
+ "65617465645f73696e743332185e2003281142021001121b0a0f72657065" .
+ "617465645f73696e743634185f2003281242021001121c0a107265706561" .
+ "7465645f6669786564333218602003280742021001121c0a107265706561" .
+ "7465645f6669786564363418612003280642021001121d0a117265706561" .
+ "7465645f736669786564333218622003280f42021001121d0a1172657065" .
+ "617465645f736669786564363418632003281042021001121a0a0e726570" .
+ "65617465645f666c6f617418642003280242021001121b0a0f7265706561" .
+ "7465645f646f75626c651865200328014202100112190a0d726570656174" .
+ "65645f626f6f6c1866200328084202100112280a0d72657065617465645f" .
+ "656e756d18672003280e320d2e666f6f2e54657374456e756d4202100122" .
+ "b9030a1354657374556e7061636b65644d657373616765121a0a0e726570" .
+ "65617465645f696e743332185a2003280542021000121a0a0e7265706561" .
+ "7465645f696e743634185b2003280342021000121b0a0f72657065617465" .
+ "645f75696e743332185c2003280d42021000121b0a0f7265706561746564" .
+ "5f75696e743634185d2003280442021000121b0a0f72657065617465645f" .
+ "73696e743332185e2003281142021000121b0a0f72657065617465645f73" .
+ "696e743634185f2003281242021000121c0a1072657065617465645f6669" .
+ "786564333218602003280742021000121c0a1072657065617465645f6669" .
+ "786564363418612003280642021000121d0a1172657065617465645f7366" .
+ "69786564333218622003280f42021000121d0a1172657065617465645f73" .
+ "6669786564363418632003281042021000121a0a0e72657065617465645f" .
+ "666c6f617418642003280242021000121b0a0f72657065617465645f646f" .
+ "75626c651865200328014202100012190a0d72657065617465645f626f6f" .
+ "6c1866200328084202100012280a0d72657065617465645f656e756d1867" .
+ "2003280e320d2e666f6f2e54657374456e756d420210002a1d0a08546573" .
+ "74456e756d12080a045a45524f100012070a034f4e451001620670726f74" .
+ "6f33"
+));
+
diff --git a/php/tests/test.proto b/php/tests/test.proto
new file mode 100644
index 00000000..15709c83
--- /dev/null
+++ b/php/tests/test.proto
@@ -0,0 +1,136 @@
+syntax = "proto3";
+
+import 'test_include.proto';
+
+package foo;
+
+message TestMessage {
+ // Singular
+ int32 optional_int32 = 1;
+ int64 optional_int64 = 2;
+ uint32 optional_uint32 = 3;
+ uint64 optional_uint64 = 4;
+ sint32 optional_sint32 = 5;
+ sint64 optional_sint64 = 6;
+ fixed32 optional_fixed32 = 7;
+ fixed64 optional_fixed64 = 8;
+ sfixed32 optional_sfixed32 = 9;
+ sfixed64 optional_sfixed64 = 10;
+ float optional_float = 11;
+ double optional_double = 12;
+ bool optional_bool = 13;
+ string optional_string = 14;
+ bytes optional_bytes = 15;
+
+ TestEnum optional_enum = 16;
+ Sub optional_message = 17;
+ bar.TestInclude optional_included_message = 18;
+ TestMessage recursive = 19;
+
+ // Repeated
+ repeated int32 repeated_int32 = 31;
+ repeated int64 repeated_int64 = 32;
+ repeated uint32 repeated_uint32 = 33;
+ repeated uint64 repeated_uint64 = 34;
+ repeated sint32 repeated_sint32 = 35;
+ repeated sint64 repeated_sint64 = 36;
+ repeated fixed32 repeated_fixed32 = 37;
+ repeated fixed64 repeated_fixed64 = 38;
+ repeated sfixed32 repeated_sfixed32 = 39;
+ repeated sfixed64 repeated_sfixed64 = 40;
+ repeated float repeated_float = 41;
+ repeated double repeated_double = 42;
+ repeated bool repeated_bool = 43;
+ repeated string repeated_string = 44;
+ repeated bytes repeated_bytes = 45;
+
+ repeated TestEnum repeated_enum = 46;
+ repeated Sub repeated_message = 47;
+ repeated TestMessage repeated_recursive = 48;
+
+ oneof my_oneof {
+ int32 oneof_int32 = 51;
+ int64 oneof_int64 = 52;
+ uint32 oneof_uint32 = 53;
+ uint64 oneof_uint64 = 54;
+ uint32 oneof_sint32 = 55;
+ uint64 oneof_sint64 = 56;
+ uint32 oneof_fixed32 = 57;
+ uint64 oneof_fixed64 = 58;
+ uint32 oneof_sfixed32 = 59;
+ uint64 oneof_sfixed64 = 60;
+ double oneof_double = 61;
+ float oneof_float = 62;
+ bool oneof_bool = 63;
+ string oneof_string = 64;
+ bytes oneof_bytes = 65;
+ TestEnum oneof_enum = 66;
+ Sub oneof_message = 67;
+ }
+
+ map<int32, int32> map_int32_int32 = 71;
+ map<int64, int64> map_int64_int64 = 72;
+ map<uint32, uint32> map_uint32_uint32 = 73;
+ map<uint64, uint64> map_uint64_uint64 = 74;
+ map<sint32, sint32> map_sint32_sint32 = 75;
+ map<sint64, sint64> map_sint64_sint64 = 76;
+ map<fixed32, fixed32> map_fixed32_fixed32 = 77;
+ map<fixed64, fixed64> map_fixed64_fixed64 = 78;
+ map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 79;
+ map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 80;
+ map<int32, float> map_int32_float = 81;
+ map<int32, double> map_int32_double = 82;
+ map<bool, bool> map_bool_bool = 83;
+ map<string, string> map_string_string = 84;
+ map<int32, bytes> map_int32_bytes = 85;
+ map<int32, TestEnum> map_int32_enum = 86;
+ map<int32, Sub> map_int32_message = 87;
+
+ map<int32, TestMessage> map_recursive = 88;
+
+ message Sub {
+ int32 a = 1;
+ }
+
+ // NestedMessage nested_message = 90;
+}
+
+enum TestEnum {
+ ZERO = 0;
+ ONE = 1;
+}
+
+message TestPackedMessage {
+ repeated int32 repeated_int32 = 90 [packed = true];
+ repeated int64 repeated_int64 = 91 [packed = true];
+ repeated uint32 repeated_uint32 = 92 [packed = true];
+ repeated uint64 repeated_uint64 = 93 [packed = true];
+ repeated sint32 repeated_sint32 = 94 [packed = true];
+ repeated sint64 repeated_sint64 = 95 [packed = true];
+ repeated fixed32 repeated_fixed32 = 96 [packed = true];
+ repeated fixed64 repeated_fixed64 = 97 [packed = true];
+ repeated sfixed32 repeated_sfixed32 = 98 [packed = true];
+ repeated sfixed64 repeated_sfixed64 = 99 [packed = true];
+ repeated float repeated_float = 100 [packed = true];
+ repeated double repeated_double = 101 [packed = true];
+ repeated bool repeated_bool = 102 [packed = true];
+ repeated TestEnum repeated_enum = 103 [packed = true];
+}
+
+// Need to be in sync with TestPackedMessage.
+message TestUnpackedMessage {
+ repeated int32 repeated_int32 = 90 [packed = false];
+ repeated int64 repeated_int64 = 91 [packed = false];
+ repeated uint32 repeated_uint32 = 92 [packed = false];
+ repeated uint64 repeated_uint64 = 93 [packed = false];
+ repeated sint32 repeated_sint32 = 94 [packed = false];
+ repeated sint64 repeated_sint64 = 95 [packed = false];
+ repeated fixed32 repeated_fixed32 = 96 [packed = false];
+ repeated fixed64 repeated_fixed64 = 97 [packed = false];
+ repeated sfixed32 repeated_sfixed32 = 98 [packed = false];
+ repeated sfixed64 repeated_sfixed64 = 99 [packed = false];
+ repeated float repeated_float = 100 [packed = false];
+ repeated double repeated_double = 101 [packed = false];
+ repeated bool repeated_bool = 102 [packed = false];
+ repeated TestEnum repeated_enum = 103 [packed = false];
+}
diff --git a/php/tests/test.sh b/php/tests/test.sh
new file mode 100755
index 00000000..52833edb
--- /dev/null
+++ b/php/tests/test.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+cd ../ext/google/protobuf/
+make clean
+set -e
+
+phpize && ./configure --enable-debug CFLAGS='-g -O0' && make
+cd -
+
+tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php )
+
+for t in "${tests[@]}"
+do
+ echo "****************************"
+ echo "* $t"
+ echo "****************************"
+ php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` $t
+ echo ""
+done
+
+# Make sure to run the memory test in debug mode.
+php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php
+
+USE_ZEND_ALLOC=0 valgrind --leak-check=yes php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php
diff --git a/php/tests/test_base.php b/php/tests/test_base.php
new file mode 100644
index 00000000..25f18f74
--- /dev/null
+++ b/php/tests/test_base.php
@@ -0,0 +1,92 @@
+<?php
+
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+
+class TestBase extends PHPUnit_Framework_TestCase
+{
+
+ public function setFields(TestMessage $m)
+ {
+ TestUtil::setTestMessage($m);
+ }
+
+ public function expectFields(TestMessage $m)
+ {
+ $this->assertSame(-42, $m->getOptionalInt32());
+ $this->assertSame(42, $m->getOptionalUint32());
+ $this->assertSame(-43, $m->getOptionalInt64());
+ $this->assertSame(43, $m->getOptionalUint64());
+ $this->assertSame(-44, $m->getOptionalSint32());
+ $this->assertSame(-45, $m->getOptionalSint64());
+ $this->assertSame(46, $m->getOptionalFixed32());
+ $this->assertSame(47, $m->getOptionalFixed64());
+ $this->assertSame(-46, $m->getOptionalSfixed32());
+ $this->assertSame(-47, $m->getOptionalSfixed64());
+ $this->assertSame(1.5, $m->getOptionalFloat());
+ $this->assertSame(1.6, $m->getOptionalDouble());
+ $this->assertSame(true, $m->getOptionalBool());
+ $this->assertSame('a', $m->getOptionalString());
+ $this->assertSame('b', $m->getOptionalBytes());
+ $this->assertSame(33, $m->getOptionalMessage()->getA());
+
+ $this->assertEquals(-42, $m->getRepeatedInt32()[0]);
+ $this->assertEquals(42, $m->getRepeatedUint32()[0]);
+ $this->assertEquals(-43, $m->getRepeatedInt64()[0]);
+ $this->assertEquals(43, $m->getRepeatedUint64()[0]);
+ $this->assertEquals(-44, $m->getRepeatedSint32()[0]);
+ $this->assertEquals(-45, $m->getRepeatedSint64()[0]);
+ $this->assertEquals(46, $m->getRepeatedFixed32()[0]);
+ $this->assertEquals(47, $m->getRepeatedFixed64()[0]);
+ $this->assertEquals(-46, $m->getRepeatedSfixed32()[0]);
+ $this->assertEquals(-47, $m->getRepeatedSfixed64()[0]);
+ $this->assertEquals(1.5, $m->getRepeatedFloat()[0]);
+ $this->assertEquals(1.6, $m->getRepeatedDouble()[0]);
+ $this->assertEquals(true, $m->getRepeatedBool()[0]);
+ $this->assertEquals('a', $m->getRepeatedString()[0]);
+ $this->assertEquals('b', $m->getRepeatedBytes()[0]);
+ $this->assertEquals(34, $m->getRepeatedMessage()[0]->GetA());
+
+ $this->assertEquals(-52, $m->getRepeatedInt32()[1]);
+ $this->assertEquals(52, $m->getRepeatedUint32()[1]);
+ $this->assertEquals(-53, $m->getRepeatedInt64()[1]);
+ $this->assertEquals(53, $m->getRepeatedUint64()[1]);
+ $this->assertEquals(-54, $m->getRepeatedSint32()[1]);
+ $this->assertEquals(-55, $m->getRepeatedSint64()[1]);
+ $this->assertEquals(56, $m->getRepeatedFixed32()[1]);
+ $this->assertEquals(57, $m->getRepeatedFixed64()[1]);
+ $this->assertEquals(-56, $m->getRepeatedSfixed32()[1]);
+ $this->assertEquals(-57, $m->getRepeatedSfixed64()[1]);
+ $this->assertEquals(2.5, $m->getRepeatedFloat()[1]);
+ $this->assertEquals(2.6, $m->getRepeatedDouble()[1]);
+ $this->assertEquals(false, $m->getRepeatedBool()[1]);
+ $this->assertEquals('c', $m->getRepeatedString()[1]);
+ $this->assertEquals('d', $m->getRepeatedBytes()[1]);
+ $this->assertEquals(35, $m->getRepeatedMessage()[1]->GetA());
+ }
+
+ public function expectEmptyFields(TestMessage $m)
+ {
+ $this->assertSame(0, $m->getOptionalInt32());
+ $this->assertSame(0, $m->getOptionalUint32());
+ $this->assertSame(0, $m->getOptionalInt64());
+ $this->assertSame(0, $m->getOptionalUint64());
+ $this->assertSame(0, $m->getOptionalSint32());
+ $this->assertSame(0, $m->getOptionalSint64());
+ $this->assertSame(0, $m->getOptionalFixed32());
+ $this->assertSame(0, $m->getOptionalFixed64());
+ $this->assertSame(0, $m->getOptionalSfixed32());
+ $this->assertSame(0, $m->getOptionalSfixed64());
+ $this->assertSame(0.0, $m->getOptionalFloat());
+ $this->assertSame(0.0, $m->getOptionalDouble());
+ $this->assertSame(false, $m->getOptionalBool());
+ $this->assertSame('', $m->getOptionalString());
+ $this->assertSame('', $m->getOptionalBytes());
+ $this->assertNull($m->getOptionalMessage());
+ }
+
+ // This test is to avoid the warning of no test by php unit.
+ public function testNone()
+ {
+ }
+}
diff --git a/php/tests/test_include.pb.php b/php/tests/test_include.pb.php
new file mode 100644
index 00000000..2c43cc41
--- /dev/null
+++ b/php/tests/test_include.pb.php
@@ -0,0 +1,36 @@
+<?php
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: test_include.proto
+
+namespace Bar;
+
+use Google\Protobuf\Internal\DescriptorPool;
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+class TestInclude extends \Google\Protobuf\Internal\Message
+{
+ private $a = 0;
+
+ public function getA()
+ {
+ return $this->a;
+ }
+
+ public function setA($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->a = $var;
+ }
+
+}
+
+$pool = DescriptorPool::getGeneratedPool();
+
+$pool->internalAddGeneratedFile(hex2bin(
+ "0a3b0a12746573745f696e636c7564652e70726f746f120362617222180a" .
+ "0b54657374496e636c75646512090a0161180120012805620670726f746f" .
+ "33"
+));
+
diff --git a/php/tests/test_util.php b/php/tests/test_util.php
new file mode 100644
index 00000000..decd1a78
--- /dev/null
+++ b/php/tests/test_util.php
@@ -0,0 +1,393 @@
+<?php
+
+use Foo\TestEnum;
+use Foo\TestMessage;
+use Foo\TestMessage_Sub;
+use Foo\TestPackedMessage;
+use Foo\TestUnpackedMessage;
+
+define('MAX_FLOAT_DIFF', 0.000001);
+
+if (PHP_INT_SIZE == 8) {
+ define('MAX_INT_STRING', '9223372036854775807');
+ define('MAX_INT_UPPER_STRING', '9223372036854775808');
+} else {
+ define('MAX_INT_STRING', '2147483647');
+ define('MAX_INT_UPPER_STRING', '2147483648');
+}
+
+define('MAX_INT32', 2147483647);
+define('MAX_INT32_FLOAT', 2147483647.0);
+define('MAX_INT32_STRING', '2147483647');
+
+define('MIN_INT32', -2147483648);
+define('MIN_INT32_FLOAT', -2147483648.0);
+define('MIN_INT32_STRING', '-2147483648');
+
+define('MAX_UINT32', 4294967295);
+define('MAX_UINT32_FLOAT', 4294967295.0);
+define('MAX_UINT32_STRING', '4294967295');
+
+define('MIN_UINT32', -2147483648);
+define('MIN_UINT32_FLOAT', -2147483648.0);
+define('MIN_UINT32_STRING', '-2147483648');
+
+define('MAX_INT64', 9223372036854775807);
+define('MAX_INT64_STRING', '9223372036854775807');
+
+define('MIN_INT64_STRING', '-9223372036854775808');
+if (PHP_INT_SIZE === 8) {
+ define('MIN_INT64', -9223372036854775808);
+} else {
+ define('MIN_INT64', MIN_INT64_STRING);
+}
+
+define('MAX_UINT64_STRING', '-9223372036854775808');
+define('MAX_UINT64', MAX_UINT64_STRING);
+
+class TestUtil
+{
+
+ public static function setTestMessage(TestMessage $m)
+ {
+ $m->setOptionalInt32(-42);
+ $m->setOptionalInt64(-43);
+ $m->setOptionalUint32(42);
+ $m->setOptionalUint64(43);
+ $m->setOptionalSint32(-44);
+ $m->setOptionalSint64(-45);
+ $m->setOptionalFixed32(46);
+ $m->setOptionalFixed64(47);
+ $m->setOptionalSfixed32(-46);
+ $m->setOptionalSfixed64(-47);
+ $m->setOptionalFloat(1.5);
+ $m->setOptionalDouble(1.6);
+ $m->setOptionalBool(true);
+ $m->setOptionalString('a');
+ $m->setOptionalBytes('b');
+ $m->setOptionalEnum(TestEnum::ONE);
+ $m->setOptionalMessage(new TestMessage_Sub());
+ $m->getOptionalMessage()->SetA(33);
+
+ $m->getRepeatedInt32() []= -42;
+ $m->getRepeatedInt64() []= -43;
+ $m->getRepeatedUint32() []= 42;
+ $m->getRepeatedUint64() []= 43;
+ $m->getRepeatedSint32() []= -44;
+ $m->getRepeatedSint64() []= -45;
+ $m->getRepeatedFixed32() []= 46;
+ $m->getRepeatedFixed64() []= 47;
+ $m->getRepeatedSfixed32() []= -46;
+ $m->getRepeatedSfixed64() []= -47;
+ $m->getRepeatedFloat() []= 1.5;
+ $m->getRepeatedDouble() []= 1.6;
+ $m->getRepeatedBool() []= true;
+ $m->getRepeatedString() []= 'a';
+ $m->getRepeatedBytes() []= 'b';
+ $m->getRepeatedEnum() []= TestEnum::ZERO;
+ $m->getRepeatedMessage() []= new TestMessage_Sub();
+ $m->getRepeatedMessage()[0]->setA(34);
+
+ $m->getRepeatedInt32() []= -52;
+ $m->getRepeatedInt64() []= -53;
+ $m->getRepeatedUint32() []= 52;
+ $m->getRepeatedUint64() []= 53;
+ $m->getRepeatedSint32() []= -54;
+ $m->getRepeatedSint64() []= -55;
+ $m->getRepeatedFixed32() []= 56;
+ $m->getRepeatedFixed64() []= 57;
+ $m->getRepeatedSfixed32() []= -56;
+ $m->getRepeatedSfixed64() []= -57;
+ $m->getRepeatedFloat() []= 2.5;
+ $m->getRepeatedDouble() []= 2.6;
+ $m->getRepeatedBool() []= false;
+ $m->getRepeatedString() []= 'c';
+ $m->getRepeatedBytes() []= 'd';
+ $m->getRepeatedEnum() []= TestEnum::ONE;
+ $m->getRepeatedMessage() []= new TestMessage_Sub();
+ $m->getRepeatedMessage()[1]->SetA(35);
+
+ $m->getMapInt32Int32()[-62] = -62;
+ $m->getMapInt64Int64()[-63] = -63;
+ $m->getMapUint32Uint32()[62] = 62;
+ $m->getMapUint64Uint64()[63] = 63;
+ $m->getMapSint32Sint32()[-64] = -64;
+ $m->getMapSint64Sint64()[-65] = -65;
+ $m->getMapFixed32Fixed32()[66] = 66;
+ $m->getMapFixed64Fixed64()[67] = 67;
+ $m->getMapInt32Float()[1] = 3.5;
+ $m->getMapInt32Double()[1] = 3.6;
+ $m->getMapBoolBool()[true] = true;
+ $m->getMapStringString()['e'] = 'e';
+ $m->getMapInt32Bytes()[1] = 'f';
+ $m->getMapInt32Enum()[1] = TestEnum::ONE;
+ $m->getMapInt32Message()[1] = new TestMessage_Sub();
+ $m->getMapInt32Message()[1]->SetA(36);
+ }
+
+ public static function assertTestMessage(TestMessage $m)
+ {
+ assert(-42 === $m->getOptionalInt32());
+ assert(42 === $m->getOptionalUint32());
+ assert(-43 === $m->getOptionalInt64());
+ assert(43 === $m->getOptionalUint64());
+ assert(-44 === $m->getOptionalSint32());
+ assert(-45 === $m->getOptionalSint64());
+ assert(46 === $m->getOptionalFixed32());
+ assert(47 === $m->getOptionalFixed64());
+ assert(-46 === $m->getOptionalSfixed32());
+ assert(-47 === $m->getOptionalSfixed64());
+ assert(1.5 === $m->getOptionalFloat());
+ assert(1.6 === $m->getOptionalDouble());
+ assert(true=== $m->getOptionalBool());
+ assert('a' === $m->getOptionalString());
+ assert('b' === $m->getOptionalBytes());
+ assert(TestEnum::ONE === $m->getOptionalEnum());
+ assert(33 === $m->getOptionalMessage()->getA());
+
+ assert(-42 === $m->getRepeatedInt32()[0]);
+ assert(42 === $m->getRepeatedUint32()[0]);
+ assert(-43 === $m->getRepeatedInt64()[0]);
+ assert(43 === $m->getRepeatedUint64()[0]);
+ assert(-44 === $m->getRepeatedSint32()[0]);
+ assert(-45 === $m->getRepeatedSint64()[0]);
+ assert(46 === $m->getRepeatedFixed32()[0]);
+ assert(47 === $m->getRepeatedFixed64()[0]);
+ assert(-46 === $m->getRepeatedSfixed32()[0]);
+ assert(-47 === $m->getRepeatedSfixed64()[0]);
+ assert(1.5 === $m->getRepeatedFloat()[0]);
+ assert(1.6 === $m->getRepeatedDouble()[0]);
+ assert(true=== $m->getRepeatedBool()[0]);
+ assert('a' === $m->getRepeatedString()[0]);
+ assert('b' === $m->getRepeatedBytes()[0]);
+ assert(TestEnum::ZERO === $m->getRepeatedEnum()[0]);
+ assert(34 === $m->getRepeatedMessage()[0]->getA());
+
+ assert(-52 === $m->getRepeatedInt32()[1]);
+ assert(52 === $m->getRepeatedUint32()[1]);
+ assert(-53 === $m->getRepeatedInt64()[1]);
+ assert(53 === $m->getRepeatedUint64()[1]);
+ assert(-54 === $m->getRepeatedSint32()[1]);
+ assert(-55 === $m->getRepeatedSint64()[1]);
+ assert(56 === $m->getRepeatedFixed32()[1]);
+ assert(57 === $m->getRepeatedFixed64()[1]);
+ assert(-56 === $m->getRepeatedSfixed32()[1]);
+ assert(-57 === $m->getRepeatedSfixed64()[1]);
+ assert(2.5 === $m->getRepeatedFloat()[1]);
+ assert(2.6 === $m->getRepeatedDouble()[1]);
+ assert(false === $m->getRepeatedBool()[1]);
+ assert('c' === $m->getRepeatedString()[1]);
+ assert('d' === $m->getRepeatedBytes()[1]);
+ assert(TestEnum::ONE === $m->getRepeatedEnum()[1]);
+ assert(35 === $m->getRepeatedMessage()[1]->getA());
+
+ assert(-62 === $m->getMapInt32Int32()[-62]);
+ assert(-63 === $m->getMapInt64Int64()[-63]);
+ assert(62 === $m->getMapUint32Uint32()[62]);
+ assert(63 === $m->getMapUint64Uint64()[63]);
+ assert(-64 === $m->getMapSint32Sint32()[-64]);
+ assert(-65 === $m->getMapSint64Sint64()[-65]);
+ assert(66 === $m->getMapFixed32Fixed32()[66]);
+ assert(67 === $m->getMapFixed64Fixed64()[67]);
+ assert(3.5 === $m->getMapInt32Float()[1]);
+ assert(3.6 === $m->getMapInt32Double()[1]);
+ assert(true === $m->getMapBoolBool()[true]);
+ assert('e' === $m->getMapStringString()['e']);
+ assert('f' === $m->getMapInt32Bytes()[1]);
+ assert(TestEnum::ONE === $m->getMapInt32Enum()[1]);
+ assert(36 === $m->getMapInt32Message()[1]->GetA());
+ }
+
+ public static function getGoldenTestMessage()
+ {
+ return hex2bin(
+ "08D6FFFFFF0F" .
+ "10D5FFFFFFFFFFFFFFFF01" .
+ "182A" .
+ "202B" .
+ "2857" .
+ "3059" .
+ "3D2E000000" .
+ "412F00000000000000" .
+ "4DD2FFFFFF" .
+ "51D1FFFFFFFFFFFFFF" .
+ "5D0000C03F" .
+ "619A9999999999F93F" .
+ "6801" .
+ "720161" .
+ "7A0162" .
+ "800101" .
+ "8A01020821" .
+
+ "F801D6FFFFFF0F" .
+ "F801CCFFFFFF0F" .
+ "8002D5FFFFFFFFFFFFFFFF01" .
+ "8002CBFFFFFFFFFFFFFFFF01" .
+ "88022A" .
+ "880234" .
+ "90022B" .
+ "900235" .
+ "980257" .
+ "98026B" .
+ "A00259" .
+ "A0026D" .
+ "AD022E000000" .
+ "AD0238000000" .
+ "B1022F00000000000000" .
+ "B1023900000000000000" .
+ "BD02D2FFFFFF" .
+ "BD02C8FFFFFF" .
+ "C102D1FFFFFFFFFFFFFF" .
+ "C102C7FFFFFFFFFFFFFF" .
+ "CD020000C03F" .
+ "CD0200002040" .
+ "D1029A9999999999F93F" .
+ "D102CDCCCCCCCCCC0440" .
+ "D80201" .
+ "D80200" .
+ "E2020161" .
+ "E2020163" .
+ "EA020162" .
+ "EA020164" .
+ "F00200" .
+ "F00201" .
+ "FA02020822" .
+ "FA02020823" .
+
+ "BA040C08C2FFFFFF0F10C2FFFFFF0F" .
+ "C2041608C1FFFFFFFFFFFFFFFF0110C1FFFFFFFFFFFFFFFF01" .
+ "CA0404083E103E" .
+ "D20404083F103F" .
+ "DA0404087f107F" .
+ "E20406088101108101" .
+ "EA040A0D420000001542000000" .
+ "F20412094300000000000000114300000000000000" .
+ "8A050708011500006040" .
+ "92050B080111CDCCCCCCCCCC0C40" .
+ "9A050408011001" .
+ "A205060a0165120165" .
+ "AA05050801120166" .
+ "B2050408011001" .
+ "Ba0506080112020824"
+ );
+ }
+
+ public static function setTestPackedMessage($m)
+ {
+ $m->getRepeatedInt32()[] = -42;
+ $m->getRepeatedInt32()[] = -52;
+ $m->getRepeatedInt64()[] = -43;
+ $m->getRepeatedInt64()[] = -53;
+ $m->getRepeatedUint32()[] = 42;
+ $m->getRepeatedUint32()[] = 52;
+ $m->getRepeatedUint64()[] = 43;
+ $m->getRepeatedUint64()[] = 53;
+ $m->getRepeatedSint32()[] = -44;
+ $m->getRepeatedSint32()[] = -54;
+ $m->getRepeatedSint64()[] = -45;
+ $m->getRepeatedSint64()[] = -55;
+ $m->getRepeatedFixed32()[] = 46;
+ $m->getRepeatedFixed32()[] = 56;
+ $m->getRepeatedFixed64()[] = 47;
+ $m->getRepeatedFixed64()[] = 57;
+ $m->getRepeatedSfixed32()[] = -46;
+ $m->getRepeatedSfixed32()[] = -56;
+ $m->getRepeatedSfixed64()[] = -47;
+ $m->getRepeatedSfixed64()[] = -57;
+ $m->getRepeatedFloat()[] = 1.5;
+ $m->getRepeatedFloat()[] = 2.5;
+ $m->getRepeatedDouble()[] = 1.6;
+ $m->getRepeatedDouble()[] = 2.6;
+ $m->getRepeatedBool()[] = true;
+ $m->getRepeatedBool()[] = false;
+ $m->getRepeatedEnum()[] = TestEnum::ONE;
+ $m->getRepeatedEnum()[] = TestEnum::ZERO;
+ }
+
+ public static function assertTestPackedMessage($m)
+ {
+ assert(2 === count($m->getRepeatedInt32()));
+ assert(2 === count($m->getRepeatedInt64()));
+ assert(2 === count($m->getRepeatedUint32()));
+ assert(2 === count($m->getRepeatedUint64()));
+ assert(2 === count($m->getRepeatedSint32()));
+ assert(2 === count($m->getRepeatedSint64()));
+ assert(2 === count($m->getRepeatedFixed32()));
+ assert(2 === count($m->getRepeatedFixed64()));
+ assert(2 === count($m->getRepeatedSfixed32()));
+ assert(2 === count($m->getRepeatedSfixed64()));
+ assert(2 === count($m->getRepeatedFloat()));
+ assert(2 === count($m->getRepeatedDouble()));
+ assert(2 === count($m->getRepeatedBool()));
+ assert(2 === count($m->getRepeatedEnum()));
+
+ assert(-42 === $m->getRepeatedInt32()[0]);
+ assert(-52 === $m->getRepeatedInt32()[1]);
+ assert(-43 === $m->getRepeatedInt64()[0]);
+ assert(-53 === $m->getRepeatedInt64()[1]);
+ assert(42 === $m->getRepeatedUint32()[0]);
+ assert(52 === $m->getRepeatedUint32()[1]);
+ assert(43 === $m->getRepeatedUint64()[0]);
+ assert(53 === $m->getRepeatedUint64()[1]);
+ assert(-44 === $m->getRepeatedSint32()[0]);
+ assert(-54 === $m->getRepeatedSint32()[1]);
+ assert(-45 === $m->getRepeatedSint64()[0]);
+ assert(-55 === $m->getRepeatedSint64()[1]);
+ assert(46 === $m->getRepeatedFixed32()[0]);
+ assert(56 === $m->getRepeatedFixed32()[1]);
+ assert(47 === $m->getRepeatedFixed64()[0]);
+ assert(57 === $m->getRepeatedFixed64()[1]);
+ assert(-46 === $m->getRepeatedSfixed32()[0]);
+ assert(-56 === $m->getRepeatedSfixed32()[1]);
+ assert(-47 === $m->getRepeatedSfixed64()[0]);
+ assert(-57 === $m->getRepeatedSfixed64()[1]);
+ assert(1.5 === $m->getRepeatedFloat()[0]);
+ assert(2.5 === $m->getRepeatedFloat()[1]);
+ assert(1.6 === $m->getRepeatedDouble()[0]);
+ assert(2.6 === $m->getRepeatedDouble()[1]);
+ assert(true === $m->getRepeatedBool()[0]);
+ assert(false === $m->getRepeatedBool()[1]);
+ assert(TestEnum::ONE === $m->getRepeatedEnum()[0]);
+ assert(TestEnum::ZERO === $m->getRepeatedEnum()[1]);
+ }
+
+ public static function getGoldenTestPackedMessage()
+ {
+ return hex2bin(
+ "D2050AD6FFFFFF0FCCFFFFFF0F" .
+ "DA0514D5FFFFFFFFFFFFFFFF01CBFFFFFFFFFFFFFFFF01" .
+ "E205022A34" .
+ "EA05022B35" .
+ "F20502576B" .
+ "FA0502596D" .
+ "8206082E00000038000000" .
+ "8A06102F000000000000003900000000000000" .
+ "920608D2FFFFFFC8FFFFFF" .
+ "9A0610D1FFFFFFFFFFFFFFC7FFFFFFFFFFFFFF" .
+ "A206080000C03F00002040" .
+ "AA06109A9999999999F93FCDCCCCCCCCCC0440" .
+ "B206020100" .
+ "BA06020100"
+ );
+ }
+
+ public static function getGoldenTestUnpackedMessage()
+ {
+ return hex2bin(
+ "D005D6FFFFFF0FD005CCFFFFFF0F" .
+ "D805D5FFFFFFFFFFFFFFFF01D805CBFFFFFFFFFFFFFFFF01" .
+ "E0052AE00534" .
+ "E8052BE80535" .
+ "F00557F0056B" .
+ "F80559F8056D" .
+ "85062E000000850638000000" .
+ "89062F0000000000000089063900000000000000" .
+ "9506D2FFFFFF9506C8FFFFFF" .
+ "9906D1FFFFFFFFFFFFFF9906C7FFFFFFFFFFFFFF" .
+ "A5060000C03FA50600002040" .
+ "A9069A9999999999F93FA906CDCCCCCCCCCC0440" .
+ "B00601B00600" .
+ "B80601B80600"
+ );
+ }
+}