main
1using System;
2using Machine.Specifications;
3using presentation.windows.server.domain.accounting;
4
5namespace unit.server.domain.accounting
6{
7 public class TransactionSpecs
8 {
9 public abstract class concern
10 {
11 Establish c = () =>
12 {
13 sut = Transaction.New(Currency.CAD);
14 };
15
16 static protected Transaction sut;
17 }
18
19 [Subject(typeof (Transaction))]
20 public class when_transferring_funds_from_one_account_to_another : concern
21 {
22 Establish c = () =>
23 {
24 source_account = DetailAccount.New(Currency.CAD);
25 destination_account = DetailAccount.New(Currency.CAD);
26 source_account.add(Entry.New<Deposit>(100, Currency.CAD));
27 };
28
29 Because b = () =>
30 {
31 sut.deposit(destination_account, new Quantity(100, Currency.CAD));
32 sut.withdraw(source_account, new Quantity(100, Currency.CAD));
33 sut.post();
34 };
35
36 It should_increase_the_balance_of_the_destination_account = () =>
37 {
38 destination_account.balance().should_be_equal_to(new Quantity(100, Currency.CAD));
39 };
40
41 It should_decrease_the_balance_of_the_source_account = () =>
42 {
43 source_account.balance().should_be_equal_to(new Quantity(0, Currency.CAD));
44 };
45
46 static DetailAccount source_account;
47 static DetailAccount destination_account;
48 }
49
50 [Subject(typeof (Transaction))]
51 public class when_transferring_funds_from_one_account_to_multiple_accounts : concern
52 {
53 Establish c = () =>
54 {
55 chequing = DetailAccount.New(Currency.CAD);
56 savings = DetailAccount.New(Currency.CAD);
57 rrsp = DetailAccount.New(Currency.CAD);
58 chequing.add(Entry.New<Deposit>(100, Currency.CAD));
59 };
60
61 Because b = () =>
62 {
63 sut.withdraw(chequing, new Quantity(100, Currency.CAD));
64 sut.deposit(savings, new Quantity(75, Currency.CAD));
65 sut.deposit(rrsp, new Quantity(25, Currency.CAD));
66 sut.post();
67 };
68
69 It should_increase_the_balance_of_each_destination_account = () =>
70 {
71 savings.balance().should_be_equal_to(new Quantity(75, Currency.CAD));
72 rrsp.balance().should_be_equal_to(new Quantity(25, Currency.CAD));
73 };
74
75 It should_decrease_the_balance_of_the_source_account = () =>
76 {
77 chequing.balance().should_be_equal_to(new Quantity(0, Currency.CAD));
78 };
79
80 static DetailAccount chequing;
81 static DetailAccount savings;
82 static DetailAccount rrsp;
83 }
84
85 [Subject(typeof (Transaction))]
86 public class when_a_transaction_does_not_reconcile_to_a_zero_balance : concern
87 {
88 Establish c = () =>
89 {
90 chequing = DetailAccount.New(Currency.CAD);
91 savings = DetailAccount.New(Currency.CAD);
92 chequing.add(Entry.New<Deposit>(100, Currency.CAD));
93 };
94
95 Because b = () =>
96 {
97 sut.withdraw(chequing, new Quantity(1, Currency.CAD));
98 sut.deposit(savings, new Quantity(100, Currency.CAD));
99 call = () =>
100 {
101 sut.post();
102 };
103 };
104
105 It should_not_transfer_any_money = () =>
106 {
107 call.should_have_thrown<TransactionDoesNotBalance>();
108 };
109
110 static DetailAccount chequing;
111 static DetailAccount savings;
112 static Action call;
113 }
114 }
115}