assertSame(MAX_INT32, $arr[MAX_INT32]); $arr[MIN_INT32] = MIN_INT32; $this->assertSame(MIN_INT32, $arr[MIN_INT32]); $this->assertEquals(2, count($arr)); $this->assertTrue(isset($arr[MAX_INT32])); $this->assertTrue(isset($arr[MIN_INT32])); unset($arr[MAX_INT32]); unset($arr[MIN_INT32]); $this->assertEquals(0, count($arr)); // Test float argument. $arr[1.9] = 1.9; $arr[2.1] = 2.1; $this->assertSame(1, $arr[1]); $this->assertSame(2, $arr[2]); $arr[MAX_INT32_FLOAT] = MAX_INT32_FLOAT; $this->assertSame(MAX_INT32, $arr[MAX_INT32]); $arr[MIN_INT32_FLOAT] = MIN_INT32_FLOAT; $this->assertSame(MIN_INT32, $arr[MIN_INT32]); $this->assertEquals(4, count($arr)); unset($arr[1.9]); unset($arr[2.9]); unset($arr[MAX_INT32_FLOAT]); unset($arr[MIN_INT32_FLOAT]); $this->assertEquals(0, count($arr)); // Test string argument. $arr['2'] = '2'; $this->assertSame(2, $arr[2]); $arr['3.1'] = '3.1'; $this->assertSame(3, $arr[3]); $arr[MAX_INT32_STRING] = MAX_INT32_STRING; $this->assertSame(MAX_INT32, $arr[MAX_INT32]); $this->assertEquals(3, count($arr)); unset($arr['2']); unset($arr['3.1']); unset($arr[MAX_INT32_STRING]); $this->assertEquals(0, count($arr)); // Test foreach. $arr = new MapField(GPBType::INT32, GPBType::INT32); for ($i = 0; $i < 3; $i++) { $arr[$i] = $i; } $i = 0; $arr_test = []; foreach ($arr as $key => $val) { $this->assertSame($key, $val); $arr_test[] = $key; $i++; } $this->assertTrue(isset($arr_test[0])); $this->assertTrue(isset($arr_test[1])); $this->assertTrue(isset($arr_test[2])); $this->assertSame(3, $i); } ######################################################### # Test uint32 field. ######################################################### public function testUint32() { $arr = new MapField(GPBType::UINT32, GPBType::UINT32); // Test integer argument. $arr[MAX_UINT32] = MAX_UINT32; $this->assertSame(-1, $arr[-1]); $this->assertEquals(1, count($arr)); unset($arr[MAX_UINT32]); $this->assertEquals(0, count($arr)); $arr[-1] = -1; $this->assertSame(-1, $arr[-1]); $arr[MIN_UINT32] = MIN_UINT32; $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]); $this->assertEquals(2, count($arr)); unset($arr[-1]); unset($arr[MIN_UINT32]); $this->assertEquals(0, count($arr)); // Test float argument. $arr[MAX_UINT32_FLOAT] = MAX_UINT32_FLOAT; $this->assertSame(-1, $arr[-1]); $this->assertEquals(1, count($arr)); unset($arr[MAX_UINT32_FLOAT]); $this->assertEquals(0, count($arr)); $arr[3.1] = 3.1; $this->assertSame(3, $arr[3]); $arr[-1.0] = -1.0; $this->assertSame(-1, $arr[-1]); $arr[MIN_UINT32_FLOAT] = MIN_UINT32_FLOAT; $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]); $this->assertEquals(3, count($arr)); unset($arr[3.1]); unset($arr[-1.0]); unset($arr[MIN_UINT32_FLOAT]); $this->assertEquals(0, count($arr)); // Test string argument. $arr[MAX_UINT32_STRING] = MAX_UINT32_STRING; $this->assertSame(-1, $arr[-1]); $this->assertEquals(1, count($arr)); unset($arr[MAX_UINT32_STRING]); $this->assertEquals(0, count($arr)); $arr['7'] = '7'; $this->assertSame(7, $arr[7]); $arr['3.1'] = '3.1'; $this->assertSame(3, $arr[3]); $arr['-1.0'] = '-1.0'; $this->assertSame(-1, $arr[-1]); $arr[MIN_UINT32_STRING] = MIN_UINT32_STRING; $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]); $this->assertEquals(4, count($arr)); unset($arr['7']); unset($arr['3.1']); unset($arr['-1.0']); unset($arr[MIN_UINT32_STRING]); $this->assertEquals(0, count($arr)); } ######################################################### # Test int64 field. ######################################################### public function testInt64() { $arr = new MapField(GPBType::INT64, GPBType::INT64); // Test integer argument. $arr[MAX_INT64] = MAX_INT64; $arr[MIN_INT64] = MIN_INT64; if (PHP_INT_SIZE == 4) { $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]); $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]); } else { $this->assertSame(MAX_INT64, $arr[MAX_INT64]); $this->assertSame(MIN_INT64, $arr[MIN_INT64]); } $this->assertEquals(2, count($arr)); unset($arr[MAX_INT64]); unset($arr[MIN_INT64]); $this->assertEquals(0, count($arr)); // Test float argument. $arr[1.1] = 1.1; if (PHP_INT_SIZE == 4) { $this->assertSame('1', $arr['1']); } else { $this->assertSame(1, $arr[1]); } $this->assertEquals(1, count($arr)); unset($arr[1.1]); $this->assertEquals(0, count($arr)); // Test string argument. $arr['2'] = '2'; $arr['3.1'] = '3.1'; $arr[MAX_INT64_STRING] = MAX_INT64_STRING; $arr[MIN_INT64_STRING] = MIN_INT64_STRING; if (PHP_INT_SIZE == 4) { $this->assertSame('2', $arr['2']); $this->assertSame('3', $arr['3']); $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]); $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]); } else { $this->assertSame(2, $arr[2]); $this->assertSame(3, $arr[3]); $this->assertSame(MAX_INT64, $arr[MAX_INT64]); $this->assertSame(MIN_INT64, $arr[MIN_INT64]); } $this->assertEquals(4, count($arr)); unset($arr['2']); unset($arr['3.1']); unset($arr[MAX_INT64_STRING]); unset($arr[MIN_INT64_STRING]); $this->assertEquals(0, count($arr)); } ######################################################### # Test uint64 field. ######################################################### public function testUint64() { $arr = new MapField(GPBType::UINT64, GPBType::UINT64); // Test integer argument. $arr[MAX_UINT64] = MAX_UINT64; if (PHP_INT_SIZE == 4) { $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]); } else { $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]); } $this->assertEquals(1, count($arr)); unset($arr[MAX_UINT64]); $this->assertEquals(0, count($arr)); // Test float argument. $arr[1.1] = 1.1; if (PHP_INT_SIZE == 4) { $this->assertSame('1', $arr['1']); } else { $this->assertSame(1, $arr[1]); } $this->assertEquals(1, count($arr)); unset($arr[1.1]); $this->assertEquals(0, count($arr)); // Test string argument. $arr['2'] = '2'; $arr['3.1'] = '3.1'; $arr[MAX_UINT64_STRING] = MAX_UINT64_STRING; if (PHP_INT_SIZE == 4) { $this->assertSame('2', $arr['2']); $this->assertSame('3', $arr['3']); $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]); } else { $this->assertSame(2, $arr[2]); $this->assertSame(3, $arr[3]); $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]); } $this->assertEquals(3, count($arr)); unset($arr['2']); unset($arr['3.1']); unset($arr[MAX_UINT64_STRING]); $this->assertEquals(0, count($arr)); } ######################################################### # Test float field. ######################################################### public function testFloat() { $arr = new MapField(GPBType::INT32, GPBType::FLOAT); // Test set. $arr[0] = 1; $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF); $arr[1] = 1.1; $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF); $arr[2] = '2'; $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF); $arr[3] = '3.1'; $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF); $this->assertEquals(4, count($arr)); } ######################################################### # Test double field. ######################################################### public function testDouble() { $arr = new MapField(GPBType::INT32, GPBType::DOUBLE); // Test set. $arr[0] = 1; $this->assertFloatEquals(1.0, $arr[0], MAX_FLOAT_DIFF); $arr[1] = 1.1; $this->assertFloatEquals(1.1, $arr[1], MAX_FLOAT_DIFF); $arr[2] = '2'; $this->assertFloatEquals(2.0, $arr[2], MAX_FLOAT_DIFF); $arr[3] = '3.1'; $this->assertFloatEquals(3.1, $arr[3], MAX_FLOAT_DIFF); $this->assertEquals(4, count($arr)); } ######################################################### # Test bool field. ######################################################### public function testBool() { $arr = new MapField(GPBType::BOOL, GPBType::BOOL); // Test boolean. $arr[True] = True; $this->assertSame(True, $arr[True]); $this->assertEquals(1, count($arr)); unset($arr[True]); $this->assertEquals(0, count($arr)); $arr[False] = False; $this->assertSame(False, $arr[False]); $this->assertEquals(1, count($arr)); unset($arr[False]); $this->assertEquals(0, count($arr)); // Test integer. $arr[-1] = -1; $this->assertSame(True, $arr[True]); $this->assertEquals(1, count($arr)); unset($arr[-1]); $this->assertEquals(0, count($arr)); $arr[0] = 0; $this->assertSame(False, $arr[False]); $this->assertEquals(1, count($arr)); unset($arr[0]); $this->assertEquals(0, count($arr)); // Test float. $arr[1.1] = 1.1; $this->assertSame(True, $arr[True]); $this->assertEquals(1, count($arr)); unset($arr[1.1]); $this->assertEquals(0, count($arr)); $arr[0.0] = 0.0; $this->assertSame(False, $arr[False]); $this->assertEquals(1, count($arr)); unset($arr[0.0]); $this->assertEquals(0, count($arr)); // Test string. $arr['a'] = 'a'; $this->assertSame(True, $arr[True]); $this->assertEquals(1, count($arr)); unset($arr['a']); $this->assertEquals(0, count($arr)); $arr[''] = ''; $this->assertSame(False, $arr[False]); $this->assertEquals(1, count($arr)); unset($arr['']); $this->assertEquals(0, count($arr)); } ######################################################### # Test string field. ######################################################### public function testString() { $arr = new MapField(GPBType::STRING, GPBType::STRING); // Test set. $arr['abc'] = 'abc'; $this->assertSame('abc', $arr['abc']); $this->assertEquals(1, count($arr)); unset($arr['abc']); $this->assertEquals(0, count($arr)); $arr[1] = 1; $this->assertSame('1', $arr['1']); $this->assertEquals(1, count($arr)); unset($arr[1]); $this->assertEquals(0, count($arr)); $arr[1.1] = 1.1; $this->assertSame('1.1', $arr['1.1']); $this->assertEquals(1, count($arr)); unset($arr[1.1]); $this->assertEquals(0, count($arr)); $arr[True] = True; $this->assertSame('1', $arr['1']); $this->assertEquals(1, count($arr)); unset($arr[True]); $this->assertEquals(0, count($arr)); // Test foreach. $arr = new MapField(GPBType::STRING, GPBType::STRING); for ($i = 0; $i < 3; $i++) { $arr[$i] = $i; } $i = 0; $arr_test = []; foreach ($arr as $key => $val) { $this->assertSame($key, $val); $arr_test[] = $key; $i++; } $this->assertTrue(isset($arr_test['0'])); $this->assertTrue(isset($arr_test['1'])); $this->assertTrue(isset($arr_test['2'])); $this->assertSame(3, $i); } ######################################################### # Test message field. ######################################################### public function testMessage() { $arr = new MapField(GPBType::INT32, GPBType::MESSAGE, Sub::class); // Test append. $sub_m = new Sub(); $sub_m->setA(1); $arr[0] = $sub_m; $this->assertSame(1, $arr[0]->getA()); $this->assertEquals(1, count($arr)); // Test foreach. $arr = new MapField(GPBType::INT32, GPBType::MESSAGE, Sub::class); for ($i = 0; $i < 3; $i++) { $arr[$i] = new Sub();; $arr[$i]->setA($i); } $i = 0; $key_test = []; $value_test = []; foreach ($arr as $key => $val) { $key_test[] = $key; $value_test[] = $val->getA(); $i++; } $this->assertTrue(isset($key_test['0'])); $this->assertTrue(isset($key_test['1'])); $this->assertTrue(isset($key_test['2'])); $this->assertTrue(isset($value_test['0'])); $this->assertTrue(isset($value_test['1'])); $this->assertTrue(isset($value_test['2'])); $this->assertSame(3, $i); } ######################################################### # Test reference in map ######################################################### public function testMapElementIsReference() { // Bool elements $values = [true => true]; array_walk($values, function (&$value) {}); $m = new TestMessage(); $m->setMapBoolBool($values); // Int32 elements $values = [1 => 1]; array_walk($values, function (&$value) {}); $m = new TestMessage(); $m->setMapInt32Int32($values); // Double elements $values = [1 => 1.0]; array_walk($values, function (&$value) {}); $m = new TestMessage(); $m->setMapInt32Double($values); // String elements $values = ['a' => 'a']; array_walk($values, function (&$value) {}); $m = new TestMessage(); $m->setMapStringString($values); // Message elements $values = [1 => new Sub()]; array_walk($values, function (&$value) {}); $m = new TestMessage(); $m->setMapInt32Message($values); $this->assertTrue(true); } ######################################################### # Test equality ######################################################### public function testEquality() { $map = new MapField(GPBType::INT32, GPBType::INT32); $map2 = new MapField(GPBType::INT32, GPBType::INT32); $this->assertTrue($map == $map2); $map[1] = 2; $this->assertFalse($map == $map2); $map2[1] = 2; $this->assertTrue($map == $map2); // Arrays of different types always compare false. $this->assertFalse(new MapField(GPBType::INT32, GPBType::INT32) == new MapField(GPBType::INT32, GPBType::INT64)); $this->assertFalse(new MapField(GPBType::INT32, GPBType::INT32) == new MapField(GPBType::INT64, GPBType::INT32)); $this->assertFalse( new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class) == new MapField(GPBType::INT32, GPBType::MESSAGE, Sub::class)); } ######################################################### # Test clone ######################################################### public function testClone() { $map = new MapField(GPBType::INT32, GPBType::MESSAGE, Sub::class); // Test append. $sub_m = new Sub(); $sub_m->setA(1); $map[0] = $sub_m; $map2 = clone $map; $this->assertSame($map[0], $map2[0]); } ######################################################### # Test memory leak ######################################################### // TODO: Add it back. // public function testCycleLeak() // { // $arr = new MapField(GPBType::INT32, // GPBType::MESSAGE, TestMessage::class); // $arr[0] = new TestMessage; // $arr[0]->SetMapRecursive($arr); // // Clean up memory before test. // gc_collect_cycles(); // $start = memory_get_usage(); // unset($arr); // // Explicitly trigger garbage collection. // gc_collect_cycles(); // $end = memory_get_usage(); // $this->assertLessThan($start, $end); // } }