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