map_field_test.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <?php
  2. require_once('test_util.php');
  3. use Google\Protobuf\Internal\GPBType;
  4. use Google\Protobuf\Internal\MapField;
  5. use Foo\TestMessage;
  6. use Foo\TestMessage\Sub;
  7. class MapFieldTest extends PHPUnit_Framework_TestCase {
  8. #########################################################
  9. # Test int32 field.
  10. #########################################################
  11. public function testInt32() {
  12. $arr = new MapField(GPBType::INT32, GPBType::INT32);
  13. // Test integer argument.
  14. $arr[MAX_INT32] = MAX_INT32;
  15. $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
  16. $arr[MIN_INT32] = MIN_INT32;
  17. $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
  18. $this->assertEquals(2, count($arr));
  19. $this->assertTrue(isset($arr[MAX_INT32]));
  20. $this->assertTrue(isset($arr[MIN_INT32]));
  21. unset($arr[MAX_INT32]);
  22. unset($arr[MIN_INT32]);
  23. $this->assertEquals(0, count($arr));
  24. // Test float argument.
  25. $arr[1.9] = 1.9;
  26. $arr[2.1] = 2.1;
  27. $this->assertSame(1, $arr[1]);
  28. $this->assertSame(2, $arr[2]);
  29. $arr[MAX_INT32_FLOAT] = MAX_INT32_FLOAT;
  30. $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
  31. $arr[MIN_INT32_FLOAT] = MIN_INT32_FLOAT;
  32. $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
  33. $this->assertEquals(4, count($arr));
  34. unset($arr[1.9]);
  35. unset($arr[2.9]);
  36. unset($arr[MAX_INT32_FLOAT]);
  37. unset($arr[MIN_INT32_FLOAT]);
  38. $this->assertEquals(0, count($arr));
  39. // Test string argument.
  40. $arr['2'] = '2';
  41. $this->assertSame(2, $arr[2]);
  42. $arr['3.1'] = '3.1';
  43. $this->assertSame(3, $arr[3]);
  44. $arr[MAX_INT32_STRING] = MAX_INT32_STRING;
  45. $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
  46. $this->assertEquals(3, count($arr));
  47. unset($arr['2']);
  48. unset($arr['3.1']);
  49. unset($arr[MAX_INT32_STRING]);
  50. $this->assertEquals(0, count($arr));
  51. // Test foreach.
  52. $arr = new MapField(GPBType::INT32, GPBType::INT32);
  53. for ($i = 0; $i < 3; $i++) {
  54. $arr[$i] = $i;
  55. }
  56. $i = 0;
  57. $arr_test = [];
  58. foreach ($arr as $key => $val) {
  59. $this->assertSame($key, $val);
  60. $arr_test[] = $key;
  61. $i++;
  62. }
  63. $this->assertTrue(isset($arr_test[0]));
  64. $this->assertTrue(isset($arr_test[1]));
  65. $this->assertTrue(isset($arr_test[2]));
  66. $this->assertSame(3, $i);
  67. }
  68. #########################################################
  69. # Test uint32 field.
  70. #########################################################
  71. public function testUint32() {
  72. $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
  73. // Test integer argument.
  74. $arr[MAX_UINT32] = MAX_UINT32;
  75. $this->assertSame(-1, $arr[-1]);
  76. $this->assertEquals(1, count($arr));
  77. unset($arr[MAX_UINT32]);
  78. $this->assertEquals(0, count($arr));
  79. $arr[-1] = -1;
  80. $this->assertSame(-1, $arr[-1]);
  81. $arr[MIN_UINT32] = MIN_UINT32;
  82. $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
  83. $this->assertEquals(2, count($arr));
  84. unset($arr[-1]);
  85. unset($arr[MIN_UINT32]);
  86. $this->assertEquals(0, count($arr));
  87. // Test float argument.
  88. $arr[MAX_UINT32_FLOAT] = MAX_UINT32_FLOAT;
  89. $this->assertSame(-1, $arr[-1]);
  90. $this->assertEquals(1, count($arr));
  91. unset($arr[MAX_UINT32_FLOAT]);
  92. $this->assertEquals(0, count($arr));
  93. $arr[3.1] = 3.1;
  94. $this->assertSame(3, $arr[3]);
  95. $arr[-1.0] = -1.0;
  96. $this->assertSame(-1, $arr[-1]);
  97. $arr[MIN_UINT32_FLOAT] = MIN_UINT32_FLOAT;
  98. $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
  99. $this->assertEquals(3, count($arr));
  100. unset($arr[3.1]);
  101. unset($arr[-1.0]);
  102. unset($arr[MIN_UINT32_FLOAT]);
  103. $this->assertEquals(0, count($arr));
  104. // Test string argument.
  105. $arr[MAX_UINT32_STRING] = MAX_UINT32_STRING;
  106. $this->assertSame(-1, $arr[-1]);
  107. $this->assertEquals(1, count($arr));
  108. unset($arr[MAX_UINT32_STRING]);
  109. $this->assertEquals(0, count($arr));
  110. $arr['7'] = '7';
  111. $this->assertSame(7, $arr[7]);
  112. $arr['3.1'] = '3.1';
  113. $this->assertSame(3, $arr[3]);
  114. $arr['-1.0'] = '-1.0';
  115. $this->assertSame(-1, $arr[-1]);
  116. $arr[MIN_UINT32_STRING] = MIN_UINT32_STRING;
  117. $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
  118. $this->assertEquals(4, count($arr));
  119. unset($arr['7']);
  120. unset($arr['3.1']);
  121. unset($arr['-1.0']);
  122. unset($arr[MIN_UINT32_STRING]);
  123. $this->assertEquals(0, count($arr));
  124. }
  125. #########################################################
  126. # Test int64 field.
  127. #########################################################
  128. public function testInt64() {
  129. $arr = new MapField(GPBType::INT64, GPBType::INT64);
  130. // Test integer argument.
  131. $arr[MAX_INT64] = MAX_INT64;
  132. $arr[MIN_INT64] = MIN_INT64;
  133. if (PHP_INT_SIZE == 4) {
  134. $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]);
  135. $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]);
  136. } else {
  137. $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
  138. $this->assertSame(MIN_INT64, $arr[MIN_INT64]);
  139. }
  140. $this->assertEquals(2, count($arr));
  141. unset($arr[MAX_INT64]);
  142. unset($arr[MIN_INT64]);
  143. $this->assertEquals(0, count($arr));
  144. // Test float argument.
  145. $arr[1.1] = 1.1;
  146. if (PHP_INT_SIZE == 4) {
  147. $this->assertSame('1', $arr['1']);
  148. } else {
  149. $this->assertSame(1, $arr[1]);
  150. }
  151. $this->assertEquals(1, count($arr));
  152. unset($arr[1.1]);
  153. $this->assertEquals(0, count($arr));
  154. // Test string argument.
  155. $arr['2'] = '2';
  156. $arr['3.1'] = '3.1';
  157. $arr[MAX_INT64_STRING] = MAX_INT64_STRING;
  158. $arr[MIN_INT64_STRING] = MIN_INT64_STRING;
  159. if (PHP_INT_SIZE == 4) {
  160. $this->assertSame('2', $arr['2']);
  161. $this->assertSame('3', $arr['3']);
  162. $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]);
  163. $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]);
  164. } else {
  165. $this->assertSame(2, $arr[2]);
  166. $this->assertSame(3, $arr[3]);
  167. $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
  168. $this->assertSame(MIN_INT64, $arr[MIN_INT64]);
  169. }
  170. $this->assertEquals(4, count($arr));
  171. unset($arr['2']);
  172. unset($arr['3.1']);
  173. unset($arr[MAX_INT64_STRING]);
  174. unset($arr[MIN_INT64_STRING]);
  175. $this->assertEquals(0, count($arr));
  176. }
  177. #########################################################
  178. # Test uint64 field.
  179. #########################################################
  180. public function testUint64() {
  181. $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
  182. // Test integer argument.
  183. $arr[MAX_UINT64] = MAX_UINT64;
  184. if (PHP_INT_SIZE == 4) {
  185. $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]);
  186. } else {
  187. $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]);
  188. }
  189. $this->assertEquals(1, count($arr));
  190. unset($arr[MAX_UINT64]);
  191. $this->assertEquals(0, count($arr));
  192. // Test float argument.
  193. $arr[1.1] = 1.1;
  194. if (PHP_INT_SIZE == 4) {
  195. $this->assertSame('1', $arr['1']);
  196. } else {
  197. $this->assertSame(1, $arr[1]);
  198. }
  199. $this->assertEquals(1, count($arr));
  200. unset($arr[1.1]);
  201. $this->assertEquals(0, count($arr));
  202. // Test string argument.
  203. $arr['2'] = '2';
  204. $arr['3.1'] = '3.1';
  205. $arr[MAX_UINT64_STRING] = MAX_UINT64_STRING;
  206. if (PHP_INT_SIZE == 4) {
  207. $this->assertSame('2', $arr['2']);
  208. $this->assertSame('3', $arr['3']);
  209. $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]);
  210. } else {
  211. $this->assertSame(2, $arr[2]);
  212. $this->assertSame(3, $arr[3]);
  213. $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]);
  214. }
  215. $this->assertEquals(3, count($arr));
  216. unset($arr['2']);
  217. unset($arr['3.1']);
  218. unset($arr[MAX_UINT64_STRING]);
  219. $this->assertEquals(0, count($arr));
  220. }
  221. #########################################################
  222. # Test float field.
  223. #########################################################
  224. public function testFloat() {
  225. $arr = new MapField(GPBType::INT32, GPBType::FLOAT);
  226. // Test set.
  227. $arr[0] = 1;
  228. $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
  229. $arr[1] = 1.1;
  230. $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
  231. $arr[2] = '2';
  232. $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
  233. $arr[3] = '3.1';
  234. $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
  235. $this->assertEquals(4, count($arr));
  236. }
  237. #########################################################
  238. # Test double field.
  239. #########################################################
  240. public function testDouble() {
  241. $arr = new MapField(GPBType::INT32, GPBType::DOUBLE);
  242. // Test set.
  243. $arr[0] = 1;
  244. $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
  245. $arr[1] = 1.1;
  246. $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
  247. $arr[2] = '2';
  248. $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
  249. $arr[3] = '3.1';
  250. $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
  251. $this->assertEquals(4, count($arr));
  252. }
  253. #########################################################
  254. # Test bool field.
  255. #########################################################
  256. public function testBool() {
  257. $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
  258. // Test boolean.
  259. $arr[True] = True;
  260. $this->assertSame(True, $arr[True]);
  261. $this->assertEquals(1, count($arr));
  262. unset($arr[True]);
  263. $this->assertEquals(0, count($arr));
  264. $arr[False] = False;
  265. $this->assertSame(False, $arr[False]);
  266. $this->assertEquals(1, count($arr));
  267. unset($arr[False]);
  268. $this->assertEquals(0, count($arr));
  269. // Test integer.
  270. $arr[-1] = -1;
  271. $this->assertSame(True, $arr[True]);
  272. $this->assertEquals(1, count($arr));
  273. unset($arr[-1]);
  274. $this->assertEquals(0, count($arr));
  275. $arr[0] = 0;
  276. $this->assertSame(False, $arr[False]);
  277. $this->assertEquals(1, count($arr));
  278. unset($arr[0]);
  279. $this->assertEquals(0, count($arr));
  280. // Test float.
  281. $arr[1.1] = 1.1;
  282. $this->assertSame(True, $arr[True]);
  283. $this->assertEquals(1, count($arr));
  284. unset($arr[1.1]);
  285. $this->assertEquals(0, count($arr));
  286. $arr[0.0] = 0.0;
  287. $this->assertSame(False, $arr[False]);
  288. $this->assertEquals(1, count($arr));
  289. unset($arr[0.0]);
  290. $this->assertEquals(0, count($arr));
  291. // Test string.
  292. $arr['a'] = 'a';
  293. $this->assertSame(True, $arr[True]);
  294. $this->assertEquals(1, count($arr));
  295. unset($arr['a']);
  296. $this->assertEquals(0, count($arr));
  297. $arr[''] = '';
  298. $this->assertSame(False, $arr[False]);
  299. $this->assertEquals(1, count($arr));
  300. unset($arr['']);
  301. $this->assertEquals(0, count($arr));
  302. }
  303. #########################################################
  304. # Test string field.
  305. #########################################################
  306. public function testString() {
  307. $arr = new MapField(GPBType::STRING, GPBType::STRING);
  308. // Test set.
  309. $arr['abc'] = 'abc';
  310. $this->assertSame('abc', $arr['abc']);
  311. $this->assertEquals(1, count($arr));
  312. unset($arr['abc']);
  313. $this->assertEquals(0, count($arr));
  314. $arr[1] = 1;
  315. $this->assertSame('1', $arr['1']);
  316. $this->assertEquals(1, count($arr));
  317. unset($arr[1]);
  318. $this->assertEquals(0, count($arr));
  319. $arr[1.1] = 1.1;
  320. $this->assertSame('1.1', $arr['1.1']);
  321. $this->assertEquals(1, count($arr));
  322. unset($arr[1.1]);
  323. $this->assertEquals(0, count($arr));
  324. $arr[True] = True;
  325. $this->assertSame('1', $arr['1']);
  326. $this->assertEquals(1, count($arr));
  327. unset($arr[True]);
  328. $this->assertEquals(0, count($arr));
  329. // Test foreach.
  330. $arr = new MapField(GPBType::STRING, GPBType::STRING);
  331. for ($i = 0; $i < 3; $i++) {
  332. $arr[$i] = $i;
  333. }
  334. $i = 0;
  335. $arr_test = [];
  336. foreach ($arr as $key => $val) {
  337. $this->assertSame($key, $val);
  338. $arr_test[] = $key;
  339. $i++;
  340. }
  341. $this->assertTrue(isset($arr_test['0']));
  342. $this->assertTrue(isset($arr_test['1']));
  343. $this->assertTrue(isset($arr_test['2']));
  344. $this->assertSame(3, $i);
  345. }
  346. #########################################################
  347. # Test message field.
  348. #########################################################
  349. public function testMessage() {
  350. $arr = new MapField(GPBType::INT32,
  351. GPBType::MESSAGE, Sub::class);
  352. // Test append.
  353. $sub_m = new Sub();
  354. $sub_m->setA(1);
  355. $arr[0] = $sub_m;
  356. $this->assertSame(1, $arr[0]->getA());
  357. $this->assertEquals(1, count($arr));
  358. // Test foreach.
  359. $arr = new MapField(GPBType::INT32,
  360. GPBType::MESSAGE, Sub::class);
  361. for ($i = 0; $i < 3; $i++) {
  362. $arr[$i] = new Sub();;
  363. $arr[$i]->setA($i);
  364. }
  365. $i = 0;
  366. $key_test = [];
  367. $value_test = [];
  368. foreach ($arr as $key => $val) {
  369. $key_test[] = $key;
  370. $value_test[] = $val->getA();
  371. $i++;
  372. }
  373. $this->assertTrue(isset($key_test['0']));
  374. $this->assertTrue(isset($key_test['1']));
  375. $this->assertTrue(isset($key_test['2']));
  376. $this->assertTrue(isset($value_test['0']));
  377. $this->assertTrue(isset($value_test['1']));
  378. $this->assertTrue(isset($value_test['2']));
  379. $this->assertSame(3, $i);
  380. }
  381. #########################################################
  382. # Test memory leak
  383. #########################################################
  384. // TODO(teboring): Add it back.
  385. // public function testCycleLeak()
  386. // {
  387. // $arr = new MapField(GPBType::INT32,
  388. // GPBType::MESSAGE, TestMessage::class);
  389. // $arr[0] = new TestMessage;
  390. // $arr[0]->SetMapRecursive($arr);
  391. // // Clean up memory before test.
  392. // gc_collect_cycles();
  393. // $start = memory_get_usage();
  394. // unset($arr);
  395. // // Explicitly trigger garbage collection.
  396. // gc_collect_cycles();
  397. // $end = memory_get_usage();
  398. // $this->assertLessThan($start, $end);
  399. // }
  400. }