array_test.php 25 KB

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