xref: /aosp_15_r20/external/protobuf/php/tests/EncodeDecodeTest.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 Google\Protobuf\RepeatedField;
7*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\GPBType;
8*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestInt32Value;
9*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestInt64Value;
10*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestUInt32Value;
11*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestUInt64Value;
12*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestBoolValue;
13*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestStringValue;
14*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestBytesValue;
15*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestAny;
16*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestEnum;
17*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestLargeFieldNumber;
18*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestMessage;
19*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestMessage\Sub;
20*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestPackedMessage;
21*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestRandomFieldOrder;
22*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestUnpackedMessage;
23*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Any;
24*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\DoubleValue;
25*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\FieldMask;
26*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\FloatValue;
27*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Int32Value;
28*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\UInt32Value;
29*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Int64Value;
30*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\UInt64Value;
31*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\BoolValue;
32*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\StringValue;
33*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\BytesValue;
34*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Value;
35*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\ListValue;
36*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Struct;
37*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\GPBEmpty;
38*1b3f573fSAndroid Build Coastguard Worker
39*1b3f573fSAndroid Build Coastguard Workerclass EncodeDecodeTest extends TestBase
40*1b3f573fSAndroid Build Coastguard Worker{
41*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeJsonSimple()
42*1b3f573fSAndroid Build Coastguard Worker    {
43*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
44*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"optionalInt32\":1}");
45*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, $m->getOptionalInt32());
46*1b3f573fSAndroid Build Coastguard Worker    }
47*1b3f573fSAndroid Build Coastguard Worker
48*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeJsonUnknown()
49*1b3f573fSAndroid Build Coastguard Worker    {
50*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
51*1b3f573fSAndroid Build Coastguard Worker
52*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
53*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":1}");
54*1b3f573fSAndroid Build Coastguard Worker    }
55*1b3f573fSAndroid Build Coastguard Worker
56*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeJsonIgnoreUnknown()
57*1b3f573fSAndroid Build Coastguard Worker    {
58*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
59*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":1}", true);
60*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("{}", $m->serializeToJsonString());
61*1b3f573fSAndroid Build Coastguard Worker    }
62*1b3f573fSAndroid Build Coastguard Worker
63*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelBoolValue()
64*1b3f573fSAndroid Build Coastguard Worker    {
65*1b3f573fSAndroid Build Coastguard Worker        $m = new BoolValue();
66*1b3f573fSAndroid Build Coastguard Worker
67*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("true");
68*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(true, $m->getValue());
69*1b3f573fSAndroid Build Coastguard Worker
70*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("false");
71*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(false, $m->getValue());
72*1b3f573fSAndroid Build Coastguard Worker    }
73*1b3f573fSAndroid Build Coastguard Worker
74*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelBoolValue()
75*1b3f573fSAndroid Build Coastguard Worker    {
76*1b3f573fSAndroid Build Coastguard Worker        $m = new BoolValue();
77*1b3f573fSAndroid Build Coastguard Worker        $m->setValue(true);
78*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("true", $m->serializeToJsonString());
79*1b3f573fSAndroid Build Coastguard Worker    }
80*1b3f573fSAndroid Build Coastguard Worker
81*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelDoubleValue()
82*1b3f573fSAndroid Build Coastguard Worker    {
83*1b3f573fSAndroid Build Coastguard Worker        $m = new DoubleValue();
84*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("1.5");
85*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1.5, $m->getValue());
86*1b3f573fSAndroid Build Coastguard Worker    }
87*1b3f573fSAndroid Build Coastguard Worker
88*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelDoubleValue()
89*1b3f573fSAndroid Build Coastguard Worker    {
90*1b3f573fSAndroid Build Coastguard Worker        $m = new DoubleValue();
91*1b3f573fSAndroid Build Coastguard Worker        $m->setValue(1.5);
92*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("1.5", $m->serializeToJsonString());
93*1b3f573fSAndroid Build Coastguard Worker    }
94*1b3f573fSAndroid Build Coastguard Worker
95*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelFloatValue()
96*1b3f573fSAndroid Build Coastguard Worker    {
97*1b3f573fSAndroid Build Coastguard Worker        $m = new FloatValue();
98*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("1.5");
99*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1.5, $m->getValue());
100*1b3f573fSAndroid Build Coastguard Worker    }
101*1b3f573fSAndroid Build Coastguard Worker
102*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelFloatValue()
103*1b3f573fSAndroid Build Coastguard Worker    {
104*1b3f573fSAndroid Build Coastguard Worker        $m = new FloatValue();
105*1b3f573fSAndroid Build Coastguard Worker        $m->setValue(1.5);
106*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("1.5", $m->serializeToJsonString());
107*1b3f573fSAndroid Build Coastguard Worker    }
108*1b3f573fSAndroid Build Coastguard Worker
109*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelInt32Value()
110*1b3f573fSAndroid Build Coastguard Worker    {
111*1b3f573fSAndroid Build Coastguard Worker        $m = new Int32Value();
112*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("1");
113*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, $m->getValue());
114*1b3f573fSAndroid Build Coastguard Worker    }
115*1b3f573fSAndroid Build Coastguard Worker
116*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelInt32Value()
117*1b3f573fSAndroid Build Coastguard Worker    {
118*1b3f573fSAndroid Build Coastguard Worker        $m = new Int32Value();
119*1b3f573fSAndroid Build Coastguard Worker        $m->setValue(1);
120*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("1", $m->serializeToJsonString());
121*1b3f573fSAndroid Build Coastguard Worker    }
122*1b3f573fSAndroid Build Coastguard Worker
123*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeRepeatedInt32Value()
124*1b3f573fSAndroid Build Coastguard Worker    {
125*1b3f573fSAndroid Build Coastguard Worker        $m = new TestInt32Value();
126*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"repeated_field\":[12345]}");
127*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(12345, $m->getRepeatedField()[0]->getValue());
128*1b3f573fSAndroid Build Coastguard Worker    }
129*1b3f573fSAndroid Build Coastguard Worker
130*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelUInt32Value()
131*1b3f573fSAndroid Build Coastguard Worker    {
132*1b3f573fSAndroid Build Coastguard Worker        $m = new UInt32Value();
133*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("1");
134*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, $m->getValue());
135*1b3f573fSAndroid Build Coastguard Worker    }
136*1b3f573fSAndroid Build Coastguard Worker
137*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelUInt32Value()
138*1b3f573fSAndroid Build Coastguard Worker    {
139*1b3f573fSAndroid Build Coastguard Worker        $m = new UInt32Value();
140*1b3f573fSAndroid Build Coastguard Worker        $m->setValue(1);
141*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("1", $m->serializeToJsonString());
142*1b3f573fSAndroid Build Coastguard Worker    }
143*1b3f573fSAndroid Build Coastguard Worker
144*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelInt64Value()
145*1b3f573fSAndroid Build Coastguard Worker    {
146*1b3f573fSAndroid Build Coastguard Worker        $m = new Int64Value();
147*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("1");
148*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, $m->getValue());
149*1b3f573fSAndroid Build Coastguard Worker    }
150*1b3f573fSAndroid Build Coastguard Worker
151*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelInt64ValueAsString()
152*1b3f573fSAndroid Build Coastguard Worker    {
153*1b3f573fSAndroid Build Coastguard Worker        $m = new Int64Value();
154*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"1\"");
155*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, $m->getValue());
156*1b3f573fSAndroid Build Coastguard Worker    }
157*1b3f573fSAndroid Build Coastguard Worker
158*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelInt64Value()
159*1b3f573fSAndroid Build Coastguard Worker    {
160*1b3f573fSAndroid Build Coastguard Worker        $m = new Int64Value();
161*1b3f573fSAndroid Build Coastguard Worker        $m->setValue(1);
162*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("\"1\"", $m->serializeToJsonString());
163*1b3f573fSAndroid Build Coastguard Worker    }
164*1b3f573fSAndroid Build Coastguard Worker
165*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelUInt64Value()
166*1b3f573fSAndroid Build Coastguard Worker    {
167*1b3f573fSAndroid Build Coastguard Worker        $m = new UInt64Value();
168*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("1");
169*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, $m->getValue());
170*1b3f573fSAndroid Build Coastguard Worker    }
171*1b3f573fSAndroid Build Coastguard Worker
172*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelUInt64ValueAsString()
173*1b3f573fSAndroid Build Coastguard Worker    {
174*1b3f573fSAndroid Build Coastguard Worker        $m = new UInt64Value();
175*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"1\"");
176*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, $m->getValue());
177*1b3f573fSAndroid Build Coastguard Worker    }
178*1b3f573fSAndroid Build Coastguard Worker
179*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelUInt64Value()
180*1b3f573fSAndroid Build Coastguard Worker    {
181*1b3f573fSAndroid Build Coastguard Worker        $m = new UInt64Value();
182*1b3f573fSAndroid Build Coastguard Worker        $m->setValue(1);
183*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("\"1\"", $m->serializeToJsonString());
184*1b3f573fSAndroid Build Coastguard Worker    }
185*1b3f573fSAndroid Build Coastguard Worker
186*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelStringValue()
187*1b3f573fSAndroid Build Coastguard Worker    {
188*1b3f573fSAndroid Build Coastguard Worker        $m = new StringValue();
189*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"a\"");
190*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("a", $m->getValue());
191*1b3f573fSAndroid Build Coastguard Worker    }
192*1b3f573fSAndroid Build Coastguard Worker
193*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelStringValue()
194*1b3f573fSAndroid Build Coastguard Worker    {
195*1b3f573fSAndroid Build Coastguard Worker        $m = new StringValue();
196*1b3f573fSAndroid Build Coastguard Worker        $m->setValue("a");
197*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("\"a\"", $m->serializeToJsonString());
198*1b3f573fSAndroid Build Coastguard Worker    }
199*1b3f573fSAndroid Build Coastguard Worker
200*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeRepeatedStringValue()
201*1b3f573fSAndroid Build Coastguard Worker    {
202*1b3f573fSAndroid Build Coastguard Worker        $m = new TestStringValue();
203*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"repeated_field\":[\"a\"]}");
204*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("a", $m->getRepeatedField()[0]->getValue());
205*1b3f573fSAndroid Build Coastguard Worker    }
206*1b3f573fSAndroid Build Coastguard Worker
207*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeMapStringValue()
208*1b3f573fSAndroid Build Coastguard Worker    {
209*1b3f573fSAndroid Build Coastguard Worker        $m = new TestStringValue();
210*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"map_field\":{\"1\": \"a\"}}");
211*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("a", $m->getMapField()[1]->getValue());
212*1b3f573fSAndroid Build Coastguard Worker    }
213*1b3f573fSAndroid Build Coastguard Worker
214*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelBytesValue()
215*1b3f573fSAndroid Build Coastguard Worker    {
216*1b3f573fSAndroid Build Coastguard Worker        $m = new BytesValue();
217*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"YQ==\"");
218*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("a", $m->getValue());
219*1b3f573fSAndroid Build Coastguard Worker    }
220*1b3f573fSAndroid Build Coastguard Worker
221*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelBytesValue()
222*1b3f573fSAndroid Build Coastguard Worker    {
223*1b3f573fSAndroid Build Coastguard Worker        $m = new BytesValue();
224*1b3f573fSAndroid Build Coastguard Worker        $m->setValue("a");
225*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("\"YQ==\"", $m->serializeToJsonString());
226*1b3f573fSAndroid Build Coastguard Worker    }
227*1b3f573fSAndroid Build Coastguard Worker
228*1b3f573fSAndroid Build Coastguard Worker    public function generateRandomString($length = 10) {
229*1b3f573fSAndroid Build Coastguard Worker        $randomString = str_repeat("+", $length);
230*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < $length; $i++) {
231*1b3f573fSAndroid Build Coastguard Worker            $randomString[$i] = chr(rand(0, 255));
232*1b3f573fSAndroid Build Coastguard Worker        }
233*1b3f573fSAndroid Build Coastguard Worker        return $randomString;
234*1b3f573fSAndroid Build Coastguard Worker    }
235*1b3f573fSAndroid Build Coastguard Worker
236*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelLongBytesValue()
237*1b3f573fSAndroid Build Coastguard Worker    {
238*1b3f573fSAndroid Build Coastguard Worker        $m = new BytesValue();
239*1b3f573fSAndroid Build Coastguard Worker        $data = $this->generateRandomString(12007);
240*1b3f573fSAndroid Build Coastguard Worker        $m->setValue($data);
241*1b3f573fSAndroid Build Coastguard Worker        $expected = "\"" . base64_encode($data) . "\"";
242*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(strlen($expected), strlen($m->serializeToJsonString()));
243*1b3f573fSAndroid Build Coastguard Worker    }
244*1b3f573fSAndroid Build Coastguard Worker
245*1b3f573fSAndroid Build Coastguard Worker    public function testEncode()
246*1b3f573fSAndroid Build Coastguard Worker    {
247*1b3f573fSAndroid Build Coastguard Worker        $from = new TestMessage();
248*1b3f573fSAndroid Build Coastguard Worker        $this->expectEmptyFields($from);
249*1b3f573fSAndroid Build Coastguard Worker        $this->setFields($from);
250*1b3f573fSAndroid Build Coastguard Worker        $this->expectFields($from);
251*1b3f573fSAndroid Build Coastguard Worker
252*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToString();
253*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(bin2hex(TestUtil::getGoldenTestMessage()),
254*1b3f573fSAndroid Build Coastguard Worker                          bin2hex($data));
255*1b3f573fSAndroid Build Coastguard Worker    }
256*1b3f573fSAndroid Build Coastguard Worker
257*1b3f573fSAndroid Build Coastguard Worker    public function testDecode()
258*1b3f573fSAndroid Build Coastguard Worker    {
259*1b3f573fSAndroid Build Coastguard Worker        $to = new TestMessage();
260*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromString(TestUtil::getGoldenTestMessage());
261*1b3f573fSAndroid Build Coastguard Worker        $this->expectFields($to);
262*1b3f573fSAndroid Build Coastguard Worker    }
263*1b3f573fSAndroid Build Coastguard Worker
264*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeDecode()
265*1b3f573fSAndroid Build Coastguard Worker    {
266*1b3f573fSAndroid Build Coastguard Worker        $from = new TestMessage();
267*1b3f573fSAndroid Build Coastguard Worker        $this->expectEmptyFields($from);
268*1b3f573fSAndroid Build Coastguard Worker        $this->setFields($from);
269*1b3f573fSAndroid Build Coastguard Worker        $this->expectFields($from);
270*1b3f573fSAndroid Build Coastguard Worker
271*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToString();
272*1b3f573fSAndroid Build Coastguard Worker
273*1b3f573fSAndroid Build Coastguard Worker        $to = new TestMessage();
274*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromString($data);
275*1b3f573fSAndroid Build Coastguard Worker        $this->expectFields($to);
276*1b3f573fSAndroid Build Coastguard Worker    }
277*1b3f573fSAndroid Build Coastguard Worker
278*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeDecodeEmpty()
279*1b3f573fSAndroid Build Coastguard Worker    {
280*1b3f573fSAndroid Build Coastguard Worker        $from = new TestMessage();
281*1b3f573fSAndroid Build Coastguard Worker        $this->expectEmptyFields($from);
282*1b3f573fSAndroid Build Coastguard Worker
283*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToString();
284*1b3f573fSAndroid Build Coastguard Worker
285*1b3f573fSAndroid Build Coastguard Worker        $to = new TestMessage();
286*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromString($data);
287*1b3f573fSAndroid Build Coastguard Worker        $this->expectEmptyFields($to);
288*1b3f573fSAndroid Build Coastguard Worker    }
289*1b3f573fSAndroid Build Coastguard Worker
290*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeDecodeOneof()
291*1b3f573fSAndroid Build Coastguard Worker    {
292*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
293*1b3f573fSAndroid Build Coastguard Worker
294*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofInt32(1);
295*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
296*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
297*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromString($data);
298*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $n->getOneofInt32());
299*1b3f573fSAndroid Build Coastguard Worker
300*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofFloat(2.0);
301*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
302*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
303*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromString($data);
304*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2.0, $n->getOneofFloat());
305*1b3f573fSAndroid Build Coastguard Worker
306*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofString('abc');
307*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
308*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
309*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromString($data);
310*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('abc', $n->getOneofString());
311*1b3f573fSAndroid Build Coastguard Worker
312*1b3f573fSAndroid Build Coastguard Worker        $sub_m = new Sub();
313*1b3f573fSAndroid Build Coastguard Worker        $sub_m->setA(1);
314*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofMessage($sub_m);
315*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
316*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
317*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromString($data);
318*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $n->getOneofMessage()->getA());
319*1b3f573fSAndroid Build Coastguard Worker
320*1b3f573fSAndroid Build Coastguard Worker        // Encode default value
321*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofEnum(TestEnum::ZERO);
322*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
323*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
324*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromString($data);
325*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("oneof_enum", $n->getMyOneof());
326*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(TestEnum::ZERO, $n->getOneofEnum());
327*1b3f573fSAndroid Build Coastguard Worker
328*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofString("");
329*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
330*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
331*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromString($data);
332*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("oneof_string", $n->getMyOneof());
333*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("", $n->getOneofString());
334*1b3f573fSAndroid Build Coastguard Worker
335*1b3f573fSAndroid Build Coastguard Worker        $sub_m = new Sub();
336*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofMessage($sub_m);
337*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
338*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
339*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromString($data);
340*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("oneof_message", $n->getMyOneof());
341*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse(is_null($n->getOneofMessage()));
342*1b3f573fSAndroid Build Coastguard Worker
343*1b3f573fSAndroid Build Coastguard Worker    }
344*1b3f573fSAndroid Build Coastguard Worker
345*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeDecodeOptional()
346*1b3f573fSAndroid Build Coastguard Worker    {
347*1b3f573fSAndroid Build Coastguard Worker      $m = new TestMessage();
348*1b3f573fSAndroid Build Coastguard Worker      $this->assertFalse($m->hasTrueOptionalInt32());
349*1b3f573fSAndroid Build Coastguard Worker      $data = $m->serializeToString();
350*1b3f573fSAndroid Build Coastguard Worker      $this->assertSame("", $data);
351*1b3f573fSAndroid Build Coastguard Worker
352*1b3f573fSAndroid Build Coastguard Worker      $m->setTrueOptionalInt32(0);
353*1b3f573fSAndroid Build Coastguard Worker      $this->assertTrue($m->hasTrueOptionalInt32());
354*1b3f573fSAndroid Build Coastguard Worker      $data = $m->serializeToString();
355*1b3f573fSAndroid Build Coastguard Worker      $this->assertNotSame("", $data);
356*1b3f573fSAndroid Build Coastguard Worker
357*1b3f573fSAndroid Build Coastguard Worker      $m2 = new TestMessage();
358*1b3f573fSAndroid Build Coastguard Worker      $m2->mergeFromString($data);
359*1b3f573fSAndroid Build Coastguard Worker      $this->assertTrue($m2->hasTrueOptionalInt32());
360*1b3f573fSAndroid Build Coastguard Worker      $this->assertSame(0, $m2->getTrueOptionalInt32());
361*1b3f573fSAndroid Build Coastguard Worker    }
362*1b3f573fSAndroid Build Coastguard Worker
363*1b3f573fSAndroid Build Coastguard Worker    public function testJsonEncodeDecodeOptional()
364*1b3f573fSAndroid Build Coastguard Worker    {
365*1b3f573fSAndroid Build Coastguard Worker      $m = new TestMessage();
366*1b3f573fSAndroid Build Coastguard Worker      $this->assertFalse($m->hasTrueOptionalInt32());
367*1b3f573fSAndroid Build Coastguard Worker      $data = $m->serializeToJsonString();
368*1b3f573fSAndroid Build Coastguard Worker      $this->assertSame("{}", $data);
369*1b3f573fSAndroid Build Coastguard Worker
370*1b3f573fSAndroid Build Coastguard Worker      $m->setTrueOptionalInt32(0);
371*1b3f573fSAndroid Build Coastguard Worker      $this->assertTrue($m->hasTrueOptionalInt32());
372*1b3f573fSAndroid Build Coastguard Worker      $data = $m->serializeToJsonString();
373*1b3f573fSAndroid Build Coastguard Worker      $this->assertNotSame("{}", $data);
374*1b3f573fSAndroid Build Coastguard Worker
375*1b3f573fSAndroid Build Coastguard Worker      $m2 = new TestMessage();
376*1b3f573fSAndroid Build Coastguard Worker      $m2->mergeFromJsonString($data);
377*1b3f573fSAndroid Build Coastguard Worker      $this->assertTrue($m2->hasTrueOptionalInt32());
378*1b3f573fSAndroid Build Coastguard Worker      $this->assertSame(0, $m2->getTrueOptionalInt32());
379*1b3f573fSAndroid Build Coastguard Worker    }
380*1b3f573fSAndroid Build Coastguard Worker
381*1b3f573fSAndroid Build Coastguard Worker    public function testJsonEncodeDecodeOneof()
382*1b3f573fSAndroid Build Coastguard Worker    {
383*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
384*1b3f573fSAndroid Build Coastguard Worker
385*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofEnum(TestEnum::ONE);
386*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToJsonString();
387*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
388*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromJsonString($data);
389*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("oneof_enum", $n->getMyOneof());
390*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(TestEnum::ONE, $n->getOneofEnum());
391*1b3f573fSAndroid Build Coastguard Worker
392*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofString("a");
393*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToJsonString();
394*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
395*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromJsonString($data);
396*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("oneof_string", $n->getMyOneof());
397*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("a", $n->getOneofString());
398*1b3f573fSAndroid Build Coastguard Worker
399*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofBytes("bbbb");
400*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToJsonString();
401*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
402*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromJsonString($data);
403*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("oneof_bytes", $n->getMyOneof());
404*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("bbbb", $n->getOneofBytes());
405*1b3f573fSAndroid Build Coastguard Worker
406*1b3f573fSAndroid Build Coastguard Worker        $sub_m = new Sub();
407*1b3f573fSAndroid Build Coastguard Worker        $m->setOneofMessage($sub_m);
408*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToJsonString();
409*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
410*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromJsonString($data);
411*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("oneof_message", $n->getMyOneof());
412*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse(is_null($n->getOneofMessage()));
413*1b3f573fSAndroid Build Coastguard Worker    }
414*1b3f573fSAndroid Build Coastguard Worker
415*1b3f573fSAndroid Build Coastguard Worker    public function testPackedEncode()
416*1b3f573fSAndroid Build Coastguard Worker    {
417*1b3f573fSAndroid Build Coastguard Worker        $from = new TestPackedMessage();
418*1b3f573fSAndroid Build Coastguard Worker        TestUtil::setTestPackedMessage($from);
419*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
420*1b3f573fSAndroid Build Coastguard Worker                          $from->serializeToString());
421*1b3f573fSAndroid Build Coastguard Worker    }
422*1b3f573fSAndroid Build Coastguard Worker
423*1b3f573fSAndroid Build Coastguard Worker    public function testPackedDecodePacked()
424*1b3f573fSAndroid Build Coastguard Worker    {
425*1b3f573fSAndroid Build Coastguard Worker        $to = new TestPackedMessage();
426*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
427*1b3f573fSAndroid Build Coastguard Worker        TestUtil::assertTestPackedMessage($to);
428*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
429*1b3f573fSAndroid Build Coastguard Worker    }
430*1b3f573fSAndroid Build Coastguard Worker
431*1b3f573fSAndroid Build Coastguard Worker    public function testPackedDecodeUnpacked()
432*1b3f573fSAndroid Build Coastguard Worker    {
433*1b3f573fSAndroid Build Coastguard Worker        $to = new TestPackedMessage();
434*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
435*1b3f573fSAndroid Build Coastguard Worker        TestUtil::assertTestPackedMessage($to);
436*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
437*1b3f573fSAndroid Build Coastguard Worker    }
438*1b3f573fSAndroid Build Coastguard Worker
439*1b3f573fSAndroid Build Coastguard Worker    public function testUnpackedEncode()
440*1b3f573fSAndroid Build Coastguard Worker    {
441*1b3f573fSAndroid Build Coastguard Worker        $from = new TestUnpackedMessage();
442*1b3f573fSAndroid Build Coastguard Worker        TestUtil::setTestPackedMessage($from);
443*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
444*1b3f573fSAndroid Build Coastguard Worker                          $from->serializeToString());
445*1b3f573fSAndroid Build Coastguard Worker    }
446*1b3f573fSAndroid Build Coastguard Worker
447*1b3f573fSAndroid Build Coastguard Worker    public function testUnpackedDecodePacked()
448*1b3f573fSAndroid Build Coastguard Worker    {
449*1b3f573fSAndroid Build Coastguard Worker        $to = new TestUnpackedMessage();
450*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
451*1b3f573fSAndroid Build Coastguard Worker        TestUtil::assertTestPackedMessage($to);
452*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
453*1b3f573fSAndroid Build Coastguard Worker    }
454*1b3f573fSAndroid Build Coastguard Worker
455*1b3f573fSAndroid Build Coastguard Worker    public function testUnpackedDecodeUnpacked()
456*1b3f573fSAndroid Build Coastguard Worker    {
457*1b3f573fSAndroid Build Coastguard Worker        $to = new TestUnpackedMessage();
458*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
459*1b3f573fSAndroid Build Coastguard Worker        TestUtil::assertTestPackedMessage($to);
460*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
461*1b3f573fSAndroid Build Coastguard Worker    }
462*1b3f573fSAndroid Build Coastguard Worker
463*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInt64()
464*1b3f573fSAndroid Build Coastguard Worker    {
465*1b3f573fSAndroid Build Coastguard Worker        // Read 64 testing
466*1b3f573fSAndroid Build Coastguard Worker        $testVals = array(
467*1b3f573fSAndroid Build Coastguard Worker            '10'                 => '100a',
468*1b3f573fSAndroid Build Coastguard Worker            '100'                => '1064',
469*1b3f573fSAndroid Build Coastguard Worker            '800'                => '10a006',
470*1b3f573fSAndroid Build Coastguard Worker            '6400'               => '108032',
471*1b3f573fSAndroid Build Coastguard Worker            '70400'              => '1080a604',
472*1b3f573fSAndroid Build Coastguard Worker            '774400'             => '1080a22f',
473*1b3f573fSAndroid Build Coastguard Worker            '9292800'            => '108098b704',
474*1b3f573fSAndroid Build Coastguard Worker            '74342400'           => '1080c0b923',
475*1b3f573fSAndroid Build Coastguard Worker            '743424000'          => '108080bfe202',
476*1b3f573fSAndroid Build Coastguard Worker            '8177664000'         => '108080b5bb1e',
477*1b3f573fSAndroid Build Coastguard Worker            '65421312000'        => '108080a8dbf301',
478*1b3f573fSAndroid Build Coastguard Worker            '785055744000'       => '108080e0c7ec16',
479*1b3f573fSAndroid Build Coastguard Worker            '9420668928000'      => '10808080dd969202',
480*1b3f573fSAndroid Build Coastguard Worker            '103627358208000'    => '10808080fff9c717',
481*1b3f573fSAndroid Build Coastguard Worker            '1139900940288000'   => '10808080f5bd978302',
482*1b3f573fSAndroid Build Coastguard Worker            '13678811283456000'  => '10808080fce699a618',
483*1b3f573fSAndroid Build Coastguard Worker            '109430490267648000' => '10808080e0b7ceb1c201',
484*1b3f573fSAndroid Build Coastguard Worker            '984874412408832000' => '10808080e0f5c1bed50d',
485*1b3f573fSAndroid Build Coastguard Worker        );
486*1b3f573fSAndroid Build Coastguard Worker
487*1b3f573fSAndroid Build Coastguard Worker        $msg = new TestMessage();
488*1b3f573fSAndroid Build Coastguard Worker        foreach ($testVals as $original => $encoded) {
489*1b3f573fSAndroid Build Coastguard Worker            $msg->setOptionalInt64($original);
490*1b3f573fSAndroid Build Coastguard Worker            $data = $msg->serializeToString();
491*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame($encoded, bin2hex($data));
492*1b3f573fSAndroid Build Coastguard Worker            $msg->setOptionalInt64(0);
493*1b3f573fSAndroid Build Coastguard Worker            $msg->mergeFromString($data);
494*1b3f573fSAndroid Build Coastguard Worker            $this->assertEquals($original, $msg->getOptionalInt64());
495*1b3f573fSAndroid Build Coastguard Worker        }
496*1b3f573fSAndroid Build Coastguard Worker    }
497*1b3f573fSAndroid Build Coastguard Worker
498*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeToExistingMessage()
499*1b3f573fSAndroid Build Coastguard Worker    {
500*1b3f573fSAndroid Build Coastguard Worker        $m1 = new TestMessage();
501*1b3f573fSAndroid Build Coastguard Worker        $this->setFields($m1);
502*1b3f573fSAndroid Build Coastguard Worker        $this->expectFields($m1);
503*1b3f573fSAndroid Build Coastguard Worker
504*1b3f573fSAndroid Build Coastguard Worker        $m2 = new TestMessage();
505*1b3f573fSAndroid Build Coastguard Worker        $this->setFields2($m2);
506*1b3f573fSAndroid Build Coastguard Worker        $data = $m2->serializeToString();
507*1b3f573fSAndroid Build Coastguard Worker
508*1b3f573fSAndroid Build Coastguard Worker        $m1->mergeFromString($data);
509*1b3f573fSAndroid Build Coastguard Worker        $this->expectFieldsMerged($m1);
510*1b3f573fSAndroid Build Coastguard Worker    }
511*1b3f573fSAndroid Build Coastguard Worker
512*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeFieldNonExist()
513*1b3f573fSAndroid Build Coastguard Worker    {
514*1b3f573fSAndroid Build Coastguard Worker        $data = hex2bin('c80501');
515*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
516*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($data);
517*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
518*1b3f573fSAndroid Build Coastguard Worker    }
519*1b3f573fSAndroid Build Coastguard Worker
520*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeNegativeInt32()
521*1b3f573fSAndroid Build Coastguard Worker    {
522*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
523*1b3f573fSAndroid Build Coastguard Worker        $m->setOptionalInt32(-1);
524*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
525*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("08ffffffffffffffffff01", bin2hex($data));
526*1b3f573fSAndroid Build Coastguard Worker    }
527*1b3f573fSAndroid Build Coastguard Worker
528*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeNegativeInt32()
529*1b3f573fSAndroid Build Coastguard Worker    {
530*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
531*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(0, $m->getOptionalInt32());
532*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin("08ffffffffffffffffff01"));
533*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(-1, $m->getOptionalInt32());
534*1b3f573fSAndroid Build Coastguard Worker
535*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
536*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(0, $m->getOptionalInt32());
537*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin("08ffffffff0f"));
538*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(-1, $m->getOptionalInt32());
539*1b3f573fSAndroid Build Coastguard Worker    }
540*1b3f573fSAndroid Build Coastguard Worker
541*1b3f573fSAndroid Build Coastguard Worker    public function testRandomFieldOrder()
542*1b3f573fSAndroid Build Coastguard Worker    {
543*1b3f573fSAndroid Build Coastguard Worker        $m = new TestRandomFieldOrder();
544*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
545*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("", $data);
546*1b3f573fSAndroid Build Coastguard Worker    }
547*1b3f573fSAndroid Build Coastguard Worker
548*1b3f573fSAndroid Build Coastguard Worker    public function testLargeFieldNumber()
549*1b3f573fSAndroid Build Coastguard Worker    {
550*1b3f573fSAndroid Build Coastguard Worker        $m = new TestLargeFieldNumber(['large_field_number' => 5]);
551*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToString();
552*1b3f573fSAndroid Build Coastguard Worker        $m2 = new TestLargeFieldNumber();
553*1b3f573fSAndroid Build Coastguard Worker        $m2->mergeFromString($data);
554*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(5, $m2->getLargeFieldNumber());
555*1b3f573fSAndroid Build Coastguard Worker    }
556*1b3f573fSAndroid Build Coastguard Worker
557*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidInt32()
558*1b3f573fSAndroid Build Coastguard Worker    {
559*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
560*1b3f573fSAndroid Build Coastguard Worker
561*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
562*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('08'));
563*1b3f573fSAndroid Build Coastguard Worker    }
564*1b3f573fSAndroid Build Coastguard Worker
565*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidSubMessage()
566*1b3f573fSAndroid Build Coastguard Worker    {
567*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
568*1b3f573fSAndroid Build Coastguard Worker
569*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
570*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('9A010108'));
571*1b3f573fSAndroid Build Coastguard Worker    }
572*1b3f573fSAndroid Build Coastguard Worker
573*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidInt64()
574*1b3f573fSAndroid Build Coastguard Worker    {
575*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
576*1b3f573fSAndroid Build Coastguard Worker
577*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
578*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('10'));
579*1b3f573fSAndroid Build Coastguard Worker    }
580*1b3f573fSAndroid Build Coastguard Worker
581*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidUInt32()
582*1b3f573fSAndroid Build Coastguard Worker    {
583*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
584*1b3f573fSAndroid Build Coastguard Worker
585*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
586*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('18'));
587*1b3f573fSAndroid Build Coastguard Worker    }
588*1b3f573fSAndroid Build Coastguard Worker
589*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidUInt64()
590*1b3f573fSAndroid Build Coastguard Worker    {
591*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
592*1b3f573fSAndroid Build Coastguard Worker
593*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
594*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('20'));
595*1b3f573fSAndroid Build Coastguard Worker    }
596*1b3f573fSAndroid Build Coastguard Worker
597*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidSInt32()
598*1b3f573fSAndroid Build Coastguard Worker    {
599*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
600*1b3f573fSAndroid Build Coastguard Worker
601*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
602*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('28'));
603*1b3f573fSAndroid Build Coastguard Worker    }
604*1b3f573fSAndroid Build Coastguard Worker
605*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidSInt64()
606*1b3f573fSAndroid Build Coastguard Worker    {
607*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
608*1b3f573fSAndroid Build Coastguard Worker
609*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
610*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('30'));
611*1b3f573fSAndroid Build Coastguard Worker    }
612*1b3f573fSAndroid Build Coastguard Worker
613*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidFixed32()
614*1b3f573fSAndroid Build Coastguard Worker    {
615*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
616*1b3f573fSAndroid Build Coastguard Worker
617*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
618*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('3D'));
619*1b3f573fSAndroid Build Coastguard Worker    }
620*1b3f573fSAndroid Build Coastguard Worker
621*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidFixed64()
622*1b3f573fSAndroid Build Coastguard Worker    {
623*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
624*1b3f573fSAndroid Build Coastguard Worker
625*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
626*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('41'));
627*1b3f573fSAndroid Build Coastguard Worker    }
628*1b3f573fSAndroid Build Coastguard Worker
629*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidSFixed32()
630*1b3f573fSAndroid Build Coastguard Worker    {
631*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
632*1b3f573fSAndroid Build Coastguard Worker
633*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
634*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('4D'));
635*1b3f573fSAndroid Build Coastguard Worker    }
636*1b3f573fSAndroid Build Coastguard Worker
637*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidSFixed64()
638*1b3f573fSAndroid Build Coastguard Worker    {
639*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
640*1b3f573fSAndroid Build Coastguard Worker
641*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
642*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('51'));
643*1b3f573fSAndroid Build Coastguard Worker    }
644*1b3f573fSAndroid Build Coastguard Worker
645*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidFloat()
646*1b3f573fSAndroid Build Coastguard Worker    {
647*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
648*1b3f573fSAndroid Build Coastguard Worker
649*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
650*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('5D'));
651*1b3f573fSAndroid Build Coastguard Worker    }
652*1b3f573fSAndroid Build Coastguard Worker
653*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidDouble()
654*1b3f573fSAndroid Build Coastguard Worker    {
655*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
656*1b3f573fSAndroid Build Coastguard Worker
657*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
658*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('61'));
659*1b3f573fSAndroid Build Coastguard Worker    }
660*1b3f573fSAndroid Build Coastguard Worker
661*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidBool()
662*1b3f573fSAndroid Build Coastguard Worker    {
663*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
664*1b3f573fSAndroid Build Coastguard Worker
665*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
666*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('68'));
667*1b3f573fSAndroid Build Coastguard Worker    }
668*1b3f573fSAndroid Build Coastguard Worker
669*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidStringLengthMiss()
670*1b3f573fSAndroid Build Coastguard Worker    {
671*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
672*1b3f573fSAndroid Build Coastguard Worker
673*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
674*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('72'));
675*1b3f573fSAndroid Build Coastguard Worker    }
676*1b3f573fSAndroid Build Coastguard Worker
677*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidStringDataMiss()
678*1b3f573fSAndroid Build Coastguard Worker    {
679*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
680*1b3f573fSAndroid Build Coastguard Worker
681*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
682*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('7201'));
683*1b3f573fSAndroid Build Coastguard Worker    }
684*1b3f573fSAndroid Build Coastguard Worker
685*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidBytesLengthMiss()
686*1b3f573fSAndroid Build Coastguard Worker    {
687*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
688*1b3f573fSAndroid Build Coastguard Worker
689*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
690*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('7A'));
691*1b3f573fSAndroid Build Coastguard Worker    }
692*1b3f573fSAndroid Build Coastguard Worker
693*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidBytesDataMiss()
694*1b3f573fSAndroid Build Coastguard Worker    {
695*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
696*1b3f573fSAndroid Build Coastguard Worker
697*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
698*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('7A01'));
699*1b3f573fSAndroid Build Coastguard Worker    }
700*1b3f573fSAndroid Build Coastguard Worker
701*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeDecodeValidUtf8()
702*1b3f573fSAndroid Build Coastguard Worker    {
703*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
704*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"optionalString\":\"\\u1000\"}");
705*1b3f573fSAndroid Build Coastguard Worker        $serialized = $m->serializeToString();
706*1b3f573fSAndroid Build Coastguard Worker        $m2 = new TestMessage();
707*1b3f573fSAndroid Build Coastguard Worker        $m2->mergeFromString($serialized);
708*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame($m->getOptionalString(), $m2->getOptionalString());
709*1b3f573fSAndroid Build Coastguard Worker    }
710*1b3f573fSAndroid Build Coastguard Worker
711*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidEnum()
712*1b3f573fSAndroid Build Coastguard Worker    {
713*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
714*1b3f573fSAndroid Build Coastguard Worker
715*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
716*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('8001'));
717*1b3f573fSAndroid Build Coastguard Worker    }
718*1b3f573fSAndroid Build Coastguard Worker
719*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidMessageLengthMiss()
720*1b3f573fSAndroid Build Coastguard Worker    {
721*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
722*1b3f573fSAndroid Build Coastguard Worker
723*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
724*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('8A01'));
725*1b3f573fSAndroid Build Coastguard Worker    }
726*1b3f573fSAndroid Build Coastguard Worker
727*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidMessageDataMiss()
728*1b3f573fSAndroid Build Coastguard Worker    {
729*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
730*1b3f573fSAndroid Build Coastguard Worker
731*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
732*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('8A0101'));
733*1b3f573fSAndroid Build Coastguard Worker    }
734*1b3f573fSAndroid Build Coastguard Worker
735*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeInvalidPackedMessageLength()
736*1b3f573fSAndroid Build Coastguard Worker    {
737*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
738*1b3f573fSAndroid Build Coastguard Worker
739*1b3f573fSAndroid Build Coastguard Worker        $m = new TestPackedMessage();
740*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin('D205'));
741*1b3f573fSAndroid Build Coastguard Worker    }
742*1b3f573fSAndroid Build Coastguard Worker
743*1b3f573fSAndroid Build Coastguard Worker    public function testUnknown()
744*1b3f573fSAndroid Build Coastguard Worker    {
745*1b3f573fSAndroid Build Coastguard Worker        // Test preserve unknown for varint.
746*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
747*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('F80601');  // TODO(teboring): Add a util to encode
748*1b3f573fSAndroid Build Coastguard Worker                                    // varint for better readability
749*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
750*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
751*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(bin2hex($from), bin2hex($to));
752*1b3f573fSAndroid Build Coastguard Worker
753*1b3f573fSAndroid Build Coastguard Worker        // Test preserve unknown for 64-bit.
754*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
755*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('F9060000000000000000');
756*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
757*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
758*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(bin2hex($from), bin2hex($to));
759*1b3f573fSAndroid Build Coastguard Worker
760*1b3f573fSAndroid Build Coastguard Worker        // Test preserve unknown for length delimited.
761*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
762*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('FA0600');
763*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
764*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
765*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(bin2hex($from), bin2hex($to));
766*1b3f573fSAndroid Build Coastguard Worker
767*1b3f573fSAndroid Build Coastguard Worker        // Test preserve unknown for 32-bit.
768*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
769*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('FD0600000000');
770*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
771*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
772*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(bin2hex($from), bin2hex($to));
773*1b3f573fSAndroid Build Coastguard Worker
774*1b3f573fSAndroid Build Coastguard Worker        // Test discard unknown in message.
775*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
776*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('F80601');
777*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
778*1b3f573fSAndroid Build Coastguard Worker        $m->discardUnknownFields();
779*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
780*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("", bin2hex($to));
781*1b3f573fSAndroid Build Coastguard Worker
782*1b3f573fSAndroid Build Coastguard Worker        // Test discard unknown for singular message field.
783*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
784*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('8A0103F80601');
785*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
786*1b3f573fSAndroid Build Coastguard Worker        $m->discardUnknownFields();
787*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
788*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("8a0100", bin2hex($to));
789*1b3f573fSAndroid Build Coastguard Worker
790*1b3f573fSAndroid Build Coastguard Worker        // Test discard unknown for repeated message field.
791*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
792*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('FA0203F80601');
793*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
794*1b3f573fSAndroid Build Coastguard Worker        $m->discardUnknownFields();
795*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
796*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("fa0200", bin2hex($to));
797*1b3f573fSAndroid Build Coastguard Worker
798*1b3f573fSAndroid Build Coastguard Worker        // Test discard unknown for map message value field.
799*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
800*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin("BA050708011203F80601");
801*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
802*1b3f573fSAndroid Build Coastguard Worker        $m->discardUnknownFields();
803*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
804*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("ba050408011200", bin2hex($to));
805*1b3f573fSAndroid Build Coastguard Worker
806*1b3f573fSAndroid Build Coastguard Worker        // Test discard unknown for singular message field.
807*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
808*1b3f573fSAndroid Build Coastguard Worker        $from = hex2bin('9A0403F80601');
809*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString($from);
810*1b3f573fSAndroid Build Coastguard Worker        $m->discardUnknownFields();
811*1b3f573fSAndroid Build Coastguard Worker        $to = $m->serializeToString();
812*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("9a0400", bin2hex($to));
813*1b3f573fSAndroid Build Coastguard Worker    }
814*1b3f573fSAndroid Build Coastguard Worker
815*1b3f573fSAndroid Build Coastguard Worker    public function testJsonUnknown()
816*1b3f573fSAndroid Build Coastguard Worker    {
817*1b3f573fSAndroid Build Coastguard Worker        // Test unknown number
818*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
819*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":1,
820*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
821*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
822*1b3f573fSAndroid Build Coastguard Worker
823*1b3f573fSAndroid Build Coastguard Worker        // Test unknown bool
824*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
825*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":true,
826*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
827*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
828*1b3f573fSAndroid Build Coastguard Worker
829*1b3f573fSAndroid Build Coastguard Worker        // Test unknown string
830*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
831*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":\"abc\",
832*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
833*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
834*1b3f573fSAndroid Build Coastguard Worker
835*1b3f573fSAndroid Build Coastguard Worker        // Test unknown null
836*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
837*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":null,
838*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
839*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
840*1b3f573fSAndroid Build Coastguard Worker
841*1b3f573fSAndroid Build Coastguard Worker        // Test unknown array
842*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
843*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[],
844*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
845*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
846*1b3f573fSAndroid Build Coastguard Worker
847*1b3f573fSAndroid Build Coastguard Worker        // Test unknown number array
848*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
849*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[1],
850*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
851*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
852*1b3f573fSAndroid Build Coastguard Worker
853*1b3f573fSAndroid Build Coastguard Worker        // Test unknown bool array
854*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
855*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[true],
856*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
857*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
858*1b3f573fSAndroid Build Coastguard Worker
859*1b3f573fSAndroid Build Coastguard Worker        // Test unknown string array
860*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
861*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[\"a\"],
862*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
863*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
864*1b3f573fSAndroid Build Coastguard Worker
865*1b3f573fSAndroid Build Coastguard Worker        // Test unknown null array
866*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
867*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[null],
868*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
869*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
870*1b3f573fSAndroid Build Coastguard Worker
871*1b3f573fSAndroid Build Coastguard Worker        // Test unknown array array
872*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
873*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[[]],
874*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
875*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
876*1b3f573fSAndroid Build Coastguard Worker
877*1b3f573fSAndroid Build Coastguard Worker        // Test unknown object array
878*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
879*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[{}],
880*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
881*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
882*1b3f573fSAndroid Build Coastguard Worker
883*1b3f573fSAndroid Build Coastguard Worker        // Test unknown double value array
884*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
885*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":[1, 2],
886*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
887*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
888*1b3f573fSAndroid Build Coastguard Worker
889*1b3f573fSAndroid Build Coastguard Worker        // Test unknown object
890*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
891*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{},
892*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
893*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
894*1b3f573fSAndroid Build Coastguard Worker
895*1b3f573fSAndroid Build Coastguard Worker        // Test unknown number object
896*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
897*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{\"a\":1},
898*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
899*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
900*1b3f573fSAndroid Build Coastguard Worker
901*1b3f573fSAndroid Build Coastguard Worker        // Test unknown bool object
902*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
903*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{\"a\":true},
904*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
905*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
906*1b3f573fSAndroid Build Coastguard Worker
907*1b3f573fSAndroid Build Coastguard Worker        // Test unknown string object
908*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
909*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{\"a\":\"a\"},
910*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
911*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
912*1b3f573fSAndroid Build Coastguard Worker
913*1b3f573fSAndroid Build Coastguard Worker        // Test unknown null object
914*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
915*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{\"a\":null},
916*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
917*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
918*1b3f573fSAndroid Build Coastguard Worker
919*1b3f573fSAndroid Build Coastguard Worker        // Test unknown array object
920*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
921*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{\"a\":[]},
922*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
923*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
924*1b3f573fSAndroid Build Coastguard Worker
925*1b3f573fSAndroid Build Coastguard Worker        // Test unknown object object
926*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
927*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{\"a\":{}},
928*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
929*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
930*1b3f573fSAndroid Build Coastguard Worker
931*1b3f573fSAndroid Build Coastguard Worker        // Test unknown double value object
932*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
933*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"unknown\":{\"a\":1, \"b\":1},
934*1b3f573fSAndroid Build Coastguard Worker                                \"optionalInt32\":1}", true);
935*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $m->getOptionalInt32());
936*1b3f573fSAndroid Build Coastguard Worker
937*1b3f573fSAndroid Build Coastguard Worker        // Test unknown enum value
938*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
939*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"optionalEnum\":\"UNKNOWN\"}", true);
940*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(0, $m->getOptionalEnum());
941*1b3f573fSAndroid Build Coastguard Worker    }
942*1b3f573fSAndroid Build Coastguard Worker
943*1b3f573fSAndroid Build Coastguard Worker    public function testJsonEncode()
944*1b3f573fSAndroid Build Coastguard Worker    {
945*1b3f573fSAndroid Build Coastguard Worker        $from = new TestMessage();
946*1b3f573fSAndroid Build Coastguard Worker        $this->setFields($from);
947*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
948*1b3f573fSAndroid Build Coastguard Worker        $to = new TestMessage();
949*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
950*1b3f573fSAndroid Build Coastguard Worker        $this->expectFields($to);
951*1b3f573fSAndroid Build Coastguard Worker    }
952*1b3f573fSAndroid Build Coastguard Worker
953*1b3f573fSAndroid Build Coastguard Worker    public function testJsonEncodeNullSubMessage()
954*1b3f573fSAndroid Build Coastguard Worker    {
955*1b3f573fSAndroid Build Coastguard Worker        $from = new TestMessage();
956*1b3f573fSAndroid Build Coastguard Worker        $from->setOptionalMessage(null);
957*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
958*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("{}", $data);
959*1b3f573fSAndroid Build Coastguard Worker    }
960*1b3f573fSAndroid Build Coastguard Worker
961*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeDuration()
962*1b3f573fSAndroid Build Coastguard Worker    {
963*1b3f573fSAndroid Build Coastguard Worker        $m = new Google\Protobuf\Duration();
964*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"1234.5678s\"");
965*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1234, $m->getSeconds());
966*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(567800000, $m->getNanos());
967*1b3f573fSAndroid Build Coastguard Worker    }
968*1b3f573fSAndroid Build Coastguard Worker
969*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeDuration()
970*1b3f573fSAndroid Build Coastguard Worker    {
971*1b3f573fSAndroid Build Coastguard Worker        $m = new Google\Protobuf\Duration();
972*1b3f573fSAndroid Build Coastguard Worker        $m->setSeconds(1234);
973*1b3f573fSAndroid Build Coastguard Worker        $m->setNanos(999999999);
974*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("\"1234.999999999s\"", $m->serializeToJsonString());
975*1b3f573fSAndroid Build Coastguard Worker    }
976*1b3f573fSAndroid Build Coastguard Worker
977*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTimestamp()
978*1b3f573fSAndroid Build Coastguard Worker    {
979*1b3f573fSAndroid Build Coastguard Worker        $m = new Google\Protobuf\Timestamp();
980*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"2000-01-01T00:00:00.123456789Z\"");
981*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(946684800, $m->getSeconds());
982*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(123456789, $m->getNanos());
983*1b3f573fSAndroid Build Coastguard Worker    }
984*1b3f573fSAndroid Build Coastguard Worker
985*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTimestamp()
986*1b3f573fSAndroid Build Coastguard Worker    {
987*1b3f573fSAndroid Build Coastguard Worker        $m = new Google\Protobuf\Timestamp();
988*1b3f573fSAndroid Build Coastguard Worker        $m->setSeconds(946684800);
989*1b3f573fSAndroid Build Coastguard Worker        $m->setNanos(123456789);
990*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("\"2000-01-01T00:00:00.123456789Z\"",
991*1b3f573fSAndroid Build Coastguard Worker                            $m->serializeToJsonString());
992*1b3f573fSAndroid Build Coastguard Worker    }
993*1b3f573fSAndroid Build Coastguard Worker
994*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelValue()
995*1b3f573fSAndroid Build Coastguard Worker    {
996*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
997*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"a\"");
998*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("a", $m->getStringValue());
999*1b3f573fSAndroid Build Coastguard Worker
1000*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1001*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("1.5");
1002*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1.5, $m->getNumberValue());
1003*1b3f573fSAndroid Build Coastguard Worker
1004*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1005*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("true");
1006*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(true, $m->getBoolValue());
1007*1b3f573fSAndroid Build Coastguard Worker
1008*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1009*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("null");
1010*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("null_value", $m->getKind());
1011*1b3f573fSAndroid Build Coastguard Worker
1012*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1013*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("[1]");
1014*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("list_value", $m->getKind());
1015*1b3f573fSAndroid Build Coastguard Worker
1016*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1017*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"a\":1}");
1018*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("struct_value", $m->getKind());
1019*1b3f573fSAndroid Build Coastguard Worker    }
1020*1b3f573fSAndroid Build Coastguard Worker
1021*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelValue()
1022*1b3f573fSAndroid Build Coastguard Worker    {
1023*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1024*1b3f573fSAndroid Build Coastguard Worker        $m->setStringValue("a");
1025*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("\"a\"", $m->serializeToJsonString());
1026*1b3f573fSAndroid Build Coastguard Worker
1027*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1028*1b3f573fSAndroid Build Coastguard Worker        $m->setNumberValue(1.5);
1029*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("1.5", $m->serializeToJsonString());
1030*1b3f573fSAndroid Build Coastguard Worker
1031*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1032*1b3f573fSAndroid Build Coastguard Worker        $m->setBoolValue(true);
1033*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("true", $m->serializeToJsonString());
1034*1b3f573fSAndroid Build Coastguard Worker
1035*1b3f573fSAndroid Build Coastguard Worker        $m = new Value();
1036*1b3f573fSAndroid Build Coastguard Worker        $m->setNullValue(0);
1037*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("null", $m->serializeToJsonString());
1038*1b3f573fSAndroid Build Coastguard Worker    }
1039*1b3f573fSAndroid Build Coastguard Worker
1040*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelListValue()
1041*1b3f573fSAndroid Build Coastguard Worker    {
1042*1b3f573fSAndroid Build Coastguard Worker        $m = new ListValue();
1043*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("[1]");
1044*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1.0, $m->getValues()[0]->getNumberValue());
1045*1b3f573fSAndroid Build Coastguard Worker    }
1046*1b3f573fSAndroid Build Coastguard Worker
1047*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelListValue()
1048*1b3f573fSAndroid Build Coastguard Worker    {
1049*1b3f573fSAndroid Build Coastguard Worker        $m = new ListValue();
1050*1b3f573fSAndroid Build Coastguard Worker        $arr = $m->getValues();
1051*1b3f573fSAndroid Build Coastguard Worker        $sub = new Value();
1052*1b3f573fSAndroid Build Coastguard Worker        $sub->setNumberValue(1.5);
1053*1b3f573fSAndroid Build Coastguard Worker        $arr[] = $sub;
1054*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("[1.5]", $m->serializeToJsonString());
1055*1b3f573fSAndroid Build Coastguard Worker    }
1056*1b3f573fSAndroid Build Coastguard Worker
1057*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeEmptyListValue()
1058*1b3f573fSAndroid Build Coastguard Worker    {
1059*1b3f573fSAndroid Build Coastguard Worker        $m = new Struct();
1060*1b3f573fSAndroid Build Coastguard Worker        $m->setFields(['test' => (new Value())->setListValue(new ListValue())]);
1061*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('{"test":[]}', $m->serializeToJsonString());
1062*1b3f573fSAndroid Build Coastguard Worker    }
1063*1b3f573fSAndroid Build Coastguard Worker
1064*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelStruct()
1065*1b3f573fSAndroid Build Coastguard Worker    {
1066*1b3f573fSAndroid Build Coastguard Worker        $m = new Struct();
1067*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"a\":{\"b\":1}}");
1068*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1.0, $m->getFields()["a"]
1069*1b3f573fSAndroid Build Coastguard Worker                                 ->getStructValue()
1070*1b3f573fSAndroid Build Coastguard Worker                                 ->getFields()["b"]->getNumberValue());
1071*1b3f573fSAndroid Build Coastguard Worker    }
1072*1b3f573fSAndroid Build Coastguard Worker
1073*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelStruct()
1074*1b3f573fSAndroid Build Coastguard Worker    {
1075*1b3f573fSAndroid Build Coastguard Worker        $m = new Struct();
1076*1b3f573fSAndroid Build Coastguard Worker        $map = $m->getFields();
1077*1b3f573fSAndroid Build Coastguard Worker        $sub = new Value();
1078*1b3f573fSAndroid Build Coastguard Worker        $sub->setNumberValue(1.5);
1079*1b3f573fSAndroid Build Coastguard Worker        $map["a"] = $sub;
1080*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("{\"a\":1.5}", $m->serializeToJsonString());
1081*1b3f573fSAndroid Build Coastguard Worker    }
1082*1b3f573fSAndroid Build Coastguard Worker
1083*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeEmptyStruct()
1084*1b3f573fSAndroid Build Coastguard Worker    {
1085*1b3f573fSAndroid Build Coastguard Worker        $m = new Struct();
1086*1b3f573fSAndroid Build Coastguard Worker        $m->setFields(['test' => (new Value())->setStructValue(new Struct())]);
1087*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('{"test":{}}', $m->serializeToJsonString());
1088*1b3f573fSAndroid Build Coastguard Worker    }
1089*1b3f573fSAndroid Build Coastguard Worker
1090*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelAny()
1091*1b3f573fSAndroid Build Coastguard Worker    {
1092*1b3f573fSAndroid Build Coastguard Worker        // Make sure packed message has been created at least once.
1093*1b3f573fSAndroid Build Coastguard Worker        $packed = new TestMessage();
1094*1b3f573fSAndroid Build Coastguard Worker
1095*1b3f573fSAndroid Build Coastguard Worker        $m1 = new Any();
1096*1b3f573fSAndroid Build Coastguard Worker        $m1->mergeFromJsonString(
1097*1b3f573fSAndroid Build Coastguard Worker            "{\"optionalInt32\": 1, " .
1098*1b3f573fSAndroid Build Coastguard Worker            "\"@type\":\"type.googleapis.com/foo.TestMessage\"}");
1099*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("type.googleapis.com/foo.TestMessage",
1100*1b3f573fSAndroid Build Coastguard Worker                          $m1->getTypeUrl());
1101*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("0801", bin2hex($m1->getValue()));
1102*1b3f573fSAndroid Build Coastguard Worker
1103*1b3f573fSAndroid Build Coastguard Worker        $m2 = new Any();
1104*1b3f573fSAndroid Build Coastguard Worker        $m2->mergeFromJsonString(
1105*1b3f573fSAndroid Build Coastguard Worker            "{\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1106*1b3f573fSAndroid Build Coastguard Worker            "\"optionalInt32\": 1}");
1107*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("type.googleapis.com/foo.TestMessage",
1108*1b3f573fSAndroid Build Coastguard Worker                          $m2->getTypeUrl());
1109*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("0801", bin2hex($m2->getValue()));
1110*1b3f573fSAndroid Build Coastguard Worker
1111*1b3f573fSAndroid Build Coastguard Worker        $m3 = new Any();
1112*1b3f573fSAndroid Build Coastguard Worker        $m3->mergeFromJsonString(
1113*1b3f573fSAndroid Build Coastguard Worker            "{\"optionalInt32\": 1, " .
1114*1b3f573fSAndroid Build Coastguard Worker            "\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1115*1b3f573fSAndroid Build Coastguard Worker            "\"optionalInt64\": 2}");
1116*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("type.googleapis.com/foo.TestMessage",
1117*1b3f573fSAndroid Build Coastguard Worker                          $m3->getTypeUrl());
1118*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("08011002", bin2hex($m3->getValue()));
1119*1b3f573fSAndroid Build Coastguard Worker    }
1120*1b3f573fSAndroid Build Coastguard Worker
1121*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeAny()
1122*1b3f573fSAndroid Build Coastguard Worker    {
1123*1b3f573fSAndroid Build Coastguard Worker        // Make sure packed message has been created at least once.
1124*1b3f573fSAndroid Build Coastguard Worker        $packed = new TestMessage();
1125*1b3f573fSAndroid Build Coastguard Worker
1126*1b3f573fSAndroid Build Coastguard Worker        $m1 = new TestAny();
1127*1b3f573fSAndroid Build Coastguard Worker        $m1->mergeFromJsonString(
1128*1b3f573fSAndroid Build Coastguard Worker            "{\"any\": {\"optionalInt32\": 1, " .
1129*1b3f573fSAndroid Build Coastguard Worker            "\"@type\":\"type.googleapis.com/foo.TestMessage\"}}");
1130*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("type.googleapis.com/foo.TestMessage",
1131*1b3f573fSAndroid Build Coastguard Worker                          $m1->getAny()->getTypeUrl());
1132*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("0801", bin2hex($m1->getAny()->getValue()));
1133*1b3f573fSAndroid Build Coastguard Worker
1134*1b3f573fSAndroid Build Coastguard Worker        $m2 = new TestAny();
1135*1b3f573fSAndroid Build Coastguard Worker        $m2->mergeFromJsonString(
1136*1b3f573fSAndroid Build Coastguard Worker            "{\"any\":{\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1137*1b3f573fSAndroid Build Coastguard Worker            "\"optionalInt32\": 1}}");
1138*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("type.googleapis.com/foo.TestMessage",
1139*1b3f573fSAndroid Build Coastguard Worker                          $m2->getAny()->getTypeUrl());
1140*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("0801", bin2hex($m2->getAny()->getValue()));
1141*1b3f573fSAndroid Build Coastguard Worker
1142*1b3f573fSAndroid Build Coastguard Worker        $m3 = new TestAny();
1143*1b3f573fSAndroid Build Coastguard Worker        $m3->mergeFromJsonString(
1144*1b3f573fSAndroid Build Coastguard Worker            "{\"any\":{\"optionalInt32\": 1, " .
1145*1b3f573fSAndroid Build Coastguard Worker            "\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1146*1b3f573fSAndroid Build Coastguard Worker            "\"optionalInt64\": 2}}");
1147*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("type.googleapis.com/foo.TestMessage",
1148*1b3f573fSAndroid Build Coastguard Worker                          $m3->getAny()->getTypeUrl());
1149*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("08011002", bin2hex($m3->getAny()->getValue()));
1150*1b3f573fSAndroid Build Coastguard Worker    }
1151*1b3f573fSAndroid Build Coastguard Worker
1152*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeAnyWithWellKnownPacked()
1153*1b3f573fSAndroid Build Coastguard Worker    {
1154*1b3f573fSAndroid Build Coastguard Worker        // Make sure packed message has been created at least once.
1155*1b3f573fSAndroid Build Coastguard Worker        $packed = new Int32Value();
1156*1b3f573fSAndroid Build Coastguard Worker
1157*1b3f573fSAndroid Build Coastguard Worker        $m1 = new TestAny();
1158*1b3f573fSAndroid Build Coastguard Worker        $m1->mergeFromJsonString(
1159*1b3f573fSAndroid Build Coastguard Worker            "{\"any\":" .
1160*1b3f573fSAndroid Build Coastguard Worker            "  {\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
1161*1b3f573fSAndroid Build Coastguard Worker            "   \"value\":1}}");
1162*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("type.googleapis.com/google.protobuf.Int32Value",
1163*1b3f573fSAndroid Build Coastguard Worker                          $m1->getAny()->getTypeUrl());
1164*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("0801", bin2hex($m1->getAny()->getValue()));
1165*1b3f573fSAndroid Build Coastguard Worker    }
1166*1b3f573fSAndroid Build Coastguard Worker
1167*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeAnyWithUnknownPacked()
1168*1b3f573fSAndroid Build Coastguard Worker    {
1169*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
1170*1b3f573fSAndroid Build Coastguard Worker
1171*1b3f573fSAndroid Build Coastguard Worker        $m = new TestAny();
1172*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString(
1173*1b3f573fSAndroid Build Coastguard Worker            "{\"any\":" .
1174*1b3f573fSAndroid Build Coastguard Worker            "  {\"@type\":\"type.googleapis.com/unknown\"," .
1175*1b3f573fSAndroid Build Coastguard Worker            "   \"value\":1}}");
1176*1b3f573fSAndroid Build Coastguard Worker    }
1177*1b3f573fSAndroid Build Coastguard Worker
1178*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelAny()
1179*1b3f573fSAndroid Build Coastguard Worker    {
1180*1b3f573fSAndroid Build Coastguard Worker        // Test a normal message.
1181*1b3f573fSAndroid Build Coastguard Worker        $packed = new TestMessage();
1182*1b3f573fSAndroid Build Coastguard Worker        $packed->setOptionalInt32(123);
1183*1b3f573fSAndroid Build Coastguard Worker        $packed->setOptionalString("abc");
1184*1b3f573fSAndroid Build Coastguard Worker
1185*1b3f573fSAndroid Build Coastguard Worker        $m = new Any();
1186*1b3f573fSAndroid Build Coastguard Worker        $m->pack($packed);
1187*1b3f573fSAndroid Build Coastguard Worker        $expected1 =
1188*1b3f573fSAndroid Build Coastguard Worker            "{\"@type\":\"type.googleapis.com/foo.TestMessage\"," .
1189*1b3f573fSAndroid Build Coastguard Worker            "\"optional_int32\":123,\"optional_string\":\"abc\"}";
1190*1b3f573fSAndroid Build Coastguard Worker        $expected2 =
1191*1b3f573fSAndroid Build Coastguard Worker            "{\"@type\":\"type.googleapis.com/foo.TestMessage\"," .
1192*1b3f573fSAndroid Build Coastguard Worker            "\"optionalInt32\":123,\"optionalString\":\"abc\"}";
1193*1b3f573fSAndroid Build Coastguard Worker        $result = $m->serializeToJsonString();
1194*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue($expected1 === $result || $expected2 === $result);
1195*1b3f573fSAndroid Build Coastguard Worker
1196*1b3f573fSAndroid Build Coastguard Worker        // Test a well known message.
1197*1b3f573fSAndroid Build Coastguard Worker        $packed = new Int32Value();
1198*1b3f573fSAndroid Build Coastguard Worker        $packed->setValue(123);
1199*1b3f573fSAndroid Build Coastguard Worker
1200*1b3f573fSAndroid Build Coastguard Worker        $m = new Any();
1201*1b3f573fSAndroid Build Coastguard Worker        $m->pack($packed);
1202*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(
1203*1b3f573fSAndroid Build Coastguard Worker            "{\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
1204*1b3f573fSAndroid Build Coastguard Worker            "\"value\":123}",
1205*1b3f573fSAndroid Build Coastguard Worker            $m->serializeToJsonString());
1206*1b3f573fSAndroid Build Coastguard Worker
1207*1b3f573fSAndroid Build Coastguard Worker        // Test an Any message.
1208*1b3f573fSAndroid Build Coastguard Worker        $outer = new Any();
1209*1b3f573fSAndroid Build Coastguard Worker        $outer->pack($m);
1210*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(
1211*1b3f573fSAndroid Build Coastguard Worker            "{\"@type\":\"type.googleapis.com/google.protobuf.Any\"," .
1212*1b3f573fSAndroid Build Coastguard Worker            "\"value\":{\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
1213*1b3f573fSAndroid Build Coastguard Worker            "\"value\":123}}",
1214*1b3f573fSAndroid Build Coastguard Worker            $outer->serializeToJsonString());
1215*1b3f573fSAndroid Build Coastguard Worker
1216*1b3f573fSAndroid Build Coastguard Worker        // Test a Timestamp message.
1217*1b3f573fSAndroid Build Coastguard Worker        $packed = new Google\Protobuf\Timestamp();
1218*1b3f573fSAndroid Build Coastguard Worker        $packed->setSeconds(946684800);
1219*1b3f573fSAndroid Build Coastguard Worker        $packed->setNanos(123456789);
1220*1b3f573fSAndroid Build Coastguard Worker        $m = new Any();
1221*1b3f573fSAndroid Build Coastguard Worker        $m->pack($packed);
1222*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(
1223*1b3f573fSAndroid Build Coastguard Worker            "{\"@type\":\"type.googleapis.com/google.protobuf.Timestamp\"," .
1224*1b3f573fSAndroid Build Coastguard Worker            "\"value\":\"2000-01-01T00:00:00.123456789Z\"}",
1225*1b3f573fSAndroid Build Coastguard Worker            $m->serializeToJsonString());
1226*1b3f573fSAndroid Build Coastguard Worker    }
1227*1b3f573fSAndroid Build Coastguard Worker
1228*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeAnyWithDefaultWrapperMessagePacked()
1229*1b3f573fSAndroid Build Coastguard Worker    {
1230*1b3f573fSAndroid Build Coastguard Worker        $any = new Any();
1231*1b3f573fSAndroid Build Coastguard Worker        $any->pack(new TestInt32Value([
1232*1b3f573fSAndroid Build Coastguard Worker            'field' => new Int32Value(['value' => 0]),
1233*1b3f573fSAndroid Build Coastguard Worker        ]));
1234*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(
1235*1b3f573fSAndroid Build Coastguard Worker            "{\"@type\":\"type.googleapis.com/foo.TestInt32Value\"," .
1236*1b3f573fSAndroid Build Coastguard Worker            "\"field\":0}",
1237*1b3f573fSAndroid Build Coastguard Worker            $any->serializeToJsonString());
1238*1b3f573fSAndroid Build Coastguard Worker    }
1239*1b3f573fSAndroid Build Coastguard Worker
1240*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeTopLevelFieldMask()
1241*1b3f573fSAndroid Build Coastguard Worker    {
1242*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1243*1b3f573fSAndroid Build Coastguard Worker        $m->setMapStringString(['a'=>'abcdefg']);
1244*1b3f573fSAndroid Build Coastguard Worker        $data1 = $m->serializeToJsonString();
1245*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
1246*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromJsonString($data1);
1247*1b3f573fSAndroid Build Coastguard Worker        $data2 = $n->serializeToJsonString();
1248*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame($data1, $data2);
1249*1b3f573fSAndroid Build Coastguard Worker
1250*1b3f573fSAndroid Build Coastguard Worker        $m = new FieldMask();
1251*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"foo.barBaz,qux\"");
1252*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("foo.bar_baz", $m->getPaths()[0]);
1253*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("qux", $m->getPaths()[1]);
1254*1b3f573fSAndroid Build Coastguard Worker    }
1255*1b3f573fSAndroid Build Coastguard Worker
1256*1b3f573fSAndroid Build Coastguard Worker    public function testEncodeTopLevelFieldMask()
1257*1b3f573fSAndroid Build Coastguard Worker    {
1258*1b3f573fSAndroid Build Coastguard Worker        $m = new FieldMask();
1259*1b3f573fSAndroid Build Coastguard Worker        $m->setPaths(["foo.bar_baz", "qux"]);
1260*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("\"foo.barBaz,qux\"", $m->serializeToJsonString());
1261*1b3f573fSAndroid Build Coastguard Worker    }
1262*1b3f573fSAndroid Build Coastguard Worker
1263*1b3f573fSAndroid Build Coastguard Worker    public function testDecodeEmptyFieldMask()
1264*1b3f573fSAndroid Build Coastguard Worker    {
1265*1b3f573fSAndroid Build Coastguard Worker        $m = new FieldMask();
1266*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("\"\"");
1267*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("", $m->serializeToString());
1268*1b3f573fSAndroid Build Coastguard Worker    }
1269*1b3f573fSAndroid Build Coastguard Worker
1270*1b3f573fSAndroid Build Coastguard Worker    public function testJsonDecodeMapWithDefaultValueKey()
1271*1b3f573fSAndroid Build Coastguard Worker    {
1272*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1273*1b3f573fSAndroid Build Coastguard Worker        $m->getMapInt32Int32()[0] = 0;
1274*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("{\"mapInt32Int32\":{\"0\":0}}",
1275*1b3f573fSAndroid Build Coastguard Worker                          $m->serializeToJsonString());
1276*1b3f573fSAndroid Build Coastguard Worker
1277*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1278*1b3f573fSAndroid Build Coastguard Worker        $m->getMapStringString()[""] = "";
1279*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("{\"mapStringString\":{\"\":\"\"}}",
1280*1b3f573fSAndroid Build Coastguard Worker                          $m->serializeToJsonString());
1281*1b3f573fSAndroid Build Coastguard Worker    }
1282*1b3f573fSAndroid Build Coastguard Worker
1283*1b3f573fSAndroid Build Coastguard Worker    public function testJsonDecodeNumericStringMapKey()
1284*1b3f573fSAndroid Build Coastguard Worker    {
1285*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1286*1b3f573fSAndroid Build Coastguard Worker        $m->getMapStringString()["1"] = "1";
1287*1b3f573fSAndroid Build Coastguard Worker        $data = $m->serializeToJsonString();
1288*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame("{\"mapStringString\":{\"1\":\"1\"}}", $data);
1289*1b3f573fSAndroid Build Coastguard Worker        $n = new TestMessage();
1290*1b3f573fSAndroid Build Coastguard Worker        $n->mergeFromJsonString($data);
1291*1b3f573fSAndroid Build Coastguard Worker    }
1292*1b3f573fSAndroid Build Coastguard Worker
1293*1b3f573fSAndroid Build Coastguard Worker    public function testMessageMapNoValue()
1294*1b3f573fSAndroid Build Coastguard Worker    {
1295*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1296*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin("CA0700"));
1297*1b3f573fSAndroid Build Coastguard Worker        $m->serializeToString();
1298*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
1299*1b3f573fSAndroid Build Coastguard Worker    }
1300*1b3f573fSAndroid Build Coastguard Worker
1301*1b3f573fSAndroid Build Coastguard Worker    public function testAnyMapNoValue()
1302*1b3f573fSAndroid Build Coastguard Worker    {
1303*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1304*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin("D20700"));
1305*1b3f573fSAndroid Build Coastguard Worker        $m->serializeToString();
1306*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
1307*1b3f573fSAndroid Build Coastguard Worker    }
1308*1b3f573fSAndroid Build Coastguard Worker
1309*1b3f573fSAndroid Build Coastguard Worker    public function testListValueMapNoValue()
1310*1b3f573fSAndroid Build Coastguard Worker    {
1311*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1312*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin("DA0700"));
1313*1b3f573fSAndroid Build Coastguard Worker        $m->serializeToString();
1314*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
1315*1b3f573fSAndroid Build Coastguard Worker    }
1316*1b3f573fSAndroid Build Coastguard Worker
1317*1b3f573fSAndroid Build Coastguard Worker    public function testStructMapNoValue()
1318*1b3f573fSAndroid Build Coastguard Worker    {
1319*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
1320*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromString(hex2bin("E20700"));
1321*1b3f573fSAndroid Build Coastguard Worker        $m->serializeToString();
1322*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
1323*1b3f573fSAndroid Build Coastguard Worker    }
1324*1b3f573fSAndroid Build Coastguard Worker
1325*1b3f573fSAndroid Build Coastguard Worker    /**
1326*1b3f573fSAndroid Build Coastguard Worker     * @dataProvider wrappersDataProvider
1327*1b3f573fSAndroid Build Coastguard Worker     */
1328*1b3f573fSAndroid Build Coastguard Worker    public function testWrapperJsonDecodeAndGet(
1329*1b3f573fSAndroid Build Coastguard Worker        $class,
1330*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValue,
1331*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValueData,
1332*1b3f573fSAndroid Build Coastguard Worker        $defaultValue,
1333*1b3f573fSAndroid Build Coastguard Worker        $defaultValueData
1334*1b3f573fSAndroid Build Coastguard Worker    )
1335*1b3f573fSAndroid Build Coastguard Worker    {
1336*1b3f573fSAndroid Build Coastguard Worker        // Singular with non-default
1337*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1338*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"field\":" . $nonDefaultValueData . "}");
1339*1b3f573fSAndroid Build Coastguard Worker        $wrapper = $m->getField();
1340*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $wrapper->getValue());
1341*1b3f573fSAndroid Build Coastguard Worker
1342*1b3f573fSAndroid Build Coastguard Worker        // Singular with default
1343*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1344*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"field\":" . $defaultValueData . "}");
1345*1b3f573fSAndroid Build Coastguard Worker        $wrapper = $m->getField();
1346*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $wrapper->getValue());
1347*1b3f573fSAndroid Build Coastguard Worker
1348*1b3f573fSAndroid Build Coastguard Worker        // Repeated with empty
1349*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1350*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"repeated_field\":[]}");
1351*1b3f573fSAndroid Build Coastguard Worker        $repeatedWrapper = $m->getRepeatedField();
1352*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(0, count($repeatedWrapper));
1353*1b3f573fSAndroid Build Coastguard Worker
1354*1b3f573fSAndroid Build Coastguard Worker        // Repeated with non-default
1355*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1356*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"repeated_field\":[" . $defaultValueData . "]}");
1357*1b3f573fSAndroid Build Coastguard Worker        $repeatedWrapper = $m->getRepeatedField();
1358*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, count($repeatedWrapper));
1359*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $repeatedWrapper[0]->getValue());
1360*1b3f573fSAndroid Build Coastguard Worker
1361*1b3f573fSAndroid Build Coastguard Worker        // Repeated with default
1362*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1363*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"repeated_field\":[" . $defaultValueData . "]}");
1364*1b3f573fSAndroid Build Coastguard Worker        $repeatedWrapper = $m->getRepeatedField();
1365*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, count($repeatedWrapper));
1366*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $repeatedWrapper[0]->getValue());
1367*1b3f573fSAndroid Build Coastguard Worker
1368*1b3f573fSAndroid Build Coastguard Worker        // Oneof with non-default
1369*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1370*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"oneof_field\":" . $nonDefaultValueData . "}");
1371*1b3f573fSAndroid Build Coastguard Worker        $wrapper = $m->getOneofField();
1372*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $wrapper->getValue());
1373*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("oneof_field", $m->getOneofFields());
1374*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(0, $m->getInt32Field());
1375*1b3f573fSAndroid Build Coastguard Worker
1376*1b3f573fSAndroid Build Coastguard Worker        // Oneof with default
1377*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1378*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"oneof_field\":" . $defaultValueData . "}");
1379*1b3f573fSAndroid Build Coastguard Worker        $wrapper = $m->getOneofField();
1380*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $wrapper->getValue());
1381*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("oneof_field", $m->getOneofFields());
1382*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(0, $m->getInt32Field());
1383*1b3f573fSAndroid Build Coastguard Worker    }
1384*1b3f573fSAndroid Build Coastguard Worker
1385*1b3f573fSAndroid Build Coastguard Worker    /**
1386*1b3f573fSAndroid Build Coastguard Worker     * @dataProvider wrappersDataProvider
1387*1b3f573fSAndroid Build Coastguard Worker     */
1388*1b3f573fSAndroid Build Coastguard Worker    public function testWrapperJsonDecodeAndGetUnwrapped(
1389*1b3f573fSAndroid Build Coastguard Worker        $class,
1390*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValue,
1391*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValueData,
1392*1b3f573fSAndroid Build Coastguard Worker        $defaultValue,
1393*1b3f573fSAndroid Build Coastguard Worker        $defaultValueData
1394*1b3f573fSAndroid Build Coastguard Worker    )
1395*1b3f573fSAndroid Build Coastguard Worker    {
1396*1b3f573fSAndroid Build Coastguard Worker        // Singular with non-default
1397*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1398*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"field\":" . $nonDefaultValueData . "}");
1399*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $m->getFieldUnwrapped());
1400*1b3f573fSAndroid Build Coastguard Worker
1401*1b3f573fSAndroid Build Coastguard Worker        // Singular with default
1402*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1403*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"field\":" . $defaultValueData . "}");
1404*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $m->getFieldUnwrapped());
1405*1b3f573fSAndroid Build Coastguard Worker
1406*1b3f573fSAndroid Build Coastguard Worker        // Oneof with non-default
1407*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1408*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"oneof_field\":" . $nonDefaultValueData . "}");
1409*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $m->getOneofFieldUnwrapped());
1410*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("oneof_field", $m->getOneofFields());
1411*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(0, $m->getInt32Field());
1412*1b3f573fSAndroid Build Coastguard Worker
1413*1b3f573fSAndroid Build Coastguard Worker        // Oneof with default
1414*1b3f573fSAndroid Build Coastguard Worker        $m = new $class();
1415*1b3f573fSAndroid Build Coastguard Worker        $m->mergeFromJsonString("{\"oneof_field\":" . $defaultValueData . "}");
1416*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $m->getOneofFieldUnwrapped());
1417*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals("oneof_field", $m->getOneofFields());
1418*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(0, $m->getInt32Field());
1419*1b3f573fSAndroid Build Coastguard Worker    }
1420*1b3f573fSAndroid Build Coastguard Worker
1421*1b3f573fSAndroid Build Coastguard Worker    /**
1422*1b3f573fSAndroid Build Coastguard Worker     * @dataProvider wrappersDataProvider
1423*1b3f573fSAndroid Build Coastguard Worker     */
1424*1b3f573fSAndroid Build Coastguard Worker    public function testWrapperJsonDecodeEncode(
1425*1b3f573fSAndroid Build Coastguard Worker        $class,
1426*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValue,
1427*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValueData,
1428*1b3f573fSAndroid Build Coastguard Worker        $defaultValue,
1429*1b3f573fSAndroid Build Coastguard Worker        $defaultValueData
1430*1b3f573fSAndroid Build Coastguard Worker    )
1431*1b3f573fSAndroid Build Coastguard Worker    {
1432*1b3f573fSAndroid Build Coastguard Worker        // Singular with non-default
1433*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1434*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1435*1b3f573fSAndroid Build Coastguard Worker        $from->mergeFromJsonString("{\"field\":" . $nonDefaultValueData . "}");
1436*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1437*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1438*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $to->getFieldUnwrapped());
1439*1b3f573fSAndroid Build Coastguard Worker
1440*1b3f573fSAndroid Build Coastguard Worker        // Singular with default
1441*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1442*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1443*1b3f573fSAndroid Build Coastguard Worker        $from->mergeFromJsonString("{\"field\":" . $defaultValueData . "}");
1444*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1445*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1446*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $to->getFieldUnwrapped());
1447*1b3f573fSAndroid Build Coastguard Worker
1448*1b3f573fSAndroid Build Coastguard Worker        // Oneof with non-default
1449*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1450*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1451*1b3f573fSAndroid Build Coastguard Worker        $from->mergeFromJsonString("{\"oneof_field\":" . $nonDefaultValueData . "}");
1452*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1453*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1454*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $to->getOneofFieldUnwrapped());
1455*1b3f573fSAndroid Build Coastguard Worker
1456*1b3f573fSAndroid Build Coastguard Worker        // Oneof with default
1457*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1458*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1459*1b3f573fSAndroid Build Coastguard Worker        $from->mergeFromJsonString("{\"oneof_field\":" . $defaultValueData . "}");
1460*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1461*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1462*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $to->getOneofFieldUnwrapped());
1463*1b3f573fSAndroid Build Coastguard Worker    }
1464*1b3f573fSAndroid Build Coastguard Worker
1465*1b3f573fSAndroid Build Coastguard Worker    /**
1466*1b3f573fSAndroid Build Coastguard Worker     * @dataProvider wrappersDataProvider
1467*1b3f573fSAndroid Build Coastguard Worker     */
1468*1b3f573fSAndroid Build Coastguard Worker    public function testWrapperSetUnwrappedJsonEncode(
1469*1b3f573fSAndroid Build Coastguard Worker        $class,
1470*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValue,
1471*1b3f573fSAndroid Build Coastguard Worker        $nonDefaultValueData,
1472*1b3f573fSAndroid Build Coastguard Worker        $defaultValue,
1473*1b3f573fSAndroid Build Coastguard Worker        $defaultValueData
1474*1b3f573fSAndroid Build Coastguard Worker    )
1475*1b3f573fSAndroid Build Coastguard Worker    {
1476*1b3f573fSAndroid Build Coastguard Worker        // Singular with non-default
1477*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1478*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1479*1b3f573fSAndroid Build Coastguard Worker        $from->setFieldUnwrapped($nonDefaultValue);
1480*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1481*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1482*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $to->getFieldUnwrapped());
1483*1b3f573fSAndroid Build Coastguard Worker
1484*1b3f573fSAndroid Build Coastguard Worker        // Singular with default
1485*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1486*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1487*1b3f573fSAndroid Build Coastguard Worker        $from->setFieldUnwrapped($defaultValue);
1488*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1489*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1490*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $to->getFieldUnwrapped());
1491*1b3f573fSAndroid Build Coastguard Worker
1492*1b3f573fSAndroid Build Coastguard Worker        // Oneof with non-default
1493*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1494*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1495*1b3f573fSAndroid Build Coastguard Worker        $from->setOneofFieldUnwrapped($nonDefaultValue);
1496*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1497*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1498*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($nonDefaultValue, $to->getOneofFieldUnwrapped());
1499*1b3f573fSAndroid Build Coastguard Worker
1500*1b3f573fSAndroid Build Coastguard Worker        // Oneof with default
1501*1b3f573fSAndroid Build Coastguard Worker        $from = new $class();
1502*1b3f573fSAndroid Build Coastguard Worker        $to = new $class();
1503*1b3f573fSAndroid Build Coastguard Worker        $from->setOneofFieldUnwrapped($defaultValue);
1504*1b3f573fSAndroid Build Coastguard Worker        $data = $from->serializeToJsonString();
1505*1b3f573fSAndroid Build Coastguard Worker        $to->mergeFromJsonString($data);
1506*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals($defaultValue, $to->getOneofFieldUnwrapped());
1507*1b3f573fSAndroid Build Coastguard Worker    }
1508*1b3f573fSAndroid Build Coastguard Worker
1509*1b3f573fSAndroid Build Coastguard Worker    public function wrappersDataProvider()
1510*1b3f573fSAndroid Build Coastguard Worker    {
1511*1b3f573fSAndroid Build Coastguard Worker        return [
1512*1b3f573fSAndroid Build Coastguard Worker            [TestInt32Value::class, 1, "1", 0, "0"],
1513*1b3f573fSAndroid Build Coastguard Worker            [TestStringValue::class, "a", "\"a\"", "", "\"\""],
1514*1b3f573fSAndroid Build Coastguard Worker        ];
1515*1b3f573fSAndroid Build Coastguard Worker    }
1516*1b3f573fSAndroid Build Coastguard Worker}
1517