1ffe3c632Sopenharmony_ci<?php 2ffe3c632Sopenharmony_ci 3ffe3c632Sopenharmony_cirequire_once('test_base.php'); 4ffe3c632Sopenharmony_cirequire_once('test_util.php'); 5ffe3c632Sopenharmony_ci 6ffe3c632Sopenharmony_ciuse Foo\TestEnum; 7ffe3c632Sopenharmony_ciuse Foo\TestMessage; 8ffe3c632Sopenharmony_ciuse Foo\TestMessage\Sub; 9ffe3c632Sopenharmony_ciuse Foo\TestPackedMessage; 10ffe3c632Sopenharmony_ciuse Google\Protobuf\Internal\CodedInputStream; 11ffe3c632Sopenharmony_ciuse Google\Protobuf\Internal\FileDescriptorSet; 12ffe3c632Sopenharmony_ciuse Google\Protobuf\Internal\GPBLabel; 13ffe3c632Sopenharmony_ciuse Google\Protobuf\Internal\GPBType; 14ffe3c632Sopenharmony_ciuse Google\Protobuf\Internal\GPBWire; 15ffe3c632Sopenharmony_ciuse Google\Protobuf\Internal\CodedOutputStream; 16ffe3c632Sopenharmony_ci 17ffe3c632Sopenharmony_ci/** 18ffe3c632Sopenharmony_ci * Please note, this test is only intended to be run without the protobuf C 19ffe3c632Sopenharmony_ci * extension. 20ffe3c632Sopenharmony_ci */ 21ffe3c632Sopenharmony_ciclass ImplementationTest extends TestBase 22ffe3c632Sopenharmony_ci{ 23ffe3c632Sopenharmony_ci public function setUp() 24ffe3c632Sopenharmony_ci { 25ffe3c632Sopenharmony_ci if (extension_loaded('protobuf')) { 26ffe3c632Sopenharmony_ci $this->markTestSkipped(); 27ffe3c632Sopenharmony_ci } 28ffe3c632Sopenharmony_ci } 29ffe3c632Sopenharmony_ci 30ffe3c632Sopenharmony_ci public function testReadInt32() 31ffe3c632Sopenharmony_ci { 32ffe3c632Sopenharmony_ci $value = null; 33ffe3c632Sopenharmony_ci 34ffe3c632Sopenharmony_ci // Positive number. 35ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("01")); 36ffe3c632Sopenharmony_ci GPBWire::readInt32($input, $value); 37ffe3c632Sopenharmony_ci $this->assertSame(1, $value); 38ffe3c632Sopenharmony_ci 39ffe3c632Sopenharmony_ci // Negative number. 40ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("ffffffff0f")); 41ffe3c632Sopenharmony_ci GPBWire::readInt32($input, $value); 42ffe3c632Sopenharmony_ci $this->assertSame(-1, $value); 43ffe3c632Sopenharmony_ci 44ffe3c632Sopenharmony_ci // Discard overflow bits. 45ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("ffffffff7f")); 46ffe3c632Sopenharmony_ci GPBWire::readInt32($input, $value); 47ffe3c632Sopenharmony_ci $this->assertSame(-1, $value); 48ffe3c632Sopenharmony_ci } 49ffe3c632Sopenharmony_ci 50ffe3c632Sopenharmony_ci public function testReadUint32() 51ffe3c632Sopenharmony_ci { 52ffe3c632Sopenharmony_ci $value = null; 53ffe3c632Sopenharmony_ci 54ffe3c632Sopenharmony_ci // Positive number. 55ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("01")); 56ffe3c632Sopenharmony_ci GPBWire::readUint32($input, $value); 57ffe3c632Sopenharmony_ci $this->assertSame(1, $value); 58ffe3c632Sopenharmony_ci 59ffe3c632Sopenharmony_ci // Max uint32. 60ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("ffffffff0f")); 61ffe3c632Sopenharmony_ci GPBWire::readUint32($input, $value); 62ffe3c632Sopenharmony_ci $this->assertSame(-1, $value); 63ffe3c632Sopenharmony_ci 64ffe3c632Sopenharmony_ci // Discard overflow bits. 65ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("ffffffff7f")); 66ffe3c632Sopenharmony_ci GPBWire::readUint32($input, $value); 67ffe3c632Sopenharmony_ci $this->assertSame(-1, $value); 68ffe3c632Sopenharmony_ci } 69ffe3c632Sopenharmony_ci 70ffe3c632Sopenharmony_ci public function testReadInt64() 71ffe3c632Sopenharmony_ci { 72ffe3c632Sopenharmony_ci $value = null; 73ffe3c632Sopenharmony_ci 74ffe3c632Sopenharmony_ci // Positive number. 75ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("01")); 76ffe3c632Sopenharmony_ci GPBWire::readInt64($input, $value); 77ffe3c632Sopenharmony_ci $this->assertEquals(1, $value); 78ffe3c632Sopenharmony_ci 79ffe3c632Sopenharmony_ci // Negative number. 80ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("ffffffffffffffffff01")); 81ffe3c632Sopenharmony_ci GPBWire::readInt64($input, $value); 82ffe3c632Sopenharmony_ci $this->assertEquals(-1, $value); 83ffe3c632Sopenharmony_ci 84ffe3c632Sopenharmony_ci // Discard overflow bits. 85ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("ffffffffffffffffff0f")); 86ffe3c632Sopenharmony_ci GPBWire::readInt64($input, $value); 87ffe3c632Sopenharmony_ci $this->assertEquals(-1, $value); 88ffe3c632Sopenharmony_ci } 89ffe3c632Sopenharmony_ci 90ffe3c632Sopenharmony_ci public function testReadUint64() 91ffe3c632Sopenharmony_ci { 92ffe3c632Sopenharmony_ci $value = null; 93ffe3c632Sopenharmony_ci 94ffe3c632Sopenharmony_ci // Positive number. 95ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("01")); 96ffe3c632Sopenharmony_ci GPBWire::readUint64($input, $value); 97ffe3c632Sopenharmony_ci $this->assertEquals(1, $value); 98ffe3c632Sopenharmony_ci 99ffe3c632Sopenharmony_ci // Negative number. 100ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("FFFFFFFFFFFFFFFFFF01")); 101ffe3c632Sopenharmony_ci GPBWire::readUint64($input, $value); 102ffe3c632Sopenharmony_ci $this->assertEquals(-1, $value); 103ffe3c632Sopenharmony_ci 104ffe3c632Sopenharmony_ci // Discard overflow bits. 105ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("FFFFFFFFFFFFFFFFFF0F")); 106ffe3c632Sopenharmony_ci GPBWire::readUint64($input, $value); 107ffe3c632Sopenharmony_ci $this->assertEquals(-1, $value); 108ffe3c632Sopenharmony_ci } 109ffe3c632Sopenharmony_ci 110ffe3c632Sopenharmony_ci public function testReadSint32() 111ffe3c632Sopenharmony_ci { 112ffe3c632Sopenharmony_ci $value = null; 113ffe3c632Sopenharmony_ci 114ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("00")); 115ffe3c632Sopenharmony_ci GPBWire::readSint32($input, $value); 116ffe3c632Sopenharmony_ci $this->assertSame(0, $value); 117ffe3c632Sopenharmony_ci 118ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("01")); 119ffe3c632Sopenharmony_ci GPBWire::readSint32($input, $value); 120ffe3c632Sopenharmony_ci $this->assertSame(-1, $value); 121ffe3c632Sopenharmony_ci 122ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("02")); 123ffe3c632Sopenharmony_ci GPBWire::readSint32($input, $value); 124ffe3c632Sopenharmony_ci $this->assertSame(1, $value); 125ffe3c632Sopenharmony_ci } 126ffe3c632Sopenharmony_ci 127ffe3c632Sopenharmony_ci public function testReadSint64() 128ffe3c632Sopenharmony_ci { 129ffe3c632Sopenharmony_ci $value = null; 130ffe3c632Sopenharmony_ci 131ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("00")); 132ffe3c632Sopenharmony_ci GPBWire::readSint64($input, $value); 133ffe3c632Sopenharmony_ci $this->assertEquals(0, $value); 134ffe3c632Sopenharmony_ci 135ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("01")); 136ffe3c632Sopenharmony_ci GPBWire::readSint64($input, $value); 137ffe3c632Sopenharmony_ci $this->assertEquals(-1, $value); 138ffe3c632Sopenharmony_ci 139ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("02")); 140ffe3c632Sopenharmony_ci GPBWire::readSint64($input, $value); 141ffe3c632Sopenharmony_ci $this->assertEquals(1, $value); 142ffe3c632Sopenharmony_ci } 143ffe3c632Sopenharmony_ci 144ffe3c632Sopenharmony_ci public function testReadFixed32() 145ffe3c632Sopenharmony_ci { 146ffe3c632Sopenharmony_ci $value = null; 147ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("12345678")); 148ffe3c632Sopenharmony_ci GPBWire::readFixed32($input, $value); 149ffe3c632Sopenharmony_ci $this->assertSame(0x78563412, $value); 150ffe3c632Sopenharmony_ci } 151ffe3c632Sopenharmony_ci 152ffe3c632Sopenharmony_ci public function testReadFixed64() 153ffe3c632Sopenharmony_ci { 154ffe3c632Sopenharmony_ci $value = null; 155ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("1234567812345678")); 156ffe3c632Sopenharmony_ci GPBWire::readFixed64($input, $value); 157ffe3c632Sopenharmony_ci if (PHP_INT_SIZE == 4) { 158ffe3c632Sopenharmony_ci $this->assertSame("8671175386481439762", $value); 159ffe3c632Sopenharmony_ci } else { 160ffe3c632Sopenharmony_ci $this->assertSame(0x7856341278563412, $value); 161ffe3c632Sopenharmony_ci } 162ffe3c632Sopenharmony_ci } 163ffe3c632Sopenharmony_ci 164ffe3c632Sopenharmony_ci public function testReadSfixed32() 165ffe3c632Sopenharmony_ci { 166ffe3c632Sopenharmony_ci $value = null; 167ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("12345678")); 168ffe3c632Sopenharmony_ci GPBWire::readSfixed32($input, $value); 169ffe3c632Sopenharmony_ci $this->assertSame(0x78563412, $value); 170ffe3c632Sopenharmony_ci } 171ffe3c632Sopenharmony_ci 172ffe3c632Sopenharmony_ci public function testReadFloat() 173ffe3c632Sopenharmony_ci { 174ffe3c632Sopenharmony_ci $value = null; 175ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("0000803F")); 176ffe3c632Sopenharmony_ci GPBWire::readFloat($input, $value); 177ffe3c632Sopenharmony_ci $this->assertSame(1.0, $value); 178ffe3c632Sopenharmony_ci } 179ffe3c632Sopenharmony_ci 180ffe3c632Sopenharmony_ci public function testReadBool() 181ffe3c632Sopenharmony_ci { 182ffe3c632Sopenharmony_ci $value = null; 183ffe3c632Sopenharmony_ci 184ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("00")); 185ffe3c632Sopenharmony_ci GPBWire::readBool($input, $value); 186ffe3c632Sopenharmony_ci $this->assertSame(false, $value); 187ffe3c632Sopenharmony_ci 188ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("01")); 189ffe3c632Sopenharmony_ci GPBWire::readBool($input, $value); 190ffe3c632Sopenharmony_ci $this->assertSame(true, $value); 191ffe3c632Sopenharmony_ci } 192ffe3c632Sopenharmony_ci 193ffe3c632Sopenharmony_ci public function testReadDouble() 194ffe3c632Sopenharmony_ci { 195ffe3c632Sopenharmony_ci $value = null; 196ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("000000000000F03F")); 197ffe3c632Sopenharmony_ci GPBWire::readDouble($input, $value); 198ffe3c632Sopenharmony_ci $this->assertSame(1.0, $value); 199ffe3c632Sopenharmony_ci } 200ffe3c632Sopenharmony_ci 201ffe3c632Sopenharmony_ci public function testReadSfixed64() 202ffe3c632Sopenharmony_ci { 203ffe3c632Sopenharmony_ci $value = null; 204ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin("1234567812345678")); 205ffe3c632Sopenharmony_ci GPBWire::readSfixed64($input, $value); 206ffe3c632Sopenharmony_ci if (PHP_INT_SIZE == 4) { 207ffe3c632Sopenharmony_ci $this->assertSame("8671175386481439762", $value); 208ffe3c632Sopenharmony_ci } else { 209ffe3c632Sopenharmony_ci $this->assertSame(0x7856341278563412, $value); 210ffe3c632Sopenharmony_ci } 211ffe3c632Sopenharmony_ci } 212ffe3c632Sopenharmony_ci 213ffe3c632Sopenharmony_ci public function testZigZagEncodeDecode() 214ffe3c632Sopenharmony_ci { 215ffe3c632Sopenharmony_ci $this->assertSame(0, GPBWire::zigZagEncode32(0)); 216ffe3c632Sopenharmony_ci $this->assertSame(1, GPBWire::zigZagEncode32(-1)); 217ffe3c632Sopenharmony_ci $this->assertSame(2, GPBWire::zigZagEncode32(1)); 218ffe3c632Sopenharmony_ci $this->assertSame(3, GPBWire::zigZagEncode32(-2)); 219ffe3c632Sopenharmony_ci $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode32(0x3FFFFFFF)); 220ffe3c632Sopenharmony_ci $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(0xC0000000)); 221ffe3c632Sopenharmony_ci $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(-1073741824)); 222ffe3c632Sopenharmony_ci 223ffe3c632Sopenharmony_ci $this->assertSame(0, GPBWire::zigZagDecode32(0)); 224ffe3c632Sopenharmony_ci $this->assertSame(-1, GPBWire::zigZagDecode32(1)); 225ffe3c632Sopenharmony_ci $this->assertSame(1, GPBWire::zigZagDecode32(2)); 226ffe3c632Sopenharmony_ci $this->assertSame(-2, GPBWire::zigZagDecode32(3)); 227ffe3c632Sopenharmony_ci $this->assertSame(0x3FFFFFFF, GPBWire::zigZagDecode32(0x7FFFFFFE)); 228ffe3c632Sopenharmony_ci $this->assertSame(-1073741824, GPBWire::zigZagDecode32(0x7FFFFFFF)); 229ffe3c632Sopenharmony_ci $this->assertSame(0x7FFFFFFF, GPBWire::zigZagDecode32(0xFFFFFFFE)); 230ffe3c632Sopenharmony_ci $this->assertSame((int)-2147483648,GPBWire::zigZagDecode32(0xFFFFFFFF)); 231ffe3c632Sopenharmony_ci 232ffe3c632Sopenharmony_ci if (PHP_INT_SIZE == 4) { 233ffe3c632Sopenharmony_ci $this->assertSame(-2, GPBWire::zigZagEncode32(0x7FFFFFFF)); 234ffe3c632Sopenharmony_ci $this->assertSame(-1, GPBWire::zigZagEncode32(0x80000000)); 235ffe3c632Sopenharmony_ci $this->assertSame('0', GPBWire::zigZagEncode64(0)); 236ffe3c632Sopenharmony_ci $this->assertSame('1', GPBWire::zigZagEncode64(-1)); 237ffe3c632Sopenharmony_ci $this->assertSame('2', GPBWire::zigZagEncode64(1)); 238ffe3c632Sopenharmony_ci $this->assertSame('3', GPBWire::zigZagEncode64(-2)); 239ffe3c632Sopenharmony_ci $this->assertSame( 240ffe3c632Sopenharmony_ci '2147483646', // 0x7FFFFFE 241ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(0x3FFFFFFF)); 242ffe3c632Sopenharmony_ci $this->assertSame( 243ffe3c632Sopenharmony_ci '2147483647', // 0x7FFFFFF 244ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(-1073741824)); // 0xFFFFFFFFC0000000 245ffe3c632Sopenharmony_ci $this->assertSame( 246ffe3c632Sopenharmony_ci '4294967294', // 0xFFFFFFFE 247ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(2147483647)); // 0x7FFFFFFF 248ffe3c632Sopenharmony_ci $this->assertSame( 249ffe3c632Sopenharmony_ci '4294967295', // 0xFFFFFFFF 250ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(-2147483648)); // 0xFFFFFFFF80000000 251ffe3c632Sopenharmony_ci $this->assertSame( 252ffe3c632Sopenharmony_ci '18446744073709551614', // 0xFFFFFFFFFFFFFFFE 253ffe3c632Sopenharmony_ci // 0x7FFFFFFFFFFFFFFF 254ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64("9223372036854775807")); 255ffe3c632Sopenharmony_ci $this->assertSame( 256ffe3c632Sopenharmony_ci '18446744073709551615', // 0xFFFFFFFFFFFFFFFF 257ffe3c632Sopenharmony_ci // 0x8000000000000000 258ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64("-9223372036854775808")); 259ffe3c632Sopenharmony_ci 260ffe3c632Sopenharmony_ci $this->assertSame('0', GPBWire::zigZagDecode64(0)); 261ffe3c632Sopenharmony_ci $this->assertSame('-1', GPBWire::zigZagDecode64(1)); 262ffe3c632Sopenharmony_ci $this->assertSame('1', GPBWire::zigZagDecode64(2)); 263ffe3c632Sopenharmony_ci $this->assertSame('-2', GPBWire::zigZagDecode64(3)); 264ffe3c632Sopenharmony_ci } else { 265ffe3c632Sopenharmony_ci $this->assertSame(4294967294, GPBWire::zigZagEncode32(0x7FFFFFFF)); 266ffe3c632Sopenharmony_ci $this->assertSame(4294967295, GPBWire::zigZagEncode32(0x80000000)); 267ffe3c632Sopenharmony_ci $this->assertSame(0, GPBWire::zigZagEncode64(0)); 268ffe3c632Sopenharmony_ci $this->assertSame(1, GPBWire::zigZagEncode64(-1)); 269ffe3c632Sopenharmony_ci $this->assertSame(2, GPBWire::zigZagEncode64(1)); 270ffe3c632Sopenharmony_ci $this->assertSame(3, GPBWire::zigZagEncode64(-2)); 271ffe3c632Sopenharmony_ci $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode64(0x3FFFFFFF)); 272ffe3c632Sopenharmony_ci $this->assertSame( 273ffe3c632Sopenharmony_ci 0x7FFFFFFF, 274ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(0xFFFFFFFFC0000000)); 275ffe3c632Sopenharmony_ci $this->assertSame( 276ffe3c632Sopenharmony_ci 0xFFFFFFFE, 277ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(0x7FFFFFFF)); 278ffe3c632Sopenharmony_ci $this->assertSame( 279ffe3c632Sopenharmony_ci 0xFFFFFFFF, 280ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(0xFFFFFFFF80000000)); 281ffe3c632Sopenharmony_ci $this->assertSame( 282ffe3c632Sopenharmony_ci -2, // 0xFFFFFFFFFFFFFFFE 283ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(0x7FFFFFFFFFFFFFFF)); 284ffe3c632Sopenharmony_ci $this->assertSame( 285ffe3c632Sopenharmony_ci -1, // 0xFFFFFFFFFFFFFFFF 286ffe3c632Sopenharmony_ci GPBWire::zigZagEncode64(0x8000000000000000)); 287ffe3c632Sopenharmony_ci 288ffe3c632Sopenharmony_ci $this->assertSame(0, GPBWire::zigZagDecode64(0)); 289ffe3c632Sopenharmony_ci $this->assertSame(-1, GPBWire::zigZagDecode64(1)); 290ffe3c632Sopenharmony_ci $this->assertSame(1, GPBWire::zigZagDecode64(2)); 291ffe3c632Sopenharmony_ci $this->assertSame(-2, GPBWire::zigZagDecode64(3)); 292ffe3c632Sopenharmony_ci } 293ffe3c632Sopenharmony_ci 294ffe3c632Sopenharmony_ci // Round trip 295ffe3c632Sopenharmony_ci $this->assertSame(0, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(0))); 296ffe3c632Sopenharmony_ci $this->assertSame(1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(1))); 297ffe3c632Sopenharmony_ci $this->assertSame(-1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-1))); 298ffe3c632Sopenharmony_ci $this->assertSame(14927, 299ffe3c632Sopenharmony_ci GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(14927))); 300ffe3c632Sopenharmony_ci $this->assertSame(-3612, 301ffe3c632Sopenharmony_ci GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-3612))); 302ffe3c632Sopenharmony_ci } 303ffe3c632Sopenharmony_ci 304ffe3c632Sopenharmony_ci public function testDecode() 305ffe3c632Sopenharmony_ci { 306ffe3c632Sopenharmony_ci $m = new TestMessage(); 307ffe3c632Sopenharmony_ci $m->mergeFromString(TestUtil::getGoldenTestMessage()); 308ffe3c632Sopenharmony_ci TestUtil::assertTestMessage($m); 309ffe3c632Sopenharmony_ci } 310ffe3c632Sopenharmony_ci 311ffe3c632Sopenharmony_ci public function testDescriptorDecode() 312ffe3c632Sopenharmony_ci { 313ffe3c632Sopenharmony_ci $file_desc_set = new FileDescriptorSet(); 314ffe3c632Sopenharmony_ci $file_desc_set->mergeFromString(hex2bin( 315ffe3c632Sopenharmony_ci "0a3b0a12746573745f696e636c7564652e70726f746f120362617222180a" . 316ffe3c632Sopenharmony_ci "0b54657374496e636c75646512090a0161180120012805620670726f746f33")); 317ffe3c632Sopenharmony_ci 318ffe3c632Sopenharmony_ci $this->assertSame(1, sizeof($file_desc_set->getFile())); 319ffe3c632Sopenharmony_ci 320ffe3c632Sopenharmony_ci $file_desc = $file_desc_set->getFile()[0]; 321ffe3c632Sopenharmony_ci $this->assertSame("test_include.proto", $file_desc->getName()); 322ffe3c632Sopenharmony_ci $this->assertSame("bar", $file_desc->getPackage()); 323ffe3c632Sopenharmony_ci $this->assertSame(0, sizeof($file_desc->getDependency())); 324ffe3c632Sopenharmony_ci $this->assertSame(1, sizeof($file_desc->getMessageType())); 325ffe3c632Sopenharmony_ci $this->assertSame(0, sizeof($file_desc->getEnumType())); 326ffe3c632Sopenharmony_ci $this->assertSame("proto3", $file_desc->getSyntax()); 327ffe3c632Sopenharmony_ci 328ffe3c632Sopenharmony_ci $desc = $file_desc->getMessageType()[0]; 329ffe3c632Sopenharmony_ci $this->assertSame("TestInclude", $desc->getName()); 330ffe3c632Sopenharmony_ci $this->assertSame(1, sizeof($desc->getField())); 331ffe3c632Sopenharmony_ci $this->assertSame(0, sizeof($desc->getNestedType())); 332ffe3c632Sopenharmony_ci $this->assertSame(0, sizeof($desc->getEnumType())); 333ffe3c632Sopenharmony_ci $this->assertSame(0, sizeof($desc->getOneofDecl())); 334ffe3c632Sopenharmony_ci 335ffe3c632Sopenharmony_ci $field = $desc->getField()[0]; 336ffe3c632Sopenharmony_ci $this->assertSame("a", $field->getName()); 337ffe3c632Sopenharmony_ci $this->assertSame(1, $field->getNumber()); 338ffe3c632Sopenharmony_ci $this->assertSame(GPBLabel::OPTIONAL, $field->getLabel()); 339ffe3c632Sopenharmony_ci $this->assertSame(GPBType::INT32, $field->getType()); 340ffe3c632Sopenharmony_ci } 341ffe3c632Sopenharmony_ci 342ffe3c632Sopenharmony_ci public function testReadVarint64() 343ffe3c632Sopenharmony_ci { 344ffe3c632Sopenharmony_ci $var = 0; 345ffe3c632Sopenharmony_ci 346ffe3c632Sopenharmony_ci // Empty buffer. 347ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('')); 348ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint64($var)); 349ffe3c632Sopenharmony_ci 350ffe3c632Sopenharmony_ci // The largest varint is 10 bytes long. 351ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('8080808080808080808001')); 352ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint64($var)); 353ffe3c632Sopenharmony_ci 354ffe3c632Sopenharmony_ci // Corrupted varint. 355ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808080')); 356ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint64($var)); 357ffe3c632Sopenharmony_ci 358ffe3c632Sopenharmony_ci // Normal case. 359ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808001')); 360ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint64($var)); 361ffe3c632Sopenharmony_ci if (PHP_INT_SIZE == 4) { 362ffe3c632Sopenharmony_ci $this->assertSame('16384', $var); 363ffe3c632Sopenharmony_ci } else { 364ffe3c632Sopenharmony_ci $this->assertSame(16384, $var); 365ffe3c632Sopenharmony_ci } 366ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint64($var)); 367ffe3c632Sopenharmony_ci 368ffe3c632Sopenharmony_ci // Read two varint. 369ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808001808002')); 370ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint64($var)); 371ffe3c632Sopenharmony_ci if (PHP_INT_SIZE == 4) { 372ffe3c632Sopenharmony_ci $this->assertSame('16384', $var); 373ffe3c632Sopenharmony_ci } else { 374ffe3c632Sopenharmony_ci $this->assertSame(16384, $var); 375ffe3c632Sopenharmony_ci } 376ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint64($var)); 377ffe3c632Sopenharmony_ci if (PHP_INT_SIZE == 4) { 378ffe3c632Sopenharmony_ci $this->assertSame('32768', $var); 379ffe3c632Sopenharmony_ci } else { 380ffe3c632Sopenharmony_ci $this->assertSame(32768, $var); 381ffe3c632Sopenharmony_ci } 382ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint64($var)); 383ffe3c632Sopenharmony_ci 384ffe3c632Sopenharmony_ci // Read 64 testing 385ffe3c632Sopenharmony_ci $testVals = array( 386ffe3c632Sopenharmony_ci '10' => '0a000000000000000000', 387ffe3c632Sopenharmony_ci '100' => '64000000000000000000', 388ffe3c632Sopenharmony_ci '800' => 'a0060000000000000000', 389ffe3c632Sopenharmony_ci '6400' => '80320000000000000000', 390ffe3c632Sopenharmony_ci '70400' => '80a60400000000000000', 391ffe3c632Sopenharmony_ci '774400' => '80a22f00000000000000', 392ffe3c632Sopenharmony_ci '9292800' => '8098b704000000000000', 393ffe3c632Sopenharmony_ci '74342400' => '80c0b923000000000000', 394ffe3c632Sopenharmony_ci '743424000' => '8080bfe2020000000000', 395ffe3c632Sopenharmony_ci '8177664000' => '8080b5bb1e0000000000', 396ffe3c632Sopenharmony_ci '65421312000' => '8080a8dbf30100000000', 397ffe3c632Sopenharmony_ci '785055744000' => '8080e0c7ec1600000000', 398ffe3c632Sopenharmony_ci '9420668928000' => '808080dd969202000000', 399ffe3c632Sopenharmony_ci '103627358208000' => '808080fff9c717000000', 400ffe3c632Sopenharmony_ci '1139900940288000' => '808080f5bd9783020000', 401ffe3c632Sopenharmony_ci '13678811283456000' => '808080fce699a6180000', 402ffe3c632Sopenharmony_ci '109430490267648000' => '808080e0b7ceb1c20100', 403ffe3c632Sopenharmony_ci '984874412408832000' => '808080e0f5c1bed50d00', 404ffe3c632Sopenharmony_ci ); 405ffe3c632Sopenharmony_ci 406ffe3c632Sopenharmony_ci foreach ($testVals as $original => $encoded) { 407ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin($encoded)); 408ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint64($var)); 409ffe3c632Sopenharmony_ci $this->assertEquals($original, $var); 410ffe3c632Sopenharmony_ci } 411ffe3c632Sopenharmony_ci } 412ffe3c632Sopenharmony_ci 413ffe3c632Sopenharmony_ci public function testReadVarint32() 414ffe3c632Sopenharmony_ci { 415ffe3c632Sopenharmony_ci $var = 0; 416ffe3c632Sopenharmony_ci 417ffe3c632Sopenharmony_ci // Empty buffer. 418ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('')); 419ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint32($var)); 420ffe3c632Sopenharmony_ci 421ffe3c632Sopenharmony_ci // The largest varint is 10 bytes long. 422ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('8080808080808080808001')); 423ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint32($var)); 424ffe3c632Sopenharmony_ci 425ffe3c632Sopenharmony_ci // Corrupted varint. 426ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808080')); 427ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint32($var)); 428ffe3c632Sopenharmony_ci 429ffe3c632Sopenharmony_ci // Normal case. 430ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808001')); 431ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint32($var)); 432ffe3c632Sopenharmony_ci $this->assertSame(16384, $var); 433ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint32($var)); 434ffe3c632Sopenharmony_ci 435ffe3c632Sopenharmony_ci // Read two varint. 436ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808001808002')); 437ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint32($var)); 438ffe3c632Sopenharmony_ci $this->assertSame(16384, $var); 439ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint32($var)); 440ffe3c632Sopenharmony_ci $this->assertSame(32768, $var); 441ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint32($var)); 442ffe3c632Sopenharmony_ci 443ffe3c632Sopenharmony_ci // Read a 64-bit integer. High-order bits should be discarded. 444ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808081808001')); 445ffe3c632Sopenharmony_ci $this->assertTrue($input->readVarint32($var)); 446ffe3c632Sopenharmony_ci $this->assertSame(16384, $var); 447ffe3c632Sopenharmony_ci $this->assertFalse($input->readVarint32($var)); 448ffe3c632Sopenharmony_ci } 449ffe3c632Sopenharmony_ci 450ffe3c632Sopenharmony_ci public function testReadTag() 451ffe3c632Sopenharmony_ci { 452ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808001')); 453ffe3c632Sopenharmony_ci $tag = $input->readTag(); 454ffe3c632Sopenharmony_ci $this->assertSame(16384, $tag); 455ffe3c632Sopenharmony_ci $tag = $input->readTag(); 456ffe3c632Sopenharmony_ci $this->assertSame(0, $tag); 457ffe3c632Sopenharmony_ci } 458ffe3c632Sopenharmony_ci 459ffe3c632Sopenharmony_ci public function testPushPopLimit() 460ffe3c632Sopenharmony_ci { 461ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808001')); 462ffe3c632Sopenharmony_ci $old_limit = $input->pushLimit(0); 463ffe3c632Sopenharmony_ci $tag = $input->readTag(); 464ffe3c632Sopenharmony_ci $this->assertSame(0, $tag); 465ffe3c632Sopenharmony_ci $input->popLimit($old_limit); 466ffe3c632Sopenharmony_ci $tag = $input->readTag(); 467ffe3c632Sopenharmony_ci $this->assertSame(16384, $tag); 468ffe3c632Sopenharmony_ci } 469ffe3c632Sopenharmony_ci 470ffe3c632Sopenharmony_ci public function testReadRaw() 471ffe3c632Sopenharmony_ci { 472ffe3c632Sopenharmony_ci $input = new CodedInputStream(hex2bin('808001')); 473ffe3c632Sopenharmony_ci $buffer = null; 474ffe3c632Sopenharmony_ci 475ffe3c632Sopenharmony_ci $this->assertTrue($input->readRaw(3, $buffer)); 476ffe3c632Sopenharmony_ci $this->assertSame(hex2bin('808001'), $buffer); 477ffe3c632Sopenharmony_ci 478ffe3c632Sopenharmony_ci $this->assertFalse($input->readRaw(1, $buffer)); 479ffe3c632Sopenharmony_ci } 480ffe3c632Sopenharmony_ci 481ffe3c632Sopenharmony_ci public function testWriteVarint32() 482ffe3c632Sopenharmony_ci { 483ffe3c632Sopenharmony_ci $output = new CodedOutputStream(3); 484ffe3c632Sopenharmony_ci $output->writeVarint32(16384, true); 485ffe3c632Sopenharmony_ci $this->assertSame(hex2bin('808001'), $output->getData()); 486ffe3c632Sopenharmony_ci 487ffe3c632Sopenharmony_ci // Negative numbers are padded to be compatible with int64. 488ffe3c632Sopenharmony_ci $output = new CodedOutputStream(10); 489ffe3c632Sopenharmony_ci $output->writeVarint32(-43, false); 490ffe3c632Sopenharmony_ci $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData()); 491ffe3c632Sopenharmony_ci } 492ffe3c632Sopenharmony_ci 493ffe3c632Sopenharmony_ci public function testWriteVarint64() 494ffe3c632Sopenharmony_ci { 495ffe3c632Sopenharmony_ci $output = new CodedOutputStream(10); 496ffe3c632Sopenharmony_ci $output->writeVarint64(-43); 497ffe3c632Sopenharmony_ci $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData()); 498ffe3c632Sopenharmony_ci } 499ffe3c632Sopenharmony_ci 500ffe3c632Sopenharmony_ci public function testWriteLittleEndian32() 501ffe3c632Sopenharmony_ci { 502ffe3c632Sopenharmony_ci $output = new CodedOutputStream(4); 503ffe3c632Sopenharmony_ci $output->writeLittleEndian32(46); 504ffe3c632Sopenharmony_ci $this->assertSame(hex2bin('2E000000'), $output->getData()); 505ffe3c632Sopenharmony_ci } 506ffe3c632Sopenharmony_ci 507ffe3c632Sopenharmony_ci public function testWriteLittleEndian64() 508ffe3c632Sopenharmony_ci { 509ffe3c632Sopenharmony_ci $output = new CodedOutputStream(8); 510ffe3c632Sopenharmony_ci $output->writeLittleEndian64(47); 511ffe3c632Sopenharmony_ci $this->assertSame(hex2bin('2F00000000000000'), $output->getData()); 512ffe3c632Sopenharmony_ci } 513ffe3c632Sopenharmony_ci 514ffe3c632Sopenharmony_ci public function testByteSize() 515ffe3c632Sopenharmony_ci { 516ffe3c632Sopenharmony_ci $m = new TestMessage(); 517ffe3c632Sopenharmony_ci TestUtil::setTestMessage($m); 518ffe3c632Sopenharmony_ci $this->assertSame(504, $m->byteSize()); 519ffe3c632Sopenharmony_ci } 520ffe3c632Sopenharmony_ci 521ffe3c632Sopenharmony_ci public function testPackedByteSize() 522ffe3c632Sopenharmony_ci { 523ffe3c632Sopenharmony_ci $m = new TestPackedMessage(); 524ffe3c632Sopenharmony_ci TestUtil::setTestPackedMessage($m); 525ffe3c632Sopenharmony_ci $this->assertSame(166, $m->byteSize()); 526ffe3c632Sopenharmony_ci } 527ffe3c632Sopenharmony_ci 528ffe3c632Sopenharmony_ci /** 529ffe3c632Sopenharmony_ci * @expectedException UnexpectedValueException 530ffe3c632Sopenharmony_ci * @expectedExceptionMessage Invalid message property: optionalInt32 531ffe3c632Sopenharmony_ci */ 532ffe3c632Sopenharmony_ci public function testArrayConstructorJsonCaseThrowsException() 533ffe3c632Sopenharmony_ci { 534ffe3c632Sopenharmony_ci $m = new TestMessage([ 535ffe3c632Sopenharmony_ci 'optionalInt32' => -42, 536ffe3c632Sopenharmony_ci ]); 537ffe3c632Sopenharmony_ci } 538ffe3c632Sopenharmony_ci 539ffe3c632Sopenharmony_ci /** 540ffe3c632Sopenharmony_ci * @expectedException Exception 541ffe3c632Sopenharmony_ci * @expectedExceptionMessage Expect Foo\TestMessage\Sub. 542ffe3c632Sopenharmony_ci */ 543ffe3c632Sopenharmony_ci public function testArraysForMessagesThrowsException() 544ffe3c632Sopenharmony_ci { 545ffe3c632Sopenharmony_ci $m = new TestMessage([ 546ffe3c632Sopenharmony_ci 'optional_message' => [ 547ffe3c632Sopenharmony_ci 'a' => 33 548ffe3c632Sopenharmony_ci ] 549ffe3c632Sopenharmony_ci ]); 550ffe3c632Sopenharmony_ci } 551ffe3c632Sopenharmony_ci 552ffe3c632Sopenharmony_ci public function testArrayConstructorWithNullValues() 553ffe3c632Sopenharmony_ci { 554ffe3c632Sopenharmony_ci $requestData = [ 555ffe3c632Sopenharmony_ci 'optional_bool' => null, 556ffe3c632Sopenharmony_ci 'optional_string' => null, 557ffe3c632Sopenharmony_ci 'optional_bytes' => null, 558ffe3c632Sopenharmony_ci 'optional_message' => null, 559ffe3c632Sopenharmony_ci ]; 560ffe3c632Sopenharmony_ci 561ffe3c632Sopenharmony_ci $m = new TestMessage($requestData); 562ffe3c632Sopenharmony_ci 563ffe3c632Sopenharmony_ci $this->assertSame(false, $m->getOptionalBool()); 564ffe3c632Sopenharmony_ci $this->assertSame('', $m->getOptionalString()); 565ffe3c632Sopenharmony_ci $this->assertSame('', $m->getOptionalBytes()); 566ffe3c632Sopenharmony_ci $this->assertSame(null, $m->getOptionalMessage()); 567ffe3c632Sopenharmony_ci } 568ffe3c632Sopenharmony_ci 569ffe3c632Sopenharmony_ci /** 570ffe3c632Sopenharmony_ci * @dataProvider provideArrayConstructorWithNullValuesThrowsException 571ffe3c632Sopenharmony_ci * @expectedException Exception 572ffe3c632Sopenharmony_ci */ 573ffe3c632Sopenharmony_ci public function testArrayConstructorWithNullValuesThrowsException($requestData) 574ffe3c632Sopenharmony_ci { 575ffe3c632Sopenharmony_ci $m = new TestMessage($requestData); 576ffe3c632Sopenharmony_ci } 577ffe3c632Sopenharmony_ci 578ffe3c632Sopenharmony_ci public function provideArrayConstructorWithNullValuesThrowsException() 579ffe3c632Sopenharmony_ci { 580ffe3c632Sopenharmony_ci return [ 581ffe3c632Sopenharmony_ci [['optional_int32' => null]], 582ffe3c632Sopenharmony_ci [['optional_int64' => null]], 583ffe3c632Sopenharmony_ci [['optional_uint32' => null]], 584ffe3c632Sopenharmony_ci [['optional_uint64' => null]], 585ffe3c632Sopenharmony_ci [['optional_sint32' => null]], 586ffe3c632Sopenharmony_ci [['optional_sint64' => null]], 587ffe3c632Sopenharmony_ci [['optional_fixed32' => null]], 588ffe3c632Sopenharmony_ci [['optional_fixed64' => null]], 589ffe3c632Sopenharmony_ci [['optional_sfixed32' => null]], 590ffe3c632Sopenharmony_ci [['optional_sfixed64' => null]], 591ffe3c632Sopenharmony_ci [['optional_float' => null]], 592ffe3c632Sopenharmony_ci [['optional_double' => null]], 593ffe3c632Sopenharmony_ci [['optional_enum' => null]], 594ffe3c632Sopenharmony_ci [['repeated_int32' => null]], 595ffe3c632Sopenharmony_ci [['map_int32_int32' => null]], 596ffe3c632Sopenharmony_ci ]; 597ffe3c632Sopenharmony_ci } 598ffe3c632Sopenharmony_ci} 599