NumberTest.php 5.9 KB

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