mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-01-20 07:01:34 +01:00
298 lines
8.0 KiB
ObjectPascal
298 lines
8.0 KiB
ObjectPascal
unit moneytest;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, fpcunit, money, testregistry;
|
|
|
|
type
|
|
|
|
TMoneyTest = class(TTestCase)
|
|
private
|
|
F12CHF: IMoney;
|
|
F14CHF: IMoney;
|
|
F7USD: IMoney;
|
|
F21USD: IMoney;
|
|
FMB1: IMoney;
|
|
FMB2: IMoney;
|
|
protected
|
|
procedure SetUp; override;
|
|
procedure TearDown; override;
|
|
published
|
|
procedure testBagCreate;
|
|
procedure testBagMultiply;
|
|
procedure testBagNegate;
|
|
procedure testBagSimpleAdd;
|
|
procedure testBagSubtract;
|
|
procedure testBagSumAdd;
|
|
procedure testIsZero;
|
|
procedure testMixedSimpleAdd;
|
|
procedure testBagNotEquals;
|
|
procedure testMoneyBagEquals;
|
|
procedure testMoneyEquals;
|
|
procedure testSimplify;
|
|
procedure testNormalize2;
|
|
procedure testNormalize3;
|
|
procedure testNormalize4;
|
|
procedure testPrint;
|
|
procedure testMoneyBagPrint;
|
|
procedure testSimpleAdd;
|
|
procedure testSimpleBagAdd;
|
|
procedure testSimpleMultiply;
|
|
procedure testSimpleNegate;
|
|
procedure testSimpleSubtract;
|
|
procedure testOperators;
|
|
end;
|
|
|
|
|
|
|
|
implementation
|
|
|
|
{ TMoneyTest }
|
|
|
|
procedure TMoneyTest.SetUp;
|
|
begin
|
|
F12CHF := TMoney.Create(12, 'CHF');
|
|
F14CHF := TMoney.Create(14, 'CHF');
|
|
F7USD := TMoney.Create(7, 'USD');
|
|
F21USD := TMoney.Create(21, 'USD');
|
|
FMB1 := TMoneyBag.CreateWith(F12CHF, F7USD);
|
|
FMB2 := TMoneyBag.CreateWith(F14CHF, F21USD);
|
|
end;
|
|
|
|
procedure TMoneyTest.TearDown;
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure TMoneyTest.testBagCreate;
|
|
begin
|
|
AssertEquals('Wrong number of moneys in bag', 2, FMB1.Count);
|
|
end;
|
|
|
|
procedure TMoneyTest.testBagMultiply;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoneyBag.CreateWith(TMoney.Create(24, 'CHF'), TMoney.Create(14, 'USD'));
|
|
AssertTrue(expected.equals(FMB1.multiply(2)));
|
|
AssertTrue(FMB1.equals(FMB1.multiply(1)));
|
|
AssertTrue('multiplication by zero failed', FMB1.multiply(0).isZero);
|
|
end;
|
|
|
|
procedure TMoneyTest.testBagNegate;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoneyBag.CreateWith(TMoney.Create(-12, 'CHF'), TMoney.Create(-7, 'USD'));
|
|
AssertTrue('expected '+ expected.toString + ' but was ' + FMB1.negate.toString, expected.equals(FMB1.negate));
|
|
end;
|
|
|
|
procedure TMoneyTest.testBagSimpleAdd;
|
|
var
|
|
expected: IMoney;
|
|
a, b: IMoney;
|
|
begin
|
|
a := TMoney.Create(26, 'CHF');
|
|
b := TMoney.Create(7, 'USD');
|
|
expected := TMoneyBag.CreateWith(a, b);
|
|
AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.add(F14CHF).toString, expected.equals(FMB1.add(F14CHF)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testBagSubtract;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoneyBag.CreateWith(TMoney.Create(-2, 'CHF'), TMoney.Create(-14, 'USD'));
|
|
AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.subtract(FMB2).toString, expected.equals(FMB1.Subtract(FMB2)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testBagSumAdd;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(28, 'USD'));
|
|
AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.add(FMB2).toString, expected.equals(FMB1.add(FMB2)));
|
|
|
|
end;
|
|
|
|
procedure TMoneyTest.testIsZero;
|
|
var
|
|
F0CHF, F12USD, F0USD, FMB0: IMoney;
|
|
begin
|
|
F0CHF := TMoney.Create(0, 'CHF');
|
|
F0USD := TMoney.Create(0, 'USD');
|
|
F12USD := TMoney.Create(12, 'USD');
|
|
AssertTrue('error: [0 CHF] is to be considered zero!', F0CHF.IsZero);
|
|
AssertFalse('error: [12 USD] is not to be considered zero!', F12USD.IsZero);
|
|
AssertTrue(FMB1.subtract(FMB1).isZero);
|
|
FMB0 :=TMoneyBag.CreateWith(F0CHF, F0USD);
|
|
AssertTrue(FMB0.isZero);
|
|
end;
|
|
|
|
procedure TMoneyTest.testMixedSimpleAdd;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoneyBag.CreateWith(F12CHF, F7USD);
|
|
AssertTrue('expected ' + expected.toString + ' but was ' + F12CHF.add(F7USD).toString, expected.equals(F12CHF.add(F7USD)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testBagNotEquals;
|
|
var
|
|
expected: IMoney;
|
|
res: IMoney;
|
|
begin
|
|
expected := TMoneyBag.CreateWith(F12CHF, F7USD);
|
|
res := TMoney.Create(12, 'CAD').add(F7USD);
|
|
AssertFalse(expected.equals(res));
|
|
end;
|
|
|
|
procedure TMoneyTest.testMoneyBagEquals;
|
|
var
|
|
equal: IMoney;
|
|
begin
|
|
AssertTrue(not FMB1.equals(nil));
|
|
AssertTrue(FMB1.equals(FMB1));
|
|
equal := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(7, 'USD'));
|
|
AssertTrue(FMB1.equals(equal));
|
|
AssertTrue(not FMB1.equals(F12CHF));
|
|
AssertTrue(not F12CHF.equals(FMB1));
|
|
AssertTrue(not FMB1.equals(FMB2));
|
|
end;
|
|
|
|
procedure TMoneyTest.testMoneyEquals;
|
|
var
|
|
equalMoney: IMoney;
|
|
begin
|
|
AssertTrue('error: [12 CHF] does not equal nil', not F12CHF.equals(nil));
|
|
equalMoney := TMoney.Create(12, 'CHF');
|
|
AssertTrue(F12CHF.equals(F12CHF));
|
|
AssertTrue(F12CHF.equals(equalMoney));
|
|
AssertFalse(F12CHF.equals(F14CHF));
|
|
end;
|
|
|
|
procedure TMoneyTest.testSimplify;
|
|
var
|
|
money: IMoney;
|
|
F26CHF, F28CHF, F54CHF: IMoney;
|
|
begin
|
|
F26CHF := TMoney.Create(26, 'CHF');
|
|
F28CHF := TMoney.Create(28, 'CHF');
|
|
money := TMoneyBag.CreateWith(F26CHF, F28CHF);
|
|
F54CHF := TMoney.Create(54, 'CHF');
|
|
AssertTrue('Expected ' + F54CHF.toString + ' but was '
|
|
+ money.toString, F54CHF.equals(money));
|
|
end;
|
|
|
|
procedure TMoneyTest.testNormalize2;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
// {[12 CHF][7 USD]} - [12 CHF] = [7 USD]
|
|
expected := TMoney.Create(7, 'USD');
|
|
AssertTrue('Expected ' + expected.toString + ' but was '
|
|
+ FMB1.subtract(F12CHF).toString, expected.equals(FMB1.subtract(F12CHF)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testNormalize3;
|
|
var
|
|
ms1: IMoney;
|
|
expected: IMoney;
|
|
begin
|
|
// {[12 CHF][7 USD]} - {[12 CHF][3 USD]} = [4 USD]
|
|
ms1 := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(3, 'USD'));
|
|
expected := TMoney.Create(4, 'USD');
|
|
AssertTrue('Expected ' + expected.toString + ' but was ' + FMB1.subtract(ms1).toString,
|
|
expected.equals(FMB1.subtract(ms1)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testNormalize4;
|
|
var
|
|
ms1: IMoney;
|
|
expected: IMoney;
|
|
begin
|
|
// [12 CHF] - {[12 CHF][3 USD]} = [-3 USD]
|
|
ms1 := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(3, 'USD'));
|
|
expected := TMoney.Create(-3, 'USD');
|
|
AssertTrue('Expected ' + expected.toString + ' but was ' + F12CHF.subtract(ms1).toString,
|
|
expected.equals(F12CHF.subtract(ms1)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testPrint;
|
|
begin
|
|
AssertEquals('[12 CHF]', F12CHF.ToString);
|
|
end;
|
|
|
|
procedure TMoneyTest.testMoneyBagPrint;
|
|
begin
|
|
AssertEquals('{[12 CHF][7 USD]}', FMB1.toString);
|
|
end;
|
|
|
|
procedure TMoneyTest.testSimpleAdd;
|
|
var
|
|
expected: IMoney;
|
|
res: IMoney;
|
|
begin
|
|
expected := TMoney.Create(26, 'CHF');
|
|
res := F12CHF.add(F14CHF);
|
|
AssertTrue('addition error: [12 CHF] + [14 CHF] was not [26 CHF]', res.equals(expected));
|
|
end;
|
|
|
|
procedure TMoneyTest.testSimpleBagAdd;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(7, 'USD'));
|
|
AssertTrue('expected ' + expected.toString + ' but was ' + F14CHF.add(FMB1).toString, expected.equals(F14CHF.add(FMB1)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testSimpleMultiply;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoney.Create(28, 'CHF');
|
|
AssertTrue('Multiply Error: [14 CHF] * 2 was not equal to [28 CHF]',
|
|
expected.equals(F14CHF.Multiply(2)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testSimpleNegate;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoney.Create(-14, 'CHF');
|
|
AssertTrue('Negate Error: [14 CHF] negate was not equal to [-14 CHF]',
|
|
expected.equals(F14CHF.negate));
|
|
end;
|
|
|
|
procedure TMoneyTest.testSimpleSubtract;
|
|
var
|
|
expected: IMoney;
|
|
begin
|
|
expected := TMoney.Create(2, 'CHF');
|
|
AssertTrue('Negate Error: [14 CHF] - [12 CHF] was not equal to [2 CHF]',
|
|
expected.equals(F14CHF.subtract(F12CHF)));
|
|
end;
|
|
|
|
procedure TMoneyTest.testOperators;
|
|
var
|
|
mb: IMoney;
|
|
ma: IMoney;
|
|
begin
|
|
ma := TMoney.Create(2, 'CHF');
|
|
AssertTrue(F14CHF.equals(F12CHF + ma ));
|
|
AssertTrue('expected ' + FMB1.toString +' but was ' +
|
|
(FMB2 - TMoneyBag.CreateWith(TMoney.Create(2, 'CHF'), TMoney.Create(14, 'USD'))).toString,
|
|
FMB1.equals(FMB2 - TMoneyBag.CreateWith(TMoney.Create(2, 'CHF'), TMoney.Create(14, 'USD'))));
|
|
mb := TMoneyBag.CreateWith(TMoney.Create(28, 'CHF'), TMoney.Create(42, 'USD'));
|
|
AssertTrue('expected ' + mb.toString + ' but was ' + (FMB2 *2).toString, (FMB2 * 2).equals(mb));
|
|
end;
|
|
|
|
initialization
|
|
|
|
RegisterTests([TMoneyTest]);
|
|
|
|
end.
|