blob: 0585ca5b1c8f5ba8eb1e6ff984665b7e158adeee [file] [log] [blame]
Paul Yange0e54662016-09-15 11:09:01 -07001<?php
2
Paul Yang823f3512020-12-04 13:46:34 -08003require_once('test_base.php');
Paul Yange0e54662016-09-15 11:09:01 -07004require_once('test_util.php');
5
6use Google\Protobuf\Internal\RepeatedField;
7use Google\Protobuf\Internal\GPBType;
8use Foo\TestMessage;
Brent Shaffer67379542018-05-23 16:43:30 -07009use Foo\TestMessage\Sub;
Paul Yange0e54662016-09-15 11:09:01 -070010
Paul Yang823f3512020-12-04 13:46:34 -080011class ArrayTest extends TestBase
Paul Yange0e54662016-09-15 11:09:01 -070012{
13
14 #########################################################
15 # Test int32 field.
16 #########################################################
17
18 public function testInt32()
19 {
20 $arr = new RepeatedField(GPBType::INT32);
21
22 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -070023 $arr[] = MAX_INT32;
Paul Yange0e54662016-09-15 11:09:01 -070024 $this->assertSame(MAX_INT32, $arr[0]);
Paul Yangecca6ea2017-06-30 12:14:09 -070025 $arr[] = MIN_INT32;
Paul Yange0e54662016-09-15 11:09:01 -070026 $this->assertSame(MIN_INT32, $arr[1]);
27
Paul Yangecca6ea2017-06-30 12:14:09 -070028 $arr[] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -070029 $this->assertSame(1, $arr[2]);
Paul Yangecca6ea2017-06-30 12:14:09 -070030 $arr[] = MAX_INT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -070031 $this->assertSame(MAX_INT32, $arr[3]);
Paul Yangecca6ea2017-06-30 12:14:09 -070032 $arr[] = MAX_INT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -070033 $this->assertSame(MAX_INT32, $arr[4]);
34
Paul Yangecca6ea2017-06-30 12:14:09 -070035 $arr[] = '2';
Paul Yange0e54662016-09-15 11:09:01 -070036 $this->assertSame(2, $arr[5]);
Paul Yangecca6ea2017-06-30 12:14:09 -070037 $arr[] = '3.1';
Paul Yange0e54662016-09-15 11:09:01 -070038 $this->assertSame(3, $arr[6]);
Paul Yangecca6ea2017-06-30 12:14:09 -070039 $arr[] = MAX_INT32_STRING;
Paul Yange0e54662016-09-15 11:09:01 -070040 $this->assertSame(MAX_INT32, $arr[7]);
41
42 $this->assertEquals(8, count($arr));
43
44 for ($i = 0; $i < count($arr); $i++) {
45 $arr[$i] = 0;
46 $this->assertSame(0, $arr[$i]);
47 }
48
49 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -070050 $arr[0] = MAX_INT32;
Paul Yange0e54662016-09-15 11:09:01 -070051 $this->assertSame(MAX_INT32, $arr[0]);
Paul Yangecca6ea2017-06-30 12:14:09 -070052 $arr[1] = MIN_INT32;
Paul Yange0e54662016-09-15 11:09:01 -070053 $this->assertSame(MIN_INT32, $arr[1]);
54
Paul Yangecca6ea2017-06-30 12:14:09 -070055 $arr[2] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -070056 $this->assertSame(1, $arr[2]);
Paul Yangecca6ea2017-06-30 12:14:09 -070057 $arr[3] = MAX_INT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -070058 $this->assertSame(MAX_INT32, $arr[3]);
Paul Yangecca6ea2017-06-30 12:14:09 -070059 $arr[4] = MAX_INT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -070060 $this->assertSame(MAX_INT32, $arr[4]);
61
Paul Yangecca6ea2017-06-30 12:14:09 -070062 $arr[5] = '2';
Paul Yange0e54662016-09-15 11:09:01 -070063 $this->assertSame(2, $arr[5]);
Paul Yangecca6ea2017-06-30 12:14:09 -070064 $arr[6] = '3.1';
Paul Yange0e54662016-09-15 11:09:01 -070065 $this->assertSame(3, $arr[6]);
Paul Yangecca6ea2017-06-30 12:14:09 -070066 $arr[7] = MAX_INT32_STRING;
Paul Yange0e54662016-09-15 11:09:01 -070067 $this->assertSame(MAX_INT32, $arr[7]);
Paul Yang1f2dbc82016-11-08 11:38:34 -080068
69 // Test foreach.
70 $arr = new RepeatedField(GPBType::INT32);
71 for ($i = 0; $i < 3; $i++) {
Paul Yangecca6ea2017-06-30 12:14:09 -070072 $arr[] = $i;
Paul Yang1f2dbc82016-11-08 11:38:34 -080073 }
74 $i = 0;
75 foreach ($arr as $val) {
76 $this->assertSame($i++, $val);
77 }
78 $this->assertSame(3, $i);
Paul Yange0e54662016-09-15 11:09:01 -070079 }
80
Paul Yange0e54662016-09-15 11:09:01 -070081 #########################################################
82 # Test uint32 field.
83 #########################################################
84
85 public function testUint32()
86 {
87 $arr = new RepeatedField(GPBType::UINT32);
88
89 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -070090 $arr[] = MAX_UINT32;
Paul Yange0e54662016-09-15 11:09:01 -070091 $this->assertSame(-1, $arr[0]);
Paul Yangecca6ea2017-06-30 12:14:09 -070092 $arr[] = -1;
Paul Yange0e54662016-09-15 11:09:01 -070093 $this->assertSame(-1, $arr[1]);
Paul Yangecca6ea2017-06-30 12:14:09 -070094 $arr[] = MIN_UINT32;
Paul Yange0e54662016-09-15 11:09:01 -070095 $this->assertSame(MIN_UINT32, $arr[2]);
96
Paul Yangecca6ea2017-06-30 12:14:09 -070097 $arr[] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -070098 $this->assertSame(1, $arr[3]);
Paul Yangecca6ea2017-06-30 12:14:09 -070099 $arr[] = MAX_UINT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -0700100 $this->assertSame(-1, $arr[4]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700101 $arr[] = -1.0;
Paul Yange0e54662016-09-15 11:09:01 -0700102 $this->assertSame(-1, $arr[5]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700103 $arr[] = MIN_UINT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -0700104 $this->assertSame(MIN_UINT32, $arr[6]);
105
Paul Yangecca6ea2017-06-30 12:14:09 -0700106 $arr[] = '2';
Paul Yange0e54662016-09-15 11:09:01 -0700107 $this->assertSame(2, $arr[7]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700108 $arr[] = '3.1';
Paul Yange0e54662016-09-15 11:09:01 -0700109 $this->assertSame(3, $arr[8]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700110 $arr[] = MAX_UINT32_STRING;
Paul Yange0e54662016-09-15 11:09:01 -0700111 $this->assertSame(-1, $arr[9]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700112 $arr[] = '-1.0';
Paul Yange0e54662016-09-15 11:09:01 -0700113 $this->assertSame(-1, $arr[10]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700114 $arr[] = MIN_UINT32_STRING;
Paul Yange0e54662016-09-15 11:09:01 -0700115 $this->assertSame(MIN_UINT32, $arr[11]);
116
117 $this->assertEquals(12, count($arr));
118
119 for ($i = 0; $i < count($arr); $i++) {
120 $arr[$i] = 0;
121 $this->assertSame(0, $arr[$i]);
122 }
123
124 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -0700125 $arr[0] = MAX_UINT32;
Paul Yange0e54662016-09-15 11:09:01 -0700126 $this->assertSame(-1, $arr[0]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700127 $arr[1] = -1;
Paul Yange0e54662016-09-15 11:09:01 -0700128 $this->assertSame(-1, $arr[1]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700129 $arr[2] = MIN_UINT32;
Paul Yange0e54662016-09-15 11:09:01 -0700130 $this->assertSame(MIN_UINT32, $arr[2]);
131
Paul Yangecca6ea2017-06-30 12:14:09 -0700132 $arr[3] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -0700133 $this->assertSame(1, $arr[3]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700134 $arr[4] = MAX_UINT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -0700135 $this->assertSame(-1, $arr[4]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700136 $arr[5] = -1.0;
Paul Yange0e54662016-09-15 11:09:01 -0700137 $this->assertSame(-1, $arr[5]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700138 $arr[6] = MIN_UINT32_FLOAT;
Paul Yange0e54662016-09-15 11:09:01 -0700139 $this->assertSame(MIN_UINT32, $arr[6]);
140
Paul Yangecca6ea2017-06-30 12:14:09 -0700141 $arr[7] = '2';
Paul Yange0e54662016-09-15 11:09:01 -0700142 $this->assertSame(2, $arr[7]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700143 $arr[8] = '3.1';
Paul Yange0e54662016-09-15 11:09:01 -0700144 $this->assertSame(3, $arr[8]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700145 $arr[9] = MAX_UINT32_STRING;
Paul Yange0e54662016-09-15 11:09:01 -0700146 $this->assertSame(-1, $arr[9]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700147 $arr[10] = '-1.0';
Paul Yange0e54662016-09-15 11:09:01 -0700148 $this->assertSame(-1, $arr[10]);
Paul Yangecca6ea2017-06-30 12:14:09 -0700149 $arr[11] = MIN_UINT32_STRING;
Paul Yange0e54662016-09-15 11:09:01 -0700150 $this->assertSame(MIN_UINT32, $arr[11]);
151 }
152
Paul Yange0e54662016-09-15 11:09:01 -0700153 #########################################################
154 # Test int64 field.
155 #########################################################
156
157 public function testInt64()
158 {
159 $arr = new RepeatedField(GPBType::INT64);
160
161 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -0700162 $arr[] = MAX_INT64;
163 $arr[] = MIN_INT64;
164 $arr[] = 1.1;
165 $arr[] = '2';
166 $arr[] = '3.1';
167 $arr[] = MAX_INT64_STRING;
168 $arr[] = MIN_INT64_STRING;
Paul Yang51c5ff82016-10-25 17:27:05 -0700169 if (PHP_INT_SIZE == 4) {
170 $this->assertSame(MAX_INT64, $arr[0]);
171 $this->assertSame(MIN_INT64, $arr[1]);
172 $this->assertSame('1', $arr[2]);
173 $this->assertSame('2', $arr[3]);
174 $this->assertSame('3', $arr[4]);
175 $this->assertSame(MAX_INT64_STRING, $arr[5]);
176 $this->assertSame(MIN_INT64_STRING, $arr[6]);
177 } else {
178 $this->assertSame(MAX_INT64, $arr[0]);
179 $this->assertSame(MIN_INT64, $arr[1]);
180 $this->assertSame(1, $arr[2]);
181 $this->assertSame(2, $arr[3]);
182 $this->assertSame(3, $arr[4]);
183 $this->assertSame(MAX_INT64, $arr[5]);
184 $this->assertSame(MIN_INT64, $arr[6]);
185 }
186
Paul Yange0e54662016-09-15 11:09:01 -0700187
188 $this->assertEquals(7, count($arr));
189
190 for ($i = 0; $i < count($arr); $i++) {
191 $arr[$i] = 0;
Paul Yang51c5ff82016-10-25 17:27:05 -0700192 if (PHP_INT_SIZE == 4) {
193 $this->assertSame('0', $arr[$i]);
194 } else {
195 $this->assertSame(0, $arr[$i]);
196 }
Paul Yange0e54662016-09-15 11:09:01 -0700197 }
198
199 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -0700200 $arr[0] = MAX_INT64;
201 $arr[1] = MIN_INT64;
202 $arr[2] = 1.1;
203 $arr[3] = '2';
204 $arr[4] = '3.1';
205 $arr[5] = MAX_INT64_STRING;
206 $arr[6] = MIN_INT64_STRING;
Paul Yang51c5ff82016-10-25 17:27:05 -0700207
208 if (PHP_INT_SIZE == 4) {
209 $this->assertSame(MAX_INT64_STRING, $arr[0]);
210 $this->assertSame(MIN_INT64_STRING, $arr[1]);
211 $this->assertSame('1', $arr[2]);
212 $this->assertSame('2', $arr[3]);
213 $this->assertSame('3', $arr[4]);
214 $this->assertSame(MAX_INT64_STRING, $arr[5]);
215 $this->assertEquals(MIN_INT64_STRING, $arr[6]);
216 } else {
217 $this->assertSame(MAX_INT64, $arr[0]);
218 $this->assertSame(MIN_INT64, $arr[1]);
219 $this->assertSame(1, $arr[2]);
220 $this->assertSame(2, $arr[3]);
221 $this->assertSame(3, $arr[4]);
222 $this->assertSame(MAX_INT64, $arr[5]);
223 $this->assertEquals(MIN_INT64, $arr[6]);
224 }
Paul Yange0e54662016-09-15 11:09:01 -0700225 }
226
Paul Yange0e54662016-09-15 11:09:01 -0700227 #########################################################
228 # Test uint64 field.
229 #########################################################
230
231 public function testUint64()
232 {
233 $arr = new RepeatedField(GPBType::UINT64);
234
235 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -0700236 $arr[] = MAX_UINT64;
237 $arr[] = 1.1;
238 $arr[] = '2';
239 $arr[] = '3.1';
240 $arr[] = MAX_UINT64_STRING;
Paul Yange0e54662016-09-15 11:09:01 -0700241
Paul Yang51c5ff82016-10-25 17:27:05 -0700242 if (PHP_INT_SIZE == 4) {
243 $this->assertSame(MAX_UINT64_STRING, $arr[0]);
244 $this->assertSame('1', $arr[1]);
245 $this->assertSame('2', $arr[2]);
246 $this->assertSame('3', $arr[3]);
247 $this->assertSame(MAX_UINT64_STRING, $arr[4]);
248 } else {
249 $this->assertSame(MAX_UINT64, $arr[0]);
250 $this->assertSame(1, $arr[1]);
251 $this->assertSame(2, $arr[2]);
252 $this->assertSame(3, $arr[3]);
253 $this->assertSame(MAX_UINT64, $arr[4]);
254 $this->assertSame(5, count($arr));
255 }
256
257 $this->assertSame(5, count($arr));
Paul Yange0e54662016-09-15 11:09:01 -0700258
259 for ($i = 0; $i < count($arr); $i++) {
260 $arr[$i] = 0;
Paul Yang51c5ff82016-10-25 17:27:05 -0700261 if (PHP_INT_SIZE == 4) {
262 $this->assertSame('0', $arr[$i]);
263 } else {
264 $this->assertSame(0, $arr[$i]);
265 }
Paul Yange0e54662016-09-15 11:09:01 -0700266 }
267
268 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -0700269 $arr[0] = MAX_UINT64;
270 $arr[1] = 1.1;
271 $arr[2] = '2';
272 $arr[3] = '3.1';
273 $arr[4] = MAX_UINT64_STRING;
Paul Yang51c5ff82016-10-25 17:27:05 -0700274
275 if (PHP_INT_SIZE == 4) {
276 $this->assertSame(MAX_UINT64_STRING, $arr[0]);
277 $this->assertSame('1', $arr[1]);
278 $this->assertSame('2', $arr[2]);
279 $this->assertSame('3', $arr[3]);
280 $this->assertSame(MAX_UINT64_STRING, $arr[4]);
281 } else {
282 $this->assertSame(MAX_UINT64, $arr[0]);
283 $this->assertSame(1, $arr[1]);
284 $this->assertSame(2, $arr[2]);
285 $this->assertSame(3, $arr[3]);
286 $this->assertSame(MAX_UINT64, $arr[4]);
287 }
Paul Yange0e54662016-09-15 11:09:01 -0700288 }
289
Paul Yange0e54662016-09-15 11:09:01 -0700290 #########################################################
291 # Test float field.
292 #########################################################
293
294 public function testFloat()
295 {
296 $arr = new RepeatedField(GPBType::FLOAT);
297
298 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -0700299 $arr[] = 1;
Paul Yang823f3512020-12-04 13:46:34 -0800300 $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700301
Paul Yangecca6ea2017-06-30 12:14:09 -0700302 $arr[] = 1.1;
Paul Yang823f3512020-12-04 13:46:34 -0800303 $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700304
Paul Yangecca6ea2017-06-30 12:14:09 -0700305 $arr[] = '2';
Paul Yang823f3512020-12-04 13:46:34 -0800306 $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
Paul Yangecca6ea2017-06-30 12:14:09 -0700307 $arr[] = '3.1';
Paul Yang823f3512020-12-04 13:46:34 -0800308 $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700309
310 $this->assertEquals(4, count($arr));
311
312 for ($i = 0; $i < count($arr); $i++) {
313 $arr[$i] = 0;
314 $this->assertSame(0.0, $arr[$i]);
315 }
316
317 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -0700318 $arr[0] = 1;
Paul Yang823f3512020-12-04 13:46:34 -0800319 $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700320
Paul Yangecca6ea2017-06-30 12:14:09 -0700321 $arr[1] = 1.1;
Paul Yang823f3512020-12-04 13:46:34 -0800322 $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700323
Paul Yangecca6ea2017-06-30 12:14:09 -0700324 $arr[2] = '2';
Paul Yang823f3512020-12-04 13:46:34 -0800325 $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
Paul Yangecca6ea2017-06-30 12:14:09 -0700326 $arr[3] = '3.1';
Paul Yang823f3512020-12-04 13:46:34 -0800327 $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700328 }
329
Paul Yange0e54662016-09-15 11:09:01 -0700330 #########################################################
331 # Test double field.
332 #########################################################
333
334 public function testDouble()
335 {
336 $arr = new RepeatedField(GPBType::DOUBLE);
337
338 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -0700339 $arr[] = 1;
Paul Yang823f3512020-12-04 13:46:34 -0800340 $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700341
Paul Yangecca6ea2017-06-30 12:14:09 -0700342 $arr[] = 1.1;
Paul Yang823f3512020-12-04 13:46:34 -0800343 $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700344
Paul Yangecca6ea2017-06-30 12:14:09 -0700345 $arr[] = '2';
Paul Yang823f3512020-12-04 13:46:34 -0800346 $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
Paul Yangecca6ea2017-06-30 12:14:09 -0700347 $arr[] = '3.1';
Paul Yang823f3512020-12-04 13:46:34 -0800348 $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700349
350 $this->assertEquals(4, count($arr));
351
352 for ($i = 0; $i < count($arr); $i++) {
353 $arr[$i] = 0;
354 $this->assertSame(0.0, $arr[$i]);
355 }
356
357 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -0700358 $arr[0] = 1;
Paul Yang823f3512020-12-04 13:46:34 -0800359 $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700360
Paul Yangecca6ea2017-06-30 12:14:09 -0700361 $arr[1] = 1.1;
Paul Yang823f3512020-12-04 13:46:34 -0800362 $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700363
Paul Yangecca6ea2017-06-30 12:14:09 -0700364 $arr[2] = '2';
Paul Yang823f3512020-12-04 13:46:34 -0800365 $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF);
Paul Yangecca6ea2017-06-30 12:14:09 -0700366 $arr[3] = '3.1';
Paul Yang823f3512020-12-04 13:46:34 -0800367 $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF);
Paul Yange0e54662016-09-15 11:09:01 -0700368 }
369
Paul Yange0e54662016-09-15 11:09:01 -0700370 #########################################################
371 # Test bool field.
372 #########################################################
373
374 public function testBool()
375 {
376 $arr = new RepeatedField(GPBType::BOOL);
377
378 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -0700379 $arr[] = true;
Paul Yange0e54662016-09-15 11:09:01 -0700380 $this->assertSame(true, $arr[0]);
381
Paul Yangecca6ea2017-06-30 12:14:09 -0700382 $arr[] = -1;
Paul Yange0e54662016-09-15 11:09:01 -0700383 $this->assertSame(true, $arr[1]);
384
Paul Yangecca6ea2017-06-30 12:14:09 -0700385 $arr[] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -0700386 $this->assertSame(true, $arr[2]);
387
Paul Yangecca6ea2017-06-30 12:14:09 -0700388 $arr[] = '';
Paul Yange0e54662016-09-15 11:09:01 -0700389 $this->assertSame(false, $arr[3]);
390
391 $this->assertEquals(4, count($arr));
392
393 for ($i = 0; $i < count($arr); $i++) {
394 $arr[$i] = 0;
395 $this->assertSame(false, $arr[$i]);
396 }
397
398 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -0700399 $arr[0] = true;
Paul Yange0e54662016-09-15 11:09:01 -0700400 $this->assertSame(true, $arr[0]);
401
Paul Yangecca6ea2017-06-30 12:14:09 -0700402 $arr[1] = -1;
Paul Yange0e54662016-09-15 11:09:01 -0700403 $this->assertSame(true, $arr[1]);
404
Paul Yangecca6ea2017-06-30 12:14:09 -0700405 $arr[2] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -0700406 $this->assertSame(true, $arr[2]);
407
Paul Yangecca6ea2017-06-30 12:14:09 -0700408 $arr[3] = '';
Paul Yange0e54662016-09-15 11:09:01 -0700409 $this->assertSame(false, $arr[3]);
410 }
411
Paul Yange0e54662016-09-15 11:09:01 -0700412 #########################################################
413 # Test string field.
414 #########################################################
415
416 public function testString()
417 {
418 $arr = new RepeatedField(GPBType::STRING);
419
420 // Test append.
Paul Yangecca6ea2017-06-30 12:14:09 -0700421 $arr[] = 'abc';
Paul Yange0e54662016-09-15 11:09:01 -0700422 $this->assertSame('abc', $arr[0]);
423
Paul Yangecca6ea2017-06-30 12:14:09 -0700424 $arr[] = 1;
Paul Yange0e54662016-09-15 11:09:01 -0700425 $this->assertSame('1', $arr[1]);
426
Paul Yangecca6ea2017-06-30 12:14:09 -0700427 $arr[] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -0700428 $this->assertSame('1.1', $arr[2]);
429
Paul Yangecca6ea2017-06-30 12:14:09 -0700430 $arr[] = true;
Paul Yange0e54662016-09-15 11:09:01 -0700431 $this->assertSame('1', $arr[3]);
432
433 $this->assertEquals(4, count($arr));
434
435 for ($i = 0; $i < count($arr); $i++) {
436 $arr[$i] = '';
437 $this->assertSame('', $arr[$i]);
438 }
439
440 // Test set.
Paul Yangecca6ea2017-06-30 12:14:09 -0700441 $arr[0] = 'abc';
Paul Yange0e54662016-09-15 11:09:01 -0700442 $this->assertSame('abc', $arr[0]);
443
Paul Yangecca6ea2017-06-30 12:14:09 -0700444 $arr[1] = 1;
Paul Yange0e54662016-09-15 11:09:01 -0700445 $this->assertSame('1', $arr[1]);
446
Paul Yangecca6ea2017-06-30 12:14:09 -0700447 $arr[2] = 1.1;
Paul Yange0e54662016-09-15 11:09:01 -0700448 $this->assertSame('1.1', $arr[2]);
449
Paul Yangecca6ea2017-06-30 12:14:09 -0700450 $arr[3] = true;
Paul Yange0e54662016-09-15 11:09:01 -0700451 $this->assertSame('1', $arr[3]);
452 }
453
Paul Yange0e54662016-09-15 11:09:01 -0700454 #########################################################
455 # Test message field.
456 #########################################################
457
458 public function testMessage()
459 {
Brent Shaffer67379542018-05-23 16:43:30 -0700460 $arr = new RepeatedField(GPBType::MESSAGE, Sub::class);
Paul Yange0e54662016-09-15 11:09:01 -0700461
462 // Test append.
Brent Shaffer67379542018-05-23 16:43:30 -0700463 $sub_m = new Sub();
Paul Yange0e54662016-09-15 11:09:01 -0700464 $sub_m->setA(1);
Paul Yangecca6ea2017-06-30 12:14:09 -0700465 $arr[] = $sub_m;
Paul Yange0e54662016-09-15 11:09:01 -0700466 $this->assertSame(1, $arr[0]->getA());
467
Paul Yang190b5272017-04-19 16:23:51 -0700468 $this->assertEquals(1, count($arr));
Paul Yange0e54662016-09-15 11:09:01 -0700469
470 // Test set.
Brent Shaffer67379542018-05-23 16:43:30 -0700471 $sub_m = new Sub();
Paul Yang190b5272017-04-19 16:23:51 -0700472 $sub_m->setA(2);
Paul Yangecca6ea2017-06-30 12:14:09 -0700473 $arr[0] = $sub_m;
Paul Yang190b5272017-04-19 16:23:51 -0700474 $this->assertSame(2, $arr[0]->getA());
Paul Yang451d0612017-07-25 00:49:16 -0700475
476 // Test foreach.
Brent Shaffer67379542018-05-23 16:43:30 -0700477 $arr = new RepeatedField(GPBType::MESSAGE, Sub::class);
Paul Yang451d0612017-07-25 00:49:16 -0700478 for ($i = 0; $i < 3; $i++) {
Brent Shaffer67379542018-05-23 16:43:30 -0700479 $arr[] = new Sub();
Paul Yang451d0612017-07-25 00:49:16 -0700480 $arr[$i]->setA($i);
481 }
482 $i = 0;
483 foreach ($arr as $val) {
484 $this->assertSame($i++, $val->getA());
485 }
486 $this->assertSame(3, $i);
Paul Yange0e54662016-09-15 11:09:01 -0700487 }
488
Paul Yange0e54662016-09-15 11:09:01 -0700489 #########################################################
490 # Test offset type
491 #########################################################
492
493 public function testOffset()
494 {
495 $arr = new RepeatedField(GPBType::INT32);
Paul Yangecca6ea2017-06-30 12:14:09 -0700496 $arr[] = 0;
Paul Yange0e54662016-09-15 11:09:01 -0700497
Paul Yangecca6ea2017-06-30 12:14:09 -0700498 $arr[0] = 1;
Paul Yange0e54662016-09-15 11:09:01 -0700499 $this->assertSame(1, $arr[0]);
500 $this->assertSame(1, count($arr));
501
Paul Yangecca6ea2017-06-30 12:14:09 -0700502 $arr['0'] = 2;
Paul Yange0e54662016-09-15 11:09:01 -0700503 $this->assertSame(2, $arr['0']);
504 $this->assertSame(2, $arr[0]);
505 $this->assertSame(1, count($arr));
506
Paul Yangecca6ea2017-06-30 12:14:09 -0700507 $arr[0.0] = 3;
Paul Yange0e54662016-09-15 11:09:01 -0700508 $this->assertSame(3, $arr[0.0]);
509 $this->assertSame(1, count($arr));
510 }
511
Bo Yang4f3d20a2016-10-05 10:54:39 -0700512 public function testInsertRemoval()
513 {
514 $arr = new RepeatedField(GPBType::INT32);
Paul Yange0e54662016-09-15 11:09:01 -0700515
Paul Yangecca6ea2017-06-30 12:14:09 -0700516 $arr[] = 0;
517 $arr[] = 1;
518 $arr[] = 2;
Bo Yang4f3d20a2016-10-05 10:54:39 -0700519 $this->assertSame(3, count($arr));
Paul Yange0e54662016-09-15 11:09:01 -0700520
Bo Yang4f3d20a2016-10-05 10:54:39 -0700521 unset($arr[2]);
522 $this->assertSame(2, count($arr));
523 $this->assertSame(0, $arr[0]);
524 $this->assertSame(1, $arr[1]);
Paul Yange0e54662016-09-15 11:09:01 -0700525
Paul Yangecca6ea2017-06-30 12:14:09 -0700526 $arr[] = 3;
Bo Yang4f3d20a2016-10-05 10:54:39 -0700527 $this->assertSame(3, count($arr));
528 $this->assertSame(0, $arr[0]);
529 $this->assertSame(1, $arr[1]);
530 $this->assertSame(3, $arr[2]);
531 }
Paul Yange0e54662016-09-15 11:09:01 -0700532
Paul Yange0e54662016-09-15 11:09:01 -0700533 #########################################################
Paul Yang10695652019-01-22 14:02:44 -0800534 # Test reference in array
535 #########################################################
536
Paul Yangd750fbf2019-01-23 12:44:20 -0800537 public function testArrayElementIsReferenceInSetters()
Paul Yang10695652019-01-22 14:02:44 -0800538 {
Paul Yangd750fbf2019-01-23 12:44:20 -0800539 // Bool elements
540 $values = [true];
541 array_walk($values, function (&$value) {});
542 $m = new TestMessage();
543 $m->setRepeatedBool($values);
544
545 // Int32 elements
546 $values = [1];
547 array_walk($values, function (&$value) {});
548 $m = new TestMessage();
549 $m->setRepeatedInt32($values);
550
551 // Double elements
552 $values = [1.0];
553 array_walk($values, function (&$value) {});
554 $m = new TestMessage();
555 $m->setRepeatedDouble($values);
556
557 // String elements
558 $values = ['a'];
559 array_walk($values, function (&$value) {});
560 $m = new TestMessage();
561 $m->setRepeatedString($values);
562
563 // Message elements
Paul Yang10695652019-01-22 14:02:44 -0800564 $m = new TestMessage();
565 $subs = [1, 2];
Paul Yang10695652019-01-22 14:02:44 -0800566 foreach ($subs as &$sub) {
567 $sub = new Sub(['a' => $sub]);
568 }
Paul Yang10695652019-01-22 14:02:44 -0800569 $m->setRepeatedMessage($subs);
Paul Yang823f3512020-12-04 13:46:34 -0800570
571 $this->assertTrue(true);
Paul Yang10695652019-01-22 14:02:44 -0800572 }
573
Paul Yang10695652019-01-22 14:02:44 -0800574 #########################################################
Paul Yange0e54662016-09-15 11:09:01 -0700575 # Test memory leak
576 #########################################################
577
Paul Yang451d0612017-07-25 00:49:16 -0700578 public function testCycleLeak()
579 {
580 gc_collect_cycles();
581 $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
582 $arr[] = new TestMessage;
583 $arr[0]->SetRepeatedRecursive($arr);
Paul Yange0e54662016-09-15 11:09:01 -0700584
Paul Yang451d0612017-07-25 00:49:16 -0700585 // Clean up memory before test.
586 gc_collect_cycles();
587 $start = memory_get_usage();
588 unset($arr);
Paul Yange0e54662016-09-15 11:09:01 -0700589
Paul Yang451d0612017-07-25 00:49:16 -0700590 // Explicitly trigger garbage collection.
591 gc_collect_cycles();
Paul Yange0e54662016-09-15 11:09:01 -0700592
Paul Yang451d0612017-07-25 00:49:16 -0700593 $end = memory_get_usage();
594 $this->assertLessThan($start, $end);
595 }
Joshua Habermancae85a92020-09-22 11:44:52 -0700596
597 #########################################################
598 # Test equality
599 #########################################################
600
601 public function testEquality()
602 {
603 $arr = new RepeatedField(GPBType::INT32);
604 $arr2 = new RepeatedField(GPBType::INT32);
605
606 $this->assertTrue($arr == $arr2);
607
608 $arr[] = 0;
609 $arr[] = 1;
610 $arr[] = 2;
611
612 $this->assertFalse($arr == $arr2);
613
614 $arr2[] = 0;
615 $arr2[] = 1;
616 $arr2[] = 2;
617
618 $this->assertTrue($arr == $arr2);
619
620 // Arrays of different types always compare false.
621 $this->assertFalse(new RepeatedField(GPBType::INT32) ==
622 new RepeatedField(GPBType::INT64));
623 $this->assertFalse(
624 new RepeatedField(GPBType::MESSAGE, TestMessage::class) ==
625 new RepeatedField(GPBType::MESSAGE, Sub::class));
626 }
Joshua Habermanf3e53a02021-02-02 09:15:10 -0800627
628 #########################################################
629 # Test clone
630 #########################################################
631
632 public function testClone()
633 {
634 $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
635 $arr[] = new TestMessage;
636 $arr2 = clone $arr;
637 $this->assertSame($arr[0], $arr2[0]);
638 }
Paul Yange0e54662016-09-15 11:09:01 -0700639}