xref: /aosp_15_r20/external/protobuf/php/tests/ArrayTest.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\Internal\RepeatedField;
7*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Internal\GPBType;
8*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestMessage;
9*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestMessage\Sub;
10*1b3f573fSAndroid Build Coastguard Worker
11*1b3f573fSAndroid Build Coastguard Workerclass ArrayTest extends TestBase
12*1b3f573fSAndroid Build Coastguard Worker{
13*1b3f573fSAndroid Build Coastguard Worker
14*1b3f573fSAndroid Build Coastguard Worker    #########################################################
15*1b3f573fSAndroid Build Coastguard Worker    # Test int32 field.
16*1b3f573fSAndroid Build Coastguard Worker    #########################################################
17*1b3f573fSAndroid Build Coastguard Worker
18*1b3f573fSAndroid Build Coastguard Worker    public function testInt32()
19*1b3f573fSAndroid Build Coastguard Worker    {
20*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::INT32);
21*1b3f573fSAndroid Build Coastguard Worker
22*1b3f573fSAndroid Build Coastguard Worker        // Test append.
23*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_INT32;
24*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[0]);
25*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MIN_INT32;
26*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_INT32, $arr[1]);
27*1b3f573fSAndroid Build Coastguard Worker
28*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
29*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[2]);
30*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_INT32_FLOAT;
31*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[3]);
32*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_INT32_FLOAT;
33*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[4]);
34*1b3f573fSAndroid Build Coastguard Worker
35*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '2';
36*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $arr[5]);
37*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '3.1';
38*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $arr[6]);
39*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_INT32_STRING;
40*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[7]);
41*1b3f573fSAndroid Build Coastguard Worker
42*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(8, count($arr));
43*1b3f573fSAndroid Build Coastguard Worker
44*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
45*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = 0;
46*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(0, $arr[$i]);
47*1b3f573fSAndroid Build Coastguard Worker        }
48*1b3f573fSAndroid Build Coastguard Worker
49*1b3f573fSAndroid Build Coastguard Worker        // Test set.
50*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = MAX_INT32;
51*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[0]);
52*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = MIN_INT32;
53*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_INT32, $arr[1]);
54*1b3f573fSAndroid Build Coastguard Worker
55*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = 1.1;
56*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[2]);
57*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = MAX_INT32_FLOAT;
58*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[3]);
59*1b3f573fSAndroid Build Coastguard Worker        $arr[4] = MAX_INT32_FLOAT;
60*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[4]);
61*1b3f573fSAndroid Build Coastguard Worker
62*1b3f573fSAndroid Build Coastguard Worker        $arr[5] = '2';
63*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $arr[5]);
64*1b3f573fSAndroid Build Coastguard Worker        $arr[6] = '3.1';
65*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $arr[6]);
66*1b3f573fSAndroid Build Coastguard Worker        $arr[7] = MAX_INT32_STRING;
67*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MAX_INT32, $arr[7]);
68*1b3f573fSAndroid Build Coastguard Worker
69*1b3f573fSAndroid Build Coastguard Worker        // Test foreach.
70*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::INT32);
71*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < 3; $i++) {
72*1b3f573fSAndroid Build Coastguard Worker          $arr[] = $i;
73*1b3f573fSAndroid Build Coastguard Worker        }
74*1b3f573fSAndroid Build Coastguard Worker        $i = 0;
75*1b3f573fSAndroid Build Coastguard Worker        foreach ($arr as $val) {
76*1b3f573fSAndroid Build Coastguard Worker          $this->assertSame($i++, $val);
77*1b3f573fSAndroid Build Coastguard Worker        }
78*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $i);
79*1b3f573fSAndroid Build Coastguard Worker    }
80*1b3f573fSAndroid Build Coastguard Worker
81*1b3f573fSAndroid Build Coastguard Worker    #########################################################
82*1b3f573fSAndroid Build Coastguard Worker    # Test uint32 field.
83*1b3f573fSAndroid Build Coastguard Worker    #########################################################
84*1b3f573fSAndroid Build Coastguard Worker
85*1b3f573fSAndroid Build Coastguard Worker    public function testUint32()
86*1b3f573fSAndroid Build Coastguard Worker    {
87*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::UINT32);
88*1b3f573fSAndroid Build Coastguard Worker
89*1b3f573fSAndroid Build Coastguard Worker        // Test append.
90*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_UINT32;
91*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[0]);
92*1b3f573fSAndroid Build Coastguard Worker        $arr[] = -1;
93*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[1]);
94*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MIN_UINT32;
95*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_UINT32, $arr[2]);
96*1b3f573fSAndroid Build Coastguard Worker
97*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
98*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[3]);
99*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_UINT32_FLOAT;
100*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[4]);
101*1b3f573fSAndroid Build Coastguard Worker        $arr[] = -1.0;
102*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[5]);
103*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MIN_UINT32_FLOAT;
104*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_UINT32, $arr[6]);
105*1b3f573fSAndroid Build Coastguard Worker
106*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '2';
107*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $arr[7]);
108*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '3.1';
109*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $arr[8]);
110*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_UINT32_STRING;
111*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[9]);
112*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '-1.0';
113*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[10]);
114*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MIN_UINT32_STRING;
115*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_UINT32, $arr[11]);
116*1b3f573fSAndroid Build Coastguard Worker
117*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(12, count($arr));
118*1b3f573fSAndroid Build Coastguard Worker
119*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
120*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = 0;
121*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(0, $arr[$i]);
122*1b3f573fSAndroid Build Coastguard Worker        }
123*1b3f573fSAndroid Build Coastguard Worker
124*1b3f573fSAndroid Build Coastguard Worker        // Test set.
125*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = MAX_UINT32;
126*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[0]);
127*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = -1;
128*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[1]);
129*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = MIN_UINT32;
130*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_UINT32, $arr[2]);
131*1b3f573fSAndroid Build Coastguard Worker
132*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = 1.1;
133*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[3]);
134*1b3f573fSAndroid Build Coastguard Worker        $arr[4] = MAX_UINT32_FLOAT;
135*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[4]);
136*1b3f573fSAndroid Build Coastguard Worker        $arr[5] = -1.0;
137*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[5]);
138*1b3f573fSAndroid Build Coastguard Worker        $arr[6] = MIN_UINT32_FLOAT;
139*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_UINT32, $arr[6]);
140*1b3f573fSAndroid Build Coastguard Worker
141*1b3f573fSAndroid Build Coastguard Worker        $arr[7] = '2';
142*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $arr[7]);
143*1b3f573fSAndroid Build Coastguard Worker        $arr[8] = '3.1';
144*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $arr[8]);
145*1b3f573fSAndroid Build Coastguard Worker        $arr[9] = MAX_UINT32_STRING;
146*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[9]);
147*1b3f573fSAndroid Build Coastguard Worker        $arr[10] = '-1.0';
148*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(-1, $arr[10]);
149*1b3f573fSAndroid Build Coastguard Worker        $arr[11] = MIN_UINT32_STRING;
150*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(MIN_UINT32, $arr[11]);
151*1b3f573fSAndroid Build Coastguard Worker    }
152*1b3f573fSAndroid Build Coastguard Worker
153*1b3f573fSAndroid Build Coastguard Worker    #########################################################
154*1b3f573fSAndroid Build Coastguard Worker    # Test int64 field.
155*1b3f573fSAndroid Build Coastguard Worker    #########################################################
156*1b3f573fSAndroid Build Coastguard Worker
157*1b3f573fSAndroid Build Coastguard Worker    public function testInt64()
158*1b3f573fSAndroid Build Coastguard Worker    {
159*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::INT64);
160*1b3f573fSAndroid Build Coastguard Worker
161*1b3f573fSAndroid Build Coastguard Worker        // Test append.
162*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_INT64;
163*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MIN_INT64;
164*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
165*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '2';
166*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '3.1';
167*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_INT64_STRING;
168*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MIN_INT64_STRING;
169*1b3f573fSAndroid Build Coastguard Worker        if (PHP_INT_SIZE == 4) {
170*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64, $arr[0]);
171*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MIN_INT64, $arr[1]);
172*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('1', $arr[2]);
173*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('2', $arr[3]);
174*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('3', $arr[4]);
175*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64_STRING, $arr[5]);
176*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MIN_INT64_STRING, $arr[6]);
177*1b3f573fSAndroid Build Coastguard Worker        } else {
178*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64, $arr[0]);
179*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MIN_INT64, $arr[1]);
180*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(1, $arr[2]);
181*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(2, $arr[3]);
182*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(3, $arr[4]);
183*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64, $arr[5]);
184*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MIN_INT64, $arr[6]);
185*1b3f573fSAndroid Build Coastguard Worker        }
186*1b3f573fSAndroid Build Coastguard Worker
187*1b3f573fSAndroid Build Coastguard Worker
188*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(7, count($arr));
189*1b3f573fSAndroid Build Coastguard Worker
190*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
191*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = 0;
192*1b3f573fSAndroid Build Coastguard Worker            if (PHP_INT_SIZE == 4) {
193*1b3f573fSAndroid Build Coastguard Worker                $this->assertSame('0', $arr[$i]);
194*1b3f573fSAndroid Build Coastguard Worker            } else {
195*1b3f573fSAndroid Build Coastguard Worker                $this->assertSame(0, $arr[$i]);
196*1b3f573fSAndroid Build Coastguard Worker            }
197*1b3f573fSAndroid Build Coastguard Worker        }
198*1b3f573fSAndroid Build Coastguard Worker
199*1b3f573fSAndroid Build Coastguard Worker        // Test set.
200*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = MAX_INT64;
201*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = MIN_INT64;
202*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = 1.1;
203*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = '2';
204*1b3f573fSAndroid Build Coastguard Worker        $arr[4] = '3.1';
205*1b3f573fSAndroid Build Coastguard Worker        $arr[5] = MAX_INT64_STRING;
206*1b3f573fSAndroid Build Coastguard Worker        $arr[6] = MIN_INT64_STRING;
207*1b3f573fSAndroid Build Coastguard Worker
208*1b3f573fSAndroid Build Coastguard Worker        if (PHP_INT_SIZE == 4) {
209*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64_STRING, $arr[0]);
210*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MIN_INT64_STRING, $arr[1]);
211*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('1', $arr[2]);
212*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('2', $arr[3]);
213*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('3', $arr[4]);
214*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64_STRING, $arr[5]);
215*1b3f573fSAndroid Build Coastguard Worker            $this->assertEquals(MIN_INT64_STRING, $arr[6]);
216*1b3f573fSAndroid Build Coastguard Worker        } else {
217*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64, $arr[0]);
218*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MIN_INT64, $arr[1]);
219*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(1, $arr[2]);
220*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(2, $arr[3]);
221*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(3, $arr[4]);
222*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_INT64, $arr[5]);
223*1b3f573fSAndroid Build Coastguard Worker            $this->assertEquals(MIN_INT64, $arr[6]);
224*1b3f573fSAndroid Build Coastguard Worker        }
225*1b3f573fSAndroid Build Coastguard Worker    }
226*1b3f573fSAndroid Build Coastguard Worker
227*1b3f573fSAndroid Build Coastguard Worker    #########################################################
228*1b3f573fSAndroid Build Coastguard Worker    # Test uint64 field.
229*1b3f573fSAndroid Build Coastguard Worker    #########################################################
230*1b3f573fSAndroid Build Coastguard Worker
231*1b3f573fSAndroid Build Coastguard Worker    public function testUint64()
232*1b3f573fSAndroid Build Coastguard Worker    {
233*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::UINT64);
234*1b3f573fSAndroid Build Coastguard Worker
235*1b3f573fSAndroid Build Coastguard Worker        // Test append.
236*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_UINT64;
237*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
238*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '2';
239*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '3.1';
240*1b3f573fSAndroid Build Coastguard Worker        $arr[] = MAX_UINT64_STRING;
241*1b3f573fSAndroid Build Coastguard Worker
242*1b3f573fSAndroid Build Coastguard Worker        if (PHP_INT_SIZE == 4) {
243*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64_STRING, $arr[0]);
244*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('1', $arr[1]);
245*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('2', $arr[2]);
246*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('3', $arr[3]);
247*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64_STRING, $arr[4]);
248*1b3f573fSAndroid Build Coastguard Worker        } else {
249*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64, $arr[0]);
250*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(1, $arr[1]);
251*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(2, $arr[2]);
252*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(3, $arr[3]);
253*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64, $arr[4]);
254*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(5, count($arr));
255*1b3f573fSAndroid Build Coastguard Worker        }
256*1b3f573fSAndroid Build Coastguard Worker
257*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(5, count($arr));
258*1b3f573fSAndroid Build Coastguard Worker
259*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
260*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = 0;
261*1b3f573fSAndroid Build Coastguard Worker            if (PHP_INT_SIZE == 4) {
262*1b3f573fSAndroid Build Coastguard Worker                $this->assertSame('0', $arr[$i]);
263*1b3f573fSAndroid Build Coastguard Worker            } else {
264*1b3f573fSAndroid Build Coastguard Worker                $this->assertSame(0, $arr[$i]);
265*1b3f573fSAndroid Build Coastguard Worker            }
266*1b3f573fSAndroid Build Coastguard Worker        }
267*1b3f573fSAndroid Build Coastguard Worker
268*1b3f573fSAndroid Build Coastguard Worker        // Test set.
269*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = MAX_UINT64;
270*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = 1.1;
271*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = '2';
272*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = '3.1';
273*1b3f573fSAndroid Build Coastguard Worker        $arr[4] = MAX_UINT64_STRING;
274*1b3f573fSAndroid Build Coastguard Worker
275*1b3f573fSAndroid Build Coastguard Worker        if (PHP_INT_SIZE == 4) {
276*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64_STRING, $arr[0]);
277*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('1', $arr[1]);
278*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('2', $arr[2]);
279*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('3', $arr[3]);
280*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64_STRING, $arr[4]);
281*1b3f573fSAndroid Build Coastguard Worker        } else {
282*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64, $arr[0]);
283*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(1, $arr[1]);
284*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(2, $arr[2]);
285*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(3, $arr[3]);
286*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(MAX_UINT64, $arr[4]);
287*1b3f573fSAndroid Build Coastguard Worker        }
288*1b3f573fSAndroid Build Coastguard Worker    }
289*1b3f573fSAndroid Build Coastguard Worker
290*1b3f573fSAndroid Build Coastguard Worker    #########################################################
291*1b3f573fSAndroid Build Coastguard Worker    # Test float field.
292*1b3f573fSAndroid Build Coastguard Worker    #########################################################
293*1b3f573fSAndroid Build Coastguard Worker
294*1b3f573fSAndroid Build Coastguard Worker    public function testFloat()
295*1b3f573fSAndroid Build Coastguard Worker    {
296*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::FLOAT);
297*1b3f573fSAndroid Build Coastguard Worker
298*1b3f573fSAndroid Build Coastguard Worker        // Test append.
299*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1;
300*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
301*1b3f573fSAndroid Build Coastguard Worker
302*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
303*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
304*1b3f573fSAndroid Build Coastguard Worker
305*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '2';
306*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
307*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '3.1';
308*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
309*1b3f573fSAndroid Build Coastguard Worker
310*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(4, count($arr));
311*1b3f573fSAndroid Build Coastguard Worker
312*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
313*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = 0;
314*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(0.0, $arr[$i]);
315*1b3f573fSAndroid Build Coastguard Worker        }
316*1b3f573fSAndroid Build Coastguard Worker
317*1b3f573fSAndroid Build Coastguard Worker        // Test set.
318*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = 1;
319*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
320*1b3f573fSAndroid Build Coastguard Worker
321*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = 1.1;
322*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
323*1b3f573fSAndroid Build Coastguard Worker
324*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = '2';
325*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
326*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = '3.1';
327*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
328*1b3f573fSAndroid Build Coastguard Worker    }
329*1b3f573fSAndroid Build Coastguard Worker
330*1b3f573fSAndroid Build Coastguard Worker    #########################################################
331*1b3f573fSAndroid Build Coastguard Worker    # Test double field.
332*1b3f573fSAndroid Build Coastguard Worker    #########################################################
333*1b3f573fSAndroid Build Coastguard Worker
334*1b3f573fSAndroid Build Coastguard Worker    public function testDouble()
335*1b3f573fSAndroid Build Coastguard Worker    {
336*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::DOUBLE);
337*1b3f573fSAndroid Build Coastguard Worker
338*1b3f573fSAndroid Build Coastguard Worker        // Test append.
339*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1;
340*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
341*1b3f573fSAndroid Build Coastguard Worker
342*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
343*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
344*1b3f573fSAndroid Build Coastguard Worker
345*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '2';
346*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
347*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '3.1';
348*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
349*1b3f573fSAndroid Build Coastguard Worker
350*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(4, count($arr));
351*1b3f573fSAndroid Build Coastguard Worker
352*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
353*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = 0;
354*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(0.0, $arr[$i]);
355*1b3f573fSAndroid Build Coastguard Worker        }
356*1b3f573fSAndroid Build Coastguard Worker
357*1b3f573fSAndroid Build Coastguard Worker        // Test set.
358*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = 1;
359*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
360*1b3f573fSAndroid Build Coastguard Worker
361*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = 1.1;
362*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
363*1b3f573fSAndroid Build Coastguard Worker
364*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = '2';
365*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
366*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = '3.1';
367*1b3f573fSAndroid Build Coastguard Worker        $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
368*1b3f573fSAndroid Build Coastguard Worker    }
369*1b3f573fSAndroid Build Coastguard Worker
370*1b3f573fSAndroid Build Coastguard Worker    #########################################################
371*1b3f573fSAndroid Build Coastguard Worker    # Test bool field.
372*1b3f573fSAndroid Build Coastguard Worker    #########################################################
373*1b3f573fSAndroid Build Coastguard Worker
374*1b3f573fSAndroid Build Coastguard Worker    public function testBool()
375*1b3f573fSAndroid Build Coastguard Worker    {
376*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::BOOL);
377*1b3f573fSAndroid Build Coastguard Worker
378*1b3f573fSAndroid Build Coastguard Worker        // Test append.
379*1b3f573fSAndroid Build Coastguard Worker        $arr[] = true;
380*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(true, $arr[0]);
381*1b3f573fSAndroid Build Coastguard Worker
382*1b3f573fSAndroid Build Coastguard Worker        $arr[] = -1;
383*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(true, $arr[1]);
384*1b3f573fSAndroid Build Coastguard Worker
385*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
386*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(true, $arr[2]);
387*1b3f573fSAndroid Build Coastguard Worker
388*1b3f573fSAndroid Build Coastguard Worker        $arr[] = '';
389*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(false, $arr[3]);
390*1b3f573fSAndroid Build Coastguard Worker
391*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(4, count($arr));
392*1b3f573fSAndroid Build Coastguard Worker
393*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
394*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = 0;
395*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame(false, $arr[$i]);
396*1b3f573fSAndroid Build Coastguard Worker        }
397*1b3f573fSAndroid Build Coastguard Worker
398*1b3f573fSAndroid Build Coastguard Worker        // Test set.
399*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = true;
400*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(true, $arr[0]);
401*1b3f573fSAndroid Build Coastguard Worker
402*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = -1;
403*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(true, $arr[1]);
404*1b3f573fSAndroid Build Coastguard Worker
405*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = 1.1;
406*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(true, $arr[2]);
407*1b3f573fSAndroid Build Coastguard Worker
408*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = '';
409*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(false, $arr[3]);
410*1b3f573fSAndroid Build Coastguard Worker    }
411*1b3f573fSAndroid Build Coastguard Worker
412*1b3f573fSAndroid Build Coastguard Worker    #########################################################
413*1b3f573fSAndroid Build Coastguard Worker    # Test string field.
414*1b3f573fSAndroid Build Coastguard Worker    #########################################################
415*1b3f573fSAndroid Build Coastguard Worker
416*1b3f573fSAndroid Build Coastguard Worker    public function testString()
417*1b3f573fSAndroid Build Coastguard Worker    {
418*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::STRING);
419*1b3f573fSAndroid Build Coastguard Worker
420*1b3f573fSAndroid Build Coastguard Worker        // Test append.
421*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 'abc';
422*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('abc', $arr[0]);
423*1b3f573fSAndroid Build Coastguard Worker
424*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1;
425*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('1', $arr[1]);
426*1b3f573fSAndroid Build Coastguard Worker
427*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1.1;
428*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('1.1', $arr[2]);
429*1b3f573fSAndroid Build Coastguard Worker
430*1b3f573fSAndroid Build Coastguard Worker        $arr[] = true;
431*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('1', $arr[3]);
432*1b3f573fSAndroid Build Coastguard Worker
433*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(4, count($arr));
434*1b3f573fSAndroid Build Coastguard Worker
435*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < count($arr); $i++) {
436*1b3f573fSAndroid Build Coastguard Worker            $arr[$i] = '';
437*1b3f573fSAndroid Build Coastguard Worker            $this->assertSame('', $arr[$i]);
438*1b3f573fSAndroid Build Coastguard Worker        }
439*1b3f573fSAndroid Build Coastguard Worker
440*1b3f573fSAndroid Build Coastguard Worker        // Test set.
441*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = 'abc';
442*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('abc', $arr[0]);
443*1b3f573fSAndroid Build Coastguard Worker
444*1b3f573fSAndroid Build Coastguard Worker        $arr[1] = 1;
445*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('1', $arr[1]);
446*1b3f573fSAndroid Build Coastguard Worker
447*1b3f573fSAndroid Build Coastguard Worker        $arr[2] = 1.1;
448*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('1.1', $arr[2]);
449*1b3f573fSAndroid Build Coastguard Worker
450*1b3f573fSAndroid Build Coastguard Worker        $arr[3] = true;
451*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('1', $arr[3]);
452*1b3f573fSAndroid Build Coastguard Worker    }
453*1b3f573fSAndroid Build Coastguard Worker
454*1b3f573fSAndroid Build Coastguard Worker    #########################################################
455*1b3f573fSAndroid Build Coastguard Worker    # Test message field.
456*1b3f573fSAndroid Build Coastguard Worker    #########################################################
457*1b3f573fSAndroid Build Coastguard Worker
458*1b3f573fSAndroid Build Coastguard Worker    public function testMessage()
459*1b3f573fSAndroid Build Coastguard Worker    {
460*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::MESSAGE, Sub::class);
461*1b3f573fSAndroid Build Coastguard Worker
462*1b3f573fSAndroid Build Coastguard Worker        // Test append.
463*1b3f573fSAndroid Build Coastguard Worker        $sub_m = new Sub();
464*1b3f573fSAndroid Build Coastguard Worker        $sub_m->setA(1);
465*1b3f573fSAndroid Build Coastguard Worker        $arr[] = $sub_m;
466*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[0]->getA());
467*1b3f573fSAndroid Build Coastguard Worker
468*1b3f573fSAndroid Build Coastguard Worker        $this->assertEquals(1, count($arr));
469*1b3f573fSAndroid Build Coastguard Worker
470*1b3f573fSAndroid Build Coastguard Worker        // Test set.
471*1b3f573fSAndroid Build Coastguard Worker        $sub_m = new Sub();
472*1b3f573fSAndroid Build Coastguard Worker        $sub_m->setA(2);
473*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = $sub_m;
474*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $arr[0]->getA());
475*1b3f573fSAndroid Build Coastguard Worker
476*1b3f573fSAndroid Build Coastguard Worker        // Test foreach.
477*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::MESSAGE, Sub::class);
478*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < 3; $i++) {
479*1b3f573fSAndroid Build Coastguard Worker          $arr[] = new Sub();
480*1b3f573fSAndroid Build Coastguard Worker          $arr[$i]->setA($i);
481*1b3f573fSAndroid Build Coastguard Worker        }
482*1b3f573fSAndroid Build Coastguard Worker        $i = 0;
483*1b3f573fSAndroid Build Coastguard Worker        foreach ($arr as $val) {
484*1b3f573fSAndroid Build Coastguard Worker          $this->assertSame($i++, $val->getA());
485*1b3f573fSAndroid Build Coastguard Worker        }
486*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $i);
487*1b3f573fSAndroid Build Coastguard Worker    }
488*1b3f573fSAndroid Build Coastguard Worker
489*1b3f573fSAndroid Build Coastguard Worker    #########################################################
490*1b3f573fSAndroid Build Coastguard Worker    # Test offset type
491*1b3f573fSAndroid Build Coastguard Worker    #########################################################
492*1b3f573fSAndroid Build Coastguard Worker
493*1b3f573fSAndroid Build Coastguard Worker    public function testOffset()
494*1b3f573fSAndroid Build Coastguard Worker    {
495*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::INT32);
496*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 0;
497*1b3f573fSAndroid Build Coastguard Worker
498*1b3f573fSAndroid Build Coastguard Worker        $arr[0] = 1;
499*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[0]);
500*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, count($arr));
501*1b3f573fSAndroid Build Coastguard Worker
502*1b3f573fSAndroid Build Coastguard Worker        $arr['0'] = 2;
503*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $arr['0']);
504*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $arr[0]);
505*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, count($arr));
506*1b3f573fSAndroid Build Coastguard Worker
507*1b3f573fSAndroid Build Coastguard Worker        $arr[0.0] = 3;
508*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $arr[0.0]);
509*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, count($arr));
510*1b3f573fSAndroid Build Coastguard Worker    }
511*1b3f573fSAndroid Build Coastguard Worker
512*1b3f573fSAndroid Build Coastguard Worker    public function testInsertRemoval()
513*1b3f573fSAndroid Build Coastguard Worker    {
514*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::INT32);
515*1b3f573fSAndroid Build Coastguard Worker
516*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 0;
517*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1;
518*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 2;
519*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, count($arr));
520*1b3f573fSAndroid Build Coastguard Worker
521*1b3f573fSAndroid Build Coastguard Worker        unset($arr[2]);
522*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, count($arr));
523*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(0, $arr[0]);
524*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[1]);
525*1b3f573fSAndroid Build Coastguard Worker
526*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 3;
527*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, count($arr));
528*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(0, $arr[0]);
529*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $arr[1]);
530*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(3, $arr[2]);
531*1b3f573fSAndroid Build Coastguard Worker    }
532*1b3f573fSAndroid Build Coastguard Worker
533*1b3f573fSAndroid Build Coastguard Worker    #########################################################
534*1b3f573fSAndroid Build Coastguard Worker    # Test reference in array
535*1b3f573fSAndroid Build Coastguard Worker    #########################################################
536*1b3f573fSAndroid Build Coastguard Worker
537*1b3f573fSAndroid Build Coastguard Worker    public function testArrayElementIsReferenceInSetters()
538*1b3f573fSAndroid Build Coastguard Worker    {
539*1b3f573fSAndroid Build Coastguard Worker        // Bool elements
540*1b3f573fSAndroid Build Coastguard Worker        $values = [true];
541*1b3f573fSAndroid Build Coastguard Worker        array_walk($values, function (&$value) {});
542*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
543*1b3f573fSAndroid Build Coastguard Worker        $m->setRepeatedBool($values);
544*1b3f573fSAndroid Build Coastguard Worker
545*1b3f573fSAndroid Build Coastguard Worker        // Int32 elements
546*1b3f573fSAndroid Build Coastguard Worker        $values = [1];
547*1b3f573fSAndroid Build Coastguard Worker        array_walk($values, function (&$value) {});
548*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
549*1b3f573fSAndroid Build Coastguard Worker        $m->setRepeatedInt32($values);
550*1b3f573fSAndroid Build Coastguard Worker
551*1b3f573fSAndroid Build Coastguard Worker        // Double elements
552*1b3f573fSAndroid Build Coastguard Worker        $values = [1.0];
553*1b3f573fSAndroid Build Coastguard Worker        array_walk($values, function (&$value) {});
554*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
555*1b3f573fSAndroid Build Coastguard Worker        $m->setRepeatedDouble($values);
556*1b3f573fSAndroid Build Coastguard Worker
557*1b3f573fSAndroid Build Coastguard Worker        // String elements
558*1b3f573fSAndroid Build Coastguard Worker        $values = ['a'];
559*1b3f573fSAndroid Build Coastguard Worker        array_walk($values, function (&$value) {});
560*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
561*1b3f573fSAndroid Build Coastguard Worker        $m->setRepeatedString($values);
562*1b3f573fSAndroid Build Coastguard Worker
563*1b3f573fSAndroid Build Coastguard Worker        // Message elements
564*1b3f573fSAndroid Build Coastguard Worker        $m = new TestMessage();
565*1b3f573fSAndroid Build Coastguard Worker        $subs = [1, 2];
566*1b3f573fSAndroid Build Coastguard Worker        foreach ($subs as &$sub) {
567*1b3f573fSAndroid Build Coastguard Worker            $sub = new Sub(['a' => $sub]);
568*1b3f573fSAndroid Build Coastguard Worker        }
569*1b3f573fSAndroid Build Coastguard Worker        $m->setRepeatedMessage($subs);
570*1b3f573fSAndroid Build Coastguard Worker
571*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue(true);
572*1b3f573fSAndroid Build Coastguard Worker    }
573*1b3f573fSAndroid Build Coastguard Worker
574*1b3f573fSAndroid Build Coastguard Worker    #########################################################
575*1b3f573fSAndroid Build Coastguard Worker    # Test memory leak
576*1b3f573fSAndroid Build Coastguard Worker    #########################################################
577*1b3f573fSAndroid Build Coastguard Worker
578*1b3f573fSAndroid Build Coastguard Worker    public function testCycleLeak()
579*1b3f573fSAndroid Build Coastguard Worker    {
580*1b3f573fSAndroid Build Coastguard Worker        if (getenv("USE_ZEND_ALLOC") === "0") {
581*1b3f573fSAndroid Build Coastguard Worker            // If we are disabling Zend's internal allocator (as we do for
582*1b3f573fSAndroid Build Coastguard Worker            // Valgrind tests, for example) then memory_get_usage() will not
583*1b3f573fSAndroid Build Coastguard Worker            // return a useful value.
584*1b3f573fSAndroid Build Coastguard Worker            $this->markTestSkipped();
585*1b3f573fSAndroid Build Coastguard Worker            return;
586*1b3f573fSAndroid Build Coastguard Worker        }
587*1b3f573fSAndroid Build Coastguard Worker
588*1b3f573fSAndroid Build Coastguard Worker        gc_collect_cycles();
589*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
590*1b3f573fSAndroid Build Coastguard Worker        $arr[] = new TestMessage;
591*1b3f573fSAndroid Build Coastguard Worker        $arr[0]->SetRepeatedRecursive($arr);
592*1b3f573fSAndroid Build Coastguard Worker
593*1b3f573fSAndroid Build Coastguard Worker        // Clean up memory before test.
594*1b3f573fSAndroid Build Coastguard Worker        gc_collect_cycles();
595*1b3f573fSAndroid Build Coastguard Worker        $start = memory_get_usage();
596*1b3f573fSAndroid Build Coastguard Worker        unset($arr);
597*1b3f573fSAndroid Build Coastguard Worker
598*1b3f573fSAndroid Build Coastguard Worker        // Explicitly trigger garbage collection.
599*1b3f573fSAndroid Build Coastguard Worker        gc_collect_cycles();
600*1b3f573fSAndroid Build Coastguard Worker
601*1b3f573fSAndroid Build Coastguard Worker        $end = memory_get_usage();
602*1b3f573fSAndroid Build Coastguard Worker        $this->assertLessThan($start, $end);
603*1b3f573fSAndroid Build Coastguard Worker    }
604*1b3f573fSAndroid Build Coastguard Worker
605*1b3f573fSAndroid Build Coastguard Worker    #########################################################
606*1b3f573fSAndroid Build Coastguard Worker    # Test incorrect types
607*1b3f573fSAndroid Build Coastguard Worker    #########################################################
608*1b3f573fSAndroid Build Coastguard Worker
609*1b3f573fSAndroid Build Coastguard Worker    public function testAppendNull()
610*1b3f573fSAndroid Build Coastguard Worker    {
611*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(TypeError::class);
612*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
613*1b3f573fSAndroid Build Coastguard Worker        $arr[] = null;
614*1b3f573fSAndroid Build Coastguard Worker    }
615*1b3f573fSAndroid Build Coastguard Worker
616*1b3f573fSAndroid Build Coastguard Worker    #########################################################
617*1b3f573fSAndroid Build Coastguard Worker    # Test equality
618*1b3f573fSAndroid Build Coastguard Worker    #########################################################
619*1b3f573fSAndroid Build Coastguard Worker
620*1b3f573fSAndroid Build Coastguard Worker    public function testEquality()
621*1b3f573fSAndroid Build Coastguard Worker    {
622*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::INT32);
623*1b3f573fSAndroid Build Coastguard Worker        $arr2 = new RepeatedField(GPBType::INT32);
624*1b3f573fSAndroid Build Coastguard Worker
625*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue($arr == $arr2);
626*1b3f573fSAndroid Build Coastguard Worker
627*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 0;
628*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 1;
629*1b3f573fSAndroid Build Coastguard Worker        $arr[] = 2;
630*1b3f573fSAndroid Build Coastguard Worker
631*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($arr == $arr2);
632*1b3f573fSAndroid Build Coastguard Worker
633*1b3f573fSAndroid Build Coastguard Worker        $arr2[] = 0;
634*1b3f573fSAndroid Build Coastguard Worker        $arr2[] = 1;
635*1b3f573fSAndroid Build Coastguard Worker        $arr2[] = 2;
636*1b3f573fSAndroid Build Coastguard Worker
637*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue($arr == $arr2);
638*1b3f573fSAndroid Build Coastguard Worker
639*1b3f573fSAndroid Build Coastguard Worker        // Arrays of different types always compare false.
640*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse(new RepeatedField(GPBType::INT32) ==
641*1b3f573fSAndroid Build Coastguard Worker                           new RepeatedField(GPBType::INT64));
642*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse(
643*1b3f573fSAndroid Build Coastguard Worker            new RepeatedField(GPBType::MESSAGE, TestMessage::class) ==
644*1b3f573fSAndroid Build Coastguard Worker            new RepeatedField(GPBType::MESSAGE, Sub::class));
645*1b3f573fSAndroid Build Coastguard Worker    }
646*1b3f573fSAndroid Build Coastguard Worker
647*1b3f573fSAndroid Build Coastguard Worker    #########################################################
648*1b3f573fSAndroid Build Coastguard Worker    # Test clone
649*1b3f573fSAndroid Build Coastguard Worker    #########################################################
650*1b3f573fSAndroid Build Coastguard Worker
651*1b3f573fSAndroid Build Coastguard Worker    public function testClone()
652*1b3f573fSAndroid Build Coastguard Worker    {
653*1b3f573fSAndroid Build Coastguard Worker        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
654*1b3f573fSAndroid Build Coastguard Worker        $arr[] = new TestMessage;
655*1b3f573fSAndroid Build Coastguard Worker        $arr2 = clone $arr;
656*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame($arr[0], $arr2[0]);
657*1b3f573fSAndroid Build Coastguard Worker    }
658*1b3f573fSAndroid Build Coastguard Worker}
659