moneytest.pp 8.0 KB

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