NumberTest.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. <?php
  2. /**
  3. * NumberTest file
  4. *
  5. * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
  6. * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  7. *
  8. * Licensed under The MIT License
  9. * For full copyright and license information, please see the LICENSE.txt
  10. * Redistributions of files must retain the above copyright notice
  11. *
  12. * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  13. * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
  14. * @since 1.2.0
  15. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  16. */
  17. namespace Cake\Test\TestCase\I18n;
  18. use Cake\I18n\I18n;
  19. use Cake\I18n\Number;
  20. use Cake\TestSuite\TestCase;
  21. /**
  22. * NumberTest class
  23. *
  24. */
  25. class NumberTest extends TestCase
  26. {
  27. /**
  28. * setUp method
  29. *
  30. * @return void
  31. */
  32. public function setUp()
  33. {
  34. parent::setUp();
  35. $this->Number = new Number();
  36. $this->locale = I18n::locale();
  37. }
  38. /**
  39. * tearDown method
  40. *
  41. * @return void
  42. */
  43. public function tearDown()
  44. {
  45. parent::tearDown();
  46. unset($this->Number);
  47. I18n::locale($this->locale);
  48. Number::defaultCurrency(false);
  49. }
  50. /**
  51. * testFormatAndCurrency method
  52. *
  53. * @return void
  54. */
  55. public function testFormat()
  56. {
  57. $value = '100100100';
  58. $result = $this->Number->format($value);
  59. $expected = '100,100,100';
  60. $this->assertEquals($expected, $result);
  61. $result = $this->Number->format($value, ['before' => '#']);
  62. $expected = '#100,100,100';
  63. $this->assertEquals($expected, $result);
  64. $result = $this->Number->format($value, ['places' => 3]);
  65. $expected = '100,100,100.000';
  66. $this->assertEquals($expected, $result);
  67. $result = $this->Number->format($value, ['locale' => 'es_VE']);
  68. $expected = '100.100.100';
  69. $this->assertEquals($expected, $result);
  70. $value = 0.00001;
  71. $result = $this->Number->format($value, ['places' => 1, 'before' => '$']);
  72. $expected = '$0.0';
  73. $this->assertEquals($expected, $result);
  74. $value = -0.00001;
  75. $result = $this->Number->format($value, ['places' => 1, 'before' => '$']);
  76. $expected = '$-0.0';
  77. $this->assertEquals($expected, $result);
  78. $value = 1.23;
  79. $options = ['locale' => 'fr_FR', 'after' => ' €'];
  80. $result = $this->Number->format($value, $options);
  81. $expected = '1,23 €';
  82. $this->assertEquals($expected, $result);
  83. }
  84. /**
  85. * testParseFloat method
  86. *
  87. * @return void
  88. */
  89. public function testParseFloat()
  90. {
  91. I18n::locale('de_DE');
  92. $value = '1.234.567,891';
  93. $result = $this->Number->parseFloat($value);
  94. $expected = 1234567.891;
  95. $this->assertEquals($expected, $result);
  96. I18n::locale('pt_BR');
  97. $value = '1.234,37';
  98. $result = $this->Number->parseFloat($value);
  99. $expected = 1234.37;
  100. $this->assertEquals($expected, $result);
  101. $value = '1,234.37';
  102. $result = $this->Number->parseFloat($value, ['locale' => 'en_US']);
  103. $expected = 1234.37;
  104. $this->assertEquals($expected, $result);
  105. }
  106. /**
  107. * testFormatDelta method
  108. *
  109. * @return void
  110. */
  111. public function testFormatDelta()
  112. {
  113. $value = '100100100';
  114. $result = $this->Number->formatDelta($value, ['places' => 0]);
  115. $expected = '+100,100,100';
  116. $this->assertEquals($expected, $result);
  117. $result = $this->Number->formatDelta($value, ['before' => '', 'after' => '']);
  118. $expected = '+100,100,100';
  119. $this->assertEquals($expected, $result);
  120. $result = $this->Number->formatDelta($value, ['before' => '[', 'after' => ']']);
  121. $expected = '[+100,100,100]';
  122. $this->assertEquals($expected, $result);
  123. $result = $this->Number->formatDelta(-$value, ['before' => '[', 'after' => ']']);
  124. $expected = '[-100,100,100]';
  125. $this->assertEquals($expected, $result);
  126. $result = $this->Number->formatDelta(-$value, ['before' => '[ ', 'after' => ' ]']);
  127. $expected = '[ -100,100,100 ]';
  128. $this->assertEquals($expected, $result);
  129. $value = 0;
  130. $result = $this->Number->formatDelta($value, ['places' => 1, 'before' => '[', 'after' => ']']);
  131. $expected = '[0.0]';
  132. $this->assertEquals($expected, $result);
  133. $value = 0.0001;
  134. $result = $this->Number->formatDelta($value, ['places' => 1, 'before' => '[', 'after' => ']']);
  135. $expected = '[0.0]';
  136. $this->assertEquals($expected, $result);
  137. $value = 9876.1234;
  138. $result = $this->Number->formatDelta($value, ['places' => 1, 'locale' => 'de_DE']);
  139. $expected = '+9.876,1';
  140. $this->assertEquals($expected, $result);
  141. }
  142. /**
  143. * Test currency method.
  144. *
  145. * @return void
  146. */
  147. public function testCurrency()
  148. {
  149. $value = '100100100';
  150. $result = $this->Number->currency($value);
  151. $expected = '$100,100,100.00';
  152. $this->assertEquals($expected, $result);
  153. $result = $this->Number->currency($value, 'USD');
  154. $expected = '$100,100,100.00';
  155. $this->assertEquals($expected, $result);
  156. $result = $this->Number->currency($value, 'EUR');
  157. $expected = '€100,100,100.00';
  158. $this->assertEquals($expected, $result);
  159. $result = $this->Number->currency($value, 'EUR', ['locale' => 'de_DE']);
  160. $expected = '100.100.100,00 €';
  161. $this->assertEquals($expected, $result);
  162. $result = $this->Number->currency($value, 'USD', ['locale' => 'de_DE']);
  163. $expected = '100.100.100,00 $';
  164. $this->assertEquals($expected, $result);
  165. $result = $this->Number->currency($value, 'USD', ['locale' => 'en_US']);
  166. $expected = '$100,100,100.00';
  167. $this->assertEquals($expected, $result);
  168. $result = $this->Number->currency($value, 'USD', ['locale' => 'en_CA']);
  169. $expected = 'US$100,100,100.00';
  170. $this->assertEquals($expected, $result);
  171. $result = $this->Number->currency($value, 'INR', ['locale' => 'en_IN']);
  172. $expected = '₹ 10,01,00,100.00';
  173. $this->assertEquals($expected, $result);
  174. $options = ['locale' => 'en_IN', 'pattern' => "Rs'.' #,##,###"];
  175. $result = $this->Number->currency($value, 'INR', $options);
  176. $expected = 'Rs. 10,01,00,100';
  177. $this->assertEquals($expected, $result);
  178. $result = $this->Number->currency($value, 'GBP');
  179. $expected = '£100,100,100.00';
  180. $this->assertEquals($expected, $result);
  181. $result = $this->Number->currency($value, 'GBP', ['locale' => 'da_DK']);
  182. $expected = '100.100.100,00 £';
  183. $this->assertEquals($expected, $result);
  184. $options = ['locale' => 'fr_FR', 'pattern' => 'EUR #,###.00'];
  185. $result = $this->Number->currency($value, 'EUR', $options);
  186. $expected = 'EUR 100 100 100,00';
  187. $this->assertEquals($expected, $result);
  188. $options = ['locale' => 'fr_FR', 'pattern' => '#,###.00 ¤¤'];
  189. $result = $this->Number->currency($value, 'EUR', $options);
  190. $expected = '100 100 100,00 EUR';
  191. $this->assertEquals($expected, $result);
  192. $options = ['locale' => 'fr_FR', 'pattern' => '#,###.00;(¤#,###.00)'];
  193. $result = $this->Number->currency(-1235.03, 'EUR', $options);
  194. $expected = '(€1 235,03)';
  195. $this->assertEquals($expected, $result);
  196. $result = $this->Number->currency(0.5, 'USD', ['locale' => 'en_US', 'fractionSymbol' => 'c']);
  197. $expected = '50c';
  198. $this->assertEquals($expected, $result);
  199. $options = ['fractionSymbol' => ' cents'];
  200. $result = $this->Number->currency(0.2, 'USD', $options);
  201. $expected = '20 cents';
  202. $this->assertEquals($expected, $result);
  203. $options = ['fractionSymbol' => 'cents ', 'fractionPosition' => 'before'];
  204. $result = $this->Number->currency(0.2, null, $options);
  205. $expected = 'cents 20';
  206. $this->assertEquals($expected, $result);
  207. $result = $this->Number->currency(0.2, 'EUR');
  208. $expected = '€0.20';
  209. $this->assertEquals($expected, $result);
  210. $options = ['fractionSymbol' => false, 'fractionPosition' => 'before'];
  211. $result = $this->Number->currency(0.5, null, $options);
  212. $expected = '$0.50';
  213. $this->assertEquals($expected, $result);
  214. $result = $this->Number->currency(0, 'GBP');
  215. $expected = '£0.00';
  216. $this->assertEquals($expected, $result);
  217. $result = $this->Number->currency(0.00000, 'GBP');
  218. $expected = '£0.00';
  219. $this->assertEquals($expected, $result);
  220. $result = $this->Number->currency('0.00000', 'GBP');
  221. $expected = '£0.00';
  222. $this->assertEquals($expected, $result);
  223. $result = $this->Number->currency('22.389', 'CAD');
  224. $expected = 'CA$22.39';
  225. $this->assertEquals($expected, $result);
  226. }
  227. /**
  228. * Test currency format with places and fraction exponents.
  229. * Places should only matter for non fraction values and vice versa.
  230. *
  231. * @return void
  232. */
  233. public function testCurrencyWithFractionAndPlaces()
  234. {
  235. $result = $this->Number->currency('1.23', 'EUR', ['locale' => 'de_DE', 'places' => 3]);
  236. $expected = '1,230 €';
  237. $this->assertEquals($expected, $result);
  238. $result = $this->Number->currency('0.23', 'GBP', ['places' => 3, 'fractionSymbol' => 'p']);
  239. $expected = '23p';
  240. $this->assertEquals($expected, $result);
  241. $result = $this->Number->currency('0.001', 'GBP', ['places' => 3, 'fractionSymbol' => 'p']);
  242. $expected = '0p';
  243. $this->assertEquals($expected, $result);
  244. $result = $this->Number->currency('1.23', 'EUR', ['locale' => 'de_DE', 'precision' => 1]);
  245. $expected = '1,2 €';
  246. $this->assertEquals($expected, $result);
  247. }
  248. /**
  249. * Test default currency
  250. *
  251. * @return void
  252. */
  253. public function testDefaultCurrency()
  254. {
  255. $result = $this->Number->defaultCurrency();
  256. $this->assertEquals('USD', $result);
  257. $this->Number->defaultCurrency(false);
  258. I18n::locale('es_ES');
  259. $this->assertEquals('EUR', $this->Number->defaultCurrency());
  260. $this->Number->defaultCurrency('JPY');
  261. $this->assertEquals('JPY', $this->Number->defaultCurrency());
  262. }
  263. /**
  264. * testCurrencyCentsNegative method
  265. *
  266. * @return void
  267. */
  268. public function testCurrencyCentsNegative()
  269. {
  270. $value = '-0.99';
  271. $result = $this->Number->currency($value, 'EUR', ['locale' => 'de_DE']);
  272. $expected = '-0,99 €';
  273. $this->assertEquals($expected, $result);
  274. $result = $this->Number->currency($value, 'USD', ['fractionSymbol' => 'c']);
  275. $expected = '-99c';
  276. $this->assertEquals($expected, $result);
  277. }
  278. /**
  279. * testCurrencyZero method
  280. *
  281. * @return void
  282. */
  283. public function testCurrencyZero()
  284. {
  285. $value = '0';
  286. $result = $this->Number->currency($value, 'USD');
  287. $expected = '$0.00';
  288. $this->assertEquals($expected, $result);
  289. $result = $this->Number->currency($value, 'EUR', ['locale' => 'fr_FR']);
  290. $expected = '0,00 €';
  291. $this->assertEquals($expected, $result);
  292. }
  293. /**
  294. * testCurrencyOptions method
  295. *
  296. * @return void
  297. */
  298. public function testCurrencyOptions()
  299. {
  300. $value = '1234567.89';
  301. $result = $this->Number->currency($value, null, ['before' => 'Total: ']);
  302. $expected = 'Total: $1,234,567.89';
  303. $this->assertEquals($expected, $result);
  304. $result = $this->Number->currency($value, null, ['after' => ' in Total']);
  305. $expected = '$1,234,567.89 in Total';
  306. $this->assertEquals($expected, $result);
  307. }
  308. /**
  309. * Tests that it is possible to use the international currency code instead of the whole
  310. * when using the currency method
  311. *
  312. * @return void
  313. */
  314. public function testCurrencyIntlCode()
  315. {
  316. $value = '123';
  317. $result = $this->Number->currency($value, 'USD', ['useIntlCode' => true]);
  318. $expected = 'USD 123.00';
  319. $this->assertEquals($expected, $result);
  320. $result = $this->Number->currency($value, 'EUR', ['useIntlCode' => true]);
  321. $expected = 'EUR 123.00';
  322. $this->assertEquals($expected, $result);
  323. $result = $this->Number->currency($value, 'EUR', ['useIntlCode' => true, 'locale' => 'da_DK']);
  324. $expected = '123,00 EUR';
  325. $this->assertEquals($expected, $result);
  326. }
  327. /**
  328. * test precision() with locales
  329. *
  330. * @return void
  331. */
  332. public function testPrecisionLocalized()
  333. {
  334. I18n::locale('fr_FR');
  335. $result = $this->Number->precision(1.234);
  336. $this->assertEquals('1,234', $result);
  337. }
  338. /**
  339. * testToPercentage method
  340. *
  341. * @return void
  342. */
  343. public function testToPercentage()
  344. {
  345. $result = $this->Number->toPercentage(45, 0);
  346. $expected = '45%';
  347. $this->assertEquals($expected, $result);
  348. $result = $this->Number->toPercentage(45, 2);
  349. $expected = '45.00%';
  350. $this->assertEquals($expected, $result);
  351. $result = $this->Number->toPercentage(0, 0);
  352. $expected = '0%';
  353. $this->assertEquals($expected, $result);
  354. $result = $this->Number->toPercentage(0, 4);
  355. $expected = '0.0000%';
  356. $this->assertEquals($expected, $result);
  357. $result = $this->Number->toPercentage(45, 0, ['multiply' => false]);
  358. $expected = '45%';
  359. $this->assertEquals($expected, $result);
  360. $result = $this->Number->toPercentage(45, 2, ['multiply' => false]);
  361. $expected = '45.00%';
  362. $this->assertEquals($expected, $result);
  363. $result = $this->Number->toPercentage(0, 0, ['multiply' => false]);
  364. $expected = '0%';
  365. $this->assertEquals($expected, $result);
  366. $result = $this->Number->toPercentage(0, 4, ['multiply' => false]);
  367. $expected = '0.0000%';
  368. $this->assertEquals($expected, $result);
  369. $result = $this->Number->toPercentage(0.456, 0, ['multiply' => true]);
  370. $expected = '46%';
  371. $this->assertEquals($expected, $result);
  372. $result = $this->Number->toPercentage(0.456, 2, ['multiply' => true]);
  373. $expected = '45.60%';
  374. $this->assertEquals($expected, $result);
  375. $result = $this->Number->toPercentage(0.456, 2, ['locale' => 'de-DE', 'multiply' => true]);
  376. $expected = '45,60%';
  377. $this->assertEquals($expected, $result);
  378. }
  379. /**
  380. * testToReadableSize method
  381. *
  382. * @return void
  383. */
  384. public function testToReadableSize()
  385. {
  386. $result = $this->Number->toReadableSize(0);
  387. $expected = '0 Bytes';
  388. $this->assertEquals($expected, $result);
  389. $result = $this->Number->toReadableSize(1);
  390. $expected = '1 Byte';
  391. $this->assertEquals($expected, $result);
  392. $result = $this->Number->toReadableSize(45);
  393. $expected = '45 Bytes';
  394. $this->assertEquals($expected, $result);
  395. $result = $this->Number->toReadableSize(1023);
  396. $expected = '1,023 Bytes';
  397. $this->assertEquals($expected, $result);
  398. $result = $this->Number->toReadableSize(1024);
  399. $expected = '1 KB';
  400. $this->assertEquals($expected, $result);
  401. $result = $this->Number->toReadableSize(1024 + 123);
  402. $expected = '1.12 KB';
  403. $this->assertEquals($expected, $result);
  404. $result = $this->Number->toReadableSize(1024 * 512);
  405. $expected = '512 KB';
  406. $this->assertEquals($expected, $result);
  407. $result = $this->Number->toReadableSize(1024 * 1024 - 1);
  408. $expected = '1 MB';
  409. $this->assertEquals($expected, $result);
  410. $result = $this->Number->toReadableSize(512.05 * 1024 * 1024);
  411. $expected = '512.05 MB';
  412. $this->assertEquals($expected, $result);
  413. $result = $this->Number->toReadableSize(1024 * 1024 * 1024 - 1);
  414. $expected = '1 GB';
  415. $this->assertEquals($expected, $result);
  416. $result = $this->Number->toReadableSize(1024 * 1024 * 1024 * 512);
  417. $expected = '512 GB';
  418. $this->assertEquals($expected, $result);
  419. $result = $this->Number->toReadableSize(1024 * 1024 * 1024 * 1024 - 1);
  420. $expected = '1 TB';
  421. $this->assertEquals($expected, $result);
  422. $result = $this->Number->toReadableSize(1024 * 1024 * 1024 * 1024 * 512);
  423. $expected = '512 TB';
  424. $this->assertEquals($expected, $result);
  425. $result = $this->Number->toReadableSize(1024 * 1024 * 1024 * 1024 * 1024 - 1);
  426. $expected = '1,024 TB';
  427. $this->assertEquals($expected, $result);
  428. $result = $this->Number->toReadableSize(1024 * 1024 * 1024 * 1024 * 1024 * 1024);
  429. $expected = '1,048,576 TB';
  430. $this->assertEquals($expected, $result);
  431. }
  432. /**
  433. * test toReadableSize() with locales
  434. *
  435. * @return void
  436. */
  437. public function testReadableSizeLocalized()
  438. {
  439. I18n::locale('fr_FR');
  440. $result = $this->Number->toReadableSize(1321205);
  441. $this->assertEquals('1,26 MB', $result);
  442. $result = $this->Number->toReadableSize(512.05 * 1024 * 1024 * 1024);
  443. $this->assertEquals('512,05 GB', $result);
  444. }
  445. }