示例#1
0
        public void TestWithdrawMoney()
        {
            //Arrange
            const int     amount      = 100500;
            const decimal balance     = 200500;
            var           operationId = Guid.NewGuid();


            var allCash = new Money
            {
                Amount = 240000,
                Notes  = new Dictionary <PaperNote, int>
                {
                    { PaperNote.Twenty, 2000 },
                    { PaperNote.Fifty, 4000 }
                }
            };

            var resultCash = new Money
            {
                Amount = amount,
                Notes  = new Dictionary <PaperNote, int>
                {
                    { PaperNote.Fifty, 2010 }
                }
            };

            _cashProcessor.Cash.Returns(allCash);
            _cashProcessor.MinDenomination().Returns(PaperNote.Twenty);
            _cashProcessor.WithdrawMoney(amount).Returns(resultCash);
            _cardProcessor.GetCardBalance().Returns(balance);
            _cardProcessor.BlockAmount(amount).Returns(operationId);

            //Act
            var result = _atMachine.WithdrawMoney(amount);

            //Assert

            Received.InOrder(() =>
            {
                _cashProcessor.MinDenomination();
                _cardProcessor.GetCardBalance();
                _cardProcessor.BlockAmount(Arg.Is(amount));
                _cashProcessor.WithdrawMoney(Arg.Is(amount));
                _cardProcessor.WithdrawFromBlocked(Arg.Is(operationId));
            });

            Assert.Equal(resultCash, result);
        }
示例#2
0
        /// <summary>
        /// Preliminary checks the possiblity of withdrawal
        /// </summary>
        /// <param name="amount">Requested amount</param>
        private void WithdrawalValidation(int amount)
        {
            if (amount <= 0)
            {
                throw new InvalidAmountException();
            }

            if (amount > _cashProcessor.Cash.Amount)
            {
                throw new AmountIsTooBigException();
            }

            var minBankNote = (int)_cashProcessor.MinDenomination();

            if (amount % minBankNote != 0)
            {
                throw new AmountIsNotMultipleException(minBankNote);
            }

            if (amount > _cardProcessor.GetCardBalance())
            {
                throw new InsufficientFundsException();
            }
        }