NumberTest.php 5.2 KB

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