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}