NumberTest.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. namespace Tools\TestCase\Utility;
  3. use Cake\Core\Configure;
  4. use Cake\I18n\I18n;
  5. use Tools\TestSuite\TestCase;
  6. use Tools\Utility\Number;
  7. class NumberTest extends TestCase {
  8. /**
  9. * @var \Tools\Utility\Number
  10. */
  11. public $Number;
  12. public function setUp() {
  13. parent::setUp();
  14. Number::defaultCurrency(false);
  15. }
  16. /**
  17. * NumberTest::testAverage()
  18. *
  19. * @return void
  20. */
  21. public function testAverage() {
  22. $array = [];
  23. $is = Number::average($array);
  24. $expected = 0.0;
  25. $this->assertSame($expected, $is);
  26. $array = [3, 8, 4];
  27. $is = Number::average($array);
  28. $expected = 5.0;
  29. $this->assertSame($expected, $is);
  30. $array = [0.0, 3.8];
  31. $is = Number::average($array);
  32. $expected = 2.0;
  33. $this->assertSame($expected, $is);
  34. $array = [0.0, 3.7];
  35. $is = Number::average($array, 1);
  36. $expected = 1.9;
  37. $this->assertSame($expected, $is);
  38. $array = [0.0, 3.7];
  39. $is = Number::average($array, 2);
  40. $expected = 1.85;
  41. $this->assertSame($expected, $is);
  42. }
  43. /**
  44. * NumberTest::testMoney()
  45. *
  46. * @return void
  47. */
  48. public function testMoney() {
  49. Number::defaultCurrency('EUR');
  50. $is = Number::money(22.11, ['locale' => 'DE']);
  51. $expected = '22,11 €';
  52. $this->assertSame($expected, $is);
  53. $is = Number::money(-22.11, ['locale' => 'DE']);
  54. //$expected = '-22,11 €';
  55. $expected = '-22,11 €';
  56. //file_put_contents(TMP . 'x.txt', $is);
  57. $this->assertSame($expected, $is);
  58. $is = Number::money(0, ['locale' => 'DE']);
  59. $expected = '0,00 €';
  60. $this->assertSame($expected, $is);
  61. }
  62. /**
  63. * NumberTest::testCurrency()
  64. *
  65. * @return void
  66. */
  67. public function testCurrency() {
  68. Number::defaultCurrency('EUR');
  69. $is = Number::currency(22.11);
  70. $expected = '22,11 €';
  71. $this->assertSame($expected, $is);
  72. $is = Number::currency(22.11, null, ['useIntlCode' => true]);
  73. $expected = '22,11 EUR';
  74. $this->assertSame($expected, $is);
  75. $is = Number::currency(-22.11);
  76. $expected = '-22,11 €';
  77. $this->assertSame($expected, $is);
  78. $is = Number::currency(-22.11, null, ['signed' => true]);
  79. $expected = '-22,11 €';
  80. $this->assertSame($expected, $is);
  81. $is = Number::currency(22.11, null, ['signed' => true]);
  82. $expected = '+22,11 €';
  83. $this->assertSame($expected, $is);
  84. $result = Number::currency('4.111', 'GBP', ['locale' => 'EN', 'useIntlCode' => true]);
  85. $expected = 'GBP 4.11';
  86. $this->assertEquals($expected, $result);
  87. }
  88. /**
  89. * NumberTest::testFormat()
  90. *
  91. * @return void
  92. */
  93. public function testFormat() {
  94. $is = Number::format(22.11);
  95. $expected = '22,11';
  96. $this->assertSame($expected, $is);
  97. $is = Number::format(22933773);
  98. $expected = '22.933.773';
  99. $this->assertSame($expected, $is);
  100. $is = Number::format(22933773, ['places' => 2]);
  101. $expected = '22.933.773,00';
  102. $this->assertSame($expected, $is);
  103. $is = Number::format(-0.895, ['places' => 3]);
  104. $expected = '-0,895';
  105. $this->assertSame($expected, $is);
  106. }
  107. /**
  108. * @return void
  109. */
  110. public function testToPercentage() {
  111. $is = Number::toPercentage(22.11, 2, ['decimals' => '.']);
  112. $expected = '22,11%';
  113. $this->assertSame($expected, $is);
  114. $is = Number::toPercentage(22.11, 2, ['locale' => 'en']);
  115. $expected = '22.11%';
  116. $this->assertSame($expected, $is);
  117. $is = Number::toPercentage(22.11, 0, ['decimals' => '.']);
  118. $expected = '22%';
  119. $this->assertSame($expected, $is);
  120. $is = Number::toPercentage(0.2311, 0, ['multiply' => true, 'decimals' => '.']);
  121. $expected = '23%';
  122. $this->assertSame($expected, $is);
  123. }
  124. /**
  125. * @return void
  126. */
  127. public function testRoundTo() {
  128. //increment = 10
  129. $values = [
  130. '22' => 20,
  131. '15' => 20,
  132. '3.4' => 0,
  133. '6' => 10,
  134. '-3.12' => 0,
  135. '-10' => -10
  136. ];
  137. foreach ($values as $was => $expected) {
  138. $is = Number::roundTo($was, 10);
  139. $this->assertSame($expected, $is, null, $was);
  140. }
  141. //increment = 0.1
  142. $values2 = [
  143. '22' => 22.0,
  144. '15.234' => 15.2,
  145. '3.4' => 3.4,
  146. '6.131' => 6.1,
  147. '-3.17' => -3.2,
  148. '-10.99' => -11.0
  149. ];
  150. foreach ($values2 as $was => $expected) {
  151. $is = Number::roundTo($was, 0.1);
  152. $this->assertSame($expected, $is, null, $was);
  153. }
  154. }
  155. /**
  156. * @return void
  157. */
  158. public function testRoundUpTo() {
  159. //increment = 10
  160. $values = [
  161. '22.765' => 30.0,
  162. '15.22' => 20.0,
  163. '3.4' => 10.0,
  164. '6' => 10.0,
  165. '-3.12' => -0.0,
  166. '-10' => -10.0
  167. ];
  168. foreach ($values as $was => $expected) {
  169. $is = Number::roundUpTo($was, 10);
  170. $this->assertSame($expected, $is, null, $was);
  171. }
  172. //increment = 5
  173. $values = [
  174. '22' => 25.0,
  175. '15.234' => 20.0,
  176. '3.4' => 5.0,
  177. '6.131' => 10.0,
  178. '-3.17' => -0.0,
  179. '-10.99' => -10.0
  180. ];
  181. foreach ($values as $was => $expected) {
  182. $is = Number::roundUpTo($was, 5);
  183. $this->assertSame($expected, $is, null, $was);
  184. }
  185. }
  186. /**
  187. * @return void
  188. */
  189. public function testRoundDownTo() {
  190. //increment = 10
  191. $values = [
  192. '22.765' => 20.0,
  193. '15.22' => 10.0,
  194. '3.4' => 0.0,
  195. '6' => 0.0,
  196. '-3.12' => -10.0,
  197. '-10' => -10.0
  198. ];
  199. foreach ($values as $was => $expected) {
  200. $is = Number::roundDownTo($was, 10);
  201. $this->assertSame($expected, $is, null, $was);
  202. }
  203. //increment = 3
  204. $values = [
  205. '22' => 21.0,
  206. '15.234' => 15.0,
  207. '3.4' => 3.0,
  208. '6.131' => 6.0,
  209. '-3.17' => -6.0,
  210. '-10.99' => -12.0
  211. ];
  212. foreach ($values as $was => $expected) {
  213. $is = Number::roundDownTo($was, 3);
  214. $this->assertSame($expected, $is, null, $was);
  215. }
  216. }
  217. /**
  218. */
  219. public function testGetDecimalPlaces() {
  220. $values = [
  221. '100' => -2,
  222. '0.0001' => 4,
  223. '10' => -1,
  224. '0.1' => 1,
  225. '1' => 0,
  226. '0.001' => 3
  227. ];
  228. foreach ($values as $was => $expected) {
  229. $is = Number::getDecimalPlaces($was, 10);
  230. $this->assertSame($expected, $is); //, null, $was
  231. }
  232. }
  233. /**
  234. * NumberTest::testCurrencyUnknown()
  235. *
  236. * @return void
  237. */
  238. public function testCurrencyUnknown() {
  239. $result = Number::currency('4.111', 'XYZ', ['locale' => 'DE']);
  240. $expected = '4,11 XYZ';
  241. file_put_contents(TMP . 'x.txt', $result);
  242. $this->assertEquals($expected, $result);
  243. }
  244. }