array_test.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888
  1. <?php
  2. require_once('test.pb.php');
  3. require_once('test_util.php');
  4. use Google\Protobuf\Internal\RepeatedField;
  5. use Google\Protobuf\Internal\GPBType;
  6. use Foo\TestMessage;
  7. use Foo\TestMessage_Sub;
  8. class RepeatedFieldTest extends PHPUnit_Framework_TestCase
  9. {
  10. #########################################################
  11. # Test int32 field.
  12. #########################################################
  13. public function testInt32()
  14. {
  15. $arr = new RepeatedField(GPBType::INT32);
  16. // Test append.
  17. $arr []= MAX_INT32;
  18. $this->assertSame(MAX_INT32, $arr[0]);
  19. $arr []= MIN_INT32;
  20. $this->assertSame(MIN_INT32, $arr[1]);
  21. $arr []= 1.1;
  22. $this->assertSame(1, $arr[2]);
  23. $arr []= MAX_INT32_FLOAT;
  24. $this->assertSame(MAX_INT32, $arr[3]);
  25. $arr []= MAX_INT32_FLOAT;
  26. $this->assertSame(MAX_INT32, $arr[4]);
  27. $arr []= '2';
  28. $this->assertSame(2, $arr[5]);
  29. $arr []= '3.1';
  30. $this->assertSame(3, $arr[6]);
  31. $arr []= MAX_INT32_STRING;
  32. $this->assertSame(MAX_INT32, $arr[7]);
  33. $this->assertEquals(8, count($arr));
  34. for ($i = 0; $i < count($arr); $i++) {
  35. $arr[$i] = 0;
  36. $this->assertSame(0, $arr[$i]);
  37. }
  38. // Test set.
  39. $arr [0]= MAX_INT32;
  40. $this->assertSame(MAX_INT32, $arr[0]);
  41. $arr [1]= MIN_INT32;
  42. $this->assertSame(MIN_INT32, $arr[1]);
  43. $arr [2]= 1.1;
  44. $this->assertSame(1, $arr[2]);
  45. $arr [3]= MAX_INT32_FLOAT;
  46. $this->assertSame(MAX_INT32, $arr[3]);
  47. $arr [4]= MAX_INT32_FLOAT;
  48. $this->assertSame(MAX_INT32, $arr[4]);
  49. $arr [5]= '2';
  50. $this->assertSame(2, $arr[5]);
  51. $arr [6]= '3.1';
  52. $this->assertSame(3, $arr[6]);
  53. $arr [7]= MAX_INT32_STRING;
  54. $this->assertSame(MAX_INT32, $arr[7]);
  55. }
  56. /**
  57. * @expectedException PHPUnit_Framework_Error
  58. */
  59. public function testInt32AppendStringFail()
  60. {
  61. $arr = new RepeatedField(GPBType::INT32);
  62. $arr []= 'abc';
  63. }
  64. /**
  65. * @expectedException PHPUnit_Framework_Error
  66. */
  67. public function testInt32SetStringFail()
  68. {
  69. $arr = new RepeatedField(GPBType::INT32);
  70. $arr []= 0;
  71. $arr [0]= 'abc';
  72. }
  73. /**
  74. * @expectedException PHPUnit_Framework_Error
  75. */
  76. public function testInt32AppendMessageFail()
  77. {
  78. $arr = new RepeatedField(GPBType::INT32);
  79. $arr []= new TestMessage_Sub();
  80. }
  81. /**
  82. * @expectedException PHPUnit_Framework_Error
  83. */
  84. public function testInt32SetMessageFail()
  85. {
  86. $arr = new RepeatedField(GPBType::INT32);
  87. $arr []= 0;
  88. $arr [0]= new TestMessage_Sub();
  89. }
  90. #########################################################
  91. # Test uint32 field.
  92. #########################################################
  93. public function testUint32()
  94. {
  95. $arr = new RepeatedField(GPBType::UINT32);
  96. // Test append.
  97. $arr []= MAX_UINT32;
  98. $this->assertSame(-1, $arr[0]);
  99. $arr []= -1;
  100. $this->assertSame(-1, $arr[1]);
  101. $arr []= MIN_UINT32;
  102. $this->assertSame(MIN_UINT32, $arr[2]);
  103. $arr []= 1.1;
  104. $this->assertSame(1, $arr[3]);
  105. $arr []= MAX_UINT32_FLOAT;
  106. $this->assertSame(-1, $arr[4]);
  107. $arr []= -1.0;
  108. $this->assertSame(-1, $arr[5]);
  109. $arr []= MIN_UINT32_FLOAT;
  110. $this->assertSame(MIN_UINT32, $arr[6]);
  111. $arr []= '2';
  112. $this->assertSame(2, $arr[7]);
  113. $arr []= '3.1';
  114. $this->assertSame(3, $arr[8]);
  115. $arr []= MAX_UINT32_STRING;
  116. $this->assertSame(-1, $arr[9]);
  117. $arr []= '-1.0';
  118. $this->assertSame(-1, $arr[10]);
  119. $arr []= MIN_UINT32_STRING;
  120. $this->assertSame(MIN_UINT32, $arr[11]);
  121. $this->assertEquals(12, count($arr));
  122. for ($i = 0; $i < count($arr); $i++) {
  123. $arr[$i] = 0;
  124. $this->assertSame(0, $arr[$i]);
  125. }
  126. // Test set.
  127. $arr [0]= MAX_UINT32;
  128. $this->assertSame(-1, $arr[0]);
  129. $arr [1]= -1;
  130. $this->assertSame(-1, $arr[1]);
  131. $arr [2]= MIN_UINT32;
  132. $this->assertSame(MIN_UINT32, $arr[2]);
  133. $arr [3]= 1.1;
  134. $this->assertSame(1, $arr[3]);
  135. $arr [4]= MAX_UINT32_FLOAT;
  136. $this->assertSame(-1, $arr[4]);
  137. $arr [5]= -1.0;
  138. $this->assertSame(-1, $arr[5]);
  139. $arr [6]= MIN_UINT32_FLOAT;
  140. $this->assertSame(MIN_UINT32, $arr[6]);
  141. $arr [7]= '2';
  142. $this->assertSame(2, $arr[7]);
  143. $arr [8]= '3.1';
  144. $this->assertSame(3, $arr[8]);
  145. $arr [9]= MAX_UINT32_STRING;
  146. $this->assertSame(-1, $arr[9]);
  147. $arr [10]= '-1.0';
  148. $this->assertSame(-1, $arr[10]);
  149. $arr [11]= MIN_UINT32_STRING;
  150. $this->assertSame(MIN_UINT32, $arr[11]);
  151. }
  152. /**
  153. * @expectedException PHPUnit_Framework_Error
  154. */
  155. public function testUint32AppendStringFail()
  156. {
  157. $arr = new RepeatedField(GPBType::UINT32);
  158. $arr []= 'abc';
  159. }
  160. /**
  161. * @expectedException PHPUnit_Framework_Error
  162. */
  163. public function testUint32SetStringFail()
  164. {
  165. $arr = new RepeatedField(GPBType::UINT32);
  166. $arr []= 0;
  167. $arr [0]= 'abc';
  168. }
  169. /**
  170. * @expectedException PHPUnit_Framework_Error
  171. */
  172. public function testUint32AppendMessageFail()
  173. {
  174. $arr = new RepeatedField(GPBType::UINT32);
  175. $arr []= new TestMessage_Sub();
  176. }
  177. /**
  178. * @expectedException PHPUnit_Framework_Error
  179. */
  180. public function testUint32SetMessageFail()
  181. {
  182. $arr = new RepeatedField(GPBType::UINT32);
  183. $arr []= 0;
  184. $arr [0]= new TestMessage_Sub();
  185. }
  186. #########################################################
  187. # Test int64 field.
  188. #########################################################
  189. public function testInt64()
  190. {
  191. $arr = new RepeatedField(GPBType::INT64);
  192. // Test append.
  193. $arr []= MAX_INT64;
  194. $this->assertSame(MAX_INT64, $arr[0]);
  195. $arr []= MIN_INT64;
  196. $this->assertEquals(MIN_INT64, $arr[1]);
  197. $arr []= 1.1;
  198. $this->assertSame(1, $arr[2]);
  199. $arr []= '2';
  200. $this->assertSame(2, $arr[3]);
  201. $arr []= '3.1';
  202. $this->assertSame(3, $arr[4]);
  203. $arr []= MAX_INT64_STRING;
  204. $this->assertSame(MAX_INT64, $arr[5]);
  205. $arr []= MIN_INT64_STRING;
  206. $this->assertEquals(MIN_INT64, $arr[6]);
  207. $this->assertEquals(7, count($arr));
  208. for ($i = 0; $i < count($arr); $i++) {
  209. $arr[$i] = 0;
  210. $this->assertSame(0, $arr[$i]);
  211. }
  212. // Test set.
  213. $arr [0]= MAX_INT64;
  214. $this->assertSame(MAX_INT64, $arr[0]);
  215. $arr [1]= MIN_INT64;
  216. $this->assertEquals(MIN_INT64, $arr[1]);
  217. $arr [2]= 1.1;
  218. $this->assertSame(1, $arr[2]);
  219. $arr [3]= '2';
  220. $this->assertSame(2, $arr[3]);
  221. $arr [4]= '3.1';
  222. $this->assertSame(3, $arr[4]);
  223. $arr [5]= MAX_INT64_STRING;
  224. $this->assertSame(MAX_INT64, $arr[5]);
  225. $arr [6]= MIN_INT64_STRING;
  226. $this->assertEquals(MIN_INT64, $arr[6]);
  227. }
  228. /**
  229. * @expectedException PHPUnit_Framework_Error
  230. */
  231. public function testInt64AppendStringFail()
  232. {
  233. $arr = new RepeatedField(GPBType::INT64);
  234. $arr []= 'abc';
  235. }
  236. /**
  237. * @expectedException PHPUnit_Framework_Error
  238. */
  239. public function testInt64SetStringFail()
  240. {
  241. $arr = new RepeatedField(GPBType::INT64);
  242. $arr []= 0;
  243. $arr [0]= 'abc';
  244. }
  245. /**
  246. * @expectedException PHPUnit_Framework_Error
  247. */
  248. public function testInt64AppendMessageFail()
  249. {
  250. $arr = new RepeatedField(GPBType::INT64);
  251. $arr []= new TestMessage_Sub();
  252. }
  253. /**
  254. * @expectedException PHPUnit_Framework_Error
  255. */
  256. public function testInt64SetMessageFail()
  257. {
  258. $arr = new RepeatedField(GPBType::INT64);
  259. $arr []= 0;
  260. $arr [0]= new TestMessage_Sub();
  261. }
  262. #########################################################
  263. # Test uint64 field.
  264. #########################################################
  265. public function testUint64()
  266. {
  267. $arr = new RepeatedField(GPBType::UINT64);
  268. // Test append.
  269. $arr []= MAX_UINT64;
  270. $this->assertEquals(MAX_UINT64, $arr[0]);
  271. $arr []= 1.1;
  272. $this->assertSame(1, $arr[1]);
  273. $arr []= '2';
  274. $this->assertSame(2, $arr[2]);
  275. $arr []= '3.1';
  276. $this->assertSame(3, $arr[3]);
  277. $arr []= MAX_UINT64_STRING;
  278. $this->assertEquals(MAX_UINT64, $arr[4]);
  279. $this->assertEquals(5, count($arr));
  280. for ($i = 0; $i < count($arr); $i++) {
  281. $arr[$i] = 0;
  282. $this->assertSame(0, $arr[$i]);
  283. }
  284. // Test set.
  285. $arr [0]= MAX_UINT64;
  286. $this->assertEquals(MAX_UINT64, $arr[0]);
  287. $arr [1]= 1.1;
  288. $this->assertSame(1, $arr[1]);
  289. $arr [2]= '2';
  290. $this->assertSame(2, $arr[2]);
  291. $arr [3]= '3.1';
  292. $this->assertSame(3, $arr[3]);
  293. $arr [4]= MAX_UINT64_STRING;
  294. $this->assertEquals(MAX_UINT64, $arr[4]);
  295. }
  296. /**
  297. * @expectedException PHPUnit_Framework_Error
  298. */
  299. public function testUint64AppendStringFail()
  300. {
  301. $arr = new RepeatedField(GPBType::UINT64);
  302. $arr []= 'abc';
  303. }
  304. /**
  305. * @expectedException PHPUnit_Framework_Error
  306. */
  307. public function testUint64SetStringFail()
  308. {
  309. $arr = new RepeatedField(GPBType::UINT64);
  310. $arr []= 0;
  311. $arr [0]= 'abc';
  312. }
  313. /**
  314. * @expectedException PHPUnit_Framework_Error
  315. */
  316. public function testUint64AppendMessageFail()
  317. {
  318. $arr = new RepeatedField(GPBType::UINT64);
  319. $arr []= new TestMessage_Sub();
  320. }
  321. /**
  322. * @expectedException PHPUnit_Framework_Error
  323. */
  324. public function testUint64SetMessageFail()
  325. {
  326. $arr = new RepeatedField(GPBType::UINT64);
  327. $arr []= 0;
  328. $arr [0]= new TestMessage_Sub();
  329. }
  330. #########################################################
  331. # Test float field.
  332. #########################################################
  333. public function testFloat()
  334. {
  335. $arr = new RepeatedField(GPBType::FLOAT);
  336. // Test append.
  337. $arr []= 1;
  338. $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
  339. $arr []= 1.1;
  340. $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
  341. $arr []= '2';
  342. $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
  343. $arr []= '3.1';
  344. $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
  345. $this->assertEquals(4, count($arr));
  346. for ($i = 0; $i < count($arr); $i++) {
  347. $arr[$i] = 0;
  348. $this->assertSame(0.0, $arr[$i]);
  349. }
  350. // Test set.
  351. $arr [0]= 1;
  352. $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
  353. $arr [1]= 1.1;
  354. $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
  355. $arr [2]= '2';
  356. $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
  357. $arr [3]= '3.1';
  358. $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
  359. }
  360. /**
  361. * @expectedException PHPUnit_Framework_Error
  362. */
  363. public function testFloatAppendStringFail()
  364. {
  365. $arr = new RepeatedField(GPBType::FLOAT);
  366. $arr []= 'abc';
  367. }
  368. /**
  369. * @expectedException PHPUnit_Framework_Error
  370. */
  371. public function testFloatSetStringFail()
  372. {
  373. $arr = new RepeatedField(GPBType::FLOAT);
  374. $arr []= 0.0;
  375. $arr [0]= 'abc';
  376. }
  377. /**
  378. * @expectedException PHPUnit_Framework_Error
  379. */
  380. public function testFloatAppendMessageFail()
  381. {
  382. $arr = new RepeatedField(GPBType::FLOAT);
  383. $arr []= new TestMessage_Sub();
  384. }
  385. /**
  386. * @expectedException PHPUnit_Framework_Error
  387. */
  388. public function testFloatSetMessageFail()
  389. {
  390. $arr = new RepeatedField(GPBType::FLOAT);
  391. $arr []= 0.0;
  392. $arr [0]= new TestMessage_Sub();
  393. }
  394. #########################################################
  395. # Test double field.
  396. #########################################################
  397. public function testDouble()
  398. {
  399. $arr = new RepeatedField(GPBType::DOUBLE);
  400. // Test append.
  401. $arr []= 1;
  402. $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
  403. $arr []= 1.1;
  404. $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
  405. $arr []= '2';
  406. $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
  407. $arr []= '3.1';
  408. $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
  409. $this->assertEquals(4, count($arr));
  410. for ($i = 0; $i < count($arr); $i++) {
  411. $arr[$i] = 0;
  412. $this->assertSame(0.0, $arr[$i]);
  413. }
  414. // Test set.
  415. $arr [0]= 1;
  416. $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
  417. $arr [1]= 1.1;
  418. $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
  419. $arr [2]= '2';
  420. $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
  421. $arr [3]= '3.1';
  422. $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
  423. }
  424. /**
  425. * @expectedException PHPUnit_Framework_Error
  426. */
  427. public function testDoubleAppendStringFail()
  428. {
  429. $arr = new RepeatedField(GPBType::DOUBLE);
  430. $arr []= 'abc';
  431. }
  432. /**
  433. * @expectedException PHPUnit_Framework_Error
  434. */
  435. public function testDoubleSetStringFail()
  436. {
  437. $arr = new RepeatedField(GPBType::DOUBLE);
  438. $arr []= 0.0;
  439. $arr [0]= 'abc';
  440. }
  441. /**
  442. * @expectedException PHPUnit_Framework_Error
  443. */
  444. public function testDoubleAppendMessageFail()
  445. {
  446. $arr = new RepeatedField(GPBType::DOUBLE);
  447. $arr []= new TestMessage_Sub();
  448. }
  449. /**
  450. * @expectedException PHPUnit_Framework_Error
  451. */
  452. public function testDoubleSetMessageFail()
  453. {
  454. $arr = new RepeatedField(GPBType::DOUBLE);
  455. $arr []= 0.0;
  456. $arr [0]= new TestMessage_Sub();
  457. }
  458. #########################################################
  459. # Test bool field.
  460. #########################################################
  461. public function testBool()
  462. {
  463. $arr = new RepeatedField(GPBType::BOOL);
  464. // Test append.
  465. $arr []= true;
  466. $this->assertSame(true, $arr[0]);
  467. $arr []= -1;
  468. $this->assertSame(true, $arr[1]);
  469. $arr []= 1.1;
  470. $this->assertSame(true, $arr[2]);
  471. $arr []= '';
  472. $this->assertSame(false, $arr[3]);
  473. $this->assertEquals(4, count($arr));
  474. for ($i = 0; $i < count($arr); $i++) {
  475. $arr[$i] = 0;
  476. $this->assertSame(false, $arr[$i]);
  477. }
  478. // Test set.
  479. $arr [0]= true;
  480. $this->assertSame(true, $arr[0]);
  481. $arr [1]= -1;
  482. $this->assertSame(true, $arr[1]);
  483. $arr [2]= 1.1;
  484. $this->assertSame(true, $arr[2]);
  485. $arr [3]= '';
  486. $this->assertSame(false, $arr[3]);
  487. }
  488. /**
  489. * @expectedException PHPUnit_Framework_Error
  490. */
  491. public function testBoolAppendMessageFail()
  492. {
  493. $arr = new RepeatedField(GPBType::BOOL);
  494. $arr []= new TestMessage_Sub();
  495. }
  496. /**
  497. * @expectedException PHPUnit_Framework_Error
  498. */
  499. public function testBoolSetMessageFail()
  500. {
  501. $arr = new RepeatedField(GPBType::BOOL);
  502. $arr []= true;
  503. $arr [0]= new TestMessage_Sub();
  504. }
  505. #########################################################
  506. # Test string field.
  507. #########################################################
  508. public function testString()
  509. {
  510. $arr = new RepeatedField(GPBType::STRING);
  511. // Test append.
  512. $arr []= 'abc';
  513. $this->assertSame('abc', $arr[0]);
  514. $arr []= 1;
  515. $this->assertSame('1', $arr[1]);
  516. $arr []= 1.1;
  517. $this->assertSame('1.1', $arr[2]);
  518. $arr []= true;
  519. $this->assertSame('1', $arr[3]);
  520. $this->assertEquals(4, count($arr));
  521. for ($i = 0; $i < count($arr); $i++) {
  522. $arr[$i] = '';
  523. $this->assertSame('', $arr[$i]);
  524. }
  525. // Test set.
  526. $arr [0]= 'abc';
  527. $this->assertSame('abc', $arr[0]);
  528. $arr [1]= 1;
  529. $this->assertSame('1', $arr[1]);
  530. $arr [2]= 1.1;
  531. $this->assertSame('1.1', $arr[2]);
  532. $arr [3]= true;
  533. $this->assertSame('1', $arr[3]);
  534. }
  535. /**
  536. * @expectedException PHPUnit_Framework_Error
  537. */
  538. public function testStringAppendMessageFail()
  539. {
  540. $arr = new RepeatedField(GPBType::STRING);
  541. $arr []= new TestMessage_Sub();
  542. }
  543. /**
  544. * @expectedException PHPUnit_Framework_Error
  545. */
  546. public function testStringSetMessageFail()
  547. {
  548. $arr = new RepeatedField(GPBType::STRING);
  549. $arr []= 'abc';
  550. $arr [0]= new TestMessage_Sub();
  551. }
  552. /**
  553. * @expectedException PHPUnit_Framework_Error
  554. */
  555. public function testStringAppendInvalidUTF8Fail()
  556. {
  557. $arr = new RepeatedField(GPBType::STRING);
  558. $hex = hex2bin("ff");
  559. $arr []= $hex;
  560. }
  561. /**
  562. * @expectedException PHPUnit_Framework_Error
  563. */
  564. public function testStringSetInvalidUTF8Fail()
  565. {
  566. $arr = new RepeatedField(GPBType::STRING);
  567. $arr []= 'abc';
  568. $hex = hex2bin("ff");
  569. $arr [0]= $hex;
  570. }
  571. #########################################################
  572. # Test message field.
  573. #########################################################
  574. public function testMessage()
  575. {
  576. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
  577. // Test append.
  578. $sub_m = new TestMessage_Sub();
  579. $sub_m->setA(1);
  580. $arr []= $sub_m;
  581. $this->assertSame(1, $arr[0]->getA());
  582. $null = null;
  583. $arr []= $null;
  584. $this->assertNull($arr[1]);
  585. $this->assertEquals(2, count($arr));
  586. for ($i = 0; $i < count($arr); $i++) {
  587. $arr[$i] = $null;
  588. $this->assertNull($arr[$i]);
  589. }
  590. // Test set.
  591. $arr [0]= $sub_m;
  592. $this->assertSame(1, $arr[0]->getA());
  593. $arr [1]= $null;
  594. $this->assertNull($arr[1]);
  595. }
  596. /**
  597. * @expectedException PHPUnit_Framework_Error
  598. */
  599. public function testMessageAppendIntFail()
  600. {
  601. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
  602. $arr []= 1;
  603. }
  604. /**
  605. * @expectedException PHPUnit_Framework_Error
  606. */
  607. public function testMessageSetIntFail()
  608. {
  609. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
  610. $arr []= new TestMessage_Sub;
  611. $arr [0]= 'abc';
  612. }
  613. /**
  614. * @expectedException PHPUnit_Framework_Error
  615. */
  616. public function testMessageAppendStringFail()
  617. {
  618. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
  619. $arr []= 'abc';
  620. }
  621. /**
  622. * @expectedException PHPUnit_Framework_Error
  623. */
  624. public function testMessageSetStringFail()
  625. {
  626. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
  627. $arr []= new TestMessage_Sub;
  628. $arr [0]= 'abc';
  629. }
  630. /**
  631. * @expectedException PHPUnit_Framework_Error
  632. */
  633. public function testMessageAppendOtherMessageFail()
  634. {
  635. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
  636. $arr []= new TestMessage;
  637. }
  638. #########################################################
  639. # Test offset type
  640. #########################################################
  641. public function testOffset()
  642. {
  643. $arr = new RepeatedField(GPBType::INT32);
  644. $arr []= 0;
  645. $arr [0]= 1;
  646. $this->assertSame(1, $arr[0]);
  647. $this->assertSame(1, count($arr));
  648. $arr ['0']= 2;
  649. $this->assertSame(2, $arr['0']);
  650. $this->assertSame(2, $arr[0]);
  651. $this->assertSame(1, count($arr));
  652. $arr [0.0]= 3;
  653. $this->assertSame(3, $arr[0.0]);
  654. $this->assertSame(1, count($arr));
  655. }
  656. public function testInsertRemoval()
  657. {
  658. $arr = new RepeatedField(GPBType::INT32);
  659. $arr []= 0;
  660. $arr []= 1;
  661. $arr []= 2;
  662. $this->assertSame(3, count($arr));
  663. unset($arr[2]);
  664. $this->assertSame(2, count($arr));
  665. $this->assertSame(0, $arr[0]);
  666. $this->assertSame(1, $arr[1]);
  667. $arr [] = 3;
  668. $this->assertSame(3, count($arr));
  669. $this->assertSame(0, $arr[0]);
  670. $this->assertSame(1, $arr[1]);
  671. $this->assertSame(3, $arr[2]);
  672. }
  673. /**
  674. * @expectedException PHPUnit_Framework_Error
  675. */
  676. public function testRemoveMiddleFail()
  677. {
  678. $arr = new RepeatedField(GPBType::INT32);
  679. $arr []= 0;
  680. $arr []= 1;
  681. $arr []= 2;
  682. $this->assertSame(3, count($arr));
  683. unset($arr[1]);
  684. }
  685. /**
  686. * @expectedException PHPUnit_Framework_Error
  687. */
  688. public function testRemoveEmptyFail()
  689. {
  690. $arr = new RepeatedField(GPBType::INT32);
  691. unset($arr[0]);
  692. }
  693. /**
  694. * @expectedException PHPUnit_Framework_Error
  695. */
  696. public function testMessageOffsetFail()
  697. {
  698. $arr = new RepeatedField(GPBType::INT32);
  699. $arr []= 0;
  700. $arr [new TestMessage_Sub()]= 0;
  701. }
  702. /**
  703. * @expectedException PHPUnit_Framework_Error
  704. */
  705. public function testStringOffsetFail()
  706. {
  707. $arr = new RepeatedField(GPBType::INT32);
  708. $arr []= 0;
  709. $arr ['abc']= 0;
  710. }
  711. /**
  712. * @expectedException PHPUnit_Framework_Error
  713. */
  714. public function testSetNonExistedOffsetFail()
  715. {
  716. $arr = new RepeatedField(GPBType::INT32);
  717. $arr [0]= 0;
  718. }
  719. #########################################################
  720. # Test memory leak
  721. #########################################################
  722. public function testCycleLeak()
  723. {
  724. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
  725. $arr []= new TestMessage;
  726. $arr[0]->SetRepeatedRecursive($arr);
  727. // Clean up memory before test.
  728. gc_collect_cycles();
  729. $start = memory_get_usage();
  730. unset($arr);
  731. // Explicitly trigger garbage collection.
  732. gc_collect_cycles();
  733. $end = memory_get_usage();
  734. $this->assertLessThan($start, $end);
  735. }
  736. }