| <?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\TestRandomFieldOrder; | 
 | use Foo\TestUnpackedMessage; | 
 |  | 
 | class EncodeDecodeTest extends TestBase | 
 | { | 
 |  | 
 |     public function testEncode() | 
 |     { | 
 |         $from = new TestMessage(); | 
 |         $this->expectEmptyFields($from); | 
 |         $this->setFields($from); | 
 |         $this->expectFields($from); | 
 |  | 
 |         $data = $from->serializeToString(); | 
 |         $this->assertSame(bin2hex(TestUtil::getGoldenTestMessage()), | 
 |                           bin2hex($data)); | 
 |     } | 
 |  | 
 |     public function testDecode() | 
 |     { | 
 |         $to = new TestMessage(); | 
 |         $to->mergeFromString(TestUtil::getGoldenTestMessage()); | 
 |         $this->expectFields($to); | 
 |     } | 
 |  | 
 |     public function testEncodeDecode() | 
 |     { | 
 |         $from = new TestMessage(); | 
 |         $this->expectEmptyFields($from); | 
 |         $this->setFields($from); | 
 |         $this->expectFields($from); | 
 |  | 
 |         $data = $from->serializeToString(); | 
 |  | 
 |         $to = new TestMessage(); | 
 |         $to->mergeFromString($data); | 
 |         $this->expectFields($to); | 
 |     } | 
 |  | 
 |     public function testEncodeDecodeEmpty() | 
 |     { | 
 |         $from = new TestMessage(); | 
 |         $this->expectEmptyFields($from); | 
 |  | 
 |         $data = $from->serializeToString(); | 
 |  | 
 |         $to = new TestMessage(); | 
 |         $to->mergeFromString($data); | 
 |         $this->expectEmptyFields($to); | 
 |     } | 
 |  | 
 |     public function testEncodeDecodeOneof() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |  | 
 |         $m->setOneofInt32(1); | 
 |         $data = $m->serializeToString(); | 
 |         $n = new TestMessage(); | 
 |         $n->mergeFromString($data); | 
 |         $this->assertSame(1, $n->getOneofInt32()); | 
 |  | 
 |         $m->setOneofFloat(2.0); | 
 |         $data = $m->serializeToString(); | 
 |         $n = new TestMessage(); | 
 |         $n->mergeFromString($data); | 
 |         $this->assertSame(2.0, $n->getOneofFloat()); | 
 |  | 
 |         $m->setOneofString('abc'); | 
 |         $data = $m->serializeToString(); | 
 |         $n = new TestMessage(); | 
 |         $n->mergeFromString($data); | 
 |         $this->assertSame('abc', $n->getOneofString()); | 
 |  | 
 |         $sub_m = new TestMessage_Sub(); | 
 |         $sub_m->setA(1); | 
 |         $m->setOneofMessage($sub_m); | 
 |         $data = $m->serializeToString(); | 
 |         $n = new TestMessage(); | 
 |         $n->mergeFromString($data); | 
 |         $this->assertSame(1, $n->getOneofMessage()->getA()); | 
 |  | 
 |         // Encode default value | 
 |         $m->setOneofEnum(TestEnum::ZERO); | 
 |         $data = $m->serializeToString(); | 
 |         $n = new TestMessage(); | 
 |         $n->mergeFromString($data); | 
 |         $this->assertSame("oneof_enum", $n->getMyOneof()); | 
 |         $this->assertSame(TestEnum::ZERO, $n->getOneofEnum()); | 
 |  | 
 |         $m->setOneofString(""); | 
 |         $data = $m->serializeToString(); | 
 |         $n = new TestMessage(); | 
 |         $n->mergeFromString($data); | 
 |         $this->assertSame("oneof_string", $n->getMyOneof()); | 
 |         $this->assertSame("", $n->getOneofString()); | 
 |  | 
 |         $sub_m = new TestMessage_Sub(); | 
 |         $m->setOneofMessage($sub_m); | 
 |         $data = $m->serializeToString(); | 
 |         $n = new TestMessage(); | 
 |         $n->mergeFromString($data); | 
 |         $this->assertSame("oneof_message", $n->getMyOneof()); | 
 |         $this->assertFalse(is_null($n->getOneofMessage())); | 
 |  | 
 |     } | 
 |  | 
 |     public function testPackedEncode() | 
 |     { | 
 |         $from = new TestPackedMessage(); | 
 |         TestUtil::setTestPackedMessage($from); | 
 |         $this->assertSame(TestUtil::getGoldenTestPackedMessage(), | 
 |                           $from->serializeToString()); | 
 |     } | 
 |  | 
 |     public function testPackedDecodePacked() | 
 |     { | 
 |         $to = new TestPackedMessage(); | 
 |         $to->mergeFromString(TestUtil::getGoldenTestPackedMessage()); | 
 |         TestUtil::assertTestPackedMessage($to); | 
 |     } | 
 |  | 
 |     public function testPackedDecodeUnpacked() | 
 |     { | 
 |         $to = new TestPackedMessage(); | 
 |         $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage()); | 
 |         TestUtil::assertTestPackedMessage($to); | 
 |     } | 
 |  | 
 |     public function testUnpackedEncode() | 
 |     { | 
 |         $from = new TestUnpackedMessage(); | 
 |         TestUtil::setTestPackedMessage($from); | 
 |         $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(), | 
 |                           $from->serializeToString()); | 
 |     } | 
 |  | 
 |     public function testUnpackedDecodePacked() | 
 |     { | 
 |         $to = new TestUnpackedMessage(); | 
 |         $to->mergeFromString(TestUtil::getGoldenTestPackedMessage()); | 
 |         TestUtil::assertTestPackedMessage($to); | 
 |     } | 
 |  | 
 |     public function testUnpackedDecodeUnpacked() | 
 |     { | 
 |         $to = new TestUnpackedMessage(); | 
 |         $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage()); | 
 |         TestUtil::assertTestPackedMessage($to); | 
 |     } | 
 |  | 
 |     public function testDecodeInt64() | 
 |     { | 
 |         // Read 64 testing | 
 |         $testVals = array( | 
 |             '10'                 => '100a', | 
 |             '100'                => '1064', | 
 |             '800'                => '10a006', | 
 |             '6400'               => '108032', | 
 |             '70400'              => '1080a604', | 
 |             '774400'             => '1080a22f', | 
 |             '9292800'            => '108098b704', | 
 |             '74342400'           => '1080c0b923', | 
 |             '743424000'          => '108080bfe202', | 
 |             '8177664000'         => '108080b5bb1e', | 
 |             '65421312000'        => '108080a8dbf301', | 
 |             '785055744000'       => '108080e0c7ec16', | 
 |             '9420668928000'      => '10808080dd969202', | 
 |             '103627358208000'    => '10808080fff9c717', | 
 |             '1139900940288000'   => '10808080f5bd978302', | 
 |             '13678811283456000'  => '10808080fce699a618', | 
 |             '109430490267648000' => '10808080e0b7ceb1c201', | 
 |             '984874412408832000' => '10808080e0f5c1bed50d', | 
 |         ); | 
 |  | 
 |         $msg = new TestMessage(); | 
 |         foreach ($testVals as $original => $encoded) { | 
 |             $msg->setOptionalInt64($original); | 
 |             $data = $msg->serializeToString(); | 
 |             $this->assertSame($encoded, bin2hex($data)); | 
 |             $msg->setOptionalInt64(0); | 
 |             $msg->mergeFromString($data); | 
 |             $this->assertEquals($original, $msg->getOptionalInt64()); | 
 |         } | 
 |     } | 
 |  | 
 |     public function testDecodeToExistingMessage() | 
 |     { | 
 |         $m1 = new TestMessage(); | 
 |         $this->setFields($m1); | 
 |         $this->expectFields($m1); | 
 |  | 
 |         $m2 = new TestMessage(); | 
 |         $this->setFields2($m2); | 
 |         $data = $m2->serializeToString(); | 
 |  | 
 |         $m1->mergeFromString($data); | 
 |         $this->expectFieldsMerged($m1); | 
 |     } | 
 |  | 
 |     public function testDecodeFieldNonExist() | 
 |     { | 
 |         $data = hex2bin('c80501'); | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString($data); | 
 |     } | 
 |  | 
 |     public function testEncodeNegativeInt32() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->setOptionalInt32(-1); | 
 |         $data = $m->serializeToString(); | 
 |         $this->assertSame("08ffffffffffffffffff01", bin2hex($data)); | 
 |     } | 
 |  | 
 |     public function testDecodeNegativeInt32() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $this->assertEquals(0, $m->getOptionalInt32()); | 
 |         $m->mergeFromString(hex2bin("08ffffffffffffffffff01")); | 
 |         $this->assertEquals(-1, $m->getOptionalInt32()); | 
 |  | 
 |         $m = new TestMessage(); | 
 |         $this->assertEquals(0, $m->getOptionalInt32()); | 
 |         $m->mergeFromString(hex2bin("08ffffffff0f")); | 
 |         $this->assertEquals(-1, $m->getOptionalInt32()); | 
 |     } | 
 |  | 
 |     public function testRandomFieldOrder() | 
 |     { | 
 |         $m = new TestRandomFieldOrder(); | 
 |         $data = $m->serializeToString(); | 
 |         $this->assertSame("", $data); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidInt32() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('08')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidSubMessage() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('9A010108')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidInt64() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('10')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidUInt32() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('18')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidUInt64() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('20')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidSInt32() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('28')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidSInt64() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('30')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidFixed32() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('3D')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidFixed64() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('41')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidSFixed32() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('4D')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidSFixed64() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('51')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidFloat() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('5D')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidDouble() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('61')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidBool() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('68')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidStringLengthMiss() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('72')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidStringDataMiss() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('7201')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidBytesLengthMiss() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('7A')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidBytesDataMiss() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('7A01')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidEnum() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('8001')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidMessageLengthMiss() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('8A01')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidMessageDataMiss() | 
 |     { | 
 |         $m = new TestMessage(); | 
 |         $m->mergeFromString(hex2bin('8A0101')); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @expectedException Exception | 
 |      */ | 
 |     public function testDecodeInvalidPackedMessageLength() | 
 |     { | 
 |         $m = new TestPackedMessage(); | 
 |         $m->mergeFromString(hex2bin('D205')); | 
 |     } | 
 |  | 
 |     public function testUnknown() | 
 |     { | 
 |         // Test preserve unknown for varint. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('F80601');  // TODO(teboring): Add a util to encode | 
 |                                     // varint for better readability | 
 |         $m->mergeFromString($from); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame(bin2hex($from), bin2hex($to)); | 
 |  | 
 |         // Test preserve unknown for 64-bit. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('F9060000000000000000'); | 
 |         $m->mergeFromString($from); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame(bin2hex($from), bin2hex($to)); | 
 |  | 
 |         // Test preserve unknown for length delimited. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('FA0600'); | 
 |         $m->mergeFromString($from); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame(bin2hex($from), bin2hex($to)); | 
 |  | 
 |         // Test preserve unknown for 32-bit. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('FD0600000000'); | 
 |         $m->mergeFromString($from); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame(bin2hex($from), bin2hex($to)); | 
 |  | 
 |         // Test discard unknown in message. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('F80601'); | 
 |         $m->mergeFromString($from); | 
 |         $m->discardUnknownFields(); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame("", bin2hex($to)); | 
 |  | 
 |         // Test discard unknown for singular message field. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('8A0103F80601'); | 
 |         $m->mergeFromString($from); | 
 |         $m->discardUnknownFields(); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame("8a0100", bin2hex($to)); | 
 |  | 
 |         // Test discard unknown for repeated message field. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('FA0203F80601'); | 
 |         $m->mergeFromString($from); | 
 |         $m->discardUnknownFields(); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame("fa0200", bin2hex($to)); | 
 |  | 
 |         // Test discard unknown for map message value field. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin("BA050708011203F80601"); | 
 |         $m->mergeFromString($from); | 
 |         $m->discardUnknownFields(); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame("ba050408011200", bin2hex($to)); | 
 |  | 
 |         // Test discard unknown for singular message field. | 
 |         $m = new TestMessage(); | 
 |         $from = hex2bin('9A0403F80601'); | 
 |         $m->mergeFromString($from); | 
 |         $m->discardUnknownFields(); | 
 |         $to = $m->serializeToString(); | 
 |         $this->assertSame("9a0400", bin2hex($to)); | 
 |     } | 
 |  | 
 |     public function testJsonEncode() | 
 |     { | 
 |         $from = new TestMessage(); | 
 |         $this->setFields($from); | 
 |         $data = $from->serializeToJsonString(); | 
 |         $to = new TestMessage(); | 
 |         $to->mergeFromJsonString($data); | 
 |         $this->expectFields($to); | 
 |     } | 
 | } |