moneytest.pp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. unit moneytest;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, money, testregistry;
  6. type
  7. TMoneyTest = class(TTestCase)
  8. private
  9. F12CHF: IMoney;
  10. F14CHF: IMoney;
  11. F7USD: IMoney;
  12. F21USD: IMoney;
  13. FMB1: IMoney;
  14. FMB2: IMoney;
  15. protected
  16. procedure SetUp; override;
  17. procedure TearDown; override;
  18. published
  19. procedure testBagCreate;
  20. procedure testBagMultiply;
  21. procedure testBagNegate;
  22. procedure testBagSimpleAdd;
  23. procedure testBagSubtract;
  24. procedure testBagSumAdd;
  25. procedure testIsZero;
  26. procedure testMixedSimpleAdd;
  27. procedure testBagNotEquals;
  28. procedure testMoneyBagEquals;
  29. procedure testMoneyEquals;
  30. procedure testSimplify;
  31. procedure testNormalize2;
  32. procedure testNormalize3;
  33. procedure testNormalize4;
  34. procedure testPrint;
  35. procedure testMoneyBagPrint;
  36. procedure testSimpleAdd;
  37. procedure testSimpleBagAdd;
  38. procedure testSimpleMultiply;
  39. procedure testSimpleNegate;
  40. procedure testSimpleSubtract;
  41. procedure testOperators;
  42. end;
  43. implementation
  44. { TMoneyTest }
  45. procedure TMoneyTest.SetUp;
  46. begin
  47. F12CHF := TMoney.Create(12, 'CHF');
  48. F14CHF := TMoney.Create(14, 'CHF');
  49. F7USD := TMoney.Create(7, 'USD');
  50. F21USD := TMoney.Create(21, 'USD');
  51. FMB1 := TMoneyBag.CreateWith(F12CHF, F7USD);
  52. FMB2 := TMoneyBag.CreateWith(F14CHF, F21USD);
  53. end;
  54. procedure TMoneyTest.TearDown;
  55. begin
  56. end;
  57. procedure TMoneyTest.testBagCreate;
  58. begin
  59. AssertEquals('Wrong number of moneys in bag', 2, FMB1.Count);
  60. end;
  61. procedure TMoneyTest.testBagMultiply;
  62. var
  63. expected: IMoney;
  64. begin
  65. expected := TMoneyBag.CreateWith(TMoney.Create(24, 'CHF'), TMoney.Create(14, 'USD'));
  66. AssertTrue(expected.equals(FMB1.multiply(2)));
  67. AssertTrue(FMB1.equals(FMB1.multiply(1)));
  68. AssertTrue('multiplication by zero failed', FMB1.multiply(0).isZero);
  69. end;
  70. procedure TMoneyTest.testBagNegate;
  71. var
  72. expected: IMoney;
  73. begin
  74. expected := TMoneyBag.CreateWith(TMoney.Create(-12, 'CHF'), TMoney.Create(-7, 'USD'));
  75. AssertTrue('expected '+ expected.toString + ' but was ' + FMB1.negate.toString, expected.equals(FMB1.negate));
  76. end;
  77. procedure TMoneyTest.testBagSimpleAdd;
  78. var
  79. expected: IMoney;
  80. a, b: IMoney;
  81. begin
  82. a := TMoney.Create(26, 'CHF');
  83. b := TMoney.Create(7, 'USD');
  84. expected := TMoneyBag.CreateWith(a, b);
  85. AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.add(F14CHF).toString, expected.equals(FMB1.add(F14CHF)));
  86. end;
  87. procedure TMoneyTest.testBagSubtract;
  88. var
  89. expected: IMoney;
  90. begin
  91. expected := TMoneyBag.CreateWith(TMoney.Create(-2, 'CHF'), TMoney.Create(-14, 'USD'));
  92. AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.subtract(FMB2).toString, expected.equals(FMB1.Subtract(FMB2)));
  93. end;
  94. procedure TMoneyTest.testBagSumAdd;
  95. var
  96. expected: IMoney;
  97. begin
  98. expected := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(28, 'USD'));
  99. AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.add(FMB2).toString, expected.equals(FMB1.add(FMB2)));
  100. end;
  101. procedure TMoneyTest.testIsZero;
  102. var
  103. F0CHF, F12USD, F0USD, FMB0: IMoney;
  104. begin
  105. F0CHF := TMoney.Create(0, 'CHF');
  106. F0USD := TMoney.Create(0, 'USD');
  107. F12USD := TMoney.Create(12, 'USD');
  108. AssertTrue('error: [0 CHF] is to be considered zero!', F0CHF.IsZero);
  109. AssertFalse('error: [12 USD] is not to be considered zero!', F12USD.IsZero);
  110. AssertTrue(FMB1.subtract(FMB1).isZero);
  111. FMB0 :=TMoneyBag.CreateWith(F0CHF, F0USD);
  112. AssertTrue(FMB0.isZero);
  113. end;
  114. procedure TMoneyTest.testMixedSimpleAdd;
  115. var
  116. expected: IMoney;
  117. begin
  118. expected := TMoneyBag.CreateWith(F12CHF, F7USD);
  119. AssertTrue('expected ' + expected.toString + ' but was ' + F12CHF.add(F7USD).toString, expected.equals(F12CHF.add(F7USD)));
  120. end;
  121. procedure TMoneyTest.testBagNotEquals;
  122. var
  123. expected: IMoney;
  124. res: IMoney;
  125. begin
  126. expected := TMoneyBag.CreateWith(F12CHF, F7USD);
  127. res := TMoney.Create(12, 'CAD').add(F7USD);
  128. AssertFalse(expected.equals(res));
  129. end;
  130. procedure TMoneyTest.testMoneyBagEquals;
  131. var
  132. equal: IMoney;
  133. begin
  134. AssertTrue(not FMB1.equals(nil));
  135. AssertTrue(FMB1.equals(FMB1));
  136. equal := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(7, 'USD'));
  137. AssertTrue(FMB1.equals(equal));
  138. AssertTrue(not FMB1.equals(F12CHF));
  139. AssertTrue(not F12CHF.equals(FMB1));
  140. AssertTrue(not FMB1.equals(FMB2));
  141. end;
  142. procedure TMoneyTest.testMoneyEquals;
  143. var
  144. equalMoney: IMoney;
  145. begin
  146. AssertTrue('error: [12 CHF] does not equal nil', not F12CHF.equals(nil));
  147. equalMoney := TMoney.Create(12, 'CHF');
  148. AssertTrue(F12CHF.equals(F12CHF));
  149. AssertTrue(F12CHF.equals(equalMoney));
  150. AssertFalse(F12CHF.equals(F14CHF));
  151. end;
  152. procedure TMoneyTest.testSimplify;
  153. var
  154. money: IMoney;
  155. F26CHF, F28CHF, F54CHF: IMoney;
  156. begin
  157. F26CHF := TMoney.Create(26, 'CHF');
  158. F28CHF := TMoney.Create(28, 'CHF');
  159. money := TMoneyBag.CreateWith(F26CHF, F28CHF);
  160. F54CHF := TMoney.Create(54, 'CHF');
  161. AssertTrue('Expected ' + F54CHF.toString + ' but was '
  162. + money.toString, F54CHF.equals(money));
  163. end;
  164. procedure TMoneyTest.testNormalize2;
  165. var
  166. expected: IMoney;
  167. begin
  168. // {[12 CHF][7 USD]} - [12 CHF] = [7 USD]
  169. expected := TMoney.Create(7, 'USD');
  170. AssertTrue('Expected ' + expected.toString + ' but was '
  171. + FMB1.subtract(F12CHF).toString, expected.equals(FMB1.subtract(F12CHF)));
  172. end;
  173. procedure TMoneyTest.testNormalize3;
  174. var
  175. ms1: IMoney;
  176. expected: IMoney;
  177. begin
  178. // {[12 CHF][7 USD]} - {[12 CHF][3 USD]} = [4 USD]
  179. ms1 := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(3, 'USD'));
  180. expected := TMoney.Create(4, 'USD');
  181. AssertTrue('Expected ' + expected.toString + ' but was ' + FMB1.subtract(ms1).toString,
  182. expected.equals(FMB1.subtract(ms1)));
  183. end;
  184. procedure TMoneyTest.testNormalize4;
  185. var
  186. ms1: IMoney;
  187. expected: IMoney;
  188. begin
  189. // [12 CHF] - {[12 CHF][3 USD]} = [-3 USD]
  190. ms1 := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(3, 'USD'));
  191. expected := TMoney.Create(-3, 'USD');
  192. AssertTrue('Expected ' + expected.toString + ' but was ' + F12CHF.subtract(ms1).toString,
  193. expected.equals(F12CHF.subtract(ms1)));
  194. end;
  195. procedure TMoneyTest.testPrint;
  196. begin
  197. AssertEquals('[12 CHF]', F12CHF.ToString);
  198. end;
  199. procedure TMoneyTest.testMoneyBagPrint;
  200. begin
  201. AssertEquals('{[12 CHF][7 USD]}', FMB1.toString);
  202. end;
  203. procedure TMoneyTest.testSimpleAdd;
  204. var
  205. expected: IMoney;
  206. res: IMoney;
  207. begin
  208. expected := TMoney.Create(26, 'CHF');
  209. res := F12CHF.add(F14CHF);
  210. AssertTrue('addition error: [12 CHF] + [14 CHF] was not [26 CHF]', res.equals(expected));
  211. end;
  212. procedure TMoneyTest.testSimpleBagAdd;
  213. var
  214. expected: IMoney;
  215. begin
  216. expected := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(7, 'USD'));
  217. AssertTrue('expected ' + expected.toString + ' but was ' + F14CHF.add(FMB1).toString, expected.equals(F14CHF.add(FMB1)));
  218. end;
  219. procedure TMoneyTest.testSimpleMultiply;
  220. var
  221. expected: IMoney;
  222. begin
  223. expected := TMoney.Create(28, 'CHF');
  224. AssertTrue('Multiply Error: [14 CHF] * 2 was not equal to [28 CHF]',
  225. expected.equals(F14CHF.Multiply(2)));
  226. end;
  227. procedure TMoneyTest.testSimpleNegate;
  228. var
  229. expected: IMoney;
  230. begin
  231. expected := TMoney.Create(-14, 'CHF');
  232. AssertTrue('Negate Error: [14 CHF] negate was not equal to [-14 CHF]',
  233. expected.equals(F14CHF.negate));
  234. end;
  235. procedure TMoneyTest.testSimpleSubtract;
  236. var
  237. expected: IMoney;
  238. begin
  239. expected := TMoney.Create(2, 'CHF');
  240. AssertTrue('Negate Error: [14 CHF] - [12 CHF] was not equal to [2 CHF]',
  241. expected.equals(F14CHF.subtract(F12CHF)));
  242. end;
  243. procedure TMoneyTest.testOperators;
  244. var
  245. mb: IMoney;
  246. ma: IMoney;
  247. begin
  248. ma := TMoney.Create(2, 'CHF');
  249. AssertTrue(F14CHF.equals(F12CHF + ma ));
  250. AssertTrue('expected ' + FMB1.toString +' but was ' +
  251. (FMB2 - TMoneyBag.CreateWith(TMoney.Create(2, 'CHF'), TMoney.Create(14, 'USD'))).toString,
  252. FMB1.equals(FMB2 - TMoneyBag.CreateWith(TMoney.Create(2, 'CHF'), TMoney.Create(14, 'USD'))));
  253. mb := TMoneyBag.CreateWith(TMoney.Create(28, 'CHF'), TMoney.Create(42, 'USD'));
  254. AssertTrue('expected ' + mb.toString + ' but was ' + (FMB2 *2).toString, (FMB2 * 2).equals(mb));
  255. end;
  256. initialization
  257. RegisterTests([TMoneyTest]);
  258. end.