3 require_once('test_util.php');
5 use Google\Protobuf\Internal\GPBType;
6 use Google\Protobuf\Internal\MapField;
8 use Foo\TestMessage\Sub;
10 class MapFieldTest extends \PHPUnit\Framework\TestCase {
12 #########################################################
14 #########################################################
16 public function testInt32() {
17 $arr = new MapField(GPBType::INT32, GPBType::INT32);
19 // Test integer argument.
20 $arr[MAX_INT32] = MAX_INT32;
21 $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
22 $arr[MIN_INT32] = MIN_INT32;
23 $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
24 $this->assertEquals(2, count($arr));
25 $this->assertTrue(isset($arr[MAX_INT32]));
26 $this->assertTrue(isset($arr[MIN_INT32]));
27 unset($arr[MAX_INT32]);
28 unset($arr[MIN_INT32]);
29 $this->assertEquals(0, count($arr));
31 // Test float argument.
34 $this->assertSame(1, $arr[1]);
35 $this->assertSame(2, $arr[2]);
36 $arr[MAX_INT32_FLOAT] = MAX_INT32_FLOAT;
37 $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
38 $arr[MIN_INT32_FLOAT] = MIN_INT32_FLOAT;
39 $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
40 $this->assertEquals(4, count($arr));
43 unset($arr[MAX_INT32_FLOAT]);
44 unset($arr[MIN_INT32_FLOAT]);
45 $this->assertEquals(0, count($arr));
47 // Test string argument.
49 $this->assertSame(2, $arr[2]);
51 $this->assertSame(3, $arr[3]);
52 $arr[MAX_INT32_STRING] = MAX_INT32_STRING;
53 $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
54 $this->assertEquals(3, count($arr));
57 unset($arr[MAX_INT32_STRING]);
58 $this->assertEquals(0, count($arr));
61 $arr = new MapField(GPBType::INT32, GPBType::INT32);
62 for ($i = 0; $i < 3; $i++) {
67 foreach ($arr as $key => $val) {
68 $this->assertSame($key, $val);
72 $this->assertTrue(isset($arr_test[0]));
73 $this->assertTrue(isset($arr_test[1]));
74 $this->assertTrue(isset($arr_test[2]));
75 $this->assertSame(3, $i);
78 #########################################################
80 #########################################################
82 public function testUint32() {
83 $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
85 // Test integer argument.
86 $arr[MAX_UINT32] = MAX_UINT32;
87 $this->assertSame(-1, $arr[-1]);
88 $this->assertEquals(1, count($arr));
89 unset($arr[MAX_UINT32]);
90 $this->assertEquals(0, count($arr));
93 $this->assertSame(-1, $arr[-1]);
94 $arr[MIN_UINT32] = MIN_UINT32;
95 $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
96 $this->assertEquals(2, count($arr));
98 unset($arr[MIN_UINT32]);
99 $this->assertEquals(0, count($arr));
101 // Test float argument.
102 $arr[MAX_UINT32_FLOAT] = MAX_UINT32_FLOAT;
103 $this->assertSame(-1, $arr[-1]);
104 $this->assertEquals(1, count($arr));
105 unset($arr[MAX_UINT32_FLOAT]);
106 $this->assertEquals(0, count($arr));
109 $this->assertSame(3, $arr[3]);
111 $this->assertSame(-1, $arr[-1]);
112 $arr[MIN_UINT32_FLOAT] = MIN_UINT32_FLOAT;
113 $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
114 $this->assertEquals(3, count($arr));
117 unset($arr[MIN_UINT32_FLOAT]);
118 $this->assertEquals(0, count($arr));
120 // Test string argument.
121 $arr[MAX_UINT32_STRING] = MAX_UINT32_STRING;
122 $this->assertSame(-1, $arr[-1]);
123 $this->assertEquals(1, count($arr));
124 unset($arr[MAX_UINT32_STRING]);
125 $this->assertEquals(0, count($arr));
128 $this->assertSame(7, $arr[7]);
130 $this->assertSame(3, $arr[3]);
131 $arr['-1.0'] = '-1.0';
132 $this->assertSame(-1, $arr[-1]);
133 $arr[MIN_UINT32_STRING] = MIN_UINT32_STRING;
134 $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
135 $this->assertEquals(4, count($arr));
139 unset($arr[MIN_UINT32_STRING]);
140 $this->assertEquals(0, count($arr));
143 #########################################################
145 #########################################################
147 public function testInt64() {
148 $arr = new MapField(GPBType::INT64, GPBType::INT64);
150 // Test integer argument.
151 $arr[MAX_INT64] = MAX_INT64;
152 $arr[MIN_INT64] = MIN_INT64;
153 if (PHP_INT_SIZE == 4) {
154 $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]);
155 $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]);
157 $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
158 $this->assertSame(MIN_INT64, $arr[MIN_INT64]);
160 $this->assertEquals(2, count($arr));
161 unset($arr[MAX_INT64]);
162 unset($arr[MIN_INT64]);
163 $this->assertEquals(0, count($arr));
165 // Test float argument.
167 if (PHP_INT_SIZE == 4) {
168 $this->assertSame('1', $arr['1']);
170 $this->assertSame(1, $arr[1]);
172 $this->assertEquals(1, count($arr));
174 $this->assertEquals(0, count($arr));
176 // Test string argument.
179 $arr[MAX_INT64_STRING] = MAX_INT64_STRING;
180 $arr[MIN_INT64_STRING] = MIN_INT64_STRING;
181 if (PHP_INT_SIZE == 4) {
182 $this->assertSame('2', $arr['2']);
183 $this->assertSame('3', $arr['3']);
184 $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]);
185 $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]);
187 $this->assertSame(2, $arr[2]);
188 $this->assertSame(3, $arr[3]);
189 $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
190 $this->assertSame(MIN_INT64, $arr[MIN_INT64]);
192 $this->assertEquals(4, count($arr));
195 unset($arr[MAX_INT64_STRING]);
196 unset($arr[MIN_INT64_STRING]);
197 $this->assertEquals(0, count($arr));
200 #########################################################
202 #########################################################
204 public function testUint64() {
205 $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
207 // Test integer argument.
208 $arr[MAX_UINT64] = MAX_UINT64;
209 if (PHP_INT_SIZE == 4) {
210 $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]);
212 $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]);
214 $this->assertEquals(1, count($arr));
215 unset($arr[MAX_UINT64]);
216 $this->assertEquals(0, count($arr));
218 // Test float argument.
220 if (PHP_INT_SIZE == 4) {
221 $this->assertSame('1', $arr['1']);
223 $this->assertSame(1, $arr[1]);
225 $this->assertEquals(1, count($arr));
227 $this->assertEquals(0, count($arr));
229 // Test string argument.
232 $arr[MAX_UINT64_STRING] = MAX_UINT64_STRING;
234 if (PHP_INT_SIZE == 4) {
235 $this->assertSame('2', $arr['2']);
236 $this->assertSame('3', $arr['3']);
237 $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]);
239 $this->assertSame(2, $arr[2]);
240 $this->assertSame(3, $arr[3]);
241 $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]);
244 $this->assertEquals(3, count($arr));
247 unset($arr[MAX_UINT64_STRING]);
248 $this->assertEquals(0, count($arr));
251 #########################################################
253 #########################################################
255 public function testFloat() {
256 $arr = new MapField(GPBType::INT32, GPBType::FLOAT);
260 $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
263 $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
266 $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
268 $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
270 $this->assertEquals(4, count($arr));
273 #########################################################
275 #########################################################
277 public function testDouble() {
278 $arr = new MapField(GPBType::INT32, GPBType::DOUBLE);
282 $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
285 $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
288 $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
290 $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
292 $this->assertEquals(4, count($arr));
295 #########################################################
297 #########################################################
299 public function testBool() {
300 $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
304 $this->assertSame(True, $arr[True]);
305 $this->assertEquals(1, count($arr));
307 $this->assertEquals(0, count($arr));
310 $this->assertSame(False, $arr[False]);
311 $this->assertEquals(1, count($arr));
313 $this->assertEquals(0, count($arr));
317 $this->assertSame(True, $arr[True]);
318 $this->assertEquals(1, count($arr));
320 $this->assertEquals(0, count($arr));
323 $this->assertSame(False, $arr[False]);
324 $this->assertEquals(1, count($arr));
326 $this->assertEquals(0, count($arr));
330 $this->assertSame(True, $arr[True]);
331 $this->assertEquals(1, count($arr));
333 $this->assertEquals(0, count($arr));
336 $this->assertSame(False, $arr[False]);
337 $this->assertEquals(1, count($arr));
339 $this->assertEquals(0, count($arr));
343 $this->assertSame(True, $arr[True]);
344 $this->assertEquals(1, count($arr));
346 $this->assertEquals(0, count($arr));
349 $this->assertSame(False, $arr[False]);
350 $this->assertEquals(1, count($arr));
352 $this->assertEquals(0, count($arr));
355 #########################################################
357 #########################################################
359 public function testString() {
360 $arr = new MapField(GPBType::STRING, GPBType::STRING);
364 $this->assertSame('abc', $arr['abc']);
365 $this->assertEquals(1, count($arr));
367 $this->assertEquals(0, count($arr));
370 $this->assertSame('1', $arr['1']);
371 $this->assertEquals(1, count($arr));
373 $this->assertEquals(0, count($arr));
376 $this->assertSame('1.1', $arr['1.1']);
377 $this->assertEquals(1, count($arr));
379 $this->assertEquals(0, count($arr));
382 $this->assertSame('1', $arr['1']);
383 $this->assertEquals(1, count($arr));
385 $this->assertEquals(0, count($arr));
388 $arr = new MapField(GPBType::STRING, GPBType::STRING);
389 for ($i = 0; $i < 3; $i++) {
394 foreach ($arr as $key => $val) {
395 $this->assertSame($key, $val);
399 $this->assertTrue(isset($arr_test['0']));
400 $this->assertTrue(isset($arr_test['1']));
401 $this->assertTrue(isset($arr_test['2']));
402 $this->assertSame(3, $i);
405 #########################################################
406 # Test message field.
407 #########################################################
409 public function testMessage() {
410 $arr = new MapField(GPBType::INT32,
411 GPBType::MESSAGE, Sub::class);
417 $this->assertSame(1, $arr[0]->getA());
419 $this->assertEquals(1, count($arr));
422 $arr = new MapField(GPBType::INT32,
423 GPBType::MESSAGE, Sub::class);
424 for ($i = 0; $i < 3; $i++) {
425 $arr[$i] = new Sub();;
431 foreach ($arr as $key => $val) {
433 $value_test[] = $val->getA();
436 $this->assertTrue(isset($key_test['0']));
437 $this->assertTrue(isset($key_test['1']));
438 $this->assertTrue(isset($key_test['2']));
439 $this->assertTrue(isset($value_test['0']));
440 $this->assertTrue(isset($value_test['1']));
441 $this->assertTrue(isset($value_test['2']));
442 $this->assertSame(3, $i);
445 #########################################################
446 # Test reference in map
447 #########################################################
449 public function testMapElementIsReference()
452 $values = [true => true];
453 array_walk($values, function (&$value) {});
454 $m = new TestMessage();
455 $m->setMapBoolBool($values);
459 array_walk($values, function (&$value) {});
460 $m = new TestMessage();
461 $m->setMapInt32Int32($values);
464 $values = [1 => 1.0];
465 array_walk($values, function (&$value) {});
466 $m = new TestMessage();
467 $m->setMapInt32Double($values);
470 $values = ['a' => 'a'];
471 array_walk($values, function (&$value) {});
472 $m = new TestMessage();
473 $m->setMapStringString($values);
476 $values = [1 => new Sub()];
477 array_walk($values, function (&$value) {});
478 $m = new TestMessage();
479 $m->setMapInt32Message($values);
482 #########################################################
484 #########################################################
486 // TODO(teboring): Add it back.
487 // public function testCycleLeak()
489 // $arr = new MapField(GPBType::INT32,
490 // GPBType::MESSAGE, TestMessage::class);
491 // $arr[0] = new TestMessage;
492 // $arr[0]->SetMapRecursive($arr);
494 // // Clean up memory before test.
495 // gc_collect_cycles();
496 // $start = memory_get_usage();
499 // // Explicitly trigger garbage collection.
500 // gc_collect_cycles();
502 // $end = memory_get_usage();
503 // $this->assertLessThan($start, $end);