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