PageRenderTime 129ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/core/src/test/php/net/xp_framework/unittest/math/BigFloatTest.class.php

https://github.com/ghiata/xp-framework
PHP | 325 lines | 198 code | 62 blank | 65 comment | 0 complexity | d2eb6027ff8def321772e0f0786a7b7a MD5 | raw file
  1. <?php namespace net\xp_framework\unittest\math;
  2. use unittest\TestCase;
  3. use math\BigFloat;
  4. use math\BigInt;
  5. /**
  6. * TestCase
  7. *
  8. * @see xp://math.BigFloat
  9. */
  10. class BigFloatTest extends TestCase {
  11. #[@test]
  12. public function floatFromInt() {
  13. $this->assertEquals(new BigFloat(2.0), new BigFloat(new BigInt(2)));
  14. }
  15. #[@test]
  16. public function castableToString() {
  17. $this->assertEquals('6100', (string)new BigFloat(6100.0));
  18. }
  19. #[@test]
  20. public function castableToStringNegative() {
  21. $this->assertEquals('-6100', (string)new BigFloat(-6100.0));
  22. }
  23. #[@test]
  24. public function castableToStringHalf() {
  25. $this->assertEquals('0.5', (string)new BigFloat(0.5));
  26. }
  27. #[@test]
  28. public function intValue() {
  29. $this->assertEquals(6100, create(new BigFloat(6100.0))->intValue());
  30. }
  31. #[@test]
  32. public function intValueNegative() {
  33. $this->assertEquals(-6100, create(new BigFloat(-6100.0))->intValue());
  34. }
  35. #[@test]
  36. public function doubleValue() {
  37. $this->assertEquals(6100.0, create(new BigFloat(6100.0))->doubleValue());
  38. }
  39. #[@test]
  40. public function doubleValueNegative() {
  41. $this->assertEquals(-6100.0, create(new BigFloat(-6100.0))->doubleValue());
  42. }
  43. #[@test]
  44. public function addition() {
  45. $this->assertEquals(new BigFloat(2.0), create(new BigFloat(1.0))->add(new BigFloat(1.0)));
  46. }
  47. #[@test]
  48. public function additionOneNegative() {
  49. $this->assertEquals(new BigFloat(0.0), create(new BigFloat(-1.0))->add(new BigFloat(1.0)));
  50. }
  51. #[@test]
  52. public function additionBothNegative() {
  53. $this->assertEquals(new BigFloat(-2), create(new BigFloat(-1.0))->add(new BigFloat(-1.0)));
  54. }
  55. #[@test]
  56. public function additionLarge() {
  57. $a= new BigFloat('3648686172031547129462783484965308369824430041997653001183827180347.1');
  58. $b= new BigFloat('1067825251034421530837885294271156039110655362253362224471523.9');
  59. $r= new BigFloat('3648687239856798163884314322850602640980469152653015254546051651871');
  60. $this->assertEquals($r, $a->add($b));
  61. }
  62. #[@test]
  63. public function additionWithPrimitive() {
  64. $this->assertEquals(new BigFloat(6100.0), create(new BigFloat(1.0))->add(6099.0));
  65. }
  66. #[@test]
  67. public function subtraction() {
  68. $this->assertEquals(new BigFloat(0.0), create(new BigFloat(1.0))->subtract(new BigFloat(1.0)));
  69. }
  70. #[@test]
  71. public function subtractionOneNegative() {
  72. $this->assertEquals(new BigFloat(-2.0), create(new BigFloat(-1.0))->subtract(new BigFloat(1.0)));
  73. }
  74. #[@test]
  75. public function subtractionBothNegative() {
  76. $this->assertEquals(new BigFloat(0.0), create(new BigFloat(-1.0))->subtract(new BigFloat(-1.0)));
  77. }
  78. #[@test]
  79. public function subtractionLarge() {
  80. $a= new BigFloat('3648687239856798163884314322850602640980469152653015254546051651871');
  81. $b= new BigFloat('1067825251034421530837885294271156039110655362253362224471523.9');
  82. $r= new BigFloat('3648686172031547129462783484965308369824430041997653001183827180347.1');
  83. $this->assertEquals($r, $a->subtract($b));
  84. }
  85. #[@test]
  86. public function subtractionWithPrimitive() {
  87. $this->assertEquals(new BigFloat(-6100.0), create(new BigFloat(-1.0))->subtract(6099.0));
  88. }
  89. #[@test]
  90. public function multiplication() {
  91. $this->assertEquals(new BigFloat(1.0), create(new BigFloat(1.0))->multiply(new BigFloat(1.0)));
  92. }
  93. #[@test]
  94. public function multiplicationOneNegative() {
  95. $this->assertEquals(new BigFloat(-1.0), create(new BigFloat(-1.0))->multiply(new BigFloat(1.0)));
  96. }
  97. #[@test]
  98. public function multiplicationBothNegative() {
  99. $this->assertEquals(new BigFloat(1.0), create(new BigFloat(-1.0))->multiply(new BigFloat(-1.0)));
  100. }
  101. #[@test]
  102. public function multiplicationLarge() {
  103. $a= new BigFloat('36486872398567981638843143228254546051651870.2');
  104. $b= new BigFloat('50602640980469152653015.1');
  105. $r= new BigFloat('1846332104484924953979623193074019910923757259978350589582121583840.02');
  106. $this->assertEquals($r, $a->multiply($b));
  107. }
  108. #[@test]
  109. public function multiplicationWithPrimitive() {
  110. $this->assertEquals(new BigFloat(6100.0), create(new BigFloat(-1.0))->multiply(-6100.0));
  111. }
  112. #[@test]
  113. public function division() {
  114. $this->assertEquals(new BigFloat(2.0), create(new BigFloat(4.0))->divide(new BigFloat(2.0)));
  115. }
  116. #[@test]
  117. public function divisionOneNegative() {
  118. $this->assertEquals(new BigFloat(-2.0), create(new BigFloat(-4.0))->divide(new BigFloat(2.0)));
  119. }
  120. #[@test]
  121. public function divisionBothNegative() {
  122. $this->assertEquals(new BigFloat(2.0), create(new BigFloat(-4.0))->divide(new BigFloat(-2.0)));
  123. }
  124. #[@test]
  125. public function divisionLarge() {
  126. $a= new BigFloat('1846332104484924953979619544386780054125593365543499568033685888050.0');
  127. $b= new BigFloat('36486872398567981638843143228254546051651870.0');
  128. $r= new BigFloat('50602640980469152653015.0');
  129. $this->assertEquals($r, $a->divide($b));
  130. }
  131. #[@test]
  132. public function divisionWithPrimitive() {
  133. $this->assertEquals(new BigFloat(6100.0), create(new BigFloat(37210000.0))->divide(6100.0));
  134. }
  135. #[@test, @expect('lang.IllegalArgumentException')]
  136. public function divisionByZero() {
  137. create(new BigFloat(5.0))->divide(new BigFloat(0.0));
  138. }
  139. #[@test]
  140. public function power() {
  141. $this->assertEquals(new BigFloat(16.0), create(new BigFloat(2.0))->power(new BigFloat(4.0)));
  142. }
  143. #[@test]
  144. public function powerNegativeOne() {
  145. $this->assertEquals(new BigFloat('0.5'), create(new BigFloat(2.0))->power(new BigFloat(-1.0)));
  146. }
  147. #[@test]
  148. public function powerOfZero() {
  149. $this->assertEquals(new BigFloat(0.0), create(new BigFloat(0.0))->power(new BigFloat(2.0)));
  150. }
  151. #[@test]
  152. public function powerOfZeroZero() {
  153. $this->assertEquals(new BigFloat(1.0), create(new BigFloat(0.0))->power(new BigFloat(0.0)));
  154. }
  155. #[@test]
  156. public function powerOfZeroNegative() {
  157. $this->assertEquals(new BigFloat(0.0), create(new BigFloat(0.0))->power(new BigFloat(-2)));
  158. }
  159. #[@test]
  160. public function powerOfNegativeNumberEven() {
  161. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(-2.0))->power(new BigFloat(2.0)));
  162. }
  163. #[@test]
  164. public function powerOfNegativeNumberOdd() {
  165. $this->assertEquals(new BigFloat(-8.0), create(new BigFloat(-2.0))->power(new BigFloat(3.0)));
  166. }
  167. #[@test]
  168. public function powerOne() {
  169. $this->assertEquals(new BigFloat(2.0), create(new BigFloat(2.0))->power(new BigFloat(1.0)));
  170. }
  171. #[@test]
  172. public function powerZero() {
  173. $this->assertEquals(new BigFloat(1.0), create(new BigFloat(2.0))->power(new BigFloat(0.0)));
  174. }
  175. #[@test]
  176. public function powerWithPrimitive() {
  177. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(2.0))->power(2.0));
  178. }
  179. #[@test]
  180. public function ceil() {
  181. $this->assertEquals(new BigFloat(5.0), create(new BigFloat(4.5))->ceil());
  182. }
  183. #[@test]
  184. public function ceilInt() {
  185. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(4.0))->ceil());
  186. }
  187. #[@test]
  188. public function ceilClose() {
  189. $this->assertEquals(new BigFloat(10.0), create(new BigFloat(9.999))->ceil());
  190. }
  191. #[@test]
  192. public function ceilNegative() {
  193. $this->assertEquals(new BigFloat(-4.0), create(new BigFloat(-4.5))->ceil());
  194. }
  195. #[@test]
  196. public function floor() {
  197. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(4.5))->floor());
  198. }
  199. #[@test]
  200. public function floorInt() {
  201. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(4.0))->floor());
  202. }
  203. #[@test]
  204. public function floorClose() {
  205. $this->assertEquals(new BigFloat(9.0), create(new BigFloat(9.999))->floor());
  206. }
  207. #[@test]
  208. public function floorNegative() {
  209. $this->assertEquals(new BigFloat(-5.0), create(new BigFloat(-4.5))->floor());
  210. }
  211. #[@test]
  212. public function roundWhole() {
  213. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(4.0))->round());
  214. }
  215. #[@test]
  216. public function round() {
  217. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(4.4))->round());
  218. }
  219. #[@test]
  220. public function roundNegative() {
  221. $this->assertEquals(new BigFloat(-4.0), create(new BigFloat(-4.4))->round());
  222. }
  223. #[@test]
  224. public function roundHalf() {
  225. $this->assertEquals(new BigFloat(5.0), create(new BigFloat(4.5))->round());
  226. }
  227. #[@test]
  228. public function roundNegativeHalf() {
  229. $this->assertEquals(new BigFloat(-5.0), create(new BigFloat(-4.5))->round());
  230. }
  231. #[@test]
  232. public function roundAlmostHalf() {
  233. $this->assertEquals(new BigFloat(4.0), create(new BigFloat(4.499999))->round());
  234. }
  235. #[@test]
  236. public function roundNegativeAlmostHalf() {
  237. $this->assertEquals(new BigFloat(-4.0), create(new BigFloat(-4.499999))->round());
  238. }
  239. #[@test]
  240. public function roundEuroToDeutscheMarkExchangeRateToTwoDigits() {
  241. $this->assertEquals(new BigFloat(1.96), create(new BigFloat(1.95583))->round(2));
  242. }
  243. #[@test]
  244. public function roundSample1() {
  245. $this->assertEquals(new BigFloat(323.35), create(new BigFloat(323.346))->round(2));
  246. }
  247. #[@test]
  248. public function roundSample2() {
  249. $this->assertEquals(new BigFloat(323.01), create(new BigFloat(323.006))->round(2));
  250. }
  251. #[@test]
  252. public function ceilLotsOfZeros() {
  253. $this->assertEquals(new BigFloat(4.0), create(new BigFloat('4.00000000000000000'))->ceil());
  254. }
  255. #[@test]
  256. public function floorLotsOfZeros() {
  257. $this->assertEquals(new BigFloat(4.0), create(new BigFloat('4.00000000000000000'))->floor());
  258. }
  259. #[@test]
  260. public function roundLotsOfZeros() {
  261. $this->assertEquals(new BigFloat(4.0), create(new BigFloat('4.00000000000000000'))->round());
  262. }
  263. }